ETH Price: $3,433.01 (-2.38%)
Gas: 3 Gwei

Token

YESTERDAY (YESTERDAY)
 

Overview

Max Total Supply

777,832.033671316008675216 YESTERDAY

Holders

3,170

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
57.038244455622848725 YESTERDAY

Value
$0.00
0xf70F772e6f452BF7f7C2645F4fbe0856c716aD51
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DayToken

Compiler Version
v0.4.16+commit.d7661dd9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2017-09-15
*/

pragma solidity ^0.4.13; 


////////////////// >>>>> Wallet Contract <<<<< ///////////////////


/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
/// @author Stefan George - <[email protected]>
contract MultiSigWallet {

    uint constant public MAX_OWNER_COUNT = 50;

    event Confirmation(address indexed sender, uint indexed transactionId);
    event Revocation(address indexed sender, uint indexed transactionId);
    event Submission(uint indexed transactionId);
    event Execution(uint indexed transactionId);
    event ExecutionFailure(uint indexed transactionId);
    event Deposit(address indexed sender, uint value);
    event OwnerAddition(address indexed owner);
    event OwnerRemoval(address indexed owner);
    event RequirementChange(uint required);

    mapping (uint => Transaction) public transactions;
    mapping (uint => mapping (address => bool)) public confirmations;
    mapping (address => bool) public isOwner;
    address[] public owners;
    uint public required;
    uint public transactionCount;

    struct Transaction {
        address destination;
        uint value;
        bytes data;
        bool executed;
    }

    modifier onlyWallet() {
        if (msg.sender != address(this))
            throw;
        _;
    }

    modifier ownerDoesNotExist(address owner) {
        if (isOwner[owner])
            throw;
        _;
    }

    modifier ownerExists(address owner) {
        if (!isOwner[owner])
            throw;
        _;
    }

    modifier transactionExists(uint transactionId) {
        if (transactions[transactionId].destination == 0)
            throw;
        _;
    }

    modifier confirmed(uint transactionId, address owner) {
        if (!confirmations[transactionId][owner])
            throw;
        _;
    }

    modifier notConfirmed(uint transactionId, address owner) {
        if (confirmations[transactionId][owner])
            throw;
        _;
    }

    modifier notExecuted(uint transactionId) {
        if (transactions[transactionId].executed)
            throw;
        _;
    }

    modifier notNull(address _address) {
        if (_address == 0)
            throw;
        _;
    }

    modifier validRequirement(uint ownerCount, uint _required) {
        if (   ownerCount > MAX_OWNER_COUNT
            || _required > ownerCount
            || _required == 0
            || ownerCount == 0)
            throw;
        _;
    }

    /// @dev Fallback function allows to deposit ether.
    function()
        payable
    {
        if (msg.value > 0)
            Deposit(msg.sender, msg.value);
    }

    /*
     * Public functions
     */
    /// @dev Contract constructor sets initial owners and required number of confirmations.
    /// @param _owners List of initial owners.
    /// @param _required Number of required confirmations.
    function MultiSigWallet(address[] _owners, uint _required)
        public
        validRequirement(_owners.length, _required)
    {
        for (uint i=0; i<_owners.length; i++) {
            if (isOwner[_owners[i]] || _owners[i] == 0)
                throw;
            isOwner[_owners[i]] = true;
        }
        owners = _owners;
        required = _required;
    }

    /// @dev Allows to add a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of new owner.
    function addOwner(address owner)
        public
        onlyWallet
        ownerDoesNotExist(owner)
        notNull(owner)
        validRequirement(owners.length + 1, required)
    {
        isOwner[owner] = true;
        owners.push(owner);
        OwnerAddition(owner);
    }

    /// @dev Allows to remove an owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner.
    function removeOwner(address owner)
        public
        onlyWallet
        ownerExists(owner)
    {
        isOwner[owner] = false;
        for (uint i=0; i<owners.length - 1; i++)
            if (owners[i] == owner) {
                owners[i] = owners[owners.length - 1];
                break;
            }
        owners.length -= 1;
        if (required > owners.length)
            changeRequirement(owners.length);
        OwnerRemoval(owner);
    }

    /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner to be replaced.
    /// @param owner Address of new owner.
    function replaceOwner(address owner, address newOwner)
        public
        onlyWallet
        ownerExists(owner)
        ownerDoesNotExist(newOwner)
    {
        for (uint i=0; i<owners.length; i++)
            if (owners[i] == owner) {
                owners[i] = newOwner;
                break;
            }
        isOwner[owner] = false;
        isOwner[newOwner] = true;
        OwnerRemoval(owner);
        OwnerAddition(newOwner);
    }

    /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
    /// @param _required Number of required confirmations.
    function changeRequirement(uint _required)
        public
        onlyWallet
        validRequirement(owners.length, _required)
    {
        required = _required;
        RequirementChange(_required);
    }

    /// @dev Allows an owner to submit and confirm a transaction.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function submitTransaction(address destination, uint value, bytes data)
        public
        returns (uint transactionId)
    {
        transactionId = addTransaction(destination, value, data);
        confirmTransaction(transactionId);
    }

    /// @dev Allows an owner to confirm a transaction.
    /// @param transactionId Transaction ID.
    function confirmTransaction(uint transactionId)
        public
        ownerExists(msg.sender)
        transactionExists(transactionId)
        notConfirmed(transactionId, msg.sender)
    {
        confirmations[transactionId][msg.sender] = true;
        Confirmation(msg.sender, transactionId);
        executeTransaction(transactionId);
    }

    /// @dev Allows an owner to revoke a confirmation for a transaction.
    /// @param transactionId Transaction ID.
    function revokeConfirmation(uint transactionId)
        public
        ownerExists(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        confirmations[transactionId][msg.sender] = false;
        Revocation(msg.sender, transactionId);
    }

    /// @dev Allows anyone to execute a confirmed transaction.
    /// @param transactionId Transaction ID.
    function executeTransaction(uint transactionId)
        public
        notExecuted(transactionId)
    {
        if (isConfirmed(transactionId)) {
            Transaction tx = transactions[transactionId];
            tx.executed = true;
            if (tx.destination.call.value(tx.value)(tx.data))
                Execution(transactionId);
            else {
                ExecutionFailure(transactionId);
                tx.executed = false;
            }
        }
    }

    /// @dev Returns the confirmation status of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Confirmation status.
    function isConfirmed(uint transactionId)
        public
        constant
        returns (bool)
    {
        uint count = 0;
        for (uint i=0; i<owners.length; i++) {
            if (confirmations[transactionId][owners[i]])
                count += 1;
            if (count == required)
                return true;
        }
    }

    /*
     * Internal functions
     */
    /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function addTransaction(address destination, uint value, bytes data)
        internal
        notNull(destination)
        returns (uint transactionId)
    {
        transactionId = transactionCount;
        transactions[transactionId] = Transaction({
            destination: destination,
            value: value,
            data: data,
            executed: false
        });
        transactionCount += 1;
        Submission(transactionId);
    }

    /*
     * Web3 call functions
     */
    /// @dev Returns number of confirmations of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Number of confirmations.
    function getConfirmationCount(uint transactionId)
        public
        constant
        returns (uint count)
    {
        for (uint i=0; i<owners.length; i++)
            if (confirmations[transactionId][owners[i]])
                count += 1;
    }

    /// @dev Returns total number of transactions after filers are applied.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Total number of transactions after filters are applied.
    function getTransactionCount(bool pending, bool executed)
        public
        constant
        returns (uint count)
    {
        for (uint i=0; i<transactionCount; i++)
            if (   pending && !transactions[i].executed
                || executed && transactions[i].executed)
                count += 1;
    }

    /// @dev Returns list of owners.
    /// @return List of owner addresses.
    function getOwners()
        public
        constant
        returns (address[])
    {
        return owners;
    }

    /// @dev Returns array with owner addresses, which confirmed transaction.
    /// @param transactionId Transaction ID.
    /// @return Returns array of owner addresses.
    function getConfirmations(uint transactionId)
        public
        constant
        returns (address[] _confirmations)
    {
        address[] memory confirmationsTemp = new address[](owners.length);
        uint count = 0;
        uint i;
        for (i=0; i<owners.length; i++)
            if (confirmations[transactionId][owners[i]]) {
                confirmationsTemp[count] = owners[i];
                count += 1;
            }
        _confirmations = new address[](count);
        for (i=0; i<count; i++)
            _confirmations[i] = confirmationsTemp[i];
    }

    /// @dev Returns list of transaction IDs in defined range.
    /// @param from Index start position of transaction array.
    /// @param to Index end position of transaction array.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Returns array of transaction IDs.
    function getTransactionIds(uint from, uint to, bool pending, bool executed)
        public
        constant
        returns (uint[] _transactionIds)
    {
        uint[] memory transactionIdsTemp = new uint[](transactionCount);
        uint count = 0;
        uint i;
        for (i=0; i<transactionCount; i++)
            if (   pending && !transactions[i].executed
                || executed && transactions[i].executed)
            {
                transactionIdsTemp[count] = i;
                count += 1;
            }
        _transactionIds = new uint[](to - from);
        for (i=from; i<to; i++)
            _transactionIds[i - from] = transactionIdsTemp[i];
    }
}


////////////////// >>>>> Library Contracts <<<<< ///////////////////


contract SafeMathLib {
  function safeMul(uint a, uint b) constant returns (uint) {
    uint c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function safeSub(uint a, uint b) constant returns (uint) {
    assert(b <= a);
    return a - b;
  }

  function safeAdd(uint a, uint b) constant returns (uint) {
    uint c = a + b;
    assert(c>=a);
    return c;
  }
}




/**
 * @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;
  address public newOwner;
  event OwnershipTransferred(address indexed _from, address indexed _to);
  /** 
   * @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 {
    newOwner = _newOwner;
  }

  function acceptOwnership() {
    require(msg.sender == newOwner);
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}


////////////////// >>>>> Token Contracts <<<<< ///////////////////

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20Basic {
  uint public totalSupply;
  function balanceOf(address _owner) constant returns (uint balance);
  function transfer(address _to, uint _value) returns (bool success);
  event Transfer(address indexed _from, address indexed _to, uint _value);
}


/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address _owner, address _spender) constant returns (uint remaining);
  function transferFrom(address _from, address _to, uint _value) returns (bool success);
  function approve(address _spender, uint _value) returns (bool success);
  event Approval(address indexed _owner, address indexed _spender, uint _value);
}



/**
 * Standard ERC20 token with Short Hand Attack and approve() race condition mitigation.
 *
 * Based on code by FirstBlood:
 * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, SafeMathLib {
  /* Token supply got increased and a new owner received these tokens */
  event Minted(address receiver, uint amount);

  /* Actual balances of token holders */
  mapping(address => uint) balances;

  /* approve() allowances */
  mapping (address => mapping (address => uint)) allowed;

  function transfer(address _to, uint _value) returns (bool success) {
    if (balances[msg.sender] >= _value 
        && _value > 0 
        && balances[_to] + _value > balances[_to]
        ) {
      balances[msg.sender] = safeSub(balances[msg.sender],_value);
      balances[_to] = safeAdd(balances[_to],_value);
      Transfer(msg.sender, _to, _value);
      return true;
    }
    else{
      return false;
    }
    
  }

  function transferFrom(address _from, address _to, uint _value) returns (bool success) {
    uint _allowance = allowed[_from][msg.sender];

    if (balances[_from] >= _value   // From a/c has balance
        && _allowance >= _value    // Transfer approved
        && _value > 0              // Non-zero transfer
        && balances[_to] + _value > balances[_to]  // Overflow check
        ){
    balances[_to] = safeAdd(balances[_to],_value);
    balances[_from] = safeSub(balances[_from],_value);
    allowed[_from][msg.sender] = safeSub(_allowance,_value);
    Transfer(_from, _to, _value);
    return true;
        }
    else {
      return false;
    }
  }

  function balanceOf(address _owner) constant returns (uint balance) {
    return balances[_owner];
  }

  function approve(address _spender, uint _value) returns (bool success) {

    // To change the approve amount you first have to reduce the addresses`
    //  allowance to zero by calling `approve(_spender, 0)` if it is not
    //  already 0 to mitigate the race condition described here:
    //  https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
    require((_value == 0) || (allowed[msg.sender][_spender] == 0));

    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  function allowance(address _owner, address _spender) constant returns (uint remaining) {
    return allowed[_owner][_spender];
  }

}


    

/**
 * A token that can increase its supply by another contract.
 *
 * This allows uncapped crowdsale by dynamically increasing the supply when money pours in.
 * Only mint agents, contracts whitelisted by owner, can mint new tokens.
 *
 */
contract MintableToken is StandardToken, Ownable {

  bool public mintingFinished = false;

  /** List of agents that are allowed to create new tokens */
  mapping (address => bool) public mintAgents;

  event MintingAgentChanged(address addr, bool state  );

  /**
   * Create new tokens and allocate them to an address..
   *
   * Only callably by a crowdsale contract (mint agent).
   */
  function mint(address receiver, uint amount) onlyMintAgent canMint public {
    totalSupply = safeAdd(totalSupply, amount);
    balances[receiver] = safeAdd(balances[receiver], amount);
    // This will make the mint transaction apper in EtherScan.io
    // We can remove this after there is a standardized minting event
    Transfer(0, receiver, amount);
  }

  /**
   * Owner can allow a crowdsale contract to mint new tokens.
   */
  function setMintAgent(address addr, bool state) onlyOwner canMint public {
    mintAgents[addr] = state;
    MintingAgentChanged(addr, state);
  }

  modifier onlyMintAgent() {
    // Only crowdsale contracts are allowed to mint new tokens
    require(mintAgents[msg.sender]);
    _;
  }

  /** Make sure we are not done yet. */
  modifier canMint() {
    require(!mintingFinished);
    _;
  }
}



/**
 * Define interface for releasing the token transfer after a successful crowdsale.
 */
contract ReleasableToken is ERC20, Ownable {

  /* The finalizer contract that allows unlift the transfer limits on this token */
  address public releaseAgent;

  /** A crowdsale contract can release us to the wild if ICO success. 
   * If false we are are in transfer lock up period.
   */
  bool public released = false;

  /** Map of agents that are allowed to transfer tokens regardless of the lock down period. 
   * These are crowdsale contracts and possible the team multisig itself. 
   */
  mapping (address => bool) public transferAgents;

  /**
   * Limit token transfer until the crowdsale is over.
   */
  modifier canTransfer(address _sender) {

    if (!released) {
        require(transferAgents[_sender]);
    }

    _;
  }

  /**
   * Set the contract that can call release and make the token transferable.
   *
   * Design choice. Allow reset the release agent to fix fat finger mistakes.
   */
  function setReleaseAgent(address addr) onlyOwner inReleaseState(false) public {

    // We don't do interface check here as we might want to a normal wallet address to act as a release agent
    releaseAgent = addr;
  }

  /**
   * Owner can allow a particular address (a crowdsale contract) to transfer tokens despite the lock up period.
   */
  function setTransferAgent(address addr, bool state) onlyOwner inReleaseState(false) public {
    transferAgents[addr] = state;
  }

  /**
   * One way function to release the tokens to the wild.
   *
   * Can be called only from the release agent that is the final ICO contract. 
   * It is only called if the crowdsale has been success (first milestone reached).
   */
  function releaseTokenTransfer() public onlyReleaseAgent {
    released = true;
  }

  /** The function can be called only before or after the tokens have been releasesd */
  modifier inReleaseState(bool releaseState) {
    require(releaseState == released);
    _;
  }

  /** The function can be called only by a whitelisted release agent. */
  modifier onlyReleaseAgent() {
    require(msg.sender == releaseAgent);
    _;
  }

  function transfer(address _to, uint _value) canTransfer(msg.sender) returns (bool success) {
    // Call StandardToken.transfer()
   return super.transfer(_to, _value);
  }

  function transferFrom(address _from, address _to, uint _value) canTransfer(_from) returns (bool success) {
    // Call StandardToken.transferForm()
    return super.transferFrom(_from, _to, _value);
  }

}


 

/**
 * Upgrade agent interface inspired by Lunyr.
 *
 * Upgrade agent transfers tokens to a new contract.
 * Upgrade agent itself can be the token contract, or just a middle man contract doing the heavy lifting.
 */
contract UpgradeAgent {
  uint public originalSupply;
  /** Interface marker */
  function isUpgradeAgent() public constant returns (bool) {
    return true;
  }
  function upgradeFrom(address _from, uint256 _value) public;
}

/**
 * A token upgrade mechanism where users can opt-in amount of tokens to the next smart contract revision.
 *
 * First envisioned by Golem and Lunyr projects.
 */
contract UpgradeableToken is StandardToken {

  /** Contract / person who can set the upgrade path. 
   * This can be the same as team multisig wallet, as what it is with its default value. 
   */
  address public upgradeMaster;

  /** The next contract where the tokens will be migrated. */
  UpgradeAgent public upgradeAgent;

  /** How many tokens we have upgraded by now. */
  uint256 public totalUpgraded;

  /**
   * Upgrade states.
   *
   * - NotAllowed: The child contract has not reached a condition where the upgrade can bgun
   * - WaitingForAgent: Token allows upgrade, but we don't have a new agent yet
   * - ReadyToUpgrade: The agent is set, but not a single token has been upgraded yet
   * - Upgrading: Upgrade agent is set and the balance holders can upgrade their tokens
   *
   */
  enum UpgradeState {Unknown, NotAllowed, WaitingForAgent, ReadyToUpgrade, Upgrading}

  /**
   * Somebody has upgraded some of their tokens.
   */
  event Upgrade(address indexed _from, address indexed _to, uint256 _value);

  /**
   * New upgrade agent available.
   */
  event UpgradeAgentSet(address agent);

  /**
   * Do not allow construction without upgrade master set.
   */
  function UpgradeableToken(address _upgradeMaster) {
    upgradeMaster = _upgradeMaster;
  }

  /**
   * Allow the token holder to upgrade some of their tokens to a new contract.
   */
  function upgrade(uint256 value) public {
    UpgradeState state = getUpgradeState();
    require((state == UpgradeState.ReadyToUpgrade || state == UpgradeState.Upgrading));
    // Validate input value.
    require(value!=0);

    balances[msg.sender] = safeSub(balances[msg.sender],value);

    // Take tokens out from circulation
    totalSupply = safeSub(totalSupply,value);
    totalUpgraded = safeAdd(totalUpgraded,value);

    // Upgrade agent reissues the tokens
    upgradeAgent.upgradeFrom(msg.sender, value);
    Upgrade(msg.sender, upgradeAgent, value);
  }

  /**
   * Set an upgrade agent that handles
   */
  function setUpgradeAgent(address agent) external {
    require(canUpgrade());
    require(agent != 0x0);
    // Only a master can designate the next agent
    require(msg.sender == upgradeMaster);
    // Upgrade has already begun for an agent
    require(getUpgradeState() != UpgradeState.Upgrading);

    upgradeAgent = UpgradeAgent(agent);

    // Bad interface
    require(upgradeAgent.isUpgradeAgent());
    // Make sure that token supplies match in source and target
    require(upgradeAgent.originalSupply() == totalSupply);

    UpgradeAgentSet(upgradeAgent);
  }

  /**
   * Get the state of the token upgrade.
   */
  function getUpgradeState() public constant returns(UpgradeState) {
    if (!canUpgrade()) return UpgradeState.NotAllowed;
    else if(address(upgradeAgent) == 0x00) return UpgradeState.WaitingForAgent;
    else if(totalUpgraded == 0) return UpgradeState.ReadyToUpgrade;
    else return UpgradeState.Upgrading;
  }

  /**
   * Change the upgrade master.
   *
   * This allows us to set a new owner for the upgrade mechanism.
   */
  function setUpgradeMaster(address master) public {
    require(master != 0x0);
    require(msg.sender == upgradeMaster);
    upgradeMaster = master;
  }

  /**
   * Child contract can enable to provide the condition when the upgrade can begun.
   */
  function canUpgrade() public constant returns(bool) {
     return true;
  }

}


/**
 * A crowdsale token.
 *
 * An ERC-20 token designed specifically for crowdsales with investor protection and 
 * further development path.
 *
 * - The token transfer() is disabled until the crowdsale is over
 * - The token contract gives an opt-in upgrade path to a new contract
 * - The same token can be part of several crowdsales through approve() mechanism
 * - The token can be capped (supply set in the constructor) 
 *   or uncapped (crowdsale contract can mint new tokens)
 */
contract DayToken is  ReleasableToken, MintableToken, UpgradeableToken {

    enum sellingStatus {NOTONSALE, EXPIRED, ONSALE}

    /** Basic structure for a contributor with a minting Address
     * adr address of the contributor
     * initialContributionDay initial contribution of the contributor in wei
     * lastUpdatedOn day count from Minting Epoch when the account balance was last updated
     * mintingPower Initial Minting power of the address
     * expiryBlockNumber Variable to mark end of Minting address sale. Set by user
     * minPriceInDay minimum price of Minting address in Day tokens. Set by user
     * status Selling status Variable for transfer Minting address.
     * sellingPriceInDay Variable for transfer Minting address. Price at which the address is actually sold
     */ 
    struct Contributor {
        address adr;
        uint256 initialContributionDay;
        uint256 lastUpdatedOn; //Day from Minting Epoch
        uint256 mintingPower;
        uint expiryBlockNumber;
        uint256 minPriceInDay;
        sellingStatus status;
    }

    /* Stores maximum days for which minting will happen since minting epoch */
    uint256 public maxMintingDays = 1095;

    /* Mapping to store id of each minting address */
    mapping (address => uint) public idOf;
    /* Mapping from id of each minting address to their respective structures */
    mapping (uint256 => Contributor) public contributors;
    /* mapping to store unix timestamp of when the minting address is issued to each team member */
    mapping (address => uint256) public teamIssuedTimestamp;
    mapping (address => bool) public soldAddresses;
    mapping (address => uint256) public sellingPriceInDayOf;

    /* Stores the id of the first  contributor */
    uint256 public firstContributorId;
    /* Stores total Pre + Post ICO TimeMints */
    uint256 public totalNormalContributorIds;
    /* Stores total Normal TimeMints allocated */
    uint256 public totalNormalContributorIdsAllocated = 0;
    
    /* Stores the id of the first team TimeMint */
    uint256 public firstTeamContributorId;
    /* Stores the total team TimeMints */
    uint256 public totalTeamContributorIds;
    /* Stores total team TimeMints allocated */
    uint256 public totalTeamContributorIdsAllocated = 0;

    /* Stores the id of the first Post ICO contributor (for auctionable TimeMints) */
    uint256 public firstPostIcoContributorId;
    /* Stores total Post ICO TimeMints (for auction) */
    uint256 public totalPostIcoContributorIds;
    /* Stores total Auction TimeMints allocated */
    uint256 public totalPostIcoContributorIdsAllocated = 0;

    /* Maximum number of address */
    uint256 public maxAddresses;

    /* Min Minting power with 19 decimals: 0.5% : 5000000000000000000 */
    uint256 public minMintingPower;
    /* Max Minting power with 19 decimals: 1% : 10000000000000000000 */
    uint256 public maxMintingPower;
    /* Halving cycle in days (88) */
    uint256 public halvingCycle; 
    /* Unix timestamp when minting is to be started */
    uint256 public initialBlockTimestamp;
    /* Flag to prevent setting initialBlockTimestamp more than once */
    bool public isInitialBlockTimestampSet;
    /* number of decimals in minting power */
    uint256 public mintingDec; 

    /* Minimum Balance in Day tokens required to sell a minting address */
    uint256 public minBalanceToSell;
    /* Team address lock down period from issued time, in seconds */
    uint256 public teamLockPeriodInSec;  //Initialize and set function
    /* Duration in secs that we consider as a day. (For test deployment purposes, 
       if we want to decrease length of a day. default: 84600)*/
    uint256 public DayInSecs;

    event UpdatedTokenInformation(string newName, string newSymbol); 
    event MintingAdrTransferred(uint id, address from, address to);
    event ContributorAdded(address adr, uint id);
    event TimeMintOnSale(uint id, address seller, uint minPriceInDay, uint expiryBlockNumber);
    event TimeMintSold(uint id, address buyer, uint offerInDay);
    event PostInvested(address investor, uint weiAmount, uint tokenAmount, uint customerId, uint contributorId);
    
    event TeamAddressAdded(address teamAddress, uint id);
    // Tell us invest was success
    event Invested(address receiver, uint weiAmount, uint tokenAmount, uint customerId, uint contributorId);

    modifier onlyContributor(uint id){
        require(isValidContributorId(id));
        _;
    }

    string public name; 

    string public symbol; 

    uint8 public decimals; 

    /**
        * Construct the token.
        *
        * This token must be created through a team multisig wallet, so that it is owned by that wallet.
        *
        * @param _name Token name
        * @param _symbol Token symbol - should be all caps
        * @param _initialSupply How many tokens we start with
        * @param _decimals Number of decimal places
        * _mintable Are new tokens created over the crowdsale or do we distribute only the initial supply?
        */
    function DayToken(string _name, string _symbol, uint _initialSupply, uint8 _decimals, 
        bool _mintable, uint _maxAddresses, uint _firstTeamContributorId, uint _totalTeamContributorIds, 
        uint _totalPostIcoContributorIds, uint256 _minMintingPower, uint256 _maxMintingPower, uint _halvingCycle, 
        uint256 _minBalanceToSell, uint256 _dayInSecs, uint256 _teamLockPeriodInSec) 
        UpgradeableToken(msg.sender) {
        
        // Create any address, can be transferred
        // to team multisig via changeOwner(),
        // also remember to call setUpgradeMaster()
        owner = msg.sender; 
        name = _name; 
        symbol = _symbol;  
        totalSupply = _initialSupply; 
        decimals = _decimals; 
        // Create initially all balance on the team multisig
        balances[owner] = totalSupply; 
        maxAddresses = _maxAddresses;
        require(maxAddresses > 1); // else division by zero will occur in setInitialMintingPowerOf
        
        firstContributorId = 1;
        totalNormalContributorIds = maxAddresses - _totalTeamContributorIds - _totalPostIcoContributorIds;

        // check timeMint total is sane
        require(totalNormalContributorIds >= 1);

        firstTeamContributorId = _firstTeamContributorId;
        totalTeamContributorIds = _totalTeamContributorIds;
        totalPostIcoContributorIds = _totalPostIcoContributorIds;
        
        // calculate first contributor id to be auctioned post ICO
        firstPostIcoContributorId = maxAddresses - totalPostIcoContributorIds + 1;
        minMintingPower = _minMintingPower;
        maxMintingPower = _maxMintingPower;
        halvingCycle = _halvingCycle;
        // setting future date far far away, year 2020, 
        // call setInitialBlockTimestamp to set proper timestamp
        initialBlockTimestamp = 1577836800;
        isInitialBlockTimestampSet = false;
        // use setMintingDec to change this
        mintingDec = 19;
        minBalanceToSell = _minBalanceToSell;
        DayInSecs = _dayInSecs;
        teamLockPeriodInSec = _teamLockPeriodInSec;
        
        if (totalSupply > 0) {
            Minted(owner, totalSupply); 
        }

        if (!_mintable) {
            mintingFinished = true; 
            require(totalSupply != 0); 
        }
    }

    /**
    * Used to set timestamp at which minting power of TimeMints is activated
    * Can be called only by owner
    * @param _initialBlockTimestamp timestamp to be set.
    */
    function setInitialBlockTimestamp(uint _initialBlockTimestamp) internal onlyOwner {
        require(!isInitialBlockTimestampSet);
        isInitialBlockTimestampSet = true;
        initialBlockTimestamp = _initialBlockTimestamp;
    }

    /**
    * check if mintining power is activated and Day token and Timemint transfer is enabled
    */
    function isDayTokenActivated() constant returns (bool isActivated) {
        return (block.timestamp >= initialBlockTimestamp);
    }


    /**
    * to check if an id is a valid contributor
    * @param _id contributor id to check.
    */
    function isValidContributorId(uint _id) constant returns (bool isValidContributor) {
        return (_id > 0 && _id <= maxAddresses && contributors[_id].adr != 0 
            && idOf[contributors[_id].adr] == _id); // cross checking
    }

    /**
    * to check if an address is a valid contributor
    * @param _address  contributor address to check.
    */
    function isValidContributorAddress(address _address) constant returns (bool isValidContributor) {
        return isValidContributorId(idOf[_address]);
    }


    /**
    * In case of Team address check if lock-in period is over (returns true for all non team addresses)
    * @param _address team address to check lock in period for.
    */
    function isTeamLockInPeriodOverIfTeamAddress(address _address) constant returns (bool isLockInPeriodOver) {
        isLockInPeriodOver = true;
        if (teamIssuedTimestamp[_address] != 0) {
                if (block.timestamp - teamIssuedTimestamp[_address] < teamLockPeriodInSec)
                    isLockInPeriodOver = false;
        }

        return isLockInPeriodOver;
    }

    /**
    * Used to set mintingDec
    * Can be called only by owner
    * @param _mintingDec bounty to be set.
    */
    function setMintingDec(uint256 _mintingDec) onlyOwner {
        require(!isInitialBlockTimestampSet);
        mintingDec = _mintingDec;
    }

    /**
        * When token is released to be transferable, enforce no new tokens can be created.
        */
    function releaseTokenTransfer() public onlyOwner {
        require(isInitialBlockTimestampSet);
        mintingFinished = true; 
        super.releaseTokenTransfer(); 
    }

    /**
        * Allow upgrade agent functionality kick in only if the crowdsale was success.
        */
    function canUpgrade() public constant returns(bool) {
        return released && super.canUpgrade(); 
    }

    /**
        * Owner can update token information here
        */
    function setTokenInformation(string _name, string _symbol) onlyOwner {
        name = _name; 
        symbol = _symbol; 
        UpdatedTokenInformation(name, symbol); 
    }

    /**
        * Returns the current phase.  
        * Note: Phase starts with 1
        * @param _day Number of days since Minting Epoch
        */
    function getPhaseCount(uint _day) public constant returns (uint phase) {
        phase = (_day/halvingCycle) + 1; 
        return (phase); 
    }
    /**
        * Returns current day number since minting epoch 
        * or zero if initialBlockTimestamp is in future or its DayZero.
        */
    function getDayCount() public constant returns (uint daySinceMintingEpoch) {
        daySinceMintingEpoch = 0;
        if (isDayTokenActivated())
            daySinceMintingEpoch = (block.timestamp - initialBlockTimestamp)/DayInSecs; 

        return daySinceMintingEpoch; 
    }
    /**
        * Calculates and Sets the minting power of a particular id.
        * Called before Minting Epoch by constructor
        * @param _id id of the address whose minting power is to be set.
        */
    function setInitialMintingPowerOf(uint256 _id) internal onlyContributor(_id) {
        contributors[_id].mintingPower = 
            (maxMintingPower - ((_id-1) * (maxMintingPower - minMintingPower)/(maxAddresses-1))); 
    }

    /**
        * Returns minting power of a particular id.
        * @param _id Contribution id whose minting power is to be returned
        */
    function getMintingPowerById(uint _id) public constant returns (uint256 mintingPower) {
        return contributors[_id].mintingPower/(2**(getPhaseCount(getDayCount())-1)); 
    }

    /**
        * Returns minting power of a particular address.
        * @param _adr Address whose minting power is to be returned
        */
    function getMintingPowerByAddress(address _adr) public constant returns (uint256 mintingPower) {
        return getMintingPowerById(idOf[_adr]);
    }


    /**
        * Calculates and returns the balance based on the minting power, day and phase.
        * Can only be called internally
        * Can calculate balance based on last updated.
        * @param _id id whose balnce is to be calculated
        * @param _dayCount day count upto which balance is to be updated
        */
    function availableBalanceOf(uint256 _id, uint _dayCount) internal returns (uint256) {
        uint256 balance = balances[contributors[_id].adr]; 
        uint maxUpdateDays = _dayCount < maxMintingDays ? _dayCount : maxMintingDays;
        uint i = contributors[_id].lastUpdatedOn + 1;
        while(i <= maxUpdateDays) {
             uint phase = getPhaseCount(i);
             uint phaseEndDay = phase * halvingCycle - 1; // as first day is 0
             uint constantFactor = contributors[_id].mintingPower / 2**(phase-1);

            for (uint j = i; j <= phaseEndDay && j <= maxUpdateDays; j++) {
                balance = safeAdd( balance, constantFactor * balance / 10**(mintingDec + 2) );
            }

            i = j;
            
        } 
        return balance; 
    }

    /**
        * Updates the balance of the specified id in its structure and also in the balances[] mapping.
        * returns true if successful.
        * Only for internal calls. Not public.
        * @param _id id whose balance is to be updated.
        */
    function updateBalanceOf(uint256 _id) internal returns (bool success) {
        // check if its contributor
        if (isValidContributorId(_id)) {
            uint dayCount = getDayCount();
            // proceed only if not already updated today
            if (contributors[_id].lastUpdatedOn != dayCount && contributors[_id].lastUpdatedOn < maxMintingDays) {
                address adr = contributors[_id].adr;
                uint oldBalance = balances[adr];
                totalSupply = safeSub(totalSupply, oldBalance);
                uint newBalance = availableBalanceOf(_id, dayCount);
                balances[adr] = newBalance;
                totalSupply = safeAdd(totalSupply, newBalance);
                contributors[_id].lastUpdatedOn = dayCount;
                Transfer(0, adr, newBalance - oldBalance);
                return true; 
            }
        }
        return false;
    }


    /**
        * Standard ERC20 function overridden.
        * Returns the balance of the specified address.
        * Calculates the balance on fly only if it is a minting address else 
        * simply returns balance from balances[] mapping.
        * For public calls.
        * @param _adr address whose balance is to be returned.
        */
    function balanceOf(address _adr) constant returns (uint balance) {
        uint id = idOf[_adr];
        if (id != 0)
            return balanceById(id);
        else 
            return balances[_adr]; 
    }


    /**
        * Standard ERC20 function overridden.
        * Returns the balance of the specified id.
        * Calculates the balance on fly only if it is a minting address else 
        * simply returns balance from balances[] mapping.
        * For public calls.
        * @param _id address whose balance is to be returned.
        */
    function balanceById(uint _id) public constant returns (uint256 balance) {
        address adr = contributors[_id].adr; 
        if (isDayTokenActivated()) {
            if (isValidContributorId(_id)) {
                return ( availableBalanceOf(_id, getDayCount()) );
            }
        }
        return balances[adr]; 
    }

    /**
        * Returns totalSupply of DAY tokens.
        */
    function getTotalSupply() public constant returns (uint) {
        return totalSupply;
    }

    /** Function to update balance of a Timemint
        * returns true if balance updated, false otherwise
        * @param _id TimeMint to update
        */
    function updateTimeMintBalance(uint _id) public returns (bool) {
        require(isDayTokenActivated());
        return updateBalanceOf(_id);
    }

    /** Function to update balance of sender's Timemint
        * returns true if balance updated, false otherwise
        */
    function updateMyTimeMintBalance() public returns (bool) {
        require(isDayTokenActivated());
        return updateBalanceOf(idOf[msg.sender]);
    }

    /**
        * Standard ERC20 function overidden.
        * Used to transfer day tokens from caller's address to another
        * @param _to address to which Day tokens are to be transferred
        * @param _value Number of Day tokens to be transferred
        */
    function transfer(address _to, uint _value) public returns (bool success) {
        require(isDayTokenActivated());
        // if Team address, check if lock-in period is over
        require(isTeamLockInPeriodOverIfTeamAddress(msg.sender));

        updateBalanceOf(idOf[msg.sender]);

        // Check sender account has enough balance and transfer amount is non zero
        require ( balanceOf(msg.sender) >= _value && _value != 0 ); 
        
        updateBalanceOf(idOf[_to]);

        balances[msg.sender] = safeSub(balances[msg.sender], _value); 
        balances[_to] = safeAdd(balances[_to], _value); 
        Transfer(msg.sender, _to, _value);

        return true;
    }
    

    /**
        * Standard ERC20 Standard Token function overridden. Added Team address vesting period lock. 
        */
    function transferFrom(address _from, address _to, uint _value) public returns (bool success) {
        require(isDayTokenActivated());

        // if Team address, check if lock-in period is over
        require(isTeamLockInPeriodOverIfTeamAddress(_from));

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

        updateBalanceOf(idOf[_from]);

        // Check from account has enough balance, transfer amount is non zero 
        // and _value is allowed to be transferred
        require ( balanceOf(_from) >= _value && _value != 0  &&  _value <= _allowance); 

        updateBalanceOf(idOf[_to]);

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


    /** 
        * Add any contributor structure (For every kind of contributors: Team/Pre-ICO/ICO/Test)
        * @param _adr Address of the contributor to be added  
        * @param _initialContributionDay Initial Contribution of the contributor to be added
        */
  function addContributor(uint contributorId, address _adr, uint _initialContributionDay) internal onlyOwner {
        require(contributorId <= maxAddresses);
        //address should not be an existing contributor
        require(!isValidContributorAddress(_adr));
        //TimeMint should not be already allocated
        require(!isValidContributorId(contributorId));
        contributors[contributorId].adr = _adr;
        idOf[_adr] = contributorId;
        setInitialMintingPowerOf(contributorId);
        contributors[contributorId].initialContributionDay = _initialContributionDay;
        contributors[contributorId].lastUpdatedOn = getDayCount();
        ContributorAdded(_adr, contributorId);
        contributors[contributorId].status = sellingStatus.NOTONSALE;
    }


    /** Function to be called by minting addresses in order to sell their address
        * @param _minPriceInDay Minimum price in DAY tokens set by the seller
        * @param _expiryBlockNumber Expiry Block Number set by the seller
        */
    function sellMintingAddress(uint256 _minPriceInDay, uint _expiryBlockNumber) public returns (bool) {
        require(isDayTokenActivated());
        require(_expiryBlockNumber > block.number);

        // if Team address, check if lock-in period is over
        require(isTeamLockInPeriodOverIfTeamAddress(msg.sender));

        uint id = idOf[msg.sender];
        require(contributors[id].status == sellingStatus.NOTONSALE);

        // update balance of sender address before checking for minimum required balance
        updateBalanceOf(id);
        require(balances[msg.sender] >= minBalanceToSell);
        contributors[id].minPriceInDay = _minPriceInDay;
        contributors[id].expiryBlockNumber = _expiryBlockNumber;
        contributors[id].status = sellingStatus.ONSALE;
        balances[msg.sender] = safeSub(balances[msg.sender], minBalanceToSell);
        balances[this] = safeAdd(balances[this], minBalanceToSell);
        Transfer(msg.sender, this, minBalanceToSell);
        TimeMintOnSale(id, msg.sender, contributors[id].minPriceInDay, contributors[id].expiryBlockNumber);
        return true;
    }


    /** Function to be called by minting address in order to cancel the sale of their TimeMint
        */
    function cancelSaleOfMintingAddress() onlyContributor(idOf[msg.sender]) public {
        uint id = idOf[msg.sender];
        // TimeMint should be on sale
        require(contributors[id].status == sellingStatus.ONSALE);
        contributors[id].status = sellingStatus.EXPIRED;
    }


    /** Function to be called by any user to get a list of all On Sale TimeMints
        */
    function getOnSaleIds() constant public returns(uint[]) {
        uint[] memory idsOnSale = new uint[](maxAddresses);
        uint j = 0;
        for(uint i=1; i <= maxAddresses; i++) {

            if ( isValidContributorId(i) &&
                block.number <= contributors[i].expiryBlockNumber && 
                contributors[i].status == sellingStatus.ONSALE ) {
                    idsOnSale[j] = i;
                    j++;     
            }
            
        }
        return idsOnSale;
    }


    /** Function to be called by any user to get status of a Time Mint.
        * returns status 0 - Not on sale, 1 - Expired, 2 - On sale,
        * @param _id ID number of the Time Mint 
        */
    function getSellingStatus(uint _id) constant public returns(sellingStatus status) {
        require(isValidContributorId(_id));
        status = contributors[_id].status;
        if ( block.number > contributors[_id].expiryBlockNumber && 
                status == sellingStatus.ONSALE )
            status = sellingStatus.EXPIRED;

        return status;
    }

    /** Function to be called by any user to buy a onsale address by offering an amount
        * @param _offerId ID number of the address to be bought by the buyer
        * @param _offerInDay Offer given by the buyer in number of DAY tokens
        */
    function buyMintingAddress(uint _offerId, uint256 _offerInDay) public returns(bool) {
        if (contributors[_offerId].status == sellingStatus.ONSALE 
            && block.number > contributors[_offerId].expiryBlockNumber)
        {
            contributors[_offerId].status = sellingStatus.EXPIRED;
        }
        address soldAddress = contributors[_offerId].adr;
        require(contributors[_offerId].status == sellingStatus.ONSALE);
        require(_offerInDay >= contributors[_offerId].minPriceInDay);

        // prevent seller from cancelling sale in between
        contributors[_offerId].status = sellingStatus.NOTONSALE;

        // first get the offered DayToken in the token contract & 
        // then transfer the total sum (minBalanceToSend+_offerInDay) to the seller
        balances[msg.sender] = safeSub(balances[msg.sender], _offerInDay);
        balances[this] = safeAdd(balances[this], _offerInDay);
        Transfer(msg.sender, this, _offerInDay);
        if(transferMintingAddress(contributors[_offerId].adr, msg.sender)) {
            //mark the offer as sold & let seller pull the proceed to their own account.
            sellingPriceInDayOf[soldAddress] = _offerInDay;
            soldAddresses[soldAddress] = true; 
            TimeMintSold(_offerId, msg.sender, _offerInDay);  
        }
        return true;
    }


    /**
        * Transfer minting address from one user to another
        * Gives the transfer-to address, the id of the original address
        * returns true if successful and false if not.
        * @param _to address of the user to which minting address is to be tranferred
        */
    function transferMintingAddress(address _from, address _to) internal onlyContributor(idOf[_from]) returns (bool) {
        require(isDayTokenActivated());

        // _to should be non minting address
        require(!isValidContributorAddress(_to));
        
        uint id = idOf[_from];
        // update balance of from address before transferring minting power
        updateBalanceOf(id);

        contributors[id].adr = _to;
        idOf[_to] = id;
        idOf[_from] = 0;
        contributors[id].initialContributionDay = 0;
        // needed as id is assigned to new address
        contributors[id].lastUpdatedOn = getDayCount();
        contributors[id].expiryBlockNumber = 0;
        contributors[id].minPriceInDay = 0;
        MintingAdrTransferred(id, _from, _to);
        return true;
    }


    /** Function to allow seller to get back their deposited amount of day tokens(minBalanceToSell) and 
        * offer made by buyer after successful sale.
        * Throws if sale is not successful
        */
    function fetchSuccessfulSaleProceed() public  returns(bool) {
        require(soldAddresses[msg.sender] == true);
        // to prevent re-entrancy attack
        soldAddresses[msg.sender] = false;
        uint saleProceed = safeAdd(minBalanceToSell, sellingPriceInDayOf[msg.sender]);
        balances[this] = safeSub(balances[this], saleProceed);
        balances[msg.sender] = safeAdd(balances[msg.sender], saleProceed);
        Transfer(this, msg.sender, saleProceed);
        return true;
                
    }

    /** Function that lets a seller get their deposited day tokens (minBalanceToSell) back, if no buyer turns up.
        * Allowed only after expiryBlockNumber
        * Throws if any other state other than EXPIRED
        */
    function refundFailedAuctionAmount() onlyContributor(idOf[msg.sender]) public returns(bool){
        uint id = idOf[msg.sender];
        if(block.number > contributors[id].expiryBlockNumber && contributors[id].status == sellingStatus.ONSALE)
        {
            contributors[id].status = sellingStatus.EXPIRED;
        }
        require(contributors[id].status == sellingStatus.EXPIRED);
        // reset selling status
        contributors[id].status = sellingStatus.NOTONSALE;
        balances[this] = safeSub(balances[this], minBalanceToSell);
        // update balance of seller address before refunding
        updateBalanceOf(id);
        balances[msg.sender] = safeAdd(balances[msg.sender], minBalanceToSell);
        contributors[id].minPriceInDay = 0;
        contributors[id].expiryBlockNumber = 0;
        Transfer(this, msg.sender, minBalanceToSell);
        return true;
    }


    /** Function to add a team address as a contributor and store it's time issued to calculate vesting period
        * Called by owner
        */
    function addTeamTimeMints(address _adr, uint _id, uint _tokens, bool _isTest) public onlyOwner {
        //check if Id is in range of team Ids
        require(_id >= firstTeamContributorId && _id < firstTeamContributorId + totalTeamContributorIds);
        require(totalTeamContributorIdsAllocated < totalTeamContributorIds);
        addContributor(_id, _adr, 0);
        totalTeamContributorIdsAllocated++;
        // enforce lockin period if not test address
        if(!_isTest) teamIssuedTimestamp[_adr] = block.timestamp;
        mint(_adr, _tokens);
        TeamAddressAdded(_adr, _id);
    }


    /** Function to add reserved aution TimeMints post-ICO. Only by owner
        * @param _receiver Address of the minting to be added
        * @param _customerId Server side id of the customer
        * @param _id contributorId
        */
    function postAllocateAuctionTimeMints(address _receiver, uint _customerId, uint _id) public onlyOwner {

        //check if Id is in range of Auction Ids
        require(_id >= firstPostIcoContributorId && _id < firstPostIcoContributorId + totalPostIcoContributorIds);
        require(totalPostIcoContributorIdsAllocated < totalPostIcoContributorIds);
        
        require(released == true);
        addContributor(_id, _receiver, 0);
        totalPostIcoContributorIdsAllocated++;
        PostInvested(_receiver, 0, 0, _customerId, _id);
    }


    /** Function to add all contributors except team, test and Auctions TimeMints. Only by owner
        * @param _receiver Address of the minting to be added
        * @param _customerId Server side id of the customer
        * @param _id contributor id
        * @param _tokens day tokens to allocate
        * @param _weiAmount ether invested in wei
        */
    function allocateNormalTimeMints(address _receiver, uint _customerId, uint _id, uint _tokens, uint _weiAmount) public onlyOwner {
        // check if Id is in range of Normal Ids
        require(_id >= firstContributorId && _id <= totalNormalContributorIds);
        require(totalNormalContributorIdsAllocated < totalNormalContributorIds);
        addContributor(_id, _receiver, _tokens);
        totalNormalContributorIdsAllocated++;
        mint(_receiver, _tokens);
        Invested(_receiver, _weiAmount, _tokens, _customerId, _id);
        
    }


    /** Function to release token
        * Called by owner
        */
    function releaseToken(uint _initialBlockTimestamp) public onlyOwner {
        require(!released); // check not already released
        
        setInitialBlockTimestamp(_initialBlockTimestamp);

        // Make token transferable
        releaseTokenTransfer();
    }
    
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"state","type":"bool"}],"name":"setTransferAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalNormalContributorIdsAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_receiver","type":"address"},{"name":"_customerId","type":"uint256"},{"name":"_id","type":"uint256"},{"name":"_tokens","type":"uint256"},{"name":"_weiAmount","type":"uint256"}],"name":"allocateNormalTimeMints","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"teamLockPeriodInSec","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isDayTokenActivated","outputs":[{"name":"isActivated","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"firstTeamContributorId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalPostIcoContributorIdsAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"setReleaseAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"fetchSuccessfulSaleProceed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_adr","type":"address"},{"name":"_id","type":"uint256"},{"name":"_tokens","type":"uint256"},{"name":"_isTest","type":"bool"}],"name":"addTeamTimeMints","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getMintingPowerById","outputs":[{"name":"mintingPower","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_day","type":"uint256"}],"name":"getPhaseCount","outputs":[{"name":"phase","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"contributors","outputs":[{"name":"adr","type":"address"},{"name":"initialContributionDay","type":"uint256"},{"name":"lastUpdatedOn","type":"uint256"},{"name":"mintingPower","type":"uint256"},{"name":"expiryBlockNumber","type":"uint256"},{"name":"minPriceInDay","type":"uint256"},{"name":"status","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_minPriceInDay","type":"uint256"},{"name":"_expiryBlockNumber","type":"uint256"}],"name":"sellMintingAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"mintAgents","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"state","type":"bool"}],"name":"setMintAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"upgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"balanceById","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"halvingCycle","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DayInSecs","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"teamIssuedTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initialBlockTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"}],"name":"setTokenInformation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mintingDec","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxMintingPower","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"soldAddresses","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minMintingPower","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"upgradeAgent","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_offerId","type":"uint256"},{"name":"_offerInDay","type":"uint256"}],"name":"buyMintingAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"releaseTokenTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradeMaster","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_adr","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTeamContributorIdsAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelSaleOfMintingAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getUpgradeState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isValidContributorAddress","outputs":[{"name":"isValidContributor","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"transferAgents","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":"_address","type":"address"}],"name":"isTeamLockInPeriodOverIfTeamAddress","outputs":[{"name":"isLockInPeriodOver","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"sellingPriceInDayOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalPostIcoContributorIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxAddresses","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"released","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_receiver","type":"address"},{"name":"_customerId","type":"uint256"},{"name":"_id","type":"uint256"}],"name":"postAllocateAuctionTimeMints","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"canUpgrade","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isInitialBlockTimestampSet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_mintingDec","type":"uint256"}],"name":"setMintingDec","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"firstPostIcoContributorId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeSub","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxMintingDays","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"}],"name":"updateTimeMintBalance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalNormalContributorIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"refundFailedAuctionAmount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_initialBlockTimestamp","type":"uint256"}],"name":"releaseToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_adr","type":"address"}],"name":"getMintingPowerByAddress","outputs":[{"name":"mintingPower","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTeamContributorIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getSellingStatus","outputs":[{"name":"status","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateMyTimeMintBalance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalUpgraded","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"firstContributorId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeMul","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"releaseAgent","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minBalanceToSell","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"agent","type":"address"}],"name":"setUpgradeAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"idOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"isValidContributorId","outputs":[{"name":"isValidContributor","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOnSaleIds","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeAdd","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDayCount","outputs":[{"name":"daySinceMintingEpoch","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"master","type":"address"}],"name":"setUpgradeMaster","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_initialSupply","type":"uint256"},{"name":"_decimals","type":"uint8"},{"name":"_mintable","type":"bool"},{"name":"_maxAddresses","type":"uint256"},{"name":"_firstTeamContributorId","type":"uint256"},{"name":"_totalTeamContributorIds","type":"uint256"},{"name":"_totalPostIcoContributorIds","type":"uint256"},{"name":"_minMintingPower","type":"uint256"},{"name":"_maxMintingPower","type":"uint256"},{"name":"_halvingCycle","type":"uint256"},{"name":"_minBalanceToSell","type":"uint256"},{"name":"_dayInSecs","type":"uint256"},{"name":"_teamLockPeriodInSec","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newName","type":"string"},{"indexed":false,"name":"newSymbol","type":"string"}],"name":"UpdatedTokenInformation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"}],"name":"MintingAdrTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"adr","type":"address"},{"indexed":false,"name":"id","type":"uint256"}],"name":"ContributorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"seller","type":"address"},{"indexed":false,"name":"minPriceInDay","type":"uint256"},{"indexed":false,"name":"expiryBlockNumber","type":"uint256"}],"name":"TimeMintOnSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"buyer","type":"address"},{"indexed":false,"name":"offerInDay","type":"uint256"}],"name":"TimeMintSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"investor","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"customerId","type":"uint256"},{"indexed":false,"name":"contributorId","type":"uint256"}],"name":"PostInvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"teamAddress","type":"address"},{"indexed":false,"name":"id","type":"uint256"}],"name":"TeamAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"receiver","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"customerId","type":"uint256"},{"indexed":false,"name":"contributorId","type":"uint256"}],"name":"Invested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Upgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"agent","type":"address"}],"name":"UpgradeAgentSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"state","type":"bool"}],"name":"MintingAgentChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"receiver","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"}]

60606040526005805460a060020a60ff02191690556007805460ff19169055610447600c55600060148190556017819055601a5534156200003f57600080fd5b60405162003a9b38038062003a9b833981016040528080518201919060200180518201919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519150505b335b5b60038054600160a060020a03191633600160a060020a03161790555b60098054600160a060020a031916600160a060020a0383161790555b5060038054600160a060020a03191633600160a060020a031617905560258f80516200012d92916020019062000291565b5060268e80516200014392916020019062000291565b5060008d81556027805460ff191660ff8f16179055600354600160a060020a031681526001602081905260409091208e9055601b8b90558a116200018657600080fd5b60016012819055601b5489900388900360138190551015620001a757600080fd5b601589905560168890556019879055601b54879003600101601855601c869055601d859055601e849055635e0be100601f556020805460ff19169055601360215560228390556024829055602381905560008054111562000256576003546000547f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe91600160a060020a031690604051600160a060020a03909216825260208201526040908101905180910390a15b8a15156200027a576007805460ff1916600117905560005415156200027a57600080fd5b5b5b5050505050505050505050505050506200033b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002d457805160ff191683800117855562000304565b8280016001018555821562000304579182015b8281111562000304578251825591602001919060010190620002e7565b5b506200031392915062000317565b5090565b6200033891905b808211156200031357600081556001016200031e565b5090565b90565b613750806200034b6000396000f300606060405236156103b65763ffffffff60e060020a60003504166302f652a381146103bb57806304d41474146103e157806305d2035b1461040657806306fdde031461042d578063095ea7b3146104b85780630a402742146104ee5780630c58062b1461051b57806310f1726d14610540578063128e37611461056757806318160ddd1461058c5780631bf2a90a146105b157806323b872dd146105d657806329ff4f53146106125780632f83f78114610633578063313ce5671461065a578063331c55b414610683578063335494a4146106af57806335995022146106d75780633cb5d100146106ff5780633ed66d3d1461077557806340c10f19146107a257806342c1867b146107c657806343214675146107f957806345977d031461081f5780634778dfb8146108375780634813e3e51461085f578063485d5dd21461088457806348bb4067146108a95780634b3d81b6146108da5780634eee966f146108ff578063534439a31461099457806354f63105146109b95780635956b853146109de5780635d444ffb14610a115780635de4ccb014610a365780635df34ff214610a655780635f412d4f14610a92578063600440cb14610aa757806370a0823114610ad6578063718228fa14610b07578063740707cf14610b2c57806379ba509714610b415780638444b39114610b565780638526d09214610b8d578063867c285714610bc05780638da5cb5b14610bf35780638f7b7bce14610c22578063928e659214610c55578063936bbf9a14610c8657806393e5365f14610cab57806395d89b4114610cd05780639613252114610d5b57806396a8069914610d825780639738968c14610da95780639aaac86414610dd05780639bc8e9ee14610df7578063a222a52f14610e0f578063a293d1e814610e34578063a41ff1e514610e5f578063a5f2676014610e84578063a666190114610eae578063a9059cbb14610ed3578063b19b216214610f09578063b54d623814610f30578063b6033daf14610f48578063bef17ed014610f79578063c392f11814610f9e578063c4e41b2214610fd8578063c59513a414610ffd578063c752ff6214611024578063c96e83db14611049578063d05c78da1461106e578063d1f276d314611099578063d49dbb5c146110c8578063d4ee1d90146110ed578063d7e7088a1461111c578063d94fe8321461113d578063dd62ed3e1461116e578063df30e592146111a5578063e0faf0a8146111cf578063e6cb901314611236578063eb60764f14611261578063f2fde38b14611286578063ffeb7d75146112a7575b600080fd5b34156103c657600080fd5b6103df600160a060020a036004351660243515156112c8565b005b34156103ec57600080fd5b6103f4611329565b60405190815260200160405180910390f35b341561041157600080fd5b61041961132f565b604051901515815260200160405180910390f35b341561043857600080fd5b610440611338565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561047d5780820151818401525b602001610464565b50505050905090810190601f1680156104aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104c357600080fd5b610419600160a060020a03600435166024356113d6565b604051901515815260200160405180910390f35b34156104f957600080fd5b6103df600160a060020a036004351660243560443560643560843561147d565b005b341561052657600080fd5b6103f461154e565b60405190815260200160405180910390f35b341561054b57600080fd5b610419611554565b604051901515815260200160405180910390f35b341561057257600080fd5b6103f461155e565b60405190815260200160405180910390f35b341561059757600080fd5b6103f4611564565b60405190815260200160405180910390f35b34156105bc57600080fd5b6103f461156a565b60405190815260200160405180910390f35b34156105e157600080fd5b610419600160a060020a0360043581169060243516604435611570565b604051901515815260200160405180910390f35b341561061d57600080fd5b6103df600160a060020a03600435166116f7565b005b341561063e57600080fd5b61041961174e565b604051901515815260200160405180910390f35b341561066557600080fd5b61066d611858565b60405160ff909116815260200160405180910390f35b341561068e57600080fd5b6103df600160a060020a03600435166024356044356064351515611861565b005b34156106ba57600080fd5b6103f460043561193c565b60405190815260200160405180910390f35b34156106e257600080fd5b6103f460043561197b565b60405190815260200160405180910390f35b341561070a57600080fd5b610715600435611996565b6040518088600160a060020a0316600160a060020a0316815260200187815260200186815260200185815260200184815260200183815260200182600281111561075b57fe5b60ff16815260200197505050505050505060405180910390f35b341561078057600080fd5b6104196004356024356119e0565b604051901515815260200160405180910390f35b34156107ad57600080fd5b6103df600160a060020a0360043516602435611bf8565b005b34156107d157600080fd5b610419600160a060020a0360043516611ca7565b604051901515815260200160405180910390f35b341561080457600080fd5b6103df600160a060020a03600435166024351515611cbc565b005b341561082a57600080fd5b6103df600435611d5b565b005b341561084257600080fd5b6103f4600435611eb5565b60405190815260200160405180910390f35b341561086a57600080fd5b6103f4611f23565b60405190815260200160405180910390f35b341561088f57600080fd5b6103f4611f29565b60405190815260200160405180910390f35b34156108b457600080fd5b6103f4600160a060020a0360043516611f2f565b60405190815260200160405180910390f35b34156108e557600080fd5b6103f4611f41565b60405190815260200160405180910390f35b341561090a57600080fd5b6103df60046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528181529291906020840183838082843750949650611f4795505050505050565b005b341561099f57600080fd5b6103f46120b7565b60405190815260200160405180910390f35b34156109c457600080fd5b6103f46120bd565b60405190815260200160405180910390f35b34156109e957600080fd5b610419600160a060020a03600435166120c3565b604051901515815260200160405180910390f35b3415610a1c57600080fd5b6103f46120d8565b60405190815260200160405180910390f35b3415610a4157600080fd5b610a496120de565b604051600160a060020a03909116815260200160405180910390f35b3415610a7057600080fd5b6104196004356024356120ed565b604051901515815260200160405180910390f35b3415610a9d57600080fd5b6103df61232d565b005b3415610ab257600080fd5b610a49612372565b604051600160a060020a03909116815260200160405180910390f35b3415610ae157600080fd5b6103f4600160a060020a0360043516612381565b60405190815260200160405180910390f35b3415610b1257600080fd5b6103f46123d7565b60405190815260200160405180910390f35b3415610b3757600080fd5b6103df6123dd565b005b3415610b4c57600080fd5b6103df61247b565b005b3415610b6157600080fd5b610b696124fa565b60405180826004811115610b7957fe5b60ff16815260200191505060405180910390f35b3415610b9857600080fd5b610419600160a060020a036004351661254b565b604051901515815260200160405180910390f35b3415610bcb57600080fd5b610419600160a060020a0360043516612575565b604051901515815260200160405180910390f35b3415610bfe57600080fd5b610a4961258a565b604051600160a060020a03909116815260200160405180910390f35b3415610c2d57600080fd5b610419600160a060020a0360043516612599565b604051901515815260200160405180910390f35b3415610c6057600080fd5b6103f4600160a060020a03600435166125e9565b60405190815260200160405180910390f35b3415610c9157600080fd5b6103f46125fb565b60405190815260200160405180910390f35b3415610cb657600080fd5b6103f4612601565b60405190815260200160405180910390f35b3415610cdb57600080fd5b610440612607565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561047d5780820151818401525b602001610464565b50505050905090810190601f1680156104aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d6657600080fd5b6104196126a5565b604051901515815260200160405180910390f35b3415610d8d57600080fd5b6103df600160a060020a03600435166024356044356126b5565b005b3415610db457600080fd5b61041961279a565b604051901515815260200160405180910390f35b3415610ddb57600080fd5b6104196127c0565b604051901515815260200160405180910390f35b3415610e0257600080fd5b6103df6004356127c9565b005b3415610e1a57600080fd5b6103f46127fe565b60405190815260200160405180910390f35b3415610e3f57600080fd5b6103f4600435602435612804565b60405190815260200160405180910390f35b3415610e6a57600080fd5b6103f461281b565b60405190815260200160405180910390f35b3415610e8f57600080fd5b610419600435612821565b604051901515815260200160405180910390f35b3415610eb957600080fd5b6103f4612847565b60405190815260200160405180910390f35b3415610ede57600080fd5b610419600160a060020a036004351660243561284d565b604051901515815260200160405180910390f35b3415610f1457600080fd5b610419612980565b604051901515815260200160405180910390f35b3415610f3b57600080fd5b6103df600435612b5a565b005b3415610f5357600080fd5b6103f4600160a060020a0360043516612ba2565b60405190815260200160405180910390f35b3415610f8457600080fd5b6103f4612bcc565b60405190815260200160405180910390f35b3415610fa957600080fd5b610fb4600435612bd2565b60405180826002811115610b7957fe5b60ff16815260200191505060405180910390f35b3415610fe357600080fd5b6103f4612c31565b60405190815260200160405180910390f35b341561100857600080fd5b610419612c38565b604051901515815260200160405180910390f35b341561102f57600080fd5b6103f4612c75565b60405190815260200160405180910390f35b341561105457600080fd5b6103f4612c7b565b60405190815260200160405180910390f35b341561107957600080fd5b6103f4600435602435612c81565b60405190815260200160405180910390f35b34156110a457600080fd5b610a49612cb0565b604051600160a060020a03909116815260200160405180910390f35b34156110d357600080fd5b6103f4612cbf565b60405190815260200160405180910390f35b34156110f857600080fd5b610a49612cc5565b604051600160a060020a03909116815260200160405180910390f35b341561112757600080fd5b6103df600160a060020a0360043516612cd4565b005b341561114857600080fd5b6103f4600160a060020a0360043516612e80565b60405190815260200160405180910390f35b341561117957600080fd5b6103f4600160a060020a0360043581169060243516612e92565b60405190815260200160405180910390f35b34156111b057600080fd5b610419600435612ebf565b604051901515815260200160405180910390f35b34156111da57600080fd5b6111e2612f2b565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156112225780820151818401525b602001611209565b505050509050019250505060405180910390f35b341561124157600080fd5b6103f4600435602435612ffc565b60405190815260200160405180910390f35b341561126c57600080fd5b6103f4613016565b60405190815260200160405180910390f35b341561129157600080fd5b6103df600160a060020a036004351661303e565b005b34156112b257600080fd5b6103df600160a060020a0360043516613079565b005b60035433600160a060020a039081169116146112e357600080fd5b60055460009060a060020a900460ff16156112fd57600080fd5b600160a060020a0383166000908152600660205260409020805460ff19168315151790555b5b505b5050565b60145481565b60075460ff1681565b60258054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ce5780601f106113a3576101008083540402835291602001916113ce565b820191906000526020600020905b8154815290600101906020018083116113b157829003601f168201915b505050505081565b60008115806114085750600160a060020a03338116600090815260026020908152604080832093871683529290522054155b151561141357600080fd5b600160a060020a03338116600081815260026020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60035433600160a060020a0390811691161461149857600080fd5b60125483101580156114ac57506013548311155b15156114b757600080fd5b601354601454106114c757600080fd5b6114d28386846130c8565b6014805460010190556114e58583611bf8565b7f6bd11c91e66ab57411c3d72828f939eac4446988c1c1f5862442bf7fa9884e238582848787604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a15b5b5050505050565b60235481565b601f544210155b90565b60155481565b60005481565b601a5481565b60008061157b611554565b151561158657600080fd5b61158f85612599565b151561159a57600080fd5b50600160a060020a03808516600081815260026020908152604080832033909516835293815283822054928252600d905291909120546115d9906131fb565b50826115e486612381565b101580156115f157508215155b80156115fd5750808311155b151561160857600080fd5b600160a060020a0384166000908152600d602052604090205461162a906131fb565b506116358184612804565b600160a060020a0380871660008181526002602090815260408083203390951683529381528382209490945590815260019092529020546116769084612804565b600160a060020a0380871660009081526001602052604080822093909355908616815220546116a59084612ffc565b600160a060020a03808616600081815260016020526040908190209390935591908716906000805160206137058339815191529086905190815260200160405180910390a3600191505b509392505050565b60035433600160a060020a0390811691161461171257600080fd5b60055460009060a060020a900460ff161561172c57600080fd5b60058054600160a060020a031916600160a060020a0384161790555b5b505b50565b600160a060020a033316600090815260106020526040812054819060ff16151560011461177a57600080fd5b600160a060020a0333166000908152601060209081526040808320805460ff191690556022546011909252909120546117b39190612ffc565b600160a060020a0330166000908152600160205260409020549091506117d99082612804565b600160a060020a033081166000908152600160205260408082209390935533909116815220546118099082612ffc565b600160a060020a0333811660008181526001602052604090819020939093559130909116906000805160206137058339815191529084905190815260200160405180910390a3600191505b5090565b60275460ff1681565b60035433600160a060020a0390811691161461187c57600080fd5b601554831015801561189357506016546015540183105b151561189e57600080fd5b601654601754106118ae57600080fd5b6118ba838560006130c8565b6017805460010190558015156118e657600160a060020a0384166000908152600f602052604090204290555b6118f08483611bf8565b7fe79fec6463e59273a1da7bc924872b8b35b64c591ce527b6329f0db8d6be71fd8484604051600160a060020a03909216825260208201526040908101905180910390a15b5b50505050565b6000600161195061194b613016565b61197b565b6000848152600e602052604090206003015491900360020a9081151561197257fe5b0490505b919050565b6000601e548281151561198a57fe5b0460010190505b919050565b600e602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154600160a060020a039095169593949293919290919060ff1687565b6000806119eb611554565b15156119f657600080fd5b438311611a0257600080fd5b611a0b33612599565b1515611a1657600080fd5b50600160a060020a0333166000908152600d6020526040812054905b6000828152600e602052604090206006015460ff166002811115611a5257fe5b14611a5c57600080fd5b611a65816131fb565b50602254600160a060020a0333166000908152600160205260409020541015611a8d57600080fd5b6000818152600e60205260409020600581018590556004810184905560060180546002919060ff19166001835b0217905550600160a060020a033316600090815260016020526040902054602254611ae59190612804565b600160a060020a03338116600090815260016020526040808220939093553090911681522054602254611b189190612ffc565b6001600030600160a060020a0316600160a060020a031681526020019081526020016000208190555030600160a060020a031633600160a060020a031660008051602061370583398151915260225460405190815260200160405180910390a36000818152600e60205260409081902060058101546004909101547f789864ab03bca8d309c9bec6804307cfc416db24eab7873ba7f3df79797b09179284923392909151938452600160a060020a03909216602084015260408084019190915260608301919091526080909101905180910390a1600191505b5092915050565b600160a060020a03331660009081526008602052604090205460ff161515611c1f57600080fd5b60075460ff1615611c2f57600080fd5b611c3b60005482612ffc565b6000908155600160a060020a038316815260016020526040902054611c609082612ffc565b600160a060020a0383166000818152600160205260408082209390935590916000805160206137058339815191529084905190815260200160405180910390a35b5b5b5050565b60086020526000908152604090205460ff1681565b60035433600160a060020a03908116911614611cd757600080fd5b60075460ff1615611ce757600080fd5b600160a060020a03821660009081526008602052604090819020805460ff19168315151790557f4b0adf6c802794c7dde28a08a4e07131abcff3bf9603cd71f14f90bec7865efa908390839051600160a060020a039092168252151560208201526040908101905180910390a15b5b5b5050565b6000611d656124fa565b905060035b816004811115611d7657fe5b1480611d8e575060045b816004811115611d8c57fe5b145b1515611d9957600080fd5b811515611da557600080fd5b600160a060020a033316600090815260016020526040902054611dc89083612804565b600160a060020a03331660009081526001602052604081209190915554611def9083612804565b600055600b54611dff9083612ffc565b600b55600a54600160a060020a031663753e88e5338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611e5857600080fd5b6102c65a03f11515611e6957600080fd5b5050600a54600160a060020a03908116915033167f7e5c344a8141a805725cb476f76c6953b842222b967edd1f78ddb6e8b3f397ac8460405190815260200160405180910390a35b5050565b6000818152600e6020526040812054600160a060020a0316611ed5611554565b15611f0057611ee383612ebf565b15611f0057611ef983611ef4613016565b613321565b9150611f1d565b5b600160a060020a03811660009081526001602052604090205491505b50919050565b601e5481565b60245481565b600f6020526000908152604090205481565b601f5481565b60035433600160a060020a03908116911614611f6257600080fd5b6025828051611f75929160200190613652565b506026818051611f89929160200190613652565b507fd131ab1e6f279deea74e13a18477e13e2107deb6dc8ae955648948be5841fb466025602660405160408082528354600260001961010060018416150201909116049082018190528190602082019060608301908690801561202d5780601f106120025761010080835404028352916020019161202d565b820191906000526020600020905b81548152906001019060200180831161201057829003601f168201915b50508381038252845460026000196101006001841615020190911604808252602090910190859080156120a15780601f10612076576101008083540402835291602001916120a1565b820191906000526020600020905b81548152906001019060200180831161208457829003601f168201915b505094505050505060405180910390a15b5b5050565b60215481565b601d5481565b60106020526000908152604090205460ff1681565b601c5481565b600a54600160a060020a031681565b60008060025b6000858152600e602052604090206006015460ff16600281111561211357fe5b14801561213057506000848152600e602052604090206004015443115b15612159576000848152600e6020526040902060060180546001919060ff191682805b02179055505b506000838152600e6020526040902054600160a060020a031660025b6000858152600e602052604090206006015460ff16600281111561219557fe5b1461219f57600080fd5b6000848152600e60205260409020600501548310156121bd57600080fd5b6000848152600e60205260408120600601805460ff19166001835b0217905550600160a060020a0333166000908152600160205260409020546122009084612804565b600160a060020a033381166000908152600160205260408082209390935530909116815220546122309084612ffc565b600160a060020a0330811660008181526001602052604090819020939093559133909116906000805160206137058339815191529086905190815260200160405180910390a36000848152600e602052604090205461229890600160a060020a031633613420565b1561232157600160a060020a0381166000908152601160209081526040808320869055601090915290819020805460ff191660011790557f72760e46b3824807567c13ec75882de5d9c789a91517ae7b474d2e6b62d3771e9085903390869051928352600160a060020a0390911660208301526040808301919091526060909101905180910390a15b600191505b5092915050565b60035433600160a060020a0390811691161461234857600080fd5b60205460ff16151561235957600080fd5b6007805460ff1916600117905561236e613574565b5b5b565b600954600160a060020a031681565b600160a060020a0381166000908152600d602052604081205480156123b057611ef981611eb5565b9150611f1d565b600160a060020a0383166000908152600160205260409020549150611f1d565b5b50919050565b60175481565b600160a060020a0333166000908152600d60205260408120546123ff81612ebf565b151561240a57600080fd5b600160a060020a0333166000908152600d6020526040902054915060025b6000838152600e602052604090206006015460ff16600281111561244857fe5b1461245257600080fd5b6000828152600e6020526040902060060180546001919060ff191682805b02179055505b5b5050565b60045433600160a060020a0390811691161461249657600080fd5b600454600354600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360045460038054600160a060020a031916600160a060020a039092169190911790555b565b600061250461279a565b15156125125750600161155b565b600a54600160a060020a0316151561252c5750600261155b565b600b54151561253d5750600361155b565b50600461155b565b5b5b5b90565b600160a060020a0381166000908152600d602052604081205461256d90612ebf565b90505b919050565b60066020526000908152604090205460ff1681565b600354600160a060020a031681565b600160a060020a0381166000908152600f60205260409020546001901561197657602354600160a060020a0383166000908152600f602052604090205442031015611976575060005b5b5b919050565b60116020526000908152604090205481565b60195481565b601b5481565b60268054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ce5780601f106113a3576101008083540402835291602001916113ce565b820191906000526020600020905b8154815290600101906020018083116113b157829003601f168201915b505050505081565b60055460a060020a900460ff1681565b60035433600160a060020a039081169116146126d057600080fd5b60185481101580156126e757506019546018540181105b15156126f257600080fd5b601954601a541061270257600080fd5b60055460a060020a900460ff16151560011461271d57600080fd5b612729818460006130c8565b601a805460010190557f5da87a24d5db985862dc335ff32e322d9588ae9b4a971bd1526a58051c8cbaa4836000808585604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a15b5b505050565b60055460009060a060020a900460ff1680156127b957506127b96135b7565b5b90505b90565b60205460ff1681565b60035433600160a060020a039081169116146127e457600080fd5b60205460ff16156127f457600080fd5b60218190555b5b50565b60185481565b60008282111561281057fe5b508082035b92915050565b600c5481565b600061282b611554565b151561283657600080fd5b61256d826131fb565b90505b919050565b60135481565b6000612857611554565b151561286257600080fd5b61286b33612599565b151561287657600080fd5b600160a060020a0333166000908152600d6020526040902054612898906131fb565b50816128a333612381565b101580156128b057508115155b15156128bb57600080fd5b600160a060020a0383166000908152600d60205260409020546128dd906131fb565b50600160a060020a0333166000908152600160205260409020546129019083612804565b600160a060020a0333811660009081526001602052604080822093909355908516815220546129309083612ffc565b600160a060020a0380851660008181526001602052604090819020939093559133909116906000805160206137058339815191529085905190815260200160405180910390a35060015b92915050565b600160a060020a0333166000908152600d602052604081205481906129a481612ebf565b15156129af57600080fd5b600160a060020a0333166000908152600d6020908152604080832054808452600e9092529091206004015490925043118015612a0b575060025b6000838152600e602052604090206006015460ff166002811115612a0957fe5b145b15612a34576000828152600e6020526040902060060180546001919060ff191682805b02179055505b60015b6000838152600e602052604090206006015460ff166002811115612a5757fe5b14612a6157600080fd5b6000828152600e60205260408120600601805460ff19166001835b0217905550600160a060020a033016600090815260016020526040902054602254612aa79190612804565b600160a060020a033016600090815260016020526040902055612ac9826131fb565b50600160a060020a033316600090815260016020526040902054602254612af09190612ffc565b600160a060020a03338116600081815260016020908152604080832095909555868252600e905283812060058101829055600401556022549092309092169160008051602061370583398151915291905190815260200160405180910390a3600192505b5b505090565b60035433600160a060020a03908116911614612b7557600080fd5b60055460a060020a900460ff1615612b8c57600080fd5b612b95816135bd565b61174b61232d565b5b5b50565b600160a060020a0381166000908152600d602052604081205461256d9061193c565b90505b919050565b60165481565b6000612bdd82612ebf565b1515612be857600080fd5b506000818152600e60205260409020600681015460049091015460ff9091169043118015612c22575060025b816002811115612c2057fe5b145b15611976575060015b5b919050565b6000545b90565b6000612c42611554565b1515612c4d57600080fd5b600160a060020a0333166000908152600d60205260409020546127b9906131fb565b90505b90565b600b5481565b60125481565b6000828202831580612c9d5750828482811515612c9a57fe5b04145b1515612ca557fe5b8091505b5092915050565b600554600160a060020a031681565b60225481565b600454600160a060020a031681565b612cdc61279a565b1515612ce757600080fd5b600160a060020a0381161515612cfc57600080fd5b60095433600160a060020a03908116911614612d1757600080fd5b60045b612d226124fa565b6004811115612d2d57fe5b1415612d3857600080fd5b600a8054600160a060020a031916600160a060020a038381169190911791829055166361d3d7a66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612d9657600080fd5b6102c65a03f11515612da757600080fd5b505050604051805190501515612dbc57600080fd5b60008054600a549091600160a060020a0390911690634b2ba0dd90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612e0c57600080fd5b6102c65a03f11515612e1d57600080fd5b50505060405180519050141515612e3357600080fd5b600a547f7845d5aa74cc410e35571258d954f23b82276e160fe8c188fa80566580f279cc90600160a060020a0316604051600160a060020a03909116815260200160405180910390a15b50565b600d6020526000908152604090205481565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b60008082118015612ed25750601b548211155b8015612ef457506000828152600e6020526040902054600160a060020a031615155b801561256d57506000828152600e6020908152604080832054600160a060020a03168352600d90915290205482145b90505b919050565b612f336136d1565b612f3b6136d1565b600080601b54604051805910612f4e5750595b908082528060200260200182016040525b50925060009150600190505b601b548111612ff257612f7d81612ebf565b8015612f9a57506000818152600e60205260409020600401544311155b8015612fc6575060025b6000828152600e602052604090206006015460ff166002811115612fc457fe5b145b15612fe95780838381518110612fd857fe5b602090810290910101526001909101905b5b600101612f6b565b8293505b50505090565b600082820183811015612ca557fe5b8091505b5092915050565b6000613020611554565b1561155b57602454601f54420381151561303657fe5b0490505b5b90565b60035433600160a060020a0390811691161461305957600080fd5b60048054600160a060020a031916600160a060020a0383161790555b5b50565b600160a060020a038116151561308e57600080fd5b60095433600160a060020a039081169116146130a957600080fd5b60098054600160a060020a031916600160a060020a0383161790555b50565b60035433600160a060020a039081169116146130e357600080fd5b601b548311156130f257600080fd5b6130fb8261254b565b1561310557600080fd5b61310e83612ebf565b1561311857600080fd5b6000838152600e602090815260408083208054600160a060020a031916600160a060020a0387169081179091558352600d909152902083905561315a836135ff565b6000838152600e60205260409020600101819055613176613016565b600e6000858152602001908152602001600020600201819055507f5fd6d0b7e707fe344bd2a1887f9d0eeea8bfcac6f339ba4200e74f0647f101c08284604051600160a060020a03909216825260208201526040908101905180910390a16000838152600e60205260408120600601805460ff19166001835b02179055505b5b505050565b600080600080600061320c86612ebf565b1561331257613219613016565b6000878152600e6020526040902060020154909450841480159061324f5750600c546000878152600e6020526040902060020154105b15613312576000868152600e6020908152604080832054600160a060020a03168084526001909252822054915490945090925061328c9083612804565b6000556132998685613321565b600160a060020a0384166000908152600160205260408120829055549091506132c29082612ffc565b6000908155868152600e6020526040808220600201869055600160a060020a038516919060008051602061370583398151915290858503905190815260200160405180910390a360019450613318565b5b600094505b50505050919050565b6000828152600e6020908152604080832054600160a060020a031683526001909152812054600c54829081908190819081908190891061336357600c54613365565b885b60008b8152600e602052604090206002015490965060010194505b85851161340f576133908561197b565b601e5460008c8152600e602052604090206003015491955060001990860281019450850160020a908115156133c157fe5b0491508490505b8281111580156133d85750858111155b15613407576133fc87602154600201600a0a8985028115156133f657fe5b04612ffc565b96505b6001016133c8565b809450613380565b8697505b5050505050505092915050565b600160a060020a0382166000908152600d6020526040812054819061344481612ebf565b151561344f57600080fd5b613457611554565b151561346257600080fd5b61346b8461254b565b1561347557600080fd5b600160a060020a0385166000908152600d60205260409020549150613499826131fb565b506000828152600e602081815260408084208054600160a060020a031916600160a060020a038a81169182178355908652600d84528286208890558a168552908420849055858452919052600101556134f0613016565b6000838152600e60205260408082206002810193909355600483018290556005909201557ffb7aaa2ec871044b8cde9fee0cd727b02c8d6caf7aeb7f5fa2e02ffdfe1643349083908790879051928352600160a060020a039182166020840152166040808301919091526060909101905180910390a1600192505b5b505092915050565b60055433600160a060020a0390811691161461358f57600080fd5b6005805474ff0000000000000000000000000000000000000000191660a060020a1790555b5b565b60015b90565b60035433600160a060020a039081169116146135d857600080fd5b60205460ff16156135e857600080fd5b6020805460ff19166001179055601f8190555b5b50565b8061360981612ebf565b151561361457600080fd5b6001601b5403601c54601d5403600184030281151561362f57fe5b601d546000858152600e602052604090209290910490036003909101555b5b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061369357805160ff19168380011785556136c0565b828001600101855582156136c0579182015b828111156136c05782518255916020019190600101906136a5565b5b506118549291506136e3565b5090565b60206040519081016040526000815290565b61155b91905b8082111561185457600081556001016136e9565b5090565b905600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a723058203c8e25f14894b4155b24701de30f025078d8ed7672c303ae840676a0ea8b273f002900000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000d050000000000000000000000000000000000000000000000000000000000000c9c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000001e1d1c72d5b97e0000000000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000001e133800000000000000000000000000000000000000000000000000000000000000003444159000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034441590000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x606060405236156103b65763ffffffff60e060020a60003504166302f652a381146103bb57806304d41474146103e157806305d2035b1461040657806306fdde031461042d578063095ea7b3146104b85780630a402742146104ee5780630c58062b1461051b57806310f1726d14610540578063128e37611461056757806318160ddd1461058c5780631bf2a90a146105b157806323b872dd146105d657806329ff4f53146106125780632f83f78114610633578063313ce5671461065a578063331c55b414610683578063335494a4146106af57806335995022146106d75780633cb5d100146106ff5780633ed66d3d1461077557806340c10f19146107a257806342c1867b146107c657806343214675146107f957806345977d031461081f5780634778dfb8146108375780634813e3e51461085f578063485d5dd21461088457806348bb4067146108a95780634b3d81b6146108da5780634eee966f146108ff578063534439a31461099457806354f63105146109b95780635956b853146109de5780635d444ffb14610a115780635de4ccb014610a365780635df34ff214610a655780635f412d4f14610a92578063600440cb14610aa757806370a0823114610ad6578063718228fa14610b07578063740707cf14610b2c57806379ba509714610b415780638444b39114610b565780638526d09214610b8d578063867c285714610bc05780638da5cb5b14610bf35780638f7b7bce14610c22578063928e659214610c55578063936bbf9a14610c8657806393e5365f14610cab57806395d89b4114610cd05780639613252114610d5b57806396a8069914610d825780639738968c14610da95780639aaac86414610dd05780639bc8e9ee14610df7578063a222a52f14610e0f578063a293d1e814610e34578063a41ff1e514610e5f578063a5f2676014610e84578063a666190114610eae578063a9059cbb14610ed3578063b19b216214610f09578063b54d623814610f30578063b6033daf14610f48578063bef17ed014610f79578063c392f11814610f9e578063c4e41b2214610fd8578063c59513a414610ffd578063c752ff6214611024578063c96e83db14611049578063d05c78da1461106e578063d1f276d314611099578063d49dbb5c146110c8578063d4ee1d90146110ed578063d7e7088a1461111c578063d94fe8321461113d578063dd62ed3e1461116e578063df30e592146111a5578063e0faf0a8146111cf578063e6cb901314611236578063eb60764f14611261578063f2fde38b14611286578063ffeb7d75146112a7575b600080fd5b34156103c657600080fd5b6103df600160a060020a036004351660243515156112c8565b005b34156103ec57600080fd5b6103f4611329565b60405190815260200160405180910390f35b341561041157600080fd5b61041961132f565b604051901515815260200160405180910390f35b341561043857600080fd5b610440611338565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561047d5780820151818401525b602001610464565b50505050905090810190601f1680156104aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104c357600080fd5b610419600160a060020a03600435166024356113d6565b604051901515815260200160405180910390f35b34156104f957600080fd5b6103df600160a060020a036004351660243560443560643560843561147d565b005b341561052657600080fd5b6103f461154e565b60405190815260200160405180910390f35b341561054b57600080fd5b610419611554565b604051901515815260200160405180910390f35b341561057257600080fd5b6103f461155e565b60405190815260200160405180910390f35b341561059757600080fd5b6103f4611564565b60405190815260200160405180910390f35b34156105bc57600080fd5b6103f461156a565b60405190815260200160405180910390f35b34156105e157600080fd5b610419600160a060020a0360043581169060243516604435611570565b604051901515815260200160405180910390f35b341561061d57600080fd5b6103df600160a060020a03600435166116f7565b005b341561063e57600080fd5b61041961174e565b604051901515815260200160405180910390f35b341561066557600080fd5b61066d611858565b60405160ff909116815260200160405180910390f35b341561068e57600080fd5b6103df600160a060020a03600435166024356044356064351515611861565b005b34156106ba57600080fd5b6103f460043561193c565b60405190815260200160405180910390f35b34156106e257600080fd5b6103f460043561197b565b60405190815260200160405180910390f35b341561070a57600080fd5b610715600435611996565b6040518088600160a060020a0316600160a060020a0316815260200187815260200186815260200185815260200184815260200183815260200182600281111561075b57fe5b60ff16815260200197505050505050505060405180910390f35b341561078057600080fd5b6104196004356024356119e0565b604051901515815260200160405180910390f35b34156107ad57600080fd5b6103df600160a060020a0360043516602435611bf8565b005b34156107d157600080fd5b610419600160a060020a0360043516611ca7565b604051901515815260200160405180910390f35b341561080457600080fd5b6103df600160a060020a03600435166024351515611cbc565b005b341561082a57600080fd5b6103df600435611d5b565b005b341561084257600080fd5b6103f4600435611eb5565b60405190815260200160405180910390f35b341561086a57600080fd5b6103f4611f23565b60405190815260200160405180910390f35b341561088f57600080fd5b6103f4611f29565b60405190815260200160405180910390f35b34156108b457600080fd5b6103f4600160a060020a0360043516611f2f565b60405190815260200160405180910390f35b34156108e557600080fd5b6103f4611f41565b60405190815260200160405180910390f35b341561090a57600080fd5b6103df60046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528181529291906020840183838082843750949650611f4795505050505050565b005b341561099f57600080fd5b6103f46120b7565b60405190815260200160405180910390f35b34156109c457600080fd5b6103f46120bd565b60405190815260200160405180910390f35b34156109e957600080fd5b610419600160a060020a03600435166120c3565b604051901515815260200160405180910390f35b3415610a1c57600080fd5b6103f46120d8565b60405190815260200160405180910390f35b3415610a4157600080fd5b610a496120de565b604051600160a060020a03909116815260200160405180910390f35b3415610a7057600080fd5b6104196004356024356120ed565b604051901515815260200160405180910390f35b3415610a9d57600080fd5b6103df61232d565b005b3415610ab257600080fd5b610a49612372565b604051600160a060020a03909116815260200160405180910390f35b3415610ae157600080fd5b6103f4600160a060020a0360043516612381565b60405190815260200160405180910390f35b3415610b1257600080fd5b6103f46123d7565b60405190815260200160405180910390f35b3415610b3757600080fd5b6103df6123dd565b005b3415610b4c57600080fd5b6103df61247b565b005b3415610b6157600080fd5b610b696124fa565b60405180826004811115610b7957fe5b60ff16815260200191505060405180910390f35b3415610b9857600080fd5b610419600160a060020a036004351661254b565b604051901515815260200160405180910390f35b3415610bcb57600080fd5b610419600160a060020a0360043516612575565b604051901515815260200160405180910390f35b3415610bfe57600080fd5b610a4961258a565b604051600160a060020a03909116815260200160405180910390f35b3415610c2d57600080fd5b610419600160a060020a0360043516612599565b604051901515815260200160405180910390f35b3415610c6057600080fd5b6103f4600160a060020a03600435166125e9565b60405190815260200160405180910390f35b3415610c9157600080fd5b6103f46125fb565b60405190815260200160405180910390f35b3415610cb657600080fd5b6103f4612601565b60405190815260200160405180910390f35b3415610cdb57600080fd5b610440612607565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561047d5780820151818401525b602001610464565b50505050905090810190601f1680156104aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d6657600080fd5b6104196126a5565b604051901515815260200160405180910390f35b3415610d8d57600080fd5b6103df600160a060020a03600435166024356044356126b5565b005b3415610db457600080fd5b61041961279a565b604051901515815260200160405180910390f35b3415610ddb57600080fd5b6104196127c0565b604051901515815260200160405180910390f35b3415610e0257600080fd5b6103df6004356127c9565b005b3415610e1a57600080fd5b6103f46127fe565b60405190815260200160405180910390f35b3415610e3f57600080fd5b6103f4600435602435612804565b60405190815260200160405180910390f35b3415610e6a57600080fd5b6103f461281b565b60405190815260200160405180910390f35b3415610e8f57600080fd5b610419600435612821565b604051901515815260200160405180910390f35b3415610eb957600080fd5b6103f4612847565b60405190815260200160405180910390f35b3415610ede57600080fd5b610419600160a060020a036004351660243561284d565b604051901515815260200160405180910390f35b3415610f1457600080fd5b610419612980565b604051901515815260200160405180910390f35b3415610f3b57600080fd5b6103df600435612b5a565b005b3415610f5357600080fd5b6103f4600160a060020a0360043516612ba2565b60405190815260200160405180910390f35b3415610f8457600080fd5b6103f4612bcc565b60405190815260200160405180910390f35b3415610fa957600080fd5b610fb4600435612bd2565b60405180826002811115610b7957fe5b60ff16815260200191505060405180910390f35b3415610fe357600080fd5b6103f4612c31565b60405190815260200160405180910390f35b341561100857600080fd5b610419612c38565b604051901515815260200160405180910390f35b341561102f57600080fd5b6103f4612c75565b60405190815260200160405180910390f35b341561105457600080fd5b6103f4612c7b565b60405190815260200160405180910390f35b341561107957600080fd5b6103f4600435602435612c81565b60405190815260200160405180910390f35b34156110a457600080fd5b610a49612cb0565b604051600160a060020a03909116815260200160405180910390f35b34156110d357600080fd5b6103f4612cbf565b60405190815260200160405180910390f35b34156110f857600080fd5b610a49612cc5565b604051600160a060020a03909116815260200160405180910390f35b341561112757600080fd5b6103df600160a060020a0360043516612cd4565b005b341561114857600080fd5b6103f4600160a060020a0360043516612e80565b60405190815260200160405180910390f35b341561117957600080fd5b6103f4600160a060020a0360043581169060243516612e92565b60405190815260200160405180910390f35b34156111b057600080fd5b610419600435612ebf565b604051901515815260200160405180910390f35b34156111da57600080fd5b6111e2612f2b565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156112225780820151818401525b602001611209565b505050509050019250505060405180910390f35b341561124157600080fd5b6103f4600435602435612ffc565b60405190815260200160405180910390f35b341561126c57600080fd5b6103f4613016565b60405190815260200160405180910390f35b341561129157600080fd5b6103df600160a060020a036004351661303e565b005b34156112b257600080fd5b6103df600160a060020a0360043516613079565b005b60035433600160a060020a039081169116146112e357600080fd5b60055460009060a060020a900460ff16156112fd57600080fd5b600160a060020a0383166000908152600660205260409020805460ff19168315151790555b5b505b5050565b60145481565b60075460ff1681565b60258054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ce5780601f106113a3576101008083540402835291602001916113ce565b820191906000526020600020905b8154815290600101906020018083116113b157829003601f168201915b505050505081565b60008115806114085750600160a060020a03338116600090815260026020908152604080832093871683529290522054155b151561141357600080fd5b600160a060020a03338116600081815260026020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60035433600160a060020a0390811691161461149857600080fd5b60125483101580156114ac57506013548311155b15156114b757600080fd5b601354601454106114c757600080fd5b6114d28386846130c8565b6014805460010190556114e58583611bf8565b7f6bd11c91e66ab57411c3d72828f939eac4446988c1c1f5862442bf7fa9884e238582848787604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a15b5b5050505050565b60235481565b601f544210155b90565b60155481565b60005481565b601a5481565b60008061157b611554565b151561158657600080fd5b61158f85612599565b151561159a57600080fd5b50600160a060020a03808516600081815260026020908152604080832033909516835293815283822054928252600d905291909120546115d9906131fb565b50826115e486612381565b101580156115f157508215155b80156115fd5750808311155b151561160857600080fd5b600160a060020a0384166000908152600d602052604090205461162a906131fb565b506116358184612804565b600160a060020a0380871660008181526002602090815260408083203390951683529381528382209490945590815260019092529020546116769084612804565b600160a060020a0380871660009081526001602052604080822093909355908616815220546116a59084612ffc565b600160a060020a03808616600081815260016020526040908190209390935591908716906000805160206137058339815191529086905190815260200160405180910390a3600191505b509392505050565b60035433600160a060020a0390811691161461171257600080fd5b60055460009060a060020a900460ff161561172c57600080fd5b60058054600160a060020a031916600160a060020a0384161790555b5b505b50565b600160a060020a033316600090815260106020526040812054819060ff16151560011461177a57600080fd5b600160a060020a0333166000908152601060209081526040808320805460ff191690556022546011909252909120546117b39190612ffc565b600160a060020a0330166000908152600160205260409020549091506117d99082612804565b600160a060020a033081166000908152600160205260408082209390935533909116815220546118099082612ffc565b600160a060020a0333811660008181526001602052604090819020939093559130909116906000805160206137058339815191529084905190815260200160405180910390a3600191505b5090565b60275460ff1681565b60035433600160a060020a0390811691161461187c57600080fd5b601554831015801561189357506016546015540183105b151561189e57600080fd5b601654601754106118ae57600080fd5b6118ba838560006130c8565b6017805460010190558015156118e657600160a060020a0384166000908152600f602052604090204290555b6118f08483611bf8565b7fe79fec6463e59273a1da7bc924872b8b35b64c591ce527b6329f0db8d6be71fd8484604051600160a060020a03909216825260208201526040908101905180910390a15b5b50505050565b6000600161195061194b613016565b61197b565b6000848152600e602052604090206003015491900360020a9081151561197257fe5b0490505b919050565b6000601e548281151561198a57fe5b0460010190505b919050565b600e602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154600160a060020a039095169593949293919290919060ff1687565b6000806119eb611554565b15156119f657600080fd5b438311611a0257600080fd5b611a0b33612599565b1515611a1657600080fd5b50600160a060020a0333166000908152600d6020526040812054905b6000828152600e602052604090206006015460ff166002811115611a5257fe5b14611a5c57600080fd5b611a65816131fb565b50602254600160a060020a0333166000908152600160205260409020541015611a8d57600080fd5b6000818152600e60205260409020600581018590556004810184905560060180546002919060ff19166001835b0217905550600160a060020a033316600090815260016020526040902054602254611ae59190612804565b600160a060020a03338116600090815260016020526040808220939093553090911681522054602254611b189190612ffc565b6001600030600160a060020a0316600160a060020a031681526020019081526020016000208190555030600160a060020a031633600160a060020a031660008051602061370583398151915260225460405190815260200160405180910390a36000818152600e60205260409081902060058101546004909101547f789864ab03bca8d309c9bec6804307cfc416db24eab7873ba7f3df79797b09179284923392909151938452600160a060020a03909216602084015260408084019190915260608301919091526080909101905180910390a1600191505b5092915050565b600160a060020a03331660009081526008602052604090205460ff161515611c1f57600080fd5b60075460ff1615611c2f57600080fd5b611c3b60005482612ffc565b6000908155600160a060020a038316815260016020526040902054611c609082612ffc565b600160a060020a0383166000818152600160205260408082209390935590916000805160206137058339815191529084905190815260200160405180910390a35b5b5b5050565b60086020526000908152604090205460ff1681565b60035433600160a060020a03908116911614611cd757600080fd5b60075460ff1615611ce757600080fd5b600160a060020a03821660009081526008602052604090819020805460ff19168315151790557f4b0adf6c802794c7dde28a08a4e07131abcff3bf9603cd71f14f90bec7865efa908390839051600160a060020a039092168252151560208201526040908101905180910390a15b5b5b5050565b6000611d656124fa565b905060035b816004811115611d7657fe5b1480611d8e575060045b816004811115611d8c57fe5b145b1515611d9957600080fd5b811515611da557600080fd5b600160a060020a033316600090815260016020526040902054611dc89083612804565b600160a060020a03331660009081526001602052604081209190915554611def9083612804565b600055600b54611dff9083612ffc565b600b55600a54600160a060020a031663753e88e5338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611e5857600080fd5b6102c65a03f11515611e6957600080fd5b5050600a54600160a060020a03908116915033167f7e5c344a8141a805725cb476f76c6953b842222b967edd1f78ddb6e8b3f397ac8460405190815260200160405180910390a35b5050565b6000818152600e6020526040812054600160a060020a0316611ed5611554565b15611f0057611ee383612ebf565b15611f0057611ef983611ef4613016565b613321565b9150611f1d565b5b600160a060020a03811660009081526001602052604090205491505b50919050565b601e5481565b60245481565b600f6020526000908152604090205481565b601f5481565b60035433600160a060020a03908116911614611f6257600080fd5b6025828051611f75929160200190613652565b506026818051611f89929160200190613652565b507fd131ab1e6f279deea74e13a18477e13e2107deb6dc8ae955648948be5841fb466025602660405160408082528354600260001961010060018416150201909116049082018190528190602082019060608301908690801561202d5780601f106120025761010080835404028352916020019161202d565b820191906000526020600020905b81548152906001019060200180831161201057829003601f168201915b50508381038252845460026000196101006001841615020190911604808252602090910190859080156120a15780601f10612076576101008083540402835291602001916120a1565b820191906000526020600020905b81548152906001019060200180831161208457829003601f168201915b505094505050505060405180910390a15b5b5050565b60215481565b601d5481565b60106020526000908152604090205460ff1681565b601c5481565b600a54600160a060020a031681565b60008060025b6000858152600e602052604090206006015460ff16600281111561211357fe5b14801561213057506000848152600e602052604090206004015443115b15612159576000848152600e6020526040902060060180546001919060ff191682805b02179055505b506000838152600e6020526040902054600160a060020a031660025b6000858152600e602052604090206006015460ff16600281111561219557fe5b1461219f57600080fd5b6000848152600e60205260409020600501548310156121bd57600080fd5b6000848152600e60205260408120600601805460ff19166001835b0217905550600160a060020a0333166000908152600160205260409020546122009084612804565b600160a060020a033381166000908152600160205260408082209390935530909116815220546122309084612ffc565b600160a060020a0330811660008181526001602052604090819020939093559133909116906000805160206137058339815191529086905190815260200160405180910390a36000848152600e602052604090205461229890600160a060020a031633613420565b1561232157600160a060020a0381166000908152601160209081526040808320869055601090915290819020805460ff191660011790557f72760e46b3824807567c13ec75882de5d9c789a91517ae7b474d2e6b62d3771e9085903390869051928352600160a060020a0390911660208301526040808301919091526060909101905180910390a15b600191505b5092915050565b60035433600160a060020a0390811691161461234857600080fd5b60205460ff16151561235957600080fd5b6007805460ff1916600117905561236e613574565b5b5b565b600954600160a060020a031681565b600160a060020a0381166000908152600d602052604081205480156123b057611ef981611eb5565b9150611f1d565b600160a060020a0383166000908152600160205260409020549150611f1d565b5b50919050565b60175481565b600160a060020a0333166000908152600d60205260408120546123ff81612ebf565b151561240a57600080fd5b600160a060020a0333166000908152600d6020526040902054915060025b6000838152600e602052604090206006015460ff16600281111561244857fe5b1461245257600080fd5b6000828152600e6020526040902060060180546001919060ff191682805b02179055505b5b5050565b60045433600160a060020a0390811691161461249657600080fd5b600454600354600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360045460038054600160a060020a031916600160a060020a039092169190911790555b565b600061250461279a565b15156125125750600161155b565b600a54600160a060020a0316151561252c5750600261155b565b600b54151561253d5750600361155b565b50600461155b565b5b5b5b90565b600160a060020a0381166000908152600d602052604081205461256d90612ebf565b90505b919050565b60066020526000908152604090205460ff1681565b600354600160a060020a031681565b600160a060020a0381166000908152600f60205260409020546001901561197657602354600160a060020a0383166000908152600f602052604090205442031015611976575060005b5b5b919050565b60116020526000908152604090205481565b60195481565b601b5481565b60268054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ce5780601f106113a3576101008083540402835291602001916113ce565b820191906000526020600020905b8154815290600101906020018083116113b157829003601f168201915b505050505081565b60055460a060020a900460ff1681565b60035433600160a060020a039081169116146126d057600080fd5b60185481101580156126e757506019546018540181105b15156126f257600080fd5b601954601a541061270257600080fd5b60055460a060020a900460ff16151560011461271d57600080fd5b612729818460006130c8565b601a805460010190557f5da87a24d5db985862dc335ff32e322d9588ae9b4a971bd1526a58051c8cbaa4836000808585604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a15b5b505050565b60055460009060a060020a900460ff1680156127b957506127b96135b7565b5b90505b90565b60205460ff1681565b60035433600160a060020a039081169116146127e457600080fd5b60205460ff16156127f457600080fd5b60218190555b5b50565b60185481565b60008282111561281057fe5b508082035b92915050565b600c5481565b600061282b611554565b151561283657600080fd5b61256d826131fb565b90505b919050565b60135481565b6000612857611554565b151561286257600080fd5b61286b33612599565b151561287657600080fd5b600160a060020a0333166000908152600d6020526040902054612898906131fb565b50816128a333612381565b101580156128b057508115155b15156128bb57600080fd5b600160a060020a0383166000908152600d60205260409020546128dd906131fb565b50600160a060020a0333166000908152600160205260409020546129019083612804565b600160a060020a0333811660009081526001602052604080822093909355908516815220546129309083612ffc565b600160a060020a0380851660008181526001602052604090819020939093559133909116906000805160206137058339815191529085905190815260200160405180910390a35060015b92915050565b600160a060020a0333166000908152600d602052604081205481906129a481612ebf565b15156129af57600080fd5b600160a060020a0333166000908152600d6020908152604080832054808452600e9092529091206004015490925043118015612a0b575060025b6000838152600e602052604090206006015460ff166002811115612a0957fe5b145b15612a34576000828152600e6020526040902060060180546001919060ff191682805b02179055505b60015b6000838152600e602052604090206006015460ff166002811115612a5757fe5b14612a6157600080fd5b6000828152600e60205260408120600601805460ff19166001835b0217905550600160a060020a033016600090815260016020526040902054602254612aa79190612804565b600160a060020a033016600090815260016020526040902055612ac9826131fb565b50600160a060020a033316600090815260016020526040902054602254612af09190612ffc565b600160a060020a03338116600081815260016020908152604080832095909555868252600e905283812060058101829055600401556022549092309092169160008051602061370583398151915291905190815260200160405180910390a3600192505b5b505090565b60035433600160a060020a03908116911614612b7557600080fd5b60055460a060020a900460ff1615612b8c57600080fd5b612b95816135bd565b61174b61232d565b5b5b50565b600160a060020a0381166000908152600d602052604081205461256d9061193c565b90505b919050565b60165481565b6000612bdd82612ebf565b1515612be857600080fd5b506000818152600e60205260409020600681015460049091015460ff9091169043118015612c22575060025b816002811115612c2057fe5b145b15611976575060015b5b919050565b6000545b90565b6000612c42611554565b1515612c4d57600080fd5b600160a060020a0333166000908152600d60205260409020546127b9906131fb565b90505b90565b600b5481565b60125481565b6000828202831580612c9d5750828482811515612c9a57fe5b04145b1515612ca557fe5b8091505b5092915050565b600554600160a060020a031681565b60225481565b600454600160a060020a031681565b612cdc61279a565b1515612ce757600080fd5b600160a060020a0381161515612cfc57600080fd5b60095433600160a060020a03908116911614612d1757600080fd5b60045b612d226124fa565b6004811115612d2d57fe5b1415612d3857600080fd5b600a8054600160a060020a031916600160a060020a038381169190911791829055166361d3d7a66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612d9657600080fd5b6102c65a03f11515612da757600080fd5b505050604051805190501515612dbc57600080fd5b60008054600a549091600160a060020a0390911690634b2ba0dd90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612e0c57600080fd5b6102c65a03f11515612e1d57600080fd5b50505060405180519050141515612e3357600080fd5b600a547f7845d5aa74cc410e35571258d954f23b82276e160fe8c188fa80566580f279cc90600160a060020a0316604051600160a060020a03909116815260200160405180910390a15b50565b600d6020526000908152604090205481565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b60008082118015612ed25750601b548211155b8015612ef457506000828152600e6020526040902054600160a060020a031615155b801561256d57506000828152600e6020908152604080832054600160a060020a03168352600d90915290205482145b90505b919050565b612f336136d1565b612f3b6136d1565b600080601b54604051805910612f4e5750595b908082528060200260200182016040525b50925060009150600190505b601b548111612ff257612f7d81612ebf565b8015612f9a57506000818152600e60205260409020600401544311155b8015612fc6575060025b6000828152600e602052604090206006015460ff166002811115612fc457fe5b145b15612fe95780838381518110612fd857fe5b602090810290910101526001909101905b5b600101612f6b565b8293505b50505090565b600082820183811015612ca557fe5b8091505b5092915050565b6000613020611554565b1561155b57602454601f54420381151561303657fe5b0490505b5b90565b60035433600160a060020a0390811691161461305957600080fd5b60048054600160a060020a031916600160a060020a0383161790555b5b50565b600160a060020a038116151561308e57600080fd5b60095433600160a060020a039081169116146130a957600080fd5b60098054600160a060020a031916600160a060020a0383161790555b50565b60035433600160a060020a039081169116146130e357600080fd5b601b548311156130f257600080fd5b6130fb8261254b565b1561310557600080fd5b61310e83612ebf565b1561311857600080fd5b6000838152600e602090815260408083208054600160a060020a031916600160a060020a0387169081179091558352600d909152902083905561315a836135ff565b6000838152600e60205260409020600101819055613176613016565b600e6000858152602001908152602001600020600201819055507f5fd6d0b7e707fe344bd2a1887f9d0eeea8bfcac6f339ba4200e74f0647f101c08284604051600160a060020a03909216825260208201526040908101905180910390a16000838152600e60205260408120600601805460ff19166001835b02179055505b5b505050565b600080600080600061320c86612ebf565b1561331257613219613016565b6000878152600e6020526040902060020154909450841480159061324f5750600c546000878152600e6020526040902060020154105b15613312576000868152600e6020908152604080832054600160a060020a03168084526001909252822054915490945090925061328c9083612804565b6000556132998685613321565b600160a060020a0384166000908152600160205260408120829055549091506132c29082612ffc565b6000908155868152600e6020526040808220600201869055600160a060020a038516919060008051602061370583398151915290858503905190815260200160405180910390a360019450613318565b5b600094505b50505050919050565b6000828152600e6020908152604080832054600160a060020a031683526001909152812054600c54829081908190819081908190891061336357600c54613365565b885b60008b8152600e602052604090206002015490965060010194505b85851161340f576133908561197b565b601e5460008c8152600e602052604090206003015491955060001990860281019450850160020a908115156133c157fe5b0491508490505b8281111580156133d85750858111155b15613407576133fc87602154600201600a0a8985028115156133f657fe5b04612ffc565b96505b6001016133c8565b809450613380565b8697505b5050505050505092915050565b600160a060020a0382166000908152600d6020526040812054819061344481612ebf565b151561344f57600080fd5b613457611554565b151561346257600080fd5b61346b8461254b565b1561347557600080fd5b600160a060020a0385166000908152600d60205260409020549150613499826131fb565b506000828152600e602081815260408084208054600160a060020a031916600160a060020a038a81169182178355908652600d84528286208890558a168552908420849055858452919052600101556134f0613016565b6000838152600e60205260408082206002810193909355600483018290556005909201557ffb7aaa2ec871044b8cde9fee0cd727b02c8d6caf7aeb7f5fa2e02ffdfe1643349083908790879051928352600160a060020a039182166020840152166040808301919091526060909101905180910390a1600192505b5b505092915050565b60055433600160a060020a0390811691161461358f57600080fd5b6005805474ff0000000000000000000000000000000000000000191660a060020a1790555b5b565b60015b90565b60035433600160a060020a039081169116146135d857600080fd5b60205460ff16156135e857600080fd5b6020805460ff19166001179055601f8190555b5b50565b8061360981612ebf565b151561361457600080fd5b6001601b5403601c54601d5403600184030281151561362f57fe5b601d546000858152600e602052604090209290910490036003909101555b5b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061369357805160ff19168380011785556136c0565b828001600101855582156136c0579182015b828111156136c05782518255916020019190600101906136a5565b5b506118549291506136e3565b5090565b60206040519081016040526000815290565b61155b91905b8082111561185457600081556001016136e9565b5090565b905600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a723058203c8e25f14894b4155b24701de30f025078d8ed7672c303ae840676a0ea8b273f0029

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

00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000d050000000000000000000000000000000000000000000000000000000000000c9c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000001e1d1c72d5b97e0000000000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000001e133800000000000000000000000000000000000000000000000000000000000000003444159000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034441590000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): DAY
Arg [1] : _symbol (string): DAY
Arg [2] : _initialSupply (uint256): 0
Arg [3] : _decimals (uint8): 18
Arg [4] : _mintable (bool): True
Arg [5] : _maxAddresses (uint256): 3333
Arg [6] : _firstTeamContributorId (uint256): 3228
Arg [7] : _totalTeamContributorIds (uint256): 18
Arg [8] : _totalPostIcoContributorIds (uint256): 88
Arg [9] : _minMintingPower (uint256): 500000000000000000
Arg [10] : _maxMintingPower (uint256): 1000000000000000000
Arg [11] : _halvingCycle (uint256): 88
Arg [12] : _minBalanceToSell (uint256): 8888000000000000000000
Arg [13] : _dayInSecs (uint256): 86400
Arg [14] : _teamLockPeriodInSec (uint256): 31536000

-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000d05
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000c9c
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000058
Arg [9] : 00000000000000000000000000000000000000000000000006f05b59d3b20000
Arg [10] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000058
Arg [12] : 0000000000000000000000000000000000000000000001e1d1c72d5b97e00000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [14] : 0000000000000000000000000000000000000000000000000000000001e13380
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [16] : 4441590000000000000000000000000000000000000000000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [18] : 4441590000000000000000000000000000000000000000000000000000000000


Swarm Source

bzzr://3c8e25f14894b4155b24701de30f025078d8ed7672c303ae840676a0ea8b273f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.