ETH Price: $2,628.03 (+1.05%)
Gas: 1 Gwei

Contract

0xa068345A625542fe49c299C8DF309A920A184200
 

Overview

ETH Balance

0.375282933454051609 ETH

Eth Value

$986.25 (@ $2,628.03/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set CEO204529362024-08-04 4:56:116 days ago1722747371IN
0xa068345A...20A184200
0 ETH0.000024011
Set CEO204529362024-08-04 4:56:116 days ago1722747371IN
0xa068345A...20A184200
0 ETH0.000024011
Payout204529362024-08-04 4:56:116 days ago1722747371IN
0xa068345A...20A184200
0 ETH0.000026081
Purchase204084582024-07-28 23:51:5913 days ago1722210719IN
0xa068345A...20A184200
0.01 ETH0.00008721
Transfer161402172022-12-08 13:14:23611 days ago1670505263IN
0xa068345A...20A184200
0 ETH0.0014789923.99530853
Purchase138479242021-12-21 10:10:18963 days ago1640081418IN
0xa068345A...20A184200
0.02127659 ETH0.0035381435.40940922
Purchase130993142021-08-26 6:23:101080 days ago1629958990IN
0xa068345A...20A184200
0.84042553 ETH0.00899596108.61932995
Purchase130991182021-08-26 5:37:061080 days ago1629956226IN
0xa068345A...20A184200
0.1 ETH0.0078342889.84069126
Purchase130238472021-08-14 14:34:121092 days ago1628951652IN
0xa068345A...20A184200
0.05 ETH0.0040112946
Purchase122887872021-04-22 7:57:041206 days ago1619078224IN
0xa068345A...20A184200
0.22634676 ETH0.01238871124
Purchase115634172020-12-31 17:57:501318 days ago1609437470IN
0xa068345A...20A184200
0.01 ETH0.003535150
Purchase115632992020-12-31 17:33:571318 days ago1609436037IN
0xa068345A...20A184200
0.01 ETH0.003747253
Purchase114160492020-12-09 2:43:531341 days ago1607481833IN
0xa068345A...20A184200
0.1 ETH0.0025710630.00000145
Purchase114160242020-12-09 2:39:181341 days ago1607481558IN
0xa068345A...20A184200
0.1 ETH0.0016702955
Create Crypton113884822020-12-04 20:59:471345 days ago1607115587IN
0xa068345A...20A184200
0 ETH0.002638618
Create Crypton113884302020-12-04 20:47:041345 days ago1607114824IN
0xa068345A...20A184200
0 ETH0.0026394618
Create Crypton109582102020-09-29 15:40:091411 days ago1601394009IN
0xa068345A...20A184200
0 ETH0.03416362233
Create Crypton109542532020-09-29 0:41:211412 days ago1601340081IN
0xa068345A...20A184200
0 ETH0.01880458128.26
Create Crypton109540712020-09-28 23:57:081412 days ago1601337428IN
0xa068345A...20A184200
0 ETH0.01879534128.26
Create Crypton109540652020-09-28 23:55:531412 days ago1601337353IN
0xa068345A...20A184200
0 ETH0.01880766128.26
Create Crypton109540582020-09-28 23:54:191412 days ago1601337259IN
0xa068345A...20A184200
0 ETH0.01882569128.42503976
Create Crypton109540512020-09-28 23:53:031412 days ago1601337183IN
0xa068345A...20A184200
0 ETH0.01905345130
Create Crypton109540342020-09-28 23:49:341412 days ago1601336974IN
0xa068345A...20A184200
0 ETH0.01802454123
Create Crypton109540062020-09-28 23:44:081412 days ago1601336648IN
0xa068345A...20A184200
0 ETH0.01802897123
Create Crypton109538732020-09-28 23:16:451412 days ago1601335005IN
0xa068345A...20A184200
0 ETH0.01509619103
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
138479242021-12-21 10:10:18963 days ago1640081418
0xa068345A...20A184200
0.01999999 ETH
130993142021-08-26 6:23:101080 days ago1629958990
0xa068345A...20A184200
0.78999999 ETH
122887872021-04-22 7:57:041206 days ago1619078224
0xa068345A...20A184200
0.21276595 ETH
80054932019-06-22 3:44:491876 days ago1561175089
0xa068345A...20A184200
6.20989361 ETH
73828682019-03-16 22:57:011974 days ago1552777021
0xa068345A...20A184200
0.38999999 ETH
68339652018-12-06 1:57:152075 days ago1544061435
0xa068345A...20A184200
3.00318958 ETH
68335582018-12-06 0:21:272075 days ago1544055687
0xa068345A...20A184200
0.19599999 ETH
68335442018-12-06 0:17:282075 days ago1544055448
0xa068345A...20A184200
0.19599999 ETH
68334552018-12-05 23:58:512075 days ago1544054331
0xa068345A...20A184200
1.88782832 ETH
68254112018-12-04 15:55:312076 days ago1543938931
0xa068345A...20A184200
0.04255319 ETH
67029122018-11-14 12:34:132096 days ago1542198853
0xa068345A...20A184200
0.48999999 ETH
67027922018-11-14 12:07:372096 days ago1542197257
0xa068345A...20A184200
0.09999999 ETH
67026952018-11-14 11:42:492096 days ago1542195769
0xa068345A...20A184200
0.98999999 ETH
66599492018-11-07 11:52:252103 days ago1541591545
0xa068345A...20A184200
0.21191489 ETH
66252892018-11-01 19:04:422109 days ago1541099082
0xa068345A...20A184200
0.04255319 ETH
65343602018-10-17 22:04:312124 days ago1539813871
0xa068345A...20A184200
0.38999999 ETH
64422702018-10-02 22:56:542139 days ago1538521014
0xa068345A...20A184200
0.82978723 ETH
64373182018-10-02 3:47:252139 days ago1538452045
0xa068345A...20A184200
10.53761655 ETH
64316362018-10-01 5:29:302140 days ago1538371770
0xa068345A...20A184200
0.38999999 ETH
64316072018-10-01 5:22:032140 days ago1538371323
0xa068345A...20A184200
0.38999999 ETH
64178702018-09-28 23:17:152143 days ago1538176635
0xa068345A...20A184200
0.04999999 ETH
64177552018-09-28 22:54:062143 days ago1538175246
0xa068345A...20A184200
0.08872793 ETH
64177502018-09-28 22:52:542143 days ago1538175174
0xa068345A...20A184200
0.04999999 ETH
64104582018-09-27 18:10:412144 days ago1538071841
0xa068345A...20A184200
0.36999999 ETH
64041032018-09-26 16:50:292145 days ago1537980629
0xa068345A...20A184200
0.36999999 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CryptonToken

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-07-28
*/

pragma solidity ^0.4.19; // solhint-disable-line


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

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

}

contract CryptonToken is ERC721 {

  /*** EVENTS ***/

  /// @dev The Birth event is fired whenever a new crypton comes into existence.
  event Birth(uint256 tokenId, string name, address owner, bool isProtected, uint8 category);

  /// @dev The TokenSold event is fired whenever a token is sold.
  event TokenSold(uint256 tokenId, uint256 oldPrice, uint256 newPrice, address prevOwner, address winner, string name);

  /// @dev Transfer event as defined in current draft of ERC721. 
  ///  ownership is assigned, including births.
  event Transfer(address from, address to, uint256 tokenId);

  /// @dev the PaymentTransferredToPreviousOwner event is fired when the previous owner of the Crypton is paid after a purchase.
  event PaymentTransferredToPreviousOwner(uint256 tokenId, uint256 oldPrice, uint256 newPrice, address prevOwner, address winner, string name);

  // @dev CryptonIsProtected is fired when the Crypton is protected from snatching - i.e. owner is allowed to set the selling price for the crypton
  event CryptonIsProtected(uint256 tokenId);

    // @dev The markup was changed
    event MarkupChanged(string name, uint256 newMarkup);
    
    //@dev Selling price of protected Crypton changed
    event ProtectedCryptonSellingPriceChanged(uint256 tokenId, uint256 newSellingPrice);
    
    // Owner protected their Crypton
    event OwnerProtectedCrypton(uint256 _tokenId, uint256 newSellingPrice);

    //Contract paused event
    event ContractIsPaused(bool paused);

  /*** CONSTANTS ***/

  /// @notice Name and symbol of the non fungible token, as defined in ERC721.
  string public constant NAME = "Cryptons"; // solhint-disable-line
  string public constant SYMBOL = "CRYPTON"; // solhint-disable-line

  uint256 private startingPrice = 0.1 ether;
  uint256 private defaultMarkup = 2 ether;
  uint256 private FIRST_STEP_LIMIT =  1.0 ether;
  uint16 private FIRST_STEP_MULTIPLIER = 200; // double the value
  uint16 private SECOND_STEP_MULTIPLIER = 120; // increment value by 20%
  uint16 private XPROMO_MULTIPLIER = 500; // 5 times the value
  uint16 private CRYPTON_CUT = 6; // our cut
  uint16 private NET_PRICE_PERCENT = 100 - CRYPTON_CUT; // Net price paid out after cut

  // I could have used enums - but preferered the more specific uint8 
  uint8 private constant PROMO = 1;
  uint8 private constant STANDARD = 2;
  uint8 private constant RESERVED = 7;
  uint8 private constant XPROMO = 10; // First transaction, contract sets sell price to 5x
  
  /*** STORAGE ***/

  /// @dev A mapping from crypton IDs to the address that owns them. All cryptons have
  ///  some valid owner address.
  mapping (uint256 => address) public cryptonIndexToOwner;

  mapping (uint256 => bool) public cryptonIndexToProtected;

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

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

  // @dev A mapping from CryptonIDs to the price of the token.
  mapping (uint256 => uint256) private cryptonIndexToPrice;


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

  /*** DATATYPES ***/
  struct Crypton {
    string name;
    uint8  category;
    uint256 markup;
  }

  Crypton[] private cryptons;

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

  /*** ACCESS MODIFIERS ***/
  /// @dev Access modifier for COO-only functionality
  /// @dev Access modifier for CEO-only functionality
  modifier onlyCEO() {
    require(msg.sender == ceoAddress);
    _;
  }
  
  modifier onlyCOO() {
    require(msg.sender == cooAddress);
    _;
  }

  /// Access modifier for contract owner only functionality
  modifier onlyCLevel() {
    require(
      msg.sender == ceoAddress ||
      msg.sender == cooAddress
    );
    _;
  }

    /*** 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;
        emit ContractIsPaused(paused);
    }

    /// @dev Unpauses the smart contract. Can only be called by the CEO
    /// @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 forked
        paused = false;
        emit ContractIsPaused(paused);
    }
  /*** CONSTRUCTOR ***/
  constructor() public {
    ceoAddress = msg.sender;
    cooAddress = msg.sender;
  }

  /*** PUBLIC FUNCTIONS ***/
  /// @notice Grant another address the right to transfer token via takeOwnership() and transferFrom().
  /// @param _to The address to be granted transfer approval. Pass address(0) to
  ///  clear all approvals.
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function approve(
    address _to,
    uint256 _tokenId
  ) public whenNotPaused {
    // Caller must own token.
    require(_owns(msg.sender, _tokenId));

    cryptonIndexToApproved[_tokenId] = _to;

    emit Approval(msg.sender, _to, _tokenId);
  }

  /// For querying balance of a particular account
  /// @param _owner The address for balance query
  /// @dev Required for ERC-721 compliance.
  function balanceOf(address _owner) public view returns (uint256 balance) {
    return ownershipTokenCount[_owner];
  }

  /// @dev Creates a new Crypton with the given name, startingPrice, category and an (optional) owner wallet address
  function createCrypton(
    string _name,                           //Required
    uint8 _category,                        //Required
    uint256 _startingPrice,                 // Optional - defaults to startingPrice
    uint256 _markup,                        // Optional - defaults to defaultMarkup
    address _owner                          // Optional - deafults to contract
    ) public onlyCLevel {
      address cryptonOwner = _owner;
      if (cryptonOwner == address(0)) {
        cryptonOwner = address(this);
      }
      
      if (_category == XPROMO) {    // XPROMO Cryptons - force ownership to contract
          cryptonOwner = address(this);
      }

      if (_markup <= 0) {
          _markup = defaultMarkup;
      }
        
      if (_category == PROMO) { // PROMO Cryptons - force markup to zero
        _markup = 0;  
      }

      if (_startingPrice <= 0) {
        _startingPrice = startingPrice;
      }


      bool isProtected = (_category == PROMO)?true:false; // PROMO cryptons are protected, others are not - at creation
      
      _createCrypton(_name, cryptonOwner, _startingPrice, _markup, isProtected, _category);
  }

  /// @notice Returns all the relevant information about a specific crypton.
  /// @param _tokenId The tokenId of the crypton of interest.
  function getCrypton(uint256 _tokenId) public view returns (
    string cryptonName,
    uint8 category,
    uint256 markup,
    uint256 sellingPrice,
    address owner,
    bool isProtected
  ) {
    Crypton storage crypton = cryptons[_tokenId];
    cryptonName = crypton.name;
    sellingPrice = cryptonIndexToPrice[_tokenId];
    owner = cryptonIndexToOwner[_tokenId];
    isProtected = cryptonIndexToProtected[_tokenId];
    category = crypton.category;
    markup = crypton.markup;
  }

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

  /// @dev Required for ERC-721 compliance.
  function name() public pure returns (string) {
    return NAME;
  }

  /// For querying owner of token
  /// @param _tokenId The tokenID for owner inquiry
  /// @dev Required for ERC-721 compliance.
  function ownerOf(uint256 _tokenId)
    public
    view
    returns (address owner)
  {
    owner = cryptonIndexToOwner[_tokenId];
    require(owner != address(0));
  }

  /// @dev This function withdraws the contract owner's cut.
  /// Any amount may be withdrawn as there is no user funds.
  /// User funds are immediately sent to the old owner in `purchase`
  function payout(address _to) public onlyCLevel {
    _payout(_to);
  }

  /// @dev This function allows the contract owner to adjust the selling price of a protected Crypton
  function setPriceForProtectedCrypton(uint256 _tokenId, uint256 newSellingPrice) public whenNotPaused {
    address oldOwner = cryptonIndexToOwner[_tokenId]; // owner in blockchain
    address newOwner = msg.sender;                    // person requesting change
    require(oldOwner == newOwner); // Only current owner can update the price
    require(cryptonIndexToProtected[_tokenId]); // Make sure Crypton is protected
    require(newSellingPrice > 0);  // Make sure the price is not zero
    cryptonIndexToPrice[_tokenId] = newSellingPrice;
    emit ProtectedCryptonSellingPriceChanged(_tokenId, newSellingPrice);
 }

  /// @dev This function allows the contract owner to buy protection for an unprotected that they already own
  function setProtectionForMyUnprotectedCrypton(uint256 _tokenId, uint256 newSellingPrice) public payable whenNotPaused {
    address oldOwner = cryptonIndexToOwner[_tokenId]; // owner in blockchain
    address newOwner = msg.sender;                    // person requesting change
    uint256 markup = cryptons[_tokenId].markup;
    if (cryptons[_tokenId].category != PROMO) {
      require(markup > 0); // if this is NOT a promotional crypton, the markup should be > zero
    }
    
    require(oldOwner == newOwner); // Only current owner can buy protection for existing crypton
    require(! cryptonIndexToProtected[_tokenId]); // Make sure Crypton is NOT already protected
    require(newSellingPrice > 0);  // Make sure the sellingPrice is more than zero
    require(msg.value >= markup);   // Make sure to collect the markup
    
    cryptonIndexToPrice[_tokenId] = newSellingPrice;
    cryptonIndexToProtected[_tokenId] = true;
    
    emit OwnerProtectedCrypton(_tokenId, newSellingPrice);
 }
 
  function getMarkup(uint256 _tokenId) public view returns (uint256 markup) {
    return cryptons[_tokenId].markup;
  }

  /// @dev This function allows the contract owner to adjust the markup value
  function setMarkup(uint256 _tokenId, uint256 newMarkup) public onlyCLevel {
    require(newMarkup >= 0);
    cryptons[_tokenId].markup = newMarkup;
    emit MarkupChanged(cryptons[_tokenId].name, newMarkup);
  }
    
  // Allows someone to send ether and obtain the token
  function purchase(uint256 _tokenId, uint256 newSellingPrice) public payable whenNotPaused {
    address oldOwner = cryptonIndexToOwner[_tokenId];
    address newOwner = msg.sender;
    bool isAlreadyProtected = cryptonIndexToProtected[_tokenId];
    
    uint256 sellingPrice = cryptonIndexToPrice[_tokenId];
    uint256 markup = cryptons[_tokenId].markup;
    
    if (cryptons[_tokenId].category != PROMO) {
      require(markup > 0); // if this is NOT a promotional crypton, the markup should be > zero
    }

    // Make sure token owner is not sending to self
    require(oldOwner != newOwner);

    // Safety check to prevent against an unexpected 0x0 default.
    require(_addressNotNull(newOwner));

    // Make sure sent amount is greater than or equal to the sellingPrice
    require(msg.value >= sellingPrice); // this is redundant - as we are checking this below

    if (newSellingPrice > 0) { // if we are called with a new selling price, then the buyer is paying the markup or purchasing a protected crypton
        uint256 purchasePrice = sellingPrice; //assume it is protected
        if (! cryptonIndexToProtected[_tokenId] ) { // Crypton is not protected,
            purchasePrice = sellingPrice + markup;  // apply markup
        }

        // If the Crypton is not already protected, make sure that the buyer is paying markup more than the current selling price
        // If the buyer is not paying the markup - then he cannot set the new selling price- bailout
        require(msg.value >= purchasePrice); 

        // Ok - the buyer paid the markup or the crypton was already protected.
        cryptonIndexToPrice[_tokenId] = newSellingPrice;  // Set the selling price that the buyer wants
        cryptonIndexToProtected[_tokenId] = true;         // Set the Crypton to protected
        emit CryptonIsProtected(_tokenId);                // Let the world know

    } else {
        // Compute next listing price.
        // Handle XPROMO case first...
        if (
          (oldOwner == address(this)) &&                // first transaction only`
          (cryptons[_tokenId].category == XPROMO)      // Only for XPROMO category
          ) 
        {
          cryptonIndexToPrice[_tokenId] = SafeMath.div(SafeMath.mul(sellingPrice, XPROMO_MULTIPLIER), NET_PRICE_PERCENT);            
        } else {
          if (sellingPrice < FIRST_STEP_LIMIT) {
            // first stage
            cryptonIndexToPrice[_tokenId] = SafeMath.div(SafeMath.mul(sellingPrice, FIRST_STEP_MULTIPLIER), NET_PRICE_PERCENT);
          } else {
            // second stage
            cryptonIndexToPrice[_tokenId] = SafeMath.div(SafeMath.mul(sellingPrice, SECOND_STEP_MULTIPLIER), NET_PRICE_PERCENT);
          }
        }

    }
       
    _transfer(oldOwner, newOwner, _tokenId);

    uint256 payment = uint256(SafeMath.div(SafeMath.mul(sellingPrice, NET_PRICE_PERCENT), 100));
    string storage cname = cryptons[_tokenId].name;

    bool isReservedToken = (cryptons[_tokenId].category == RESERVED);
  
    if (isReservedToken && isAlreadyProtected) {
      oldOwner.transfer(payment); //(1-CRYPTON_CUT/100)
      emit PaymentTransferredToPreviousOwner(_tokenId, sellingPrice, cryptonIndexToPrice[_tokenId], oldOwner, newOwner, cname);
      emit TokenSold(_tokenId, sellingPrice, cryptonIndexToPrice[_tokenId], oldOwner, newOwner, cname);
      return;
    }

    // Pay seller of the Crypton if they are not this contract or if this is a Reserved token
    if ((oldOwner != address(this)) && !isReservedToken ) // Not a Reserved token and not owned by the contract
    {
      oldOwner.transfer(payment); //(1-CRYPTON_CUT/100)
      emit PaymentTransferredToPreviousOwner(_tokenId, sellingPrice, cryptonIndexToPrice[_tokenId], oldOwner, newOwner, cname);
    }

    emit TokenSold(_tokenId, sellingPrice, cryptonIndexToPrice[_tokenId], oldOwner, newOwner, cname);

  }

  function priceOf(uint256 _tokenId) public view returns (uint256 price) {
    return cryptonIndexToPrice[_tokenId];
  }

  /// @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) public onlyCEO {
    require(_newCEO != address(0));

    ceoAddress = _newCEO;
  }

  /// @dev Assigns a new address to act as the COO. Only available to the current COO.
  /// @param _newCOO The address of the new COO
  function setCOO(address _newCOO) public onlyCEO {
    require(_newCOO != address(0));

    cooAddress = _newCOO;
  }

  /// @dev Required for ERC-721 compliance.
  function symbol() public pure returns (string) {
    return SYMBOL;
  }

  /// @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.
  /// @dev Required for ERC-721 compliance.
  function takeOwnership(uint256 _tokenId) public whenNotPaused {
    address newOwner = msg.sender;
    address oldOwner = cryptonIndexToOwner[_tokenId];

    // Safety check to prevent against an unexpected 0x0 default.
    require(_addressNotNull(newOwner));

    // Making sure transfer is approved
    require(_approved(newOwner, _tokenId));

    _transfer(oldOwner, newOwner, _tokenId);
  }

  /// @param _owner The owner whose Cryptons we are interested in.
  /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly
  ///  expensive (it walks the entire Cryptons array looking for cryptons belonging to owner),
  ///  but it also returns a dynamic array, which is only supported for web3 calls, and
  ///  not contract-to-contract calls.
  function tokensOfOwner(address _owner) public view returns(uint256[] ownerTokens) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
        // Return an empty array
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 totalCryptons = totalSupply();
      uint256 resultIndex = 0;

      uint256 cryptonId;
      for (cryptonId = 0; cryptonId <= totalCryptons; cryptonId++) {
        if (cryptonIndexToOwner[cryptonId] == _owner) {
          result[resultIndex] = cryptonId;
          resultIndex++;
        }
      }
      return result;
    }
  }

  /// For querying totalSupply of token
  /// @dev Required for ERC-721 compliance.
  function totalSupply() public view returns (uint256 total) {
    return cryptons.length;
  }

  /// Owner initates the transfer of the token to another account
  /// @param _to The address for the token to be transferred to.
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function transfer(
    address _to,
    uint256 _tokenId
  ) public whenNotPaused {
    require(_owns(msg.sender, _tokenId));
    require(_addressNotNull(_to));

    _transfer(msg.sender, _to, _tokenId);
  }

  /// Third-party initiates transfer of token from address _from to address _to
  /// @param _from The address for the token to be transferred from.
  /// @param _to The address for the token to be transferred to.
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  ) public whenNotPaused {
    require(_owns(_from, _tokenId));
    require(_approved(_to, _tokenId));
    require(_addressNotNull(_to));

    _transfer(_from, _to, _tokenId);
  }

  /*** PRIVATE FUNCTIONS ***/
  /// Safety check on _to address to prevent against an unexpected 0x0 default.
  function _addressNotNull(address _to) private pure returns (bool) {
    return _to != address(0);
  }

  /// For checking approval of transfer for address _to
  function _approved(address _to, uint256 _tokenId) private view returns (bool) {
    return cryptonIndexToApproved[_tokenId] == _to;
  }

  /// For creating Crypton
  function _createCrypton(string _name, address _owner, uint256 _price, uint256 _markup, bool _isProtected, uint8 _category) private {
    Crypton memory _crypton = Crypton({
      name: _name,
      category: _category,
      markup: _markup
    });
    uint256 newCryptonId = cryptons.push(_crypton) - 1;

    // It's probably never going to happen, 4 billion tokens are A LOT, but
    // let's just be 100% sure we never let this happen.
    require(newCryptonId == uint256(uint32(newCryptonId)));

    emit Birth(newCryptonId, _name, _owner, _isProtected, _category);

    cryptonIndexToPrice[newCryptonId] = _price;
    
    cryptonIndexToProtected[newCryptonId] = _isProtected; // _isProtected is true for promo cryptons - false for others.

    // This will assign ownership, and also emit the Transfer event as
    // per ERC721 draft
    _transfer(address(0), _owner, newCryptonId);
  }

  /// Check for token ownership
  function _owns(address claimant, uint256 _tokenId) private view returns (bool) {
    return claimant == cryptonIndexToOwner[_tokenId];
  }

  /// For paying out balance on contract
  function _payout(address _to) private {
    address myAddress = this;
    if (_to == address(0)) {
      ceoAddress.transfer(myAddress.balance);
    } else {
      _to.transfer(myAddress.balance);
    }
  }

  /// @dev Assigns ownership of a specific Crypton to an address.
  function _transfer(address _from, address _to, uint256 _tokenId) private {
    // Since the number of cryptons is capped to 2^32 we can't overflow this
    ownershipTokenCount[_to]++;
    //transfer ownership
    cryptonIndexToOwner[_tokenId] = _to;

    // When creating new cryptons _from is 0x0, but we can't account that address.
    if (_from != address(0)) {
      ownershipTokenCount[_from]--;
      // clear any previously approved ownership exchange
      delete cryptonIndexToApproved[_tokenId];
    }

    // Emit the transfer event.
    emit Transfer(_from, _to, _tokenId);
  }

//various getter/setter methods

  function setFIRST_STEP_LIMIT(uint256 newLimit) public onlyCLevel {
    require(newLimit > 0 && newLimit < 100 ether);
    FIRST_STEP_LIMIT = newLimit;
  }
  function getFIRST_STEP_LIMIT() public view returns (uint256 value) {
    return FIRST_STEP_LIMIT;
  }

  function setFIRST_STEP_MULTIPLIER(uint16 newValue) public onlyCLevel {
    require(newValue >= 110 && newValue <= 200);
    FIRST_STEP_MULTIPLIER = newValue;
  }
  function getFIRST_STEP_MULTIPLIER() public view returns (uint16 value) {
    return FIRST_STEP_MULTIPLIER;
  }

  function setSECOND_STEP_MULTIPLIER(uint16 newValue) public onlyCLevel {
    require(newValue >= 110 && newValue <= 200);
    SECOND_STEP_MULTIPLIER = newValue;
  }
  function getSECOND_STEP_MULTIPLIER() public view returns (uint16 value) {
    return SECOND_STEP_MULTIPLIER;
  }

  function setXPROMO_MULTIPLIER(uint16 newValue) public onlyCLevel {
    require(newValue >= 100 && newValue <= 10000); // between 0 and 100x
    XPROMO_MULTIPLIER = newValue;
  }
  function getXPROMO_MULTIPLIER() public view returns (uint16 value) {
    return XPROMO_MULTIPLIER;
  }

  function setCRYPTON_CUT(uint16 newValue) public onlyCLevel {
    require(newValue > 0 && newValue < 10);
    CRYPTON_CUT = newValue;
  }
  function getCRYPTON_CUT() public view returns (uint16 value) {
    return CRYPTON_CUT;
  }

}

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;
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"getCRYPTON_CUT","outputs":[{"name":"value","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","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":"","type":"uint256"}],"name":"cryptonIndexToProtected","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"payout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"newSellingPrice","type":"uint256"}],"name":"setPriceForProtectedCrypton","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"total","type":"uint256"}],"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":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newValue","type":"uint16"}],"name":"setFIRST_STEP_MULTIPLIER","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"cryptonIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newValue","type":"uint16"}],"name":"setSECOND_STEP_MULTIPLIER","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newLimit","type":"uint256"}],"name":"setFIRST_STEP_LIMIT","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"newSellingPrice","type":"uint256"}],"name":"purchase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFIRST_STEP_MULTIPLIER","outputs":[{"name":"value","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"ownerTokens","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getCrypton","outputs":[{"name":"cryptonName","type":"string"},{"name":"category","type":"uint8"},{"name":"markup","type":"uint256"},{"name":"sellingPrice","type":"uint256"},{"name":"owner","type":"address"},{"name":"isProtected","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newValue","type":"uint16"}],"name":"setCRYPTON_CUT","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"cryptonIndexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFIRST_STEP_LIMIT","outputs":[{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"newSellingPrice","type":"uint256"}],"name":"setProtectionForMyUnprotectedCrypton","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getSECOND_STEP_MULTIPLIER","outputs":[{"name":"value","type":"uint16"}],"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":"_tokenId","type":"uint256"},{"name":"newMarkup","type":"uint256"}],"name":"setMarkup","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newValue","type":"uint16"}],"name":"setXPROMO_MULTIPLIER","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"takeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"priceOf","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getXPROMO_MULTIPLIER","outputs":[{"name":"value","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_category","type":"uint8"},{"name":"_startingPrice","type":"uint256"},{"name":"_markup","type":"uint256"},{"name":"_owner","type":"address"}],"name":"createCrypton","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getMarkup","outputs":[{"name":"markup","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SYMBOL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"isProtected","type":"bool"},{"indexed":false,"name":"category","type":"uint8"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"oldPrice","type":"uint256"},{"indexed":false,"name":"newPrice","type":"uint256"},{"indexed":false,"name":"prevOwner","type":"address"},{"indexed":false,"name":"winner","type":"address"},{"indexed":false,"name":"name","type":"string"}],"name":"TokenSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"oldPrice","type":"uint256"},{"indexed":false,"name":"newPrice","type":"uint256"},{"indexed":false,"name":"prevOwner","type":"address"},{"indexed":false,"name":"winner","type":"address"},{"indexed":false,"name":"name","type":"string"}],"name":"PaymentTransferredToPreviousOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"CryptonIsProtected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"newMarkup","type":"uint256"}],"name":"MarkupChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"newSellingPrice","type":"uint256"}],"name":"ProtectedCryptonSellingPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_tokenId","type":"uint256"},{"indexed":false,"name":"newSellingPrice","type":"uint256"}],"name":"OwnerProtectedCrypton","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paused","type":"bool"}],"name":"ContractIsPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"}]

608060405267016345785d8a0000600055671bc16d674ec80000600155670de0b6b3a764000060025560c8600360006101000a81548161ffff021916908361ffff1602179055506078600360026101000a81548161ffff021916908361ffff1602179055506101f4600360046101000a81548161ffff021916908361ffff1602179055506006600360066101000a81548161ffff021916908361ffff160217905550600360069054906101000a900461ffff16606403600360086101000a81548161ffff021916908361ffff1602179055506000600c60006101000a81548160ff0219169083151502179055503480156100f857600080fd5b5033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506138ae8061018a6000396000f300608060405260043610610204576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630544587f1461020957806306fdde031461023c578063095ea7b3146102cc5780630a0f8168146103195780630a894ccf146103705780630b7e9c44146103b55780631051db34146103f857806310c067d21461042757806318160ddd1461045e57806323b872dd1461048957806327d7874c146104f65780632ba73c151461053957806332ce92cb1461057c5780633f4ba83a146105ad5780633f87e765146105c45780634bafa437146106315780635c975abb146106625780636352211e146106915780636c34c97a146106fe57806370876c981461072b57806370a08231146107555780638238cc8f146107ac5780638456cb59146107df5780638462151c146107f657806386d35ed91461088e5780638878db7f1461098d5780639146de22146109be57806391e6d02814610a2b578063939c23b614610a5657806395d89b4114610a80578063a39e114914610b10578063a3f4df7e14610b43578063a75274e914610bd3578063a9059cbb14610c0a578063b047fb5014610c57578063b1ef2e9714610cae578063b2e6ceeb14610cdf578063b9186d7d14610d0c578063c391d58114610d4d578063cb57e4a614610d80578063dce2b4c114610e2a578063f76f8d7814610e6b575b600080fd5b34801561021557600080fd5b5061021e610efb565b604051808261ffff1661ffff16815260200191505060405180910390f35b34801561024857600080fd5b50610251610f13565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610291578082015181840152602081019050610276565b50505050905090810190601f1680156102be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102d857600080fd5b50610317600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f50565b005b34801561032557600080fd5b5061032e61103c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561037c57600080fd5b5061039b60048036038101908080359060200190929190505050611062565b604051808215151515815260200191505060405180910390f35b3480156103c157600080fd5b506103f6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611082565b005b34801561040457600080fd5b5061040d611142565b604051808215151515815260200191505060405180910390f35b34801561043357600080fd5b5061045c600480360381019080803590602001909291908035906020019092919050505061114b565b005b34801561046a57600080fd5b50610473611275565b6040518082815260200191505060405180910390f35b34801561049557600080fd5b506104f4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611282565b005b34801561050257600080fd5b50610537600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ec565b005b34801561054557600080fd5b5061057a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113c8565b005b34801561058857600080fd5b506105ab600480360381019080803561ffff1690602001909291905050506114a4565b005b3480156105b957600080fd5b506105c261159d565b005b3480156105d057600080fd5b506105ef6004803603810190808035906020019092919050505061167b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561063d57600080fd5b50610660600480360381019080803561ffff1690602001909291905050506116ae565b005b34801561066e57600080fd5b506106776117a7565b604051808215151515815260200191505060405180910390f35b34801561069d57600080fd5b506106bc600480360381019080803590602001909291905050506117ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561070a57600080fd5b5061072960048036038101908080359060200190929190505050611833565b005b6107536004803603810190808035906020019092919080359060200190929190505050611914565b005b34801561076157600080fd5b50610796600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612374565b6040518082815260200191505060405180910390f35b3480156107b857600080fd5b506107c16123bd565b604051808261ffff1661ffff16815260200191505060405180910390f35b3480156107eb57600080fd5b506107f46123d5565b005b34801561080257600080fd5b50610837600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061250c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561087a57808201518184015260208101905061085f565b505050509050019250505060405180910390f35b34801561089a57600080fd5b506108b960048036038101908080359060200190929190505050612659565b60405180806020018760ff1660ff1681526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183151515158152602001828103825288818151815260200191508051906020019080838360005b8381101561094d578082015181840152602081019050610932565b50505050905090810190601f16801561097a5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b34801561099957600080fd5b506109bc600480360381019080803561ffff1690602001909291905050506127b6565b005b3480156109ca57600080fd5b506109e9600480360381019080803590602001909291905050506128ad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a3757600080fd5b50610a406128e0565b6040518082815260200191505060405180910390f35b610a7e60048036038101908080359060200190929190803590602001909291905050506128ea565b005b348015610a8c57600080fd5b50610a95612ac3565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ad5578082015181840152602081019050610aba565b50505050905090810190601f168015610b025780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b1c57600080fd5b50610b25612b00565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610b4f57600080fd5b50610b58612b18565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b98578082015181840152602081019050610b7d565b50505050905090810190601f168015610bc55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610bdf57600080fd5b50610c086004803603810190808035906020019092919080359060200190929190505050612b51565b005b348015610c1657600080fd5b50610c55600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612d1e565b005b348015610c6357600080fd5b50610c6c612d72565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cba57600080fd5b50610cdd600480360381019080803561ffff169060200190929190505050612d98565b005b348015610ceb57600080fd5b50610d0a60048036038101908080359060200190929190505050612e92565b005b348015610d1857600080fd5b50610d3760048036038101908080359060200190929190505050612f23565b6040518082815260200191505060405180910390f35b348015610d5957600080fd5b50610d62612f40565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610d8c57600080fd5b50610e28600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803560ff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f58565b005b348015610e3657600080fd5b50610e55600480360381019080803590602001909291905050506130c3565b6040518082815260200191505060405180910390f35b348015610e7757600080fd5b50610e806130ed565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ec0578082015181840152602081019050610ea5565b50505050905090810190601f168015610eed5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000600360069054906101000a900461ffff16905090565b60606040805190810160405280600881526020017f43727970746f6e73000000000000000000000000000000000000000000000000815250905090565b600c60009054906101000a900460ff16151515610f6c57600080fd5b610f763382613126565b1515610f8157600080fd5b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60056020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061112b5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561113657600080fd5b61113f81613192565b50565b60006001905090565b600080600c60009054906101000a900460ff1615151561116a57600080fd5b6004600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691503390508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415156111dd57600080fd5b6005600085815260200190815260200160002060009054906101000a900460ff16151561120957600080fd5b60008311151561121857600080fd5b8260086000868152602001908152602001600020819055507fb72836ccf2ad525816159b7f5cb1f7f0db5801fe2e37413e8c3522d52f69bb3a8484604051808381526020018281526020019250505060405180910390a150505050565b6000600b80549050905090565b600c60009054906101000a900460ff1615151561129e57600080fd5b6112a88382613126565b15156112b357600080fd5b6112bd82826132b4565b15156112c857600080fd5b6112d182613320565b15156112dc57600080fd5b6112e7838383613359565b505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561134857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561138457600080fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561142457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561146057600080fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061154d5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561155857600080fd5b606e8161ffff1610158015611572575060c88161ffff1611155b151561157d57600080fd5b80600360006101000a81548161ffff021916908361ffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115f957600080fd5b600c60009054906101000a900460ff16151561161457600080fd5b6000600c60006101000a81548160ff0219169083151502179055507f8a366fcf0cdff71fc1946279a88cbb2845d8628abc79fc766e3593ff82154d05600c60009054906101000a900460ff16604051808215151515815260200191505060405180910390a1565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117575750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561176257600080fd5b606e8161ffff161015801561177c575060c88161ffff1611155b151561178757600080fd5b80600360026101000a81548161ffff021916908361ffff16021790555050565b600c60009054906101000a900460ff1681565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561182e57600080fd5b919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118dc5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156118e757600080fd5b6000811180156118ff575068056bc75e2d6310000081105b151561190a57600080fd5b8060028190555050565b6000806000806000806000806000600c60009054906101000a900460ff1615151561193e57600080fd5b600460008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169850339750600560008c815260200190815260200160002060009054906101000a900460ff169650600860008c8152602001908152602001600020549550600b8b8154811015156119bf57fe5b9060005260206000209060030201600201549450600160ff16600b8c8154811015156119e757fe5b906000526020600020906003020160010160009054906101000a900460ff1660ff16141515611a2057600085111515611a1f57600080fd5b5b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614151515611a5b57600080fd5b611a6488613320565b1515611a6f57600080fd5b853410151515611a7e57600080fd5b60008a1115611b4657859350600560008c815260200190815260200160002060009054906101000a900460ff161515611ab75784860193505b833410151515611ac657600080fd5b89600860008d8152602001908152602001600020819055506001600560008d815260200190815260200160002060006101000a81548160ff0219169083151502179055507f8ac31d6bc386484c55b1494065295bc34f2767e63fad49c4ba51a9c5a91f56278b6040518082815260200191505060405180910390a1611cc6565b3073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16148015611bb45750600a60ff16600b8c815481101515611b9057fe5b906000526020600020906003020160010160009054906101000a900460ff1660ff16145b15611c1057611bf4611bda87600360049054906101000a900461ffff1661ffff1661355b565b600360089054906101000a900461ffff1661ffff16613596565b600860008d815260200190815260200160002081905550611cc5565b600254861015611c7157611c55611c3b87600360009054906101000a900461ffff1661ffff1661355b565b600360089054906101000a900461ffff1661ffff16613596565b600860008d815260200190815260200160002081905550611cc4565b611cac611c9287600360029054906101000a900461ffff1661ffff1661355b565b600360089054906101000a900461ffff1661ffff16613596565b600860008d8152602001908152602001600020819055505b5b5b611cd189898d613359565b611cf9611cf287600360089054906101000a900461ffff1661ffff1661355b565b6064613596565b9250600b8b815481101515611d0a57fe5b90600052602060002090600302016000019150600760ff16600b8c815481101515611d3157fe5b906000526020600020906003020160010160009054906101000a900460ff1660ff16149050808015611d605750865b15612048578873ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611dab573d6000803e3d6000fd5b507f4ddda4c9be35186c9d1b28178302335ff10e50bc7e15d8ededc33e4857aa82b98b87600860008f8152602001908152602001600020548c8c87604051808781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015611ee55780601f10611eba57610100808354040283529160200191611ee5565b820191906000526020600020905b815481529060010190602001808311611ec857829003601f168201915b505097505050505050505060405180910390a17e8201e7bcbf010c2c07de59d6e97cb7e3cf67a46125c49cbc89b9d2cde1f48f8b87600860008f8152602001908152602001600020548c8c87604051808781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156120305780601f1061200557610100808354040283529160200191612030565b820191906000526020600020905b81548152906001019060200180831161201357829003601f168201915b505097505050505050505060405180910390a1612367565b3073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614158015612082575080155b1561221b578873ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156120cd573d6000803e3d6000fd5b507f4ddda4c9be35186c9d1b28178302335ff10e50bc7e15d8ededc33e4857aa82b98b87600860008f8152602001908152602001600020548c8c87604051808781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156122075780601f106121dc57610100808354040283529160200191612207565b820191906000526020600020905b8154815290600101906020018083116121ea57829003601f168201915b505097505050505050505060405180910390a15b7e8201e7bcbf010c2c07de59d6e97cb7e3cf67a46125c49cbc89b9d2cde1f48f8b87600860008f8152602001908152602001600020548c8c87604051808781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156123535780601f1061232857610100808354040283529160200191612353565b820191906000526020600020905b81548152906001019060200180831161233657829003601f168201915b505097505050505050505060405180910390a15b5050505050505050505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360009054906101000a900461ffff16905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061247e5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561248957600080fd5b600c60009054906101000a900460ff161515156124a557600080fd5b6001600c60006101000a81548160ff0219169083151502179055507f8a366fcf0cdff71fc1946279a88cbb2845d8628abc79fc766e3593ff82154d05600c60009054906101000a900460ff16604051808215151515815260200191505060405180910390a1565b606060006060600080600061252087612374565b9450600085141561256357600060405190808252806020026020018201604052801561255b5781602001602082028038833980820191505090505b50955061264f565b846040519080825280602002602001820160405280156125925781602001602082028038833980820191505090505b50935061259d611275565b925060009150600090505b828111151561264b578673ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561263e5780848381518110151561262757fe5b906020019060200201818152505081806001019250505b80806001019150506125a8565b8395505b5050505050919050565b6060600080600080600080600b8881548110151561267357fe5b90600052602060002090600302019050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561271b5780601f106126f05761010080835404028352916020019161271b565b820191906000526020600020905b8154815290600101906020018083116126fe57829003601f168201915b50505050509650600860008981526020019081526020016000205493506004600089815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506005600089815260200190815260200160002060009054906101000a900460ff1691508060010160009054906101000a900460ff169550806002015494505091939550919395565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061285f5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561286a57600080fd5b60008161ffff161180156128825750600a8161ffff16105b151561288d57600080fd5b80600360066101000a81548161ffff021916908361ffff16021790555050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b6000806000600c60009054906101000a900460ff1615151561290b57600080fd5b6004600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250339150600b8581548110151561295357fe5b9060005260206000209060030201600201549050600160ff16600b8681548110151561297b57fe5b906000526020600020906003020160010160009054906101000a900460ff1660ff161415156129b4576000811115156129b357600080fd5b5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415156129ee57600080fd5b6005600086815260200190815260200160002060009054906101000a900460ff16151515612a1b57600080fd5b600084111515612a2a57600080fd5b803410151515612a3957600080fd5b83600860008781526020019081526020016000208190555060016005600087815260200190815260200160002060006101000a81548160ff0219169083151502179055507f17b4a6d9d7d8cb27823e77423d56dbc53899e4eb7fbebded879e7ac5d4fce5168585604051808381526020018281526020019250505060405180910390a15050505050565b60606040805190810160405280600781526020017f43525950544f4e00000000000000000000000000000000000000000000000000815250905090565b6000600360029054906101000a900461ffff16905090565b6040805190810160405280600881526020017f43727970746f6e7300000000000000000000000000000000000000000000000081525081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612bfa5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612c0557600080fd5b60008110151515612c1557600080fd5b80600b83815481101515612c2557fe5b9060005260206000209060030201600201819055507f5e941ef1dc4cf6163396c106a275903c63323b0a0303061165222fc3662e750d600b83815481101515612c6a57fe5b9060005260206000209060030201600001826040518080602001838152602001828103825284818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612d0b5780601f10612ce057610100808354040283529160200191612d0b565b820191906000526020600020905b815481529060010190602001808311612cee57829003601f168201915b5050935050505060405180910390a15050565b600c60009054906101000a900460ff16151515612d3a57600080fd5b612d443382613126565b1515612d4f57600080fd5b612d5882613320565b1515612d6357600080fd5b612d6e338383613359565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612e415750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612e4c57600080fd5b60648161ffff1610158015612e6757506127108161ffff1611155b1515612e7257600080fd5b80600360046101000a81548161ffff021916908361ffff16021790555050565b600080600c60009054906101000a900460ff16151515612eb157600080fd5b3391506004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612ef382613320565b1515612efe57600080fd5b612f0882846132b4565b1515612f1357600080fd5b612f1e818385613359565b505050565b600060086000838152602001908152602001600020549050919050565b6000600360049054906101000a900461ffff16905090565b600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806130045750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561300f57600080fd5b829150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561304b573091505b600a60ff168660ff16141561305e573091505b60008411151561306e5760015493505b600160ff168660ff16141561308257600093505b6000851115156130925760005494505b600160ff168660ff16146130a75760006130aa565b60015b90506130ba87838787858b6135b1565b50505050505050565b6000600b828154811015156130d457fe5b9060005260206000209060030201600201549050919050565b6040805190810160405280600781526020017f43525950544f4e0000000000000000000000000000000000000000000000000081525081565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614905092915050565b6000309050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561325157600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8273ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561324b573d6000803e3d6000fd5b506132b0565b8173ffffffffffffffffffffffffffffffffffffffff166108fc8273ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156132ae573d6000803e3d6000fd5b505b5050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415156134b757600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001900391905055506007600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000806000841415613570576000915061358f565b828402905082848281151561358157fe5b0414151561358b57fe5b8091505b5092915050565b60008082848115156135a457fe5b0490508091505092915050565b6135b96137b8565b60006060604051908101604052808981526020018460ff1681526020018681525091506001600b839080600181540180825580915050906001820390600052602060002090600302016000909192909190915060008201518160000190805190602001906136289291906137dd565b5060208201518160010160006101000a81548160ff021916908360ff1602179055506040820151816002015550500390508063ffffffff168114151561366d57600080fd5b7fa62aee79defc1345b836c482cd6dd1c3f5faf46f0ed5080a6b00607e63347ae3818989878760405180868152602001806020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001841515151581526020018360ff1660ff168152602001828103825286818151815260200191508051906020019080838360005b83811015613721578082015181840152602081019050613706565b50505050905090810190601f16801561374e5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1856008600083815260200190815260200160002081905550836005600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506137ae60008883613359565b5050505050505050565b60606040519081016040528060608152602001600060ff168152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061381e57805160ff191683800117855561384c565b8280016001018555821561384c579182015b8281111561384b578251825591602001919060010190613830565b5b509050613859919061385d565b5090565b61387f91905b8082111561387b576000816000905550600101613863565b5090565b905600a165627a7a723058200c81aab5fa2e5515f88fcd45621331f17b869063ec6310e598a52fe6faec62cf0029

Deployed Bytecode

0x608060405260043610610204576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630544587f1461020957806306fdde031461023c578063095ea7b3146102cc5780630a0f8168146103195780630a894ccf146103705780630b7e9c44146103b55780631051db34146103f857806310c067d21461042757806318160ddd1461045e57806323b872dd1461048957806327d7874c146104f65780632ba73c151461053957806332ce92cb1461057c5780633f4ba83a146105ad5780633f87e765146105c45780634bafa437146106315780635c975abb146106625780636352211e146106915780636c34c97a146106fe57806370876c981461072b57806370a08231146107555780638238cc8f146107ac5780638456cb59146107df5780638462151c146107f657806386d35ed91461088e5780638878db7f1461098d5780639146de22146109be57806391e6d02814610a2b578063939c23b614610a5657806395d89b4114610a80578063a39e114914610b10578063a3f4df7e14610b43578063a75274e914610bd3578063a9059cbb14610c0a578063b047fb5014610c57578063b1ef2e9714610cae578063b2e6ceeb14610cdf578063b9186d7d14610d0c578063c391d58114610d4d578063cb57e4a614610d80578063dce2b4c114610e2a578063f76f8d7814610e6b575b600080fd5b34801561021557600080fd5b5061021e610efb565b604051808261ffff1661ffff16815260200191505060405180910390f35b34801561024857600080fd5b50610251610f13565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610291578082015181840152602081019050610276565b50505050905090810190601f1680156102be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102d857600080fd5b50610317600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f50565b005b34801561032557600080fd5b5061032e61103c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561037c57600080fd5b5061039b60048036038101908080359060200190929190505050611062565b604051808215151515815260200191505060405180910390f35b3480156103c157600080fd5b506103f6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611082565b005b34801561040457600080fd5b5061040d611142565b604051808215151515815260200191505060405180910390f35b34801561043357600080fd5b5061045c600480360381019080803590602001909291908035906020019092919050505061114b565b005b34801561046a57600080fd5b50610473611275565b6040518082815260200191505060405180910390f35b34801561049557600080fd5b506104f4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611282565b005b34801561050257600080fd5b50610537600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ec565b005b34801561054557600080fd5b5061057a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113c8565b005b34801561058857600080fd5b506105ab600480360381019080803561ffff1690602001909291905050506114a4565b005b3480156105b957600080fd5b506105c261159d565b005b3480156105d057600080fd5b506105ef6004803603810190808035906020019092919050505061167b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561063d57600080fd5b50610660600480360381019080803561ffff1690602001909291905050506116ae565b005b34801561066e57600080fd5b506106776117a7565b604051808215151515815260200191505060405180910390f35b34801561069d57600080fd5b506106bc600480360381019080803590602001909291905050506117ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561070a57600080fd5b5061072960048036038101908080359060200190929190505050611833565b005b6107536004803603810190808035906020019092919080359060200190929190505050611914565b005b34801561076157600080fd5b50610796600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612374565b6040518082815260200191505060405180910390f35b3480156107b857600080fd5b506107c16123bd565b604051808261ffff1661ffff16815260200191505060405180910390f35b3480156107eb57600080fd5b506107f46123d5565b005b34801561080257600080fd5b50610837600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061250c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561087a57808201518184015260208101905061085f565b505050509050019250505060405180910390f35b34801561089a57600080fd5b506108b960048036038101908080359060200190929190505050612659565b60405180806020018760ff1660ff1681526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183151515158152602001828103825288818151815260200191508051906020019080838360005b8381101561094d578082015181840152602081019050610932565b50505050905090810190601f16801561097a5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b34801561099957600080fd5b506109bc600480360381019080803561ffff1690602001909291905050506127b6565b005b3480156109ca57600080fd5b506109e9600480360381019080803590602001909291905050506128ad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a3757600080fd5b50610a406128e0565b6040518082815260200191505060405180910390f35b610a7e60048036038101908080359060200190929190803590602001909291905050506128ea565b005b348015610a8c57600080fd5b50610a95612ac3565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ad5578082015181840152602081019050610aba565b50505050905090810190601f168015610b025780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b1c57600080fd5b50610b25612b00565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610b4f57600080fd5b50610b58612b18565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b98578082015181840152602081019050610b7d565b50505050905090810190601f168015610bc55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610bdf57600080fd5b50610c086004803603810190808035906020019092919080359060200190929190505050612b51565b005b348015610c1657600080fd5b50610c55600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612d1e565b005b348015610c6357600080fd5b50610c6c612d72565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cba57600080fd5b50610cdd600480360381019080803561ffff169060200190929190505050612d98565b005b348015610ceb57600080fd5b50610d0a60048036038101908080359060200190929190505050612e92565b005b348015610d1857600080fd5b50610d3760048036038101908080359060200190929190505050612f23565b6040518082815260200191505060405180910390f35b348015610d5957600080fd5b50610d62612f40565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610d8c57600080fd5b50610e28600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803560ff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f58565b005b348015610e3657600080fd5b50610e55600480360381019080803590602001909291905050506130c3565b6040518082815260200191505060405180910390f35b348015610e7757600080fd5b50610e806130ed565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ec0578082015181840152602081019050610ea5565b50505050905090810190601f168015610eed5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000600360069054906101000a900461ffff16905090565b60606040805190810160405280600881526020017f43727970746f6e73000000000000000000000000000000000000000000000000815250905090565b600c60009054906101000a900460ff16151515610f6c57600080fd5b610f763382613126565b1515610f8157600080fd5b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60056020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061112b5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561113657600080fd5b61113f81613192565b50565b60006001905090565b600080600c60009054906101000a900460ff1615151561116a57600080fd5b6004600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691503390508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415156111dd57600080fd5b6005600085815260200190815260200160002060009054906101000a900460ff16151561120957600080fd5b60008311151561121857600080fd5b8260086000868152602001908152602001600020819055507fb72836ccf2ad525816159b7f5cb1f7f0db5801fe2e37413e8c3522d52f69bb3a8484604051808381526020018281526020019250505060405180910390a150505050565b6000600b80549050905090565b600c60009054906101000a900460ff1615151561129e57600080fd5b6112a88382613126565b15156112b357600080fd5b6112bd82826132b4565b15156112c857600080fd5b6112d182613320565b15156112dc57600080fd5b6112e7838383613359565b505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561134857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561138457600080fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561142457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561146057600080fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061154d5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561155857600080fd5b606e8161ffff1610158015611572575060c88161ffff1611155b151561157d57600080fd5b80600360006101000a81548161ffff021916908361ffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115f957600080fd5b600c60009054906101000a900460ff16151561161457600080fd5b6000600c60006101000a81548160ff0219169083151502179055507f8a366fcf0cdff71fc1946279a88cbb2845d8628abc79fc766e3593ff82154d05600c60009054906101000a900460ff16604051808215151515815260200191505060405180910390a1565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117575750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561176257600080fd5b606e8161ffff161015801561177c575060c88161ffff1611155b151561178757600080fd5b80600360026101000a81548161ffff021916908361ffff16021790555050565b600c60009054906101000a900460ff1681565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561182e57600080fd5b919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118dc5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156118e757600080fd5b6000811180156118ff575068056bc75e2d6310000081105b151561190a57600080fd5b8060028190555050565b6000806000806000806000806000600c60009054906101000a900460ff1615151561193e57600080fd5b600460008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169850339750600560008c815260200190815260200160002060009054906101000a900460ff169650600860008c8152602001908152602001600020549550600b8b8154811015156119bf57fe5b9060005260206000209060030201600201549450600160ff16600b8c8154811015156119e757fe5b906000526020600020906003020160010160009054906101000a900460ff1660ff16141515611a2057600085111515611a1f57600080fd5b5b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614151515611a5b57600080fd5b611a6488613320565b1515611a6f57600080fd5b853410151515611a7e57600080fd5b60008a1115611b4657859350600560008c815260200190815260200160002060009054906101000a900460ff161515611ab75784860193505b833410151515611ac657600080fd5b89600860008d8152602001908152602001600020819055506001600560008d815260200190815260200160002060006101000a81548160ff0219169083151502179055507f8ac31d6bc386484c55b1494065295bc34f2767e63fad49c4ba51a9c5a91f56278b6040518082815260200191505060405180910390a1611cc6565b3073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16148015611bb45750600a60ff16600b8c815481101515611b9057fe5b906000526020600020906003020160010160009054906101000a900460ff1660ff16145b15611c1057611bf4611bda87600360049054906101000a900461ffff1661ffff1661355b565b600360089054906101000a900461ffff1661ffff16613596565b600860008d815260200190815260200160002081905550611cc5565b600254861015611c7157611c55611c3b87600360009054906101000a900461ffff1661ffff1661355b565b600360089054906101000a900461ffff1661ffff16613596565b600860008d815260200190815260200160002081905550611cc4565b611cac611c9287600360029054906101000a900461ffff1661ffff1661355b565b600360089054906101000a900461ffff1661ffff16613596565b600860008d8152602001908152602001600020819055505b5b5b611cd189898d613359565b611cf9611cf287600360089054906101000a900461ffff1661ffff1661355b565b6064613596565b9250600b8b815481101515611d0a57fe5b90600052602060002090600302016000019150600760ff16600b8c815481101515611d3157fe5b906000526020600020906003020160010160009054906101000a900460ff1660ff16149050808015611d605750865b15612048578873ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611dab573d6000803e3d6000fd5b507f4ddda4c9be35186c9d1b28178302335ff10e50bc7e15d8ededc33e4857aa82b98b87600860008f8152602001908152602001600020548c8c87604051808781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015611ee55780601f10611eba57610100808354040283529160200191611ee5565b820191906000526020600020905b815481529060010190602001808311611ec857829003601f168201915b505097505050505050505060405180910390a17e8201e7bcbf010c2c07de59d6e97cb7e3cf67a46125c49cbc89b9d2cde1f48f8b87600860008f8152602001908152602001600020548c8c87604051808781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156120305780601f1061200557610100808354040283529160200191612030565b820191906000526020600020905b81548152906001019060200180831161201357829003601f168201915b505097505050505050505060405180910390a1612367565b3073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614158015612082575080155b1561221b578873ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156120cd573d6000803e3d6000fd5b507f4ddda4c9be35186c9d1b28178302335ff10e50bc7e15d8ededc33e4857aa82b98b87600860008f8152602001908152602001600020548c8c87604051808781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156122075780601f106121dc57610100808354040283529160200191612207565b820191906000526020600020905b8154815290600101906020018083116121ea57829003601f168201915b505097505050505050505060405180910390a15b7e8201e7bcbf010c2c07de59d6e97cb7e3cf67a46125c49cbc89b9d2cde1f48f8b87600860008f8152602001908152602001600020548c8c87604051808781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156123535780601f1061232857610100808354040283529160200191612353565b820191906000526020600020905b81548152906001019060200180831161233657829003601f168201915b505097505050505050505060405180910390a15b5050505050505050505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360009054906101000a900461ffff16905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061247e5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561248957600080fd5b600c60009054906101000a900460ff161515156124a557600080fd5b6001600c60006101000a81548160ff0219169083151502179055507f8a366fcf0cdff71fc1946279a88cbb2845d8628abc79fc766e3593ff82154d05600c60009054906101000a900460ff16604051808215151515815260200191505060405180910390a1565b606060006060600080600061252087612374565b9450600085141561256357600060405190808252806020026020018201604052801561255b5781602001602082028038833980820191505090505b50955061264f565b846040519080825280602002602001820160405280156125925781602001602082028038833980820191505090505b50935061259d611275565b925060009150600090505b828111151561264b578673ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561263e5780848381518110151561262757fe5b906020019060200201818152505081806001019250505b80806001019150506125a8565b8395505b5050505050919050565b6060600080600080600080600b8881548110151561267357fe5b90600052602060002090600302019050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561271b5780601f106126f05761010080835404028352916020019161271b565b820191906000526020600020905b8154815290600101906020018083116126fe57829003601f168201915b50505050509650600860008981526020019081526020016000205493506004600089815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506005600089815260200190815260200160002060009054906101000a900460ff1691508060010160009054906101000a900460ff169550806002015494505091939550919395565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061285f5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561286a57600080fd5b60008161ffff161180156128825750600a8161ffff16105b151561288d57600080fd5b80600360066101000a81548161ffff021916908361ffff16021790555050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b6000806000600c60009054906101000a900460ff1615151561290b57600080fd5b6004600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250339150600b8581548110151561295357fe5b9060005260206000209060030201600201549050600160ff16600b8681548110151561297b57fe5b906000526020600020906003020160010160009054906101000a900460ff1660ff161415156129b4576000811115156129b357600080fd5b5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415156129ee57600080fd5b6005600086815260200190815260200160002060009054906101000a900460ff16151515612a1b57600080fd5b600084111515612a2a57600080fd5b803410151515612a3957600080fd5b83600860008781526020019081526020016000208190555060016005600087815260200190815260200160002060006101000a81548160ff0219169083151502179055507f17b4a6d9d7d8cb27823e77423d56dbc53899e4eb7fbebded879e7ac5d4fce5168585604051808381526020018281526020019250505060405180910390a15050505050565b60606040805190810160405280600781526020017f43525950544f4e00000000000000000000000000000000000000000000000000815250905090565b6000600360029054906101000a900461ffff16905090565b6040805190810160405280600881526020017f43727970746f6e7300000000000000000000000000000000000000000000000081525081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612bfa5750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612c0557600080fd5b60008110151515612c1557600080fd5b80600b83815481101515612c2557fe5b9060005260206000209060030201600201819055507f5e941ef1dc4cf6163396c106a275903c63323b0a0303061165222fc3662e750d600b83815481101515612c6a57fe5b9060005260206000209060030201600001826040518080602001838152602001828103825284818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612d0b5780601f10612ce057610100808354040283529160200191612d0b565b820191906000526020600020905b815481529060010190602001808311612cee57829003601f168201915b5050935050505060405180910390a15050565b600c60009054906101000a900460ff16151515612d3a57600080fd5b612d443382613126565b1515612d4f57600080fd5b612d5882613320565b1515612d6357600080fd5b612d6e338383613359565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612e415750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612e4c57600080fd5b60648161ffff1610158015612e6757506127108161ffff1611155b1515612e7257600080fd5b80600360046101000a81548161ffff021916908361ffff16021790555050565b600080600c60009054906101000a900460ff16151515612eb157600080fd5b3391506004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612ef382613320565b1515612efe57600080fd5b612f0882846132b4565b1515612f1357600080fd5b612f1e818385613359565b505050565b600060086000838152602001908152602001600020549050919050565b6000600360049054906101000a900461ffff16905090565b600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806130045750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561300f57600080fd5b829150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561304b573091505b600a60ff168660ff16141561305e573091505b60008411151561306e5760015493505b600160ff168660ff16141561308257600093505b6000851115156130925760005494505b600160ff168660ff16146130a75760006130aa565b60015b90506130ba87838787858b6135b1565b50505050505050565b6000600b828154811015156130d457fe5b9060005260206000209060030201600201549050919050565b6040805190810160405280600781526020017f43525950544f4e0000000000000000000000000000000000000000000000000081525081565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614905092915050565b6000309050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561325157600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8273ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561324b573d6000803e3d6000fd5b506132b0565b8173ffffffffffffffffffffffffffffffffffffffff166108fc8273ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156132ae573d6000803e3d6000fd5b505b5050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415156134b757600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001900391905055506007600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000806000841415613570576000915061358f565b828402905082848281151561358157fe5b0414151561358b57fe5b8091505b5092915050565b60008082848115156135a457fe5b0490508091505092915050565b6135b96137b8565b60006060604051908101604052808981526020018460ff1681526020018681525091506001600b839080600181540180825580915050906001820390600052602060002090600302016000909192909190915060008201518160000190805190602001906136289291906137dd565b5060208201518160010160006101000a81548160ff021916908360ff1602179055506040820151816002015550500390508063ffffffff168114151561366d57600080fd5b7fa62aee79defc1345b836c482cd6dd1c3f5faf46f0ed5080a6b00607e63347ae3818989878760405180868152602001806020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001841515151581526020018360ff1660ff168152602001828103825286818151815260200191508051906020019080838360005b83811015613721578082015181840152602081019050613706565b50505050905090810190601f16801561374e5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1856008600083815260200190815260200160002081905550836005600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506137ae60008883613359565b5050505050505050565b60606040519081016040528060608152602001600060ff168152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061381e57805160ff191683800117855561384c565b8280016001018555821561384c579182015b8281111561384b578251825591602001919060010190613830565b5b509050613859919061385d565b5090565b61387f91905b8082111561387b576000816000905550600101613863565b5090565b905600a165627a7a723058200c81aab5fa2e5515f88fcd45621331f17b869063ec6310e598a52fe6faec62cf0029

Swarm Source

bzzr://0c81aab5fa2e5515f88fcd45621331f17b869063ec6310e598a52fe6faec62cf

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.