ETH Price: $3,437.41 (-6.46%)
 

Overview

Max Total Supply

1,529 ITEM

Holders

603

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
47 ITEM
0x606d2c436a07be40c276a6176bb1376c34e49ee9
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

This is the universal inventory for Team3D's VIDYA project and token, built for the gamification of DeFi. This contract functions as a cross-platform, cross-game, decentralized system of progression, where the user always comes first.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Inventory

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-23
*/

pragma solidity ^0.5.10;

/*
  _______                   ____  _____  
 |__   __|                 |___ \|  __ \ 
    | | ___  __ _ _ __ ___   __) | |  | |
    | |/ _ \/ _` | '_ ` _ \ |__ <| |  | |
    | |  __/ (_| | | | | | |___) | |__| |
    |_|\___|\__,_|_| |_| |_|____/|_____/ 

    https://team3d.io
    https://discord.gg/team3d
    
    NFT Inventory contract

*/

/**
 * @title IERC165
 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
 */
contract 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);
}

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract IERC721 {
    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;
}

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


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

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

    /**
     * @dev A contract implementing SupportsInterfaceWithLookup
     * implement ERC165 itself
     */
    constructor () internal {
        _registerInterface(_InterfaceId_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;
    }
}


/**
 * @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 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


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


contract ERC20Token {
    function balanceOf(address owner) public view returns (uint256);
    function transfer(address to, uint256 value) public returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool);
}


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


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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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


/**
 * 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.
        // solium-disable-next-line security/no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}


contract Inventory is ERC165, IERC721, IERC721Metadata, IERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Address for address;
    
    string private _name;
    string private _symbol;
    string private _pathStart;
    string private _pathEnd;
    bytes4 private constant InterfaceId_ERC721Metadata = 0x5b5e139f;
    bytes4 private constant _InterfaceId_ERC721Enumerable = 0x780e9d63;
    bytes4 private constant _InterfaceId_ERC721 = 0x80ac58cd;
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Treasure chest reward token (VIDYA)
    ERC20Token public constant treasureChestRewardToken = ERC20Token(0x3D3D35bb9bEC23b06Ca00fe472b50E7A4c692C30);
    
    // Uniswap token 
    ERC20Token public constant UNI_ADDRESS = ERC20Token(0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984);
    
    // Unicorn's Head
    uint256 private constant UNICORN_TEMPLATE_ID = 11;
	uint256 public UNICORN_TOTAL_SUPPLY = 0;
	mapping (address => bool) public unicornClaimed;

    // 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 tokens
    mapping (address => uint256) private _ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;
    
    // Mapping of contract addresses that are allowed to edit item features 
    mapping (address => bool) private _approvedGameContract;

    // Mapping from token ID to respective treasure chest rewards in VIDYA tokens
    mapping (uint256 => uint256) public treasureChestRewards;

    // Mapping to calculate how many treasure hunts an address has participated in
    mapping (address => uint256) public treasureHuntPoints;
    
    // Mapping for the different equipment items of each address/character
    // 0 - head, 1 - left hand, 2 - neck, 3 - right hand, 4 - chest, 5 - legs
    mapping (address => uint256[6]) public characterEquipment;
    
    // To check if a template exists
    mapping (uint256 => bool) _templateExists; 

    /* Item struct holds the templateId, a total of 4 additional features
    and the burned status */
    struct Item {
        uint256 templateId; // id of Template in the itemTemplates array
        uint8 feature1;
        uint8 feature2;
        uint8 feature3;
        uint8 feature4;
        uint8 equipmentPosition;
        bool burned;
    }
    
    /* Template struct holds the uri for each Item- 
    a reference to the json file which describes them */
    struct Template {
        string uri;
    }
    
    // All items created, ever, both burned and not burned 
    Item[] public allItems;
    
    // Admin editable templates for each item 
    Template[] public itemTemplates;
    
    modifier onlyApprovedGame() {
        require(_approvedGameContract[msg.sender], "msg.sender is not an approved game contract");
        _;
    }
    
    modifier tokenExists(uint256 _tokenId) {
        require(_exists(_tokenId), "Token does not exist");
        _;
    }
    
    modifier isOwnedByOrigin(uint256 _tokenId) {
        require(ownerOf(_tokenId) == tx.origin, "tx.origin is not the token owner");
        _;
    }
    
    modifier isOwnerOrApprovedGame(uint256 _tokenId) {
        require(ownerOf(_tokenId) == msg.sender || _approvedGameContract[msg.sender], "Not owner or approved game");
        _;
    }
    
    modifier templateExists(uint256 _templateId) {
        require(_templateExists[_templateId], "Template does not exist");
        _;
    }

    constructor() 
        public  
    {
        _name = "Inventory";
        _symbol = "ITEM";
        _pathStart = "https://team3d.io/inventory/json/";
        _pathEnd = ".json";
        _registerInterface(InterfaceId_ERC721Metadata);
        _registerInterface(_InterfaceId_ERC721Enumerable);
        _registerInterface(_InterfaceId_ERC721);
        
        // Add the "nothing" item to msg.sender
        // This is a dummy item so that valid items in allItems start with 1
        addNewItem(0,0);
    }
    
    // Get the Unicorn's head item
    function mintUnicorn()
        external
    {
        uint256 id;
        
        require(UNICORN_TOTAL_SUPPLY < 100, "Unicorns are now extinct");
		require(!unicornClaimed[msg.sender], "You have already claimed a unicorn");
        require(UNI_ADDRESS.balanceOf(msg.sender) >= 1000 * 10**18, "Min balance 1000 UNI");
        require(_templateExists[UNICORN_TEMPLATE_ID], "Unicorn template has not been added yet");
        checkAndTransferVIDYA(1000 * 10**18); // Unicorn's head costs 1000 VIDYA 
        
        id = allItems.push(Item(UNICORN_TEMPLATE_ID,0,0,0,0,0,false)) -1;
		
		UNICORN_TOTAL_SUPPLY = UNICORN_TOTAL_SUPPLY.add(1);
		unicornClaimed[msg.sender] = true;
        
        // Materialize 
        _mint(msg.sender, id);
    }
    
    function checkAndTransferVIDYA(uint256 _amount) private {
        require(treasureChestRewardToken.transferFrom(msg.sender, address(this), _amount) == true, "transfer must succeed");
    }
    
    function equip(
        uint256 _tokenId, 
        uint8 _equipmentPosition
    ) 
        external
        tokenExists(_tokenId)
    {
        require(_equipmentPosition < 6);
        require(allItems[_tokenId].equipmentPosition == _equipmentPosition, 
            "Item cannot be equipped in this slot");
            
        characterEquipment[msg.sender][_equipmentPosition] = _tokenId;
    }

    function unequip(
        uint8 _equipmentPosition
    ) 
        external
    {
        require(_equipmentPosition < 6);
        characterEquipment[msg.sender][_equipmentPosition] = 0;
    }

    function getEquipment(
        address player
    ) 
        public 
        view 
        returns(uint256[6] memory)
    {
        return characterEquipment[player];
    }

    // The total supply of any one item
    // Ask for example how many of "Torch" item exist
    function getIndividualCount(
        uint256 _templateId
    ) 
        public 
        view 
        returns(uint256) 
    {
        uint counter = 0;
        
        for (uint i = 0; i < allItems.length; i++) {
            // If match found & is not burned 
            if (allItems[i].templateId == _templateId && !allItems[i].burned) {
                counter++;
            }
        }
        
        // Total supply of item using the _templateId
        return counter;
    }
    
    // Total supply of any one item owned by _owner
    // Ask for example how many of "Torch" item does the _owner have 
    function getIndividualOwnedCount(
        uint256 _templateId,
        address _owner
    )
        public 
        view 
        returns(uint256)
    {
        uint counter = 0;
        uint[] memory ownedItems = getItemsByOwner(_owner);
        
        for(uint i = 0; i < ownedItems.length; i++) {
            
            /* If ownedItems[i]'s templateId matches the one in allItems[] */
            if(allItems[ownedItems[i]].templateId == _templateId) {
                counter++;
            }
        }
        
        // Total supply of _templateId that _owner owns 
        return counter;
    }
    
    // Given a _tokenId returns how many other tokens exist with 
    // the same _templateId
    function getIndividualCountByID(
        uint256 _tokenId
    )
        public
        view
        tokenExists(_tokenId)
        returns(uint256)
    {
        uint256 counter = 0;
        uint256 templateId = allItems[_tokenId].templateId; // templateId we are looking for 
        
        for(uint i = 0; i < allItems.length; i++) {
            if(templateId == allItems[i].templateId && !allItems[i].burned) {
                counter++;
            }
        }
        
        return counter;
    }
    
    // Given a _tokenId returns how many other tokens the _owner has 
    // with the same _templateId
    function getIndividualOwnedCountByID(
        uint256 _tokenId,
        address _owner 
    )
        public
        view
        tokenExists(_tokenId)
        returns(uint256)
    {
        uint256 counter = 0;
        uint256 templateId = allItems[_tokenId].templateId; // templateId we are looking for 
        uint[] memory ownedItems = getItemsByOwner(_owner);
        
        for(uint i = 0; i < ownedItems.length; i++) {
            // The item cannot be burned because of getItemsByOwner(_owner), no need to check 
            if(templateId == allItems[ownedItems[i]].templateId) {
                counter++;
            }
        }
        
        return counter;
    }
    
    /*  Given an array of _tokenIds return the corresponding _templateId count 
        for each of those _tokenIds */
    function getTemplateCountsByTokenIDs(
        uint[] memory _tokenIds
    )
        public
        view
        returns(uint[] memory)
    {
        uint[] memory counts = new uint[](_tokenIds.length);
        
        for(uint i = 0; i < _tokenIds.length; i++) {
            counts[i] = getIndividualCountByID(_tokenIds[i]);
        }
        
        return counts;
    }
    
    /*  Given an array of _tokenIds return the corresponding _templateId count 
        for each of those _tokenIds that the _owner owns */
    function getTemplateCountsByTokenIDsOfOwner(
        uint[] memory _tokenIds,
        address _owner 
    )
        public
        view
        returns(uint[] memory)
    {
        uint[] memory counts = new uint[](_tokenIds.length);
        
        for(uint i = 0; i < _tokenIds.length; i++) {
            counts[i] = getIndividualOwnedCountByID(_tokenIds[i], _owner);
        }
        
        return counts;
    }
    
    /*  Given an array of _tokenIds return the corresponding _templateIds 
        for each of those _tokenIds 
        
        Useful for cross referencing / weeding out duplicates to populate the UI */
    function getTemplateIDsByTokenIDs(
        uint[] memory _tokenIds
    )
        public
        view
        returns(uint[] memory)
    {
        uint[] memory templateIds = new uint[](_tokenIds.length);
        
        for(uint i = 0; i < _tokenIds.length; i++) {
            templateIds[i] = allItems[_tokenIds[i]].templateId;
        }
        
        return templateIds;
    }

    // Get all the item id's by owner 
    function getItemsByOwner(
        address _owner
    ) 
        public 
        view 
        returns(uint[] memory) 
    {
        uint[] memory result = new uint[](_ownedTokensCount[_owner]);
        uint counter = 0;
        
        for (uint i = 0; i < allItems.length; i++) {
            // If owner is _owner and token is not burned 
            if (_tokenOwner[i] == _owner && !allItems[i].burned) {
                result[counter] = i;
                counter++;
            }
        }
        
        // Array of ID's in allItems that _owner owns 
        return result;
    }

    // Function to withdraw any ERC20 tokens
    function withdrawERC20Tokens(
        address _tokenContract
    ) 
        external 
        onlyOwner 
        returns(bool) 
    {
        ERC20Token token = ERC20Token(_tokenContract);
        uint256 amount = token.balanceOf(address(this));
        return token.transfer(msg.sender, amount);
    }
    
    // Admin can approve (or disapprove) game contracts 
    function approveGameContract(
        address _game,
        bool _status
    )
        external 
        onlyOwner
    {
        _approvedGameContract[_game] = _status;
    }
    
    // Admin function to set _pathStart and _pathEnd
    function setPaths(
        string calldata newPathStart,
        string calldata newPathEnd
    )
        external
        onlyOwner
        returns(bool)
    {
        bool success;
        
        if(keccak256(abi.encodePacked(_pathStart)) != keccak256(abi.encodePacked(newPathStart))) {
            _pathStart = newPathStart;
            success = true;
        }
        
        if(keccak256(abi.encodePacked(_pathEnd)) != keccak256(abi.encodePacked(newPathEnd))) {
            _pathEnd = newPathEnd;
            success = true;
        }
        
        return success;
    }

    /* Admin can add new item template
    The _templateId is a reference to Template struct in itemTemplates[] */
    function addNewItem(
        uint256 _templateId,
        uint8 _equipmentPosition
    )
        public 
        onlyOwner
    {
        uint256 id;
        
        // Does the _templateId exist or do we need to add it?
        if(!_templateExists[_templateId]) {
            // Add template id for this item as reference
            itemTemplates.push(Template(uint2str(_templateId)));
            _templateExists[_templateId] = true;
        }
        
        id = allItems.push(Item(_templateId,0,0,0,0,_equipmentPosition,false)) -1;
        
        // Materialize 
        _mint(msg.sender, id);
    }
    
    /* Admin can add new item template and send it to receiver in 
    one call */
    function addNewItemAndTransfer(
        uint256 _templateId,
        uint8 _equipmentPosition,
        address receiver 
    )
        public 
        onlyOwner
    {
        uint256 id;
        
        // Does the _templateId exist or do we need to add it?
        if(!_templateExists[_templateId]) {
            // Add template id for this item as reference 
            itemTemplates.push(Template(uint2str(_templateId)));
            _templateExists[_templateId] = true;
        }
        
        id = allItems.push(Item(_templateId,0,0,0,0,_equipmentPosition,false)) -1;
        
        // Materialize 
        _mint(receiver, id);
    }
    
    /*  Allows approved game contracts to create new items from 
        already existing templates (added by admin)
        
        In other words this function allows a game to spawn more 
        of ie. "Torch" and set its default features etc */
    function createFromTemplate(
        uint256 _templateId,
        uint8 _feature1,
        uint8 _feature2,
        uint8 _feature3,
        uint8 _feature4,
        uint8 _equipmentPosition
    )
        public
        templateExists(_templateId)
        onlyApprovedGame
        returns(uint256)
    {
        uint256 id; 
        address player = tx.origin;
        
        id = allItems.push(
            Item(
                _templateId,
                _feature1,
                _feature2,
                _feature3,
                _feature4,
                _equipmentPosition,
                false
            )
        ) -1;
        
        // Materialize to tx.origin (and not msg.sender aka. the game contract)
        _mint(player, id);
        
        // id of the new item 
        return id;
    }

    /*
    Change feature values of _tokenId
    
    Only succeeds when:
        the tx.origin (a player) owns the item 
        the msg.sender (game contract) is a manually approved game address 
    */
    function changeFeaturesForItem(
        uint256 _tokenId,
        uint8 _feature1,
        uint8 _feature2,
        uint8 _feature3,
        uint8 _feature4,
        uint8 _equipmentPosition
    )
        public 
        onlyApprovedGame // msg.sender has to be a manually approved game address 
        tokenExists(_tokenId) // check if _tokenId exists in the first place 
        isOwnedByOrigin(_tokenId) // does the tx.origin (player in a game) own the token?
        returns(bool)
    {
        return (
            _changeFeaturesForItem(
                _tokenId,
                _feature1,
                _feature2,
                _feature3,
                _feature4,
                _equipmentPosition
            )
        );
    }

    function _changeFeaturesForItem(
        uint256 _tokenId,
        uint8 _feature1,
        uint8 _feature2,
        uint8 _feature3,
        uint8 _feature4,
        uint8 _equipmentPosition
    )
        internal
        returns(bool)
    {
        Item storage item = allItems[_tokenId];

        if(item.feature1 != _feature1) {
            item.feature1 = _feature1;
        }
        
        if(item.feature2 != _feature2) {
            item.feature2 = _feature2;
        }
        
        if(item.feature3 != _feature3) {
            item.feature3 = _feature3;
        }
        
        if(item.feature4 != _feature4) {
            item.feature4 = _feature4;
        }
        
        if(item.equipmentPosition != _equipmentPosition) {
            item.equipmentPosition = _equipmentPosition;
        }
        
        return true;
    }
    
    /*
    Features of _tokenId 
    Useful in various games where the _tokenId should 
    have traits etc.
    
    Example: a "Torch" could start with 255 and degrade 
    during gameplay over time 
    
    Note: maximum value for uint8 type is 255 
    */
    function getFeaturesOfItem(
        uint256 _tokenId 
    )
        public 
        view 
        returns(uint8[] memory)
    {
        Item storage item = allItems[_tokenId];
        uint8[] memory features = new uint8[](4);
        
        features[0] = item.feature1;
        features[1] = item.feature2;
        features[2] = item.feature3;
        features[3] = item.feature4;
        
        return features;
    }

    /*
    Turn uint256 into a string
    
    Reason: ERC721 standard needs token uri to return as string,
    but we don't want to store long urls to the json files on-chain.
    Instead we use this returned string (which is actually just an ID)
    and say to front ends that the token uri can be found at 
    somethingsomething.io/tokens/<id>.json 
    */
    function uint2str(
        uint256 i
    ) 
        internal 
        pure 
        returns(string memory) 
    {
        if (i == 0) return "0";
        
        uint256 j = i;
        uint256 length;
        while (j != 0) {
            length++;
            j /= 10;
        }
        bytes memory bstr = new bytes(length);
        uint256 k = length - 1;
        while (i != 0) {
            bstr[k--] = byte(uint8(48 + i % 10)); 
            i /= 10;
        }
        return string(bstr);
    }
    
    function append(
        string memory a, 
        string memory b, 
        string memory c
    ) 
        internal 
        pure 
        returns(string memory) 
    {
        return string(
            abi.encodePacked(a, b, c)
        );
    }
    
    /*
     * Adds an NFT and the corresponding reward for whoever finds it and burns it.
     */
    function addTreasureChest(uint256 _tokenId, uint256 _rewardsAmount) 
    external
    tokenExists(_tokenId)
    onlyApprovedGame 
    {
        treasureChestRewards[_tokenId] = _rewardsAmount;
    }

    /*  Burn the _tokenId
        Succeeds when:
            token exists 
            msg.sender is either direct owner of the token OR 
            msg.sender is a manually approved game contract 
        
        If tx.origin and msg.sender are different, burn the 
        _tokenId of the tx.origin (the player, not the game contract)
    */
    function burn(
        uint256 _tokenId
    )
        public
        tokenExists(_tokenId)
        isOwnerOrApprovedGame(_tokenId)
        returns(bool)
    {
        if (tx.origin == msg.sender) {
            return _burn(_tokenId, msg.sender);
        } else {
            return _burn(_tokenId, tx.origin);
        }
    }
    
    // Burn owner's tokenId 
    function _burn(
        uint256 _tokenId,
        address owner
    )
        internal
        returns(bool)
    {
        // Set burned status on token
        allItems[_tokenId].burned = true;
        
        // Set new owner to 0x0 
        _tokenOwner[_tokenId] = address(0);
        
        // Remove from old owner 
        _ownedTokensCount[owner] = _ownedTokensCount[owner].sub(1);

        // Check if it's a treasure hunt token
        uint256 treasureChestRewardsForToken = treasureChestRewards[_tokenId];
        if (treasureChestRewardsForToken > 0) {
            treasureChestRewardToken.transfer(msg.sender, treasureChestRewardsForToken);
            treasureHuntPoints[owner]++;
        }

        // Fire event 
        emit Transfer(owner, address(0), _tokenId);
        
        return true;
    }

    function getLevel(address player) public view returns(uint256) {
        return treasureHuntPoints[player];
    }

    // Return the total supply
    function totalSupply() 
        public 
        view 
        returns(uint256)
    {
        uint256 counter;
        for(uint i = 0; i < allItems.length; i++) {
            if(!allItems[i].burned) {
                counter++;
            }
        }
        
        // All tokens which are not burned 
        return counter;
    }
    
    // Return the templateId of _index token
    function tokenByIndex(
        uint256 _index
    ) 
        public 
        view 
        returns(uint256) 
    {
        require(_index < totalSupply());
        return allItems[_index].templateId;
    }
    
    // Return The token templateId for the index'th token assigned to owner
    function tokenOfOwnerByIndex(
        address owner,
        uint256 index
    ) 
        public 
        view 
        returns 
        (uint256 tokenId) 
    {
        require(index < balanceOf(owner));
        return getItemsByOwner(owner)[index];
    }

    /**
     * @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));
        uint256 tokenTemplateId = allItems[tokenId].templateId;
        
        string memory id = uint2str(tokenTemplateId);
        return append(_pathStart, id, _pathEnd);
    }

    /**
     * @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));
        require(!allItems[tokenId].burned, "This token is burned"); // Probably useless require at this point 
        
        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 
    {
        // solium-disable-next-line arg-overflow
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(
        address from, 
        address to, 
        uint256 tokenId, 
        bytes memory _data
    ) 
        public 
    {
        transferFrom(from, to, tokenId);
        // solium-disable-next-line arg-overflow
        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);
        // Disable solium check because of
        // https://github.com/duaraghav8/Solium/issues/175
        // solium-disable-next-line operator-whitespace
        return (
            spender == owner || 
            getApproved(tokenId) == spender || 
            isApprovedForAll(owner, spender)
        );
    }

    /**
     * @dev Internal function to mint a new token
     * Reverts if the given token ID already exists
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    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 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);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"UNICORN_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UNI_ADDRESS","outputs":[{"internalType":"contract ERC20Token","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"},{"internalType":"uint8","name":"_equipmentPosition","type":"uint8"}],"name":"addNewItem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"},{"internalType":"uint8","name":"_equipmentPosition","type":"uint8"},{"internalType":"address","name":"receiver","type":"address"}],"name":"addNewItemAndTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_rewardsAmount","type":"uint256"}],"name":"addTreasureChest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allItems","outputs":[{"internalType":"uint256","name":"templateId","type":"uint256"},{"internalType":"uint8","name":"feature1","type":"uint8"},{"internalType":"uint8","name":"feature2","type":"uint8"},{"internalType":"uint8","name":"feature3","type":"uint8"},{"internalType":"uint8","name":"feature4","type":"uint8"},{"internalType":"uint8","name":"equipmentPosition","type":"uint8"},{"internalType":"bool","name":"burned","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_game","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"approveGameContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint8","name":"_feature1","type":"uint8"},{"internalType":"uint8","name":"_feature2","type":"uint8"},{"internalType":"uint8","name":"_feature3","type":"uint8"},{"internalType":"uint8","name":"_feature4","type":"uint8"},{"internalType":"uint8","name":"_equipmentPosition","type":"uint8"}],"name":"changeFeaturesForItem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"characterEquipment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"},{"internalType":"uint8","name":"_feature1","type":"uint8"},{"internalType":"uint8","name":"_feature2","type":"uint8"},{"internalType":"uint8","name":"_feature3","type":"uint8"},{"internalType":"uint8","name":"_feature4","type":"uint8"},{"internalType":"uint8","name":"_equipmentPosition","type":"uint8"}],"name":"createFromTemplate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint8","name":"_equipmentPosition","type":"uint8"}],"name":"equip","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"getEquipment","outputs":[{"internalType":"uint256[6]","name":"","type":"uint256[6]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFeaturesOfItem","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"}],"name":"getIndividualCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getIndividualCountByID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"}],"name":"getIndividualOwnedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"}],"name":"getIndividualOwnedCountByID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getItemsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"getLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getTemplateCountsByTokenIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"address","name":"_owner","type":"address"}],"name":"getTemplateCountsByTokenIDsOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getTemplateIDsByTokenIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"itemTemplates","outputs":[{"internalType":"string","name":"uri","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"mintUnicorn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newPathStart","type":"string"},{"internalType":"string","name":"newPathEnd","type":"string"}],"name":"setPaths","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"treasureChestRewardToken","outputs":[{"internalType":"contract ERC20Token","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"treasureChestRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"treasureHuntPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"_equipmentPosition","type":"uint8"}],"name":"unequip","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unicornClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"withdrawERC20Tokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405260006006553480156200001657600080fd5b506200002f6301ffc9a760e01b6200026a60201b60201c565b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36040518060400160405280600981526020017f496e76656e746f72790000000000000000000000000000000000000000000000815250600290805190602001906200013a92919062000977565b506040518060400160405280600481526020017f4954454d00000000000000000000000000000000000000000000000000000000815250600390805190602001906200018892919062000977565b50604051806060016040528060218152602001620063666021913960049080519060200190620001ba92919062000977565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600590805190602001906200020892919062000977565b5062000221635b5e139f60e01b6200026a60201b60201c565b6200023963780e9d6360e01b6200026a60201b60201c565b620002516380ac58cd60e01b6200026a60201b60201c565b620002646000806200030a60201b60201c565b62000aad565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200029e57600080fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6200031a6200054660201b60201c565b6200032457600080fd5b60006010600084815260200190815260200160002060009054906101000a900460ff16620003e357601260405180602001604052806200036a866200059e60201b60201c565b8152509080600181540180825580915050906001820390600052602060002001600090919290919091506000820151816000019080519060200190620003b2929190620009fe565b5050505060016010600085815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600160116040518060e00160405280868152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020018560ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff0219169083151502179055505050039050620005413382620006d660201b60201c565b505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60606000821415620005e8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050620006d1565b600082905060005b6000821462000615578080600101915050600a82816200060c57fe5b049150620005f0565b6060816040519080825280601f01601f1916602001820160405280156200064b5781602001600182028038833980820191505090505b50905060006001830390505b60008614620006c957600a86816200066b57fe5b0660300160f81b828280600190039350815181106200068657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681620006c057fe5b04955062000657565b819450505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200071157600080fd5b62000722816200087c60201b60201c565b156200072d57600080fd5b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620007d96001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620008ee60201b620047aa1790919060201c565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000808284019050838110156200096d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620009ba57805160ff1916838001178555620009eb565b82800160010185558215620009eb579182015b82811115620009ea578251825591602001919060010190620009cd565b5b509050620009fa919062000a85565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a4157805160ff191683800117855562000a72565b8280016001018555821562000a72579182015b8281111562000a7157825182559160200191906001019062000a54565b5b50905062000a81919062000a85565b5090565b62000aaa91905b8082111562000aa657600081600090555060010162000a8c565b5090565b90565b6158a98062000abd6000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c80636352211e1161019d578063c76692db116100e9578063da8c856a116100a2578063e99e214f1161007c578063e99e214f14611747578063ee4c7e4814611782578063f2fde38b146117e4578063ff68fa6e146118285761030c565b8063da8c856a14611546578063e542d2da14611673578063e985e9c5146116cb5761030c565b8063c76692db146112d6578063c87b56dd14611338578063c94111c2146113df578063c951d76414611462578063ca68970f146114ac578063d3736c42146114f65761030c565b80638da5cb5b11610156578063a22cb46511610130578063a22cb46514611107578063aa42826e14611157578063b88d4fde14611199578063be9e8b8a1461129e5761030c565b80638da5cb5b146110185780638f32d59b1461106257806395d89b41146110845761030c565b80636352211e14610d8a57806363a7bd4214610df857806370a0823114610ede578063715018a614610f365780637b2f8f9b14610f40578063817c896614610fc05761030c565b80632c67a8e51161025c5780634bfed95c116102155780634f6ccce7116101ef5780634f6ccce714610c2e5780634ff7ff3214610c7057806351cac75614610ccc57806352ce778014610d4f5761030c565b80634bfed95c14610a645780634dafac1714610b715780634e74264d14610bcc5761030c565b80632c67a8e5146108555780632f745c59146108ee57806342842e0e1461095057806342966c68146109be578063449e078014610a045780634696d1f914610a465761030c565b80631357923a116102c95780631f3dc7af116102a35780631f3dc7af1461073f578063219dacd71461074957806323b872dd1461078b5780632c0cf452146107f95761030c565b80631357923a146105f357806318160ddd1461067a5780631b041ee3146106985761030c565b8063018cb2cf1461031157806301ffc9a71461034257806302e271fe146103a757806306fdde03146104b4578063081812fc14610537578063095ea7b3146105a5575b600080fd5b6103406004803603602081101561032757600080fd5b81019080803560ff1690602001909291905050506118b6565b005b61038d6004803603602081101561035857600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061191d565b604051808215151515815260200191505060405180910390f35b61045d600480360360208110156103bd57600080fd5b81019080803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184602083028401116401000000008311171561040e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611984565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a0578082015181840152602081019050610485565b505050509050019250505060405180910390f35b6104bc611a2a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104fc5780820151818401526020810190506104e1565b50505050905090810190601f1680156105295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105636004803603602081101561054d57600080fd5b8101908080359060200190929190505050611acc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105f1600480360360408110156105bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b1b565b005b610660600480360360c081101561060957600080fd5b8101908080359060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190505050611c5c565b604051808215151515815260200191505060405180910390f35b610682611e42565b6040518082815260200191505060405180910390f35b6106c4600480360360208110156106ae57600080fd5b8101908080359060200190929190505050611ea6565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107045780820151818401526020810190506106e9565b50505050905090810190601f1680156107315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610747611f65565b005b6107756004803603602081101561075f57600080fd5b8101908080359060200190929190505050612424565b6040518082815260200191505060405180910390f35b6107f7600480360360608110156107a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061243c565b005b61083b6004803603602081101561080f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061245f565b604051808215151515815260200191505060405180910390f35b6108976004803603602081101561086b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061247f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108da5780820151818401526020810190506108bf565b505050509050019250505060405180910390f35b61093a6004803603604081101561090457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506125e1565b6040518082815260200191505060405180910390f35b6109bc6004803603606081101561096657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061261b565b005b6109ea600480360360208110156109d457600080fd5b810190808035906020019092919050505061263b565b604051808215151515815260200191505060405180910390f35b610a3060048036036020811015610a1a57600080fd5b8101908080359060200190929190505050612810565b6040518082815260200191505060405180910390f35b610a4e6128a5565b6040518082815260200191505060405180910390f35b610b1a60048036036020811015610a7a57600080fd5b8101908080359060200190640100000000811115610a9757600080fd5b820183602082011115610aa957600080fd5b80359060200191846020830284011164010000000083111715610acb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506128ab565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b5d578082015181840152602081019050610b42565b505050509050019250505060405180910390f35b610bca60048036036060811015610b8757600080fd5b8101908080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293b565b005b610c1860048036036040811015610be257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b5c565b6040518082815260200191505060405180910390f35b610c5a60048036036020811015610c4457600080fd5b8101908080359060200190929190505050612bda565b6040518082815260200191505060405180910390f35b610cb260048036036020811015610c8657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c15565b604051808215151515815260200191505060405180910390f35b610cf860048036036020811015610ce257600080fd5b8101908080359060200190929190505050612db4565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d3b578082015181840152602081019050610d20565b505050509050019250505060405180910390f35b610d8860048036036040811015610d6557600080fd5b8101908080359060200190929190803560ff169060200190929190505050612ee0565b005b610db660048036036020811015610da057600080fd5b8101908080359060200190929190505050613100565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ec460048036036040811015610e0e57600080fd5b8101908080359060200190640100000000811115610e2b57600080fd5b820183602082011115610e3d57600080fd5b80359060200191846001830284011164010000000083111715610e5f57600080fd5b909192939192939080359060200190640100000000811115610e8057600080fd5b820183602082011115610e9257600080fd5b80359060200191846001830284011164010000000083111715610eb457600080fd5b909192939192939050505061321b565b604051808215151515815260200191505060405180910390f35b610f2060048036036020811015610ef457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133ca565b6040518082815260200191505060405180910390f35b610f3e61344c565b005b610f8260048036036020811015610f5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061351e565b6040518082600660200280838360005b83811015610fad578082015181840152602081019050610f92565b5050505090500191505060405180910390f35b61100260048036036020811015610fd657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506135a8565b6040518082815260200191505060405180910390f35b6110206135f1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61106a61361b565b604051808215151515815260200191505060405180910390f35b61108c613673565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110cc5780820151818401526020810190506110b1565b50505050905090810190601f1680156110f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6111556004803603604081101561111d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613715565b005b6111836004803603602081101561116d57600080fd5b810190808035906020019092919050505061384f565b6040518082815260200191505060405180910390f35b61129c600480360360808110156111af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561121657600080fd5b82018360208201111561122857600080fd5b8035906020019184600183028401116401000000008311171561124a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613985565b005b6112d4600480360360408110156112b457600080fd5b8101908080359060200190929190803590602001909291905050506139ab565b005b611322600480360360408110156112ec57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613ae6565b6040518082815260200191505060405180910390f35b6113646004803603602081101561134e57600080fd5b8101908080359060200190929190505050613b0b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156113a4578082015181840152602081019050611389565b50505050905090810190601f1680156113d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61144c600480360360c08110156113f557600080fd5b8101908080359060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190505050613c97565b6040518082815260200191505060405180910390f35b61146a613f37565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6114b4613f4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6115446004803603604081101561150c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613f67565b005b61161c6004803603604081101561155c57600080fd5b810190808035906020019064010000000081111561157957600080fd5b82018360208201111561158b57600080fd5b803590602001918460208302840111640100000000831117156115ad57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fd3565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561165f578082015181840152602081019050611644565b505050509050019250505060405180910390f35b6116b56004803603602081101561168957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614065565b6040518082815260200191505060405180910390f35b61172d600480360360408110156116e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061407d565b604051808215151515815260200191505060405180910390f35b6117806004803603604081101561175d57600080fd5b8101908080359060200190929190803560ff169060200190929190505050614111565b005b6117ce6004803603604081101561179857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061427e565b6040518082815260200191505060405180910390f35b611826600480360360208110156117fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061439d565b005b6118546004803603602081101561183e57600080fd5b81019080803590602001909291905050506143ba565b604051808881526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff1681526020018460ff1660ff1681526020018360ff1660ff1681526020018215151515815260200197505050505050505060405180910390f35b60068160ff16106118c657600080fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208260ff166006811061191557fe5b018190555050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60608082516040519080825280602002602001820160405280156119b75781602001602082028038833980820191505090505b50905060008090505b8351811015611a205760118482815181106119d757fe5b6020026020010151815481106119e957fe5b906000526020600020906002020160000154828281518110611a0757fe5b60200260200101818152505080806001019150506119c0565b5080915050919050565b606060028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ac25780601f10611a9757610100808354040283529160200191611ac2565b820191906000526020600020905b815481529060010190602001808311611aa557829003601f168201915b5050505050905090565b6000611ad782614457565b611ae057600080fd5b6009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000611b2682613100565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b6157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ba15750611ba0813361407d565b5b611baa57600080fd5b826009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061584a602b913960400191505060405180910390fd5b86611d0a81614457565b611d7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b873273ffffffffffffffffffffffffffffffffffffffff16611d9d82613100565b73ffffffffffffffffffffffffffffffffffffffff1614611e26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f74782e6f726967696e206973206e6f742074686520746f6b656e206f776e657281525060200191505060405180910390fd5b611e348989898989896144c9565b925050509695505050505050565b60008060008090505b601180549050811015611e9e5760118181548110611e6557fe5b906000526020600020906002020160010160059054906101000a900460ff16611e915781806001019250505b8080600101915050611e4b565b508091505090565b60128181548110611eb357fe5b90600052602060002001600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f5b5780601f10611f3057610100808354040283529160200191611f5b565b820191906000526020600020905b815481529060010190602001808311611f3e57829003601f168201915b5050505050905081565b6000606460065410611fdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f556e69636f726e7320617265206e6f7720657874696e6374000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612082576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806157dd6022913960400191505060405180910390fd5b683635c9adc5dea00000731f9840a85d5af5bf1d1762f925bdaddc4201f98473ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561211d57600080fd5b505afa158015612131573d6000803e3d6000fd5b505050506040513d602081101561214757600080fd5b810190808051906020019092919050505010156121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d696e2062616c616e6365203130303020554e4900000000000000000000000081525060200191505060405180910390fd5b60106000600b815260200190815260200160002060009054906101000a900460ff16612243576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806157ff6027913960400191505060405180910390fd5b612255683635c9adc5dea00000614624565b600160116040518060e00160405280600b8152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff02191690831515021790555050500390506123b960016006546147aa90919063ffffffff16565b6006819055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124213382614832565b50565b600d6020528060005260406000206000915090505481565b61244633826149c7565b61244f57600080fd5b61245a838383614a5c565b505050565b60076020528060005260406000206000915054906101000a900460ff1681565b606080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040519080825280602002602001820160405280156124f05781602001602082028038833980820191505090505b509050600080905060008090505b6011805490508110156125d6578473ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480156125a257506011818154811061258157fe5b906000526020600020906002020160010160059054906101000a900460ff16155b156125c957808383815181106125b457fe5b60200260200101818152505081806001019250505b80806001019150506124fe565b508192505050919050565b60006125ec836133ca565b82106125f757600080fd5b6126008361247f565b828151811061260b57fe5b6020026020010151905092915050565b61263683838360405180602001604052806000815250613985565b505050565b60008161264781614457565b6126b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff166126da82613100565b73ffffffffffffffffffffffffffffffffffffffff1614806127455750600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6127b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f74206f776e6572206f7220617070726f7665642067616d6500000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614156127fc576127f58433614cbd565b9250612809565b6128068432614cbd565b92505b5050919050565b6000806000905060008090505b60118054905081101561289b57836011828154811061283857fe5b90600052602060002090600202016000015414801561288057506011818154811061285f57fe5b906000526020600020906002020160010160059054906101000a900460ff16155b1561288e5781806001019250505b808060010191505061281d565b5080915050919050565b60065481565b60608082516040519080825280602002602001820160405280156128de5781602001602082028038833980820191505090505b50905060008090505b83518110156129315761290c8482815181106128ff57fe5b602002602001015161384f565b82828151811061291857fe5b60200260200101818152505080806001019150506128e7565b5080915050919050565b61294361361b565b61294c57600080fd5b60006010600085815260200190815260200160002060009054906101000a900460ff16612a00576012604051806020016040528061298987614f8e565b81525090806001815401808255809150509060018203906000526020600020016000909192909190915060008201518160000190805190602001906129cf929190615695565b5050505060016010600086815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600160116040518060e00160405280878152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020018660ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff0219169083151502179055505050039050612b568282614832565b50505050565b600080600090506060612b6e8461247f565b905060008090505b8151811015612bce57856011838381518110612b8e57fe5b602002602001015181548110612ba057fe5b9060005260206000209060020201600001541415612bc15782806001019350505b8080600101915050612b76565b50819250505092915050565b6000612be4611e42565b8210612bef57600080fd5b60118281548110612bfc57fe5b9060005260206000209060020201600001549050919050565b6000612c1f61361b565b612c2857600080fd5b600082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612cac57600080fd5b505afa158015612cc0573d6000803e3d6000fd5b505050506040513d6020811015612cd657600080fd5b810190808051906020019092919050505090508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612d7057600080fd5b505af1158015612d84573d6000803e3d6000fd5b505050506040513d6020811015612d9a57600080fd5b810190808051906020019092919050505092505050919050565b6060600060118381548110612dc557fe5b9060005260206000209060020201905060606004604051908082528060200260200182016040528015612e075781602001602082028038833980820191505090505b5090508160010160009054906101000a900460ff1681600081518110612e2957fe5b602002602001019060ff16908160ff16815250508160010160019054906101000a900460ff1681600181518110612e5c57fe5b602002602001019060ff16908160ff16815250508160010160029054906101000a900460ff1681600281518110612e8f57fe5b602002602001019060ff16908160ff16815250508160010160039054906101000a900460ff1681600381518110612ec257fe5b602002602001019060ff16908160ff16815250508092505050919050565b612ee861361b565b612ef157600080fd5b60006010600084815260200190815260200160002060009054906101000a900460ff16612fa55760126040518060200160405280612f2e86614f8e565b8152509080600181540180825580915050906001820390600052602060002001600090919290919091506000820151816000019080519060200190612f74929190615695565b5050505060016010600085815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600160116040518060e00160405280868152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020018560ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff02191690831515021790555050500390506130fb3382614832565b505050565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561317357600080fd5b6011838154811061318057fe5b906000526020600020906002020160010160059054906101000a900460ff1615613212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5468697320746f6b656e206973206275726e656400000000000000000000000081525060200191505060405180910390fd5b80915050919050565b600061322561361b565b61322e57600080fd5b6000858560405160200180838380828437808301925050509250505060405160208183030381529060405280519060200120600460405160200180828054600181600116156101000203166002900480156132c05780601f1061329e5761010080835404028352918201916132c0565b820191906000526020600020905b8154815290600101906020018083116132ac575b505091505060405160208183030381529060405280519060200120146132f7578585600491906132f1929190615715565b50600190505b838360405160200180838380828437808301925050509250505060405160208183030381529060405280519060200120600560405160200180828054600181600116156101000203166002900480156133875780601f10613365576101008083540402835291820191613387565b820191906000526020600020905b815481529060010190602001808311613373575b505091505060405160208183030381529060405280519060200120146133be578383600591906133b8929190615715565b50600190505b80915050949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561340557600080fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61345461361b565b61345d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b613526615795565b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060068060200260405190810160405280929190826006801561359c576020028201915b815481526020019060010190808311613588575b50505050509050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561370b5780601f106136e05761010080835404028352916020019161370b565b820191906000526020600020905b8154815290600101906020018083116136ee57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561374e57600080fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b60008161385b81614457565b6138cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b60008090506000601185815481106138e157fe5b906000526020600020906002020160000154905060008090505b601180549050811015613979576011818154811061391557fe5b9060005260206000209060020201600001548214801561395e57506011818154811061393d57fe5b906000526020600020906002020160010160059054906101000a900460ff16155b1561396c5782806001019350505b80806001019150506138fb565b50819350505050919050565b61399084848461243c565b61399c848484846150bb565b6139a557600080fd5b50505050565b816139b581614457565b613a27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613ac9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061584a602b913960400191505060405180910390fd5b81600d600085815260200190815260200160002081905550505050565b600f6020528160005260406000208160068110613aff57fe5b01600091509150505481565b6060613b1682614457565b613b1f57600080fd5b600060118381548110613b2e57fe5b90600052602060002090600202016000015490506060613b4d82614f8e565b9050613c8e60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613be85780601f10613bbd57610100808354040283529160200191613be8565b820191906000526020600020905b815481529060010190602001808311613bcb57829003601f168201915b50505050508260058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613c845780601f10613c5957610100808354040283529160200191613c84565b820191906000526020600020905b815481529060010190602001808311613c6757829003601f168201915b50505050506152a4565b92505050919050565b6000866010600082815260200190815260200160002060009054906101000a900460ff16613d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f54656d706c61746520646f6573206e6f7420657869737400000000000000000081525060200191505060405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061584a602b913960400191505060405180910390fd5b600080329050600160116040518060e001604052808d81526020018c60ff1681526020018b60ff1681526020018a60ff1681526020018960ff1681526020018860ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff0219169083151502179055505050039150613f278183614832565b8193505050509695505050505050565b733d3d35bb9bec23b06ca00fe472b50e7a4c692c3081565b731f9840a85d5af5bf1d1762f925bdaddc4201f98481565b613f6f61361b565b613f7857600080fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60608083516040519080825280602002602001820160405280156140065781602001602082028038833980820191505090505b50905060008090505b845181101561405a5761403585828151811061402757fe5b60200260200101518561427e565b82828151811061404157fe5b602002602001018181525050808060010191505061400f565b508091505092915050565b600e6020528060005260406000206000915090505481565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8161411b81614457565b61418d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b60068260ff161061419d57600080fd5b8160ff16601184815481106141ae57fe5b906000526020600020906002020160010160049054906101000a900460ff1660ff1614614226576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158266024913960400191505060405180910390fd5b82600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360ff166006811061427457fe5b0181905550505050565b60008261428a81614457565b6142fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b600080905060006011868154811061431057fe5b9060005260206000209060020201600001549050606061432f8661247f565b905060008090505b815181101561438f57601182828151811061434e57fe5b60200260200101518154811061436057fe5b9060005260206000209060020201600001548314156143825783806001019450505b8080600101915050614337565b508294505050505092915050565b6143a561361b565b6143ae57600080fd5b6143b7816153c0565b50565b601181815481106143c757fe5b90600052602060002090600202016000915090508060000154908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900460ff16908060010160039054906101000a900460ff16908060010160049054906101000a900460ff16908060010160059054906101000a900460ff16905087565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600080601188815481106144d957fe5b906000526020600020906002020190508660ff168160010160009054906101000a900460ff1660ff161461452557868160010160006101000a81548160ff021916908360ff1602179055505b8560ff168160010160019054906101000a900460ff1660ff161461456157858160010160016101000a81548160ff021916908360ff1602179055505b8460ff168160010160029054906101000a900460ff1660ff161461459d57848160010160026101000a81548160ff021916908360ff1602179055505b8360ff168160010160039054906101000a900460ff1660ff16146145d957838160010160036101000a81548160ff021916908360ff1602179055505b8260ff168160010160049054906101000a900460ff1660ff161461461557828160010160046101000a81548160ff021916908360ff1602179055505b60019150509695505050505050565b60011515733d3d35bb9bec23b06ca00fe472b50e7a4c692c3073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156146f757600080fd5b505af115801561470b573d6000803e3d6000fd5b505050506040513d602081101561472157600080fd5b81019080805190602001909291905050501515146147a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f7472616e73666572206d7573742073756363656564000000000000000000000081525060200191505060405180910390fd5b50565b600080828401905083811015614828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561486c57600080fd5b61487581614457565b1561487f57600080fd5b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506149246001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147aa90919063ffffffff16565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806149d383613100565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480614a4257508373ffffffffffffffffffffffffffffffffffffffff16614a2a84611acc565b73ffffffffffffffffffffffffffffffffffffffff16145b80614a535750614a52818561407d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16614a7c82613100565b73ffffffffffffffffffffffffffffffffffffffff1614614a9c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614ad657600080fd5b614adf816154ba565b614b326001600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557890919063ffffffff16565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614bc86001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147aa90919063ffffffff16565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600160118481548110614cce57fe5b906000526020600020906002020160010160056101000a81548160ff02191690831515021790555060006008600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614d9c6001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557890919063ffffffff16565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600d60008581526020019081526020016000205490506000811115614f2757733d3d35bb9bec23b06ca00fe472b50e7a4c692c3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614e9b57600080fd5b505af1158015614eaf573d6000803e3d6000fd5b505050506040513d6020811015614ec557600080fd5b810190808051906020019092919050505050600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055505b83600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4600191505092915050565b60606000821415614fd6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506150b6565b600082905060005b60008214615000578080600101915050600a8281614ff857fe5b049150614fde565b6060816040519080825280601f01601f1916602001820160405280156150355781602001600182028038833980820191505090505b50905060006001830390505b600086146150ae57600a868161505357fe5b0660300160f81b8282806001900393508151811061506d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86816150a657fe5b049550615041565b819450505050505b919050565b60006150dc8473ffffffffffffffffffffffffffffffffffffffff166155c2565b6150e9576001905061529c565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156151c45780820151818401526020810190506151a9565b50505050905090810190601f1680156151f15780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561521357600080fd5b505af1158015615227573d6000803e3d6000fd5b505050506040513d602081101561523d57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b60608383836040516020018084805190602001908083835b602083106152df57805182526020820191506020810190506020830392506152bc565b6001836020036101000a03801982511681845116808217855250505050505090500183805190602001908083835b60208310615330578051825260208201915060208101905060208303925061530d565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310615381578051825260208201915060208101905060208303925061535e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405160208183030381529060405290509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156153fa57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff166009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155755760006009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60006155ba83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506155d5565b905092915050565b600080823b905060008111915050919050565b6000838311158290615682576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561564757808201518184015260208101905061562c565b50505050905090810190601f1680156156745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106156d657805160ff1916838001178555615704565b82800160010185558215615704579182015b828111156157035782518255916020019190600101906156e8565b5b50905061571191906157b7565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061575657803560ff1916838001178555615784565b82800160010185558215615784579182015b82811115615783578235825591602001919060010190615768565b5b50905061579191906157b7565b5090565b6040518060c00160405280600690602082028038833980820191505090505090565b6157d991905b808211156157d55760008160009055506001016157bd565b5090565b9056fe596f75206861766520616c726561647920636c61696d6564206120756e69636f726e556e69636f726e2074656d706c61746520686173206e6f74206265656e206164646564207965744974656d2063616e6e6f7420626520657175697070656420696e207468697320736c6f746d73672e73656e646572206973206e6f7420616e20617070726f7665642067616d6520636f6e7472616374a265627a7a723158203d6f0cf075dd3e4b74e4524d3514f301990ef7f34c54193bd247324d93b0431764736f6c6343000511003268747470733a2f2f7465616d33642e696f2f696e76656e746f72792f6a736f6e2f

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061030c5760003560e01c80636352211e1161019d578063c76692db116100e9578063da8c856a116100a2578063e99e214f1161007c578063e99e214f14611747578063ee4c7e4814611782578063f2fde38b146117e4578063ff68fa6e146118285761030c565b8063da8c856a14611546578063e542d2da14611673578063e985e9c5146116cb5761030c565b8063c76692db146112d6578063c87b56dd14611338578063c94111c2146113df578063c951d76414611462578063ca68970f146114ac578063d3736c42146114f65761030c565b80638da5cb5b11610156578063a22cb46511610130578063a22cb46514611107578063aa42826e14611157578063b88d4fde14611199578063be9e8b8a1461129e5761030c565b80638da5cb5b146110185780638f32d59b1461106257806395d89b41146110845761030c565b80636352211e14610d8a57806363a7bd4214610df857806370a0823114610ede578063715018a614610f365780637b2f8f9b14610f40578063817c896614610fc05761030c565b80632c67a8e51161025c5780634bfed95c116102155780634f6ccce7116101ef5780634f6ccce714610c2e5780634ff7ff3214610c7057806351cac75614610ccc57806352ce778014610d4f5761030c565b80634bfed95c14610a645780634dafac1714610b715780634e74264d14610bcc5761030c565b80632c67a8e5146108555780632f745c59146108ee57806342842e0e1461095057806342966c68146109be578063449e078014610a045780634696d1f914610a465761030c565b80631357923a116102c95780631f3dc7af116102a35780631f3dc7af1461073f578063219dacd71461074957806323b872dd1461078b5780632c0cf452146107f95761030c565b80631357923a146105f357806318160ddd1461067a5780631b041ee3146106985761030c565b8063018cb2cf1461031157806301ffc9a71461034257806302e271fe146103a757806306fdde03146104b4578063081812fc14610537578063095ea7b3146105a5575b600080fd5b6103406004803603602081101561032757600080fd5b81019080803560ff1690602001909291905050506118b6565b005b61038d6004803603602081101561035857600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061191d565b604051808215151515815260200191505060405180910390f35b61045d600480360360208110156103bd57600080fd5b81019080803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184602083028401116401000000008311171561040e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611984565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a0578082015181840152602081019050610485565b505050509050019250505060405180910390f35b6104bc611a2a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104fc5780820151818401526020810190506104e1565b50505050905090810190601f1680156105295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105636004803603602081101561054d57600080fd5b8101908080359060200190929190505050611acc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105f1600480360360408110156105bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b1b565b005b610660600480360360c081101561060957600080fd5b8101908080359060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190505050611c5c565b604051808215151515815260200191505060405180910390f35b610682611e42565b6040518082815260200191505060405180910390f35b6106c4600480360360208110156106ae57600080fd5b8101908080359060200190929190505050611ea6565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107045780820151818401526020810190506106e9565b50505050905090810190601f1680156107315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610747611f65565b005b6107756004803603602081101561075f57600080fd5b8101908080359060200190929190505050612424565b6040518082815260200191505060405180910390f35b6107f7600480360360608110156107a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061243c565b005b61083b6004803603602081101561080f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061245f565b604051808215151515815260200191505060405180910390f35b6108976004803603602081101561086b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061247f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108da5780820151818401526020810190506108bf565b505050509050019250505060405180910390f35b61093a6004803603604081101561090457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506125e1565b6040518082815260200191505060405180910390f35b6109bc6004803603606081101561096657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061261b565b005b6109ea600480360360208110156109d457600080fd5b810190808035906020019092919050505061263b565b604051808215151515815260200191505060405180910390f35b610a3060048036036020811015610a1a57600080fd5b8101908080359060200190929190505050612810565b6040518082815260200191505060405180910390f35b610a4e6128a5565b6040518082815260200191505060405180910390f35b610b1a60048036036020811015610a7a57600080fd5b8101908080359060200190640100000000811115610a9757600080fd5b820183602082011115610aa957600080fd5b80359060200191846020830284011164010000000083111715610acb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506128ab565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b5d578082015181840152602081019050610b42565b505050509050019250505060405180910390f35b610bca60048036036060811015610b8757600080fd5b8101908080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293b565b005b610c1860048036036040811015610be257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b5c565b6040518082815260200191505060405180910390f35b610c5a60048036036020811015610c4457600080fd5b8101908080359060200190929190505050612bda565b6040518082815260200191505060405180910390f35b610cb260048036036020811015610c8657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c15565b604051808215151515815260200191505060405180910390f35b610cf860048036036020811015610ce257600080fd5b8101908080359060200190929190505050612db4565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d3b578082015181840152602081019050610d20565b505050509050019250505060405180910390f35b610d8860048036036040811015610d6557600080fd5b8101908080359060200190929190803560ff169060200190929190505050612ee0565b005b610db660048036036020811015610da057600080fd5b8101908080359060200190929190505050613100565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ec460048036036040811015610e0e57600080fd5b8101908080359060200190640100000000811115610e2b57600080fd5b820183602082011115610e3d57600080fd5b80359060200191846001830284011164010000000083111715610e5f57600080fd5b909192939192939080359060200190640100000000811115610e8057600080fd5b820183602082011115610e9257600080fd5b80359060200191846001830284011164010000000083111715610eb457600080fd5b909192939192939050505061321b565b604051808215151515815260200191505060405180910390f35b610f2060048036036020811015610ef457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133ca565b6040518082815260200191505060405180910390f35b610f3e61344c565b005b610f8260048036036020811015610f5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061351e565b6040518082600660200280838360005b83811015610fad578082015181840152602081019050610f92565b5050505090500191505060405180910390f35b61100260048036036020811015610fd657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506135a8565b6040518082815260200191505060405180910390f35b6110206135f1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61106a61361b565b604051808215151515815260200191505060405180910390f35b61108c613673565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110cc5780820151818401526020810190506110b1565b50505050905090810190601f1680156110f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6111556004803603604081101561111d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613715565b005b6111836004803603602081101561116d57600080fd5b810190808035906020019092919050505061384f565b6040518082815260200191505060405180910390f35b61129c600480360360808110156111af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561121657600080fd5b82018360208201111561122857600080fd5b8035906020019184600183028401116401000000008311171561124a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613985565b005b6112d4600480360360408110156112b457600080fd5b8101908080359060200190929190803590602001909291905050506139ab565b005b611322600480360360408110156112ec57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613ae6565b6040518082815260200191505060405180910390f35b6113646004803603602081101561134e57600080fd5b8101908080359060200190929190505050613b0b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156113a4578082015181840152602081019050611389565b50505050905090810190601f1680156113d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61144c600480360360c08110156113f557600080fd5b8101908080359060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190505050613c97565b6040518082815260200191505060405180910390f35b61146a613f37565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6114b4613f4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6115446004803603604081101561150c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613f67565b005b61161c6004803603604081101561155c57600080fd5b810190808035906020019064010000000081111561157957600080fd5b82018360208201111561158b57600080fd5b803590602001918460208302840111640100000000831117156115ad57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fd3565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561165f578082015181840152602081019050611644565b505050509050019250505060405180910390f35b6116b56004803603602081101561168957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614065565b6040518082815260200191505060405180910390f35b61172d600480360360408110156116e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061407d565b604051808215151515815260200191505060405180910390f35b6117806004803603604081101561175d57600080fd5b8101908080359060200190929190803560ff169060200190929190505050614111565b005b6117ce6004803603604081101561179857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061427e565b6040518082815260200191505060405180910390f35b611826600480360360208110156117fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061439d565b005b6118546004803603602081101561183e57600080fd5b81019080803590602001909291905050506143ba565b604051808881526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff1681526020018460ff1660ff1681526020018360ff1660ff1681526020018215151515815260200197505050505050505060405180910390f35b60068160ff16106118c657600080fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208260ff166006811061191557fe5b018190555050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60608082516040519080825280602002602001820160405280156119b75781602001602082028038833980820191505090505b50905060008090505b8351811015611a205760118482815181106119d757fe5b6020026020010151815481106119e957fe5b906000526020600020906002020160000154828281518110611a0757fe5b60200260200101818152505080806001019150506119c0565b5080915050919050565b606060028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ac25780601f10611a9757610100808354040283529160200191611ac2565b820191906000526020600020905b815481529060010190602001808311611aa557829003601f168201915b5050505050905090565b6000611ad782614457565b611ae057600080fd5b6009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000611b2682613100565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b6157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ba15750611ba0813361407d565b5b611baa57600080fd5b826009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061584a602b913960400191505060405180910390fd5b86611d0a81614457565b611d7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b873273ffffffffffffffffffffffffffffffffffffffff16611d9d82613100565b73ffffffffffffffffffffffffffffffffffffffff1614611e26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f74782e6f726967696e206973206e6f742074686520746f6b656e206f776e657281525060200191505060405180910390fd5b611e348989898989896144c9565b925050509695505050505050565b60008060008090505b601180549050811015611e9e5760118181548110611e6557fe5b906000526020600020906002020160010160059054906101000a900460ff16611e915781806001019250505b8080600101915050611e4b565b508091505090565b60128181548110611eb357fe5b90600052602060002001600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f5b5780601f10611f3057610100808354040283529160200191611f5b565b820191906000526020600020905b815481529060010190602001808311611f3e57829003601f168201915b5050505050905081565b6000606460065410611fdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f556e69636f726e7320617265206e6f7720657874696e6374000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612082576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806157dd6022913960400191505060405180910390fd5b683635c9adc5dea00000731f9840a85d5af5bf1d1762f925bdaddc4201f98473ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561211d57600080fd5b505afa158015612131573d6000803e3d6000fd5b505050506040513d602081101561214757600080fd5b810190808051906020019092919050505010156121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d696e2062616c616e6365203130303020554e4900000000000000000000000081525060200191505060405180910390fd5b60106000600b815260200190815260200160002060009054906101000a900460ff16612243576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806157ff6027913960400191505060405180910390fd5b612255683635c9adc5dea00000614624565b600160116040518060e00160405280600b8152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff02191690831515021790555050500390506123b960016006546147aa90919063ffffffff16565b6006819055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124213382614832565b50565b600d6020528060005260406000206000915090505481565b61244633826149c7565b61244f57600080fd5b61245a838383614a5c565b505050565b60076020528060005260406000206000915054906101000a900460ff1681565b606080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040519080825280602002602001820160405280156124f05781602001602082028038833980820191505090505b509050600080905060008090505b6011805490508110156125d6578473ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480156125a257506011818154811061258157fe5b906000526020600020906002020160010160059054906101000a900460ff16155b156125c957808383815181106125b457fe5b60200260200101818152505081806001019250505b80806001019150506124fe565b508192505050919050565b60006125ec836133ca565b82106125f757600080fd5b6126008361247f565b828151811061260b57fe5b6020026020010151905092915050565b61263683838360405180602001604052806000815250613985565b505050565b60008161264781614457565b6126b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff166126da82613100565b73ffffffffffffffffffffffffffffffffffffffff1614806127455750600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6127b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f74206f776e6572206f7220617070726f7665642067616d6500000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614156127fc576127f58433614cbd565b9250612809565b6128068432614cbd565b92505b5050919050565b6000806000905060008090505b60118054905081101561289b57836011828154811061283857fe5b90600052602060002090600202016000015414801561288057506011818154811061285f57fe5b906000526020600020906002020160010160059054906101000a900460ff16155b1561288e5781806001019250505b808060010191505061281d565b5080915050919050565b60065481565b60608082516040519080825280602002602001820160405280156128de5781602001602082028038833980820191505090505b50905060008090505b83518110156129315761290c8482815181106128ff57fe5b602002602001015161384f565b82828151811061291857fe5b60200260200101818152505080806001019150506128e7565b5080915050919050565b61294361361b565b61294c57600080fd5b60006010600085815260200190815260200160002060009054906101000a900460ff16612a00576012604051806020016040528061298987614f8e565b81525090806001815401808255809150509060018203906000526020600020016000909192909190915060008201518160000190805190602001906129cf929190615695565b5050505060016010600086815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600160116040518060e00160405280878152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020018660ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff0219169083151502179055505050039050612b568282614832565b50505050565b600080600090506060612b6e8461247f565b905060008090505b8151811015612bce57856011838381518110612b8e57fe5b602002602001015181548110612ba057fe5b9060005260206000209060020201600001541415612bc15782806001019350505b8080600101915050612b76565b50819250505092915050565b6000612be4611e42565b8210612bef57600080fd5b60118281548110612bfc57fe5b9060005260206000209060020201600001549050919050565b6000612c1f61361b565b612c2857600080fd5b600082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612cac57600080fd5b505afa158015612cc0573d6000803e3d6000fd5b505050506040513d6020811015612cd657600080fd5b810190808051906020019092919050505090508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612d7057600080fd5b505af1158015612d84573d6000803e3d6000fd5b505050506040513d6020811015612d9a57600080fd5b810190808051906020019092919050505092505050919050565b6060600060118381548110612dc557fe5b9060005260206000209060020201905060606004604051908082528060200260200182016040528015612e075781602001602082028038833980820191505090505b5090508160010160009054906101000a900460ff1681600081518110612e2957fe5b602002602001019060ff16908160ff16815250508160010160019054906101000a900460ff1681600181518110612e5c57fe5b602002602001019060ff16908160ff16815250508160010160029054906101000a900460ff1681600281518110612e8f57fe5b602002602001019060ff16908160ff16815250508160010160039054906101000a900460ff1681600381518110612ec257fe5b602002602001019060ff16908160ff16815250508092505050919050565b612ee861361b565b612ef157600080fd5b60006010600084815260200190815260200160002060009054906101000a900460ff16612fa55760126040518060200160405280612f2e86614f8e565b8152509080600181540180825580915050906001820390600052602060002001600090919290919091506000820151816000019080519060200190612f74929190615695565b5050505060016010600085815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600160116040518060e00160405280868152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020018560ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff02191690831515021790555050500390506130fb3382614832565b505050565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561317357600080fd5b6011838154811061318057fe5b906000526020600020906002020160010160059054906101000a900460ff1615613212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5468697320746f6b656e206973206275726e656400000000000000000000000081525060200191505060405180910390fd5b80915050919050565b600061322561361b565b61322e57600080fd5b6000858560405160200180838380828437808301925050509250505060405160208183030381529060405280519060200120600460405160200180828054600181600116156101000203166002900480156132c05780601f1061329e5761010080835404028352918201916132c0565b820191906000526020600020905b8154815290600101906020018083116132ac575b505091505060405160208183030381529060405280519060200120146132f7578585600491906132f1929190615715565b50600190505b838360405160200180838380828437808301925050509250505060405160208183030381529060405280519060200120600560405160200180828054600181600116156101000203166002900480156133875780601f10613365576101008083540402835291820191613387565b820191906000526020600020905b815481529060010190602001808311613373575b505091505060405160208183030381529060405280519060200120146133be578383600591906133b8929190615715565b50600190505b80915050949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561340557600080fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61345461361b565b61345d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b613526615795565b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060068060200260405190810160405280929190826006801561359c576020028201915b815481526020019060010190808311613588575b50505050509050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561370b5780601f106136e05761010080835404028352916020019161370b565b820191906000526020600020905b8154815290600101906020018083116136ee57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561374e57600080fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b60008161385b81614457565b6138cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b60008090506000601185815481106138e157fe5b906000526020600020906002020160000154905060008090505b601180549050811015613979576011818154811061391557fe5b9060005260206000209060020201600001548214801561395e57506011818154811061393d57fe5b906000526020600020906002020160010160059054906101000a900460ff16155b1561396c5782806001019350505b80806001019150506138fb565b50819350505050919050565b61399084848461243c565b61399c848484846150bb565b6139a557600080fd5b50505050565b816139b581614457565b613a27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613ac9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061584a602b913960400191505060405180910390fd5b81600d600085815260200190815260200160002081905550505050565b600f6020528160005260406000208160068110613aff57fe5b01600091509150505481565b6060613b1682614457565b613b1f57600080fd5b600060118381548110613b2e57fe5b90600052602060002090600202016000015490506060613b4d82614f8e565b9050613c8e60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613be85780601f10613bbd57610100808354040283529160200191613be8565b820191906000526020600020905b815481529060010190602001808311613bcb57829003601f168201915b50505050508260058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613c845780601f10613c5957610100808354040283529160200191613c84565b820191906000526020600020905b815481529060010190602001808311613c6757829003601f168201915b50505050506152a4565b92505050919050565b6000866010600082815260200190815260200160002060009054906101000a900460ff16613d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f54656d706c61746520646f6573206e6f7420657869737400000000000000000081525060200191505060405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061584a602b913960400191505060405180910390fd5b600080329050600160116040518060e001604052808d81526020018c60ff1681526020018b60ff1681526020018a60ff1681526020018960ff1681526020018860ff16815260200160001515815250908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548160ff021916908360ff16021790555060808201518160010160036101000a81548160ff021916908360ff16021790555060a08201518160010160046101000a81548160ff021916908360ff16021790555060c08201518160010160056101000a81548160ff0219169083151502179055505050039150613f278183614832565b8193505050509695505050505050565b733d3d35bb9bec23b06ca00fe472b50e7a4c692c3081565b731f9840a85d5af5bf1d1762f925bdaddc4201f98481565b613f6f61361b565b613f7857600080fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60608083516040519080825280602002602001820160405280156140065781602001602082028038833980820191505090505b50905060008090505b845181101561405a5761403585828151811061402757fe5b60200260200101518561427e565b82828151811061404157fe5b602002602001018181525050808060010191505061400f565b508091505092915050565b600e6020528060005260406000206000915090505481565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8161411b81614457565b61418d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b60068260ff161061419d57600080fd5b8160ff16601184815481106141ae57fe5b906000526020600020906002020160010160049054906101000a900460ff1660ff1614614226576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158266024913960400191505060405180910390fd5b82600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360ff166006811061427457fe5b0181905550505050565b60008261428a81614457565b6142fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b600080905060006011868154811061431057fe5b9060005260206000209060020201600001549050606061432f8661247f565b905060008090505b815181101561438f57601182828151811061434e57fe5b60200260200101518154811061436057fe5b9060005260206000209060020201600001548314156143825783806001019450505b8080600101915050614337565b508294505050505092915050565b6143a561361b565b6143ae57600080fd5b6143b7816153c0565b50565b601181815481106143c757fe5b90600052602060002090600202016000915090508060000154908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900460ff16908060010160039054906101000a900460ff16908060010160049054906101000a900460ff16908060010160059054906101000a900460ff16905087565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600080601188815481106144d957fe5b906000526020600020906002020190508660ff168160010160009054906101000a900460ff1660ff161461452557868160010160006101000a81548160ff021916908360ff1602179055505b8560ff168160010160019054906101000a900460ff1660ff161461456157858160010160016101000a81548160ff021916908360ff1602179055505b8460ff168160010160029054906101000a900460ff1660ff161461459d57848160010160026101000a81548160ff021916908360ff1602179055505b8360ff168160010160039054906101000a900460ff1660ff16146145d957838160010160036101000a81548160ff021916908360ff1602179055505b8260ff168160010160049054906101000a900460ff1660ff161461461557828160010160046101000a81548160ff021916908360ff1602179055505b60019150509695505050505050565b60011515733d3d35bb9bec23b06ca00fe472b50e7a4c692c3073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156146f757600080fd5b505af115801561470b573d6000803e3d6000fd5b505050506040513d602081101561472157600080fd5b81019080805190602001909291905050501515146147a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f7472616e73666572206d7573742073756363656564000000000000000000000081525060200191505060405180910390fd5b50565b600080828401905083811015614828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561486c57600080fd5b61487581614457565b1561487f57600080fd5b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506149246001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147aa90919063ffffffff16565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806149d383613100565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480614a4257508373ffffffffffffffffffffffffffffffffffffffff16614a2a84611acc565b73ffffffffffffffffffffffffffffffffffffffff16145b80614a535750614a52818561407d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16614a7c82613100565b73ffffffffffffffffffffffffffffffffffffffff1614614a9c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614ad657600080fd5b614adf816154ba565b614b326001600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557890919063ffffffff16565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614bc86001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147aa90919063ffffffff16565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600160118481548110614cce57fe5b906000526020600020906002020160010160056101000a81548160ff02191690831515021790555060006008600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614d9c6001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461557890919063ffffffff16565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600d60008581526020019081526020016000205490506000811115614f2757733d3d35bb9bec23b06ca00fe472b50e7a4c692c3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614e9b57600080fd5b505af1158015614eaf573d6000803e3d6000fd5b505050506040513d6020811015614ec557600080fd5b810190808051906020019092919050505050600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055505b83600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4600191505092915050565b60606000821415614fd6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506150b6565b600082905060005b60008214615000578080600101915050600a8281614ff857fe5b049150614fde565b6060816040519080825280601f01601f1916602001820160405280156150355781602001600182028038833980820191505090505b50905060006001830390505b600086146150ae57600a868161505357fe5b0660300160f81b8282806001900393508151811061506d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86816150a657fe5b049550615041565b819450505050505b919050565b60006150dc8473ffffffffffffffffffffffffffffffffffffffff166155c2565b6150e9576001905061529c565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156151c45780820151818401526020810190506151a9565b50505050905090810190601f1680156151f15780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561521357600080fd5b505af1158015615227573d6000803e3d6000fd5b505050506040513d602081101561523d57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b60608383836040516020018084805190602001908083835b602083106152df57805182526020820191506020810190506020830392506152bc565b6001836020036101000a03801982511681845116808217855250505050505090500183805190602001908083835b60208310615330578051825260208201915060208101905060208303925061530d565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310615381578051825260208201915060208101905060208303925061535e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405160208183030381529060405290509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156153fa57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff166009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155755760006009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60006155ba83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506155d5565b905092915050565b600080823b905060008111915050919050565b6000838311158290615682576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561564757808201518184015260208101905061562c565b50505050905090810190601f1680156156745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106156d657805160ff1916838001178555615704565b82800160010185558215615704579182015b828111156157035782518255916020019190600101906156e8565b5b50905061571191906157b7565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061575657803560ff1916838001178555615784565b82800160010185558215615784579182015b82811115615783578235825591602001919060010190615768565b5b50905061579191906157b7565b5090565b6040518060c00160405280600690602082028038833980820191505090505090565b6157d991905b808211156157d55760008160009055506001016157bd565b5090565b9056fe596f75206861766520616c726561647920636c61696d6564206120756e69636f726e556e69636f726e2074656d706c61746520686173206e6f74206265656e206164646564207965744974656d2063616e6e6f7420626520657175697070656420696e207468697320736c6f746d73672e73656e646572206973206e6f7420616e20617070726f7665642067616d6520636f6e7472616374a265627a7a723158203d6f0cf075dd3e4b74e4524d3514f301990ef7f34c54193bd247324d93b0431764736f6c63430005110032

Deployed Bytecode Sourcemap

14007:33155:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14007:33155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19724:198;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19724:198:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;3975:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3975:135:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24256:396;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24256:396:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;24256:396:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24256:396: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;24256:396: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;;24256:396:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;24256:396:0;;;;;;;;;;;;;;;;;36157:120;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;36157:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39133:204;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39133:204:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38499:341;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38499:341:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29453:768;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;29453:768:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35072:347;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16918:31;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16918:31:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;16918:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18331:763;;;:::i;:::-;;15708:56;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15708:56:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40886:234;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40886:234:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14969:47;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14969:47:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24700:608;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24700:608:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;24700:608:0;;;;;;;;;;;;;;;;;35780:267;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35780:267:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41773:235;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41773:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33684:338;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33684:338:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20214:502;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20214:502:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14926:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23061:387;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23061:387:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;23061:387:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23061:387: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;23061:387: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;;23061:387:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;23061:387:0;;;;;;;;;;;;;;;;;27447:666;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27447:666:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20852:628;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20852:628:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35477:214;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35477:214:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25362:312;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25362:312:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31395:438;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31395:438:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;31395:438:0;;;;;;;;;;;;;;;;;26722:628;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26722:628:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37714:354;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37714:354:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25993:604;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25993:604:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;25993:604:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25993:604: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;25993:604:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;25993:604:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25993:604: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;25993:604:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37279:204;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37279:204:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6840:140;;;:::i;:::-;;19930:180;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19930:180:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;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;19930:180:0;;;;;;;;;;;;;;;;34917:115;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34917:115:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6127:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6462:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36391:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;36391:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39637:269;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39637:269:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21588:522;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21588:522:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42727:326;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;42727:326:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;42727:326:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42727:326: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;42727:326: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;;42727:326:0;;;;;;;;;;;;;;;:::i;:::-;;33117:204;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33117:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16079:57;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16079:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36721:348;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36721:348:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;36721:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28381:852;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;28381:852:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14598:108;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14742:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25744:183;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25744:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23602:433;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23602:433:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;23602:433:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23602:433: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;23602:433: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;;23602:433:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;23602:433:0;;;;;;;;;;;;;;;;;15857:54;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15857:54:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40235:208;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40235:208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19308:408;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19308:408:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22227:701;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22227:701:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7157:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7157:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;16835:22;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16835:22:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19724:198;19847:1;19826:18;:22;;;19818:31;;;;;;19913:1;19860:18;:30;19879:10;19860:30;;;;;;;;;;;;;;;19891:18;19860:50;;;;;;;;;;:54;;;;19724:198;:::o;3975:135::-;4045:4;4069:20;:33;4090:11;4069:33;;;;;;;;;;;;;;;;;;;;;;;;;;;4062:40;;3975:135;;;:::o;24256:396::-;24378:13;24409:25;24448:9;:16;24437:28;;;;;;;;;;;;;;;;;;;;;;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;24437:28:0;;;;24409:56;;24490:6;24499:1;24490:10;;24486:120;24506:9;:16;24502:1;:20;24486:120;;;24561:8;24570:9;24580:1;24570:12;;;;;;;;;;;;;;24561:22;;;;;;;;;;;;;;;;;;:33;;;24544:11;24556:1;24544:14;;;;;;;;;;;;;:50;;;;;24524:3;;;;;;;24486:120;;;;24633:11;24626:18;;;24256:396;;;:::o;36157:120::-;36225:13;36264:5;36257:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36157:120;:::o;39133:204::-;39237:7;39270:16;39278:7;39270;:16::i;:::-;39262:25;;;;;;39305:15;:24;39321:7;39305:24;;;;;;;;;;;;;;;;;;;;;39298:31;;39133:204;;;:::o;38499:341::-;38605:13;38621:16;38629:7;38621;:16::i;:::-;38605:32;;38662:5;38656:11;;:2;:11;;;;38648:20;;;;;;38701:5;38687:19;;:10;:19;;;:58;;;;38710:35;38727:5;38734:10;38710:16;:35::i;:::-;38687:58;38679:67;;;;;;38786:2;38759:15;:24;38775:7;38759:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38824:7;38820:2;38804:28;;38813:5;38804:28;;;;;;;;;;;;38499:341;;;:::o;29453:768::-;29945:4;17009:21;:33;17031:10;17009:33;;;;;;;;;;;;;;;;;;;;;;;;;17001:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29779:8;17180:17;17188:8;17180:7;:17::i;:::-;17172:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29862:8;17337:9;17316:30;;:17;17324:8;17316:7;:17::i;:::-;:30;;;17308:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29989:213;30030:8;30057:9;30085;30113;30141;30169:18;29989:22;:213::i;:::-;29967:246;;17233:1;17101;29453:768;;;;;;;;:::o;35072:347::-;35145:7;35170:15;35200:6;35209:1;35200:10;;35196:136;35216:8;:15;;;;35212:1;:19;35196:136;;;35257:8;35266:1;35257:11;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;;35253:68;;35296:9;;;;;;;35253:68;35233:3;;;;;;;35196:136;;;;35404:7;35397:14;;;35072:347;:::o;16918:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18331:763::-;18388:10;18450:3;18427:20;;:26;18419:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18496:14;:26;18511:10;18496:26;;;;;;;;;;;;;;;;;;;;;;;;;18495:27;18487:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18617:13;14794:42;18580:21;;;18602:10;18580:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18580:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18580:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18580:33:0;;;;;;;;;;;;;;;;:50;;18572:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18674:15;:36;14920:2;18674:36;;;;;;;;;;;;;;;;;;;;;18666:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18765:36;18787:13;18765:21;:36::i;:::-;18921:1;18863:8;18877:41;;;;;;;;14920:2;18877:41;;;;18902:1;18877:41;;;;;;18904:1;18877:41;;;;;;18906:1;18877:41;;;;;;18908:1;18877:41;;;;;;18910:1;18877:41;;;;;;18912:5;18877:41;;;;;18863:56;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;18863:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:59;18858:64;;18954:27;18979:1;18954:20;;:24;;:27;;;;:::i;:::-;18931:20;:50;;;;19015:4;18986:14;:26;19001:10;18986:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;19065:21;19071:10;19083:2;19065:5;:21::i;:::-;18331:763;:::o;15708:56::-;;;;;;;;;;;;;;;;;:::o;40886:234::-;41029:39;41048:10;41060:7;41029:18;:39::i;:::-;41021:48;;;;;;41080:32;41094:4;41100:2;41104:7;41080:13;:32::i;:::-;40886:234;;;:::o;14969:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;24700:608::-;24807:13;24839:20;24873:17;:25;24891:6;24873:25;;;;;;;;;;;;;;;;24862:37;;;;;;;;;;;;;;;;;;;;;;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;24862:37:0;;;;24839:60;;24910:12;24925:1;24910:16;;24952:6;24961:1;24952:10;;24947:264;24968:8;:15;;;;24964:1;:19;24947:264;;;25087:6;25069:24;;:11;:14;25081:1;25069:14;;;;;;;;;;;;;;;;;;;;;:24;;;:47;;;;;25098:8;25107:1;25098:11;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;;25097:19;25069:47;25065:135;;;25155:1;25137:6;25144:7;25137:15;;;;;;;;;;;;;:19;;;;;25175:9;;;;;;;25065:135;24985:3;;;;;;;24947:264;;;;25294:6;25287:13;;;;24700:608;;;:::o;35780:267::-;35925:15;35975:16;35985:5;35975:9;:16::i;:::-;35967:5;:24;35959:33;;;;;;36010:22;36026:5;36010:15;:22::i;:::-;36033:5;36010:29;;;;;;;;;;;;;;36003:36;;35780:267;;;;:::o;41773:235::-;41961:39;41978:4;41984:2;41988:7;41961:39;;;;;;;;;;;;:16;:39::i;:::-;41773:235;;;:::o;33684:338::-;33837:4;33769:8;17180:17;17188:8;17180:7;:17::i;:::-;17172:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33810:8;17504:10;17483:31;;:17;17491:8;17483:7;:17::i;:::-;:31;;;:68;;;;17518:21;:33;17540:10;17518:33;;;;;;;;;;;;;;;;;;;;;;;;;17483:68;17475:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33876:10;33863:23;;:9;:23;;;33859:156;;;33910:27;33916:8;33926:10;33910:5;:27::i;:::-;33903:34;;;;33859:156;33977:26;33983:8;33993:9;33977:5;:26::i;:::-;33970:33;;17593:1;17233;33684:338;;;;:::o;20214:502::-;20329:7;20355:12;20370:1;20355:16;;20397:6;20406:1;20397:10;;20392:227;20413:8;:15;;;;20409:1;:19;20392:227;;;20528:11;20502:8;20511:1;20502:11;;;;;;;;;;;;;;;;;;:22;;;:37;:60;;;;;20544:8;20553:1;20544:11;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;;20543:19;20502:60;20498:110;;;20583:9;;;;;;;20498:110;20430:3;;;;;;;20392:227;;;;20701:7;20694:14;;;20214:502;;;:::o;14926:39::-;;;;:::o;23061:387::-;23186:13;23217:20;23251:9;:16;23240:28;;;;;;;;;;;;;;;;;;;;;;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;23240:28:0;;;;23217:51;;23293:6;23302:1;23293:10;;23289:118;23309:9;:16;23305:1;:20;23289:118;;;23359:36;23382:9;23392:1;23382:12;;;;;;;;;;;;;;23359:22;:36::i;:::-;23347:6;23354:1;23347:9;;;;;;;;;;;;;:48;;;;;23327:3;;;;;;;23289:118;;;;23434:6;23427:13;;;23061:387;;;:::o;27447:666::-;6339:9;:7;:9::i;:::-;6331:18;;;;;;27630:10;27729:15;:28;27745:11;27729:28;;;;;;;;;;;;;;;;;;;;;27725:222;;27834:13;27853:31;;;;;;;;27862:21;27871:11;27862:8;:21::i;:::-;27853:31;;;27834:51;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27834:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;27931:4;27900:15;:28;27916:11;27900:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;27725:222;28039:1;27972:8;27986:50;;;;;;;;27991:11;27986:50;;;;28003:1;27986:50;;;;;;28005:1;27986:50;;;;;;28007:1;27986:50;;;;;;28009:1;27986:50;;;;;;28011:18;27986:50;;;;;;28030:5;27986:50;;;;;27972:65;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27972:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:68;27967:73;;28086:19;28092:8;28102:2;28086:5;:19::i;:::-;6360:1;27447:666;;;:::o;20852:628::-;20996:7;21021:12;21036:1;21021:16;;21048:24;21075:23;21091:6;21075:15;:23::i;:::-;21048:50;;21123:6;21132:1;21123:10;;21119:261;21139:10;:17;21135:1;:21;21119:261;;;21312:11;21274:8;21283:10;21294:1;21283:13;;;;;;;;;;;;;;21274:23;;;;;;;;;;;;;;;;;;:34;;;:49;21271:98;;;21344:9;;;;;;;21271:98;21158:3;;;;;;;21119:261;;;;21465:7;21458:14;;;;20852:628;;;;:::o;35477:214::-;35581:7;35624:13;:11;:13::i;:::-;35615:6;:22;35607:31;;;;;;35656:8;35665:6;35656:16;;;;;;;;;;;;;;;;;;:27;;;35649:34;;35477:214;;;:::o;25362:312::-;25488:4;6339:9;:7;:9::i;:::-;6331:18;;;;;;25511:16;25541:14;25511:45;;25567:14;25584:5;:15;;;25608:4;25584:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25584:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25584:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25584:30:0;;;;;;;;;;;;;;;;25567:47;;25632:5;:14;;;25647:10;25659:6;25632:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25632:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25632:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25632:34:0;;;;;;;;;;;;;;;;25625:41;;;;25362:312;;;:::o;31395:438::-;31506:14;31538:17;31558:8;31567;31558:18;;;;;;;;;;;;;;;;;;31538:38;;31587:23;31625:1;31613:14;;;;;;;;;;;;;;;;;;;;;;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;31613:14:0;;;;31587:40;;31662:4;:13;;;;;;;;;;;;31648:8;31657:1;31648:11;;;;;;;;;;;;;:27;;;;;;;;;;;31700:4;:13;;;;;;;;;;;;31686:8;31695:1;31686:11;;;;;;;;;;;;;:27;;;;;;;;;;;31738:4;:13;;;;;;;;;;;;31724:8;31733:1;31724:11;;;;;;;;;;;;;:27;;;;;;;;;;;31776:4;:13;;;;;;;;;;;;31762:8;31771:1;31762:11;;;;;;;;;;;;;:27;;;;;;;;;;;31817:8;31810:15;;;;31395:438;;;:::o;26722:628::-;6339:9;:7;:9::i;:::-;6331:18;;;;;;26866:10;26965:15;:28;26981:11;26965:28;;;;;;;;;;;;;;;;;;;;;26961:221;;27069:13;27088:31;;;;;;;;27097:21;27106:11;27097:8;:21::i;:::-;27088:31;;;27069:51;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27069:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;27166:4;27135:15;:28;27151:11;27135:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;26961:221;27274:1;27207:8;27221:50;;;;;;;;27226:11;27221:50;;;;27238:1;27221:50;;;;;;27240:1;27221:50;;;;;;27242:1;27221:50;;;;;;27244:1;27221:50;;;;;;27246:18;27221:50;;;;;;27265:5;27221:50;;;;;27207:65;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27207:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:68;27202:73;;27321:21;27327:10;27339:2;27321:5;:21::i;:::-;6360:1;26722:628;;:::o;37714:354::-;37814:7;37840:13;37856:11;:20;37868:7;37856:20;;;;;;;;;;;;;;;;;;;;;37840:36;;37912:1;37895:19;;:5;:19;;;;37887:28;;;;;;37935:8;37944:7;37935:17;;;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;37934:25;37926:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38055:5;38048:12;;;37714:354;;;:::o;25993:604::-;26148:4;6339:9;:7;:9::i;:::-;6331:18;;;;;;26170:12;26276;;26259:30;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;26259:30:0;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;26259:30:0;;;26249:41;;;;;;26233:10;26216:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;26216:28:0;;;26206:39;;;;;;:84;26203:170;;26320:12;;26307:10;:25;;;;;;;:::i;:::-;;26357:4;26347:14;;26203:170;26464:10;;26447:28;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;26447:28:0;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;26447:28:0;;;26437:39;;;;;;26423:8;26406:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;26406:26:0;;;26396:37;;;;;;:80;26393:162;;26504:10;;26493:8;:21;;;;;;;:::i;:::-;;26539:4;26529:14;;26393:162;26582:7;26575:14;;;25993:604;;;;;;:::o;37279:204::-;37379:7;37430:1;37413:19;;:5;:19;;;;37405:28;;;;;;37451:17;:24;37469:5;37451:24;;;;;;;;;;;;;;;;37444:31;;37279:204;;;:::o;6840:140::-;6339:9;:7;:9::i;:::-;6331:18;;;;;;6939:1;6902:40;;6923:6;;;;;;;;;;;6902:40;;;;;;;;;;;;6970:1;6953:6;;:19;;;;;;;;;;;;;;;;;;6840:140::o;19930:180::-;20034:17;;:::i;:::-;20076:18;:26;20095:6;20076:26;;;;;;;;;;;;;;;20069:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19930:180;;;:::o;34917:115::-;34971:7;34998:18;:26;35017:6;34998:26;;;;;;;;;;;;;;;;34991:33;;34917:115;;;:::o;6127:79::-;6165:7;6192:6;;;;;;;;;;;6185:13;;6127:79;:::o;6462:92::-;6502:4;6540:6;;;;;;;;;;;6526:20;;:10;:20;;;6519:27;;6462:92;:::o;36391:124::-;36461:13;36500:7;36493:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36391:124;:::o;39637:269::-;39765:10;39759:16;;:2;:16;;;;39751:25;;;;;;39824:8;39787:18;:30;39806:10;39787:30;;;;;;;;;;;;;;;:34;39818:2;39787:34;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;39885:2;39858:40;;39873:10;39858:40;;;39889:8;39858:40;;;;;;;;;;;;;;;;;;;;;;39637:269;;:::o;21588:522::-;21732:7;21705:8;17180:17;17188:8;17180:7;:17::i;:::-;17172:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21757:15;21775:1;21757:19;;21787:18;21808:8;21817;21808:18;;;;;;;;;;;;;;;;;;:29;;;21787:50;;21896:6;21905:1;21896:10;;21892:176;21912:8;:15;;;;21908:1;:19;21892:176;;;21966:8;21975:1;21966:11;;;;;;;;;;;;;;;;;;:22;;;21952:10;:36;:59;;;;;21993:8;22002:1;21993:11;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;;21992:19;21952:59;21949:108;;;22032:9;;;;;;;21949:108;21929:3;;;;;;;21892:176;;;;22095:7;22088:14;;;;21588:522;;;;:::o;42727:326::-;42896:31;42909:4;42915:2;42919:7;42896:12;:31::i;:::-;42996:48;43019:4;43025:2;43029:7;43038:5;42996:22;:48::i;:::-;42988:57;;;;;;42727:326;;;;:::o;33117:204::-;33217:8;17180:17;17188:8;17180:7;:17::i;:::-;17172:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17009:21;:33;17031:10;17009:33;;;;;;;;;;;;;;;;;;;;;;;;;17001:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33299:14;33266:20;:30;33287:8;33266:30;;;;;;;;;;;:47;;;;33117:204;;;:::o;16079:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36721:348::-;36824:13;36864:16;36872:7;36864;:16::i;:::-;36856:25;;;;;;36892:23;36918:8;36927:7;36918:17;;;;;;;;;;;;;;;;;;:28;;;36892:54;;36967:16;36986:25;36995:15;36986:8;:25::i;:::-;36967:44;;37029:32;37036:10;37029:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37048:2;37052:8;37029:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:32::i;:::-;37022:39;;;;36721:348;;;:::o;28381:852::-;28681:7;28625:11;17678:15;:28;17694:11;17678:28;;;;;;;;;;;;;;;;;;;;;17670:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17009:21;:33;17031:10;17009:33;;;;;;;;;;;;;;;;;;;;;;;;;17001:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28706:10;28728:14;28745:9;28728:26;;29043:1;28780:8;28808:222;;;;;;;;28831:11;28808:222;;;;28861:9;28808:222;;;;;;28889:9;28808:222;;;;;;28917:9;28808:222;;;;;;28945:9;28808:222;;;;;;28973:18;28808:222;;;;;;29010:5;28808:222;;;;;28780:261;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;28780:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:264;28775:269;;29146:17;29152:6;29160:2;29146:5;:17::i;:::-;29223:2;29216:9;;;;28381:852;;;;;;;;;:::o;14598:108::-;14663:42;14598:108;:::o;14742:95::-;14794:42;14742:95;:::o;25744:183::-;6339:9;:7;:9::i;:::-;6331:18;;;;;;25912:7;25881:21;:28;25903:5;25881:28;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;25744:183;;:::o;23602:433::-;23760:13;23791:20;23825:9;:16;23814:28;;;;;;;;;;;;;;;;;;;;;;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;23814:28:0;;;;23791:51;;23867:6;23876:1;23867:10;;23863:131;23883:9;:16;23879:1;:20;23863:131;;;23933:49;23961:9;23971:1;23961:12;;;;;;;;;;;;;;23975:6;23933:27;:49::i;:::-;23921:6;23928:1;23921:9;;;;;;;;;;;;;:61;;;;;23901:3;;;;;;;23863:131;;;;24021:6;24014:13;;;23602:433;;;;:::o;15857:54::-;;;;;;;;;;;;;;;;;:::o;40235:208::-;40370:4;40400:18;:25;40419:5;40400:25;;;;;;;;;;;;;;;:35;40426:8;40400:35;;;;;;;;;;;;;;;;;;;;;;;;;40393:42;;40235:208;;;;:::o;19308:408::-;19433:8;17180:17;17188:8;17180:7;:17::i;:::-;17172:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19488:1;19467:18;:22;;;19459:31;;;;;;19549:18;19509:58;;:8;19518;19509:18;;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;:58;;;19501:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19700:8;19647:18;:30;19666:10;19647:30;;;;;;;;;;;;;;;19678:18;19647:50;;;;;;;;;;:61;;;;19308:408;;;:::o;22227:701::-;22402:7;22375:8;17180:17;17188:8;17180:7;:17::i;:::-;17172:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22427:15;22445:1;22427:19;;22457:18;22478:8;22487;22478:18;;;;;;;;;;;;;;;;;;:29;;;22457:50;;22552:24;22579:23;22595:6;22579:15;:23::i;:::-;22552:50;;22627:6;22636:1;22627:10;;22623:263;22643:10;:17;22639:1;:21;22623:263;;;22795:8;22804:10;22815:1;22804:13;;;;;;;;;;;;;;22795:23;;;;;;;;;;;;;;;;;;:34;;;22781:10;:48;22778:97;;;22850:9;;;;;;;22778:97;22662:3;;;;;;;22623:263;;;;22913:7;22906:14;;;;;22227:701;;;;;:::o;7157:109::-;6339:9;:7;:9::i;:::-;6331:18;;;;;;7230:28;7249:8;7230:18;:28::i;:::-;7157:109;:::o;16835:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43249:206::-;43351:4;43374:13;43390:11;:20;43402:7;43390:20;;;;;;;;;;;;;;;;;;;;;43374:36;;43445:1;43428:19;;:5;:19;;;;43421:26;;;43249:206;;;:::o;30229:883::-;30469:4;30491:17;30511:8;30520;30511:18;;;;;;;;;;;;;;;;;;30491:38;;30562:9;30545:26;;:4;:13;;;;;;;;;;;;:26;;;30542:83;;30604:9;30588:4;:13;;;:25;;;;;;;;;;;;;;;;;;30542:83;30665:9;30648:26;;:4;:13;;;;;;;;;;;;:26;;;30645:83;;30707:9;30691:4;:13;;;:25;;;;;;;;;;;;;;;;;;30645:83;30768:9;30751:26;;:4;:13;;;;;;;;;;;;:26;;;30748:83;;30810:9;30794:4;:13;;;:25;;;;;;;;;;;;;;;;;;30748:83;30871:9;30854:26;;:4;:13;;;;;;;;;;;;:26;;;30851:83;;30913:9;30897:4;:13;;;:25;;;;;;;;;;;;;;;;;;30851:83;30983:18;30957:44;;:4;:22;;;;;;;;;;;;:44;;;30954:119;;31043:18;31018:4;:22;;;:43;;;;;;;;;;;;;;;;;;30954:119;31100:4;31093:11;;;30229:883;;;;;;;;:::o;19106:190::-;19258:4;19181:81;;14663:42;19181:37;;;19219:10;19239:4;19246:7;19181:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19181:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19181:73:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19181:73:0;;;;;;;;;;;;;;;;:81;;;19173:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19106:190;:::o;8452:181::-;8510:7;8530:9;8546:1;8542;:5;8530:17;;8571:1;8566;:6;;8558:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8624:1;8617:8;;;8452:181;;;;:::o;44601:312::-;44713:1;44699:16;;:2;:16;;;;44691:25;;;;;;44736:16;44744:7;44736;:16::i;:::-;44735:17;44727:26;;;;;;44789:2;44766:11;:20;44778:7;44766:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;44826:28;44852:1;44826:17;:21;44844:2;44826:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;44802:17;:21;44820:2;44802:21;;;;;;;;;;;;;;;:52;;;;44897:7;44893:2;44872:33;;44889:1;44872:33;;;;;;;;;;;;44601:312;;:::o;43827:523::-;43967:4;43990:13;44006:16;44014:7;44006;:16::i;:::-;43990:32;;44227:5;44216:16;;:7;:16;;;:65;;;;44274:7;44250:31;;:20;44262:7;44250:11;:20::i;:::-;:31;;;44216:65;:115;;;;44299:32;44316:5;44323:7;44299:16;:32::i;:::-;44216:115;44194:148;;;43827:523;;;;:::o;45296:466::-;45462:4;45442:24;;:16;45450:7;45442;:16::i;:::-;:24;;;45434:33;;;;;;45500:1;45486:16;;:2;:16;;;;45478:25;;;;;;45516:23;45531:7;45516:14;:23::i;:::-;45578:30;45606:1;45578:17;:23;45596:4;45578:23;;;;;;;;;;;;;;;;:27;;:30;;;;:::i;:::-;45552:17;:23;45570:4;45552:23;;;;;;;;;;;;;;;:56;;;;45643:28;45669:1;45643:17;:21;45661:2;45643:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;45619:17;:21;45637:2;45619:21;;;;;;;;;;;;;;;:52;;;;45707:2;45684:11;:20;45696:7;45684:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;45746:7;45742:2;45727:27;;45736:4;45727:27;;;;;;;;;;;;45296:466;;;:::o;34064:845::-;34172:4;34261;34233:8;34242;34233:18;;;;;;;;;;;;;;;;;;:25;;;:32;;;;;;;;;;;;;;;;;;34352:1;34320:11;:21;34332:8;34320:21;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;34437:31;34466:1;34437:17;:24;34455:5;34437:24;;;;;;;;;;;;;;;;:28;;:31;;;;:::i;:::-;34410:17;:24;34428:5;34410:24;;;;;;;;;;;;;;;:58;;;;34529:36;34568:20;:30;34589:8;34568:30;;;;;;;;;;;;34529:69;;34644:1;34613:28;:32;34609:182;;;14663:42;34662:33;;;34696:10;34708:28;34662:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34662:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34662:75:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34662:75:0;;;;;;;;;;;;;;;;;34752:18;:25;34771:5;34752:25;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;34609:182;34860:8;34856:1;34832:37;;34841:5;34832:37;;;;;;;;;;;;34897:4;34890:11;;;34064:845;;;;:::o;32211:522::-;32308:13;32349:1;32344;:6;32340:22;;;32352:10;;;;;;;;;;;;;;;;;;;;;32340:22;32383:9;32395:1;32383:13;;32407:14;32432:72;32444:1;32439;:6;32432:72;;32462:8;;;;;;;32490:2;32485:7;;;;;;;;;32432:72;;;32514:17;32544:6;32534:17;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;32534:17:0;;;;32514:37;;32562:9;32583:1;32574:6;:10;32562:22;;32595:101;32607:1;32602;:6;32595:101;;32657:2;32653:1;:6;;;;;;32648:2;:11;32637:24;;32625:4;32630:3;;;;;;;32625:9;;;;;;;;;;;:36;;;;;;;;;;;32682:2;32677:7;;;;;;;;;32595:101;;;32720:4;32706:19;;;;;;32211:522;;;;:::o;46296:489::-;46474:4;46502:15;:2;:13;;;:15::i;:::-;46497:60;;46541:4;46534:11;;;;46497:60;46569:13;46601:2;46585:36;;;46636:10;46662:4;46682:7;46705:5;46585:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;46585:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46585:136:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46585:136:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46585:136:0;;;;;;;;;;;;;;;;46569:152;;14535:10;46760:16;;46750:26;;;:6;:26;;;;46742:35;;;46296:489;;;;;;;:::o;32745:259::-;32900:13;32977:1;32980;32983;32960:25;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;32960:25:0;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;32960:25:0;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;32960:25:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;32960:25:0;;;32932:64;;32745:259;;;;;:::o;7416:187::-;7510:1;7490:22;;:8;:22;;;;7482:31;;;;;;7558:8;7529:38;;7550:6;;;;;;;;;;;7529:38;;;;;;;;;;;;7587:8;7578:6;;:17;;;;;;;;;;;;;;;;;;7416:187;:::o;46952:207::-;47084:1;47048:38;;:15;:24;47064:7;47048:24;;;;;;;;;;;;;;;;;;;;;:38;;;47044:108;;47138:1;47103:15;:24;47119:7;47103:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;47044:108;46952:207;:::o;8916:136::-;8974:7;9001:43;9005:1;9008;9001:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;8994:50;;8916:136;;;;:::o;13363:635::-;13423:4;13440:12;13955:7;13943:20;13935:28;;13989:1;13982:4;:8;13975:15;;;13363:635;;;:::o;9355:192::-;9441:7;9474:1;9469;:6;;9477:12;9461:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;9461:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9501:9;9517:1;9513;:5;9501:17;;9538:1;9531:8;;;9355:192;;;;;:::o;14007:33155::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;14007:33155:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://3d6f0cf075dd3e4b74e4524d3514f301990ef7f34c54193bd247324d93b04317
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.