ETH Price: $2,630.91 (-13.06%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer140972632022-01-28 23:53:391392 days ago1643414019IN
0x9901ed1e...3464da747
0 ETH0.00424981113
Transfer130543142021-08-19 7:19:131555 days ago1629357553IN
0x9901ed1e...3464da747
0 ETH0.0012035922
Transfer125174132021-05-27 16:24:041638 days ago1622132644IN
0x9901ed1e...3464da747
0 ETH0.0018693742
Transfer123445462021-04-30 22:33:511665 days ago1619822031IN
0x9901ed1e...3464da747
0 ETH0.0017135938.5
Transfer121721302021-04-04 8:44:541692 days ago1617525894IN
0x9901ed1e...3464da747
0 ETH0.00432575106
Transfer120945462021-03-23 10:22:081704 days ago1616494928IN
0x9901ed1e...3464da747
0 ETH0.00375944116
Transfer106248212020-08-09 9:11:411930 days ago1596964301IN
0x9901ed1e...3464da747
0 ETH0.0040377199
Transfer106246332020-08-09 8:28:161930 days ago1596961696IN
0x9901ed1e...3464da747
0 ETH0.0055227199
Transfer106246112020-08-09 8:24:001930 days ago1596961440IN
0x9901ed1e...3464da747
0 ETH0.0055227199
Transfer106238682020-08-09 5:40:291930 days ago1596951629IN
0x9901ed1e...3464da747
0 ETH0.0022866941
Approve83566622019-08-15 18:25:502289 days ago1565893550IN
0x9901ed1e...3464da747
0 ETH0.000184964
Approve83566602019-08-15 18:24:102289 days ago1565893450IN
0x9901ed1e...3464da747
0 ETH0.000184964
Transfer83566552019-08-15 18:22:412289 days ago1565893361IN
0x9901ed1e...3464da747
0 ETH0.000116423
Transfer79213202019-06-08 23:31:062357 days ago1560036666IN
0x9901ed1e...3464da747
0 ETH0.000215494
Transfer From76695032019-04-30 15:13:592396 days ago1556637239IN
0x9901ed1e...3464da747
0 ETH0.00007683
Approve76694922019-04-30 15:11:332396 days ago1556637093IN
0x9901ed1e...3464da747
0 ETH0.000184964
Approve69469562018-12-24 23:16:232523 days ago1545693383IN
0x9901ed1e...3464da747
0 ETH0.00018474
Transfer68539952018-12-09 9:42:042539 days ago1544348524IN
0x9901ed1e...3464da747
0 ETH0.0015911641
Transfer68231492018-12-04 6:58:352544 days ago1543906715IN
0x9901ed1e...3464da747
0 ETH0.0031435281
Transfer63339802018-09-15 3:41:142624 days ago1536982874IN
0x9901ed1e...3464da747
0 ETH0.0005811715
Transfer61665592018-08-18 0:16:312652 days ago1534551391IN
0x9901ed1e...3464da747
0 ETH0.0011286421
Approve61236962018-08-10 18:06:482659 days ago1533924408IN
0x9901ed1e...3464da747
0 ETH0.00012474
Approve59415222018-07-10 23:16:322690 days ago1531264592IN
0x9901ed1e...3464da747
0 ETH0.00012474
Approve59414482018-07-10 22:55:362690 days ago1531263336IN
0x9901ed1e...3464da747
0 ETH0.00018474
Approve59413152018-07-10 22:17:552690 days ago1531261075IN
0x9901ed1e...3464da747
0 ETH0.00012474
View all transactions

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer47297892017-12-14 6:50:432899 days ago1513234243
0x9901ed1e...3464da747
1,623.36307203 ETH
Transfer47297892017-12-14 6:50:432899 days ago1513234243
0x9901ed1e...3464da747
67.12671321 ETH
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Hut34TS

Compiler Version
v0.4.17+commit.bdeb9e52

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2017-11-01
*/

/*
file:   Hut34TS.sol
ver:    0.2.4_deploy
author: Darryl Morris
date:   27-Oct-2017
email:  o0ragman0o AT gmail.com
(c) Darryl Morris 2017

A collated contract set for the receipt of funds and production and transfer
of ERC20 tokens as specified by Hut34.

License
-------
This software is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See MIT Licence for further details.
<https://opensource.org/licenses/MIT>.

Release Notes
-------------
* Added `event Aborted()`
* correct `wholesaleLeft` magnitude bug
* All tests passed

Dedications
-------------
* with love to Isabella and pea from your dad
* xx to edie, robin, william and charlotte x
*/


pragma solidity ^0.4.17;

// Audited 27 October 2017 by Darryl Morris, Peter Godbolt
contract Hut34Config
{
    // ERC20 token name
    string  public constant name            = "Hut34 Entropy";

    // ERC20 trading symbol
    string  public constant symbol          = "ENT";

    // ERC20 decimal places
    uint8   public constant decimals        = 18;

    // Total supply (* in unit ENT *)
    uint    public constant TOTAL_TOKENS    = 100000000;

    // Contract owner at time of deployment.
    address public constant OWNER           = 0xdA3780Cff2aE3a59ae16eC1734DEec77a7fd8db2;

    // + new Date("00:00 2 November 2017 utc")/1000
    uint    public constant START_DATE      = 1509580800;

    // A Hut34 address to own tokens
    address public constant HUT34_RETAIN    = 0x3135F4acA3C1Ad4758981500f8dB20EbDc5A1caB;

    // A Hut34 address to accept raised funds
    address public constant HUT34_WALLET    = 0xA70d04dC4a64960c40CD2ED2CDE36D76CA4EDFaB;

    // Percentage of tokens to be vested over 2 years. 20%
    uint    public constant VESTED_PERCENT  = 20;

    // Vesting period
    uint    public constant VESTING_PERIOD  = 26 weeks;

    // Minimum cap over which the funding is considered successful
    uint    public constant MIN_CAP         = 3000 * 1 ether;

    // An ether threshold over which a funder must KYC before tokens can be
    // transferred (unit of ether);
    uint    public constant KYC_THRESHOLD   = 150 * 1 ether;

    // A minimum amount of ether funding before the concierge rate is applied
    // to tokens
    uint    public constant WHOLESALE_THRESHOLD  = 150 * 1 ether;

    // Number of tokens up for wholesale purchasers (* in unit ENT *)
    uint    public constant WHOLESALE_TOKENS = 12500000;

    // Tokens sold to prefunders (* in unit ENT *)
    uint    public constant PRESOLD_TOKENS  = 2246500;

    // Presale ether is estimateed from fiat raised prior to TS at the ETH/AUD
    // rate at the time of contract deployment
    uint    public constant PRESALE_ETH_RAISE = 2807 * 1 ether;

    // Address holding presold tokens to be distributed after TS
    address public constant PRESOLD_ADDRESS = 0x6BF708eF2C1FDce3603c04CE9547AA6E134093b6;

    // wholesale rate for purchases over WHOLESALE_THRESHOLD ether
    uint    public constant RATE_WHOLESALE  = 1000;

    // Time dependant retail rates
    // First Day
    uint    public constant RATE_DAY_0      = 750;

    // First Week (The six days after first day)
    uint    public constant RATE_DAY_1      = 652;

    // Second Week
    uint    public constant RATE_DAY_7      = 588;

    // Third Week
    uint    public constant RATE_DAY_14     = 545;

    // Fourth Week
    uint    public constant RATE_DAY_21     = 517;

    // Fifth Week
    uint    public constant RATE_DAY_28     = 500;
}


library SafeMath
{
    // a add to b
    function add(uint a, uint b) internal pure returns (uint c) {
        c = a + b;
        assert(c >= a);
    }

    // a subtract b
    function sub(uint a, uint b) internal pure returns (uint c) {
        c = a - b;
        assert(c <= a);
    }

    // a multiplied by b
    function mul(uint a, uint b) internal pure returns (uint c) {
        c = a * b;
        assert(a == 0 || c / a == b);
    }

    // a divided by b
    function div(uint a, uint b) internal pure returns (uint c) {
        assert(b != 0);
        c = a / b;
    }
}


contract ReentryProtected
{
    // The reentry protection state mutex.
    bool __reMutex;

    // Sets and clears mutex in order to block function reentry
    modifier preventReentry() {
        require(!__reMutex);
        __reMutex = true;
        _;
        delete __reMutex;
    }

    // Blocks function entry if mutex is set
    modifier noReentry() {
        require(!__reMutex);
        _;
    }
}


contract ERC20Token
{
    using SafeMath for uint;

/* Constants */

    // none

/* State variable */

    /// @return The Total supply of tokens
    uint public totalSupply;

    /// @return Tokens owned by an address
    mapping (address => uint) balances;

    /// @return Tokens spendable by a thirdparty
    mapping (address => mapping (address => uint)) allowed;

/* Events */

    // Triggered when tokens are transferred.
    event Transfer(
        address indexed _from,
        address indexed _to,
        uint256 _amount);

    // Triggered whenever approve(address _spender, uint256 _amount) is called.
    event Approval(
        address indexed _owner,
        address indexed _spender,
        uint256 _amount);

/* Modifiers */

    // none

/* Functions */

    // Using an explicit getter allows for function overloading
    function balanceOf(address _addr)
        public
        view
        returns (uint)
    {
        return balances[_addr];
    }

    // Using an explicit getter allows for function overloading
    function allowance(address _owner, address _spender)
        public
        constant
        returns (uint)
    {
        return allowed[_owner][_spender];
    }

    // Send _value amount of tokens to address _to
    function transfer(address _to, uint256 _amount)
        public
        returns (bool)
    {
        return xfer(msg.sender, _to, _amount);
    }

    // Send _value amount of tokens from address _from to address _to
    function transferFrom(address _from, address _to, uint256 _amount)
        public
        returns (bool)
    {
        require(_amount <= allowed[_from][msg.sender]);

        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_amount);
        return xfer(_from, _to, _amount);
    }

    // Process a transfer internally.
    function xfer(address _from, address _to, uint _amount)
        internal
        returns (bool)
    {
        require(_amount <= balances[_from]);

        Transfer(_from, _to, _amount);

        // avoid wasting gas on 0 token transfers
        if(_amount == 0) return true;

        balances[_from] = balances[_from].sub(_amount);
        balances[_to]   = balances[_to].add(_amount);

        return true;
    }

    // Approves a third-party spender
    function approve(address _spender, uint256 _amount)
        public
        returns (bool)
    {
        allowed[msg.sender][_spender] = _amount;
        Approval(msg.sender, _spender, _amount);
        return true;
    }
}


/*-----------------------------------------------------------------------------\

## Conditional Entry Table

Functions must throw on F conditions

Renetry prevention is on all public mutating functions
Reentry mutex set in finalizeTS(), externalXfer(), refund()

|function                |<startDate |<endDate  |fundFailed  |fundRaised|tsSucceeded
|------------------------|:---------:|:--------:|:----------:|:--------:|:---------:|
|()                      |F          |T         |F           |T         |F          |
|abort()                 |T          |T         |T           |T         |F          |
|proxyPurchase()         |F          |T         |F           |T         |F          |
|finalizeTS()           |F          |F         |F           |T         |T          |
|refund()                |F          |F         |T           |F         |F          |
|refundFor()             |F          |F         |T           |F         |F          |
|transfer()              |F          |F         |F           |F         |T          |
|transferFrom()          |F          |F         |F           |F         |T          |
|transferToMany()        |F          |F         |F           |F         |T          |
|approve()               |F          |F         |F           |F         |T          |
|clearKyc()              |T          |T         |T           |T         |T          |
|releaseVested()         |F          |F         |F           |F         |now>release|
|changeOwner()           |T          |T         |T           |T         |T          |
|acceptOwnership()       |T          |T         |T           |T         |T          |
|transferExternalTokens()|T          |T         |T           |T         |T          |
|destroy()               |F          |F         |!__abortFuse|F         |F          |

\*----------------------------------------------------------------------------*/

contract Hut34TSAbstract
{
    /// @dev Logged upon receiving a deposit
    /// @param _from The address from which value has been recieved
    /// @param _value The value of ether received
    event Deposit(address indexed _from, uint _value);

    /// @dev Logged upon a withdrawal
    /// @param _from the address of the withdrawer
    /// @param _to Address to which value was sent
    /// @param _value The value in ether which was withdrawn
    event Withdrawal(address indexed _from, address indexed _to, uint _value);

    /// @dev Logged when new owner accepts ownership
    /// @param _from the old owner address
    /// @param _to the new owner address
    event ChangedOwner(address indexed _from, address indexed _to);

    /// @dev Logged when owner initiates a change of ownership
    /// @param _to the new owner address
    event ChangeOwnerTo(address indexed _to);

    /// @dev Logged when a funder exceeds the KYC limit
    /// @param _addr Address to set or clear KYC flag
    /// @param _kyc A boolean flag
    event Kyc(address indexed _addr, bool _kyc);

    /// @dev Logged when vested tokens are released back to HUT32_WALLET
    /// @param _releaseDate The official release date (even if released at
    /// later date)
    event VestingReleased(uint _releaseDate);

    /// @dev Logged if the contract is aborted
    event Aborted();

//
// Constants
//

    /// @dev The Hut34 vesting 'psudo-address' for transferring and releasing
    /// vested tokens to the Hut34 Wallet. The address is UTF8 encoding of the
    /// string and can only be accessed by the 'releaseVested()' function.
    /// @return `0x48757433342056657374696e6700000000000000`
    address public constant HUT34_VEST_ADDR = address(bytes20("Hut34 Vesting"));

//
// State Variables
//

    /// @dev This fuse blows upon calling abort() which forces a fail state
    /// @return the abort state. true == not aborted
    bool public __abortFuse = true;

    /// @dev Sets to true after the fund is swept to the fund wallet, allows
    /// token transfers and prevents abort()
    /// @return final success state of TS
    bool public tsSucceeded;

    /// @dev An address permissioned to enact owner restricted functions
    /// @return owner
    address public owner;

    /// @dev An address permissioned to take ownership of the contract
    /// @return new owner address
    address public newOwner;

    /// @dev A tally of total ether raised during the funding period
    /// @return Total ether raised during funding
    uint public etherRaised;

    /// @return Wholesale tokens available for sale
    uint public wholesaleLeft;

    /// @return Total ether refunded. Used to permision call to `destroy()`
    uint public refunded;

    /// @returns Date of next vesting release
    uint public nextReleaseDate;

    /// @return Ether paid by an address
    mapping (address => uint) public etherContributed;

    /// @returns KYC flag for an address
    mapping (address => bool) public mustKyc;

//
// Modifiers
//

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

//
// Function Abstracts
//

    /// @return `true` if MIN_FUNDS were raised
    function fundRaised() public view returns (bool);

    /// @return `true` if MIN_FUNDS were not raised before END_DATE or contract
    /// has been aborted
    function fundFailed() public view returns (bool);

    /// @return The current retail rate for token purchase
    function currentRate() public view returns (uint);

    /// @param _wei A value of ether in units of wei
    /// @return allTokens_ returnable tokens for the funding amount
    /// @return wholesaleToken_ Number of tokens purchased at wholesale rate
    function ethToTokens(uint _wei)
        public view returns (uint allTokens_, uint wholesaleTokens_);

    /// @notice Processes a token purchase for `_addr`
    /// @param _addr An address to purchase tokens
    /// @return Boolean success value
    /// @dev Requires <150,000 gas
    function proxyPurchase(address _addr) public payable returns (bool);

    /// @notice Finalize the TS and transfer funds
    /// @return Boolean success value
    function finalizeTS() public returns (bool);

    /// @notice Clear the KYC flags for an array of addresses to allow tokens
    /// transfers
    function clearKyc(address[] _addrs) public returns (bool);

    /// @notice Make bulk transfer of tokens to many addresses
    /// @param _addrs An array of recipient addresses
    /// @param _amounts An array of amounts to transfer to respective addresses
    /// @return Boolean success value
    function transferToMany(address[] _addrs, uint[] _amounts)
        public returns (bool);

    /// @notice Release vested tokens after a maturity date
    /// @return Boolean success value
    function releaseVested() public returns (bool);

    /// @notice Claim refund on failed TS
    /// @return Boolean success value
    function refund() public returns (bool);

    /// @notice Push refund for `_addr` from failed TS
    /// @param _addrs An array of address to refund
    /// @return Boolean success value
    function refundFor(address[] _addrs) public returns (bool);

    /// @notice Abort the token sale prior to finalizeTS()
    function abort() public returns (bool);

    /// @notice Salvage `_amount` tokens at `_kaddr` and send them to `_to`
    /// @param _kAddr An ERC20 contract address
    /// @param _to and address to send tokens
    /// @param _amount The number of tokens to transfer
    /// @return Boolean success value
    function transferExternalToken(address _kAddr, address _to, uint _amount)
        public returns (bool);
}


/*-----------------------------------------------------------------------------\

 Hut34TS implimentation

\*----------------------------------------------------------------------------*/

contract Hut34TS is
    ReentryProtected,
    ERC20Token,
    Hut34TSAbstract,
    Hut34Config
{
    using SafeMath for uint;

//
// Constants
//

    // Token fixed point for decimal places
    uint constant TOKEN = uint(10)**decimals;

    // Calculate vested tokens
    uint public constant VESTED_TOKENS =
            TOTAL_TOKENS * TOKEN * VESTED_PERCENT / 100;

    // Hut34 retains 50% of tokens (70% - 20% vested tokens)
    uint public constant RETAINED_TOKENS = TOKEN * TOTAL_TOKENS / 2;

    // Calculate end date
    uint public constant END_DATE = START_DATE + 35 days;

    // Divides `etherRaised` to calculate commision
    // etherRaised/6.66... == etherRaised * 1.5% / 100
    uint public constant COMMISSION_DIV = 67;

    // Developer commission wallet
    address public constant COMMISSION_WALLET =
        0x0065D506E475B5DBD76480bAFa57fe7C41c783af;

//
// Functions
//

    function Hut34TS()
        public
    {
        // Run sanity checks
        require(TOTAL_TOKENS != 0);
        require(OWNER != 0x0);
        require(HUT34_RETAIN != 0x0);
        require(HUT34_WALLET != 0x0);
        require(PRESOLD_TOKENS <= WHOLESALE_TOKENS);
        require(PRESOLD_TOKENS == 0 || PRESOLD_ADDRESS != 0x0);
        require(MIN_CAP != 0);
        require(START_DATE >= now);
        require(bytes(name).length != 0);
        require(bytes(symbol).length != 0);
        require(KYC_THRESHOLD != 0);
        require(RATE_DAY_0 >= RATE_DAY_1);
        require(RATE_DAY_1 >= RATE_DAY_7);
        require(RATE_DAY_7 >= RATE_DAY_14);
        require(RATE_DAY_14 >= RATE_DAY_21);
        require(RATE_DAY_21 >= RATE_DAY_28);

        owner = OWNER;
        totalSupply = TOTAL_TOKENS.mul(TOKEN);
        wholesaleLeft = WHOLESALE_TOKENS.mul(TOKEN);
        uint presold = PRESOLD_TOKENS.mul(TOKEN);
        wholesaleLeft = wholesaleLeft.sub(presold);

        // Presale raise is appoximate given it was conducted in Fiat.
        etherRaised = PRESALE_ETH_RAISE;

        // Mint the total supply into Hut34 token holding address
        balances[HUT34_RETAIN] = totalSupply;
        Transfer(0x0, HUT34_RETAIN, totalSupply);

        // Transfer vested tokens from holding wallet to vesting pseudo-address
        balances[HUT34_RETAIN] = balances[HUT34_RETAIN].sub(VESTED_TOKENS);
        balances[HUT34_VEST_ADDR] = balances[HUT34_VEST_ADDR].add(VESTED_TOKENS);
        Transfer(HUT34_RETAIN, HUT34_VEST_ADDR, VESTED_TOKENS);

        // Transfer presold tokens to holding address;
        balances[HUT34_RETAIN] = balances[HUT34_RETAIN].sub(presold);
        balances[PRESOLD_ADDRESS] = balances[PRESOLD_ADDRESS].add(presold);
        Transfer(HUT34_RETAIN, PRESOLD_ADDRESS, presold);
    }

    // Default function. Accepts payments during funding period
    function ()
        public
        payable
    {
        // Pass through to purchasing function. Will throw on failed or
        // successful TS
        proxyPurchase(msg.sender);
    }

//
// Getters
//

    // TS fails if aborted or minimum funds are not raised by the end date
    function fundFailed() public view returns (bool)
    {
        return !__abortFuse
            || (now > END_DATE && etherRaised < MIN_CAP);
    }

    // Funding succeeds if not aborted, minimum funds are raised before end date
    function fundRaised() public view returns (bool)
    {
        return !fundFailed()
            && etherRaised >= MIN_CAP
            && now > START_DATE;
    }

    // Returns wholesale value in wei
    function wholeSaleValueLeft() public view returns (uint)
    {
        return wholesaleLeft / RATE_WHOLESALE;
    }

    function currentRate()
        public
        view
        returns (uint)
    {
        return
            fundFailed() ? 0 :
            tsSucceeded ? 0 :
            now < START_DATE ? 0 :
            now < START_DATE + 1 days ? RATE_DAY_0 :
            now < START_DATE + 7 days ? RATE_DAY_1 :
            now < START_DATE + 14 days ? RATE_DAY_7 :
            now < START_DATE + 21 days ? RATE_DAY_14 :
            now < START_DATE + 28 days ? RATE_DAY_21 :
            now < END_DATE ? RATE_DAY_28 :
            0;
    }

    // Calculates the sale and wholesale portion of tokens for a given value
    // of wei at the time of calling.
    function ethToTokens(uint _wei)
        public
        view
        returns (uint allTokens_, uint wholesaleTokens_)
    {
        // Get wholesale portion of ether and tokens
        uint wsValueLeft = wholeSaleValueLeft();
        uint wholesaleSpend =
                fundFailed() ? 0 :
                tsSucceeded ? 0 :
                now < START_DATE ? 0 :
                now > END_DATE ? 0 :
                // No wholesale purchse
                _wei < WHOLESALE_THRESHOLD ? 0 :
                // Total wholesale purchase
                _wei < wsValueLeft ?  _wei :
                // over funded for remaining wholesale tokens
                wsValueLeft;

        wholesaleTokens_ = wholesaleSpend
                .mul(RATE_WHOLESALE)
                .mul(TOKEN)
                .div(1 ether);

        // Remaining wei used to purchase retail tokens
        _wei = _wei.sub(wholesaleSpend);

        // Get retail rate
        uint saleRate = currentRate();

        allTokens_ = _wei
                .mul(saleRate)
                .mul(TOKEN)
                .div(1 ether)
                .add(wholesaleTokens_);
    }

//
// TS functions
//

    // The fundraising can be aborted any time before `finaliseTS()` is called.
    // This will force a fail state and allow refunds to be collected.
    // The owner can abort or anyone else if a successful fund has not been
    // finalised before 7 days after the end date.
    function abort()
        public
        noReentry
        returns (bool)
    {
        require(!tsSucceeded);
        require(msg.sender == owner || now > END_DATE  + 14 days);
        delete __abortFuse;
        Aborted();
        return true;
    }

    // General addresses can purchase tokens during funding
    function proxyPurchase(address _addr)
        public
        payable
        noReentry
        returns (bool)
    {
        require(!fundFailed());
        require(!tsSucceeded);
        require(now > START_DATE);
        require(now <= END_DATE);
        require(msg.value > 0);

        // Log ether deposit
        Deposit (_addr, msg.value);

        // Get ether to token conversion
        uint tokens;
        // Portion of tokens sold at wholesale rate
        uint wholesaleTokens;

        (tokens, wholesaleTokens) = ethToTokens(msg.value);

        // Block any failed token creation
        require(tokens > 0);

        // Prevent over subscribing
        require(balances[HUT34_RETAIN] - tokens >= RETAINED_TOKENS);

        // Adjust wholesale tokens left for sale
        if (wholesaleTokens != 0) {
            wholesaleLeft = wholesaleLeft.sub(wholesaleTokens);
        }

        // transfer tokens from fund wallet
        balances[HUT34_RETAIN] = balances[HUT34_RETAIN].sub(tokens);
        balances[_addr] = balances[_addr].add(tokens);
        Transfer(HUT34_RETAIN, _addr, tokens);

        // Update funds raised
        etherRaised = etherRaised.add(msg.value);

        // Update holder payments
        etherContributed[_addr] = etherContributed[_addr].add(msg.value);

        // Check KYC requirement
        if(etherContributed[_addr] >= KYC_THRESHOLD && !mustKyc[_addr]) {
            mustKyc[_addr] = true;
            Kyc(_addr, true);
        }

        return true;
    }

    // Owner can sweep a successful funding to the fundWallet.
    // Can be called repeatedly to recover errant ether which may have been
    // `selfdestructed` to the contract
    // Contract can be aborted up until this returns `true`
    function finalizeTS()
        public
        onlyOwner
        preventReentry()
        returns (bool)
    {
        // Must have reached minimum cap
        require(fundRaised());

        // Set first vesting date (only once as this function can be called again)
        if(!tsSucceeded) {
            nextReleaseDate = now + VESTING_PERIOD;
        }

        // Set success flag;
        tsSucceeded = true;

        // Transfer % Developer commission
        uint devCommission = calcCommission();
        Withdrawal(this, COMMISSION_WALLET, devCommission);
        COMMISSION_WALLET.transfer(devCommission);

        // Remaining % to the fund wallet
        Withdrawal(this, HUT34_WALLET, this.balance);
        HUT34_WALLET.transfer(this.balance);
        return true;
    }

    function clearKyc(address[] _addrs)
        public
        noReentry
        onlyOwner
        returns (bool)
    {
        uint len = _addrs.length;
        for(uint i; i < len; i++) {
            delete mustKyc[_addrs[i]];
            Kyc(_addrs[i], false);
        }
        return true;
    }

    // Releases vested tokens back to Hut34 wallet
    function releaseVested()
        public
        returns (bool)
    {
        require(now > nextReleaseDate);
        VestingReleased(nextReleaseDate);
        nextReleaseDate = nextReleaseDate.add(VESTING_PERIOD);
        return xfer(HUT34_VEST_ADDR, HUT34_RETAIN, VESTED_TOKENS / 4);
    }

    // Direct refund to caller
    function refund()
        public
        returns (bool)
    {
        address[] memory addrs = new address[](1);
        addrs[0] = msg.sender;
        return refundFor(addrs);
    }

    // Bulk refunds can be pushed from a failed TS
    function refundFor(address[] _addrs)
        public
        preventReentry()
        returns (bool)
    {
        require(fundFailed());
        uint i;
        uint len = _addrs.length;
        uint value;
        uint tokens;
        address addr;

        for (i; i < len; i++) {
            addr = _addrs[i];
            value = etherContributed[addr];
            tokens = balances[addr];
            if (tokens > 0) {
                // Return tokens
                // transfer tokens from fund wallet
                balances[HUT34_RETAIN] = balances[HUT34_RETAIN].add(tokens);
                delete balances[addr];
                Transfer(addr, HUT34_RETAIN, tokens);
            }

            if (value > 0) {
                // Refund ether contribution
                delete etherContributed[addr];
                delete mustKyc[addr];
                refunded = refunded.add(value);
                Withdrawal(this, addr, value);
                addr.transfer(value);
            }
        }
        return true;
    }

//
// ERC20 additional and overloaded functions
//

    // Allows a sender to transfer tokens to an array of recipients
    function transferToMany(address[] _addrs, uint[] _amounts)
        public
        noReentry
        returns (bool)
    {
        require(_addrs.length == _amounts.length);
        uint len = _addrs.length;
        for(uint i = 0; i < len; i++) {
            xfer(msg.sender, _addrs[i], _amounts[i]);
        }
        return true;
    }

    // Overload to check TS success and KYC flags.
    function xfer(address _from, address _to, uint _amount)
        internal
        noReentry
        returns (bool)
    {
        require(tsSucceeded);
        require(!mustKyc[_from]);
        super.xfer(_from, _to, _amount);
        return true;
    }

    // Overload to require TS success
    function approve(address _spender, uint _amount)
        public
        noReentry
        returns (bool)
    {
        // TS must be successful
        require(tsSucceeded);
        super.approve(_spender, _amount);
        return true;
    }

//
// Contract management functions
//

    // Initiate a change of owner to `_owner`
    function changeOwner(address _owner)
        public
        onlyOwner
        returns (bool)
    {
        ChangeOwnerTo(_owner);
        newOwner = _owner;
        return true;
    }

    // Finalise change of ownership to newOwner
    function acceptOwnership()
        public
        returns (bool)
    {
        require(msg.sender == newOwner);
        ChangedOwner(owner, msg.sender);
        owner = newOwner;
        delete newOwner;
        return true;
    }

    // This will selfdestruct the contract on the condittion all have been
    // processed.
    function destroy()
        public
        noReentry
        onlyOwner
    {
        require(!__abortFuse);
        require(refunded == (etherRaised - PRESALE_ETH_RAISE));
        // Log burned tokens for complete ledger accounting on archival nodes
        Transfer(HUT34_RETAIN, 0x0, balances[HUT34_RETAIN]);
        Transfer(HUT34_VEST_ADDR, 0x0, VESTED_TOKENS);
        Transfer(PRESOLD_ADDRESS, 0x0, PRESOLD_TOKENS);
        // Garbage collect mapped state
        delete balances[HUT34_RETAIN];
        delete balances[PRESOLD_ADDRESS];
        selfdestruct(owner);
    }

    // Owner can salvage ERC20 tokens that may have been sent to the account
    function transferExternalToken(address _kAddr, address _to, uint _amount)
        public
        onlyOwner
        preventReentry
        returns (bool)
    {
        require(ERC20Token(_kAddr).transfer(_to, _amount));
        return true;
    }

    // Calculate commission on prefunded and raised ether.
    function calcCommission()
        internal
        view
        returns(uint)
    {
        uint commission = (this.balance + PRESALE_ETH_RAISE) / COMMISSION_DIV;
        // Edge case that prefund causes commission to be greater than balance
        return commission <= this.balance ? commission : this.balance;
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[],"name":"VESTING_PERIOD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tsSucceeded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nextReleaseDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOTAL_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"HUT34_VEST_ADDR","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"WHOLESALE_TOKENS","outputs":[{"name":"","type":"uint256"}],"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":"refunded","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COMMISSION_DIV","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COMMISSION_WALLET","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"releaseVested","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PRESOLD_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"KYC_THRESHOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_kAddr","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferExternalToken","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":true,"inputs":[],"name":"RATE_DAY_1","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"abort","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wholesaleLeft","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"START_DATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"proxyPurchase","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"END_DATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PRESALE_ETH_RAISE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fundFailed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"__abortFuse","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RATE_DAY_21","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addrs","type":"address[]"},{"name":"_amounts","type":"uint256[]"}],"name":"transferToMany","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"RATE_DAY_28","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RATE_DAY_7","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addrs","type":"address[]"}],"name":"refundFor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"RATE_DAY_14","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalizeTS","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addrs","type":"address[]"}],"name":"clearKyc","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PRESOLD_ADDRESS","outputs":[{"name":"","type":"address"}],"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":"HUT34_WALLET","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_wei","type":"uint256"}],"name":"ethToTokens","outputs":[{"name":"allTokens_","type":"uint256"},{"name":"wholesaleTokens_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RATE_WHOLESALE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"changeOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"etherContributed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"RATE_DAY_0","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VESTED_PERCENT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RETAINED_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fundRaised","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"etherRaised","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":true,"inputs":[{"name":"","type":"address"}],"name":"mustKyc","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wholeSaleValueLeft","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":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VESTED_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"WHOLESALE_THRESHOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"HUT34_RETAIN","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"}],"name":"ChangedOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"}],"name":"ChangeOwnerTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_addr","type":"address"},{"indexed":false,"name":"_kyc","type":"bool"}],"name":"Kyc","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_releaseDate","type":"uint256"}],"name":"VestingReleased","type":"event"},{"anonymous":false,"inputs":[],"name":"Aborted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"Approval","type":"event"}]

60606040526001600460006101000a81548160ff02191690831515021790555034156200002b57600080fd5b6000806305f5e100141515156200004157600080fd5b600073da3780cff2ae3a59ae16ec1734deec77a7fd8db273ffffffffffffffffffffffffffffffffffffffff16141515156200007c57600080fd5b6000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1614151515620000b757600080fd5b600073a70d04dc4a64960c40cd2ed2cde36d76ca4edfab73ffffffffffffffffffffffffffffffffffffffff1614151515620000f257600080fd5b62bebc2062224764111515156200010857600080fd5b60006222476414806200014657506000736bf708ef2c1fdce3603c04ce9547aa6e134093b673ffffffffffffffffffffffffffffffffffffffff1614155b15156200015257600080fd5b600068a2a15d09519be00000141515156200016c57600080fd5b426359fa6000101515156200018057600080fd5b60006040805190810160405280600d81526020017f487574333420456e74726f7079000000000000000000000000000000000000008152505114151515620001c757600080fd5b60006040805190810160405280600381526020017f454e54000000000000000000000000000000000000000000000000000000000081525051141515156200020e57600080fd5b6000680821ab0d4414980000141515156200022857600080fd5b61028c6102ee101515156200023c57600080fd5b61024c61028c101515156200025057600080fd5b61022161024c101515156200026457600080fd5b610205610221101515156200027857600080fd5b6101f4610205101515156200028c57600080fd5b73da3780cff2ae3a59ae16ec1734deec77a7fd8db2600460026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200030f601260ff16600a0a6305f5e100620009726401000000000262003500179091906401000000009004565b60018190555062000342601260ff16600a0a62bebc20620009726401000000000262003500179091906401000000009004565b60078190555062000375601260ff16600a0a62224764620009726401000000000262003500179091906401000000009004565b90506200039c81600754620009a364010000000002620032bc179091906401000000009004565b60078190555068982af34be0697c000060068190555060015460026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6001546040518082815260200191505060405180910390a36200050560646014601260ff16600a0a6305f5e10002028115156200049357fe5b0460026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620009a364010000000002620032bc179091906401000000009004565b60026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506200060b60646014601260ff16600a0a6305f5e10002028115156200057d57fe5b04600260007f48757433342056657374696e67000000000000000000000000000000000000006c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620009bd64010000000002620032d5179091906401000000009004565b600260007f48757433342056657374696e67000000000000000000000000000000000000006c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f48757433342056657374696e67000000000000000000000000000000000000006c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60646014601260ff16600a0a6305f5e10002028115156200072e57fe5b046040518082815260200191505060405180910390a3620007ba8160026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620009a364010000000002620032bc179091906401000000009004565b60026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620008878160026000736bf708ef2c1fdce3603c04ce9547aa6e134093b673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620009bd64010000000002620032d5179091906401000000009004565b60026000736bf708ef2c1fdce3603c04ce9547aa6e134093b673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550736bf708ef2c1fdce3603c04ce9547aa6e134093b673ffffffffffffffffffffffffffffffffffffffff16733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350620009d7565b6000818302905060008314806200099457508183828115156200099157fe5b04145b15156200099d57fe5b92915050565b60008183039050828111151515620009b757fe5b92915050565b60008183019050828110151515620009d157fe5b92915050565b61378d80620009e76000396000f300606060405236156102e9576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630197d972146102f557806306fdde031461031e5780630739cd26146103ac578063095ea7b3146103d95780630a91cad0146104335780630b7abf771461045c5780630d61a4ff146104855780630ddc4a94146104da578063117803e31461050357806312f5395014610558578063168c81201461058157806317c73ff0146105aa57806318160ddd146105ff5780631f800e8e1461062857806323b872dd14610655578063289cf1e2146106ce5780632d133eee146106f75780632fbd243214610720578063313ce5671461079957806334e41bbf146107c857806335a063b4146107f157806336df05bc1461081e578063372c6533146108475780634a5dddd214610870578063545599ff146108b6578063590e1ae3146108df5780636a745ce91461090c5780636e62de19146109355780636eabcd69146109625780636f95dd0b1461098f57806370a08231146109b857806379ba509714610a055780637c33ebfd14610a325780637e36edce14610ae4578063801db9cc14610b0d5780638121ddd714610b3657806383197ef014610b5f578063838f516514610b745780638717866814610be6578063874fe37014610c0f57806388968bc314610c3c5780638da5cb5b14610cae578063913dd84614610d0357806395d89b4114610d58578063979d6dc714610de6578063a4c8932214610e3b578063a5d68bfd14610e79578063a6f9dae114610ea2578063a82776dd14610ef3578063a9059cbb14610f40578063ba99d1a614610f9a578063bf6888c814610fc3578063c164091314610fec578063c71c0b4014611015578063cd72ab6914611042578063d4ee1d901461106b578063d5e9abfd146110c0578063d735fa2514611111578063dd62ed3e1461113a578063df4e79fa146111a6578063e7a95a7f146111cf578063f9f8bdb7146111f8578063ff41f5cc14611221575b6102f233611276565b50005b341561030057600080fd5b6103086117e9565b6040518082815260200191505060405180910390f35b341561032957600080fd5b6103316117f0565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610371578082015181840152602081019050610356565b50505050905090810190601f16801561039e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103b757600080fd5b6103bf611829565b604051808215151515815260200191505060405180910390f35b34156103e457600080fd5b610419600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061183c565b604051808215151515815260200191505060405180910390f35b341561043e57600080fd5b610446611889565b6040518082815260200191505060405180910390f35b341561046757600080fd5b61046f61188f565b6040518082815260200191505060405180910390f35b341561049057600080fd5b610498611897565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104e557600080fd5b6104ed6118cb565b6040518082815260200191505060405180910390f35b341561050e57600080fd5b6105166118d2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561056357600080fd5b61056b6118ea565b6040518082815260200191505060405180910390f35b341561058c57600080fd5b6105946118f0565b6040518082815260200191505060405180910390f35b34156105b557600080fd5b6105bd6118f5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561060a57600080fd5b61061261190c565b6040518082815260200191505060405180910390f35b341561063357600080fd5b61063b611912565b604051808215151515815260200191505060405180910390f35b341561066057600080fd5b6106b4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506119f7565b604051808215151515815260200191505060405180910390f35b34156106d957600080fd5b6106e1611ba7565b6040518082815260200191505060405180910390f35b341561070257600080fd5b61070a611bae565b6040518082815260200191505060405180910390f35b341561072b57600080fd5b61077f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611bbb565b604051808215151515815260200191505060405180910390f35b34156107a457600080fd5b6107ac611d3b565b604051808260ff1660ff16815260200191505060405180910390f35b34156107d357600080fd5b6107db611d40565b6040518082815260200191505060405180910390f35b34156107fc57600080fd5b610804611d46565b604051808215151515815260200191505060405180910390f35b341561082957600080fd5b610831611e38565b6040518082815260200191505060405180910390f35b341561085257600080fd5b61085a611e3e565b6040518082815260200191505060405180910390f35b61089c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611276565b604051808215151515815260200191505060405180910390f35b34156108c157600080fd5b6108c9611e46565b6040518082815260200191505060405180910390f35b34156108ea57600080fd5b6108f2611e53565b604051808215151515815260200191505060405180910390f35b341561091757600080fd5b61091f611eda565b6040518082815260200191505060405180910390f35b341561094057600080fd5b610948611ee7565b604051808215151515815260200191505060405180910390f35b341561096d57600080fd5b610975611f28565b604051808215151515815260200191505060405180910390f35b341561099a57600080fd5b6109a2611f3b565b6040518082815260200191505060405180910390f35b34156109c357600080fd5b6109ef600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f41565b6040518082815260200191505060405180910390f35b3415610a1057600080fd5b610a18611f8a565b604051808215151515815260200191505060405180910390f35b3415610a3d57600080fd5b610aca600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919050506120f3565b604051808215151515815260200191505060405180910390f35b3415610aef57600080fd5b610af7612187565b6040518082815260200191505060405180910390f35b3415610b1857600080fd5b610b2061218d565b6040518082815260200191505060405180910390f35b3415610b4157600080fd5b610b4961219a565b6040518082815260200191505060405180910390f35b3415610b6a57600080fd5b610b726121a0565b005b3415610b7f57600080fd5b610bcc6004808035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919050506124f3565b604051808215151515815260200191505060405180910390f35b3415610bf157600080fd5b610bf96128fa565b6040518082815260200191505060405180910390f35b3415610c1a57600080fd5b610c22612900565b604051808215151515815260200191505060405180910390f35b3415610c4757600080fd5b610c94600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050612bce565b604051808215151515815260200191505060405180910390f35b3415610cb957600080fd5b610cc1612d3f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d0e57600080fd5b610d16612d65565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d6357600080fd5b610d6b612d7d565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dab578082015181840152602081019050610d90565b50505050905090810190601f168015610dd85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610df157600080fd5b610df9612db6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610e4657600080fd5b610e5c6004808035906020019091905050612dce565b604051808381526020018281526020019250505060405180910390f35b3415610e8457600080fd5b610e8c612f2f565b6040518082815260200191505060405180910390f35b3415610ead57600080fd5b610ed9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612f35565b604051808215151515815260200191505060405180910390f35b3415610efe57600080fd5b610f2a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613020565b6040518082815260200191505060405180910390f35b3415610f4b57600080fd5b610f80600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050613038565b604051808215151515815260200191505060405180910390f35b3415610fa557600080fd5b610fad61304d565b6040518082815260200191505060405180910390f35b3415610fce57600080fd5b610fd6613053565b6040518082815260200191505060405180910390f35b3415610ff757600080fd5b610fff613058565b6040518082815260200191505060405180910390f35b341561102057600080fd5b611028613075565b604051808215151515815260200191505060405180910390f35b341561104d57600080fd5b6110556130ab565b6040518082815260200191505060405180910390f35b341561107657600080fd5b61107e6130b1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156110cb57600080fd5b6110f7600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506130d7565b604051808215151515815260200191505060405180910390f35b341561111c57600080fd5b6111246130f7565b6040518082815260200191505060405180910390f35b341561114557600080fd5b611190600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061310e565b6040518082815260200191505060405180910390f35b34156111b157600080fd5b6111b9613195565b6040518082815260200191505060405180910390f35b34156111da57600080fd5b6111e26131b5565b6040518082815260200191505060405180910390f35b341561120357600080fd5b61120b6131c2565b6040518082815260200191505060405180910390f35b341561122c57600080fd5b6112346132a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008060008060009054906101000a900460ff1615151561129657600080fd5b61129e611ee7565b1515156112aa57600080fd5b600460019054906101000a900460ff161515156112c657600080fd5b6359fa6000421115156112d857600080fd5b622e24806359fa60000142111515156112f057600080fd5b6000341115156112ff57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a261135634612dce565b809250819350505060008211151561136d57600080fd5b60026305f5e100601260ff16600a0a0281151561138657fe5b048260026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403101515156113ea57600080fd5b60008114151561141057611409816007546132bc90919063ffffffff16565b6007819055505b6114768260026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132bc90919063ffffffff16565b60026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061151f82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132d590919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36115f0346006546132d590919063ffffffff16565b60068190555061164834600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132d590919063ffffffff16565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550680821ab0d4414980000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015801561172d5750600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156117de576001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff167f86df4d319dc8c05e5ca005438b3e8a4521a6ddfa127e5cfd589d8c3ead3935bc6001604051808215151515815260200191505060405180910390a25b600192505050919050565b62eff10081565b6040805190810160405280600d81526020017f487574333420456e74726f70790000000000000000000000000000000000000081525081565b600460019054906101000a900460ff1681565b60008060009054906101000a900460ff1615151561185957600080fd5b600460019054906101000a900460ff16151561187457600080fd5b61187e83836132ee565b506001905092915050565b60095481565b6305f5e10081565b7f48757433342056657374696e67000000000000000000000000000000000000006c01000000000000000000000000900481565b62bebc2081565b73da3780cff2ae3a59ae16ec1734deec77a7fd8db281565b60085481565b604381565b7265d506e475b5dbd76480bafa57fe7c41c783af81565b60015481565b60006009544211151561192457600080fd5b7f87281fabebb3053dede10cd89db97c95421a1fb9385cd5d0bb6cf8db8dd11ae76009546040518082815260200191505060405180910390a161197562eff1006009546132d590919063ffffffff16565b6009819055506119f27f48757433342056657374696e67000000000000000000000000000000000000006c010000000000000000000000009004733135f4aca3c1ad4758981500f8db20ebdc5a1cab600460646014601260ff16600a0a6305f5e10002028115156119e257fe5b048115156119ec57fe5b046133e0565b905090565b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515611a8457600080fd5b611b1382600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132bc90919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b9e8484846133e0565b90509392505050565b6222476481565b680821ab0d441498000081565b6000600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c1957600080fd5b6000809054906101000a900460ff16151515611c3457600080fd5b60016000806101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611cf957600080fd5b6102c65a03f11515611d0a57600080fd5b505050604051805190501515611d1f57600080fd5b600190506000806101000a81549060ff02191690559392505050565b601281565b61028c81565b60008060009054906101000a900460ff16151515611d6357600080fd5b600460019054906101000a900460ff16151515611d7f57600080fd5b600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611de8575062127500622e24806359fa6000010142115b1515611df357600080fd5b600460006101000a81549060ff02191690557f72c874aeff0b183a56e2b79c71b46e1aed4dee5e09862134b8821ba2fddbf8bf60405160405180910390a16001905090565b60075481565b6359fa600081565b622e24806359fa60000181565b6000611e5d61374d565b6001604051805910611e6c5750595b9080825280602002602001820160405250905033816000815181101515611e8f57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611ed4816124f3565b91505090565b68982af34be0697c000081565b6000600460009054906101000a900460ff161580611f235750622e24806359fa60000142118015611f22575068a2a15d09519be00000600654105b5b905090565b600460009054906101000a900460ff1681565b61020581565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fe857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f2748503f8f31d8071821d1d5144384ba6a465036cda17fa1629a8a2509ccee0e60405160405180910390a3600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001905090565b60008060008060009054906101000a900460ff1615151561211357600080fd5b8351855114151561212357600080fd5b84519150600090505b8181101561217b5761216d33868381518110151561214657fe5b90602001906020020151868481518110151561215e57fe5b906020019060200201516133e0565b50808060010191505061212c565b60019250505092915050565b6101f481565b68a2a15d09519be0000081565b61024c81565b6000809054906101000a900460ff161515156121bb57600080fd5b600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561221757600080fd5b600460009054906101000a900460ff1615151561223357600080fd5b68982af34be0697c00006006540360085414151561225057600080fd5b6000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a360007f48757433342056657374696e67000000000000000000000000000000000000006c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60646014601260ff16600a0a6305f5e100020281151561238d57fe5b046040518082815260200191505060405180910390a36000736bf708ef2c1fdce3603c04ce9547aa6e134093b673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef622247646040518082815260200191505060405180910390a360026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905560026000736bf708ef2c1fdce3603c04ce9547aa6e134093b673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b6000806000806000806000809054906101000a900460ff1615151561251757600080fd5b60016000806101000a81548160ff021916908315150217905550612539611ee7565b151561254457600080fd5b865193505b838510156128db57868581518110151561255f57fe5b906020019060200201519050600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915060008211156127725761265e8260026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132d590919063ffffffff16565b60026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35b60008311156128ce57600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055612822836008546132d590919063ffffffff16565b6008819055508073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398856040518082815260200191505060405180910390a38073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015156128cd57600080fd5b5b8480600101955050612549565b600195506000806101000a81549060ff02191690555050505050919050565b61022181565b600080600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561295f57600080fd5b6000809054906101000a900460ff1615151561297a57600080fd5b60016000806101000a81548160ff02191690831515021790555061299c613075565b15156129a757600080fd5b600460019054906101000a900460ff1615156129ca5762eff10042016009819055505b6001600460016101000a81548160ff0219169083151502179055506129ed613488565b90507265d506e475b5dbd76480bafa57fe7c41c783af73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398836040518082815260200191505060405180910390a37265d506e475b5dbd76480bafa57fe7c41c783af73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515612aba57600080fd5b73a70d04dc4a64960c40cd2ed2cde36d76ca4edfab73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b63983073ffffffffffffffffffffffffffffffffffffffff16316040518082815260200191505060405180910390a373a70d04dc4a64960c40cd2ed2cde36d76ca4edfab73ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501515612bb557600080fd5b600191506000806101000a81549060ff02191690555090565b60008060008060009054906101000a900460ff16151515612bee57600080fd5b600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c4a57600080fd5b835191505b81811015612d3457600b60008583815181101515612c6957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690558381815181101515612ccb57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff167f86df4d319dc8c05e5ca005438b3e8a4521a6ddfa127e5cfd589d8c3ead3935bc6000604051808215151515815260200191505060405180910390a28080600101915050612c4f565b600192505050919050565b600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b736bf708ef2c1fdce3603c04ce9547aa6e134093b681565b6040805190810160405280600381526020017f454e54000000000000000000000000000000000000000000000000000000000081525081565b73a70d04dc4a64960c40cd2ed2cde36d76ca4edfab81565b6000806000806000612dde6130f7565b9250612de8611ee7565b612e5f57600460019054906101000a900460ff16612e57576359fa60004210612e4f57622e24806359fa6000014211612e4757680821ab0d44149800008610612e3f57828610612e385782612e3a565b855b612e42565b60005b612e4a565b60005b612e52565b60005b612e5a565b60005b612e62565b60005b9150612eac670de0b6b3a7640000612e9e601260ff16600a0a612e906103e88761350090919063ffffffff16565b61350090919063ffffffff16565b61352e90919063ffffffff16565b9350612ec182876132bc90919063ffffffff16565b9550612ecb6131c2565b9050612f2584612f17670de0b6b3a7640000612f09601260ff16600a0a612efb878d61350090919063ffffffff16565b61350090919063ffffffff16565b61352e90919063ffffffff16565b6132d590919063ffffffff16565b9450505050915091565b6103e881565b6000600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612f9357600080fd5b8173ffffffffffffffffffffffffffffffffffffffff167fbc48fdaddfcfb54d36a0ac4d7e52f46cdf854784b9c0978d385a35e8383262d460405160405180910390a281600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b600a6020528060005260406000206000915090505481565b60006130453384846133e0565b905092915050565b6102ee81565b601481565b60026305f5e100601260ff16600a0a0281151561307157fe5b0481565b600061307f611ee7565b158015613097575068a2a15d09519be0000060065410155b80156130a657506359fa600042115b905090565b60065481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60006103e860075481151561310857fe5b04905090565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60646014601260ff16600a0a6305f5e10002028115156131b157fe5b0481565b680821ab0d441498000081565b60006131cc611ee7565b61329c57600460019054906101000a900460ff16613294576359fa6000421061328c57620151806359fa60000142106132835762093a806359fa600001421061327a57621275006359fa600001421061327157621baf806359fa6000014210613268576224ea006359fa600001421061325f57622e24806359fa600001421061325657600061325a565b6101f45b613263565b6102055b61326c565b6102215b613275565b61024c5b61327e565b61028c5b613287565b6102ee5b61328f565b60005b613297565b60005b61329f565b60005b905090565b733135f4aca3c1ad4758981500f8db20ebdc5a1cab81565b600081830390508281111515156132cf57fe5b92915050565b600081830190508281101515156132e857fe5b92915050565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60008060009054906101000a900460ff161515156133fd57600080fd5b600460019054906101000a900460ff16151561341857600080fd5b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561347157600080fd5b61347c848484613550565b50600190509392505050565b600080604368982af34be0697c00003073ffffffffffffffffffffffffffffffffffffffff1631018115156134b957fe5b0490503073ffffffffffffffffffffffffffffffffffffffff16318111156134f8573073ffffffffffffffffffffffffffffffffffffffff16316134fa565b805b91505090565b600081830290506000831480613520575081838281151561351d57fe5b04145b151561352857fe5b92915050565b600080821415151561353c57fe5b818381151561354757fe5b04905092915050565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156135a057600080fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360008214156136175760019050613746565b61366982600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132bc90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136fe82600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132d590919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600190505b9392505050565b6020604051908101604052806000815250905600a165627a7a7230582007db8adb2c78cab9239e31a5e8c86280e5828125d6954cc7431c1a7399950bfe0029

Deployed Bytecode

0x606060405236156102e9576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630197d972146102f557806306fdde031461031e5780630739cd26146103ac578063095ea7b3146103d95780630a91cad0146104335780630b7abf771461045c5780630d61a4ff146104855780630ddc4a94146104da578063117803e31461050357806312f5395014610558578063168c81201461058157806317c73ff0146105aa57806318160ddd146105ff5780631f800e8e1461062857806323b872dd14610655578063289cf1e2146106ce5780632d133eee146106f75780632fbd243214610720578063313ce5671461079957806334e41bbf146107c857806335a063b4146107f157806336df05bc1461081e578063372c6533146108475780634a5dddd214610870578063545599ff146108b6578063590e1ae3146108df5780636a745ce91461090c5780636e62de19146109355780636eabcd69146109625780636f95dd0b1461098f57806370a08231146109b857806379ba509714610a055780637c33ebfd14610a325780637e36edce14610ae4578063801db9cc14610b0d5780638121ddd714610b3657806383197ef014610b5f578063838f516514610b745780638717866814610be6578063874fe37014610c0f57806388968bc314610c3c5780638da5cb5b14610cae578063913dd84614610d0357806395d89b4114610d58578063979d6dc714610de6578063a4c8932214610e3b578063a5d68bfd14610e79578063a6f9dae114610ea2578063a82776dd14610ef3578063a9059cbb14610f40578063ba99d1a614610f9a578063bf6888c814610fc3578063c164091314610fec578063c71c0b4014611015578063cd72ab6914611042578063d4ee1d901461106b578063d5e9abfd146110c0578063d735fa2514611111578063dd62ed3e1461113a578063df4e79fa146111a6578063e7a95a7f146111cf578063f9f8bdb7146111f8578063ff41f5cc14611221575b6102f233611276565b50005b341561030057600080fd5b6103086117e9565b6040518082815260200191505060405180910390f35b341561032957600080fd5b6103316117f0565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610371578082015181840152602081019050610356565b50505050905090810190601f16801561039e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103b757600080fd5b6103bf611829565b604051808215151515815260200191505060405180910390f35b34156103e457600080fd5b610419600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061183c565b604051808215151515815260200191505060405180910390f35b341561043e57600080fd5b610446611889565b6040518082815260200191505060405180910390f35b341561046757600080fd5b61046f61188f565b6040518082815260200191505060405180910390f35b341561049057600080fd5b610498611897565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104e557600080fd5b6104ed6118cb565b6040518082815260200191505060405180910390f35b341561050e57600080fd5b6105166118d2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561056357600080fd5b61056b6118ea565b6040518082815260200191505060405180910390f35b341561058c57600080fd5b6105946118f0565b6040518082815260200191505060405180910390f35b34156105b557600080fd5b6105bd6118f5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561060a57600080fd5b61061261190c565b6040518082815260200191505060405180910390f35b341561063357600080fd5b61063b611912565b604051808215151515815260200191505060405180910390f35b341561066057600080fd5b6106b4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506119f7565b604051808215151515815260200191505060405180910390f35b34156106d957600080fd5b6106e1611ba7565b6040518082815260200191505060405180910390f35b341561070257600080fd5b61070a611bae565b6040518082815260200191505060405180910390f35b341561072b57600080fd5b61077f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611bbb565b604051808215151515815260200191505060405180910390f35b34156107a457600080fd5b6107ac611d3b565b604051808260ff1660ff16815260200191505060405180910390f35b34156107d357600080fd5b6107db611d40565b6040518082815260200191505060405180910390f35b34156107fc57600080fd5b610804611d46565b604051808215151515815260200191505060405180910390f35b341561082957600080fd5b610831611e38565b6040518082815260200191505060405180910390f35b341561085257600080fd5b61085a611e3e565b6040518082815260200191505060405180910390f35b61089c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611276565b604051808215151515815260200191505060405180910390f35b34156108c157600080fd5b6108c9611e46565b6040518082815260200191505060405180910390f35b34156108ea57600080fd5b6108f2611e53565b604051808215151515815260200191505060405180910390f35b341561091757600080fd5b61091f611eda565b6040518082815260200191505060405180910390f35b341561094057600080fd5b610948611ee7565b604051808215151515815260200191505060405180910390f35b341561096d57600080fd5b610975611f28565b604051808215151515815260200191505060405180910390f35b341561099a57600080fd5b6109a2611f3b565b6040518082815260200191505060405180910390f35b34156109c357600080fd5b6109ef600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f41565b6040518082815260200191505060405180910390f35b3415610a1057600080fd5b610a18611f8a565b604051808215151515815260200191505060405180910390f35b3415610a3d57600080fd5b610aca600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919050506120f3565b604051808215151515815260200191505060405180910390f35b3415610aef57600080fd5b610af7612187565b6040518082815260200191505060405180910390f35b3415610b1857600080fd5b610b2061218d565b6040518082815260200191505060405180910390f35b3415610b4157600080fd5b610b4961219a565b6040518082815260200191505060405180910390f35b3415610b6a57600080fd5b610b726121a0565b005b3415610b7f57600080fd5b610bcc6004808035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919050506124f3565b604051808215151515815260200191505060405180910390f35b3415610bf157600080fd5b610bf96128fa565b6040518082815260200191505060405180910390f35b3415610c1a57600080fd5b610c22612900565b604051808215151515815260200191505060405180910390f35b3415610c4757600080fd5b610c94600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050612bce565b604051808215151515815260200191505060405180910390f35b3415610cb957600080fd5b610cc1612d3f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d0e57600080fd5b610d16612d65565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d6357600080fd5b610d6b612d7d565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dab578082015181840152602081019050610d90565b50505050905090810190601f168015610dd85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610df157600080fd5b610df9612db6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610e4657600080fd5b610e5c6004808035906020019091905050612dce565b604051808381526020018281526020019250505060405180910390f35b3415610e8457600080fd5b610e8c612f2f565b6040518082815260200191505060405180910390f35b3415610ead57600080fd5b610ed9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612f35565b604051808215151515815260200191505060405180910390f35b3415610efe57600080fd5b610f2a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613020565b6040518082815260200191505060405180910390f35b3415610f4b57600080fd5b610f80600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050613038565b604051808215151515815260200191505060405180910390f35b3415610fa557600080fd5b610fad61304d565b6040518082815260200191505060405180910390f35b3415610fce57600080fd5b610fd6613053565b6040518082815260200191505060405180910390f35b3415610ff757600080fd5b610fff613058565b6040518082815260200191505060405180910390f35b341561102057600080fd5b611028613075565b604051808215151515815260200191505060405180910390f35b341561104d57600080fd5b6110556130ab565b6040518082815260200191505060405180910390f35b341561107657600080fd5b61107e6130b1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156110cb57600080fd5b6110f7600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506130d7565b604051808215151515815260200191505060405180910390f35b341561111c57600080fd5b6111246130f7565b6040518082815260200191505060405180910390f35b341561114557600080fd5b611190600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061310e565b6040518082815260200191505060405180910390f35b34156111b157600080fd5b6111b9613195565b6040518082815260200191505060405180910390f35b34156111da57600080fd5b6111e26131b5565b6040518082815260200191505060405180910390f35b341561120357600080fd5b61120b6131c2565b6040518082815260200191505060405180910390f35b341561122c57600080fd5b6112346132a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008060008060009054906101000a900460ff1615151561129657600080fd5b61129e611ee7565b1515156112aa57600080fd5b600460019054906101000a900460ff161515156112c657600080fd5b6359fa6000421115156112d857600080fd5b622e24806359fa60000142111515156112f057600080fd5b6000341115156112ff57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a261135634612dce565b809250819350505060008211151561136d57600080fd5b60026305f5e100601260ff16600a0a0281151561138657fe5b048260026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403101515156113ea57600080fd5b60008114151561141057611409816007546132bc90919063ffffffff16565b6007819055505b6114768260026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132bc90919063ffffffff16565b60026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061151f82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132d590919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36115f0346006546132d590919063ffffffff16565b60068190555061164834600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132d590919063ffffffff16565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550680821ab0d4414980000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015801561172d5750600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156117de576001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff167f86df4d319dc8c05e5ca005438b3e8a4521a6ddfa127e5cfd589d8c3ead3935bc6001604051808215151515815260200191505060405180910390a25b600192505050919050565b62eff10081565b6040805190810160405280600d81526020017f487574333420456e74726f70790000000000000000000000000000000000000081525081565b600460019054906101000a900460ff1681565b60008060009054906101000a900460ff1615151561185957600080fd5b600460019054906101000a900460ff16151561187457600080fd5b61187e83836132ee565b506001905092915050565b60095481565b6305f5e10081565b7f48757433342056657374696e67000000000000000000000000000000000000006c01000000000000000000000000900481565b62bebc2081565b73da3780cff2ae3a59ae16ec1734deec77a7fd8db281565b60085481565b604381565b7265d506e475b5dbd76480bafa57fe7c41c783af81565b60015481565b60006009544211151561192457600080fd5b7f87281fabebb3053dede10cd89db97c95421a1fb9385cd5d0bb6cf8db8dd11ae76009546040518082815260200191505060405180910390a161197562eff1006009546132d590919063ffffffff16565b6009819055506119f27f48757433342056657374696e67000000000000000000000000000000000000006c010000000000000000000000009004733135f4aca3c1ad4758981500f8db20ebdc5a1cab600460646014601260ff16600a0a6305f5e10002028115156119e257fe5b048115156119ec57fe5b046133e0565b905090565b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515611a8457600080fd5b611b1382600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132bc90919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b9e8484846133e0565b90509392505050565b6222476481565b680821ab0d441498000081565b6000600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c1957600080fd5b6000809054906101000a900460ff16151515611c3457600080fd5b60016000806101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611cf957600080fd5b6102c65a03f11515611d0a57600080fd5b505050604051805190501515611d1f57600080fd5b600190506000806101000a81549060ff02191690559392505050565b601281565b61028c81565b60008060009054906101000a900460ff16151515611d6357600080fd5b600460019054906101000a900460ff16151515611d7f57600080fd5b600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611de8575062127500622e24806359fa6000010142115b1515611df357600080fd5b600460006101000a81549060ff02191690557f72c874aeff0b183a56e2b79c71b46e1aed4dee5e09862134b8821ba2fddbf8bf60405160405180910390a16001905090565b60075481565b6359fa600081565b622e24806359fa60000181565b6000611e5d61374d565b6001604051805910611e6c5750595b9080825280602002602001820160405250905033816000815181101515611e8f57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611ed4816124f3565b91505090565b68982af34be0697c000081565b6000600460009054906101000a900460ff161580611f235750622e24806359fa60000142118015611f22575068a2a15d09519be00000600654105b5b905090565b600460009054906101000a900460ff1681565b61020581565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fe857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f2748503f8f31d8071821d1d5144384ba6a465036cda17fa1629a8a2509ccee0e60405160405180910390a3600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001905090565b60008060008060009054906101000a900460ff1615151561211357600080fd5b8351855114151561212357600080fd5b84519150600090505b8181101561217b5761216d33868381518110151561214657fe5b90602001906020020151868481518110151561215e57fe5b906020019060200201516133e0565b50808060010191505061212c565b60019250505092915050565b6101f481565b68a2a15d09519be0000081565b61024c81565b6000809054906101000a900460ff161515156121bb57600080fd5b600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561221757600080fd5b600460009054906101000a900460ff1615151561223357600080fd5b68982af34be0697c00006006540360085414151561225057600080fd5b6000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a360007f48757433342056657374696e67000000000000000000000000000000000000006c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60646014601260ff16600a0a6305f5e100020281151561238d57fe5b046040518082815260200191505060405180910390a36000736bf708ef2c1fdce3603c04ce9547aa6e134093b673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef622247646040518082815260200191505060405180910390a360026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905560026000736bf708ef2c1fdce3603c04ce9547aa6e134093b673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b6000806000806000806000809054906101000a900460ff1615151561251757600080fd5b60016000806101000a81548160ff021916908315150217905550612539611ee7565b151561254457600080fd5b865193505b838510156128db57868581518110151561255f57fe5b906020019060200201519050600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915060008211156127725761265e8260026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132d590919063ffffffff16565b60026000733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055733135f4aca3c1ad4758981500f8db20ebdc5a1cab73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35b60008311156128ce57600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055612822836008546132d590919063ffffffff16565b6008819055508073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398856040518082815260200191505060405180910390a38073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015156128cd57600080fd5b5b8480600101955050612549565b600195506000806101000a81549060ff02191690555050505050919050565b61022181565b600080600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561295f57600080fd5b6000809054906101000a900460ff1615151561297a57600080fd5b60016000806101000a81548160ff02191690831515021790555061299c613075565b15156129a757600080fd5b600460019054906101000a900460ff1615156129ca5762eff10042016009819055505b6001600460016101000a81548160ff0219169083151502179055506129ed613488565b90507265d506e475b5dbd76480bafa57fe7c41c783af73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398836040518082815260200191505060405180910390a37265d506e475b5dbd76480bafa57fe7c41c783af73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515612aba57600080fd5b73a70d04dc4a64960c40cd2ed2cde36d76ca4edfab73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b63983073ffffffffffffffffffffffffffffffffffffffff16316040518082815260200191505060405180910390a373a70d04dc4a64960c40cd2ed2cde36d76ca4edfab73ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501515612bb557600080fd5b600191506000806101000a81549060ff02191690555090565b60008060008060009054906101000a900460ff16151515612bee57600080fd5b600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c4a57600080fd5b835191505b81811015612d3457600b60008583815181101515612c6957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690558381815181101515612ccb57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff167f86df4d319dc8c05e5ca005438b3e8a4521a6ddfa127e5cfd589d8c3ead3935bc6000604051808215151515815260200191505060405180910390a28080600101915050612c4f565b600192505050919050565b600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b736bf708ef2c1fdce3603c04ce9547aa6e134093b681565b6040805190810160405280600381526020017f454e54000000000000000000000000000000000000000000000000000000000081525081565b73a70d04dc4a64960c40cd2ed2cde36d76ca4edfab81565b6000806000806000612dde6130f7565b9250612de8611ee7565b612e5f57600460019054906101000a900460ff16612e57576359fa60004210612e4f57622e24806359fa6000014211612e4757680821ab0d44149800008610612e3f57828610612e385782612e3a565b855b612e42565b60005b612e4a565b60005b612e52565b60005b612e5a565b60005b612e62565b60005b9150612eac670de0b6b3a7640000612e9e601260ff16600a0a612e906103e88761350090919063ffffffff16565b61350090919063ffffffff16565b61352e90919063ffffffff16565b9350612ec182876132bc90919063ffffffff16565b9550612ecb6131c2565b9050612f2584612f17670de0b6b3a7640000612f09601260ff16600a0a612efb878d61350090919063ffffffff16565b61350090919063ffffffff16565b61352e90919063ffffffff16565b6132d590919063ffffffff16565b9450505050915091565b6103e881565b6000600460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612f9357600080fd5b8173ffffffffffffffffffffffffffffffffffffffff167fbc48fdaddfcfb54d36a0ac4d7e52f46cdf854784b9c0978d385a35e8383262d460405160405180910390a281600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b600a6020528060005260406000206000915090505481565b60006130453384846133e0565b905092915050565b6102ee81565b601481565b60026305f5e100601260ff16600a0a0281151561307157fe5b0481565b600061307f611ee7565b158015613097575068a2a15d09519be0000060065410155b80156130a657506359fa600042115b905090565b60065481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60006103e860075481151561310857fe5b04905090565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60646014601260ff16600a0a6305f5e10002028115156131b157fe5b0481565b680821ab0d441498000081565b60006131cc611ee7565b61329c57600460019054906101000a900460ff16613294576359fa6000421061328c57620151806359fa60000142106132835762093a806359fa600001421061327a57621275006359fa600001421061327157621baf806359fa6000014210613268576224ea006359fa600001421061325f57622e24806359fa600001421061325657600061325a565b6101f45b613263565b6102055b61326c565b6102215b613275565b61024c5b61327e565b61028c5b613287565b6102ee5b61328f565b60005b613297565b60005b61329f565b60005b905090565b733135f4aca3c1ad4758981500f8db20ebdc5a1cab81565b600081830390508281111515156132cf57fe5b92915050565b600081830190508281101515156132e857fe5b92915050565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60008060009054906101000a900460ff161515156133fd57600080fd5b600460019054906101000a900460ff16151561341857600080fd5b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561347157600080fd5b61347c848484613550565b50600190509392505050565b600080604368982af34be0697c00003073ffffffffffffffffffffffffffffffffffffffff1631018115156134b957fe5b0490503073ffffffffffffffffffffffffffffffffffffffff16318111156134f8573073ffffffffffffffffffffffffffffffffffffffff16316134fa565b805b91505090565b600081830290506000831480613520575081838281151561351d57fe5b04145b151561352857fe5b92915050565b600080821415151561353c57fe5b818381151561354757fe5b04905092915050565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156135a057600080fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360008214156136175760019050613746565b61366982600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132bc90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136fe82600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132d590919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600190505b9392505050565b6020604051908101604052806000815250905600a165627a7a7230582007db8adb2c78cab9239e31a5e8c86280e5828125d6954cc7431c1a7399950bfe0029

Swarm Source

bzzr://07db8adb2c78cab9239e31a5e8c86280e5828125d6954cc7431c1a7399950bfe

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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