ETH Price: $3,164.90 (+1.44%)
Gas: 1 Gwei

Contract

0xa76eA481AebdD5703e476cfCb2315D4e014232c1
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x0d262e5d52071442018-03-06 14:26:002321 days ago1520346360IN
0xa76eA481...e014232c1
0.3 ETH0.0014417460
0x0d262e5d52071202018-03-06 14:20:482321 days ago1520346048IN
0xa76eA481...e014232c1
0.22 ETH0.0012975654
Transfer52070822018-03-06 14:11:132321 days ago1520345473IN
0xa76eA481...e014232c1
0.32 ETH0.0011658654
Transfer52070632018-03-06 14:07:352321 days ago1520345255IN
0xa76eA481...e014232c1
0.12 ETH0.0008851941
Transfer52070472018-03-06 14:04:202321 days ago1520345060IN
0xa76eA481...e014232c1
0.2 ETH0.0011658654
Finalize52070382018-03-06 14:02:102321 days ago1520344930IN
0xa76eA481...e014232c1
0 ETH0.0004010113
Transfer52070312018-03-06 14:00:232321 days ago1520344823IN
0xa76eA481...e014232c1
0.324962 ETH0.0009931446
Transfer52070202018-03-06 13:57:582321 days ago1520344678IN
0xa76eA481...e014232c1
0.11 ETH0.0039246441
Transfer52070182018-03-06 13:57:262321 days ago1520344646IN
0xa76eA481...e014232c1
0.121506 ETH0.0002695812
Transfer52069782018-03-06 13:49:062321 days ago1520344146IN
0xa76eA481...e014232c1
0.121506 ETH0.0002695812
Update Whitelist...52069502018-03-06 13:41:562321 days ago1520343716IN
0xa76eA481...e014232c1
0 ETH0.0017134812
Transfer52068862018-03-06 13:28:042321 days ago1520342884IN
0xa76eA481...e014232c1
0.5 ETH0.0002197110
Transfer52067352018-03-06 12:50:512321 days ago1520340651IN
0xa76eA481...e014232c1
0.7 ETH0.000478615
Update Whitelist52066492018-03-06 12:27:292321 days ago1520339249IN
0xa76eA481...e014232c1
0 ETH0.0004692210
Update Whitelist...52066462018-03-06 12:26:312321 days ago1520339191IN
0xa76eA481...e014232c1
0 ETH0.0014266210
Transfer52066452018-03-06 12:25:572321 days ago1520339157IN
0xa76eA481...e014232c1
0.51 ETH0.0009008141
Transfer52066172018-03-06 12:16:112321 days ago1520338571IN
0xa76eA481...e014232c1
0.5 ETH0.000670067
Transfer52065172018-03-06 11:50:582321 days ago1520337058IN
0xa76eA481...e014232c1
0.18185282 ETH0.0013182660
Transfer52064562018-03-06 11:36:132321 days ago1520336173IN
0xa76eA481...e014232c1
0.1 ETH0.0057433860
Transfer52063782018-03-06 11:18:102321 days ago1520335090IN
0xa76eA481...e014232c1
0.1 ETH0.001347960
Transfer52063082018-03-06 10:58:042321 days ago1520333884IN
0xa76eA481...e014232c1
2.8 ETH0.0057433860
Set End Timestam...52062832018-03-06 10:51:062321 days ago1520333466IN
0xa76eA481...e014232c1
0 ETH0.0003900513
Update Whitelist52062682018-03-06 10:47:472321 days ago1520333267IN
0xa76eA481...e014232c1
0 ETH0.000375888
Update Whitelist52062682018-03-06 10:47:472321 days ago1520333267IN
0xa76eA481...e014232c1
0 ETH0.000375888
Update Whitelist52062682018-03-06 10:47:472321 days ago1520333267IN
0xa76eA481...e014232c1
0 ETH0.000375888
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
52070202018-03-06 13:57:582321 days ago1520344678
0xa76eA481...e014232c1
0.11 ETH
52067352018-03-06 12:50:512321 days ago1520340651
0xa76eA481...e014232c1
0.7 ETH
52066172018-03-06 12:16:112321 days ago1520338571
0xa76eA481...e014232c1
0.5 ETH
52064562018-03-06 11:36:132321 days ago1520336173
0xa76eA481...e014232c1
0.1 ETH
52063082018-03-06 10:58:042321 days ago1520333884
0xa76eA481...e014232c1
2.8 ETH
52060982018-03-06 10:06:312321 days ago1520330791
0xa76eA481...e014232c1
1.8 ETH
52060702018-03-06 10:01:142321 days ago1520330474
0xa76eA481...e014232c1
1 ETH
52060582018-03-06 9:57:142321 days ago1520330234
0xa76eA481...e014232c1
0.12 ETH
52059972018-03-06 9:44:032321 days ago1520329443
0xa76eA481...e014232c1
0.2 ETH
52059012018-03-06 9:22:212321 days ago1520328141
0xa76eA481...e014232c1
0.5 ETH
52058752018-03-06 9:15:202321 days ago1520327720
0xa76eA481...e014232c1
0.14 ETH
52058232018-03-06 9:01:042321 days ago1520326864
0xa76eA481...e014232c1
0.4 ETH
52058082018-03-06 8:57:072321 days ago1520326627
0xa76eA481...e014232c1
0.5 ETH
52057492018-03-06 8:41:532321 days ago1520325713
0xa76eA481...e014232c1
0.13 ETH
52056892018-03-06 8:25:192321 days ago1520324719
0xa76eA481...e014232c1
0.2 ETH
52056812018-03-06 8:23:132321 days ago1520324593
0xa76eA481...e014232c1
0.35431347 ETH
52056302018-03-06 8:10:122321 days ago1520323812
0xa76eA481...e014232c1
0.3 ETH
52054512018-03-06 7:29:302321 days ago1520321370
0xa76eA481...e014232c1
2 ETH
52053062018-03-06 6:52:432321 days ago1520319163
0xa76eA481...e014232c1
0.25 ETH
52052042018-03-06 6:28:082321 days ago1520317688
0xa76eA481...e014232c1
0.5 ETH
52051322018-03-06 6:07:372321 days ago1520316457
0xa76eA481...e014232c1
0.2 ETH
52050982018-03-06 5:59:392321 days ago1520315979
0xa76eA481...e014232c1
0.1 ETH
52049862018-03-06 5:31:092321 days ago1520314269
0xa76eA481...e014232c1
0.1 ETH
52045762018-03-06 3:51:312321 days ago1520308291
0xa76eA481...e014232c1
0.33 ETH
52045232018-03-06 3:36:422321 days ago1520307402
0xa76eA481...e014232c1
0.1 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Crowdsale

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-02-27
*/

pragma solidity ^0.4.17;

contract J8TTokenConfig {
    // The J8T decimals
    uint8 public constant TOKEN_DECIMALS = 8;

    // The J8T decimal factor to obtain luckys
    uint256 public constant J8T_DECIMALS_FACTOR = 10**uint256(TOKEN_DECIMALS);
}

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


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


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


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


  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) onlyOwner public {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
  function mul(uint256 a, uint256 b) internal constant returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal constant 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;
  }

  function sub(uint256 a, uint256 b) internal constant returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal constant returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  uint256 public totalSupply;
  function balanceOf(address who) public constant returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public constant returns (uint256 balance) {
    return balances[_owner];
  }

}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public constant returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) allowed;


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));

    uint256 _allowance = allowed[_from][msg.sender];

    // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
    // require (_value <= _allowance);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = _allowance.sub(_value);
    Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(address _owner, address _spender) public constant returns (uint256 remaining) {
    return allowed[_owner][_spender];
  }

  /**
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   */
  function increaseApproval (address _spender, uint _addedValue)
    returns (bool success) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  function decreaseApproval (address _spender, uint _subtractedValue)
    returns (bool success) {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

/**
 * @title Burnable Token
 * @dev Token that can be irreversibly burned (destroyed).
 */
contract BurnableToken is StandardToken {

    event Burn(address indexed burner, uint256 value);

    /**
     * @dev Burns a specific amount of tokens.
     * @param _value The amount of token to be burned.
     */
    function burn(uint256 _value) public {
        require(_value > 0);

        address burner = msg.sender;
        balances[burner] = balances[burner].sub(_value);
        totalSupply = totalSupply.sub(_value);
        Burn(burner, _value);
    }
}

//////////////////////////////////////////////////////////////////////
// @title J8T Token                                                 //
// @dev ERC20 J8T Token                                             //
//                                                                  //
// J8T Tokens are divisible by 1e8 (100,000,000) base               //
//                                                                  //
// J8T are displayed using 8 decimal places of precision.           //
//                                                                  //
// 1 J8T is equivalent to 100000000 luckys:                         //
//   100000000 == 1 * 10**8 == 1e8 == One Hundred Million luckys    //
//                                                                  //
// 1,5 Billion J8T (total supply) is equivalent to:                 //
//   150000000000000000 == 1500000000 * 10**8 == 1,5e17 luckys      //
//                                                                  //
//////////////////////////////////////////////////////////////////////

contract J8TToken is J8TTokenConfig, BurnableToken, Ownable {
    string public constant name            = "J8T Token";
    string public constant symbol          = "J8T";
    uint256 public constant decimals       = TOKEN_DECIMALS;
    uint256 public constant INITIAL_SUPPLY = 1500000000 * (10 ** uint256(decimals));

    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    function J8TToken() {
        totalSupply = INITIAL_SUPPLY;
        balances[msg.sender] = INITIAL_SUPPLY;

        //https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#transfer-1
        //EIP 20: A token contract which creates new tokens SHOULD trigger a
        //Transfer event with the _from address set to 0x0
        //when tokens are created.
        Transfer(0x0, msg.sender, INITIAL_SUPPLY);
     }
}


contract ACLManaged is Ownable {
    
    ///////////////////////////
    // ACLManaged PROPERTIES //
    ///////////////////////////

    // The operational acl address
    address public opsAddress;

    // The admin acl address
    address public adminAddress;

    ////////////////////////////////////////
    // ACLManaged FUNCTIONS and MODIFIERS //
    ////////////////////////////////////////

    function ACLManaged() public Ownable() {}

    // Updates the opsAddress propety with the new _opsAddress value
    function setOpsAddress(address _opsAddress) external onlyOwner returns (bool) {
        require(_opsAddress != address(0));
        require(_opsAddress != address(this));

        opsAddress = _opsAddress;
        return true;
    }

    // Updates the adminAddress propety with the new _adminAddress value
    function setAdminAddress(address _adminAddress) external onlyOwner returns (bool) {
        require(_adminAddress != address(0));
        require(_adminAddress != address(this));

        adminAddress = _adminAddress;
        return true;
    }

    //Checks if an address is owner
    function isOwner(address _address) public view returns (bool) {
        bool result = (_address == owner);
        return result;
    }

    //Checks if an address is operator
    function isOps(address _address) public view returns (bool) {
        bool result = (_address == opsAddress);
        return result;
    }

    //Checks if an address is ops or admin
    function isOpsOrAdmin(address _address) public view returns (bool) {
        bool result = (_address == opsAddress || _address == adminAddress);
        return result;
    }

    //Checks if an address is ops,owner or admin
    function isOwnerOrOpsOrAdmin(address _address) public view returns (bool) {
        bool result = (_address == opsAddress || _address == adminAddress || _address == owner);
        return result;
    }

    //Checks whether the msg.sender address is equal to the adminAddress property or not
    modifier onlyAdmin() {
        //Needs to be set. Default constructor will set 0x0;
        address _address = msg.sender;
        require(_address != address(0));
        require(_address == adminAddress);
        _;
    }

    // Checks whether the msg.sender address is equal to the opsAddress property or not
    modifier onlyOps() {
        //Needs to be set. Default constructor will set 0x0;
        address _address = msg.sender;
        require(_address != address(0));
        require(_address == opsAddress);
        _;
    }

    // Checks whether the msg.sender address is equal to the opsAddress or adminAddress property
    modifier onlyAdminAndOps() {
        //Needs to be set. Default constructor will set 0x0;
        address _address = msg.sender;
        require(_address != address(0));
        require(_address == opsAddress || _address == adminAddress);
        _;
    }
}

contract CrowdsaleConfig is J8TTokenConfig {
    using SafeMath for uint256;

    // Default start token sale date is 28th February 15:00 SGP 2018
    uint256 public constant START_TIMESTAMP = 1519801200;

    // Default end token sale date is 14th March 15:00 SGP 2018
    uint256 public constant END_TIMESTAMP   = 1521010800;

    // The ETH decimal factor to obtain weis
    uint256 public constant ETH_DECIMALS_FACTOR = 10**uint256(18);

    // The token sale supply 
    uint256 public constant TOKEN_SALE_SUPPLY = 450000000 * J8T_DECIMALS_FACTOR;

    // The minimum contribution amount in weis
    uint256 public constant MIN_CONTRIBUTION_WEIS = 0.1 ether;

    // The maximum contribution amount in weis
    uint256 public constant MAX_CONTRIBUTION_WEIS = 10 ether;

    //@WARNING: WORKING WITH KILO-MULTIPLES TO AVOID IMPOSSIBLE DIVISIONS OF FLOATING POINTS.
    uint256 constant dollar_per_kilo_token = 100; //0.1 dollar per token
    uint256 public constant dollars_per_kilo_ether = 900000; //900$ per ether
    //TOKENS_PER_ETHER = dollars_per_ether / dollar_per_token
    uint256 public constant INITIAL_TOKENS_PER_ETHER = dollars_per_kilo_ether.div(dollar_per_kilo_token);
}

contract Ledger is ACLManaged {
    
    using SafeMath for uint256;

    ///////////////////////
    // Ledger PROPERTIES //
    ///////////////////////

    // The Allocation struct represents a token sale purchase
    // amountGranted is the amount of tokens purchased
    // hasClaimedBonusTokens whether the allocation has been alredy claimed
    struct Allocation {
        uint256 amountGranted;
        uint256 amountBonusGranted;
        bool hasClaimedBonusTokens;
    }

    // ContributionPhase enum cases are
    // PreSaleContribution, the contribution has been made in the presale phase
    // PartnerContribution, the contribution has been made in the private phase
    enum ContributionPhase {
        PreSaleContribution, PartnerContribution
    }

    // Map of adresses that purchased tokens on the presale phase
    mapping(address => Allocation) public presaleAllocations;

    // Map of adresses that purchased tokens on the private phase
    mapping(address => Allocation) public partnerAllocations;

    // Reference to the J8TToken contract
    J8TToken public tokenContract;

    // Reference to the Crowdsale contract
    Crowdsale public crowdsaleContract;

    // Total private allocation, counting the amount of tokens from the
    // partner and the presale phase
    uint256 public totalPrivateAllocation;

    // Whether the token allocations can be claimed on the partner sale phase
    bool public canClaimPartnerTokens;

    // Whether the token allocations can be claimed on the presale sale phase
    bool public canClaimPresaleTokens;

    // Whether the bonus token allocations can be claimed
    bool public canClaimPresaleBonusTokensPhase1;
    bool public canClaimPresaleBonusTokensPhase2;

    // Whether the bonus token allocations can be claimed
    bool public canClaimPartnerBonusTokensPhase1;
    bool public canClaimPartnerBonusTokensPhase2;

    ///////////////////
    // Ledger EVENTS //
    ///////////////////

    // Triggered when an allocation has been granted
    event AllocationGranted(address _contributor, uint256 _amount, uint8 _phase);

    // Triggered when an allocation has been revoked
    event AllocationRevoked(address _contributor, uint256 _amount, uint8 _phase);

    // Triggered when an allocation has been claimed
    event AllocationClaimed(address _contributor, uint256 _amount);

    // Triggered when a bonus allocation has been claimed
    event AllocationBonusClaimed(address _contributor, uint256 _amount);

    // Triggered when crowdsale contract updated
    event CrowdsaleContractUpdated(address _who, address _old_address, address _new_address);

    //Triggered when any can claim token boolean is updated. _type param indicates which is updated.
    event CanClaimTokensUpdated(address _who, string _type, bool _oldCanClaim, bool _newCanClaim);

    //////////////////////
    // Ledger FUNCTIONS //
    //////////////////////

    // Ledger constructor
    // Sets default values for canClaimPresaleTokens and canClaimPartnerTokens properties
    function Ledger(J8TToken _tokenContract) public {
        require(address(_tokenContract) != address(0));
        tokenContract = _tokenContract;
        canClaimPresaleTokens = false;
        canClaimPartnerTokens = false;
        canClaimPresaleBonusTokensPhase1 = false;
        canClaimPresaleBonusTokensPhase2 = false;
        canClaimPartnerBonusTokensPhase1 = false;
        canClaimPartnerBonusTokensPhase2 = false;
    }

    function () external payable {
        claimTokens();
    }

    // Revokes an allocation from the contributor with address _contributor
    // Deletes the allocation from the corresponding mapping property and transfers
    // the total amount of tokens of the allocation back to the Crowdsale contract
    function revokeAllocation(address _contributor, uint8 _phase) public onlyAdminAndOps payable returns (uint256) {
        require(_contributor != address(0));
        require(_contributor != address(this));

        // Can't revoke  an allocation if the contribution phase is not in the ContributionPhase enum
        ContributionPhase _contributionPhase = ContributionPhase(_phase);
        require(_contributionPhase == ContributionPhase.PreSaleContribution ||
                _contributionPhase == ContributionPhase.PartnerContribution);

        uint256 grantedAllocation = 0;

        // Deletes the allocation from the respective mapping
        if (_contributionPhase == ContributionPhase.PreSaleContribution) {
            grantedAllocation = presaleAllocations[_contributor].amountGranted.add(presaleAllocations[_contributor].amountBonusGranted);
            delete presaleAllocations[_contributor];
        } else if (_contributionPhase == ContributionPhase.PartnerContribution) {
            grantedAllocation = partnerAllocations[_contributor].amountGranted.add(partnerAllocations[_contributor].amountBonusGranted);
            delete partnerAllocations[_contributor];
        }

        // The granted amount allocation must be less that the current token supply on the contract
        uint256 currentSupply = tokenContract.balanceOf(address(this));
        require(grantedAllocation <= currentSupply);

        // Updates the total private allocation substracting the amount of tokens that has been revoked
        require(grantedAllocation <= totalPrivateAllocation);
        totalPrivateAllocation = totalPrivateAllocation.sub(grantedAllocation);
        
        // We sent back the amount of tokens that has been revoked to the corwdsale contract
        require(tokenContract.transfer(address(crowdsaleContract), grantedAllocation));

        AllocationRevoked(_contributor, grantedAllocation, _phase);

        return grantedAllocation;

    }

    // Adds a new allocation for the contributor with address _contributor
    function addAllocation(address _contributor, uint256 _amount, uint256 _bonus, uint8 _phase) public onlyAdminAndOps returns (bool) {
        require(_contributor != address(0));
        require(_contributor != address(this));

        // Can't create or update an allocation if the amount of tokens to be allocated is not greater than zero
        require(_amount > 0);

        // Can't create an allocation if the contribution phase is not in the ContributionPhase enum
        ContributionPhase _contributionPhase = ContributionPhase(_phase);
        require(_contributionPhase == ContributionPhase.PreSaleContribution ||
                _contributionPhase == ContributionPhase.PartnerContribution);


        uint256 totalAmount = _amount.add(_bonus);
        uint256 totalGrantedAllocation = 0;
        uint256 totalGrantedBonusAllocation = 0;

        // Fetch the allocation from the respective mapping and updates the granted amount of tokens
        if (_contributionPhase == ContributionPhase.PreSaleContribution) {
            totalGrantedAllocation = presaleAllocations[_contributor].amountGranted.add(_amount);
            totalGrantedBonusAllocation = presaleAllocations[_contributor].amountBonusGranted.add(_bonus);
            presaleAllocations[_contributor] = Allocation(totalGrantedAllocation, totalGrantedBonusAllocation, false);
        } else if (_contributionPhase == ContributionPhase.PartnerContribution) {
            totalGrantedAllocation = partnerAllocations[_contributor].amountGranted.add(_amount);
            totalGrantedBonusAllocation = partnerAllocations[_contributor].amountBonusGranted.add(_bonus);
            partnerAllocations[_contributor] = Allocation(totalGrantedAllocation, totalGrantedBonusAllocation, false);
        }

        // Updates the contract data
        totalPrivateAllocation = totalPrivateAllocation.add(totalAmount);

        AllocationGranted(_contributor, totalAmount, _phase);

        return true;
    }

    // The claimTokens() function handles the contribution token claim.
    // Tokens can only be claimed after we open this phase.
    // The lockouts periods are defined by the foundation.
    // There are 2 different lockouts:
    //      Presale lockout
    //      Partner lockout
    //
    // A contributor that has contributed in all the phases can claim
    // all its tokens, but only the ones that are accesible to claim
    // be transfered.
    // 
    // A contributor can claim its tokens after each phase has been opened
    function claimTokens() public payable returns (bool) {
        require(msg.sender != address(0));
        require(msg.sender != address(this));

        uint256 amountToTransfer = 0;

        // We need to check if the contributor has made a contribution on each
        // phase, presale and partner
        Allocation storage presaleA = presaleAllocations[msg.sender];
        if (presaleA.amountGranted > 0 && canClaimPresaleTokens) {
            amountToTransfer = amountToTransfer.add(presaleA.amountGranted);
            presaleA.amountGranted = 0;
        }

        Allocation storage partnerA = partnerAllocations[msg.sender];
        if (partnerA.amountGranted > 0 && canClaimPartnerTokens) {
            amountToTransfer = amountToTransfer.add(partnerA.amountGranted);
            partnerA.amountGranted = 0;
        }

        // The amount to transfer must greater than zero
        require(amountToTransfer > 0);

        // The amount to transfer must be less or equal to the current supply
        uint256 currentSupply = tokenContract.balanceOf(address(this));
        require(amountToTransfer <= currentSupply);
        
        // Transfer the token allocation to contributor
        require(tokenContract.transfer(msg.sender, amountToTransfer));
        AllocationClaimed(msg.sender, amountToTransfer);
    
        return true;
    }

    function claimBonus() external payable returns (bool) {
        require(msg.sender != address(0));
        require(msg.sender != address(this));

        uint256 amountToTransfer = 0;

        // BONUS PHASE 1
        Allocation storage presale = presaleAllocations[msg.sender];
        if (presale.amountBonusGranted > 0 && !presale.hasClaimedBonusTokens && canClaimPresaleBonusTokensPhase1) {
            uint256 amountPresale = presale.amountBonusGranted.div(2);
            amountToTransfer = amountPresale;
            presale.amountBonusGranted = amountPresale;
            presale.hasClaimedBonusTokens = true;
        }

        Allocation storage partner = partnerAllocations[msg.sender];
        if (partner.amountBonusGranted > 0 && !partner.hasClaimedBonusTokens && canClaimPartnerBonusTokensPhase1) {
            uint256 amountPartner = partner.amountBonusGranted.div(2);
            amountToTransfer = amountToTransfer.add(amountPartner);
            partner.amountBonusGranted = amountPartner;
            partner.hasClaimedBonusTokens = true;
        }

        // BONUS PHASE 2
        if (presale.amountBonusGranted > 0 && canClaimPresaleBonusTokensPhase2) {
            amountToTransfer = amountToTransfer.add(presale.amountBonusGranted);
            presale.amountBonusGranted = 0;
        }

        if (partner.amountBonusGranted > 0 && canClaimPartnerBonusTokensPhase2) {
            amountToTransfer = amountToTransfer.add(partner.amountBonusGranted);
            partner.amountBonusGranted = 0;
        }

        // The amount to transfer must greater than zero
        require(amountToTransfer > 0);

        // The amount to transfer must be less or equal to the current supply
        uint256 currentSupply = tokenContract.balanceOf(address(this));
        require(amountToTransfer <= currentSupply);
        
        // Transfer the token allocation to contributor
        require(tokenContract.transfer(msg.sender, amountToTransfer));
        AllocationBonusClaimed(msg.sender, amountToTransfer);

        return true;
    }

    // Updates the canClaimPresaleTokens propety with the new _canClaimTokens value
    function setCanClaimPresaleTokens(bool _canClaimTokens) external onlyAdmin returns (bool) {
        bool _oldCanClaim = canClaimPresaleTokens;
        canClaimPresaleTokens = _canClaimTokens;
        CanClaimTokensUpdated(msg.sender, 'canClaimPresaleTokens', _oldCanClaim, _canClaimTokens);
        return true;
    }

    // Updates the canClaimPartnerTokens property with the new _canClaimTokens value
    function setCanClaimPartnerTokens(bool _canClaimTokens) external onlyAdmin returns (bool) {
        bool _oldCanClaim = canClaimPartnerTokens;
        canClaimPartnerTokens = _canClaimTokens;
        CanClaimTokensUpdated(msg.sender, 'canClaimPartnerTokens', _oldCanClaim, _canClaimTokens);
        return true;
    }

    // Updates the canClaimBonusTokens property with the new _canClaimTokens value
    function setCanClaimPresaleBonusTokensPhase1(bool _canClaimTokens) external onlyAdmin returns (bool) {
        bool _oldCanClaim = canClaimPresaleBonusTokensPhase1;
        canClaimPresaleBonusTokensPhase1 = _canClaimTokens;
        CanClaimTokensUpdated(msg.sender, 'canClaimPresaleBonusTokensPhase1', _oldCanClaim, _canClaimTokens);
        return true;
    }

    // Updates the canClaimBonusTokens property with the new _canClaimTokens value
    function setCanClaimPresaleBonusTokensPhase2(bool _canClaimTokens) external onlyAdmin returns (bool) {
        bool _oldCanClaim = canClaimPresaleBonusTokensPhase2;
        canClaimPresaleBonusTokensPhase2 = _canClaimTokens;
        CanClaimTokensUpdated(msg.sender, 'canClaimPresaleBonusTokensPhase2', _oldCanClaim, _canClaimTokens);
        return true;
    }

    // Updates the canClaimBonusTokens property with the new _canClaimTokens value
    function setCanClaimPartnerBonusTokensPhase1(bool _canClaimTokens) external onlyAdmin returns (bool) {
        bool _oldCanClaim = canClaimPartnerBonusTokensPhase1;
        canClaimPartnerBonusTokensPhase1 = _canClaimTokens;
        CanClaimTokensUpdated(msg.sender, 'canClaimPartnerBonusTokensPhase1', _oldCanClaim, _canClaimTokens);
        return true;
    }

    // Updates the canClaimBonusTokens property with the new _canClaimTokens value
    function setCanClaimPartnerBonusTokensPhase2(bool _canClaimTokens) external onlyAdmin returns (bool) {
        bool _oldCanClaim = canClaimPartnerBonusTokensPhase2;
        canClaimPartnerBonusTokensPhase2 = _canClaimTokens;
        CanClaimTokensUpdated(msg.sender, 'canClaimPartnerBonusTokensPhase2', _oldCanClaim, _canClaimTokens);
        return true;
    }

    // Updates the crowdsale contract property with the new _crowdsaleContract value
    function setCrowdsaleContract(Crowdsale _crowdsaleContract) public onlyOwner returns (bool) {
        address old_crowdsale_address = crowdsaleContract;

        crowdsaleContract = _crowdsaleContract;

        CrowdsaleContractUpdated(msg.sender, old_crowdsale_address, crowdsaleContract);

        return true;
    }
}

contract Crowdsale is ACLManaged, CrowdsaleConfig {

    using SafeMath for uint256;

    //////////////////////////
    // Crowdsale PROPERTIES //
    //////////////////////////

    // The J8TToken smart contract reference
    J8TToken public tokenContract;

    // The Ledger smart contract reference
    Ledger public ledgerContract;

    // The start token sale date represented as a timestamp
    uint256 public startTimestamp;

    // The end token sale date represented as a timestamp
    uint256 public endTimestamp;

    // Ratio of J8T tokens to per ether
    uint256 public tokensPerEther;

    // The total amount of wei raised in the token sale
    // Including presales (in eth) and public sale
    uint256 public weiRaised;

    // The current total amount of tokens sold in the token sale
    uint256 public totalTokensSold;

    // The minimum and maximum eth contribution accepted in the token sale
    uint256 public minContribution;
    uint256 public maxContribution;

    // The wallet address where the token sale sends all eth contributions
    address public wallet;

    // Controls whether the token sale has finished or not
    bool public isFinalized = false;

    // Map of adresses that requested to purchase tokens
    // Contributors of the token sale are segmented as:
    //  CannotContribute: Cannot contribute in any phase (uint8  - 0)
    //  PreSaleContributor: Can contribute on both pre-sale and pubic sale phases (uint8  - 1)
    //  PublicSaleContributor: Can contribute on he public sale phase (uint8  - 2)
    mapping(address => WhitelistPermission) public whitelist;

    // Map of addresses that has already contributed on the token sale
    mapping(address => bool) public hasContributed;

    enum WhitelistPermission {
        CannotContribute, PreSaleContributor, PublicSaleContributor 
    }

    //////////////////////
    // Crowdsale EVENTS //
    //////////////////////

    // Triggered when a contribution in the public sale has been processed correctly
    event TokensPurchased(address _contributor, uint256 _amount);

    // Triggered when the whitelist has been updated
    event WhiteListUpdated(address _who, address _account, WhitelistPermission _phase);

    // Triggered when the Crowdsale has been created
    event ContractCreated();

    // Triggered when a presale has been added
    // The phase parameter can be a strategic partner contribution or a presale contribution
    event PresaleAdded(address _contributor, uint256 _amount, uint8 _phase);

    // Triggered when the tokensPerEther property has been updated
    event TokensPerEtherUpdated(address _who, uint256 _oldValue, uint256 _newValue);

    // Triggered when the startTimestamp property has been updated
    event StartTimestampUpdated(address _who, uint256 _oldValue, uint256 _newValue);

    // Triggered when the endTimestamp property has been updated
    event EndTimestampUpdated(address _who, uint256 _oldValue, uint256 _newValue);

    // Triggered when the wallet property has been updated
    event WalletUpdated(address _who, address _oldWallet, address _newWallet);

    // Triggered when the minContribution property has been updated
    event MinContributionUpdated(address _who, uint256 _oldValue, uint256 _newValue);

    // Triggered when the maxContribution property has been updated
    event MaxContributionUpdated(address _who, uint256 _oldValue, uint256 _newValue);

    // Triggered when the token sale has finalized
    event Finalized(address _who, uint256 _timestamp);

    // Triggered when the token sale has finalized and there where still token to sale
    // When the token are not sold, we burn them
    event Burned(address _who, uint256 _amount, uint256 _timestamp);

    /////////////////////////
    // Crowdsale FUNCTIONS //
    /////////////////////////
    

    // Crowdsale constructor
    // Takes default values from the CrowdsaleConfig smart contract
    function Crowdsale(
        J8TToken _tokenContract,
        Ledger _ledgerContract,
        address _wallet
    ) public
    {
        uint256 _start            = START_TIMESTAMP;
        uint256 _end              = END_TIMESTAMP;
        uint256 _supply           = TOKEN_SALE_SUPPLY;
        uint256 _min_contribution = MIN_CONTRIBUTION_WEIS;
        uint256 _max_contribution = MAX_CONTRIBUTION_WEIS;
        uint256 _tokensPerEther   = INITIAL_TOKENS_PER_ETHER;

        require(_start > currentTime());
        require(_end > _start);
        require(_tokensPerEther > 0);
        require(address(_tokenContract) != address(0));
        require(address(_ledgerContract) != address(0));
        require(_wallet != address(0));

        ledgerContract   = _ledgerContract;
        tokenContract    = _tokenContract;
        startTimestamp   = _start;
        endTimestamp     = _end;
        tokensPerEther   = _tokensPerEther;
        minContribution = _min_contribution;
        maxContribution = _max_contribution;
        wallet           = _wallet;
        totalTokensSold  = 0;
        weiRaised        = 0;
        isFinalized      = false;  

        ContractCreated();
    }

    // Updates the tokenPerEther propety with the new _tokensPerEther value
    function setTokensPerEther(uint256 _tokensPerEther) external onlyAdmin onlyBeforeSale returns (bool) {
        require(_tokensPerEther > 0);

        uint256 _oldValue = tokensPerEther;
        tokensPerEther = _tokensPerEther;

        TokensPerEtherUpdated(msg.sender, _oldValue, tokensPerEther);
        return true;
    }

    // Updates the startTimestamp propety with the new _start value
    function setStartTimestamp(uint256 _start) external onlyAdmin returns (bool) {
        require(_start < endTimestamp);
        require(_start > currentTime());

        uint256 _oldValue = startTimestamp;
        startTimestamp = _start;

        StartTimestampUpdated(msg.sender, _oldValue, startTimestamp);

        return true;
    }

    // Updates the endTimestamp propety with the new _end value
    function setEndTimestamp(uint256 _end) external onlyAdmin returns (bool) {
        require(_end > startTimestamp);

        uint256 _oldValue = endTimestamp;
        endTimestamp = _end;

        EndTimestampUpdated(msg.sender, _oldValue, endTimestamp);
        
        return true;
    }

    // Updates the wallet propety with the new _newWallet value
    function updateWallet(address _newWallet) external onlyAdmin returns (bool) {
        require(_newWallet != address(0));
        
        address _oldValue = wallet;
        wallet = _newWallet;
        
        WalletUpdated(msg.sender, _oldValue, wallet);
        
        return true;
    }

    // Updates the minContribution propety with the new _newMinControbution value
    function setMinContribution(uint256 _newMinContribution) external onlyAdmin returns (bool) {
        require(_newMinContribution <= maxContribution);

        uint256 _oldValue = minContribution;
        minContribution = _newMinContribution;
        
        MinContributionUpdated(msg.sender, _oldValue, minContribution);
        
        return true;
    }

    // Updates the maxContribution propety with the new _newMaxContribution value
    function setMaxContribution(uint256 _newMaxContribution) external onlyAdmin returns (bool) {
        require(_newMaxContribution > minContribution);

        uint256 _oldValue = maxContribution;
        maxContribution = _newMaxContribution;
        
        MaxContributionUpdated(msg.sender, _oldValue, maxContribution);
        
        return true;
    }

    // Main public function.
    function () external payable {
        purchaseTokens();
    }

    // Revokes a presale allocation from the contributor with address _contributor
    // Updates the totalTokensSold property substracting the amount of tokens that where previously allocated
    function revokePresale(address _contributor, uint8 _contributorPhase) external onlyAdmin returns (bool) {
        require(_contributor != address(0));

        // We can only revoke allocations from pre sale or strategic partners
        // ContributionPhase.PreSaleContribution == 0,  ContributionPhase.PartnerContribution == 1
        require(_contributorPhase == 0 || _contributorPhase == 1);

        uint256 luckys = ledgerContract.revokeAllocation(_contributor, _contributorPhase);
        
        require(luckys > 0);
        require(luckys <= totalTokensSold);
        
        totalTokensSold = totalTokensSold.sub(luckys);
        
        return true;
    }

    // Adds a new presale allocation for the contributor with address _contributor
    // We can only allocate presale before the token sale has been initialized
    function addPresale(address _contributor, uint256 _tokens, uint256 _bonus, uint8 _contributorPhase) external onlyAdminAndOps onlyBeforeSale returns (bool) {
        require(_tokens > 0);
        require(_bonus > 0);

        // Converts the amount of tokens to our smallest J8T value, lucky
        uint256 luckys = _tokens.mul(J8T_DECIMALS_FACTOR);
        uint256 bonusLuckys = _bonus.mul(J8T_DECIMALS_FACTOR);
        uint256 totalTokens = luckys.add(bonusLuckys);

        uint256 availableTokensToPurchase = tokenContract.balanceOf(address(this));
        
        require(totalTokens <= availableTokensToPurchase);

        // Insert the new allocation to the Ledger
        require(ledgerContract.addAllocation(_contributor, luckys, bonusLuckys, _contributorPhase));
        // Transfers the tokens form the Crowdsale contract to the Ledger contract
        require(tokenContract.transfer(address(ledgerContract), totalTokens));

        // Updates totalTokensSold property
        totalTokensSold = totalTokensSold.add(totalTokens);

        // If we reach the total amount of tokens to sell we finilize the token sale
        availableTokensToPurchase = tokenContract.balanceOf(address(this));
        if (availableTokensToPurchase == 0) {
            finalization();
        }

        // Trigger PresaleAdded event
        PresaleAdded(_contributor, totalTokens, _contributorPhase);
    }

    // The purchaseTokens function handles the token purchase flow
    function purchaseTokens() public payable onlyDuringSale returns (bool) {
        address contributor = msg.sender;
        uint256 weiAmount = msg.value;

        // A contributor can only contribute once on the public sale
        require(hasContributed[contributor] == false);
        // The contributor address must be whitelisted in order to be able to purchase tokens
        require(contributorCanContribute(contributor));
        // The weiAmount must be greater or equal than minContribution
        require(weiAmount >= minContribution);
        // The weiAmount cannot be greater than maxContribution
        require(weiAmount <= maxContribution);
        // The availableTokensToPurchase must be greater than 0
        require(totalTokensSold < TOKEN_SALE_SUPPLY);
        uint256 availableTokensToPurchase = TOKEN_SALE_SUPPLY.sub(totalTokensSold);

        // We need to convert the tokensPerEther to luckys (10**8)
        uint256 luckyPerEther = tokensPerEther.mul(J8T_DECIMALS_FACTOR);

        // In order to calculate the tokens amount to be allocated to the contrbutor
        // we need to multiply the amount of wei sent by luckyPerEther and divide the
        // result for the ether decimal factor (10**18)
        uint256 tokensAmount = weiAmount.mul(luckyPerEther).div(ETH_DECIMALS_FACTOR);
        

        uint256 refund = 0;
        uint256 tokensToPurchase = tokensAmount;
        
        // If the token purchase amount is bigger than the remaining token allocation
        // we can only sell the remainging tokens and refund the unused amount of eth
        if (availableTokensToPurchase < tokensAmount) {
            tokensToPurchase = availableTokensToPurchase;
            weiAmount = tokensToPurchase.mul(ETH_DECIMALS_FACTOR).div(luckyPerEther);
            refund = msg.value.sub(weiAmount);
        }

        // We update the token sale contract data
        totalTokensSold = totalTokensSold.add(tokensToPurchase);
        uint256 weiToPurchase = tokensToPurchase.div(tokensPerEther);
        weiRaised = weiRaised.add(weiToPurchase);

        // Transfers the tokens form the Crowdsale contract to contriutors wallet
        require(tokenContract.transfer(contributor, tokensToPurchase));

        // Issue a refund for any unused ether 
        if (refund > 0) {
            contributor.transfer(refund);
        }

        // Transfer ether contribution to the wallet
        wallet.transfer(weiAmount);

        // Update hasContributed mapping
        hasContributed[contributor] = true;

        TokensPurchased(contributor, tokensToPurchase);

        // If we reach the total amount of tokens to sell we finilize the token sale
        if (totalTokensSold == TOKEN_SALE_SUPPLY) {
            finalization();
        }

        return true;
    }

    // Updates the whitelist
    function updateWhitelist(address _account, WhitelistPermission _permission) external onlyAdminAndOps returns (bool) {
        require(_account != address(0));
        require(_permission == WhitelistPermission.PreSaleContributor || _permission == WhitelistPermission.PublicSaleContributor || _permission == WhitelistPermission.CannotContribute);
        require(!saleHasFinished());

        whitelist[_account] = _permission;

        address _who = msg.sender;
        WhiteListUpdated(_who, _account, _permission);

        return true;
    }

    function updateWhitelist_batch(address[] _accounts, WhitelistPermission _permission) external onlyAdminAndOps returns (bool) {
        require(_permission == WhitelistPermission.PreSaleContributor || _permission == WhitelistPermission.PublicSaleContributor || _permission == WhitelistPermission.CannotContribute);
        require(!saleHasFinished());

        for(uint i = 0; i < _accounts.length; ++i) {
            require(_accounts[i] != address(0));
            whitelist[_accounts[i]] = _permission;
            WhiteListUpdated(msg.sender, _accounts[i], _permission);
        }

        return true;
    }

    // Checks that the status of an address account
    // Contributors of the token sale are segmented as:
    //  PreSaleContributor: Can contribute on both pre-sale and pubic sale phases
    //  PublicSaleContributor: Can contribute on he public sale phase
    //  CannotContribute: Cannot contribute in any phase
    function contributorCanContribute(address _contributorAddress) private view returns (bool) {
        WhitelistPermission _contributorPhase = whitelist[_contributorAddress];

        if (_contributorPhase == WhitelistPermission.CannotContribute) {
            return false;
        }

        if (_contributorPhase == WhitelistPermission.PreSaleContributor || 
            _contributorPhase == WhitelistPermission.PublicSaleContributor) {
            return true;
        }

        return false;
    }

    // Returns the current time
    function currentTime() public view returns (uint256) {
        return now;
    }

    // Checks if the sale has finished
    function saleHasFinished() public view returns (bool) {
        if (isFinalized) {
            return true;
        }

        if (endTimestamp < currentTime()) {
            return true;
        }

        if (totalTokensSold == TOKEN_SALE_SUPPLY) {
            return true;
        }

        return false;
    }

    modifier onlyBeforeSale() {
        require(currentTime() < startTimestamp);
        _;
    }

    modifier onlyDuringSale() {
        uint256 _currentTime = currentTime();
        require(startTimestamp < _currentTime);
        require(_currentTime < endTimestamp);
        _;
    }

    modifier onlyPostSale() {
        require(endTimestamp < currentTime());
        _;
    }

    ///////////////////////
    // PRIVATE FUNCTIONS //
    ///////////////////////

    // This method is for to be called only for the owner. This way we protect for anyone who wanna finalize the ICO.
    function finalize() external onlyAdmin returns (bool) {
        return finalization();
    }

    // Only used by finalize and setFinalized.
    // Overloaded logic for two uses.
    // NOTE: In case finalize is called by an user and not from addPresale()/purchaseToken()
    // will diff total supply with sold supply to burn token.
    function finalization() private returns (bool) {
        require(!isFinalized);

        isFinalized = true;

        
        if (totalTokensSold < TOKEN_SALE_SUPPLY) {
            uint256 toBurn = TOKEN_SALE_SUPPLY.sub(totalTokensSold);
            tokenContract.burn(toBurn);
            Burned(msg.sender, toBurn, currentTime());
        }

        Finalized(msg.sender, currentTime());

        return true;
    }

    function saleSupply() public view returns (uint256) {
        return tokenContract.balanceOf(address(this));
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"ledgerContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newMaxContribution","type":"uint256"}],"name":"setMaxContribution","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_TOKENS_PER_ETHER","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"hasContributed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_adminAddress","type":"address"}],"name":"setAdminAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"purchaseTokens","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOwnerOrOpsOrAdmin","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newMinContribution","type":"uint256"}],"name":"setMinContribution","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"J8T_DECIMALS_FACTOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"},{"name":"_permission","type":"uint8"}],"name":"updateWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_DECIMALS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SALE_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTokensSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_opsAddress","type":"address"}],"name":"setOpsAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saleHasFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_accounts","type":"address[]"},{"name":"_permission","type":"uint8"}],"name":"updateWhitelist_batch","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"START_TIMESTAMP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_end","type":"uint256"}],"name":"setEndTimestamp","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newWallet","type":"address"}],"name":"updateWallet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxContribution","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"opsAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokensPerEther","type":"uint256"}],"name":"setTokensPerEther","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_CONTRIBUTION_WEIS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_CONTRIBUTION_WEIS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"END_TIMESTAMP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dollars_per_kilo_ether","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"endTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minContribution","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_start","type":"uint256"}],"name":"setStartTimestamp","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_contributor","type":"address"},{"name":"_tokens","type":"uint256"},{"name":"_bonus","type":"uint256"},{"name":"_contributorPhase","type":"uint8"}],"name":"addPresale","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ETH_DECIMALS_FACTOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOpsOrAdmin","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOps","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokensPerEther","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"adminAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_contributor","type":"address"},{"name":"_contributorPhase","type":"uint8"}],"name":"revokePresale","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_tokenContract","type":"address"},{"name":"_ledgerContract","type":"address"},{"name":"_wallet","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_contributor","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"TokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_who","type":"address"},{"indexed":false,"name":"_account","type":"address"},{"indexed":false,"name":"_phase","type":"uint8"}],"name":"WhiteListUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_contributor","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"},{"indexed":false,"name":"_phase","type":"uint8"}],"name":"PresaleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_who","type":"address"},{"indexed":false,"name":"_oldValue","type":"uint256"},{"indexed":false,"name":"_newValue","type":"uint256"}],"name":"TokensPerEtherUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_who","type":"address"},{"indexed":false,"name":"_oldValue","type":"uint256"},{"indexed":false,"name":"_newValue","type":"uint256"}],"name":"StartTimestampUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_who","type":"address"},{"indexed":false,"name":"_oldValue","type":"uint256"},{"indexed":false,"name":"_newValue","type":"uint256"}],"name":"EndTimestampUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_who","type":"address"},{"indexed":false,"name":"_oldWallet","type":"address"},{"indexed":false,"name":"_newWallet","type":"address"}],"name":"WalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_who","type":"address"},{"indexed":false,"name":"_oldValue","type":"uint256"},{"indexed":false,"name":"_newValue","type":"uint256"}],"name":"MinContributionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_who","type":"address"},{"indexed":false,"name":"_oldValue","type":"uint256"},{"indexed":false,"name":"_newValue","type":"uint256"}],"name":"MaxContributionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_who","type":"address"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_who","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60606040526000600c60146101000a81548160ff02191690831515021790555034156200002b57600080fd5b60405160608062003a5b83398101604052808051906020019091908051906020019091908051906020019091905050600080600080600080336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550635a9653709550635aa8c8709450600860ff16600a0a631ad2748002935067016345785d8a00009250678ac7230489e800009150620000fe6064620dbba06200034e6401000000000262003466179091906401000000009004565b90506200011e6200036a6401000000000262002e75176401000000009004565b861115156200012c57600080fd5b85851115156200013b57600080fd5b6000811115156200014b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16141515156200018857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614151515620001c557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141515156200020257600080fd5b87600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600581905550846006819055508060078190555082600a8190555081600b8190555086600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060098190555060006008819055506000600c60146101000a81548160ff0219169083151502179055507fabd60e51a18b36604f00b5547417cf9051cc5c3a2e80e68206296e14be19f0bc60405160405180910390a150505050505050505062000372565b60008082848115156200035d57fe5b0490508091505092915050565b600042905090565b6136d980620003826000396000f300606060405260043610610246576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063026345b61461025157806303ed9d21146102a65780631a8fc985146102e1578063205b19461461030a5780632c1e816d1461035b5780632f54bf6e146103ac5780633290ce29146103fd57806336ac1dd01461041f5780634042b66f14610470578063473b0d4614610499578063498b7718146104d45780634bb278f3146104fd5780634d399cb31461052a578063521eb2731461058757806355a373d6146105dc5780635b7f415c146106315780635d0cb15d1461066057806363b2011714610689578063707789c5146106b257806374c06f5d1461070357806376c6dc1614610730578063781cd99d146107825780637df6a6c8146107ab578063848b86e3146107e65780638d3d6576146108375780638d4e4083146108605780638da5cb5b1461088d5780638ea64376146108e2578063904bd6d0146109375780639b19251a146109725780639d7233d4146109cd5780639f132677146109f6578063a07c765f14610a1f578063a5f75a5e14610a48578063a85adeab14610a71578063a96af0f414610a9a578063aaffadf314610ac3578063c44bef7514610aec578063c9f613d514610b27578063ce809e4e14610b96578063d18e81b314610bbf578063e6fd48bc14610be8578063ec57332014610c11578063ef326c6d14610c62578063f2fde38b14610cb3578063f856d60514610cec578063fc6f946814610d15578063fc914fdb14610d6a575b61024e610dc7565b50005b341561025c57600080fd5b610264611258565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b157600080fd5b6102c7600480803590602001909190505061127e565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b6102f46113ba565b6040518082815260200191505060405180910390f35b341561031557600080fd5b610341600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113d4565b604051808215151515815260200191505060405180910390f35b341561036657600080fd5b610392600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113f4565b604051808215151515815260200191505060405180910390f35b34156103b757600080fd5b6103e3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611512565b604051808215151515815260200191505060405180910390f35b610405610dc7565b604051808215151515815260200191505060405180910390f35b341561042a57600080fd5b610456600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611570565b604051808215151515815260200191505060405180910390f35b341561047b57600080fd5b61048361167e565b6040518082815260200191505060405180910390f35b34156104a457600080fd5b6104ba6004808035906020019091905050611684565b604051808215151515815260200191505060405180910390f35b34156104df57600080fd5b6104e76117c1565b6040518082815260200191505060405180910390f35b341561050857600080fd5b6105106117cc565b604051808215151515815260200191505060405180910390f35b341561053557600080fd5b61056d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560ff16906020019091905050611878565b604051808215151515815260200191505060405180910390f35b341561059257600080fd5b61059a611b42565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105e757600080fd5b6105ef611b68565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561063c57600080fd5b610644611b8e565b604051808260ff1660ff16815260200191505060405180910390f35b341561066b57600080fd5b610673611b93565b6040518082815260200191505060405180910390f35b341561069457600080fd5b61069c611ba4565b6040518082815260200191505060405180910390f35b34156106bd57600080fd5b6106e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611baa565b604051808215151515815260200191505060405180910390f35b341561070e57600080fd5b610716611cc8565b604051808215151515815260200191505060405180910390f35b341561073b57600080fd5b6107686004808035906020019082018035906020019190919290803560ff16906020019091905050611d2a565b604051808215151515815260200191505060405180910390f35b341561078d57600080fd5b61079561208b565b6040518082815260200191505060405180910390f35b34156107b657600080fd5b6107cc6004808035906020019091905050612093565b604051808215151515815260200191505060405180910390f35b34156107f157600080fd5b61081d600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506121cf565b604051808215151515815260200191505060405180910390f35b341561084257600080fd5b61084a612409565b6040518082815260200191505060405180910390f35b341561086b57600080fd5b61087361240f565b604051808215151515815260200191505060405180910390f35b341561089857600080fd5b6108a0612422565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108ed57600080fd5b6108f5612447565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561094257600080fd5b610958600480803590602001909190505061246d565b604051808215151515815260200191505060405180910390f35b341561097d57600080fd5b6109a9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506125bf565b604051808260028111156109b957fe5b60ff16815260200191505060405180910390f35b34156109d857600080fd5b6109e06125df565b6040518082815260200191505060405180910390f35b3415610a0157600080fd5b610a096125eb565b6040518082815260200191505060405180910390f35b3415610a2a57600080fd5b610a326125f7565b6040518082815260200191505060405180910390f35b3415610a5357600080fd5b610a5b6125ff565b6040518082815260200191505060405180910390f35b3415610a7c57600080fd5b610a84612606565b6040518082815260200191505060405180910390f35b3415610aa557600080fd5b610aad61260c565b6040518082815260200191505060405180910390f35b3415610ace57600080fd5b610ad66126f3565b6040518082815260200191505060405180910390f35b3415610af757600080fd5b610b0d60048080359060200190919050506126f9565b604051808215151515815260200191505060405180910390f35b3415610b3257600080fd5b610b7c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001909190803560ff1690602001909190505061284a565b604051808215151515815260200191505060405180910390f35b3415610ba157600080fd5b610ba9612e6d565b6040518082815260200191505060405180910390f35b3415610bca57600080fd5b610bd2612e75565b6040518082815260200191505060405180910390f35b3415610bf357600080fd5b610bfb612e7d565b6040518082815260200191505060405180910390f35b3415610c1c57600080fd5b610c48600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612e83565b604051808215151515815260200191505060405180910390f35b3415610c6d57600080fd5b610c99600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612f3a565b604051808215151515815260200191505060405180910390f35b3415610cbe57600080fd5b610cea600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612f99565b005b3415610cf757600080fd5b610cff6130ee565b6040518082815260200191505060405180910390f35b3415610d2057600080fd5b610d286130f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d7557600080fd5b610dad600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560ff1690602001909190505061311a565b604051808215151515815260200191505060405180910390f35b600080600080600080600080600080610dde612e75565b905080600554101515610df057600080fd5b60065481101515610e0057600080fd5b33985034975060001515600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515610e6557600080fd5b610e6e8961334d565b1515610e7957600080fd5b600a548810151515610e8a57600080fd5b600b548811151515610e9b57600080fd5b600860ff16600a0a631ad2748002600954101515610eb857600080fd5b610eda600954600860ff16600a0a631ad274800261341a90919063ffffffff16565b9650610ef8600860ff16600a0a60075461343390919063ffffffff16565b9550610f236012600a0a610f15888b61343390919063ffffffff16565b61346690919063ffffffff16565b94506000935084925084871015610f7857869250610f6086610f526012600a0a8661343390919063ffffffff16565b61346690919063ffffffff16565b9750610f75883461341a90919063ffffffff16565b93505b610f8d8360095461348190919063ffffffff16565b600981905550610fa86007548461346690919063ffffffff16565b9150610fbf8260085461348190919063ffffffff16565b600881905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a856000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561109257600080fd5b6102c65a03f115156110a357600080fd5b5050506040518051905015156110b857600080fd5b6000841115611102578873ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050151561110157600080fd5b5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc899081150290604051600060405180830381858888f19350505050151561116457600080fd5b6001600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f8f28852646c20cc973d3a8218f7eefed58c25c909f78f0265af4818c3d4dc2718984604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1600860ff16600a0a631ad274800260095414156112485761124661349f565b505b6001995050505050505050505090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156112c257600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561131e57600080fd5b600a548411151561132e57600080fd5b600b54915083600b819055507f97e165b35cdd33d0612173780f6b087e9d1bf014f1c2569b91e5463f043714dc3383600b54604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1600192505050919050565b6113d16064620dbba061346690919063ffffffff16565b81565b600e6020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561148d57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156114c857600080fd5b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614905080915050919050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061161c5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8061167357506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b905080915050919050565b60085481565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116c857600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561172457600080fd5b600b54841115151561173557600080fd5b600a54915083600a819055507f21c9aa51794e3f9069f3de59b27bb45fbff651793d53a4488f1b67f6695440863383600a54604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1600192505050919050565b600860ff16600a0a81565b600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561180e57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561186a57600080fd5b61187261349f565b91505090565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156118bc57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806119655750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b151561197057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156119ac57600080fd5b600160028111156119b957fe5b8460028111156119c557fe5b14806119e657506002808111156119d857fe5b8460028111156119e457fe5b145b80611a075750600060028111156119f957fe5b846002811115611a0557fe5b145b1515611a1257600080fd5b611a1a611cc8565b151515611a2657600080fd5b83600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836002811115611a8157fe5b02179055503391507f3f3816908a5fa8ed32f84d4db7048658b4bd1fa807f45a93ce4ba9ad599cd34b828686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001826002811115611b2157fe5b60ff168152602001935050505060405180910390a160019250505092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600881565b600860ff16600a0a631ad274800281565b60095481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c0757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611c4357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611c7e57600080fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000600c60149054906101000a900460ff1615611ce85760019050611d27565b611cf0612e75565b6006541015611d025760019050611d27565b600860ff16600a0a631ad27480026009541415611d225760019050611d27565b600090505b90565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611d6e57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611e175750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b1515611e2257600080fd5b60016002811115611e2f57fe5b846002811115611e3b57fe5b1480611e5c5750600280811115611e4e57fe5b846002811115611e5a57fe5b145b80611e7d575060006002811115611e6f57fe5b846002811115611e7b57fe5b145b1515611e8857600080fd5b611e90611cc8565b151515611e9c57600080fd5b600091505b8585905082101561207e57600073ffffffffffffffffffffffffffffffffffffffff168686848181101515611ed257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611f1257600080fd5b83600d60008888868181101515611f2557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836002811115611f9757fe5b02179055507f3f3816908a5fa8ed32f84d4db7048658b4bd1fa807f45a93ce4ba9ad599cd34b338787858181101515611fcc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600281111561205e57fe5b60ff168152602001935050505060405180910390a1816001019150611ea1565b6001925050509392505050565b635a96537081565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156120d757600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561213357600080fd5b6005548411151561214357600080fd5b6006549150836006819055507f0e0a217b45fa8e6dc38c0fda88bbbb9b96178275cacb888c6808412f591107dc3383600654604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1600192505050919050565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561221357600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561226f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156122ab57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915083600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa51743acc566a17de801f1b15ea2b3b0ef044d425ccb02be8d95d44455436d203383600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1600192505050919050565b600b5481565b600c60149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156124b157600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561250d57600080fd5b600554612518612e75565b10151561252457600080fd5b60008411151561253357600080fd5b6007549150836007819055507fe8f5c522733efafaa9c4f460ea05ee7b1605a75153e07df85282591614d9f7393383600754604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1600192505050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b67016345785d8a000081565b678ac7230489e8000081565b635aa8c87081565b620dbba081565b60065481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156126d357600080fd5b6102c65a03f115156126e457600080fd5b50505060405180519050905090565b600a5481565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561273d57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561279957600080fd5b600654841015156127a957600080fd5b6127b1612e75565b841115156127be57600080fd5b6005549150836005819055507f2862939a113df50e6874fd0ebe19f330e3a50d2de096a9ac037b427bd17d3a433383600554604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1600192505050919050565b600080600080600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561289257600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061293b5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b151561294657600080fd5b600554612951612e75565b10151561295d57600080fd5b60008911151561296c57600080fd5b60008811151561297b57600080fd5b612995600860ff16600a0a8a61343390919063ffffffff16565b94506129b1600860ff16600a0a8961343390919063ffffffff16565b93506129c6848661348190919063ffffffff16565b9250600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612a8d57600080fd5b6102c65a03f11515612a9e57600080fd5b505050604051805190509150818311151515612ab957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e0f14c5f8b87878b6000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018260ff1660ff168152602001945050505050602060405180830381600087803b1515612b9c57600080fd5b6102c65a03f11515612bad57600080fd5b505050604051805190501515612bc257600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515612cb157600080fd5b6102c65a03f11515612cc257600080fd5b505050604051805190501515612cd757600080fd5b612cec8360095461348190919063ffffffff16565b600981905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612db757600080fd5b6102c65a03f11515612dc857600080fd5b5050506040518051905091506000821415612de757612de561349f565b505b7ffdec941f50161ee3bd56739e1e7b2747b09b0e0936ea55d83e3e6f7b9a2a1fa58a8489604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018260ff1660ff168152602001935050505060405180910390a15050505050949350505050565b6012600a0a81565b600042905090565b60055481565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612f2f5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b905080915050919050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614905080915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ff457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561303057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561315e57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156131ba57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156131f657600080fd5b60008460ff16148061320b575060018460ff16145b151561321657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663797f202e86866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff16815260200192505050602060405180830381600087803b15156132e957600080fd5b6102c65a03f115156132fa57600080fd5b50505060405180519050915060008211151561331557600080fd5b600954821115151561332657600080fd5b61333b8260095461341a90919063ffffffff16565b60098190555060019250505092915050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600060028111156133ac57fe5b8160028111156133b857fe5b14156133c75760009150613414565b600160028111156133d457fe5b8160028111156133e057fe5b148061340157506002808111156133f357fe5b8160028111156133ff57fe5b145b1561340f5760019150613414565b600091505b50919050565b600082821115151561342857fe5b818303905092915050565b60008082840290506000841480613454575082848281151561345157fe5b04145b151561345c57fe5b8091505092915050565b600080828481151561347457fe5b0490508091505092915050565b600080828401905083811015151561349557fe5b8091505092915050565b600080600c60149054906101000a900460ff161515156134be57600080fd5b6001600c60146101000a81548160ff021916908315150217905550600860ff16600a0a631ad2748002600954101561363357613512600954600860ff16600a0a631ad274800261341a90919063ffffffff16565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15156135a457600080fd5b6102c65a03f115156135b557600080fd5b5050507f23ff0e75edf108e3d0392d92e13e8c8a868ef19001bd49f9e94876dc46dff87f33826135e3612e75565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15b7f66b6851664a82efe6b871e434faba2b11421d2dad65eb71a344ae76cca8a2b863361365d612e75565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001915050905600a165627a7a723058208ea21b3f395e336b88d7d2aa561d5e9994ca2032511309440b06f6028e4f9a8500290000000000000000000000000d262e5dc4a06a0f1c90ce79c7a60c09dfc884e4000000000000000000000000784b96cd15ffa57e91b495d5c5b4f2b195fe3b3b000000000000000000000000aec1e80c1b32d8129e34d8180204c9dbbc52df04

Deployed Bytecode

0x606060405260043610610246576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063026345b61461025157806303ed9d21146102a65780631a8fc985146102e1578063205b19461461030a5780632c1e816d1461035b5780632f54bf6e146103ac5780633290ce29146103fd57806336ac1dd01461041f5780634042b66f14610470578063473b0d4614610499578063498b7718146104d45780634bb278f3146104fd5780634d399cb31461052a578063521eb2731461058757806355a373d6146105dc5780635b7f415c146106315780635d0cb15d1461066057806363b2011714610689578063707789c5146106b257806374c06f5d1461070357806376c6dc1614610730578063781cd99d146107825780637df6a6c8146107ab578063848b86e3146107e65780638d3d6576146108375780638d4e4083146108605780638da5cb5b1461088d5780638ea64376146108e2578063904bd6d0146109375780639b19251a146109725780639d7233d4146109cd5780639f132677146109f6578063a07c765f14610a1f578063a5f75a5e14610a48578063a85adeab14610a71578063a96af0f414610a9a578063aaffadf314610ac3578063c44bef7514610aec578063c9f613d514610b27578063ce809e4e14610b96578063d18e81b314610bbf578063e6fd48bc14610be8578063ec57332014610c11578063ef326c6d14610c62578063f2fde38b14610cb3578063f856d60514610cec578063fc6f946814610d15578063fc914fdb14610d6a575b61024e610dc7565b50005b341561025c57600080fd5b610264611258565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b157600080fd5b6102c7600480803590602001909190505061127e565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b6102f46113ba565b6040518082815260200191505060405180910390f35b341561031557600080fd5b610341600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113d4565b604051808215151515815260200191505060405180910390f35b341561036657600080fd5b610392600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113f4565b604051808215151515815260200191505060405180910390f35b34156103b757600080fd5b6103e3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611512565b604051808215151515815260200191505060405180910390f35b610405610dc7565b604051808215151515815260200191505060405180910390f35b341561042a57600080fd5b610456600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611570565b604051808215151515815260200191505060405180910390f35b341561047b57600080fd5b61048361167e565b6040518082815260200191505060405180910390f35b34156104a457600080fd5b6104ba6004808035906020019091905050611684565b604051808215151515815260200191505060405180910390f35b34156104df57600080fd5b6104e76117c1565b6040518082815260200191505060405180910390f35b341561050857600080fd5b6105106117cc565b604051808215151515815260200191505060405180910390f35b341561053557600080fd5b61056d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560ff16906020019091905050611878565b604051808215151515815260200191505060405180910390f35b341561059257600080fd5b61059a611b42565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105e757600080fd5b6105ef611b68565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561063c57600080fd5b610644611b8e565b604051808260ff1660ff16815260200191505060405180910390f35b341561066b57600080fd5b610673611b93565b6040518082815260200191505060405180910390f35b341561069457600080fd5b61069c611ba4565b6040518082815260200191505060405180910390f35b34156106bd57600080fd5b6106e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611baa565b604051808215151515815260200191505060405180910390f35b341561070e57600080fd5b610716611cc8565b604051808215151515815260200191505060405180910390f35b341561073b57600080fd5b6107686004808035906020019082018035906020019190919290803560ff16906020019091905050611d2a565b604051808215151515815260200191505060405180910390f35b341561078d57600080fd5b61079561208b565b6040518082815260200191505060405180910390f35b34156107b657600080fd5b6107cc6004808035906020019091905050612093565b604051808215151515815260200191505060405180910390f35b34156107f157600080fd5b61081d600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506121cf565b604051808215151515815260200191505060405180910390f35b341561084257600080fd5b61084a612409565b6040518082815260200191505060405180910390f35b341561086b57600080fd5b61087361240f565b604051808215151515815260200191505060405180910390f35b341561089857600080fd5b6108a0612422565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108ed57600080fd5b6108f5612447565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561094257600080fd5b610958600480803590602001909190505061246d565b604051808215151515815260200191505060405180910390f35b341561097d57600080fd5b6109a9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506125bf565b604051808260028111156109b957fe5b60ff16815260200191505060405180910390f35b34156109d857600080fd5b6109e06125df565b6040518082815260200191505060405180910390f35b3415610a0157600080fd5b610a096125eb565b6040518082815260200191505060405180910390f35b3415610a2a57600080fd5b610a326125f7565b6040518082815260200191505060405180910390f35b3415610a5357600080fd5b610a5b6125ff565b6040518082815260200191505060405180910390f35b3415610a7c57600080fd5b610a84612606565b6040518082815260200191505060405180910390f35b3415610aa557600080fd5b610aad61260c565b6040518082815260200191505060405180910390f35b3415610ace57600080fd5b610ad66126f3565b6040518082815260200191505060405180910390f35b3415610af757600080fd5b610b0d60048080359060200190919050506126f9565b604051808215151515815260200191505060405180910390f35b3415610b3257600080fd5b610b7c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001909190803560ff1690602001909190505061284a565b604051808215151515815260200191505060405180910390f35b3415610ba157600080fd5b610ba9612e6d565b6040518082815260200191505060405180910390f35b3415610bca57600080fd5b610bd2612e75565b6040518082815260200191505060405180910390f35b3415610bf357600080fd5b610bfb612e7d565b6040518082815260200191505060405180910390f35b3415610c1c57600080fd5b610c48600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612e83565b604051808215151515815260200191505060405180910390f35b3415610c6d57600080fd5b610c99600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612f3a565b604051808215151515815260200191505060405180910390f35b3415610cbe57600080fd5b610cea600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612f99565b005b3415610cf757600080fd5b610cff6130ee565b6040518082815260200191505060405180910390f35b3415610d2057600080fd5b610d286130f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d7557600080fd5b610dad600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560ff1690602001909190505061311a565b604051808215151515815260200191505060405180910390f35b600080600080600080600080600080610dde612e75565b905080600554101515610df057600080fd5b60065481101515610e0057600080fd5b33985034975060001515600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515610e6557600080fd5b610e6e8961334d565b1515610e7957600080fd5b600a548810151515610e8a57600080fd5b600b548811151515610e9b57600080fd5b600860ff16600a0a631ad2748002600954101515610eb857600080fd5b610eda600954600860ff16600a0a631ad274800261341a90919063ffffffff16565b9650610ef8600860ff16600a0a60075461343390919063ffffffff16565b9550610f236012600a0a610f15888b61343390919063ffffffff16565b61346690919063ffffffff16565b94506000935084925084871015610f7857869250610f6086610f526012600a0a8661343390919063ffffffff16565b61346690919063ffffffff16565b9750610f75883461341a90919063ffffffff16565b93505b610f8d8360095461348190919063ffffffff16565b600981905550610fa86007548461346690919063ffffffff16565b9150610fbf8260085461348190919063ffffffff16565b600881905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a856000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561109257600080fd5b6102c65a03f115156110a357600080fd5b5050506040518051905015156110b857600080fd5b6000841115611102578873ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050151561110157600080fd5b5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc899081150290604051600060405180830381858888f19350505050151561116457600080fd5b6001600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f8f28852646c20cc973d3a8218f7eefed58c25c909f78f0265af4818c3d4dc2718984604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1600860ff16600a0a631ad274800260095414156112485761124661349f565b505b6001995050505050505050505090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156112c257600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561131e57600080fd5b600a548411151561132e57600080fd5b600b54915083600b819055507f97e165b35cdd33d0612173780f6b087e9d1bf014f1c2569b91e5463f043714dc3383600b54604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1600192505050919050565b6113d16064620dbba061346690919063ffffffff16565b81565b600e6020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561148d57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156114c857600080fd5b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614905080915050919050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061161c5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8061167357506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b905080915050919050565b60085481565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116c857600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561172457600080fd5b600b54841115151561173557600080fd5b600a54915083600a819055507f21c9aa51794e3f9069f3de59b27bb45fbff651793d53a4488f1b67f6695440863383600a54604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1600192505050919050565b600860ff16600a0a81565b600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561180e57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561186a57600080fd5b61187261349f565b91505090565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156118bc57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806119655750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b151561197057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156119ac57600080fd5b600160028111156119b957fe5b8460028111156119c557fe5b14806119e657506002808111156119d857fe5b8460028111156119e457fe5b145b80611a075750600060028111156119f957fe5b846002811115611a0557fe5b145b1515611a1257600080fd5b611a1a611cc8565b151515611a2657600080fd5b83600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836002811115611a8157fe5b02179055503391507f3f3816908a5fa8ed32f84d4db7048658b4bd1fa807f45a93ce4ba9ad599cd34b828686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001826002811115611b2157fe5b60ff168152602001935050505060405180910390a160019250505092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600881565b600860ff16600a0a631ad274800281565b60095481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c0757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611c4357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611c7e57600080fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000600c60149054906101000a900460ff1615611ce85760019050611d27565b611cf0612e75565b6006541015611d025760019050611d27565b600860ff16600a0a631ad27480026009541415611d225760019050611d27565b600090505b90565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611d6e57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611e175750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b1515611e2257600080fd5b60016002811115611e2f57fe5b846002811115611e3b57fe5b1480611e5c5750600280811115611e4e57fe5b846002811115611e5a57fe5b145b80611e7d575060006002811115611e6f57fe5b846002811115611e7b57fe5b145b1515611e8857600080fd5b611e90611cc8565b151515611e9c57600080fd5b600091505b8585905082101561207e57600073ffffffffffffffffffffffffffffffffffffffff168686848181101515611ed257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611f1257600080fd5b83600d60008888868181101515611f2557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836002811115611f9757fe5b02179055507f3f3816908a5fa8ed32f84d4db7048658b4bd1fa807f45a93ce4ba9ad599cd34b338787858181101515611fcc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600281111561205e57fe5b60ff168152602001935050505060405180910390a1816001019150611ea1565b6001925050509392505050565b635a96537081565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156120d757600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561213357600080fd5b6005548411151561214357600080fd5b6006549150836006819055507f0e0a217b45fa8e6dc38c0fda88bbbb9b96178275cacb888c6808412f591107dc3383600654604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1600192505050919050565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561221357600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561226f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156122ab57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915083600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa51743acc566a17de801f1b15ea2b3b0ef044d425ccb02be8d95d44455436d203383600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1600192505050919050565b600b5481565b600c60149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156124b157600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561250d57600080fd5b600554612518612e75565b10151561252457600080fd5b60008411151561253357600080fd5b6007549150836007819055507fe8f5c522733efafaa9c4f460ea05ee7b1605a75153e07df85282591614d9f7393383600754604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1600192505050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b67016345785d8a000081565b678ac7230489e8000081565b635aa8c87081565b620dbba081565b60065481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156126d357600080fd5b6102c65a03f115156126e457600080fd5b50505060405180519050905090565b600a5481565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561273d57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561279957600080fd5b600654841015156127a957600080fd5b6127b1612e75565b841115156127be57600080fd5b6005549150836005819055507f2862939a113df50e6874fd0ebe19f330e3a50d2de096a9ac037b427bd17d3a433383600554604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1600192505050919050565b600080600080600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561289257600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061293b5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b151561294657600080fd5b600554612951612e75565b10151561295d57600080fd5b60008911151561296c57600080fd5b60008811151561297b57600080fd5b612995600860ff16600a0a8a61343390919063ffffffff16565b94506129b1600860ff16600a0a8961343390919063ffffffff16565b93506129c6848661348190919063ffffffff16565b9250600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612a8d57600080fd5b6102c65a03f11515612a9e57600080fd5b505050604051805190509150818311151515612ab957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e0f14c5f8b87878b6000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018260ff1660ff168152602001945050505050602060405180830381600087803b1515612b9c57600080fd5b6102c65a03f11515612bad57600080fd5b505050604051805190501515612bc257600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515612cb157600080fd5b6102c65a03f11515612cc257600080fd5b505050604051805190501515612cd757600080fd5b612cec8360095461348190919063ffffffff16565b600981905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612db757600080fd5b6102c65a03f11515612dc857600080fd5b5050506040518051905091506000821415612de757612de561349f565b505b7ffdec941f50161ee3bd56739e1e7b2747b09b0e0936ea55d83e3e6f7b9a2a1fa58a8489604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018260ff1660ff168152602001935050505060405180910390a15050505050949350505050565b6012600a0a81565b600042905090565b60055481565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612f2f5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b905080915050919050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614905080915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ff457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561303057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561315e57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156131ba57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156131f657600080fd5b60008460ff16148061320b575060018460ff16145b151561321657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663797f202e86866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff16815260200192505050602060405180830381600087803b15156132e957600080fd5b6102c65a03f115156132fa57600080fd5b50505060405180519050915060008211151561331557600080fd5b600954821115151561332657600080fd5b61333b8260095461341a90919063ffffffff16565b60098190555060019250505092915050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600060028111156133ac57fe5b8160028111156133b857fe5b14156133c75760009150613414565b600160028111156133d457fe5b8160028111156133e057fe5b148061340157506002808111156133f357fe5b8160028111156133ff57fe5b145b1561340f5760019150613414565b600091505b50919050565b600082821115151561342857fe5b818303905092915050565b60008082840290506000841480613454575082848281151561345157fe5b04145b151561345c57fe5b8091505092915050565b600080828481151561347457fe5b0490508091505092915050565b600080828401905083811015151561349557fe5b8091505092915050565b600080600c60149054906101000a900460ff161515156134be57600080fd5b6001600c60146101000a81548160ff021916908315150217905550600860ff16600a0a631ad2748002600954101561363357613512600954600860ff16600a0a631ad274800261341a90919063ffffffff16565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15156135a457600080fd5b6102c65a03f115156135b557600080fd5b5050507f23ff0e75edf108e3d0392d92e13e8c8a868ef19001bd49f9e94876dc46dff87f33826135e3612e75565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15b7f66b6851664a82efe6b871e434faba2b11421d2dad65eb71a344ae76cca8a2b863361365d612e75565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001915050905600a165627a7a723058208ea21b3f395e336b88d7d2aa561d5e9994ca2032511309440b06f6028e4f9a850029

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

0000000000000000000000000d262e5dc4a06a0f1c90ce79c7a60c09dfc884e4000000000000000000000000784b96cd15ffa57e91b495d5c5b4f2b195fe3b3b000000000000000000000000aec1e80c1b32d8129e34d8180204c9dbbc52df04

-----Decoded View---------------
Arg [0] : _tokenContract (address): 0x0D262e5dC4A06a0F1c90cE79C7a60C09DfC884E4
Arg [1] : _ledgerContract (address): 0x784B96cd15ffA57E91b495D5C5b4F2B195Fe3B3B
Arg [2] : _wallet (address): 0xaeC1E80c1b32d8129e34D8180204c9DbBc52Df04

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000d262e5dc4a06a0f1c90ce79c7a60c09dfc884e4
Arg [1] : 000000000000000000000000784b96cd15ffa57e91b495d5c5b4f2b195fe3b3b
Arg [2] : 000000000000000000000000aec1e80c1b32d8129e34d8180204c9dbbc52df04


Swarm Source

bzzr://8ea21b3f395e336b88d7d2aa561d5e9994ca2032511309440b06f6028e4f9a85

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.