ETH Price: $2,662.69 (+9.22%)
Gas: 4 Gwei

Contract

0x85B2949CEa65Add49C69DAC77fB052596bc5DDd4
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Balance...70263092019-01-07 15:08:452040 days ago1546873725IN
Fake_Phishing298043
0 ETH0.000064512
Explore55002182018-04-25 0:05:502298 days ago1524614750IN
Fake_Phishing298043
0.006 ETH0.000050642
Explore55000232018-04-24 23:13:172298 days ago1524611597IN
Fake_Phishing298043
0.006 ETH0.000050642
Explore54996582018-04-24 21:41:542298 days ago1524606114IN
Fake_Phishing298043
0.006 ETH0.000050642
Explore54996052018-04-24 21:31:332298 days ago1524605493IN
Fake_Phishing298043
0.006 ETH0.000050642
Explore54994272018-04-24 20:46:022298 days ago1524602762IN
Fake_Phishing298043
0.006 ETH0.000050642
Explore54993792018-04-24 20:35:542298 days ago1524602154IN
Fake_Phishing298043
0.006 ETH0.000050642
Explore54991732018-04-24 19:48:472298 days ago1524599327IN
Fake_Phishing298043
0.01 ETH0.000025251
Explore54969172018-04-24 10:26:132298 days ago1524565573IN
Fake_Phishing298043
0.01 ETH0.000050642
Explore54969152018-04-24 10:25:462298 days ago1524565546IN
Fake_Phishing298043
0.01 ETH0.000050512
Explore54968902018-04-24 10:18:442298 days ago1524565124IN
Fake_Phishing298043
0.01 ETH0.000050642
Explore54956492018-04-24 4:54:562299 days ago1524545696IN
Fake_Phishing298043
0.01 ETH0.000025511.01
Exploration Resu...54950582018-04-24 2:24:592299 days ago1524536699IN
Fake_Phishing298043
0 ETH0.002874783
Exploration Resu...54950512018-04-24 2:23:312299 days ago1524536611IN
Fake_Phishing298043
0 ETH0.004566183
Pause54950372018-04-24 2:18:132299 days ago1524536293IN
Fake_Phishing298043
0 ETH0.0002819710
Exploration Resu...54949202018-04-24 1:51:492299 days ago1524534709IN
Fake_Phishing298043
0 ETH0.005379713.5
Explore54949082018-04-24 1:48:452299 days ago1524534525IN
Fake_Phishing298043
0.01 ETH0.000301312
Exploration Resu...54949052018-04-24 1:47:542299 days ago1524534474IN
Fake_Phishing298043
0 ETH0.004565993
Set Oracle Fee54948862018-04-24 1:43:182299 days ago1524534198IN
Fake_Phishing298043
0 ETH0.0002827210
Set Oracle Fee54948762018-04-24 1:41:222299 days ago1524534082IN
Fake_Phishing298043
0 ETH0.0002827210
Set Oracle Fee54948762018-04-24 1:41:222299 days ago1524534082IN
Fake_Phishing298043
0 ETH0.000112834
Exploration Resu...54948662018-04-24 1:39:152299 days ago1524533955IN
Fake_Phishing298043
0 ETH0.003500742.3
Explore54948612018-04-24 1:38:272299 days ago1524533907IN
Fake_Phishing298043
0.01 ETH0.000406773
Exploration Resu...54948582018-04-24 1:35:572299 days ago1524533757IN
Fake_Phishing298043
0 ETH0.003500882.3
Explore54948502018-04-24 1:33:042299 days ago1524533584IN
Fake_Phishing298043
0.006 ETH0.000451973
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
70263092019-01-07 15:08:452040 days ago1546873725
Fake_Phishing298043
0.4794 ETH
54949082018-04-24 1:48:452299 days ago1524534525
Fake_Phishing298043
0.00405 ETH
54949082018-04-24 1:48:452299 days ago1524534525
Fake_Phishing298043
0.00495 ETH
54948612018-04-24 1:38:272299 days ago1524533907
Fake_Phishing298043
0.0058 ETH
54948612018-04-24 1:38:272299 days ago1524533907
Fake_Phishing298043
0.0032 ETH
54948502018-04-24 1:33:042299 days ago1524533584
Fake_Phishing298043
0.0035 ETH
54948502018-04-24 1:33:042299 days ago1524533584
Fake_Phishing298043
0.0019 ETH
54947962018-04-24 1:20:302299 days ago1524532830
Fake_Phishing298043
0.0035 ETH
54947962018-04-24 1:20:302299 days ago1524532830
Fake_Phishing298043
0.0019 ETH
54947702018-04-24 1:12:232299 days ago1524532343
Fake_Phishing298043
0.0058 ETH
54947702018-04-24 1:12:232299 days ago1524532343
Fake_Phishing298043
0.0032 ETH
54946072018-04-24 0:29:592299 days ago1524529799
Fake_Phishing298043
0.0035 ETH
54946072018-04-24 0:29:592299 days ago1524529799
Fake_Phishing298043
0.0019 ETH
54946012018-04-24 0:28:152299 days ago1524529695
Fake_Phishing298043
0.0058 ETH
54946012018-04-24 0:28:152299 days ago1524529695
Fake_Phishing298043
0.0032 ETH
54945922018-04-24 0:24:302299 days ago1524529470
Fake_Phishing298043
0.0058 ETH
54945922018-04-24 0:24:302299 days ago1524529470
Fake_Phishing298043
0.0032 ETH
54945872018-04-24 0:23:372299 days ago1524529417
Fake_Phishing298043
0.0058 ETH
54945872018-04-24 0:23:372299 days ago1524529417
Fake_Phishing298043
0.0032 ETH
54945732018-04-24 0:20:382299 days ago1524529238
Fake_Phishing298043
0.0058 ETH
54945732018-04-24 0:20:382299 days ago1524529238
Fake_Phishing298043
0.0032 ETH
54939772018-04-23 21:57:172299 days ago1524520637
Fake_Phishing298043
0.0035 ETH
54939772018-04-23 21:57:172299 days ago1524520637
Fake_Phishing298043
0.0019 ETH
54938452018-04-23 21:24:242299 days ago1524518664
Fake_Phishing298043
0.0058 ETH
54938452018-04-23 21:24:242299 days ago1524518664
Fake_Phishing298043
0.0032 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EthernautsExplore

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-04-10
*/

pragma solidity ^0.4.19;

/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens
/// @author Ethernauts
contract ERC721 {
    // Required methods
    function totalSupply() public view returns (uint256 total);
    function balanceOf(address _owner) public view returns (uint256 balance);
    function ownerOf(uint256 _tokenId) external view returns (address owner);
    function approve(address _to, uint256 _tokenId) external;
    function transfer(address _to, uint256 _tokenId) external;
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
    function takeOwnership(uint256 _tokenId) public;
    function implementsERC721() public pure returns (bool);

    // Events
    event Transfer(address from, address to, uint256 tokenId);
    event Approval(address owner, address approved, uint256 tokenId);

    // Optional
    // function name() public view returns (string name);
    // function symbol() public view returns (string symbol);
    // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);
    // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);

    // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)
    function supportsInterface(bytes4 _interfaceID) external view returns (bool);
}




// Extend this library for child contracts
library SafeMath {

    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

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

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

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

    /**
    * @dev Compara two numbers, and return the bigger one.
    */
    function max(int256 a, int256 b) internal pure returns (int256) {
        if (a > b) {
            return a;
        } else {
            return b;
        }
    }

    /**
    * @dev Compara two numbers, and return the bigger one.
    */
    function min(int256 a, int256 b) internal pure returns (int256) {
        if (a < b) {
            return a;
        } else {
            return b;
        }
    }


}




/// @dev Base contract for all Ethernauts contracts holding global constants and functions.
contract EthernautsBase {

    /*** CONSTANTS USED ACROSS CONTRACTS ***/

    /// @dev Used by all contracts that interfaces with Ethernauts
    ///      The ERC-165 interface signature for ERC-721.
    ///  Ref: https://github.com/ethereum/EIPs/issues/165
    ///  Ref: https://github.com/ethereum/EIPs/issues/721
    bytes4 constant InterfaceSignature_ERC721 =
    bytes4(keccak256('name()')) ^
    bytes4(keccak256('symbol()')) ^
    bytes4(keccak256('totalSupply()')) ^
    bytes4(keccak256('balanceOf(address)')) ^
    bytes4(keccak256('ownerOf(uint256)')) ^
    bytes4(keccak256('approve(address,uint256)')) ^
    bytes4(keccak256('transfer(address,uint256)')) ^
    bytes4(keccak256('transferFrom(address,address,uint256)')) ^
    bytes4(keccak256('takeOwnership(uint256)')) ^
    bytes4(keccak256('tokensOfOwner(address)')) ^
    bytes4(keccak256('tokenMetadata(uint256,string)'));

    /// @dev due solidity limitation we cannot return dynamic array from methods
    /// so it creates incompability between functions across different contracts
    uint8 public constant STATS_SIZE = 10;
    uint8 public constant SHIP_SLOTS = 5;

    // Possible state of any asset
    enum AssetState { Available, UpForLease, Used }

    // Possible state of any asset
    // NotValid is to avoid 0 in places where category must be bigger than zero
    enum AssetCategory { NotValid, Sector, Manufacturer, Ship, Object, Factory, CrewMember }

    /// @dev Sector stats
    enum ShipStats {Level, Attack, Defense, Speed, Range, Luck}
    /// @notice Possible attributes for each asset
    /// 00000001 - Seeded - Offered to the economy by us, the developers. Potentially at regular intervals.
    /// 00000010 - Producible - Product of a factory and/or factory contract.
    /// 00000100 - Explorable- Product of exploration.
    /// 00001000 - Leasable - Can be rented to other users and will return to the original owner once the action is complete.
    /// 00010000 - Permanent - Cannot be removed, always owned by a user.
    /// 00100000 - Consumable - Destroyed after N exploration expeditions.
    /// 01000000 - Tradable - Buyable and sellable on the market.
    /// 10000000 - Hot Potato - Automatically gets put up for sale after acquiring.
    bytes2 public ATTR_SEEDED     = bytes2(2**0);
    bytes2 public ATTR_PRODUCIBLE = bytes2(2**1);
    bytes2 public ATTR_EXPLORABLE = bytes2(2**2);
    bytes2 public ATTR_LEASABLE   = bytes2(2**3);
    bytes2 public ATTR_PERMANENT  = bytes2(2**4);
    bytes2 public ATTR_CONSUMABLE = bytes2(2**5);
    bytes2 public ATTR_TRADABLE   = bytes2(2**6);
    bytes2 public ATTR_GOLDENGOOSE = bytes2(2**7);
}

/// @notice This contract manages the various addresses and constraints for operations
//          that can be executed only by specific roles. Namely CEO and CTO. it also includes pausable pattern.
contract EthernautsAccessControl is EthernautsBase {

    // This facet controls access control for Ethernauts.
    // All roles have same responsibilities and rights, but there is slight differences between them:
    //
    //     - The CEO: The CEO can reassign other roles and only role that can unpause the smart contract.
    //       It is initially set to the address that created the smart contract.
    //
    //     - The CTO: The CTO can change contract address, oracle address and plan for upgrades.
    //
    //     - The COO: The COO can change contract address and add create assets.
    //
    /// @dev Emited when contract is upgraded - See README.md for updgrade plan
    /// @param newContract address pointing to new contract
    event ContractUpgrade(address newContract);

    // The addresses of the accounts (or contracts) that can execute actions within each roles.
    address public ceoAddress;
    address public ctoAddress;
    address public cooAddress;
    address public oracleAddress;

    // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked
    bool public paused = false;

    /// @dev Access modifier for CEO-only functionality
    modifier onlyCEO() {
        require(msg.sender == ceoAddress);
        _;
    }

    /// @dev Access modifier for CTO-only functionality
    modifier onlyCTO() {
        require(msg.sender == ctoAddress);
        _;
    }

    /// @dev Access modifier for CTO-only functionality
    modifier onlyOracle() {
        require(msg.sender == oracleAddress);
        _;
    }

    modifier onlyCLevel() {
        require(
            msg.sender == ceoAddress ||
            msg.sender == ctoAddress ||
            msg.sender == cooAddress
        );
        _;
    }

    /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.
    /// @param _newCEO The address of the new CEO
    function setCEO(address _newCEO) external onlyCEO {
        require(_newCEO != address(0));

        ceoAddress = _newCEO;
    }

    /// @dev Assigns a new address to act as the CTO. Only available to the current CTO or CEO.
    /// @param _newCTO The address of the new CTO
    function setCTO(address _newCTO) external {
        require(
            msg.sender == ceoAddress ||
            msg.sender == ctoAddress
        );
        require(_newCTO != address(0));

        ctoAddress = _newCTO;
    }

    /// @dev Assigns a new address to act as the COO. Only available to the current COO or CEO.
    /// @param _newCOO The address of the new COO
    function setCOO(address _newCOO) external {
        require(
            msg.sender == ceoAddress ||
            msg.sender == cooAddress
        );
        require(_newCOO != address(0));

        cooAddress = _newCOO;
    }

    /// @dev Assigns a new address to act as oracle.
    /// @param _newOracle The address of oracle
    function setOracle(address _newOracle) external {
        require(msg.sender == ctoAddress);
        require(_newOracle != address(0));

        oracleAddress = _newOracle;
    }

    /*** Pausable functionality adapted from OpenZeppelin ***/

    /// @dev Modifier to allow actions only when the contract IS NOT paused
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /// @dev Modifier to allow actions only when the contract IS paused
    modifier whenPaused {
        require(paused);
        _;
    }

    /// @dev Called by any "C-level" role to pause the contract. Used only when
    ///  a bug or exploit is detected and we need to limit damage.
    function pause() external onlyCLevel whenNotPaused {
        paused = true;
    }

    /// @dev Unpauses the smart contract. Can only be called by the CEO, since
    ///  one reason we may pause the contract is when CTO account is compromised.
    /// @notice This is public rather than external so it can be called by
    ///  derived contracts.
    function unpause() public onlyCEO whenPaused {
        // can't unpause if contract was upgraded
        paused = false;
    }

}









/// @title Storage contract for Ethernauts Data. Common structs and constants.
/// @notice This is our main data storage, constants and data types, plus
//          internal functions for managing the assets. It is isolated and only interface with
//          a list of granted contracts defined by CTO
/// @author Ethernauts - Fernando Pauer
contract EthernautsStorage is EthernautsAccessControl {

    function EthernautsStorage() public {
        // the creator of the contract is the initial CEO
        ceoAddress = msg.sender;

        // the creator of the contract is the initial CTO as well
        ctoAddress = msg.sender;

        // the creator of the contract is the initial CTO as well
        cooAddress = msg.sender;

        // the creator of the contract is the initial Oracle as well
        oracleAddress = msg.sender;
    }

    /// @notice No tipping!
    /// @dev Reject all Ether from being sent here. Hopefully, we can prevent user accidents.
    function() external payable {
        require(msg.sender == address(this));
    }

    /*** Mapping for Contracts with granted permission ***/
    mapping (address => bool) public contractsGrantedAccess;

    /// @dev grant access for a contract to interact with this contract.
    /// @param _v2Address The contract address to grant access
    function grantAccess(address _v2Address) public onlyCTO {
        // See README.md for updgrade plan
        contractsGrantedAccess[_v2Address] = true;
    }

    /// @dev remove access from a contract to interact with this contract.
    /// @param _v2Address The contract address to be removed
    function removeAccess(address _v2Address) public onlyCTO {
        // See README.md for updgrade plan
        delete contractsGrantedAccess[_v2Address];
    }

    /// @dev Only allow permitted contracts to interact with this contract
    modifier onlyGrantedContracts() {
        require(contractsGrantedAccess[msg.sender] == true);
        _;
    }

    modifier validAsset(uint256 _tokenId) {
        require(assets[_tokenId].ID > 0);
        _;
    }
    /*** DATA TYPES ***/

    /// @dev The main Ethernauts asset struct. Every asset in Ethernauts is represented by a copy
    ///  of this structure. Note that the order of the members in this structure
    ///  is important because of the byte-packing rules used by Ethereum.
    ///  Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html
    struct Asset {

        // Asset ID is a identifier for look and feel in frontend
        uint16 ID;

        // Category = Sectors, Manufacturers, Ships, Objects (Upgrades/Misc), Factories and CrewMembers
        uint8 category;

        // The State of an asset: Available, On sale, Up for lease, Cooldown, Exploring
        uint8 state;

        // Attributes
        // byte pos - Definition
        // 00000001 - Seeded - Offered to the economy by us, the developers. Potentially at regular intervals.
        // 00000010 - Producible - Product of a factory and/or factory contract.
        // 00000100 - Explorable- Product of exploration.
        // 00001000 - Leasable - Can be rented to other users and will return to the original owner once the action is complete.
        // 00010000 - Permanent - Cannot be removed, always owned by a user.
        // 00100000 - Consumable - Destroyed after N exploration expeditions.
        // 01000000 - Tradable - Buyable and sellable on the market.
        // 10000000 - Hot Potato - Automatically gets put up for sale after acquiring.
        bytes2 attributes;

        // The timestamp from the block when this asset was created.
        uint64 createdAt;

        // The minimum timestamp after which this asset can engage in exploring activities again.
        uint64 cooldownEndBlock;

        // The Asset's stats can be upgraded or changed based on exploration conditions.
        // It will be defined per child contract, but all stats have a range from 0 to 255
        // Examples
        // 0 = Ship Level
        // 1 = Ship Attack
        uint8[STATS_SIZE] stats;

        // Set to the cooldown time that represents exploration duration for this asset.
        // Defined by a successful exploration action, regardless of whether this asset is acting as ship or a part.
        uint256 cooldown;

        // a reference to a super asset that manufactured the asset
        uint256 builtBy;
    }

    /*** CONSTANTS ***/

    // @dev Sanity check that allows us to ensure that we are pointing to the
    //  right storage contract in our EthernautsLogic(address _CStorageAddress) call.
    bool public isEthernautsStorage = true;

    /*** STORAGE ***/

    /// @dev An array containing the Asset struct for all assets in existence. The Asset UniqueId
    ///  of each asset is actually an index into this array.
    Asset[] public assets;

    /// @dev A mapping from Asset UniqueIDs to the price of the token.
    /// stored outside Asset Struct to save gas, because price can change frequently
    mapping (uint256 => uint256) internal assetIndexToPrice;

    /// @dev A mapping from asset UniqueIDs to the address that owns them. All assets have some valid owner address.
    mapping (uint256 => address) internal assetIndexToOwner;

    // @dev A mapping from owner address to count of tokens that address owns.
    //  Used internally inside balanceOf() to resolve ownership count.
    mapping (address => uint256) internal ownershipTokenCount;

    /// @dev A mapping from AssetUniqueIDs to an address that has been approved to call
    ///  transferFrom(). Each Asset can only have one approved address for transfer
    ///  at any time. A zero value means no approval is outstanding.
    mapping (uint256 => address) internal assetIndexToApproved;


    /*** SETTERS ***/

    /// @dev set new asset price
    /// @param _tokenId  asset UniqueId
    /// @param _price    asset price
    function setPrice(uint256 _tokenId, uint256 _price) public onlyGrantedContracts {
        assetIndexToPrice[_tokenId] = _price;
    }

    /// @dev Mark transfer as approved
    /// @param _tokenId  asset UniqueId
    /// @param _approved address approved
    function approve(uint256 _tokenId, address _approved) public onlyGrantedContracts {
        assetIndexToApproved[_tokenId] = _approved;
    }

    /// @dev Assigns ownership of a specific Asset to an address.
    /// @param _from    current owner address
    /// @param _to      new owner address
    /// @param _tokenId asset UniqueId
    function transfer(address _from, address _to, uint256 _tokenId) public onlyGrantedContracts {
        // Since the number of assets is capped to 2^32 we can't overflow this
        ownershipTokenCount[_to]++;
        // transfer ownership
        assetIndexToOwner[_tokenId] = _to;
        // When creating new assets _from is 0x0, but we can't account that address.
        if (_from != address(0)) {
            ownershipTokenCount[_from]--;
            // clear any previously approved ownership exchange
            delete assetIndexToApproved[_tokenId];
        }
    }

    /// @dev A public method that creates a new asset and stores it. This
    ///  method does basic checking and should only be called from other contract when the
    ///  input data is known to be valid. Will NOT generate any event it is delegate to business logic contracts.
    /// @param _creatorTokenID The asset who is father of this asset
    /// @param _owner First owner of this asset
    /// @param _price asset price
    /// @param _ID asset ID
    /// @param _category see Asset Struct description
    /// @param _state see Asset Struct description
    /// @param _attributes see Asset Struct description
    /// @param _stats see Asset Struct description
    function createAsset(
        uint256 _creatorTokenID,
        address _owner,
        uint256 _price,
        uint16 _ID,
        uint8 _category,
        uint8 _state,
        uint8 _attributes,
        uint8[STATS_SIZE] _stats,
        uint256 _cooldown,
        uint64 _cooldownEndBlock
    )
    public onlyGrantedContracts
    returns (uint256)
    {
        // Ensure our data structures are always valid.
        require(_ID > 0);
        require(_category > 0);
        require(_attributes != 0x0);
        require(_stats.length > 0);

        Asset memory asset = Asset({
            ID: _ID,
            category: _category,
            builtBy: _creatorTokenID,
            attributes: bytes2(_attributes),
            stats: _stats,
            state: _state,
            createdAt: uint64(now),
            cooldownEndBlock: _cooldownEndBlock,
            cooldown: _cooldown
            });

        uint256 newAssetUniqueId = assets.push(asset) - 1;

        // Check it reached 4 billion assets but let's just be 100% sure.
        require(newAssetUniqueId == uint256(uint32(newAssetUniqueId)));

        // store price
        assetIndexToPrice[newAssetUniqueId] = _price;

        // This will assign ownership
        transfer(address(0), _owner, newAssetUniqueId);

        return newAssetUniqueId;
    }

    /// @dev A public method that edit asset in case of any mistake is done during process of creation by the developer. This
    /// This method doesn't do any checking and should only be called when the
    ///  input data is known to be valid.
    /// @param _tokenId The token ID
    /// @param _creatorTokenID The asset that create that token
    /// @param _price asset price
    /// @param _ID asset ID
    /// @param _category see Asset Struct description
    /// @param _state see Asset Struct description
    /// @param _attributes see Asset Struct description
    /// @param _stats see Asset Struct description
    /// @param _cooldown asset cooldown index
    function editAsset(
        uint256 _tokenId,
        uint256 _creatorTokenID,
        uint256 _price,
        uint16 _ID,
        uint8 _category,
        uint8 _state,
        uint8 _attributes,
        uint8[STATS_SIZE] _stats,
        uint16 _cooldown
    )
    external validAsset(_tokenId) onlyCLevel
    returns (uint256)
    {
        // Ensure our data structures are always valid.
        require(_ID > 0);
        require(_category > 0);
        require(_attributes != 0x0);
        require(_stats.length > 0);

        // store price
        assetIndexToPrice[_tokenId] = _price;

        Asset storage asset = assets[_tokenId];
        asset.ID = _ID;
        asset.category = _category;
        asset.builtBy = _creatorTokenID;
        asset.attributes = bytes2(_attributes);
        asset.stats = _stats;
        asset.state = _state;
        asset.cooldown = _cooldown;
    }

    /// @dev Update only stats
    /// @param _tokenId asset UniqueId
    /// @param _stats asset state, see Asset Struct description
    function updateStats(uint256 _tokenId, uint8[STATS_SIZE] _stats) public validAsset(_tokenId) onlyGrantedContracts {
        assets[_tokenId].stats = _stats;
    }

    /// @dev Update only asset state
    /// @param _tokenId asset UniqueId
    /// @param _state asset state, see Asset Struct description
    function updateState(uint256 _tokenId, uint8 _state) public validAsset(_tokenId) onlyGrantedContracts {
        assets[_tokenId].state = _state;
    }

    /// @dev Update Cooldown for a single asset
    /// @param _tokenId asset UniqueId
    /// @param _cooldown asset state, see Asset Struct description
    function setAssetCooldown(uint256 _tokenId, uint256 _cooldown, uint64 _cooldownEndBlock)
    public validAsset(_tokenId) onlyGrantedContracts {
        assets[_tokenId].cooldown = _cooldown;
        assets[_tokenId].cooldownEndBlock = _cooldownEndBlock;
    }

    /*** GETTERS ***/

    /// @notice Returns only stats data about a specific asset.
    /// @dev it is necessary due solidity compiler limitations
    ///      when we have large qty of parameters it throws StackTooDeepException
    /// @param _tokenId The UniqueId of the asset of interest.
    function getStats(uint256 _tokenId) public view returns (uint8[STATS_SIZE]) {
        return assets[_tokenId].stats;
    }

    /// @dev return current price of an asset
    /// @param _tokenId asset UniqueId
    function priceOf(uint256 _tokenId) public view returns (uint256 price) {
        return assetIndexToPrice[_tokenId];
    }

    /// @notice Check if asset has all attributes passed by parameter
    /// @param _tokenId The UniqueId of the asset of interest.
    /// @param _attributes see Asset Struct description
    function hasAllAttrs(uint256 _tokenId, bytes2 _attributes) public view returns (bool) {
        return assets[_tokenId].attributes & _attributes == _attributes;
    }

    /// @notice Check if asset has any attribute passed by parameter
    /// @param _tokenId The UniqueId of the asset of interest.
    /// @param _attributes see Asset Struct description
    function hasAnyAttrs(uint256 _tokenId, bytes2 _attributes) public view returns (bool) {
        return assets[_tokenId].attributes & _attributes != 0x0;
    }

    /// @notice Check if asset is in the state passed by parameter
    /// @param _tokenId The UniqueId of the asset of interest.
    /// @param _category see AssetCategory in EthernautsBase for possible states
    function isCategory(uint256 _tokenId, uint8 _category) public view returns (bool) {
        return assets[_tokenId].category == _category;
    }

    /// @notice Check if asset is in the state passed by parameter
    /// @param _tokenId The UniqueId of the asset of interest.
    /// @param _state see enum AssetState in EthernautsBase for possible states
    function isState(uint256 _tokenId, uint8 _state) public view returns (bool) {
        return assets[_tokenId].state == _state;
    }

    /// @notice Returns owner of a given Asset(Token).
    /// @dev Required for ERC-721 compliance.
    /// @param _tokenId asset UniqueId
    function ownerOf(uint256 _tokenId) public view returns (address owner)
    {
        return assetIndexToOwner[_tokenId];
    }

    /// @dev Required for ERC-721 compliance
    /// @notice Returns the number of Assets owned by a specific address.
    /// @param _owner The owner address to check.
    function balanceOf(address _owner) public view returns (uint256 count) {
        return ownershipTokenCount[_owner];
    }

    /// @dev Checks if a given address currently has transferApproval for a particular Asset.
    /// @param _tokenId asset UniqueId
    function approvedFor(uint256 _tokenId) public view onlyGrantedContracts returns (address) {
        return assetIndexToApproved[_tokenId];
    }

    /// @notice Returns the total number of Assets currently in existence.
    /// @dev Required for ERC-721 compliance.
    function totalSupply() public view returns (uint256) {
        return assets.length;
    }

    /// @notice List all existing tokens. It can be filtered by attributes or assets with owner
    /// @param _owner filter all assets by owner
    function getTokenList(address _owner, uint8 _withAttributes, uint256 start, uint256 count) external view returns(
        uint256[6][]
    ) {
        uint256 totalAssets = assets.length;

        if (totalAssets == 0) {
            // Return an empty array
            return new uint256[6][](0);
        } else {
            uint256[6][] memory result = new uint256[6][](totalAssets > count ? count : totalAssets);
            uint256 resultIndex = 0;
            bytes2 hasAttributes  = bytes2(_withAttributes);
            Asset memory asset;

            for (uint256 tokenId = start; tokenId < totalAssets && resultIndex < count; tokenId++) {
                asset = assets[tokenId];
                if (
                    (asset.state != uint8(AssetState.Used)) &&
                    (assetIndexToOwner[tokenId] == _owner || _owner == address(0)) &&
                    (asset.attributes & hasAttributes == hasAttributes)
                ) {
                    result[resultIndex][0] = tokenId;
                    result[resultIndex][1] = asset.ID;
                    result[resultIndex][2] = asset.category;
                    result[resultIndex][3] = uint256(asset.attributes);
                    result[resultIndex][4] = asset.cooldown;
                    result[resultIndex][5] = assetIndexToPrice[tokenId];
                    resultIndex++;
                }
            }

            return result;
        }
    }
}

/// @title The facet of the Ethernauts contract that manages ownership, ERC-721 compliant.
/// @notice This provides the methods required for basic non-fungible token
//          transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).
//          It interfaces with EthernautsStorage provinding basic functions as create and list, also holds
//          reference to logic contracts as Auction, Explore and so on
/// @author Ethernatus - Fernando Pauer
/// @dev Ref: https://github.com/ethereum/EIPs/issues/721
contract EthernautsOwnership is EthernautsAccessControl, ERC721 {

    /// @dev Contract holding only data.
    EthernautsStorage public ethernautsStorage;

    /*** CONSTANTS ***/
    /// @notice Name and symbol of the non fungible token, as defined in ERC721.
    string public constant name = "Ethernauts";
    string public constant symbol = "ETNT";

    /********* ERC 721 - COMPLIANCE CONSTANTS AND FUNCTIONS ***************/
    /**********************************************************************/

    bytes4 constant InterfaceSignature_ERC165 = bytes4(keccak256('supportsInterface(bytes4)'));

    /*** EVENTS ***/

    // Events as per ERC-721
    event Transfer(address indexed from, address indexed to, uint256 tokens);
    event Approval(address indexed owner, address indexed approved, uint256 tokens);

    /// @dev When a new asset is create it emits build event
    /// @param owner The address of asset owner
    /// @param tokenId Asset UniqueID
    /// @param assetId ID that defines asset look and feel
    /// @param price asset price
    event Build(address owner, uint256 tokenId, uint16 assetId, uint256 price);

    function implementsERC721() public pure returns (bool) {
        return true;
    }

    /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).
    ///  Returns true for any standardized interfaces implemented by this contract. ERC-165 and ERC-721.
    /// @param _interfaceID interface signature ID
    function supportsInterface(bytes4 _interfaceID) external view returns (bool)
    {
        return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));
    }

    /// @dev Checks if a given address is the current owner of a particular Asset.
    /// @param _claimant the address we are validating against.
    /// @param _tokenId asset UniqueId, only valid when > 0
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return ethernautsStorage.ownerOf(_tokenId) == _claimant;
    }

    /// @dev Checks if a given address currently has transferApproval for a particular Asset.
    /// @param _claimant the address we are confirming asset is approved for.
    /// @param _tokenId asset UniqueId, only valid when > 0
    function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return ethernautsStorage.approvedFor(_tokenId) == _claimant;
    }

    /// @dev Marks an address as being approved for transferFrom(), overwriting any previous
    ///  approval. Setting _approved to address(0) clears all transfer approval.
    ///  NOTE: _approve() does NOT send the Approval event. This is intentional because
    ///  _approve() and transferFrom() are used together for putting Assets on auction, and
    ///  there is no value in spamming the log with Approval events in that case.
    function _approve(uint256 _tokenId, address _approved) internal {
        ethernautsStorage.approve(_tokenId, _approved);
    }

    /// @notice Returns the number of Assets owned by a specific address.
    /// @param _owner The owner address to check.
    /// @dev Required for ERC-721 compliance
    function balanceOf(address _owner) public view returns (uint256 count) {
        return ethernautsStorage.balanceOf(_owner);
    }

    /// @dev Required for ERC-721 compliance.
    /// @notice Transfers a Asset to another address. If transferring to a smart
    ///  contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or
    ///  Ethernauts specifically) or your Asset may be lost forever. Seriously.
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _tokenId The ID of the Asset to transfer.
    function transfer(
        address _to,
        uint256 _tokenId
    )
    external
    whenNotPaused
    {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        // Disallow transfers to this contract to prevent accidental misuse.
        // The contract should never own any assets
        // (except very briefly after it is created and before it goes on auction).
        require(_to != address(this));
        // Disallow transfers to the storage contract to prevent accidental
        // misuse. Auction or Upgrade contracts should only take ownership of assets
        // through the allow + transferFrom flow.
        require(_to != address(ethernautsStorage));

        // You can only send your own asset.
        require(_owns(msg.sender, _tokenId));

        // Reassign ownership, clear pending approvals, emit Transfer event.
        ethernautsStorage.transfer(msg.sender, _to, _tokenId);
    }

    /// @dev Required for ERC-721 compliance.
    /// @notice Grant another address the right to transfer a specific Asset via
    ///  transferFrom(). This is the preferred flow for transfering NFTs to contracts.
    /// @param _to The address to be granted transfer approval. Pass address(0) to
    ///  clear all approvals.
    /// @param _tokenId The ID of the Asset that can be transferred if this call succeeds.
    function approve(
        address _to,
        uint256 _tokenId
    )
    external
    whenNotPaused
    {
        // Only an owner can grant transfer approval.
        require(_owns(msg.sender, _tokenId));

        // Register the approval (replacing any previous approval).
        _approve(_tokenId, _to);

        // Emit approval event.
        Approval(msg.sender, _to, _tokenId);
    }


    /// @notice Transfer a Asset owned by another address, for which the calling address
    ///  has previously been granted transfer approval by the owner.
    /// @param _from The address that owns the Asset to be transferred.
    /// @param _to The address that should take ownership of the Asset. Can be any address,
    ///  including the caller.
    /// @param _tokenId The ID of the Asset to be transferred.
    function _transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    )
    internal
    {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        // Disallow transfers to this contract to prevent accidental misuse.
        // The contract should never own any assets (except for used assets).
        require(_owns(_from, _tokenId));
        // Check for approval and valid ownership
        require(_approvedFor(_to, _tokenId));

        // Reassign ownership (also clears pending approvals and emits Transfer event).
        ethernautsStorage.transfer(_from, _to, _tokenId);
    }

    /// @dev Required for ERC-721 compliance.
    /// @notice Transfer a Asset owned by another address, for which the calling address
    ///  has previously been granted transfer approval by the owner.
    /// @param _from The address that owns the Asset to be transfered.
    /// @param _to The address that should take ownership of the Asset. Can be any address,
    ///  including the caller.
    /// @param _tokenId The ID of the Asset to be transferred.
    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    )
    external
    whenNotPaused
    {
        _transferFrom(_from, _to, _tokenId);
    }

    /// @dev Required for ERC-721 compliance.
    /// @notice Allow pre-approved user to take ownership of a token
    /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
    function takeOwnership(uint256 _tokenId) public {
        address _from = ethernautsStorage.ownerOf(_tokenId);

        // Safety check to prevent against an unexpected 0x0 default.
        require(_from != address(0));
        _transferFrom(_from, msg.sender, _tokenId);
    }

    /// @notice Returns the total number of Assets currently in existence.
    /// @dev Required for ERC-721 compliance.
    function totalSupply() public view returns (uint256) {
        return ethernautsStorage.totalSupply();
    }

    /// @notice Returns owner of a given Asset(Token).
    /// @param _tokenId Token ID to get owner.
    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _tokenId)
    external
    view
    returns (address owner)
    {
        owner = ethernautsStorage.ownerOf(_tokenId);

        require(owner != address(0));
    }

    /// @dev Creates a new Asset with the given fields. ONly available for C Levels
    /// @param _creatorTokenID The asset who is father of this asset
    /// @param _price asset price
    /// @param _assetID asset ID
    /// @param _category see Asset Struct description
    /// @param _attributes see Asset Struct description
    /// @param _stats see Asset Struct description
    function createNewAsset(
        uint256 _creatorTokenID,
        address _owner,
        uint256 _price,
        uint16 _assetID,
        uint8 _category,
        uint8 _attributes,
        uint8[STATS_SIZE] _stats
    )
    external onlyCLevel
    returns (uint256)
    {
        // owner must be sender
        require(_owner != address(0));

        uint256 tokenID = ethernautsStorage.createAsset(
            _creatorTokenID,
            _owner,
            _price,
            _assetID,
            _category,
            uint8(AssetState.Available),
            _attributes,
            _stats,
            0,
            0
        );

        // emit the build event
        Build(
            _owner,
            tokenID,
            _assetID,
            _price
        );

        return tokenID;
    }

    /// @notice verify if token is in exploration time
    /// @param _tokenId The Token ID that can be upgraded
    function isExploring(uint256 _tokenId) public view returns (bool) {
        uint256 cooldown;
        uint64 cooldownEndBlock;
        (,,,,,cooldownEndBlock, cooldown,) = ethernautsStorage.assets(_tokenId);
        return (cooldown > now) || (cooldownEndBlock > uint64(block.number));
    }
}


/// @title The facet of the Ethernauts Logic contract handle all common code for logic/business contracts
/// @author Ethernatus - Fernando Pauer
contract EthernautsLogic is EthernautsOwnership {

    // Set in case the logic contract is broken and an upgrade is required
    address public newContractAddress;

    /// @dev Constructor
    function EthernautsLogic() public {
        // the creator of the contract is the initial CEO, COO, CTO
        ceoAddress = msg.sender;
        ctoAddress = msg.sender;
        cooAddress = msg.sender;
        oracleAddress = msg.sender;

        // Starts paused.
        paused = true;
    }

    /// @dev Used to mark the smart contract as upgraded, in case there is a serious
    ///  breaking bug. This method does nothing but keep track of the new contract and
    ///  emit a message indicating that the new address is set. It's up to clients of this
    ///  contract to update to the new contract address in that case. (This contract will
    ///  be paused indefinitely if such an upgrade takes place.)
    /// @param _v2Address new address
    function setNewAddress(address _v2Address) external onlyCTO whenPaused {
        // See README.md for updgrade plan
        newContractAddress = _v2Address;
        ContractUpgrade(_v2Address);
    }

    /// @dev set a new reference to the NFT ownership contract
    /// @param _CStorageAddress - address of a deployed contract implementing EthernautsStorage.
    function setEthernautsStorageContract(address _CStorageAddress) public onlyCLevel whenPaused {
        EthernautsStorage candidateContract = EthernautsStorage(_CStorageAddress);
        require(candidateContract.isEthernautsStorage());
        ethernautsStorage = candidateContract;
    }

    /// @dev Override unpause so it requires all external contract addresses
    ///  to be set before contract can be unpaused. Also, we can't have
    ///  newContractAddress set either, because then the contract was upgraded.
    /// @notice This is public rather than external so we can call super.unpause
    ///  without using an expensive CALL.
    function unpause() public onlyCEO whenPaused {
        require(ethernautsStorage != address(0));
        require(newContractAddress == address(0));
        // require this contract to have access to storage contract
        require(ethernautsStorage.contractsGrantedAccess(address(this)) == true);

        // Actually unpause the contract.
        super.unpause();
    }

    // @dev Allows the COO to capture the balance available to the contract.
    function withdrawBalances(address _to) public onlyCLevel {
        _to.transfer(this.balance);
    }

    /// return current contract balance
    function getBalance() public view onlyCLevel returns (uint256) {
        return this.balance;
    }
}

/// @title The facet of the Ethernauts Explore contract that send a ship to explore the deep space.
/// @notice An owned ship can be send on an expedition. Exploration takes time
//          and will always result in “success”. This means the ship can never be destroyed
//          and always returns with a collection of loot. The degree of success is dependent
//          on different factors as sector stats, gamma ray burst number and ship stats.
//          While the ship is exploring it cannot be acted on in any way until the expedition completes.
//          After the ship returns from an expedition the user is then rewarded with a number of objects (assets).
/// @author Ethernatus - Fernando Pauer
contract EthernautsExplore is EthernautsLogic {

    /// @dev Delegate constructor to Nonfungible contract.
    function EthernautsExplore() public
    EthernautsLogic() {}

    /*** EVENTS ***/
    /// emit signal to anyone listening in the universe
    event Explore(uint256 shipId, uint256 sectorID, uint256 crewId, uint256 time);

    event Result(uint256 shipId, uint256 sectorID);

    /*** CONSTANTS ***/
    uint8 constant STATS_CAPOUT = 2**8 - 1; // all stats have a range from 0 to 255

    // @dev Sanity check that allows us to ensure that we are pointing to the
    //  right explore contract in our EthernautsCrewMember(address _CExploreAddress) call.
    bool public isEthernautsExplore = true;

    // An approximation of currently how many seconds are in between blocks.
    uint256 public secondsPerBlock = 15;

    uint256 public TICK_TIME = 15; // time is always in minutes

    // exploration fee
    uint256 public percentageCut  = 90;

    int256 public SPEED_STAT_MAX = 30;
    int256 public RANGE_STAT_MAX = 20;
    int256 public MIN_TIME_EXPLORE = 60;
    int256 public MAX_TIME_EXPLORE = 2160;
    int256 public RANGE_SCALE = 2;

    /// @dev Sector stats
    enum SectorStats {Size, Threat, Difficulty, Slots}

    /// @dev hold all ships in exploration
    uint256[] explorers;

    /// @dev A mapping from Ship token to the exploration index.
    mapping (uint256 => uint256) internal tokenIndexToExplore;

    /// @dev A mapping from Asset UniqueIDs to the sector token id.
    mapping (uint256 => uint256) internal tokenIndexToSector;

    /// @dev A mapping from exploration index to the crew token id.
    mapping (uint256 => uint256) internal exploreIndexToCrew;

    /// @dev A mission counter for crew.
    mapping (uint256 => uint16) public missions;

    /// @dev A mapping from Owner Cut (wei) to the sector token id.
    mapping (uint256 => uint256) public sectorToOwnerCut;
    mapping (uint256 => uint256) public sectorToOracleFee;

    /// @dev Get a list of ship exploring our universe
    function getExplorerList() public view returns(
        uint256[3][]
    ) {
        uint256[3][] memory tokens = new uint256[3][](explorers.length < 50 ? explorers.length : 50);
        uint256 index = 0;

        for(uint256 i = 0; i < explorers.length && index < 50; i++) {
            if (explorers[i] != 0) {
                tokens[index][0] = explorers[i];
                tokens[index][1] = tokenIndexToSector[explorers[i]];
                tokens[index][2] = exploreIndexToCrew[i];
                index++;
            }
        }

        if (index == 0) {
            // Return an empty array
            return new uint256[3][](0);
        } else {
            return tokens;
        }
    }

    function setOwnerCut(uint256 _sectorId, uint256 _ownerCut) external onlyCLevel {
        sectorToOwnerCut[_sectorId] = _ownerCut;
    }

    function setOracleFee(uint256 _sectorId, uint256 _oracleFee) external onlyCLevel {
        sectorToOracleFee[_sectorId] = _oracleFee;
    }

    function setTickTime(uint256 _tickTime) external onlyCLevel {
        TICK_TIME = _tickTime;
    }

    function setPercentageCut(uint256 _percentageCut) external onlyCLevel {
        percentageCut = _percentageCut;
    }

    function setMissions(uint256 _tokenId, uint16 _total) public onlyCLevel {
        missions[_tokenId] = _total;
    }

    /// @notice Explore a sector with a defined ship. Sectors contain a list of Objects that can be given to the players
    /// when exploring. Each entry has a Drop Rate and are sorted by Sector ID and Drop rate.
    /// The drop rate is a whole number between 0 and 1,000,000. 0 is 0% and 1,000,000 is 100%.
    /// Every time a Sector is explored a random number between 0 and 1,000,000 is calculated for each available Object.
    /// If the final result is lower than the Drop Rate of the Object, that Object will be rewarded to the player once
    /// Exploration is complete. Only 1 to 5 Objects maximum can be dropped during one exploration.
    /// (FUTURE VERSIONS) The final number will be affected by the user’s Ship Stats.
    /// @param _shipTokenId The Token ID that represents a ship
    /// @param _sectorTokenId The Token ID that represents a sector
    /// @param _crewTokenId The Token ID that represents a crew
    function explore(uint256 _shipTokenId, uint256 _sectorTokenId, uint256 _crewTokenId) payable external whenNotPaused {
        // charge a fee for each exploration when the results are ready
        require(msg.value >= sectorToOwnerCut[_sectorTokenId]);

        // check if Asset is a ship or not
        require(ethernautsStorage.isCategory(_shipTokenId, uint8(AssetCategory.Ship)));

        // check if _sectorTokenId is a sector or not
        require(ethernautsStorage.isCategory(_sectorTokenId, uint8(AssetCategory.Sector)));

        // Ensure the Ship is in available state, otherwise it cannot explore
        require(ethernautsStorage.isState(_shipTokenId, uint8(AssetState.Available)));

        // ship could not be in exploration
        require(!isExploring(_shipTokenId));

        // check if explorer is ship owner
        require(msg.sender == ethernautsStorage.ownerOf(_shipTokenId));

        // check if owner sector is not empty
        address sectorOwner = ethernautsStorage.ownerOf(_sectorTokenId);
        require(sectorOwner != address(0));

        // check if there is a crew and validating crew member
        if (_crewTokenId > 0) {
            // crew member should not be in exploration
            require(!isExploring(_crewTokenId));

            // check if Asset is a crew or not
            require(ethernautsStorage.isCategory(_crewTokenId, uint8(AssetCategory.CrewMember)));

            // check if crew member is same owner
            require(msg.sender == ethernautsStorage.ownerOf(_crewTokenId));
        }

        /// store exploration data
        tokenIndexToExplore[_shipTokenId] = explorers.push(_shipTokenId) - 1;
        tokenIndexToSector[_shipTokenId] = _sectorTokenId;

        uint8[STATS_SIZE] memory _shipStats = ethernautsStorage.getStats(_shipTokenId);
        uint8[STATS_SIZE] memory _sectorStats = ethernautsStorage.getStats(_sectorTokenId);

        // check if there is a crew and store data and change ship stats
        if (_crewTokenId > 0) {
            /// store crew exploration data
            exploreIndexToCrew[tokenIndexToExplore[_shipTokenId]] = _crewTokenId;
            missions[_crewTokenId]++;

            //// grab crew stats and merge with ship
            uint8[STATS_SIZE] memory _crewStats = ethernautsStorage.getStats(_crewTokenId);
            _shipStats[uint256(ShipStats.Range)] += _crewStats[uint256(ShipStats.Range)];
            _shipStats[uint256(ShipStats.Speed)] += _crewStats[uint256(ShipStats.Speed)];

            if (_shipStats[uint256(ShipStats.Range)] > STATS_CAPOUT) {
                _shipStats[uint256(ShipStats.Range)] = STATS_CAPOUT;
            }
            if (_shipStats[uint256(ShipStats.Speed)] > STATS_CAPOUT) {
                _shipStats[uint256(ShipStats.Speed)] = STATS_CAPOUT;
            }
        }

        /// set exploration time
        uint256 time = uint256(_explorationTime(
                _shipStats[uint256(ShipStats.Range)],
                _shipStats[uint256(ShipStats.Speed)],
                _sectorStats[uint256(SectorStats.Size)]
            ));
        // exploration time in minutes converted to seconds
        time *= 60;

        uint64 _cooldownEndBlock = uint64((time/secondsPerBlock) + block.number);
        ethernautsStorage.setAssetCooldown(_shipTokenId, now + time, _cooldownEndBlock);

        // check if there is a crew store data and set crew exploration time
        if (_crewTokenId > 0) {
            /// store crew exploration time
            ethernautsStorage.setAssetCooldown(_crewTokenId, now + time, _cooldownEndBlock);
        }

        // to avoid mistakes and charge unnecessary extra fees
        uint256 feeExcess = SafeMath.sub(msg.value, sectorToOwnerCut[_sectorTokenId]);
        uint256 payment = uint256(SafeMath.div(SafeMath.mul(msg.value, percentageCut), 100)) - sectorToOracleFee[_sectorTokenId];

        /// emit signal to anyone listening in the universe
        Explore(_shipTokenId, _sectorTokenId, _crewTokenId, now + time);

        // keeping oracle accounts with balance
        oracleAddress.transfer(sectorToOracleFee[_sectorTokenId]);

        // paying sector owner
        sectorOwner.transfer(payment);

        // send excess back to explorer
        msg.sender.transfer(feeExcess);
    }

    /// @notice Exploration is complete and at most 10 Objects will return during one exploration.
    /// @param _shipTokenId The Token ID that represents a ship and can explore
    /// @param _sectorTokenId The Token ID that represents a sector and can be explored
    /// @param _IDs that represents a object returned from exploration
    /// @param _attributes that represents attributes for each object returned from exploration
    /// @param _stats that represents all stats for each object returned from exploration
    function explorationResults(
        uint256 _shipTokenId,
        uint256 _sectorTokenId,
        uint16[10] _IDs,
        uint8[10] _attributes,
        uint8[STATS_SIZE][10] _stats
    )
    external onlyOracle
    {
        uint256 cooldown;
        uint64 cooldownEndBlock;
        uint256 builtBy;
        (,,,,,cooldownEndBlock, cooldown, builtBy) = ethernautsStorage.assets(_shipTokenId);

        address owner = ethernautsStorage.ownerOf(_shipTokenId);
        require(owner != address(0));

        /// create objects returned from exploration
        uint256 i = 0;
        for (i = 0; i < 10 && _IDs[i] > 0; i++) {
            _buildAsset(
                _sectorTokenId,
                owner,
                0,
                _IDs[i],
                uint8(AssetCategory.Object),
                uint8(_attributes[i]),
                _stats[i],
                cooldown,
                cooldownEndBlock
            );
        }

        // to guarantee at least 1 result per exploration
        require(i > 0);

        /// remove from explore list
        delete explorers[tokenIndexToExplore[_shipTokenId]];
        delete tokenIndexToSector[_shipTokenId];

        /// emit signal to anyone listening in the universe
        Result(_shipTokenId, _sectorTokenId);
    }

    /// @dev Creates a new Asset with the given fields. ONly available for C Levels
    /// @param _creatorTokenID The asset who is father of this asset
    /// @param _price asset price
    /// @param _assetID asset ID
    /// @param _category see Asset Struct description
    /// @param _attributes see Asset Struct description
    /// @param _stats see Asset Struct description
    /// @param _cooldown see Asset Struct description
    /// @param _cooldownEndBlock see Asset Struct description
    function _buildAsset(
        uint256 _creatorTokenID,
        address _owner,
        uint256 _price,
        uint16 _assetID,
        uint8 _category,
        uint8 _attributes,
        uint8[STATS_SIZE] _stats,
        uint256 _cooldown,
        uint64 _cooldownEndBlock
    )
    private returns (uint256)
    {
        uint256 tokenID = ethernautsStorage.createAsset(
            _creatorTokenID,
            _owner,
            _price,
            _assetID,
            _category,
            uint8(AssetState.Available),
            _attributes,
            _stats,
            _cooldown,
            _cooldownEndBlock
        );

        // emit the build event
        Build(
            _owner,
            tokenID,
            _assetID,
            _price
        );

        return tokenID;
    }

    /// @notice Exploration Time: The time it takes to explore a Sector is dependent on the Sector Size
    ///         along with the Ship’s Range and Speed.
    /// @param _shipRange ship range
    /// @param _shipSpeed ship speed
    /// @param _sectorSize sector size
    function _explorationTime(
        uint8 _shipRange,
        uint8 _shipSpeed,
        uint8 _sectorSize
    ) private view returns (int256) {
        int256 minToExplore = 0;

        minToExplore = SafeMath.min(_shipSpeed, SPEED_STAT_MAX) - 1;
        minToExplore = -72 * minToExplore;
        minToExplore += MAX_TIME_EXPLORE;

        uint256 minRange = uint256(SafeMath.min(_shipRange, RANGE_STAT_MAX));
        uint256 scaledRange = uint256(RANGE_STAT_MAX * RANGE_SCALE);
        int256 minExplore = (minToExplore - MIN_TIME_EXPLORE);

        minToExplore -= fraction(minExplore, int256(minRange), int256(scaledRange));
        minToExplore += fraction(minToExplore, int256(_sectorSize) - int256(10), 10);
        minToExplore = SafeMath.max(minToExplore, MIN_TIME_EXPLORE);

        return minToExplore;
    }

    /// @notice calcs a perc without float or double :(
    function fraction(int256 _subject, int256 _numerator, int256 _denominator)
    private pure returns (int256) {
        int256 division = _subject * _numerator - _subject * _denominator;
        int256 total = _subject * _denominator + division;
        return total / _denominator;
    }

    /// @notice Any C-level can fix how many seconds per blocks are currently observed.
    /// @param _secs The seconds per block
    function setSecondsPerBlock(uint256 _secs) external onlyCLevel {
        require(_secs > 0);
        secondsPerBlock = _secs;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TICK_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TIME_EXPLORE","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sectorId","type":"uint256"},{"name":"_ownerCut","type":"uint256"}],"name":"setOwnerCut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ctoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getExplorerList","outputs":[{"name":"","type":"uint256[3][]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"missions","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_GOLDENGOOSE","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_CStorageAddress","type":"address"}],"name":"setEthernautsStorageContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isEthernautsExplore","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethernautsStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_secs","type":"uint256"}],"name":"setSecondsPerBlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_SEEDED","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"sectorToOwnerCut","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SPEED_STAT_MAX","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_creatorTokenID","type":"uint256"},{"name":"_owner","type":"address"},{"name":"_price","type":"uint256"},{"name":"_assetID","type":"uint16"},{"name":"_category","type":"uint8"},{"name":"_attributes","type":"uint8"},{"name":"_stats","type":"uint8[10]"}],"name":"createNewAsset","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_TRADABLE","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_v2Address","type":"address"}],"name":"setNewAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_sectorId","type":"uint256"},{"name":"_oracleFee","type":"uint256"}],"name":"setOracleFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_percentageCut","type":"uint256"}],"name":"setPercentageCut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"STATS_SIZE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_LEASABLE","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RANGE_SCALE","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"secondsPerBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOracle","type":"address"}],"name":"setOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_PRODUCIBLE","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_CONSUMABLE","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracleAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SHIP_SLOTS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_TIME_EXPLORE","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"takeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_shipTokenId","type":"uint256"},{"name":"_sectorTokenId","type":"uint256"},{"name":"_crewTokenId","type":"uint256"}],"name":"explore","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_PERMANENT","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"isExploring","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"withdrawBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"RANGE_STAT_MAX","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_shipTokenId","type":"uint256"},{"name":"_sectorTokenId","type":"uint256"},{"name":"_IDs","type":"uint16[10]"},{"name":"_attributes","type":"uint8[10]"},{"name":"_stats","type":"uint8[10][10]"}],"name":"explorationResults","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_total","type":"uint16"}],"name":"setMissions","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tickTime","type":"uint256"}],"name":"setTickTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_EXPLORABLE","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"percentageCut","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCTO","type":"address"}],"name":"setCTO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"sectorToOracleFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"shipId","type":"uint256"},{"indexed":false,"name":"sectorID","type":"uint256"},{"indexed":false,"name":"crewId","type":"uint256"},{"indexed":false,"name":"time","type":"uint256"}],"name":"Explore","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"shipId","type":"uint256"},{"indexed":false,"name":"sectorID","type":"uint256"}],"name":"Result","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"assetId","type":"uint16"},{"indexed":false,"name":"price","type":"uint256"}],"name":"Build","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]

606060405260017e01000000000000000000000000000000000000000000000000000000000000026000806101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060027e0100000000000000000000000000000000000000000000000000000000000002600060026101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060047e0100000000000000000000000000000000000000000000000000000000000002600060046101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060087e0100000000000000000000000000000000000000000000000000000000000002600060066101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060107e0100000000000000000000000000000000000000000000000000000000000002600060086101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060207e01000000000000000000000000000000000000000000000000000000000000026000600a6101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060407e01000000000000000000000000000000000000000000000000000000000000026000600c6101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060807e01000000000000000000000000000000000000000000000000000000000000026000600e6101000a81548161ffff02191690837e01000000000000000000000000000000000000000000000000000000000000900402179055506000600460146101000a81548160ff0219169083151502179055506001600660146101000a81548160ff021916908315150217905550600f600755600f600855605a600955601e600a556014600b55603c600c55610870600d556002600e55341561035557600080fd5b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460146101000a81548160ff0219169083151502179055506156ed80620004846000396000f3006060604052600436106102d5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102da57806302c9972c1461033457806306fdde031461035d578063095ea7b3146103eb5780630a0f81681461042d5780630be21ea9146104825780631051db34146104ab57806312065fe0146104d857806318160ddd14610501578063191e39b31461052a5780631f5136601461055657806323b872dd146105ab57806327d7874c1461060c578063281972af146106455780632ba73c15146106d25780632c8fe5261461070b5780632d381f841461074a5780633f4ba83a146107b55780634b3afdd2146107ca5780634da5d4c01461080357806356410637146108305780635663896e146108855780635c975abb146108a85780635ea39624146108d55780636352211e14610940578063648bb3b7146109a35780636af04a57146109da5780636b14dfe114610a2f5780636ca4009314610a585780636d18dc6314610ae457806370a0823114610b4f5780637158798814610b9c57806372601e7714610bd5578063733bf2f214610c01578063764b08c314610c2457806378f1361414610c5357806379eb26cc14610cbe5780637a7d493714610ce75780637adbf97314610d105780638456cb5914610d495780638645a3da14610d5e57806393e1595d14610dc957806395d89b4114610e34578063a89ae4ba14610ec2578063a9059cbb14610f17578063aff4cbea14610f59578063b047fb5014610f88578063b15201b214610fdd578063b2e6ceeb14611006578063bfd6ef3e14611029578063c459b00314611053578063c86dca5a146110be578063ca64a02d146110f9578063d0d9fcf714611132578063e02dff391461115b578063eb28d2491461119f578063eff35f75146111cf578063f2d5866d146111f2578063f4f422461461125d578063fe1439b414611286578063fe15e15f146112bf575b600080fd5b34156102e557600080fd5b61031a60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506112f6565b604051808215151515815260200191505060405180910390f35b341561033f57600080fd5b61034761163e565b6040518082815260200191505060405180910390f35b341561036857600080fd5b610370611644565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b0578082015181840152602081019050610395565b50505050905090810190601f1680156103dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103f657600080fd5b61042b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061167d565b005b341561043857600080fd5b610440611721565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048d57600080fd5b610495611747565b6040518082815260200191505060405180910390f35b34156104b657600080fd5b6104be61174d565b604051808215151515815260200191505060405180910390f35b34156104e357600080fd5b6104eb611756565b6040518082815260200191505060405180910390f35b341561050c57600080fd5b610514611881565b6040518082815260200191505060405180910390f35b341561053557600080fd5b6105546004808035906020019091908035906020019091905050611931565b005b341561056157600080fd5b610569611a59565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b657600080fd5b61060a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a7f565b005b341561061757600080fd5b610643600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611aab565b005b341561065057600080fd5b610658611b87565b60405180806020018281038252838181518152602001915080516000925b818410156106c157828490602001906020020151600360200280838360005b838110156106b0578082015181840152602081019050610695565b505050509050019260010192610676565b925050509250505060405180910390f35b34156106dd57600080fd5b610709600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611da1565b005b341561071657600080fd5b61072c6004808035906020019091905050611ed5565b604051808261ffff1661ffff16815260200191505060405180910390f35b341561075557600080fd5b61075d611ef6565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34156107c057600080fd5b6107c8611f27565b005b34156107d557600080fd5b610801600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612155565b005b341561080e57600080fd5b610816612358565b604051808215151515815260200191505060405180910390f35b341561083b57600080fd5b61084361236b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561089057600080fd5b6108a66004808035906020019091905050612391565b005b34156108b357600080fd5b6108bb6124b6565b604051808215151515815260200191505060405180910390f35b34156108e057600080fd5b6108e86124c9565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b341561094b57600080fd5b61096160048080359060200190919050506124f9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ae57600080fd5b6109c460048080359060200190919050506125f2565b6040518082815260200191505060405180910390f35b34156109e557600080fd5b6109ed61260a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a3a57600080fd5b610a42612630565b6040518082815260200191505060405180910390f35b3415610a6357600080fd5b610ace600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803561ffff1690602001909190803560ff1690602001909190803560ff169060200190919080610140019091905050612636565b6040518082815260200191505060405180910390f35b3415610aef57600080fd5b610af7612977565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610b5a57600080fd5b610b86600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506129a8565b6040518082815260200191505060405180910390f35b3415610ba757600080fd5b610bd3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612a91565b005b3415610be057600080fd5b610bff6004808035906020019091908035906020019091905050612baf565b005b3415610c0c57600080fd5b610c226004808035906020019091905050612cd7565b005b3415610c2f57600080fd5b610c37612ded565b604051808260ff1660ff16815260200191505060405180910390f35b3415610c5e57600080fd5b610c66612df2565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610cc957600080fd5b610cd1612e23565b6040518082815260200191505060405180910390f35b3415610cf257600080fd5b610cfa612e29565b6040518082815260200191505060405180910390f35b3415610d1b57600080fd5b610d47600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612e2f565b005b3415610d5457600080fd5b610d5c612f0b565b005b3415610d6957600080fd5b610d71613050565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610dd457600080fd5b610ddc613081565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610e3f57600080fd5b610e476130b2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e87578082015181840152602081019050610e6c565b50505050905090810190601f168015610eb45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ecd57600080fd5b610ed56130eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f2257600080fd5b610f57600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050613111565b005b3415610f6457600080fd5b610f6c613326565b604051808260ff1660ff16815260200191505060405180910390f35b3415610f9357600080fd5b610f9b61332b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610fe857600080fd5b610ff0613351565b6040518082815260200191505060405180910390f35b341561101157600080fd5b6110276004808035906020019091905050613357565b005b611051600480803590602001909190803590602001909190803590602001909190505061345a565b005b341561105e57600080fd5b611066614334565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34156110c957600080fd5b6110df6004808035906020019091905050614365565b604051808215151515815260200191505060405180910390f35b341561110457600080fd5b611130600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061449b565b005b341561113d57600080fd5b611145614601565b6040518082815260200191505060405180910390f35b341561116657600080fd5b61119d6004808035906020019091908035906020019091908061014001909190806101400190919080610c80019091905050614607565b005b34156111aa57600080fd5b6111cd600480803590602001909190803561ffff169060200190919050506149cf565b005b34156111da57600080fd5b6111f06004808035906020019091905050614b0d565b005b34156111fd57600080fd5b611205614c23565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b341561126857600080fd5b611270614c54565b6040518082815260200191505060405180910390f35b341561129157600080fd5b6112bd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050614c5a565b005b34156112ca57600080fd5b6112e06004808035906020019091905050614d8e565b6040518082815260200191505060405180910390f35b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611637575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f74616b654f776e6572736869702875696e7432353629000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d652829000000000000000000000000000000000000000000000000000081525060060190506040518091039020181818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60085481565b6040805190810160405280600a81526020017f45746865726e617574730000000000000000000000000000000000000000000081525081565b600460149054906101000a900460ff1615151561169957600080fd5b6116a33382614da6565b15156116ae57600080fd5b6116b88183614e92565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b60006001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118015750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118595750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561186457600080fd5b3073ffffffffffffffffffffffffffffffffffffffff1631905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561191157600080fd5b6102c65a03f1151561192257600080fd5b50505060405180519050905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806119da5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611a325750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611a3d57600080fd5b8060146000848152602001908152602001600020819055505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460149054906101000a900460ff16151515611a9b57600080fd5b611aa6838383614f6e565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b0757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b4357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b8f615608565b611b97615608565b6000806032600f8054905010611bae576032611bb5565b600f805490505b604051805910611bc25750595b908082528060200260200182016040528015611bf857816020015b611be561561c565b815260200190600190039081611bdd5790505b50925060009150600090505b600f8054905081108015611c185750603282105b15611d41576000600f82815481101515611c2e57fe5b906000526020600020900154141515611d3457600f81815481101515611c5057fe5b9060005260206000209001548383815181101515611c6a57fe5b906020019060200201516000600381101515611c8257fe5b60200201818152505060116000600f83815481101515611c9e57fe5b9060005260206000209001548152602001908152602001600020548383815181101515611cc757fe5b906020019060200201516001600381101515611cdf57fe5b60200201818152505060126000828152602001908152602001600020548383815181101515611d0a57fe5b906020019060200201516002600381101515611d2257fe5b60200201818152505081806001019250505b8080600101915050611c04565b6000821415611d97576000604051805910611d595750595b908082528060200260200182016040528015611d8f57816020015b611d7c61561c565b815260200190600190039081611d745790505b509350611d9b565b8293505b50505090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e4a5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611e5557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e9157600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60136020528060005260406000206000915054906101000a900461ffff1681565b6000600e9054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f8357600080fd5b600460149054906101000a900460ff161515611f9e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611ffc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561205957600080fd5b60011515600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632da22fc0306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561212257600080fd5b6102c65a03f1151561213357600080fd5b50505060405180519050151514151561214b57600080fd5b6121536150e5565b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122005750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806122585750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561226357600080fd5b600460149054906101000a900460ff16151561227e57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff1663ae61fcda6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156122ed57600080fd5b6102c65a03f115156122fe57600080fd5b50505060405180519050151561231357600080fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600660149054906101000a900460ff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061243a5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124925750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561249d57600080fd5b6000811115156124ac57600080fd5b8060078190555050565b600460149054906101000a900460ff1681565b6000809054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561259457600080fd5b6102c65a03f115156125a557600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156125ed57600080fd5b919050565b60146020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806126e25750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061273a5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561274557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415151561278157600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e8cdd0a8a8a8a8a8a600060028111156127d157fe5b8b8b6000806000604051602001526040518b63ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018861ffff1661ffff1681526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff16815260200184600a6020028082843782019150508381526020018267ffffffffffffffff1681526020019a5050505050505050505050602060405180830381600087803b15156128c857600080fd5b6102c65a03f115156128d957600080fd5b5050506040518051905090507fbeb1fffdbea52fcb668386f7d55545fac4cb704f66674ba929c648e708f7c0208882888a604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018361ffff1661ffff16815260200182815260200194505050505060405180910390a180915050979650505050505050565b6000600c9054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612a6f57600080fd5b6102c65a03f11515612a8057600080fd5b505050604051805190509050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612aed57600080fd5b600460149054906101000a900460ff161515612b0857600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612c585750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612cb05750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612cbb57600080fd5b8060156000848152602001908152602001600020819055505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612d805750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612dd85750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612de357600080fd5b8060098190555050565b600a81565b600060069054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b600e5481565b60075481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612e8b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612ec757600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612fb45750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061300c5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561301757600080fd5b600460149054906101000a900460ff1615151561303357600080fd5b6001600460146101000a81548160ff021916908315150217905550565b600060029054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000600a9054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6040805190810160405280600481526020017f45544e540000000000000000000000000000000000000000000000000000000081525081565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460149054906101000a900460ff1615151561312d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561316957600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156131a457600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561320157600080fd5b61320b3382614da6565b151561321657600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc83384846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b151561330e57600080fd5b6102c65a03f1151561331f57600080fd5b5050505050565b600581565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156133f257600080fd5b6102c65a03f1151561340357600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561344b57600080fd5b613456813384614f6e565b5050565b6000613464615644565b61346c615644565b613474615644565b600080600080600460149054906101000a900460ff1615151561349657600080fd5b601460008b81526020019081526020016000205434101515156134b857600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663660250478c6003600681111561350457fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b151561356b57600080fd5b6102c65a03f1151561357c57600080fd5b50505060405180519050151561359157600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663660250478b600160068111156135dd57fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b151561364457600080fd5b6102c65a03f1151561365557600080fd5b50505060405180519050151561366a57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef816fd98c600060028111156136b657fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b151561371d57600080fd5b6102c65a03f1151561372e57600080fd5b50505060405180519050151561374357600080fd5b61374c8b614365565b15151561375857600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156137f157600080fd5b6102c65a03f1151561380257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561384557600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8b6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156138de57600080fd5b6102c65a03f115156138ef57600080fd5b505050604051805190509750600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415151561393757600080fd5b6000891115613b1b5761394989614365565b15151561395557600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663660250478a6006808111156139a057fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b1515613a0757600080fd5b6102c65a03f11515613a1857600080fd5b505050604051805190501515613a2d57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8a6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613ac657600080fd5b6102c65a03f11515613ad757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613b1a57600080fd5b5b6001600f8054806001018281613b319190615670565b916000526020600020900160008e90919091505503601060008d81526020019081526020016000208190555089601160008d815260200190815260200160002081905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b3039658c600060405161014001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061014060405180830381600087803b1515613c1057600080fd5b6102c65a03f11515613c2157600080fd5b50505060405180610140016040529650600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b3039658b600060405161014001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061014060405180830381600087803b1515613ccc57600080fd5b6102c65a03f11515613cdd57600080fd5b505050604051806101400160405295506000891115613f78578860126000601060008f815260200190815260200160002054815260200190815260200160002081905550601360008a8152602001908152602001600020600081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b3039658a600060405161014001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061014060405180830381600087803b1515613e0257600080fd5b6102c65a03f11515613e1357600080fd5b505050604051806101400160405294508460046005811115613e3157fe5b600a81101515613e3d57fe5b60200201518760046005811115613e5057fe5b600a81101515613e5c57fe5b602002018181510191509060ff16908160ff16815250508460036005811115613e8157fe5b600a81101515613e8d57fe5b60200201518760036005811115613ea057fe5b600a81101515613eac57fe5b602002018181510191509060ff16908160ff168152505060ff80168760046005811115613ed557fe5b600a81101515613ee157fe5b602002015160ff161115613f1d5760ff8760046005811115613eff57fe5b600a81101515613f0b57fe5b602002019060ff16908160ff16815250505b60ff80168760036005811115613f2f57fe5b600a81101515613f3b57fe5b602002015160ff161115613f775760ff8760036005811115613f5957fe5b600a81101515613f6557fe5b602002019060ff16908160ff16815250505b5b613fdd8760046005811115613f8957fe5b600a81101515613f9557fe5b60200201518860036005811115613fa857fe5b600a81101515613fb457fe5b60200201518860006003811115613fc757fe5b600a81101515613fd357fe5b6020020151615179565b9350603c840293504360075485811515613ff357fe5b04019250600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663058d4dd08c864201866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1667ffffffffffffffff1681526020019350505050600060405180830381600087803b15156140ad57600080fd5b6102c65a03f115156140be57600080fd5b505050600089111561419557600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663058d4dd08a864201866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1667ffffffffffffffff1681526020019350505050600060405180830381600087803b151561418057600080fd5b6102c65a03f1151561419157600080fd5b5050505b6141b234601460008d815260200190815260200160002054615226565b9150601560008b8152602001908152602001600020546141de6141d73460095461523f565b606461527a565b0390507f4199977aa416cfb20e6c1853de61911c75d4671bb9cf80a8359b65085cdf197d8b8b8b8742016040518085815260200184815260200183815260200182815260200194505050505060405180910390a1600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc601560008d8152602001908152602001600020549081150290604051600060405180830381858888f1935050505015156142a757600080fd5b8773ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156142e757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561432757600080fd5b5050505050505050505050565b600060089054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000806000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf35bdd085600060405161010001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061010060405180830381600087803b151561440557600080fd5b6102c65a03f1151561441657600080fd5b505050604051805190602001805190602001805190602001805190602001805190602001805190602001805190602001805190509091929394959650909192939495509091929394509091929350909192505080935081925050504282118061449257504367ffffffffffffffff168167ffffffffffffffff16115b92505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806145445750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061459c5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156145a757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015156145fe57600080fd5b50565b600b5481565b6000806000806000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561466b57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf35bdd08b600060405161010001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061010060405180830381600087803b151561470657600080fd5b6102c65a03f1151561471757600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180519060200180519060200180519050909192939495965090919293949550909192939450909192935090919250809550819750829650505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8b6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561480e57600080fd5b6102c65a03f1151561481f57600080fd5b505050604051805190509150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561486757600080fd5b60009050600090505b600a8110801561489a575060008882600a8110151561488b57fe5b602002013561ffff1661ffff16115b1561492d5761491f898360008b85600a811015156148b457fe5b602002013561ffff16600460068111156148ca57fe5b8c87600a811015156148d857fe5b602002013560ff168c88600a811015156148ee57fe5b6101400201600a806020026040519081016040528092919082600a6020028082843782019150505050508c8c615295565b508080600101915050614870565b60008111151561493c57600080fd5b600f601060008c81526020019081526020016000205481548110151561495e57fe5b906000526020600020900160009055601160008b8152602001908152602001600020600090557f34fa627446f032cedc60a5521c4a8fbdd28f3ce106d8c6f6c17322ada873cebb8a8a604051808381526020018281526020019250505060405180910390a150505050505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614a785750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80614ad05750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515614adb57600080fd5b806013600084815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614bb65750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80614c0e5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515614c1957600080fd5b8060088190555050565b600060049054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b60095481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614d035750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515614d0e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614d4a57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60156020528060005260406000206000915090505481565b60008273ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515614e5857600080fd5b6102c65a03f11515614e6957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663febe490983836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1515614f5657600080fd5b6102c65a03f11515614f6757600080fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614faa57600080fd5b614fb48382614da6565b1515614fbf57600080fd5b614fc982826154b8565b1515614fd457600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc88484846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15156150cc57600080fd5b6102c65a03f115156150dd57600080fd5b505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561514157600080fd5b600460149054906101000a900460ff16151561515c57600080fd5b6000600460146101000a81548160ff021916908315150217905550565b600080600080600080935060016151958860ff16600a546155a4565b039350837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8029350600d54840193506151d38860ff16600b546155a4565b9250600e54600b54029150600c54840390506151f08184846155c0565b8403935061520684600a8860ff1603600a6155c0565b8401935061521684600c546155ec565b9350839450505050509392505050565b600082821115151561523457fe5b818303905092915050565b60008060008414156152545760009150615273565b828402905082848281151561526557fe5b0414151561526f57fe5b8091505b5092915050565b600080828481151561528857fe5b0490508091505092915050565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e8cdd0a8c8c8c8c8c600060028111156152e857fe5b8d8d8d8d6000604051602001526040518b63ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018861ffff1661ffff1681526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff16815260200184600a60200280838360005b838110156153bb5780820151818401526020810190506153a0565b505050509050018381526020018267ffffffffffffffff1667ffffffffffffffff1681526020019a5050505050505050505050602060405180830381600087803b151561540757600080fd5b6102c65a03f1151561541857600080fd5b5050506040518051905090507fbeb1fffdbea52fcb668386f7d55545fac4cb704f66674ba929c648e708f7c0208a828a8c604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018361ffff1661ffff16815260200182815260200194505050505060405180910390a1809150509998505050505050505050565b60008273ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a6dd48f846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561556a57600080fd5b6102c65a03f1151561557b57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b6000818312156155b6578290506155ba565b8190505b92915050565b60008060008386028587020391508184870201905083818115156155e057fe5b05925050509392505050565b6000818313156155fe57829050615602565b8190505b92915050565b602060405190810160405280600081525090565b6060604051908101604052806003905b600081526020019060019003908161562c5790505090565b61014060405190810160405280600a905b600060ff168152602001906001900390816156555790505090565b81548183558181151161569757818360005260206000209182019101615696919061569c565b5b505050565b6156be91905b808211156156ba5760008160009055506001016156a2565b5090565b905600a165627a7a72305820b906957436ffaf29a4bb15bad8c714054a6406ad9ff93f09ccaaa1b810318f860029

Deployed Bytecode

0x6060604052600436106102d5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102da57806302c9972c1461033457806306fdde031461035d578063095ea7b3146103eb5780630a0f81681461042d5780630be21ea9146104825780631051db34146104ab57806312065fe0146104d857806318160ddd14610501578063191e39b31461052a5780631f5136601461055657806323b872dd146105ab57806327d7874c1461060c578063281972af146106455780632ba73c15146106d25780632c8fe5261461070b5780632d381f841461074a5780633f4ba83a146107b55780634b3afdd2146107ca5780634da5d4c01461080357806356410637146108305780635663896e146108855780635c975abb146108a85780635ea39624146108d55780636352211e14610940578063648bb3b7146109a35780636af04a57146109da5780636b14dfe114610a2f5780636ca4009314610a585780636d18dc6314610ae457806370a0823114610b4f5780637158798814610b9c57806372601e7714610bd5578063733bf2f214610c01578063764b08c314610c2457806378f1361414610c5357806379eb26cc14610cbe5780637a7d493714610ce75780637adbf97314610d105780638456cb5914610d495780638645a3da14610d5e57806393e1595d14610dc957806395d89b4114610e34578063a89ae4ba14610ec2578063a9059cbb14610f17578063aff4cbea14610f59578063b047fb5014610f88578063b15201b214610fdd578063b2e6ceeb14611006578063bfd6ef3e14611029578063c459b00314611053578063c86dca5a146110be578063ca64a02d146110f9578063d0d9fcf714611132578063e02dff391461115b578063eb28d2491461119f578063eff35f75146111cf578063f2d5866d146111f2578063f4f422461461125d578063fe1439b414611286578063fe15e15f146112bf575b600080fd5b34156102e557600080fd5b61031a60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506112f6565b604051808215151515815260200191505060405180910390f35b341561033f57600080fd5b61034761163e565b6040518082815260200191505060405180910390f35b341561036857600080fd5b610370611644565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b0578082015181840152602081019050610395565b50505050905090810190601f1680156103dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103f657600080fd5b61042b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061167d565b005b341561043857600080fd5b610440611721565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048d57600080fd5b610495611747565b6040518082815260200191505060405180910390f35b34156104b657600080fd5b6104be61174d565b604051808215151515815260200191505060405180910390f35b34156104e357600080fd5b6104eb611756565b6040518082815260200191505060405180910390f35b341561050c57600080fd5b610514611881565b6040518082815260200191505060405180910390f35b341561053557600080fd5b6105546004808035906020019091908035906020019091905050611931565b005b341561056157600080fd5b610569611a59565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b657600080fd5b61060a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a7f565b005b341561061757600080fd5b610643600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611aab565b005b341561065057600080fd5b610658611b87565b60405180806020018281038252838181518152602001915080516000925b818410156106c157828490602001906020020151600360200280838360005b838110156106b0578082015181840152602081019050610695565b505050509050019260010192610676565b925050509250505060405180910390f35b34156106dd57600080fd5b610709600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611da1565b005b341561071657600080fd5b61072c6004808035906020019091905050611ed5565b604051808261ffff1661ffff16815260200191505060405180910390f35b341561075557600080fd5b61075d611ef6565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34156107c057600080fd5b6107c8611f27565b005b34156107d557600080fd5b610801600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612155565b005b341561080e57600080fd5b610816612358565b604051808215151515815260200191505060405180910390f35b341561083b57600080fd5b61084361236b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561089057600080fd5b6108a66004808035906020019091905050612391565b005b34156108b357600080fd5b6108bb6124b6565b604051808215151515815260200191505060405180910390f35b34156108e057600080fd5b6108e86124c9565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b341561094b57600080fd5b61096160048080359060200190919050506124f9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ae57600080fd5b6109c460048080359060200190919050506125f2565b6040518082815260200191505060405180910390f35b34156109e557600080fd5b6109ed61260a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a3a57600080fd5b610a42612630565b6040518082815260200191505060405180910390f35b3415610a6357600080fd5b610ace600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803561ffff1690602001909190803560ff1690602001909190803560ff169060200190919080610140019091905050612636565b6040518082815260200191505060405180910390f35b3415610aef57600080fd5b610af7612977565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610b5a57600080fd5b610b86600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506129a8565b6040518082815260200191505060405180910390f35b3415610ba757600080fd5b610bd3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612a91565b005b3415610be057600080fd5b610bff6004808035906020019091908035906020019091905050612baf565b005b3415610c0c57600080fd5b610c226004808035906020019091905050612cd7565b005b3415610c2f57600080fd5b610c37612ded565b604051808260ff1660ff16815260200191505060405180910390f35b3415610c5e57600080fd5b610c66612df2565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610cc957600080fd5b610cd1612e23565b6040518082815260200191505060405180910390f35b3415610cf257600080fd5b610cfa612e29565b6040518082815260200191505060405180910390f35b3415610d1b57600080fd5b610d47600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612e2f565b005b3415610d5457600080fd5b610d5c612f0b565b005b3415610d6957600080fd5b610d71613050565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610dd457600080fd5b610ddc613081565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610e3f57600080fd5b610e476130b2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e87578082015181840152602081019050610e6c565b50505050905090810190601f168015610eb45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ecd57600080fd5b610ed56130eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f2257600080fd5b610f57600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050613111565b005b3415610f6457600080fd5b610f6c613326565b604051808260ff1660ff16815260200191505060405180910390f35b3415610f9357600080fd5b610f9b61332b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610fe857600080fd5b610ff0613351565b6040518082815260200191505060405180910390f35b341561101157600080fd5b6110276004808035906020019091905050613357565b005b611051600480803590602001909190803590602001909190803590602001909190505061345a565b005b341561105e57600080fd5b611066614334565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34156110c957600080fd5b6110df6004808035906020019091905050614365565b604051808215151515815260200191505060405180910390f35b341561110457600080fd5b611130600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061449b565b005b341561113d57600080fd5b611145614601565b6040518082815260200191505060405180910390f35b341561116657600080fd5b61119d6004808035906020019091908035906020019091908061014001909190806101400190919080610c80019091905050614607565b005b34156111aa57600080fd5b6111cd600480803590602001909190803561ffff169060200190919050506149cf565b005b34156111da57600080fd5b6111f06004808035906020019091905050614b0d565b005b34156111fd57600080fd5b611205614c23565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b341561126857600080fd5b611270614c54565b6040518082815260200191505060405180910390f35b341561129157600080fd5b6112bd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050614c5a565b005b34156112ca57600080fd5b6112e06004808035906020019091905050614d8e565b6040518082815260200191505060405180910390f35b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611637575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f74616b654f776e6572736869702875696e7432353629000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d652829000000000000000000000000000000000000000000000000000081525060060190506040518091039020181818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60085481565b6040805190810160405280600a81526020017f45746865726e617574730000000000000000000000000000000000000000000081525081565b600460149054906101000a900460ff1615151561169957600080fd5b6116a33382614da6565b15156116ae57600080fd5b6116b88183614e92565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b60006001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118015750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118595750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561186457600080fd5b3073ffffffffffffffffffffffffffffffffffffffff1631905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561191157600080fd5b6102c65a03f1151561192257600080fd5b50505060405180519050905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806119da5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611a325750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611a3d57600080fd5b8060146000848152602001908152602001600020819055505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460149054906101000a900460ff16151515611a9b57600080fd5b611aa6838383614f6e565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b0757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b4357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b8f615608565b611b97615608565b6000806032600f8054905010611bae576032611bb5565b600f805490505b604051805910611bc25750595b908082528060200260200182016040528015611bf857816020015b611be561561c565b815260200190600190039081611bdd5790505b50925060009150600090505b600f8054905081108015611c185750603282105b15611d41576000600f82815481101515611c2e57fe5b906000526020600020900154141515611d3457600f81815481101515611c5057fe5b9060005260206000209001548383815181101515611c6a57fe5b906020019060200201516000600381101515611c8257fe5b60200201818152505060116000600f83815481101515611c9e57fe5b9060005260206000209001548152602001908152602001600020548383815181101515611cc757fe5b906020019060200201516001600381101515611cdf57fe5b60200201818152505060126000828152602001908152602001600020548383815181101515611d0a57fe5b906020019060200201516002600381101515611d2257fe5b60200201818152505081806001019250505b8080600101915050611c04565b6000821415611d97576000604051805910611d595750595b908082528060200260200182016040528015611d8f57816020015b611d7c61561c565b815260200190600190039081611d745790505b509350611d9b565b8293505b50505090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e4a5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611e5557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e9157600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60136020528060005260406000206000915054906101000a900461ffff1681565b6000600e9054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f8357600080fd5b600460149054906101000a900460ff161515611f9e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611ffc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561205957600080fd5b60011515600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632da22fc0306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561212257600080fd5b6102c65a03f1151561213357600080fd5b50505060405180519050151514151561214b57600080fd5b6121536150e5565b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122005750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806122585750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561226357600080fd5b600460149054906101000a900460ff16151561227e57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff1663ae61fcda6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156122ed57600080fd5b6102c65a03f115156122fe57600080fd5b50505060405180519050151561231357600080fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600660149054906101000a900460ff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061243a5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124925750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561249d57600080fd5b6000811115156124ac57600080fd5b8060078190555050565b600460149054906101000a900460ff1681565b6000809054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561259457600080fd5b6102c65a03f115156125a557600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156125ed57600080fd5b919050565b60146020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806126e25750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061273a5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561274557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415151561278157600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e8cdd0a8a8a8a8a8a600060028111156127d157fe5b8b8b6000806000604051602001526040518b63ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018861ffff1661ffff1681526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff16815260200184600a6020028082843782019150508381526020018267ffffffffffffffff1681526020019a5050505050505050505050602060405180830381600087803b15156128c857600080fd5b6102c65a03f115156128d957600080fd5b5050506040518051905090507fbeb1fffdbea52fcb668386f7d55545fac4cb704f66674ba929c648e708f7c0208882888a604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018361ffff1661ffff16815260200182815260200194505050505060405180910390a180915050979650505050505050565b6000600c9054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612a6f57600080fd5b6102c65a03f11515612a8057600080fd5b505050604051805190509050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612aed57600080fd5b600460149054906101000a900460ff161515612b0857600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612c585750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612cb05750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612cbb57600080fd5b8060156000848152602001908152602001600020819055505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612d805750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612dd85750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612de357600080fd5b8060098190555050565b600a81565b600060069054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b600e5481565b60075481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612e8b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612ec757600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612fb45750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061300c5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561301757600080fd5b600460149054906101000a900460ff1615151561303357600080fd5b6001600460146101000a81548160ff021916908315150217905550565b600060029054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000600a9054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6040805190810160405280600481526020017f45544e540000000000000000000000000000000000000000000000000000000081525081565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460149054906101000a900460ff1615151561312d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561316957600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156131a457600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561320157600080fd5b61320b3382614da6565b151561321657600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc83384846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b151561330e57600080fd5b6102c65a03f1151561331f57600080fd5b5050505050565b600581565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156133f257600080fd5b6102c65a03f1151561340357600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561344b57600080fd5b613456813384614f6e565b5050565b6000613464615644565b61346c615644565b613474615644565b600080600080600460149054906101000a900460ff1615151561349657600080fd5b601460008b81526020019081526020016000205434101515156134b857600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663660250478c6003600681111561350457fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b151561356b57600080fd5b6102c65a03f1151561357c57600080fd5b50505060405180519050151561359157600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663660250478b600160068111156135dd57fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b151561364457600080fd5b6102c65a03f1151561365557600080fd5b50505060405180519050151561366a57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef816fd98c600060028111156136b657fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b151561371d57600080fd5b6102c65a03f1151561372e57600080fd5b50505060405180519050151561374357600080fd5b61374c8b614365565b15151561375857600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156137f157600080fd5b6102c65a03f1151561380257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561384557600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8b6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156138de57600080fd5b6102c65a03f115156138ef57600080fd5b505050604051805190509750600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415151561393757600080fd5b6000891115613b1b5761394989614365565b15151561395557600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663660250478a6006808111156139a057fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b1515613a0757600080fd5b6102c65a03f11515613a1857600080fd5b505050604051805190501515613a2d57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8a6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613ac657600080fd5b6102c65a03f11515613ad757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613b1a57600080fd5b5b6001600f8054806001018281613b319190615670565b916000526020600020900160008e90919091505503601060008d81526020019081526020016000208190555089601160008d815260200190815260200160002081905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b3039658c600060405161014001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061014060405180830381600087803b1515613c1057600080fd5b6102c65a03f11515613c2157600080fd5b50505060405180610140016040529650600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b3039658b600060405161014001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061014060405180830381600087803b1515613ccc57600080fd5b6102c65a03f11515613cdd57600080fd5b505050604051806101400160405295506000891115613f78578860126000601060008f815260200190815260200160002054815260200190815260200160002081905550601360008a8152602001908152602001600020600081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b3039658a600060405161014001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061014060405180830381600087803b1515613e0257600080fd5b6102c65a03f11515613e1357600080fd5b505050604051806101400160405294508460046005811115613e3157fe5b600a81101515613e3d57fe5b60200201518760046005811115613e5057fe5b600a81101515613e5c57fe5b602002018181510191509060ff16908160ff16815250508460036005811115613e8157fe5b600a81101515613e8d57fe5b60200201518760036005811115613ea057fe5b600a81101515613eac57fe5b602002018181510191509060ff16908160ff168152505060ff80168760046005811115613ed557fe5b600a81101515613ee157fe5b602002015160ff161115613f1d5760ff8760046005811115613eff57fe5b600a81101515613f0b57fe5b602002019060ff16908160ff16815250505b60ff80168760036005811115613f2f57fe5b600a81101515613f3b57fe5b602002015160ff161115613f775760ff8760036005811115613f5957fe5b600a81101515613f6557fe5b602002019060ff16908160ff16815250505b5b613fdd8760046005811115613f8957fe5b600a81101515613f9557fe5b60200201518860036005811115613fa857fe5b600a81101515613fb457fe5b60200201518860006003811115613fc757fe5b600a81101515613fd357fe5b6020020151615179565b9350603c840293504360075485811515613ff357fe5b04019250600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663058d4dd08c864201866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1667ffffffffffffffff1681526020019350505050600060405180830381600087803b15156140ad57600080fd5b6102c65a03f115156140be57600080fd5b505050600089111561419557600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663058d4dd08a864201866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1667ffffffffffffffff1681526020019350505050600060405180830381600087803b151561418057600080fd5b6102c65a03f1151561419157600080fd5b5050505b6141b234601460008d815260200190815260200160002054615226565b9150601560008b8152602001908152602001600020546141de6141d73460095461523f565b606461527a565b0390507f4199977aa416cfb20e6c1853de61911c75d4671bb9cf80a8359b65085cdf197d8b8b8b8742016040518085815260200184815260200183815260200182815260200194505050505060405180910390a1600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc601560008d8152602001908152602001600020549081150290604051600060405180830381858888f1935050505015156142a757600080fd5b8773ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156142e757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561432757600080fd5b5050505050505050505050565b600060089054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000806000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf35bdd085600060405161010001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061010060405180830381600087803b151561440557600080fd5b6102c65a03f1151561441657600080fd5b505050604051805190602001805190602001805190602001805190602001805190602001805190602001805190602001805190509091929394959650909192939495509091929394509091929350909192505080935081925050504282118061449257504367ffffffffffffffff168167ffffffffffffffff16115b92505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806145445750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061459c5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156145a757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015156145fe57600080fd5b50565b600b5481565b6000806000806000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561466b57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf35bdd08b600060405161010001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061010060405180830381600087803b151561470657600080fd5b6102c65a03f1151561471757600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180519060200180519060200180519050909192939495965090919293949550909192939450909192935090919250809550819750829650505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8b6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561480e57600080fd5b6102c65a03f1151561481f57600080fd5b505050604051805190509150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561486757600080fd5b60009050600090505b600a8110801561489a575060008882600a8110151561488b57fe5b602002013561ffff1661ffff16115b1561492d5761491f898360008b85600a811015156148b457fe5b602002013561ffff16600460068111156148ca57fe5b8c87600a811015156148d857fe5b602002013560ff168c88600a811015156148ee57fe5b6101400201600a806020026040519081016040528092919082600a6020028082843782019150505050508c8c615295565b508080600101915050614870565b60008111151561493c57600080fd5b600f601060008c81526020019081526020016000205481548110151561495e57fe5b906000526020600020900160009055601160008b8152602001908152602001600020600090557f34fa627446f032cedc60a5521c4a8fbdd28f3ce106d8c6f6c17322ada873cebb8a8a604051808381526020018281526020019250505060405180910390a150505050505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614a785750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80614ad05750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515614adb57600080fd5b806013600084815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614bb65750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80614c0e5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515614c1957600080fd5b8060088190555050565b600060049054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b60095481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614d035750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515614d0e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614d4a57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60156020528060005260406000206000915090505481565b60008273ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515614e5857600080fd5b6102c65a03f11515614e6957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663febe490983836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1515614f5657600080fd5b6102c65a03f11515614f6757600080fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614faa57600080fd5b614fb48382614da6565b1515614fbf57600080fd5b614fc982826154b8565b1515614fd457600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc88484846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15156150cc57600080fd5b6102c65a03f115156150dd57600080fd5b505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561514157600080fd5b600460149054906101000a900460ff16151561515c57600080fd5b6000600460146101000a81548160ff021916908315150217905550565b600080600080600080935060016151958860ff16600a546155a4565b039350837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8029350600d54840193506151d38860ff16600b546155a4565b9250600e54600b54029150600c54840390506151f08184846155c0565b8403935061520684600a8860ff1603600a6155c0565b8401935061521684600c546155ec565b9350839450505050509392505050565b600082821115151561523457fe5b818303905092915050565b60008060008414156152545760009150615273565b828402905082848281151561526557fe5b0414151561526f57fe5b8091505b5092915050565b600080828481151561528857fe5b0490508091505092915050565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e8cdd0a8c8c8c8c8c600060028111156152e857fe5b8d8d8d8d6000604051602001526040518b63ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018861ffff1661ffff1681526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff16815260200184600a60200280838360005b838110156153bb5780820151818401526020810190506153a0565b505050509050018381526020018267ffffffffffffffff1667ffffffffffffffff1681526020019a5050505050505050505050602060405180830381600087803b151561540757600080fd5b6102c65a03f1151561541857600080fd5b5050506040518051905090507fbeb1fffdbea52fcb668386f7d55545fac4cb704f66674ba929c648e708f7c0208a828a8c604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018361ffff1661ffff16815260200182815260200194505050505060405180910390a1809150509998505050505050505050565b60008273ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a6dd48f846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561556a57600080fd5b6102c65a03f1151561557b57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b6000818312156155b6578290506155ba565b8190505b92915050565b60008060008386028587020391508184870201905083818115156155e057fe5b05925050509392505050565b6000818313156155fe57829050615602565b8190505b92915050565b602060405190810160405280600081525090565b6060604051908101604052806003905b600081526020019060019003908161562c5790505090565b61014060405190810160405280600a905b600060ff168152602001906001900390816156555790505090565b81548183558181151161569757818360005260206000209182019101615696919061569c565b5b505050565b6156be91905b808211156156ba5760008160009055506001016156a2565b5090565b905600a165627a7a72305820b906957436ffaf29a4bb15bad8c714054a6406ad9ff93f09ccaaa1b810318f860029

Swarm Source

bzzr://b906957436ffaf29a4bb15bad8c714054a6406ad9ff93f09ccaaa1b810318f86

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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