Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- EthealController
- Optimization enabled
- true
- Compiler version
- v0.4.18+commit.9cf6e910
- Optimization runs
- 200
- Verified at
- 2026-02-04T10:48:55.826778Z
Constructor Arguments
000000000000000000000000fc5c6c8015962e7035f3bdc5fe7ec94bedc77833
Arg [0] (address) : 0xfc5c6c8015962e7035f3bdc5fe7ec94bedc77833
EthealController.sol
pragma solidity ^0.4.17;
/**
* @title ERC20
* @dev ERC20 interface
*/
contract ERC20 {
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
function Ownable() {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) onlyOwner public {
require(newOwner != address(0));
OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a * b;
assert(a == 0 || c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
contract Controlled {
/// @notice The address of the controller is the only address that can call
/// a function with this modifier
modifier onlyController { require(msg.sender == controller); _; }
address public controller;
function Controlled() public { controller = msg.sender;}
/// @notice Changes the controller of the contract
/// @param _newController The new controller of the contract
function changeController(address _newController) public onlyController {
controller = _newController;
}
}
/**
* @title MiniMe interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20MiniMe is ERC20, Controlled {
function approveAndCall(address _spender, uint256 _amount, bytes _extraData) public returns (bool);
function totalSupply() public view returns (uint);
function balanceOfAt(address _owner, uint _blockNumber) public view returns (uint);
function totalSupplyAt(uint _blockNumber) public view returns(uint);
function createCloneToken(string _cloneTokenName, uint8 _cloneDecimalUnits, string _cloneTokenSymbol, uint _snapshotBlock, bool _transfersEnabled) public returns(address);
function generateTokens(address _owner, uint _amount) public returns (bool);
function destroyTokens(address _owner, uint _amount) public returns (bool);
function enableTransfers(bool _transfersEnabled) public;
function isContract(address _addr) internal view returns(bool);
function claimTokens(address _token) public;
event ClaimedTokens(address indexed _token, address indexed _controller, uint _amount);
event NewCloneToken(address indexed _cloneToken, uint _snapshotBlock);
}
/**
* @title Crowdsale
* @dev Crowdsale is a base contract for managing a token crowdsale.
* Crowdsales have a start and end timestamps, where investors can make
* token purchases and the crowdsale will assign them tokens based
* on a token per ETH rate. Funds collected are forwarded to a wallet
* as they arrive.
*/
contract Crowdsale {
using SafeMath for uint256;
// The token being sold
ERC20MiniMe public token;
// start and end timestamps where investments are allowed (both inclusive)
uint256 public startTime;
uint256 public endTime;
// address where funds are collected
address public wallet;
// how many token units a buyer gets per wei
uint256 public rate;
// amount of raised money in wei
uint256 public weiRaised;
/**
* event for token purchase logging
* @param purchaser who paid for the tokens
* @param beneficiary who got the tokens
* @param value weis paid for purchase
* @param amount amount of tokens purchased
*/
event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
function Crowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet) {
require(_startTime >= now);
require(_endTime >= _startTime);
require(_rate > 0);
require(_wallet != 0x0);
startTime = _startTime;
endTime = _endTime;
rate = _rate;
wallet = _wallet;
}
// fallback function can be used to buy tokens
function () payable {
buyTokens(msg.sender);
}
// low level token purchase function
function buyTokens(address beneficiary) public payable {
buyTokens(beneficiary, msg.value);
}
// implementation of low level token purchase function
function buyTokens(address beneficiary, uint256 weiAmount) internal {
require(beneficiary != 0x0);
require(validPurchase(weiAmount));
// update state
weiRaised = weiRaised.add(weiAmount);
transferToken(beneficiary, weiAmount);
forwardFunds(weiAmount);
}
// low level transfer token
// override to create custom token transfer mechanism, eg. pull pattern
function transferToken(address beneficiary, uint256 weiAmount) internal {
// calculate token amount to be created
uint256 tokens = weiAmount.mul(rate);
token.generateTokens(beneficiary, tokens);
TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);
}
// send ether to the fund collection wallet
// override to create custom fund forwarding mechanisms
function forwardFunds(uint256 weiAmount) internal {
wallet.transfer(weiAmount);
}
// @return true if the transaction can buy tokens
function validPurchase(uint256 weiAmount) internal view returns (bool) {
bool withinPeriod = now >= startTime && now <= endTime;
bool nonZeroPurchase = weiAmount != 0;
return withinPeriod && nonZeroPurchase;
}
// @return true if crowdsale event has ended
function hasEnded() public view returns (bool) {
return now > endTime;
}
// @return true if crowdsale has started
function hasStarted() public view returns (bool) {
return now >= startTime;
}
}
/// @dev The token controller contract must implement these functions
contract TokenController {
ERC20MiniMe public ethealToken;
address public SALE; // address where sale tokens are located
/// @notice needed for hodler handling
function addHodlerStake(address _beneficiary, uint _stake) public;
function setHodlerStake(address _beneficiary, uint256 _stake) public;
function setHodlerTime(uint256 _time) public;
/// @notice Called when `_owner` sends ether to the MiniMe Token contract
/// @param _owner The address that sent the ether to create tokens
/// @return True if the ether is accepted, false if it throws
function proxyPayment(address _owner) public payable returns(bool);
/// @notice Notifies the controller about a token transfer allowing the
/// controller to react if desired
/// @param _from The origin of the transfer
/// @param _to The destination of the transfer
/// @param _amount The amount of the transfer
/// @return False if the controller does not authorize the transfer
function onTransfer(address _from, address _to, uint _amount) public returns(bool);
/// @notice Notifies the controller about an approval allowing the
/// controller to react if desired
/// @param _owner The address that calls `approve()`
/// @param _spender The spender in the `approve()` call
/// @param _amount The amount in the `approve()` call
/// @return False if the controller does not authorize the approval
function onApprove(address _owner, address _spender, uint _amount) public returns(bool);
}
/**
* @title Pausable
* @dev Base contract which allows children to implement an emergency stop mechanism.
*/
contract Pausable is Ownable {
event Pause();
event Unpause();
bool public paused = false;
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*/
modifier whenNotPaused() {
require(!paused);
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*/
modifier whenPaused() {
require(paused);
_;
}
/**
* @dev called by the owner to pause, triggers stopped state
*/
function pause() onlyOwner whenNotPaused public {
paused = true;
Pause();
}
/**
* @dev called by the owner to unpause, returns to normal state
*/
function unpause() onlyOwner whenPaused public {
paused = false;
Unpause();
}
}
/**
* @title Hodler
* @dev Handles hodler reward, TokenController should create and own it.
*/
contract Hodler is Ownable {
using SafeMath for uint;
// HODLER reward tracker
// stake amount per address
struct HODL {
uint256 stake;
// moving ANY funds invalidates hodling of the address
bool invalid;
bool claimed3M;
bool claimed6M;
bool claimed9M;
}
mapping (address => HODL) public hodlerStakes;
// total current staking value and hodler addresses
uint256 public hodlerTotalValue;
uint256 public hodlerTotalCount;
// store dates and total stake values for 3 - 6 - 9 months after normal sale
uint256 public hodlerTotalValue3M;
uint256 public hodlerTotalValue6M;
uint256 public hodlerTotalValue9M;
uint256 public hodlerTimeStart;
uint256 public hodlerTime3M;
uint256 public hodlerTime6M;
uint256 public hodlerTime9M;
// reward HEAL token amount
uint256 public TOKEN_HODL_3M;
uint256 public TOKEN_HODL_6M;
uint256 public TOKEN_HODL_9M;
// total amount of tokens claimed so far
uint256 public claimedTokens;
event LogHodlSetStake(address indexed _setter, address indexed _beneficiary, uint256 _value);
event LogHodlClaimed(address indexed _setter, address indexed _beneficiary, uint256 _value);
event LogHodlStartSet(address indexed _setter, uint256 _time);
/// @dev Only before hodl is started
modifier beforeHodlStart() {
if (hodlerTimeStart == 0 || now <= hodlerTimeStart)
_;
}
/// @dev Contructor, it should be created by a TokenController
function Hodler(uint256 _stake3m, uint256 _stake6m, uint256 _stake9m) {
TOKEN_HODL_3M = _stake3m;
TOKEN_HODL_6M = _stake6m;
TOKEN_HODL_9M = _stake9m;
}
/// @notice Adding hodler stake to an account
/// @dev Only owner contract can call it and before hodling period starts
/// @param _beneficiary Recepient address of hodler stake
/// @param _stake Amount of additional hodler stake
function addHodlerStake(address _beneficiary, uint256 _stake) public onlyOwner beforeHodlStart {
// real change and valid _beneficiary is needed
if (_stake == 0 || _beneficiary == address(0))
return;
// add stake and maintain count
if (hodlerStakes[_beneficiary].stake == 0)
hodlerTotalCount = hodlerTotalCount.add(1);
hodlerStakes[_beneficiary].stake = hodlerStakes[_beneficiary].stake.add(_stake);
hodlerTotalValue = hodlerTotalValue.add(_stake);
LogHodlSetStake(msg.sender, _beneficiary, hodlerStakes[_beneficiary].stake);
}
/// @notice Setting hodler stake of an account
/// @dev Only owner contract can call it and before hodling period starts
/// @param _beneficiary Recepient address of hodler stake
/// @param _stake Amount to set the hodler stake
function setHodlerStake(address _beneficiary, uint256 _stake) public onlyOwner beforeHodlStart {
// real change and valid _beneficiary is needed
if (hodlerStakes[_beneficiary].stake == _stake || _beneficiary == address(0))
return;
// add stake and maintain count
if (hodlerStakes[_beneficiary].stake == 0 && _stake > 0) {
hodlerTotalCount = hodlerTotalCount.add(1);
} else if (hodlerStakes[_beneficiary].stake > 0 && _stake == 0) {
hodlerTotalCount = hodlerTotalCount.sub(1);
}
uint256 _diff = _stake > hodlerStakes[_beneficiary].stake ? _stake.sub(hodlerStakes[_beneficiary].stake) : hodlerStakes[_beneficiary].stake.sub(_stake);
if (_stake > hodlerStakes[_beneficiary].stake) {
hodlerTotalValue = hodlerTotalValue.add(_diff);
} else {
hodlerTotalValue = hodlerTotalValue.sub(_diff);
}
hodlerStakes[_beneficiary].stake = _stake;
LogHodlSetStake(msg.sender, _beneficiary, _stake);
}
/// @notice Setting hodler start period.
/// @param _time The time when hodler reward starts counting
function setHodlerTime(uint256 _time) public onlyOwner beforeHodlStart {
require(_time >= now);
hodlerTimeStart = _time;
hodlerTime3M = _time.add(90 days);
hodlerTime6M = _time.add(180 days);
hodlerTime9M = _time.add(270 days);
LogHodlStartSet(msg.sender, _time);
}
/// @notice Invalidates hodler account
/// @dev Gets called by EthealController#onTransfer before every transaction
function invalidate(address _account) public onlyOwner {
if (hodlerStakes[_account].stake > 0 && !hodlerStakes[_account].invalid) {
hodlerStakes[_account].invalid = true;
hodlerTotalValue = hodlerTotalValue.sub(hodlerStakes[_account].stake);
hodlerTotalCount = hodlerTotalCount.sub(1);
}
// update hodl total values "automatically" - whenever someone sends funds thus
updateAndGetHodlTotalValue();
}
/// @notice Claiming HODL reward for msg.sender
function claimHodlReward() public {
claimHodlRewardFor(msg.sender);
}
/// @notice Claiming HODL reward for an address
function claimHodlRewardFor(address _beneficiary) public {
// only when the address has a valid stake
require(hodlerStakes[_beneficiary].stake > 0 && !hodlerStakes[_beneficiary].invalid);
uint256 _stake = 0;
// update hodl total values
updateAndGetHodlTotalValue();
// claim hodl if not claimed
if (!hodlerStakes[_beneficiary].claimed3M && now >= hodlerTime3M) {
_stake = _stake.add(hodlerStakes[_beneficiary].stake.mul(TOKEN_HODL_3M).div(hodlerTotalValue3M));
hodlerStakes[_beneficiary].claimed3M = true;
}
if (!hodlerStakes[_beneficiary].claimed6M && now >= hodlerTime6M) {
_stake = _stake.add(hodlerStakes[_beneficiary].stake.mul(TOKEN_HODL_6M).div(hodlerTotalValue6M));
hodlerStakes[_beneficiary].claimed6M = true;
}
if (!hodlerStakes[_beneficiary].claimed9M && now >= hodlerTime9M) {
_stake = _stake.add(hodlerStakes[_beneficiary].stake.mul(TOKEN_HODL_9M).div(hodlerTotalValue9M));
hodlerStakes[_beneficiary].claimed9M = true;
}
if (_stake > 0) {
// increasing claimed tokens
claimedTokens = claimedTokens.add(_stake);
// transferring tokens
require(TokenController(owner).ethealToken().transfer(_beneficiary, _stake));
// log
LogHodlClaimed(msg.sender, _beneficiary, _stake);
}
}
/// @notice claimHodlRewardFor() for multiple addresses
/// @dev Anyone can call this function and distribute hodl rewards
/// @param _beneficiaries Array of addresses for which we want to claim hodl rewards
function claimHodlRewardsFor(address[] _beneficiaries) external {
for (uint256 i = 0; i < _beneficiaries.length; i++)
claimHodlRewardFor(_beneficiaries[i]);
}
/// @notice Setting 3 - 6 - 9 months total staking hodl value if time is come
function updateAndGetHodlTotalValue() public returns (uint) {
if (now >= hodlerTime3M && hodlerTotalValue3M == 0) {
hodlerTotalValue3M = hodlerTotalValue;
}
if (now >= hodlerTime6M && hodlerTotalValue6M == 0) {
hodlerTotalValue6M = hodlerTotalValue;
}
if (now >= hodlerTime9M && hodlerTotalValue9M == 0) {
hodlerTotalValue9M = hodlerTotalValue;
// since we can transfer more tokens to this contract, make it possible to retain more than the predefined limit
TOKEN_HODL_9M = TokenController(owner).ethealToken().balanceOf(this).sub(TOKEN_HODL_3M).sub(TOKEN_HODL_6M).add(claimedTokens);
}
return hodlerTotalValue;
}
}
/**
* @title TokenVesting
* @dev A token holder contract that can release its token balance gradually like a
* typical vesting scheme, with a cliff and vesting period. Optionally revocable by the
* owner.
*/
contract TokenVesting is Ownable {
using SafeMath for uint256;
event Released(uint256 amount);
event Revoked();
// beneficiary of tokens after they are released
address public beneficiary;
uint256 public cliff;
uint256 public start;
uint256 public duration;
bool public revocable;
mapping (address => uint256) public released;
mapping (address => bool) public revoked;
/**
* @dev Creates a vesting contract that vests its balance of any ERC20 token to the
* _beneficiary, gradually in a linear fashion until _start + _duration. By then all
* of the balance will have vested.
* @param _beneficiary address of the beneficiary to whom vested tokens are transferred
* @param _cliff duration in seconds of the cliff in which tokens will begin to vest
* @param _duration duration in seconds of the period in which the tokens will vest
* @param _revocable whether the vesting is revocable or not
*/
function TokenVesting(address _beneficiary, uint256 _start, uint256 _cliff, uint256 _duration, bool _revocable) {
require(_beneficiary != address(0));
require(_cliff <= _duration);
beneficiary = _beneficiary;
revocable = _revocable;
duration = _duration;
cliff = _start.add(_cliff);
start = _start;
}
/**
* @notice Transfers vested tokens to beneficiary.
* @param token ERC20 token which is being vested
*/
function release(ERC20MiniMe token) public {
uint256 unreleased = releasableAmount(token);
require(unreleased > 0);
released[token] = released[token].add(unreleased);
require(token.transfer(beneficiary, unreleased));
Released(unreleased);
}
/**
* @notice Allows the owner to revoke the vesting. Tokens already vested
* remain in the contract, the rest are returned to the owner.
* @param token ERC20MiniMe token which is being vested
*/
function revoke(ERC20MiniMe token) public onlyOwner {
require(revocable);
require(!revoked[token]);
uint256 balance = token.balanceOf(this);
uint256 unreleased = releasableAmount(token);
uint256 refund = balance.sub(unreleased);
revoked[token] = true;
require(token.transfer(owner, refund));
Revoked();
}
/**
* @dev Calculates the amount that has already vested but hasn't been released yet.
* @param token ERC20MiniMe token which is being vested
*/
function releasableAmount(ERC20MiniMe token) public view returns (uint256) {
return vestedAmount(token).sub(released[token]);
}
/**
* @dev Calculates the amount that has already vested.
* @param token ERC20MiniMe token which is being vested
*/
function vestedAmount(ERC20MiniMe token) public view returns (uint256) {
uint256 currentBalance = token.balanceOf(this);
uint256 totalBalance = currentBalance.add(released[token]);
if (now < cliff) {
return 0;
} else if (now >= start.add(duration) || revoked[token]) {
return totalBalance;
} else {
return totalBalance.mul(now.sub(start)).div(duration);
}
}
}
/**
* @title claim accidentally sent tokens
*/
contract HasNoTokens is Ownable {
event ExtractedTokens(address indexed _token, address indexed _claimer, uint _amount);
/// @notice This method can be used to extract mistakenly
/// sent tokens to this contract.
/// @param _token The address of the token contract that you want to recover
/// set to 0 in case you want to extract ether.
/// @param _claimer Address that tokens will be send to
function extractTokens(address _token, address _claimer) onlyOwner public {
if (_token == 0x0) {
_claimer.transfer(this.balance);
return;
}
ERC20 token = ERC20(_token);
uint balance = token.balanceOf(this);
token.transfer(_claimer, balance);
ExtractedTokens(_token, _claimer, balance);
}
}
/**
* @title EthealController
* @author thesved
* @notice Controller of the Etheal Token
* @dev Crowdsale can be only replaced when no active crowdsale is running.
* The contract is paused by default. It has to be unpaused to enable token transfer.
*/
contract EthealController is Pausable, HasNoTokens, TokenController {
using SafeMath for uint;
// when migrating this contains the address of the new controller
TokenController public newController;
// token contract
ERC20MiniMe public ethealToken;
// distribution of tokens
uint256 public constant ETHEAL_UNIT = 10**18;
uint256 public constant THOUSAND = 10**3;
uint256 public constant MILLION = 10**6;
uint256 public constant TOKEN_SALE1_PRE = 9 * MILLION * ETHEAL_UNIT;
uint256 public constant TOKEN_SALE1_NORMAL = 20 * MILLION * ETHEAL_UNIT;
uint256 public constant TOKEN_SALE2 = 9 * MILLION * ETHEAL_UNIT;
uint256 public constant TOKEN_SALE3 = 5 * MILLION * ETHEAL_UNIT;
uint256 public constant TOKEN_HODL_3M = 1 * MILLION * ETHEAL_UNIT;
uint256 public constant TOKEN_HODL_6M = 2 * MILLION * ETHEAL_UNIT;
uint256 public constant TOKEN_HODL_9M = 7 * MILLION * ETHEAL_UNIT;
uint256 public constant TOKEN_REFERRAL = 2 * MILLION * ETHEAL_UNIT;
uint256 public constant TOKEN_BOUNTY = 1500 * THOUSAND * ETHEAL_UNIT;
uint256 public constant TOKEN_COMMUNITY = 20 * MILLION * ETHEAL_UNIT;
uint256 public constant TOKEN_TEAM = 14 * MILLION * ETHEAL_UNIT;
uint256 public constant TOKEN_FOUNDERS = 6500 * THOUSAND * ETHEAL_UNIT;
uint256 public constant TOKEN_INVESTORS = 3 * MILLION * ETHEAL_UNIT;
// addresses only SALE will remain, the others will be real eth addresses
address public SALE = 0X1;
address public FOUNDER1 = 0x296dD2A2879fEBe2dF65f413999B28C053397fC5;
address public FOUNDER2 = 0x0E2feF8e4125ed0f49eD43C94b2B001C373F74Bf;
address public INVESTOR1 = 0xAAd27eD6c93d91aa60Dc827bE647e672d15e761A;
address public INVESTOR2 = 0xb906665f4ef609189A31CE55e01C267EC6293Aa5;
// addresses for multisig and crowdsale
address public ethealMultisigWallet;
Crowdsale public crowdsale;
// hodler reward contract
Hodler public hodlerReward;
// token grants
TokenVesting[] public tokenGrants;
uint256 public constant VESTING_TEAM_CLIFF = 365 days;
uint256 public constant VESTING_TEAM_DURATION = 4 * 365 days;
uint256 public constant VESTING_ADVISOR_CLIFF = 3 * 30 days;
uint256 public constant VESTING_ADVISOR_DURATION = 6 * 30 days;
/// @dev only the crowdsale can call it
modifier onlyCrowdsale() {
require(msg.sender == address(crowdsale));
_;
}
/// @dev only the crowdsale can call it
modifier onlyEthealMultisig() {
require(msg.sender == address(ethealMultisigWallet));
_;
}
////////////////
// Constructor, overrides
////////////////
/// @notice Constructor for Etheal Controller
function EthealController(address _wallet) {
require(_wallet != address(0));
paused = true;
ethealMultisigWallet = _wallet;
}
/// @dev overrides HasNoTokens#extractTokens to make it possible to extract any tokens after migration or before that any tokens except etheal
function extractTokens(address _token, address _claimer) onlyOwner public {
require(newController != address(0) || _token != address(ethealToken));
super.extractTokens(_token, _claimer);
}
////////////////
// Manage crowdsale
////////////////
/// @notice Set crowdsale address and transfer HEAL tokens from ethealController's SALE address
/// @dev Crowdsale can be only set when the current crowdsale is not active and ethealToken is set
function setCrowdsaleTransfer(address _sale, uint256 _amount) public onlyOwner {
require (_sale != address(0) && !isCrowdsaleOpen() && address(ethealToken) != address(0));
crowdsale = Crowdsale(_sale);
// transfer HEAL tokens to crowdsale account from the account of controller
require(ethealToken.transferFrom(SALE, _sale, _amount));
}
/// @notice Is there a not ended crowdsale?
/// @return true if there is no crowdsale or the current crowdsale is not yet ended but started
function isCrowdsaleOpen() public view returns (bool) {
return address(crowdsale) != address(0) && !crowdsale.hasEnded() && crowdsale.hasStarted();
}
////////////////
// Manage grants
////////////////
/// @notice Grant vesting token to an address
function createGrant(address _beneficiary, uint256 _start, uint256 _amount, bool _revocable, bool _advisor) public onlyOwner {
require(_beneficiary != address(0) && _amount > 0 && _start >= now);
// create token grant
if (_advisor) {
tokenGrants.push(new TokenVesting(_beneficiary, _start, VESTING_ADVISOR_CLIFF, VESTING_ADVISOR_DURATION, _revocable));
} else {
tokenGrants.push(new TokenVesting(_beneficiary, _start, VESTING_TEAM_CLIFF, VESTING_TEAM_DURATION, _revocable));
}
// transfer funds to the grant
transferToGrant(tokenGrants.length.sub(1), _amount);
}
/// @notice Transfer tokens to a grant until it is starting
function transferToGrant(uint256 _id, uint256 _amount) public onlyOwner {
require(_id < tokenGrants.length && _amount > 0 && now <= tokenGrants[_id].start());
// transfer funds to the grant
require(ethealToken.transfer(address(tokenGrants[_id]), _amount));
}
/// @dev Revoking grant
function revokeGrant(uint256 _id) public onlyOwner {
require(_id < tokenGrants.length);
tokenGrants[_id].revoke(ethealToken);
}
/// @notice Returns the token grant count
function getGrantCount() view public returns (uint) {
return tokenGrants.length;
}
////////////////
// BURN, handle ownership - only multsig can call these functions!
////////////////
/// @notice contract can burn its own or its sale tokens
function burn(address _where, uint256 _amount) public onlyEthealMultisig {
require(_where == address(this) || _where == SALE);
require(ethealToken.destroyTokens(_where, _amount));
}
/// @notice replaces controller when it was not yet replaced, only multisig can do it
function setNewController(address _controller) public onlyEthealMultisig {
require(_controller != address(0) && newController == address(0));
newController = TokenController(_controller);
ethealToken.changeController(_controller);
hodlerReward.transferOwnership(_controller);
// send eth
uint256 _stake = this.balance;
if (_stake > 0) {
_controller.transfer(_stake);
}
// send tokens
_stake = ethealToken.balanceOf(this);
if (_stake > 0) {
ethealToken.transfer(_controller, _stake);
}
}
/// @notice Set new multisig wallet, to make it upgradable.
function setNewMultisig(address _wallet) public onlyEthealMultisig {
require(_wallet != address(0));
ethealMultisigWallet = _wallet;
}
////////////////
// When PAUSED
////////////////
/// @notice set the token, if no hodler provided then creates a hodler reward contract
function setEthealToken(address _token, address _hodler) public onlyOwner whenPaused {
require(_token != address(0));
ethealToken = ERC20MiniMe(_token);
if (_hodler != address(0)) {
// set hodler reward contract if provided
hodlerReward = Hodler(_hodler);
} else if (hodlerReward == address(0)) {
// create hodler reward contract if not yet created
hodlerReward = new Hodler(TOKEN_HODL_3M, TOKEN_HODL_6M, TOKEN_HODL_9M);
}
// MINT tokens if not minted yet
if (ethealToken.totalSupply() == 0) {
// sale
ethealToken.generateTokens(SALE, TOKEN_SALE1_PRE.add(TOKEN_SALE1_NORMAL).add(TOKEN_SALE2).add(TOKEN_SALE3));
// hodler reward
ethealToken.generateTokens(address(hodlerReward), TOKEN_HODL_3M.add(TOKEN_HODL_6M).add(TOKEN_HODL_9M));
// bounty + referral
ethealToken.generateTokens(owner, TOKEN_BOUNTY.add(TOKEN_REFERRAL));
// community fund
ethealToken.generateTokens(address(ethealMultisigWallet), TOKEN_COMMUNITY);
// team -> grantable
ethealToken.generateTokens(address(this), TOKEN_FOUNDERS.add(TOKEN_TEAM));
// investors
ethealToken.generateTokens(INVESTOR1, TOKEN_INVESTORS.div(3).mul(2));
ethealToken.generateTokens(INVESTOR2, TOKEN_INVESTORS.div(3));
}
}
////////////////
// Proxy for Hodler contract
////////////////
/// @notice Proxy call for setting hodler start time
function setHodlerTime(uint256 _time) public onlyCrowdsale {
hodlerReward.setHodlerTime(_time);
}
/// @notice Proxy call for adding hodler stake
function addHodlerStake(address _beneficiary, uint256 _stake) public onlyCrowdsale {
hodlerReward.addHodlerStake(_beneficiary, _stake);
}
/// @notice Proxy call for setting hodler stake
function setHodlerStake(address _beneficiary, uint256 _stake) public onlyCrowdsale {
hodlerReward.setHodlerStake(_beneficiary, _stake);
}
////////////////
// MiniMe Controller functions
////////////////
/// @notice No eth payment to the token contract
function proxyPayment(address _owner) payable public returns (bool) {
revert();
}
/// @notice Before transfers are enabled for everyone, only this and the crowdsale contract is allowed to distribute HEAL
function onTransfer(address _from, address _to, uint256 _amount) public returns (bool) {
// moving any funds makes hodl participation invalid
hodlerReward.invalidate(_from);
return !paused || _from == address(this) || _to == address(this) || _from == address(crowdsale) || _to == address(crowdsale);
}
function onApprove(address _owner, address _spender, uint256 _amount) public returns (bool) {
return !paused;
}
/// @notice Retrieve mistakenly sent tokens (other than the etheal token) from the token contract
function claimTokenTokens(address _token) public onlyOwner {
require(_token != address(ethealToken));
ethealToken.claimTokens(_token);
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"libraries":{},"compilationTarget":{"EthealController.sol":"EthealController"}}
Contract ABI
[{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setHodlerStake","inputs":[{"type":"address","name":"_beneficiary"},{"type":"uint256","name":"_stake"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_SALE1_PRE","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"ethealToken","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_HODL_6M","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_SALE2","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"revokeGrant","inputs":[{"type":"uint256","name":"_id"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"hodlerReward","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_HODL_9M","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_BOUNTY","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setEthealToken","inputs":[{"type":"address","name":"_token"},{"type":"address","name":"_hodler"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"MILLION","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"createGrant","inputs":[{"type":"address","name":"_beneficiary"},{"type":"uint256","name":"_start"},{"type":"uint256","name":"_amount"},{"type":"bool","name":"_revocable"},{"type":"bool","name":"_advisor"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"newController","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"unpause","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"VESTING_ADVISOR_DURATION","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"onTransfer","inputs":[{"type":"address","name":"_from"},{"type":"address","name":"_to"},{"type":"uint256","name":"_amount"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"VESTING_ADVISOR_CLIFF","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"SALE","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"VESTING_TEAM_CLIFF","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setNewController","inputs":[{"type":"address","name":"_controller"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"isCrowdsaleOpen","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"paused","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_FOUNDERS","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"tokenGrants","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_REFERRAL","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_SALE1_NORMAL","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getGrantCount","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"ethealMultisigWallet","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"pause","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"THOUSAND","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_TEAM","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"ETHEAL_UNIT","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"addHodlerStake","inputs":[{"type":"address","name":"_beneficiary"},{"type":"uint256","name":"_stake"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"crowdsale","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"burn","inputs":[{"type":"address","name":"_where"},{"type":"uint256","name":"_amount"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferToGrant","inputs":[{"type":"uint256","name":"_id"},{"type":"uint256","name":"_amount"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"FOUNDER2","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_SALE3","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setNewMultisig","inputs":[{"type":"address","name":"_wallet"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setHodlerTime","inputs":[{"type":"uint256","name":"_time"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"VESTING_TEAM_DURATION","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_INVESTORS","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"claimTokenTokens","inputs":[{"type":"address","name":"_token"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"INVESTOR2","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_COMMUNITY","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setCrowdsaleTransfer","inputs":[{"type":"address","name":"_sale"},{"type":"uint256","name":"_amount"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"FOUNDER1","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"onApprove","inputs":[{"type":"address","name":"_owner"},{"type":"address","name":"_spender"},{"type":"uint256","name":"_amount"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"extractTokens","inputs":[{"type":"address","name":"_token"},{"type":"address","name":"_claimer"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner"}],"constant":false},{"type":"function","stateMutability":"payable","payable":true,"outputs":[{"type":"bool","name":""}],"name":"proxyPayment","inputs":[{"type":"address","name":"_owner"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"INVESTOR1","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TOKEN_HODL_3M","inputs":[],"constant":true},{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[{"type":"address","name":"_wallet"}]},{"type":"event","name":"ExtractedTokens","inputs":[{"type":"address","name":"_token","indexed":true},{"type":"address","name":"_claimer","indexed":true},{"type":"uint256","name":"_amount","indexed":false}],"anonymous":false},{"type":"event","name":"Pause","inputs":[],"anonymous":false},{"type":"event","name":"Unpause","inputs":[],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false}]
Contract Creation Code
0x60606040526000805460a060020a60ff021916905560058054600160a060020a031990811660011790915560068054821673296dd2a2879febe2df65f413999b28c053397fc5179055600780548216730e2fef8e4125ed0f49ed43c94b2b001c373f74bf17905560088054821673aad27ed6c93d91aa60dc827be647e672d15e761a1790556009805490911673b906665f4ef609189a31ce55e01c267ec6293aa517905534156100ae57600080fd5b604051602080613b668339810160405280805160008054600160a060020a03191633600160a060020a03908116919091179091559092508216151590506100f457600080fd5b6000805460a060020a60ff02191674010000000000000000000000000000000000000000179055600a8054600160a060020a03909216600160a060020a0319909216919091179055613a1b8061014b6000396000f300606060405260043610620002a45763ffffffff60e060020a600035041662346b578114620002a95780630224dc1814620002d057806303d756cb14620002f857806304c80c3c146200032a5780631b8b478714620002d05780631d33267a14620003405780631f816c6d146200035957806328262dd1146200036f578063299c55f714620003855780632f5c5a08146200039b57806332bc934c14620003c357806332f402c514620003d95780633a02263c146200040b5780633f4ba83a1462000421578063471b37cf14620004375780634a393149146200044d5780634bc1aa42146200048c5780634db08aea14620004a257806356c2c1f614620004b857806359baef4014620004ce5780635a3320ff14620004f05780635c975abb146200050657806363302789146200051c5780636fc559bb146200053257806372f4f5f9146200032a5780637a4690fb146200054b5780637c1b6afe14620005615780638059e80414620005775780638456cb59146200058d578063851cad9014620005a35780638cac193914620005b95780638da5cb5b14620005cf5780638f382a0014620005e557806393a378da14620005fb5780639c1e03a014620006205780639dc29fac14620006365780639f95de64146200065b578063a804903a1462000677578063ac60da79146200068d578063aebb254014620006a3578063b0e9a1ef14620006c5578063b2cb0a3d14620006de578063b3922c4214620006f4578063b5c7b1fe146200070a578063b8a4b858146200072c578063bd1fac00146200054b578063ca94452d1462000742578063d16c4cf51462000767578063da682aeb146200077d578063ed6b2d7d14620007a8578063f2fde38b14620007d0578063f48c305414620007f2578063f5459d6b1462000808578063fbd7d081146200081e575b600080fd5b3415620002b557600080fd5b620002ce600160a060020a036004351660243562000834565b005b3415620002dc57600080fd5b620002e6620008bf565b60405190815260200160405180910390f35b34156200030457600080fd5b6200030e620008ce565b604051600160a060020a03909116815260200160405180910390f35b34156200033657600080fd5b620002e6620008dd565b34156200034c57600080fd5b620002ce600435620008ec565b34156200036557600080fd5b6200030e6200099f565b34156200037b57600080fd5b620002e6620009ae565b34156200039157600080fd5b620002e6620009bd565b3415620003a757600080fd5b620002ce600160a060020a0360043581169060243516620009cc565b3415620003cf57600080fd5b620002e662001011565b3415620003e557600080fd5b620002ce600160a060020a03600435166024356044356064351515608435151562001018565b34156200041757600080fd5b6200030e620011de565b34156200042d57600080fd5b620002ce620011ed565b34156200044357600080fd5b620002e66200126e565b34156200045957600080fd5b62000478600160a060020a036004358116906024351660443562001275565b604051901515815260200160405180910390f35b34156200049857600080fd5b620002e662001361565b3415620004ae57600080fd5b6200030e62001368565b3415620004c457600080fd5b620002e662001377565b3415620004da57600080fd5b620002ce600160a060020a03600435166200137f565b3415620004fc57600080fd5b62000478620015db565b34156200051257600080fd5b62000478620016cf565b34156200052857600080fd5b620002e6620016df565b34156200053e57600080fd5b6200030e600435620016ee565b34156200055757600080fd5b620002e662001717565b34156200056d57600080fd5b620002e662001726565b34156200058357600080fd5b6200030e6200172c565b34156200059957600080fd5b620002ce6200173b565b3415620005af57600080fd5b620002e6620017c1565b3415620005c557600080fd5b620002e6620017c7565b3415620005db57600080fd5b6200030e620017d6565b3415620005f157600080fd5b620002e6620017e5565b34156200060757600080fd5b620002ce600160a060020a0360043516602435620017f1565b34156200062c57600080fd5b6200030e62001864565b34156200064257600080fd5b620002ce600160a060020a036004351660243562001873565b34156200066757600080fd5b620002ce60043560243562001951565b34156200068357600080fd5b6200030e62001a9a565b34156200069957600080fd5b620002e662001aa9565b3415620006af57600080fd5b620002ce600160a060020a036004351662001ab8565b3415620006d157600080fd5b620002ce60043562001b0c565b3415620006ea57600080fd5b620002e662001b71565b34156200070057600080fd5b620002e662001b79565b34156200071657600080fd5b620002ce600160a060020a036004351662001b88565b34156200073857600080fd5b6200030e62001c11565b34156200074e57600080fd5b620002ce600160a060020a036004351660243562001c20565b34156200077357600080fd5b6200030e62001d0b565b34156200078957600080fd5b62000478600160a060020a036004358116906024351660443562001d1a565b3415620007b457600080fd5b620002ce600160a060020a036004358116906024351662001d2f565b3415620007dc57600080fd5b620002ce600160a060020a036004351662001d8b565b62000478600160a060020a036004351662001e1b565b34156200081457600080fd5b6200030e62001e22565b34156200082a57600080fd5b620002e662001e31565b600b5433600160a060020a039081169116146200085057600080fd5b600c54600160a060020a031662346b57838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620008a657600080fd5b6102c65a03f11515620008b857600080fd5b5050505050565b6a0771d2fa45345aa900000081565b600454600160a060020a031681565b6a01a784379d99db4200000081565b60005433600160a060020a039081169116146200090857600080fd5b600d5481106200091757600080fd5b600d8054829081106200092657fe5b600091825260209091200154600454600160a060020a03918216916374a8f103911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200098757600080fd5b6102c65a03f115156200099957600080fd5b50505050565b600c54600160a060020a031681565b6a05ca4ec2a79a7f6700000081565b6a013da329b633647180000081565b60005433600160a060020a03908116911614620009e857600080fd5b60005460a060020a900460ff16151562000a0157600080fd5b600160a060020a038216151562000a1757600080fd5b60048054600160a060020a031916600160a060020a038481169190911790915581161562000a6057600c8054600160a060020a031916600160a060020a03831617905562000af0565b600c54600160a060020a0316151562000af05769d3c21bcecceda10000006a01a784379d99db420000006a05ca4ec2a79a7f6700000062000aa06200205c565b808481526020018381526020018281526020019350505050604051809103906000f080151562000acf57600080fd5b600c8054600160a060020a031916600160a060020a03929092169190911790555b600454600160a060020a03166318160ddd6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000b3957600080fd5b6102c65a03f1151562000b4b57600080fd5b5050506040518051151590506200100d57600454600554600160a060020a039182169163827f32c0911662000bbc6a0422ca8b0a00a42500000062000baf6a0771d2fa45345aa900000081816a108b2a2c2802909400000063ffffffff62001e3f16565b9063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000c0957600080fd5b6102c65a03f1151562000c1b57600080fd5b50505060405180515050600454600c54600160a060020a039182169163827f32c0911662000c756a05ca4ec2a79a7f6700000062000baf69d3c21bcecceda10000006a01a784379d99db4200000063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000cc257600080fd5b6102c65a03f1151562000cd457600080fd5b50505060405180515050600454600054600160a060020a039182169163827f32c0911662000d1f6a013da329b63364718000006a01a784379d99db4200000063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000d6c57600080fd5b6102c65a03f1151562000d7e57600080fd5b50505060405180515050600454600a54600160a060020a039182169163827f32c091166a108b2a2c2802909400000060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000dfa57600080fd5b6102c65a03f1151562000e0c57600080fd5b50505060405180515050600454600160a060020a031663827f32c03062000e506a05606db4c03408968000006a0b949d854f34fece00000063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000e9d57600080fd5b6102c65a03f1151562000eaf57600080fd5b50505060405180515050600454600854600160a060020a039182169163827f32c0911662000f03600262000ef66a027b46536c66c8e3000000600363ffffffff62001e5616565b9063ffffffff62001e6e16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000f5057600080fd5b6102c65a03f1151562000f6257600080fd5b50505060405180515050600454600954600160a060020a039182169163827f32c0911662000fa36a027b46536c66c8e3000000600363ffffffff62001e5616565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000ff057600080fd5b6102c65a03f115156200100257600080fd5b505050604051805150505b5050565b620f424081565b60005433600160a060020a039081169116146200103457600080fd5b600160a060020a038516158015906200104d5750600083115b80156200105a5750428410155b15156200106657600080fd5b80156200111657600d8054600181016200108183826200206d565b9160005260206000209001600087876276a70062ed4e0088620010a362002099565b600160a060020a03909516855260208501939093526040808501929092526060840152901515608083015260a09091019051809103906000f0801515620010e957600080fd5b909190916101000a815481600160a060020a030219169083600160a060020a0316021790555050620011bc565b600d8054600181016200112a83826200206d565b9160005260206000209001600087876301e13380630784ce00886200114e62002099565b600160a060020a03909516855260208501939093526040808501929092526060840152901515608083015260a09091019051809103906000f08015156200119457600080fd5b909190916101000a815481600160a060020a030219169083600160a060020a03160217905550505b600d54620008b890620011d790600163ffffffff62001e9516565b8462001951565b600354600160a060020a031681565b60005433600160a060020a039081169116146200120957600080fd5b60005460a060020a900460ff1615156200122257600080fd5b6000805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b62ed4e0081565b600c54600090600160a060020a03166337a3931f8560405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515620012c957600080fd5b6102c65a03f11515620012db57600080fd5b505060005460a060020a900460ff16159050806200130a575030600160a060020a031684600160a060020a0316145b8062001327575030600160a060020a031683600160a060020a0316145b80620013405750600b54600160a060020a038581169116145b80620013595750600b54600160a060020a038481169116145b949350505050565b6276a70081565b600554600160a060020a031681565b6301e1338081565b600a5460009033600160a060020a039081169116146200139e57600080fd5b600160a060020a03821615801590620013c05750600354600160a060020a0316155b1515620013cc57600080fd5b60038054600160a060020a031916600160a060020a038481169190911790915560045416633cebb8238360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200143557600080fd5b6102c65a03f115156200144757600080fd5b5050600c54600160a060020a0316905063f2fde38b8360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200149c57600080fd5b6102c65a03f11515620014ae57600080fd5b50505030600160a060020a03163190506000811115620014fa57600160a060020a03821681156108fc0282604051600060405180830381858888f193505050501515620014fa57600080fd5b600454600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200155457600080fd5b6102c65a03f115156200156657600080fd5b505050604051805191505060008111156200100d57600454600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000ff057600080fd5b600b54600090600160a060020a0316158015906200165b5750600b54600160a060020a031663ecb70fb76000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200163d57600080fd5b6102c65a03f115156200164f57600080fd5b50505060405180519050155b8015620016c95750600b54600160a060020a03166344691f7e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620016ac57600080fd5b6102c65a03f11515620016be57600080fd5b505050604051805190505b90505b90565b60005460a060020a900460ff1681565b6a05606db4c034089680000081565b600d805482908110620016fd57fe5b600091825260209091200154600160a060020a0316905081565b6a108b2a2c2802909400000081565b600d5490565b600a54600160a060020a031681565b60005433600160a060020a039081169116146200175757600080fd5b60005460a060020a900460ff16156200176f57600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6103e881565b6a0b949d854f34fece00000081565b600054600160a060020a031681565b670de0b6b3a764000081565b600b5433600160a060020a039081169116146200180d57600080fd5b600c54600160a060020a03166393a378da838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620008a657600080fd5b600b54600160a060020a031681565b600a5433600160a060020a039081169116146200188f57600080fd5b30600160a060020a031682600160a060020a03161480620018bd5750600554600160a060020a038381169116145b1515620018c957600080fd5b600454600160a060020a031663d3ce77fe838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200192957600080fd5b6102c65a03f115156200193b57600080fd5b5050506040518051905015156200100d57600080fd5b60005433600160a060020a039081169116146200196d57600080fd5b600d54821080156200197f5750600081115b801562001a075750600d8054839081106200199657fe5b6000918252602082200154600160a060020a03169063be9a655590604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620019e757600080fd5b6102c65a03f11515620019f957600080fd5b505050604051805190504211155b151562001a1357600080fd5b600454600d8054600160a060020a039092169163a9059cbb91908590811062001a3857fe5b6000918252602082200154600160a060020a03169084906040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200192957600080fd5b600754600160a060020a031681565b6a0422ca8b0a00a42500000081565b600a5433600160a060020a0390811691161462001ad457600080fd5b600160a060020a038116151562001aea57600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055565b600b5433600160a060020a0390811691161462001b2857600080fd5b600c54600160a060020a031663b0e9a1ef8260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b15156200098757600080fd5b630784ce0081565b6a027b46536c66c8e300000081565b60005433600160a060020a0390811691161462001ba457600080fd5b600454600160a060020a038281169116141562001bc057600080fd5b600454600160a060020a031663df8de3e78260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200098757600080fd5b600954600160a060020a031681565b60005433600160a060020a0390811691161462001c3c57600080fd5b600160a060020a0382161580159062001c5c575062001c5a620015db565b155b801562001c735750600454600160a060020a031615155b151562001c7f57600080fd5b600b8054600160a060020a031916600160a060020a0384811691909117909155600454600554908216916323b872dd9116848460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156200192957600080fd5b600654600160a060020a031681565b505060005460a060020a900460ff1615919050565b60005433600160a060020a0390811691161462001d4b57600080fd5b600354600160a060020a031615158062001d735750600454600160a060020a03838116911614155b151562001d7f57600080fd5b6200100d828262001ea8565b60005433600160a060020a0390811691161462001da757600080fd5b600160a060020a038116151562001dbd57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008054600160a060020a031916600160a060020a0392909216919091179055565b6000806000fd5b600854600160a060020a031681565b69d3c21bcecceda100000081565b60008282018381101562001e4f57fe5b9392505050565b600080828481151562001e6557fe5b04949350505050565b600082820283158062001e8c575082848281151562001e8957fe5b04145b151562001e4f57fe5b60008282111562001ea257fe5b50900390565b60008054819033600160a060020a0390811691161462001ec757600080fd5b600160a060020a038416151562001f1c5782600160a060020a03166108fc30600160a060020a0316319081150290604051600060405180830381858888f19350505050151562001f1657600080fd5b62000999565b83915081600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001f7757600080fd5b6102c65a03f1151562001f8957600080fd5b5050506040518051915050600160a060020a03821663a9059cbb848360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562001ff257600080fd5b6102c65a03f115156200200457600080fd5b505050604051805190505082600160a060020a031684600160a060020a03167f21e9b296e283cad208b551b3c383bb74e34086eb5691fee8392dcce6794521c28360405190815260200160405180910390a350505050565b60405161101580620020cc83390190565b815481835581811511620020945760008381526020902062002094918101908301620020aa565b505050565b60405161090f80620030e183390190565b620016cc91905b80821115620020c75760008155600101620020b1565b509056006060604052341561000f57600080fd5b60405160608061101583398101604052808051919060200180519190602001805160008054600160a060020a033316600160a060020a0319909116179055600b949094555050600c55600d55610fab8061006a6000396000f3006060604052600436106101235763ffffffff60e060020a600035041662346b57811461012857806304c80c3c1461014c5780630d92e3e8146101715780630eb6f5431461018457806326c43d8f1461019757806328262dd1146101aa57806337a3931f146101bd57806342ef4c1a146101dc5780634a48314f146101ef5780634b86faba14610202578063685a73e0146102155780638da5cb5b1461023357806391e79c721461026257806393a378da14610275578063b0e9a1ef14610297578063b40d8d58146102ad578063be2b1047146102c0578063c899fa77146102d3578063d228cfc5146102e6578063d43a0b4c14610305578063d6192c6c14610318578063e2c208361461036e578063f2fde38b14610381578063fbd7d081146103a0575b600080fd5b341561013357600080fd5b61014a600160a060020a03600435166024356103b3565b005b341561015757600080fd5b61015f6105cc565b60405190815260200160405180910390f35b341561017c57600080fd5b61015f6105d2565b341561018f57600080fd5b61015f6105d8565b34156101a257600080fd5b61015f6105de565b34156101b557600080fd5b61015f6105e4565b34156101c857600080fd5b61014a600160a060020a03600435166105ea565b34156101e757600080fd5b61015f6106b1565b34156101fa57600080fd5b61015f6106b7565b341561020d57600080fd5b61014a6106bd565b341561022057600080fd5b61014a60048035602481019101356106c8565b341561023e57600080fd5b6102466106ff565b604051600160a060020a03909116815260200160405180910390f35b341561026d57600080fd5b61015f61070e565b341561028057600080fd5b61014a600160a060020a0360043516602435610714565b34156102a257600080fd5b61014a600435610848565b34156102b857600080fd5b61015f61090f565b34156102cb57600080fd5b61015f610915565b34156102de57600080fd5b61015f61091b565b34156102f157600080fd5b61014a600160a060020a0360043516610921565b341561031057600080fd5b61015f610cc6565b341561032357600080fd5b610337600160a060020a0360043516610ccc565b60405194855292151560208501529015156040808501919091529015156060840152901515608083015260a0909101905180910390f35b341561037957600080fd5b61015f610d04565b341561038c57600080fd5b61014a600160a060020a0360043516610e7b565b34156103ab57600080fd5b61015f610f16565b6000805433600160a060020a039081169116146103cf57600080fd5b60075415806103e057506007544211155b156105c757600160a060020a0383166000908152600160205260409020548214806104125750600160a060020a038316155b1561041c576105c7565b600160a060020a0383166000908152600160205260409020541580156104425750600082115b156104635760035461045b90600163ffffffff610f1c16565b6003556104a4565b600160a060020a038316600090815260016020526040812054118015610487575081155b156104a4576003546104a090600163ffffffff610f3216565b6003555b600160a060020a03831660009081526001602052604090205482116104f157600160a060020a0383166000908152600160205260409020546104ec908363ffffffff610f3216565b61051b565b600160a060020a03831660009081526001602052604090205461051b90839063ffffffff610f3216565b600160a060020a03841660009081526001602052604090205490915082111561055957600254610551908263ffffffff610f1c16565b600255610570565b60025461056c908263ffffffff610f3216565b6002555b600160a060020a038084166000818152600160205260409081902085905590913316907f531b6d98182f354ef73d680007a0fa84a81fa4a320e289e4f826150ad104fb1a9085905190815260200160405180910390a35b505050565b600c5481565b600e5481565b60055481565b60035481565b600d5481565b60005433600160a060020a0390811691161461060557600080fd5b600160a060020a0381166000908152600160205260408120541180156106485750600160a060020a0381166000908152600160208190526040909120015460ff16155b156106a557600160a060020a0381166000908152600160208190526040909120808201805460ff19169092179091555460025461068a9163ffffffff610f3216565b6002556003546106a190600163ffffffff610f3216565b6003555b6106ad610d04565b5050565b60095481565b60085481565b6106c633610921565b565b60005b818110156105c7576106f78383838181106106e257fe5b90506020020135600160a060020a0316610921565b6001016106cb565b600054600160a060020a031681565b60025481565b60005433600160a060020a0390811691161461072f57600080fd5b600754158061074057506007544211155b156106ad578015806107595750600160a060020a038216155b15610763576106ad565b600160a060020a038216600090815260016020526040902054151561079a5760035461079690600163ffffffff610f1c16565b6003555b600160a060020a0382166000908152600160205260409020546107c3908263ffffffff610f1c16565b600160a060020a0383166000908152600160205260409020556002546107ef908263ffffffff610f1c16565b600255600160a060020a03808316600081815260016020526040908190205491923316917f531b6d98182f354ef73d680007a0fa84a81fa4a320e289e4f826150ad104fb1a915190815260200160405180910390a35050565b60005433600160a060020a0390811691161461086357600080fd5b600754158061087457506007544211155b1561090c574281101561088657600080fd5b600781905561089e816276a70063ffffffff610f1c16565b6008556108b48162ed4e0063ffffffff610f1c16565b6009556108cb81630163f50063ffffffff610f1c16565b600a55600160a060020a0333167fc7ad31b0c99a40aa43822fbc49a68cf7f3eb3d52152a5c01a7f636e4481cf43f8260405190815260200160405180910390a25b50565b600a5481565b60075481565b60045481565b600160a060020a03811660009081526001602052604081205481901180156109665750600160a060020a0382166000908152600160208190526040909120015460ff16155b151561097157600080fd5b50600061097c610d04565b50600160a060020a03821660009081526001602081905260409091200154610100900460ff161580156109b157506008544210155b15610a3357600454600b54600160a060020a038416600090815260016020526040902054610a07926109fa9290916109ee9163ffffffff610f4416565b9063ffffffff610f6816565b829063ffffffff610f1c16565b600160a060020a038316600090815260016020819052604090912001805461ff00191661010017905590505b600160a060020a0382166000908152600160208190526040909120015462010000900460ff16158015610a6857506009544210155b15610ad357600554600c54600160a060020a038416600090815260016020526040902054610aa5926109fa9290916109ee9163ffffffff610f4416565b600160a060020a038316600090815260016020819052604090912001805462ff000019166201000017905590505b600160a060020a038216600090815260016020819052604090912001546301000000900460ff16158015610b095750600a544210155b15610b7657600654600d54600160a060020a038416600090815260016020526040902054610b46926109fa9290916109ee9163ffffffff610f4416565b600160a060020a038316600090815260016020819052604090912001805463ff0000001916630100000017905590505b60008111156106ad57600e54610b92908263ffffffff610f1c16565b600e5560008054600160a060020a0316906303d756cb90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610bde57600080fd5b6102c65a03f11515610bef57600080fd5b50505060405180519050600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610c5557600080fd5b6102c65a03f11515610c6657600080fd5b505050604051805190501515610c7b57600080fd5b81600160a060020a031633600160a060020a03167fd06980f1b54006ca63e8ddd2f4dafe76e8bcd6e7d7f333296f778781626af4268360405190815260200160405180910390a35050565b60065481565b6001602081905260009182526040909120805491015460ff808216916101008104821691620100008204811691630100000090041685565b60006008544210158015610d185750600454155b15610d24576002546004555b6009544210158015610d365750600554155b15610d42576002546005555b600a544210158015610d545750600654155b15610e7457600254600655600e54600c54600b5460008054610e709493610e64939092610e5892600160a060020a0316906303d756cb90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610dc057600080fd5b6102c65a03f11515610dd157600080fd5b50505060405180519050600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610e3157600080fd5b6102c65a03f11515610e4257600080fd5b505050604051805191905063ffffffff610f3216565b9063ffffffff610f3216565b9063ffffffff610f1c16565b600d555b5060025490565b60005433600160a060020a03908116911614610e9657600080fd5b600160a060020a0381161515610eab57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600b5481565b600082820183811015610f2b57fe5b9392505050565b600082821115610f3e57fe5b50900390565b6000828202831580610f605750828482811515610f5d57fe5b04145b1515610f2b57fe5b6000808284811515610f7657fe5b049493505050505600a165627a7a72305820b13878352c4505507a0469068cef25077583c2b2fd96737ede4cf449af3c69b800296060604052341561000f57600080fd5b60405160a08061090f833981016040528080519190602001805191906020018051919060200180519190602001805160008054600160a060020a03191633600160a060020a039081169190911790915590925086161515905061007157600080fd5b8183111561007e57600080fd5b60018054600160a060020a031916600160a060020a0387161790556005805460ff191682151517905560048290556100c384846401000000006100d2810261079b1704565b600255505050600355506100e8565b6000828201838110156100e157fe5b9392505050565b610818806100f76000396000f3006060604052600436106100ab5763ffffffff60e060020a6000350416630fb5a6b481146100b057806313d033c0146100d55780631726cbc8146100e85780631916558714610107578063384711cc1461012857806338af3eed1461014757806374a8f10314610176578063872a7810146101955780638da5cb5b146101bc5780639852595c146101cf578063be9a6555146101ee578063f2fde38b14610201578063fa01dc0614610220575b600080fd5b34156100bb57600080fd5b6100c361023f565b60405190815260200160405180910390f35b34156100e057600080fd5b6100c3610245565b34156100f357600080fd5b6100c3600160a060020a036004351661024b565b341561011257600080fd5b610126600160a060020a0360043516610283565b005b341561013357600080fd5b6100c3600160a060020a036004351661039c565b341561015257600080fd5b61015a6104dd565b604051600160a060020a03909116815260200160405180910390f35b341561018157600080fd5b610126600160a060020a03600435166104ec565b34156101a057600080fd5b6101a86106a9565b604051901515815260200160405180910390f35b34156101c757600080fd5b61015a6106b2565b34156101da57600080fd5b6100c3600160a060020a03600435166106c1565b34156101f957600080fd5b6100c36106d3565b341561020c57600080fd5b610126600160a060020a03600435166106d9565b341561022b57600080fd5b6101a8600160a060020a0360043516610774565b60045481565b60025481565b600160a060020a03811660009081526006602052604081205461027d906102718461039c565b9063ffffffff61078916565b92915050565b600061028e8261024b565b90506000811161029d57600080fd5b600160a060020a0382166000908152600660205260409020546102c6908263ffffffff61079b16565b600160a060020a0380841660008181526006602052604080822094909455600154919363a9059cbb939290921691859190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561033f57600080fd5b6102c65a03f1151561035057600080fd5b50505060405180519050151561036557600080fd5b7ffb81f9b30d73d830c3544b34d827c08142579ee75710b490bab0b3995468c5658160405190815260200160405180910390a15050565b600080600083600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156103f857600080fd5b6102c65a03f1151561040957600080fd5b5050506040518051600160a060020a03861660009081526006602052604090205490935061043f9150839063ffffffff61079b16565b905060025442101561045457600092506104d6565b6004546003546104699163ffffffff61079b16565b4210158061048f5750600160a060020a03841660009081526007602052604090205460ff165b1561049c578092506104d6565b6104d36004546104c76104ba6003544261078990919063ffffffff16565b849063ffffffff6107b116565b9063ffffffff6107d516565b92505b5050919050565b600154600160a060020a031681565b600080548190819033600160a060020a0390811691161461050c57600080fd5b60055460ff16151561051d57600080fd5b600160a060020a03841660009081526007602052604090205460ff161561054357600080fd5b83600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561059a57600080fd5b6102c65a03f115156105ab57600080fd5b5050506040518051905092506105c08461024b565b91506105d2838363ffffffff61078916565b600160a060020a03808616600081815260076020526040808220805460ff191660011790558154949550919363a9059cbb931691859190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561065157600080fd5b6102c65a03f1151561066257600080fd5b50505060405180519050151561067757600080fd5b7f44825a4b2df8acb19ce4e1afba9aa850c8b65cdb7942e2078f27d0b0960efee660405160405180910390a150505050565b60055460ff1681565b600054600160a060020a031681565b60066020526000908152604090205481565b60035481565b60005433600160a060020a039081169116146106f457600080fd5b600160a060020a038116151561070957600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60076020526000908152604090205460ff1681565b60008282111561079557fe5b50900390565b6000828201838110156107aa57fe5b9392505050565b60008282028315806107cd57508284828115156107ca57fe5b04145b15156107aa57fe5b60008082848115156107e357fe5b049493505050505600a165627a7a7230582009649e1f374e51bd346858160f9ce8785feb3bfeb10e4f09b72214fac4485c0e0029a165627a7a7230582092a1f27c76560e9a5c435886caece0a86173198ab75681be3e0196811ebb45d30029000000000000000000000000fc5c6c8015962e7035f3bdc5fe7ec94bedc77833
Deployed ByteCode
0x606060405260043610620002a45763ffffffff60e060020a600035041662346b578114620002a95780630224dc1814620002d057806303d756cb14620002f857806304c80c3c146200032a5780631b8b478714620002d05780631d33267a14620003405780631f816c6d146200035957806328262dd1146200036f578063299c55f714620003855780632f5c5a08146200039b57806332bc934c14620003c357806332f402c514620003d95780633a02263c146200040b5780633f4ba83a1462000421578063471b37cf14620004375780634a393149146200044d5780634bc1aa42146200048c5780634db08aea14620004a257806356c2c1f614620004b857806359baef4014620004ce5780635a3320ff14620004f05780635c975abb146200050657806363302789146200051c5780636fc559bb146200053257806372f4f5f9146200032a5780637a4690fb146200054b5780637c1b6afe14620005615780638059e80414620005775780638456cb59146200058d578063851cad9014620005a35780638cac193914620005b95780638da5cb5b14620005cf5780638f382a0014620005e557806393a378da14620005fb5780639c1e03a014620006205780639dc29fac14620006365780639f95de64146200065b578063a804903a1462000677578063ac60da79146200068d578063aebb254014620006a3578063b0e9a1ef14620006c5578063b2cb0a3d14620006de578063b3922c4214620006f4578063b5c7b1fe146200070a578063b8a4b858146200072c578063bd1fac00146200054b578063ca94452d1462000742578063d16c4cf51462000767578063da682aeb146200077d578063ed6b2d7d14620007a8578063f2fde38b14620007d0578063f48c305414620007f2578063f5459d6b1462000808578063fbd7d081146200081e575b600080fd5b3415620002b557600080fd5b620002ce600160a060020a036004351660243562000834565b005b3415620002dc57600080fd5b620002e6620008bf565b60405190815260200160405180910390f35b34156200030457600080fd5b6200030e620008ce565b604051600160a060020a03909116815260200160405180910390f35b34156200033657600080fd5b620002e6620008dd565b34156200034c57600080fd5b620002ce600435620008ec565b34156200036557600080fd5b6200030e6200099f565b34156200037b57600080fd5b620002e6620009ae565b34156200039157600080fd5b620002e6620009bd565b3415620003a757600080fd5b620002ce600160a060020a0360043581169060243516620009cc565b3415620003cf57600080fd5b620002e662001011565b3415620003e557600080fd5b620002ce600160a060020a03600435166024356044356064351515608435151562001018565b34156200041757600080fd5b6200030e620011de565b34156200042d57600080fd5b620002ce620011ed565b34156200044357600080fd5b620002e66200126e565b34156200045957600080fd5b62000478600160a060020a036004358116906024351660443562001275565b604051901515815260200160405180910390f35b34156200049857600080fd5b620002e662001361565b3415620004ae57600080fd5b6200030e62001368565b3415620004c457600080fd5b620002e662001377565b3415620004da57600080fd5b620002ce600160a060020a03600435166200137f565b3415620004fc57600080fd5b62000478620015db565b34156200051257600080fd5b62000478620016cf565b34156200052857600080fd5b620002e6620016df565b34156200053e57600080fd5b6200030e600435620016ee565b34156200055757600080fd5b620002e662001717565b34156200056d57600080fd5b620002e662001726565b34156200058357600080fd5b6200030e6200172c565b34156200059957600080fd5b620002ce6200173b565b3415620005af57600080fd5b620002e6620017c1565b3415620005c557600080fd5b620002e6620017c7565b3415620005db57600080fd5b6200030e620017d6565b3415620005f157600080fd5b620002e6620017e5565b34156200060757600080fd5b620002ce600160a060020a0360043516602435620017f1565b34156200062c57600080fd5b6200030e62001864565b34156200064257600080fd5b620002ce600160a060020a036004351660243562001873565b34156200066757600080fd5b620002ce60043560243562001951565b34156200068357600080fd5b6200030e62001a9a565b34156200069957600080fd5b620002e662001aa9565b3415620006af57600080fd5b620002ce600160a060020a036004351662001ab8565b3415620006d157600080fd5b620002ce60043562001b0c565b3415620006ea57600080fd5b620002e662001b71565b34156200070057600080fd5b620002e662001b79565b34156200071657600080fd5b620002ce600160a060020a036004351662001b88565b34156200073857600080fd5b6200030e62001c11565b34156200074e57600080fd5b620002ce600160a060020a036004351660243562001c20565b34156200077357600080fd5b6200030e62001d0b565b34156200078957600080fd5b62000478600160a060020a036004358116906024351660443562001d1a565b3415620007b457600080fd5b620002ce600160a060020a036004358116906024351662001d2f565b3415620007dc57600080fd5b620002ce600160a060020a036004351662001d8b565b62000478600160a060020a036004351662001e1b565b34156200081457600080fd5b6200030e62001e22565b34156200082a57600080fd5b620002e662001e31565b600b5433600160a060020a039081169116146200085057600080fd5b600c54600160a060020a031662346b57838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620008a657600080fd5b6102c65a03f11515620008b857600080fd5b5050505050565b6a0771d2fa45345aa900000081565b600454600160a060020a031681565b6a01a784379d99db4200000081565b60005433600160a060020a039081169116146200090857600080fd5b600d5481106200091757600080fd5b600d8054829081106200092657fe5b600091825260209091200154600454600160a060020a03918216916374a8f103911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200098757600080fd5b6102c65a03f115156200099957600080fd5b50505050565b600c54600160a060020a031681565b6a05ca4ec2a79a7f6700000081565b6a013da329b633647180000081565b60005433600160a060020a03908116911614620009e857600080fd5b60005460a060020a900460ff16151562000a0157600080fd5b600160a060020a038216151562000a1757600080fd5b60048054600160a060020a031916600160a060020a038481169190911790915581161562000a6057600c8054600160a060020a031916600160a060020a03831617905562000af0565b600c54600160a060020a0316151562000af05769d3c21bcecceda10000006a01a784379d99db420000006a05ca4ec2a79a7f6700000062000aa06200205c565b808481526020018381526020018281526020019350505050604051809103906000f080151562000acf57600080fd5b600c8054600160a060020a031916600160a060020a03929092169190911790555b600454600160a060020a03166318160ddd6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000b3957600080fd5b6102c65a03f1151562000b4b57600080fd5b5050506040518051151590506200100d57600454600554600160a060020a039182169163827f32c0911662000bbc6a0422ca8b0a00a42500000062000baf6a0771d2fa45345aa900000081816a108b2a2c2802909400000063ffffffff62001e3f16565b9063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000c0957600080fd5b6102c65a03f1151562000c1b57600080fd5b50505060405180515050600454600c54600160a060020a039182169163827f32c0911662000c756a05ca4ec2a79a7f6700000062000baf69d3c21bcecceda10000006a01a784379d99db4200000063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000cc257600080fd5b6102c65a03f1151562000cd457600080fd5b50505060405180515050600454600054600160a060020a039182169163827f32c0911662000d1f6a013da329b63364718000006a01a784379d99db4200000063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000d6c57600080fd5b6102c65a03f1151562000d7e57600080fd5b50505060405180515050600454600a54600160a060020a039182169163827f32c091166a108b2a2c2802909400000060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000dfa57600080fd5b6102c65a03f1151562000e0c57600080fd5b50505060405180515050600454600160a060020a031663827f32c03062000e506a05606db4c03408968000006a0b949d854f34fece00000063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000e9d57600080fd5b6102c65a03f1151562000eaf57600080fd5b50505060405180515050600454600854600160a060020a039182169163827f32c0911662000f03600262000ef66a027b46536c66c8e3000000600363ffffffff62001e5616565b9063ffffffff62001e6e16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000f5057600080fd5b6102c65a03f1151562000f6257600080fd5b50505060405180515050600454600954600160a060020a039182169163827f32c0911662000fa36a027b46536c66c8e3000000600363ffffffff62001e5616565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000ff057600080fd5b6102c65a03f115156200100257600080fd5b505050604051805150505b5050565b620f424081565b60005433600160a060020a039081169116146200103457600080fd5b600160a060020a038516158015906200104d5750600083115b80156200105a5750428410155b15156200106657600080fd5b80156200111657600d8054600181016200108183826200206d565b9160005260206000209001600087876276a70062ed4e0088620010a362002099565b600160a060020a03909516855260208501939093526040808501929092526060840152901515608083015260a09091019051809103906000f0801515620010e957600080fd5b909190916101000a815481600160a060020a030219169083600160a060020a0316021790555050620011bc565b600d8054600181016200112a83826200206d565b9160005260206000209001600087876301e13380630784ce00886200114e62002099565b600160a060020a03909516855260208501939093526040808501929092526060840152901515608083015260a09091019051809103906000f08015156200119457600080fd5b909190916101000a815481600160a060020a030219169083600160a060020a03160217905550505b600d54620008b890620011d790600163ffffffff62001e9516565b8462001951565b600354600160a060020a031681565b60005433600160a060020a039081169116146200120957600080fd5b60005460a060020a900460ff1615156200122257600080fd5b6000805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b62ed4e0081565b600c54600090600160a060020a03166337a3931f8560405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515620012c957600080fd5b6102c65a03f11515620012db57600080fd5b505060005460a060020a900460ff16159050806200130a575030600160a060020a031684600160a060020a0316145b8062001327575030600160a060020a031683600160a060020a0316145b80620013405750600b54600160a060020a038581169116145b80620013595750600b54600160a060020a038481169116145b949350505050565b6276a70081565b600554600160a060020a031681565b6301e1338081565b600a5460009033600160a060020a039081169116146200139e57600080fd5b600160a060020a03821615801590620013c05750600354600160a060020a0316155b1515620013cc57600080fd5b60038054600160a060020a031916600160a060020a038481169190911790915560045416633cebb8238360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200143557600080fd5b6102c65a03f115156200144757600080fd5b5050600c54600160a060020a0316905063f2fde38b8360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200149c57600080fd5b6102c65a03f11515620014ae57600080fd5b50505030600160a060020a03163190506000811115620014fa57600160a060020a03821681156108fc0282604051600060405180830381858888f193505050501515620014fa57600080fd5b600454600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200155457600080fd5b6102c65a03f115156200156657600080fd5b505050604051805191505060008111156200100d57600454600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000ff057600080fd5b600b54600090600160a060020a0316158015906200165b5750600b54600160a060020a031663ecb70fb76000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200163d57600080fd5b6102c65a03f115156200164f57600080fd5b50505060405180519050155b8015620016c95750600b54600160a060020a03166344691f7e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620016ac57600080fd5b6102c65a03f11515620016be57600080fd5b505050604051805190505b90505b90565b60005460a060020a900460ff1681565b6a05606db4c034089680000081565b600d805482908110620016fd57fe5b600091825260209091200154600160a060020a0316905081565b6a108b2a2c2802909400000081565b600d5490565b600a54600160a060020a031681565b60005433600160a060020a039081169116146200175757600080fd5b60005460a060020a900460ff16156200176f57600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6103e881565b6a0b949d854f34fece00000081565b600054600160a060020a031681565b670de0b6b3a764000081565b600b5433600160a060020a039081169116146200180d57600080fd5b600c54600160a060020a03166393a378da838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620008a657600080fd5b600b54600160a060020a031681565b600a5433600160a060020a039081169116146200188f57600080fd5b30600160a060020a031682600160a060020a03161480620018bd5750600554600160a060020a038381169116145b1515620018c957600080fd5b600454600160a060020a031663d3ce77fe838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200192957600080fd5b6102c65a03f115156200193b57600080fd5b5050506040518051905015156200100d57600080fd5b60005433600160a060020a039081169116146200196d57600080fd5b600d54821080156200197f5750600081115b801562001a075750600d8054839081106200199657fe5b6000918252602082200154600160a060020a03169063be9a655590604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620019e757600080fd5b6102c65a03f11515620019f957600080fd5b505050604051805190504211155b151562001a1357600080fd5b600454600d8054600160a060020a039092169163a9059cbb91908590811062001a3857fe5b6000918252602082200154600160a060020a03169084906040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200192957600080fd5b600754600160a060020a031681565b6a0422ca8b0a00a42500000081565b600a5433600160a060020a0390811691161462001ad457600080fd5b600160a060020a038116151562001aea57600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055565b600b5433600160a060020a0390811691161462001b2857600080fd5b600c54600160a060020a031663b0e9a1ef8260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b15156200098757600080fd5b630784ce0081565b6a027b46536c66c8e300000081565b60005433600160a060020a0390811691161462001ba457600080fd5b600454600160a060020a038281169116141562001bc057600080fd5b600454600160a060020a031663df8de3e78260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200098757600080fd5b600954600160a060020a031681565b60005433600160a060020a0390811691161462001c3c57600080fd5b600160a060020a0382161580159062001c5c575062001c5a620015db565b155b801562001c735750600454600160a060020a031615155b151562001c7f57600080fd5b600b8054600160a060020a031916600160a060020a0384811691909117909155600454600554908216916323b872dd9116848460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156200192957600080fd5b600654600160a060020a031681565b505060005460a060020a900460ff1615919050565b60005433600160a060020a0390811691161462001d4b57600080fd5b600354600160a060020a031615158062001d735750600454600160a060020a03838116911614155b151562001d7f57600080fd5b6200100d828262001ea8565b60005433600160a060020a0390811691161462001da757600080fd5b600160a060020a038116151562001dbd57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008054600160a060020a031916600160a060020a0392909216919091179055565b6000806000fd5b600854600160a060020a031681565b69d3c21bcecceda100000081565b60008282018381101562001e4f57fe5b9392505050565b600080828481151562001e6557fe5b04949350505050565b600082820283158062001e8c575082848281151562001e8957fe5b04145b151562001e4f57fe5b60008282111562001ea257fe5b50900390565b60008054819033600160a060020a0390811691161462001ec757600080fd5b600160a060020a038416151562001f1c5782600160a060020a03166108fc30600160a060020a0316319081150290604051600060405180830381858888f19350505050151562001f1657600080fd5b62000999565b83915081600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001f7757600080fd5b6102c65a03f1151562001f8957600080fd5b5050506040518051915050600160a060020a03821663a9059cbb848360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562001ff257600080fd5b6102c65a03f115156200200457600080fd5b505050604051805190505082600160a060020a031684600160a060020a03167f21e9b296e283cad208b551b3c383bb74e34086eb5691fee8392dcce6794521c28360405190815260200160405180910390a350505050565b60405161101580620020cc83390190565b815481835581811511620020945760008381526020902062002094918101908301620020aa565b505050565b60405161090f80620030e183390190565b620016cc91905b80821115620020c75760008155600101620020b1565b509056006060604052341561000f57600080fd5b60405160608061101583398101604052808051919060200180519190602001805160008054600160a060020a033316600160a060020a0319909116179055600b949094555050600c55600d55610fab8061006a6000396000f3006060604052600436106101235763ffffffff60e060020a600035041662346b57811461012857806304c80c3c1461014c5780630d92e3e8146101715780630eb6f5431461018457806326c43d8f1461019757806328262dd1146101aa57806337a3931f146101bd57806342ef4c1a146101dc5780634a48314f146101ef5780634b86faba14610202578063685a73e0146102155780638da5cb5b1461023357806391e79c721461026257806393a378da14610275578063b0e9a1ef14610297578063b40d8d58146102ad578063be2b1047146102c0578063c899fa77146102d3578063d228cfc5146102e6578063d43a0b4c14610305578063d6192c6c14610318578063e2c208361461036e578063f2fde38b14610381578063fbd7d081146103a0575b600080fd5b341561013357600080fd5b61014a600160a060020a03600435166024356103b3565b005b341561015757600080fd5b61015f6105cc565b60405190815260200160405180910390f35b341561017c57600080fd5b61015f6105d2565b341561018f57600080fd5b61015f6105d8565b34156101a257600080fd5b61015f6105de565b34156101b557600080fd5b61015f6105e4565b34156101c857600080fd5b61014a600160a060020a03600435166105ea565b34156101e757600080fd5b61015f6106b1565b34156101fa57600080fd5b61015f6106b7565b341561020d57600080fd5b61014a6106bd565b341561022057600080fd5b61014a60048035602481019101356106c8565b341561023e57600080fd5b6102466106ff565b604051600160a060020a03909116815260200160405180910390f35b341561026d57600080fd5b61015f61070e565b341561028057600080fd5b61014a600160a060020a0360043516602435610714565b34156102a257600080fd5b61014a600435610848565b34156102b857600080fd5b61015f61090f565b34156102cb57600080fd5b61015f610915565b34156102de57600080fd5b61015f61091b565b34156102f157600080fd5b61014a600160a060020a0360043516610921565b341561031057600080fd5b61015f610cc6565b341561032357600080fd5b610337600160a060020a0360043516610ccc565b60405194855292151560208501529015156040808501919091529015156060840152901515608083015260a0909101905180910390f35b341561037957600080fd5b61015f610d04565b341561038c57600080fd5b61014a600160a060020a0360043516610e7b565b34156103ab57600080fd5b61015f610f16565b6000805433600160a060020a039081169116146103cf57600080fd5b60075415806103e057506007544211155b156105c757600160a060020a0383166000908152600160205260409020548214806104125750600160a060020a038316155b1561041c576105c7565b600160a060020a0383166000908152600160205260409020541580156104425750600082115b156104635760035461045b90600163ffffffff610f1c16565b6003556104a4565b600160a060020a038316600090815260016020526040812054118015610487575081155b156104a4576003546104a090600163ffffffff610f3216565b6003555b600160a060020a03831660009081526001602052604090205482116104f157600160a060020a0383166000908152600160205260409020546104ec908363ffffffff610f3216565b61051b565b600160a060020a03831660009081526001602052604090205461051b90839063ffffffff610f3216565b600160a060020a03841660009081526001602052604090205490915082111561055957600254610551908263ffffffff610f1c16565b600255610570565b60025461056c908263ffffffff610f3216565b6002555b600160a060020a038084166000818152600160205260409081902085905590913316907f531b6d98182f354ef73d680007a0fa84a81fa4a320e289e4f826150ad104fb1a9085905190815260200160405180910390a35b505050565b600c5481565b600e5481565b60055481565b60035481565b600d5481565b60005433600160a060020a0390811691161461060557600080fd5b600160a060020a0381166000908152600160205260408120541180156106485750600160a060020a0381166000908152600160208190526040909120015460ff16155b156106a557600160a060020a0381166000908152600160208190526040909120808201805460ff19169092179091555460025461068a9163ffffffff610f3216565b6002556003546106a190600163ffffffff610f3216565b6003555b6106ad610d04565b5050565b60095481565b60085481565b6106c633610921565b565b60005b818110156105c7576106f78383838181106106e257fe5b90506020020135600160a060020a0316610921565b6001016106cb565b600054600160a060020a031681565b60025481565b60005433600160a060020a0390811691161461072f57600080fd5b600754158061074057506007544211155b156106ad578015806107595750600160a060020a038216155b15610763576106ad565b600160a060020a038216600090815260016020526040902054151561079a5760035461079690600163ffffffff610f1c16565b6003555b600160a060020a0382166000908152600160205260409020546107c3908263ffffffff610f1c16565b600160a060020a0383166000908152600160205260409020556002546107ef908263ffffffff610f1c16565b600255600160a060020a03808316600081815260016020526040908190205491923316917f531b6d98182f354ef73d680007a0fa84a81fa4a320e289e4f826150ad104fb1a915190815260200160405180910390a35050565b60005433600160a060020a0390811691161461086357600080fd5b600754158061087457506007544211155b1561090c574281101561088657600080fd5b600781905561089e816276a70063ffffffff610f1c16565b6008556108b48162ed4e0063ffffffff610f1c16565b6009556108cb81630163f50063ffffffff610f1c16565b600a55600160a060020a0333167fc7ad31b0c99a40aa43822fbc49a68cf7f3eb3d52152a5c01a7f636e4481cf43f8260405190815260200160405180910390a25b50565b600a5481565b60075481565b60045481565b600160a060020a03811660009081526001602052604081205481901180156109665750600160a060020a0382166000908152600160208190526040909120015460ff16155b151561097157600080fd5b50600061097c610d04565b50600160a060020a03821660009081526001602081905260409091200154610100900460ff161580156109b157506008544210155b15610a3357600454600b54600160a060020a038416600090815260016020526040902054610a07926109fa9290916109ee9163ffffffff610f4416565b9063ffffffff610f6816565b829063ffffffff610f1c16565b600160a060020a038316600090815260016020819052604090912001805461ff00191661010017905590505b600160a060020a0382166000908152600160208190526040909120015462010000900460ff16158015610a6857506009544210155b15610ad357600554600c54600160a060020a038416600090815260016020526040902054610aa5926109fa9290916109ee9163ffffffff610f4416565b600160a060020a038316600090815260016020819052604090912001805462ff000019166201000017905590505b600160a060020a038216600090815260016020819052604090912001546301000000900460ff16158015610b095750600a544210155b15610b7657600654600d54600160a060020a038416600090815260016020526040902054610b46926109fa9290916109ee9163ffffffff610f4416565b600160a060020a038316600090815260016020819052604090912001805463ff0000001916630100000017905590505b60008111156106ad57600e54610b92908263ffffffff610f1c16565b600e5560008054600160a060020a0316906303d756cb90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610bde57600080fd5b6102c65a03f11515610bef57600080fd5b50505060405180519050600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610c5557600080fd5b6102c65a03f11515610c6657600080fd5b505050604051805190501515610c7b57600080fd5b81600160a060020a031633600160a060020a03167fd06980f1b54006ca63e8ddd2f4dafe76e8bcd6e7d7f333296f778781626af4268360405190815260200160405180910390a35050565b60065481565b6001602081905260009182526040909120805491015460ff808216916101008104821691620100008204811691630100000090041685565b60006008544210158015610d185750600454155b15610d24576002546004555b6009544210158015610d365750600554155b15610d42576002546005555b600a544210158015610d545750600654155b15610e7457600254600655600e54600c54600b5460008054610e709493610e64939092610e5892600160a060020a0316906303d756cb90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610dc057600080fd5b6102c65a03f11515610dd157600080fd5b50505060405180519050600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610e3157600080fd5b6102c65a03f11515610e4257600080fd5b505050604051805191905063ffffffff610f3216565b9063ffffffff610f3216565b9063ffffffff610f1c16565b600d555b5060025490565b60005433600160a060020a03908116911614610e9657600080fd5b600160a060020a0381161515610eab57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600b5481565b600082820183811015610f2b57fe5b9392505050565b600082821115610f3e57fe5b50900390565b6000828202831580610f605750828482811515610f5d57fe5b04145b1515610f2b57fe5b6000808284811515610f7657fe5b049493505050505600a165627a7a72305820b13878352c4505507a0469068cef25077583c2b2fd96737ede4cf449af3c69b800296060604052341561000f57600080fd5b60405160a08061090f833981016040528080519190602001805191906020018051919060200180519190602001805160008054600160a060020a03191633600160a060020a039081169190911790915590925086161515905061007157600080fd5b8183111561007e57600080fd5b60018054600160a060020a031916600160a060020a0387161790556005805460ff191682151517905560048290556100c384846401000000006100d2810261079b1704565b600255505050600355506100e8565b6000828201838110156100e157fe5b9392505050565b610818806100f76000396000f3006060604052600436106100ab5763ffffffff60e060020a6000350416630fb5a6b481146100b057806313d033c0146100d55780631726cbc8146100e85780631916558714610107578063384711cc1461012857806338af3eed1461014757806374a8f10314610176578063872a7810146101955780638da5cb5b146101bc5780639852595c146101cf578063be9a6555146101ee578063f2fde38b14610201578063fa01dc0614610220575b600080fd5b34156100bb57600080fd5b6100c361023f565b60405190815260200160405180910390f35b34156100e057600080fd5b6100c3610245565b34156100f357600080fd5b6100c3600160a060020a036004351661024b565b341561011257600080fd5b610126600160a060020a0360043516610283565b005b341561013357600080fd5b6100c3600160a060020a036004351661039c565b341561015257600080fd5b61015a6104dd565b604051600160a060020a03909116815260200160405180910390f35b341561018157600080fd5b610126600160a060020a03600435166104ec565b34156101a057600080fd5b6101a86106a9565b604051901515815260200160405180910390f35b34156101c757600080fd5b61015a6106b2565b34156101da57600080fd5b6100c3600160a060020a03600435166106c1565b34156101f957600080fd5b6100c36106d3565b341561020c57600080fd5b610126600160a060020a03600435166106d9565b341561022b57600080fd5b6101a8600160a060020a0360043516610774565b60045481565b60025481565b600160a060020a03811660009081526006602052604081205461027d906102718461039c565b9063ffffffff61078916565b92915050565b600061028e8261024b565b90506000811161029d57600080fd5b600160a060020a0382166000908152600660205260409020546102c6908263ffffffff61079b16565b600160a060020a0380841660008181526006602052604080822094909455600154919363a9059cbb939290921691859190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561033f57600080fd5b6102c65a03f1151561035057600080fd5b50505060405180519050151561036557600080fd5b7ffb81f9b30d73d830c3544b34d827c08142579ee75710b490bab0b3995468c5658160405190815260200160405180910390a15050565b600080600083600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156103f857600080fd5b6102c65a03f1151561040957600080fd5b5050506040518051600160a060020a03861660009081526006602052604090205490935061043f9150839063ffffffff61079b16565b905060025442101561045457600092506104d6565b6004546003546104699163ffffffff61079b16565b4210158061048f5750600160a060020a03841660009081526007602052604090205460ff165b1561049c578092506104d6565b6104d36004546104c76104ba6003544261078990919063ffffffff16565b849063ffffffff6107b116565b9063ffffffff6107d516565b92505b5050919050565b600154600160a060020a031681565b600080548190819033600160a060020a0390811691161461050c57600080fd5b60055460ff16151561051d57600080fd5b600160a060020a03841660009081526007602052604090205460ff161561054357600080fd5b83600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561059a57600080fd5b6102c65a03f115156105ab57600080fd5b5050506040518051905092506105c08461024b565b91506105d2838363ffffffff61078916565b600160a060020a03808616600081815260076020526040808220805460ff191660011790558154949550919363a9059cbb931691859190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561065157600080fd5b6102c65a03f1151561066257600080fd5b50505060405180519050151561067757600080fd5b7f44825a4b2df8acb19ce4e1afba9aa850c8b65cdb7942e2078f27d0b0960efee660405160405180910390a150505050565b60055460ff1681565b600054600160a060020a031681565b60066020526000908152604090205481565b60035481565b60005433600160a060020a039081169116146106f457600080fd5b600160a060020a038116151561070957600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60076020526000908152604090205460ff1681565b60008282111561079557fe5b50900390565b6000828201838110156107aa57fe5b9392505050565b60008282028315806107cd57508284828115156107ca57fe5b04145b15156107aa57fe5b60008082848115156107e357fe5b049493505050505600a165627a7a7230582009649e1f374e51bd346858160f9ce8785feb3bfeb10e4f09b72214fac4485c0e0029a165627a7a7230582092a1f27c76560e9a5c435886caece0a86173198ab75681be3e0196811ebb45d30029