More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,465 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Complete Crowdsa... | 5448137 | 2294 days ago | IN | 0 ETH | 0.00003973 | ||||
Unpause Crowdsal... | 5448122 | 2294 days ago | IN | 0 ETH | 0.00002797 | ||||
Pause Crowdsale | 5408582 | 2301 days ago | IN | 0 ETH | 0.00014141 | ||||
Remove Whitelist... | 5330615 | 2314 days ago | IN | 0 ETH | 0.00013155 | ||||
Remove Whitelist... | 5330613 | 2314 days ago | IN | 0 ETH | 0.00013155 | ||||
Remove Whitelist... | 5330506 | 2314 days ago | IN | 0 ETH | 0.00009866 | ||||
Remove Whitelist... | 5330506 | 2314 days ago | IN | 0 ETH | 0.00013142 | ||||
Remove Whitelist... | 5330498 | 2314 days ago | IN | 0 ETH | 0.00013155 | ||||
Remove Whitelist... | 5330491 | 2314 days ago | IN | 0 ETH | 0.00009866 | ||||
Remove Whitelist... | 5330436 | 2314 days ago | IN | 0 ETH | 0.00013155 | ||||
Transfer | 5330387 | 2314 days ago | IN | 0.11 ETH | 0.00018255 | ||||
Set Whitelist Ad... | 5330329 | 2314 days ago | IN | 0 ETH | 0.00021367 | ||||
Set Rate | 5286705 | 2321 days ago | IN | 0 ETH | 0.00002727 | ||||
Set Rate | 5286580 | 2321 days ago | IN | 0 ETH | 0.00022072 | ||||
Set Rate | 5286455 | 2321 days ago | IN | 0 ETH | 0.0001091 | ||||
Set Rate | 5286339 | 2321 days ago | IN | 0 ETH | 0.0001091 | ||||
Set Rate | 5286208 | 2321 days ago | IN | 0 ETH | 0.0001091 | ||||
Set Rate | 5286080 | 2321 days ago | IN | 0 ETH | 0.0001091 | ||||
Set Rate | 5285950 | 2321 days ago | IN | 0 ETH | 0.0001091 | ||||
Set Rate | 5285852 | 2321 days ago | IN | 0 ETH | 0.00005455 | ||||
Set Rate | 5285716 | 2321 days ago | IN | 0 ETH | 0.00008182 | ||||
Set Rate | 5285582 | 2321 days ago | IN | 0 ETH | 0.00016365 | ||||
Set Rate | 5285461 | 2321 days ago | IN | 0 ETH | 0.00008455 | ||||
Set Rate | 5285315 | 2321 days ago | IN | 0 ETH | 0.0001091 | ||||
Set Rate | 5285201 | 2321 days ago | IN | 0 ETH | 0.0001091 |
Latest 8 internal transactions
Advanced mode:
Loading...
Loading
Contract Name:
ViolaCrowdsale
Compiler Version
v0.4.20+commit.3155dd80
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-03-13 */ pragma solidity 0.4.20; library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } // ---------------------------------------------------------------------------- // ERC Token Standard #20 Interface // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md // ---------------------------------------------------------------------------- contract ERC20Interface { function totalSupply() public view returns (uint256); 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 Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); event Burn(address indexed burner, uint256 value); } // ---------------------------------------------------------------------------- // VIOLET ERC20 Standard Token // ---------------------------------------------------------------------------- contract VLTToken is ERC20Interface { using SafeMath for uint256; address public owner = msg.sender; bytes32 public symbol; bytes32 public name; uint8 public decimals; uint256 public _totalSupply; mapping(address => uint256) internal balances; mapping(address => mapping (address => uint256)) internal allowed; modifier onlyOwner() { require(msg.sender == owner); _; } // ------------------------------------------------------------------------ // Constructor // ------------------------------------------------------------------------ function VLTToken() public { symbol = "VAI"; name = "VIOLET"; decimals = 18; _totalSupply = 250000000 * 10**uint256(decimals); balances[owner] = _totalSupply; Transfer(address(0), owner, _totalSupply); } /** * @dev total number of tokens in existence */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; } /** * @dev transfer token for a specified address * @param _to The address to transfer to. * @param _value The amount to be transferred. */ function transfer(address _to, uint256 _value) public returns (bool) { // allow sending 0 tokens if (_value == 0) { Transfer(msg.sender, _to, _value); // Follow the spec to louch the event when transfer 0 return; } require(_to != address(0)); require(_value <= balances[msg.sender]); // SafeMath.sub will throw if there is not enough balance. balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); Transfer(msg.sender, _to, _value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ function approve(address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; Approval(msg.sender, _spender, _value); return true; } /** * @dev Transfer tokens from one address to another * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { // allow sending 0 tokens if (_value == 0) { Transfer(_from, _to, _value); // Follow the spec to louch the event when transfer 0 return; } require(_to != address(0)); require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); Transfer(_from, _to, _value); return true; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param _spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address _owner, address _spender) public view returns (uint256) { return allowed[_owner][_spender]; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * * approve should be called when allowed[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _addedValue The amount of tokens to increase the allowance by. */ function increaseApproval(address _spender, uint _addedValue) public returns (bool) { allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * * approve should be called when allowed[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) { uint oldValue = allowed[msg.sender][_spender]; if (_subtractedValue > oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * @dev Burns a specific amount of tokens. * @param _value The amount of token to be burned. */ function burn(uint256 _value) public { require(_value <= balances[msg.sender]); // no need to require value <= totalSupply, since that would imply the // sender's balance is greater than the totalSupply, which *should* be an assertion failure address burner = msg.sender; balances[burner] = balances[burner].sub(_value); _totalSupply = _totalSupply.sub(_value); Burn(burner, _value); Transfer(burner, address(0), _value); } /** * Destroy tokens from other account * Remove `_value` tokens from the system irreversibly on behalf of `_from`. * @param _from the address of the sender * @param _value the amount of money to burn */ function burnFrom(address _from, uint256 _value) public returns (bool) { require(_value <= balances[_from]); // Check if the targeted balance is enough require(_value <= allowed[_from][msg.sender]); // Check allowed allowance balances[_from] = balances[_from].sub(_value); // Subtract from the targeted balance allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); // Subtract from the sender's allowance _totalSupply = _totalSupply.sub(_value); // Update totalSupply Burn(_from, _value); Transfer(_from, address(0), _value); return true; } // ------------------------------------------------------------------------ // Owner can transfer out any accidentally sent ERC20 tokens // ------------------------------------------------------------------------ function transferAnyERC20Token(address tokenAddress, uint tokens) public onlyOwner returns (bool success) { return ERC20Interface(tokenAddress).transfer(owner, tokens); } } contract ERC20Basic { uint256 public totalSupply; function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } contract ERC20 is ERC20Basic { 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 Approval(address indexed owner, address indexed spender, uint256 value); } 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() public { 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) public onlyOwner { require(newOwner != address(0)); OwnershipTransferred(owner, newOwner); owner = newOwner; } } /** * @title ViolaCrowdsale * @dev ViolaCrowdsale reserves token from supply when eth is received * funds will be forwarded after the end of crowdsale. Tokens will be claimable * within 7 days after crowdsale ends. */ contract ViolaCrowdsale is Ownable { using SafeMath for uint256; enum State { Deployed, PendingStart, Active, Paused, Ended, Completed } //Status of contract State public status = State.Deployed; // The token being sold VLTToken public violaToken; //For keeping track of whitelist address. cap >0 = whitelisted mapping(address=>uint) public maxBuyCap; //For checking if address passed KYC mapping(address => bool)public addressKYC; //Total wei sum an address has invested mapping(address=>uint) public investedSum; //Total violaToken an address is allocated mapping(address=>uint) public tokensAllocated; //Total violaToken an address purchased externally is allocated mapping(address=>uint) public externalTokensAllocated; //Total bonus violaToken an address is entitled after vesting mapping(address=>uint) public bonusTokensAllocated; //Total bonus violaToken an address purchased externally is entitled after vesting mapping(address=>uint) public externalBonusTokensAllocated; //Store addresses that has registered for crowdsale before (pushed via setWhitelist) //Does not mean whitelisted as it can be revoked. Just to track address for loop address[] public registeredAddress; //Total amount not approved for withdrawal uint256 public totalApprovedAmount = 0; //Start and end timestamps where investments are allowed (both inclusive) uint256 public startTime; uint256 public endTime; uint256 public bonusVestingPeriod = 60 days; /** * Note all values are calculated in wei(uint256) including token amount * 1 ether = 1000000000000000000 wei * 1 viola = 1000000000000000000 vi lawei */ //Address where funds are collected address public wallet; //Min amount investor can purchase uint256 public minWeiToPurchase; // how many token units *in wei* a buyer gets *per wei* uint256 public rate; //Extra bonus token to give *in percentage* uint public bonusTokenRateLevelOne = 20; uint public bonusTokenRateLevelTwo = 15; uint public bonusTokenRateLevelThree = 10; uint public bonusTokenRateLevelFour = 0; //Total amount of tokens allocated for crowdsale uint256 public totalTokensAllocated; //Total amount of tokens reserved from external sources //Sub set of totalTokensAllocated ( totalTokensAllocated - totalReservedTokenAllocated = total tokens allocated for purchases using ether ) uint256 public totalReservedTokenAllocated; //Numbers of token left above 0 to still be considered sold uint256 public leftoverTokensBuffer; /** * event for front end logging */ event TokenPurchase(address indexed purchaser, uint256 value, uint256 amount, uint256 bonusAmount); event ExternalTokenPurchase(address indexed purchaser, uint256 amount, uint256 bonusAmount); event ExternalPurchaseRefunded(address indexed purchaser, uint256 amount, uint256 bonusAmount); event TokenDistributed(address indexed tokenReceiver, uint256 tokenAmount); event BonusTokenDistributed(address indexed tokenReceiver, uint256 tokenAmount); event TopupTokenAllocated(address indexed tokenReceiver, uint256 amount, uint256 bonusAmount); event CrowdsalePending(); event CrowdsaleStarted(); event CrowdsaleEnded(); event BonusRateChanged(); event Refunded(address indexed beneficiary, uint256 weiAmount); //Set inital arguments of the crowdsale function initialiseCrowdsale (uint256 _startTime, uint256 _rate, address _tokenAddress, address _wallet) onlyOwner external { require(status == State.Deployed); require(_startTime >= now); require(_rate > 0); require(address(_tokenAddress) != address(0)); require(_wallet != address(0)); startTime = _startTime; endTime = _startTime + 30 days; rate = _rate; wallet = _wallet; violaToken = VLTToken(_tokenAddress); status = State.PendingStart; CrowdsalePending(); } /** * Crowdsale state functions * To track state of current crowdsale */ // To be called by Ethereum alarm clock or anyone //Can only be called successfully when time is valid function startCrowdsale() external { require(withinPeriod()); require(violaToken != address(0)); require(getTokensLeft() > 0); require(status == State.PendingStart); status = State.Active; CrowdsaleStarted(); } //To be called by owner or contract //Ends the crowdsale when tokens are sold out function endCrowdsale() public { if (!tokensHasSoldOut()) { require(msg.sender == owner); } require(status == State.Active); bonusVestingPeriod = now + 60 days; status = State.Ended; CrowdsaleEnded(); } //Emergency pause function pauseCrowdsale() onlyOwner external { require(status == State.Active); status = State.Paused; } //Resume paused crowdsale function unpauseCrowdsale() onlyOwner external { require(status == State.Paused); status = State.Active; } function completeCrowdsale() onlyOwner external { require(hasEnded()); require(violaToken.allowance(owner, this) == 0); status = State.Completed; _forwardFunds(); assert(this.balance == 0); } function burnExtraTokens() onlyOwner external { require(hasEnded()); uint256 extraTokensToBurn = violaToken.allowance(owner, this); violaToken.burnFrom(owner, extraTokensToBurn); assert(violaToken.allowance(owner, this) == 0); } // send ether to the fund collection wallet function _forwardFunds() internal { wallet.transfer(this.balance); } function partialForwardFunds(uint _amountToTransfer) onlyOwner external { require(status == State.Ended); require(_amountToTransfer < totalApprovedAmount); totalApprovedAmount = totalApprovedAmount.sub(_amountToTransfer); wallet.transfer(_amountToTransfer); } /** * Setter functions for crowdsale parameters * Only owner can set values */ function setLeftoverTokensBuffer(uint256 _tokenBuffer) onlyOwner external { require(_tokenBuffer > 0); require(getTokensLeft() >= _tokenBuffer); leftoverTokensBuffer = _tokenBuffer; } //Set the ether to token rate function setRate(uint _rate) onlyOwner external { require(_rate > 0); rate = _rate; } function setBonusTokenRateLevelOne(uint _rate) onlyOwner external { //require(_rate > 0); bonusTokenRateLevelOne = _rate; BonusRateChanged(); } function setBonusTokenRateLevelTwo(uint _rate) onlyOwner external { //require(_rate > 0); bonusTokenRateLevelTwo = _rate; BonusRateChanged(); } function setBonusTokenRateLevelThree(uint _rate) onlyOwner external { //require(_rate > 0); bonusTokenRateLevelThree = _rate; BonusRateChanged(); } function setBonusTokenRateLevelFour(uint _rate) onlyOwner external { //require(_rate > 0); bonusTokenRateLevelFour = _rate; BonusRateChanged(); } function setMinWeiToPurchase(uint _minWeiToPurchase) onlyOwner external { minWeiToPurchase = _minWeiToPurchase; } /** * Whitelisting and KYC functions * Whitelisted address can buy tokens, KYC successful purchaser can claim token. Refund if fail KYC */ //Set the amount of wei an address can purchase up to //@dev Value of 0 = not whitelisted //@dev cap is in *18 decimals* ( 1 token = 1*10^18) function setWhitelistAddress( address _investor, uint _cap ) onlyOwner external { require(_cap > 0); require(_investor != address(0)); maxBuyCap[_investor] = _cap; registeredAddress.push(_investor); //add event } //Remove the address from whitelist function removeWhitelistAddress(address _investor) onlyOwner external { require(_investor != address(0)); maxBuyCap[_investor] = 0; uint256 weiAmount = investedSum[_investor]; if (weiAmount > 0) { _refund(_investor); } } //Flag address as KYC approved. Address is now approved to claim tokens function approveKYC(address _kycAddress) onlyOwner external { require(_kycAddress != address(0)); addressKYC[_kycAddress] = true; uint256 weiAmount = investedSum[_kycAddress]; totalApprovedAmount = totalApprovedAmount.add(weiAmount); } //Set KYC status as failed. Refund any eth back to address function revokeKYC(address _kycAddress) onlyOwner external { require(_kycAddress != address(0)); addressKYC[_kycAddress] = false; uint256 weiAmount = investedSum[_kycAddress]; totalApprovedAmount = totalApprovedAmount.sub(weiAmount); if (weiAmount > 0) { _refund(_kycAddress); } } /** * Getter functions for crowdsale parameters * Does not use gas */ //Checks if token has been sold out function tokensHasSoldOut() view internal returns (bool) { if (getTokensLeft() <= leftoverTokensBuffer) { return true; } else { return false; } } // @return true if the transaction can buy tokens function withinPeriod() public view returns (bool) { return now >= startTime && now <= endTime; } // @return true if crowdsale event has ended function hasEnded() public view returns (bool) { if (status == State.Ended) { return true; } return now > endTime; } function getTokensLeft() public view returns (uint) { return violaToken.allowance(owner, this).sub(totalTokensAllocated); } function transferTokens (address receiver, uint tokenAmount) internal { require(violaToken.transferFrom(owner, receiver, tokenAmount)); } function getTimeBasedBonusRate() public view returns(uint) { bool bonusDuration1 = now >= startTime && now <= (startTime + 1 days); //First 24hr bool bonusDuration2 = now > (startTime + 1 days) && now <= (startTime + 3 days);//Next 48 hr bool bonusDuration3 = now > (startTime + 3 days) && now <= (startTime + 10 days);//4th to 10th day bool bonusDuration4 = now > (startTime + 10 days) && now <= endTime;//11th day onwards if (bonusDuration1) { return bonusTokenRateLevelOne; } else if (bonusDuration2) { return bonusTokenRateLevelTwo; } else if (bonusDuration3) { return bonusTokenRateLevelThree; } else if (bonusDuration4) { return bonusTokenRateLevelFour; } else { return 0; } } function getTotalTokensByAddress(address _investor) public view returns(uint) { return getTotalNormalTokensByAddress(_investor).add(getTotalBonusTokensByAddress(_investor)); } function getTotalNormalTokensByAddress(address _investor) public view returns(uint) { return tokensAllocated[_investor].add(externalTokensAllocated[_investor]); } function getTotalBonusTokensByAddress(address _investor) public view returns(uint) { return bonusTokensAllocated[_investor].add(externalBonusTokensAllocated[_investor]); } function _clearTotalNormalTokensByAddress(address _investor) internal { tokensAllocated[_investor] = 0; externalTokensAllocated[_investor] = 0; } function _clearTotalBonusTokensByAddress(address _investor) internal { bonusTokensAllocated[_investor] = 0; externalBonusTokensAllocated[_investor] = 0; } /** * Functions to handle buy tokens * Fallback function as entry point for eth */ // Called when ether is sent to contract function () external payable { buyTokens(msg.sender); } //Used to buy tokens function buyTokens(address investor) internal { require(status == State.Active); require(msg.value >= minWeiToPurchase); uint weiAmount = msg.value; checkCapAndRecord(investor,weiAmount); allocateToken(investor,weiAmount); } //Internal call to check max user cap function checkCapAndRecord(address investor, uint weiAmount) internal { uint remaindingCap = maxBuyCap[investor]; require(remaindingCap >= weiAmount); maxBuyCap[investor] = remaindingCap.sub(weiAmount); investedSum[investor] = investedSum[investor].add(weiAmount); } //Internal call to allocated tokens purchased function allocateToken(address investor, uint weiAmount) internal { // calculate token amount to be created uint tokens = weiAmount.mul(rate); uint bonusTokens = tokens.mul(getTimeBasedBonusRate()).div(100); uint tokensToAllocate = tokens.add(bonusTokens); require(getTokensLeft() >= tokensToAllocate); totalTokensAllocated = totalTokensAllocated.add(tokensToAllocate); tokensAllocated[investor] = tokensAllocated[investor].add(tokens); bonusTokensAllocated[investor] = bonusTokensAllocated[investor].add(bonusTokens); if (tokensHasSoldOut()) { endCrowdsale(); } TokenPurchase(investor, weiAmount, tokens, bonusTokens); } /** * Functions for refunds & claim tokens * */ //Refund users in case of unsuccessful crowdsale function _refund(address _investor) internal { uint256 investedAmt = investedSum[_investor]; require(investedAmt > 0); uint totalInvestorTokens = tokensAllocated[_investor].add(bonusTokensAllocated[_investor]); if (status == State.Active) { //Refunded tokens go back to sale pool totalTokensAllocated = totalTokensAllocated.sub(totalInvestorTokens); } _clearAddressFromCrowdsale(_investor); _investor.transfer(investedAmt); Refunded(_investor, investedAmt); } //Partial refund users function refundPartial(address _investor, uint _refundAmt, uint _tokenAmt, uint _bonusTokenAmt) onlyOwner external { uint investedAmt = investedSum[_investor]; require(investedAmt > _refundAmt); require(tokensAllocated[_investor] > _tokenAmt); require(bonusTokensAllocated[_investor] > _bonusTokenAmt); investedSum[_investor] = investedSum[_investor].sub(_refundAmt); tokensAllocated[_investor] = tokensAllocated[_investor].sub(_tokenAmt); bonusTokensAllocated[_investor] = bonusTokensAllocated[_investor].sub(_bonusTokenAmt); uint totalRefundTokens = _tokenAmt.add(_bonusTokenAmt); if (status == State.Active) { //Refunded tokens go back to sale pool totalTokensAllocated = totalTokensAllocated.sub(totalRefundTokens); } _investor.transfer(_refundAmt); Refunded(_investor, _refundAmt); } //Used by investor to claim token function claimTokens() external { require(hasEnded()); require(addressKYC[msg.sender]); address tokenReceiver = msg.sender; uint tokensToClaim = getTotalNormalTokensByAddress(tokenReceiver); require(tokensToClaim > 0); _clearTotalNormalTokensByAddress(tokenReceiver); violaToken.transferFrom(owner, tokenReceiver, tokensToClaim); TokenDistributed(tokenReceiver, tokensToClaim); } //Used by investor to claim bonus token function claimBonusTokens() external { require(hasEnded()); require(now >= bonusVestingPeriod); require(addressKYC[msg.sender]); address tokenReceiver = msg.sender; uint tokensToClaim = getTotalBonusTokensByAddress(tokenReceiver); require(tokensToClaim > 0); _clearTotalBonusTokensByAddress(tokenReceiver); violaToken.transferFrom(owner, tokenReceiver, tokensToClaim); BonusTokenDistributed(tokenReceiver, tokensToClaim); } //Used by owner to distribute bonus token function distributeBonusTokens(address _tokenReceiver) onlyOwner external { require(hasEnded()); require(now >= bonusVestingPeriod); address tokenReceiver = _tokenReceiver; uint tokensToClaim = getTotalBonusTokensByAddress(tokenReceiver); require(tokensToClaim > 0); _clearTotalBonusTokensByAddress(tokenReceiver); transferTokens(tokenReceiver, tokensToClaim); BonusTokenDistributed(tokenReceiver,tokensToClaim); } //Used by owner to distribute token function distributeICOTokens(address _tokenReceiver) onlyOwner external { require(hasEnded()); address tokenReceiver = _tokenReceiver; uint tokensToClaim = getTotalNormalTokensByAddress(tokenReceiver); require(tokensToClaim > 0); _clearTotalNormalTokensByAddress(tokenReceiver); transferTokens(tokenReceiver, tokensToClaim); TokenDistributed(tokenReceiver,tokensToClaim); } //For owner to reserve token for presale // function reserveTokens(uint _amount) onlyOwner external { // require(getTokensLeft() >= _amount); // totalTokensAllocated = totalTokensAllocated.add(_amount); // totalReservedTokenAllocated = totalReservedTokenAllocated.add(_amount); // } // //To distribute tokens not allocated by crowdsale contract // function distributePresaleTokens(address _tokenReceiver, uint _amount) onlyOwner external { // require(hasEnded()); // require(_tokenReceiver != address(0)); // require(_amount > 0); // violaToken.transferFrom(owner, _tokenReceiver, _amount); // TokenDistributed(_tokenReceiver,_amount); // } //For external purchases & pre-sale via btc/fiat function externalPurchaseTokens(address _investor, uint _amount, uint _bonusAmount) onlyOwner external { require(_amount > 0); uint256 totalTokensToAllocate = _amount.add(_bonusAmount); require(getTokensLeft() >= totalTokensToAllocate); totalTokensAllocated = totalTokensAllocated.add(totalTokensToAllocate); totalReservedTokenAllocated = totalReservedTokenAllocated.add(totalTokensToAllocate); externalTokensAllocated[_investor] = externalTokensAllocated[_investor].add(_amount); externalBonusTokensAllocated[_investor] = externalBonusTokensAllocated[_investor].add(_bonusAmount); ExternalTokenPurchase(_investor, _amount, _bonusAmount); } function refundAllExternalPurchase(address _investor) onlyOwner external { require(_investor != address(0)); require(externalTokensAllocated[_investor] > 0); uint externalTokens = externalTokensAllocated[_investor]; uint externalBonusTokens = externalBonusTokensAllocated[_investor]; externalTokensAllocated[_investor] = 0; externalBonusTokensAllocated[_investor] = 0; uint totalInvestorTokens = externalTokens.add(externalBonusTokens); totalReservedTokenAllocated = totalReservedTokenAllocated.sub(totalInvestorTokens); totalTokensAllocated = totalTokensAllocated.sub(totalInvestorTokens); ExternalPurchaseRefunded(_investor,externalTokens,externalBonusTokens); } function refundExternalPurchase(address _investor, uint _amountToRefund, uint _bonusAmountToRefund) onlyOwner external { require(_investor != address(0)); require(externalTokensAllocated[_investor] >= _amountToRefund); require(externalBonusTokensAllocated[_investor] >= _bonusAmountToRefund); uint totalTokensToRefund = _amountToRefund.add(_bonusAmountToRefund); externalTokensAllocated[_investor] = externalTokensAllocated[_investor].sub(_amountToRefund); externalBonusTokensAllocated[_investor] = externalBonusTokensAllocated[_investor].sub(_bonusAmountToRefund); totalReservedTokenAllocated = totalReservedTokenAllocated.sub(totalTokensToRefund); totalTokensAllocated = totalTokensAllocated.sub(totalTokensToRefund); ExternalPurchaseRefunded(_investor,_amountToRefund,_bonusAmountToRefund); } function _clearAddressFromCrowdsale(address _investor) internal { tokensAllocated[_investor] = 0; bonusTokensAllocated[_investor] = 0; investedSum[_investor] = 0; maxBuyCap[_investor] = 0; } function allocateTopupToken(address _investor, uint _amount, uint _bonusAmount) onlyOwner external { require(hasEnded()); require(_amount > 0); uint256 tokensToAllocate = _amount.add(_bonusAmount); require(getTokensLeft() >= tokensToAllocate); totalTokensAllocated = totalTokensAllocated.add(_amount); tokensAllocated[_investor] = tokensAllocated[_investor].add(_amount); bonusTokensAllocated[_investor] = bonusTokensAllocated[_investor].add(_bonusAmount); TopupTokenAllocated(_investor, _amount, _bonusAmount); } //For cases where token are mistakenly sent / airdrops function emergencyERC20Drain( ERC20 token, uint amount ) external onlyOwner { require(status == State.Completed); token.transfer(owner,amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"withinPeriod","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusTokenRateLevelThree","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusTokenRateLevelTwo","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_kycAddress","type":"address"}],"name":"approveKYC","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"addressKYC","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amountToTransfer","type":"uint256"}],"name":"partialForwardFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"bonusTokensAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"status","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"endCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setBonusTokenRateLevelOne","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_bonusAmount","type":"uint256"}],"name":"externalPurchaseTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"externalTokensAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_kycAddress","type":"address"}],"name":"revokeKYC","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_investor","type":"address"}],"name":"getTotalNormalTokensByAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"completeCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_amountToRefund","type":"uint256"},{"name":"_bonusAmountToRefund","type":"uint256"}],"name":"refundExternalPurchase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_bonusAmount","type":"uint256"}],"name":"allocateTopupToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_minWeiToPurchase","type":"uint256"}],"name":"setMinWeiToPurchase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTimeBasedBonusRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minWeiToPurchase","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenReceiver","type":"address"}],"name":"distributeBonusTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"burnExtraTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpauseCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_investor","type":"address"}],"name":"getTotalBonusTokensByAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"registeredAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"violaToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenBuffer","type":"uint256"}],"name":"setLeftoverTokensBuffer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bonusTokenRateLevelFour","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"investedSum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setBonusTokenRateLevelFour","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenReceiver","type":"address"}],"name":"distributeICOTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"leftoverTokensBuffer","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setBonusTokenRateLevelThree","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"startCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pauseCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"}],"name":"refundAllExternalPurchase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokensAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"maxBuyCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalApprovedAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalReservedTokenAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"}],"name":"removeWhitelistAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bonusTokenRateLevelOne","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTokensAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_refundAmt","type":"uint256"},{"name":"_tokenAmt","type":"uint256"},{"name":"_bonusTokenAmt","type":"uint256"}],"name":"refundPartial","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint256"},{"name":"_rate","type":"uint256"},{"name":"_tokenAddress","type":"address"},{"name":"_wallet","type":"address"}],"name":"initialiseCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}],"name":"emergencyERC20Drain","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTokensLeft","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"externalBonusTokensAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimBonusTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bonusVestingPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasEnded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_investor","type":"address"}],"name":"getTotalTokensByAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setBonusTokenRateLevelTwo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_cap","type":"uint256"}],"name":"setWhitelistAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"bonusAmount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"bonusAmount","type":"uint256"}],"name":"ExternalTokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"bonusAmount","type":"uint256"}],"name":"ExternalPurchaseRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenReceiver","type":"address"},{"indexed":false,"name":"tokenAmount","type":"uint256"}],"name":"TokenDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenReceiver","type":"address"},{"indexed":false,"name":"tokenAmount","type":"uint256"}],"name":"BonusTokenDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenReceiver","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"bonusAmount","type":"uint256"}],"name":"TopupTokenAllocated","type":"event"},{"anonymous":false,"inputs":[],"name":"CrowdsalePending","type":"event"},{"anonymous":false,"inputs":[],"name":"CrowdsaleStarted","type":"event"},{"anonymous":false,"inputs":[],"name":"CrowdsaleEnded","type":"event"},{"anonymous":false,"inputs":[],"name":"BonusRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
606060405260008060146101000a81548160ff0219169083600581111561002257fe5b02179055506000600a55624f1a00600d556014601155600f601255600a6013556000601455336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614d08806100966000396000f3006060604052600436106102e0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063063575de146102eb578063083ab393146103185780630b8440ec146103415780630e27324d1461036a578063123a8708146103a357806317038cb2146103f4578063185d84c014610417578063200d2ed2146104645780632095f2d41461049b5780632493a2f2146104b05780632c4e722e146104d35780633197cbb6146104fc57806334fcf437146105255780633762346b1461054857806337e931bc1461059357806339ba645b146105e05780633b90176f146106195780633cbf41d21461066657806343f99e681461067b578063489979a3146106c657806348c54b9d146107115780634921e1471461072657806351ac0d1014610749578063521eb2731461077257806366ce5c52146107c757806367d6bcbf146107f057806368fad5041461082957806372d9b86f1461083e5780637321a17b146108535780637489f085146108a057806378a832321461090357806378e9792514610958578063827bc64b1461098157806384e9ec37146109a45780638da5cb5b146109cd5780638deb47ad14610a22578063921200ed14610a6f578063991cc28314610a925780639c0e7d6614610acb5780639ef48a3114610af4578063a39953b214610b17578063a8351c0314610b2c578063ab3a32c414610b41578063ae1133de14610b7a578063b04cd13414610bc7578063b420029414610c14578063b494f1fb14610c3d578063b7ecbaae14610c66578063b9fbe33114610c9f578063c07f773a14610cc8578063c17281d014610cf1578063cab067c014610d45578063db0e16f114610daf578063de5f986614610df1578063e25cdab714610e1a578063e28d8c4b14610e67578063e866563814610e7c578063ecb70fb714610ea5578063f2fde38b14610ed2578063f581308514610f0b578063f9a7c90614610f58578063fc43bbfb14610f7b575b6102e933610fbd565b005b34156102f657600080fd5b6102fe61101f565b604051808215151515815260200191505060405180910390f35b341561032357600080fd5b61032b61103a565b6040518082815260200191505060405180910390f35b341561034c57600080fd5b610354611040565b6040518082815260200191505060405180910390f35b341561037557600080fd5b6103a1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611046565b005b34156103ae57600080fd5b6103da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611198565b604051808215151515815260200191505060405180910390f35b34156103ff57600080fd5b61041560048080359060200190919050506111b8565b005b341561042257600080fd5b61044e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506112d7565b6040518082815260200191505060405180910390f35b341561046f57600080fd5b6104776112ef565b6040518082600581111561048757fe5b60ff16815260200191505060405180910390f35b34156104a657600080fd5b6104ae611302565b005b34156104bb57600080fd5b6104d160048080359060200190919050506113fe565b005b34156104de57600080fd5b6104e661148f565b6040518082815260200191505060405180910390f35b341561050757600080fd5b61050f611495565b6040518082815260200191505060405180910390f35b341561053057600080fd5b610546600480803590602001909190505061149b565b005b341561055357600080fd5b610591600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001909190505061150f565b005b341561059e57600080fd5b6105ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611762565b6040518082815260200191505060405180910390f35b34156105eb57600080fd5b610617600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061177a565b005b341561062457600080fd5b610650600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118df565b6040518082815260200191505060405180910390f35b341561067157600080fd5b610679611979565b005b341561068657600080fd5b6106c4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091908035906020019091905050611b7b565b005b34156106d157600080fd5b61070f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091908035906020019091905050611e81565b005b341561071c57600080fd5b6107246120cc565b005b341561073157600080fd5b61074760048080359060200190919050506122f0565b005b341561075457600080fd5b61075c612355565b6040518082815260200191505060405180910390f35b341561077d57600080fd5b61078561241c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107d257600080fd5b6107da612442565b6040518082815260200191505060405180910390f35b34156107fb57600080fd5b610827600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612448565b005b341561083457600080fd5b61083c61254d565b005b341561084957600080fd5b610851612941565b005b341561085e57600080fd5b61088a600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506129f6565b6040518082815260200191505060405180910390f35b34156108ab57600080fd5b6108c16004808035906020019091905050612a90565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561090e57600080fd5b610916612acf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561096357600080fd5b61096b612af5565b6040518082815260200191505060405180910390f35b341561098c57600080fd5b6109a26004808035906020019091905050612afb565b005b34156109af57600080fd5b6109b7612b85565b6040518082815260200191505060405180910390f35b34156109d857600080fd5b6109e0612b8b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a2d57600080fd5b610a59600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612bb0565b6040518082815260200191505060405180910390f35b3415610a7a57600080fd5b610a906004808035906020019091905050612bc8565b005b3415610a9d57600080fd5b610ac9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c59565b005b3415610ad657600080fd5b610ade612d4d565b6040518082815260200191505060405180910390f35b3415610aff57600080fd5b610b156004808035906020019091905050612d53565b005b3415610b2257600080fd5b610b2a612de4565b005b3415610b3757600080fd5b610b3f612ef1565b005b3415610b4c57600080fd5b610b78600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612fa6565b005b3415610b8557600080fd5b610bb1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613245565b6040518082815260200191505060405180910390f35b3415610bd257600080fd5b610bfe600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061325d565b6040518082815260200191505060405180910390f35b3415610c1f57600080fd5b610c27613275565b6040518082815260200191505060405180910390f35b3415610c4857600080fd5b610c5061327b565b6040518082815260200191505060405180910390f35b3415610c7157600080fd5b610c9d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613281565b005b3415610caa57600080fd5b610cb26133b8565b6040518082815260200191505060405180910390f35b3415610cd357600080fd5b610cdb6133be565b6040518082815260200191505060405180910390f35b3415610cfc57600080fd5b610d43600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919080359060200190919080359060200190919050506133c4565b005b3415610d5057600080fd5b610dad600480803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506137c0565b005b3415610dba57600080fd5b610def600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506139d7565b005b3415610dfc57600080fd5b610e04613b51565b6040518082815260200191505060405180910390f35b3415610e2557600080fd5b610e51600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613ca1565b6040518082815260200191505060405180910390f35b3415610e7257600080fd5b610e7a613cb9565b005b3415610e8757600080fd5b610e8f613eee565b6040518082815260200191505060405180910390f35b3415610eb057600080fd5b610eb8613ef4565b604051808215151515815260200191505060405180910390f35b3415610edd57600080fd5b610f09600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613f38565b005b3415610f1657600080fd5b610f42600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061408d565b6040518082815260200191505060405180910390f35b3415610f6357600080fd5b610f7960048080359060200190919050506140b9565b005b3415610f8657600080fd5b610fbb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061414a565b005b600060026005811115610fcc57fe5b600060149054906101000a900460ff166005811115610fe757fe5b141515610ff357600080fd5b600f54341015151561100457600080fd5b349050611011828261429b565b61101b82826143de565b5050565b6000600b5442101580156110355750600c544211155b905090565b60135481565b60125481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110a357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156110df57600080fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061118e81600a5461461490919063ffffffff16565b600a819055505050565b60036020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121357600080fd5b6004600581111561122057fe5b600060149054906101000a900460ff16600581111561123b57fe5b14151561124757600080fd5b600a548110151561125757600080fd5b61126c81600a5461463290919063ffffffff16565b600a81905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156112d457600080fd5b50565b60076020528060005260406000206000915090505481565b600060149054906101000a900460ff1681565b61130a61464b565b151561136c576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561136b57600080fd5b5b6002600581111561137957fe5b600060149054906101000a900460ff16600581111561139457fe5b1415156113a057600080fd5b624f1a004201600d819055506004600060146101000a81548160ff021916908360058111156113cb57fe5b02179055507fd499d29ff9f7facc77232f25dece0ab9dff206faee2228931a6943fb45707d7460405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145957600080fd5b806011819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b60105481565b600c5481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114f657600080fd5b60008111151561150557600080fd5b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561156c57600080fd5b60008311151561157b57600080fd5b61158e828461461490919063ffffffff16565b905080611599613b51565b101515156115a657600080fd5b6115bb8160155461461490919063ffffffff16565b6015819055506115d68160165461461490919063ffffffff16565b60168190555061162e83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506116c382600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167f0923390e595bc62f1a7afe42725e5bb526f690f2f8badb25ce12e525472d68888484604051808381526020018281526020019250505060405180910390a250505050565b60066020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117d757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561181357600080fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506118c281600a5461463290919063ffffffff16565b600a8190555060008111156118db576118da82614670565b5b5050565b6000611972600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119d457600080fd5b6119dc613ef4565b15156119e757600080fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515611b0357600080fd5b6102c65a03f11515611b1457600080fd5b50505060405180519050141515611b2a57600080fd5b6005600060146101000a81548160ff02191690836005811115611b4957fe5b0217905550611b5661483d565b60003073ffffffffffffffffffffffffffffffffffffffff1631141515611b7957fe5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bd857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515611c1457600080fd5b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611c6257600080fd5b81600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611cb057600080fd5b611cc3828461461490919063ffffffff16565b9050611d1783600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611dac82600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e048160165461463290919063ffffffff16565b601681905550611e1f8160155461463290919063ffffffff16565b6015819055508373ffffffffffffffffffffffffffffffffffffffff167f970dddbfaeeb6347318f1a4b7c03a8ec6e0f99acecd7cbe866303eb1254836e28484604051808381526020018281526020019250505060405180910390a250505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ede57600080fd5b611ee6613ef4565b1515611ef157600080fd5b600083111515611f0057600080fd5b611f13828461461490919063ffffffff16565b905080611f1e613b51565b10151515611f2b57600080fd5b611f408360155461461490919063ffffffff16565b601581905550611f9883600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202d82600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167f75c8b83c19331020aeddea4bf94aff9b29a6215c70f4ab00473e1d583794001b8484604051808381526020018281526020019250505060405180910390a250505050565b6000806120d7613ef4565b15156120e257600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561213a57600080fd5b339150612146826118df565b905060008111151561215757600080fd5b612160826148b8565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561228257600080fd5b6102c65a03f1151561229357600080fd5b50505060405180519050508173ffffffffffffffffffffffffffffffffffffffff167ff6f55ada4fbb9e2bc6813f97e749a30067f3c13a200ce783269b50e6419e8f64826040518082815260200191505060405180910390a25050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561234b57600080fd5b80600f8190555050565b6000806000806000600b544210158015612376575062015180600b54014211155b935062015180600b54014211801561239557506203f480600b54014211155b92506203f480600b5401421180156123b45750620d2f00600b54014211155b9150620d2f00600b5401421180156123ce5750600c544211155b905083156123e0576011549450612415565b82156123f0576012549450612415565b8115612400576013549450612415565b8015612410576014549450612415565b600094505b5050505090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124a657600080fd5b6124ae613ef4565b15156124b957600080fd5b600d5442101515156124ca57600080fd5b8291506124d6826129f6565b90506000811115156124e757600080fd5b6124f082614945565b6124fa82826149d2565b8173ffffffffffffffffffffffffffffffffffffffff167f160df65e77825f234b36cd56fa84256d633fc5ce97380cebf2386224c52c6907826040518082815260200191505060405180910390a2505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125aa57600080fd5b6125b2613ef4565b15156125bd57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156126d757600080fd5b6102c65a03f115156126e857600080fd5b505050604051805190509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc67906000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15156127e257600080fd5b6102c65a03f115156127f357600080fd5b50505060405180519050506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561291a57600080fd5b6102c65a03f1151561292b57600080fd5b5050506040518051905014151561293e57fe5b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561299c57600080fd5b600360058111156129a957fe5b600060149054906101000a900460ff1660058111156129c457fe5b1415156129d057600080fd5b6002600060146101000a81548160ff021916908360058111156129ef57fe5b0217905550565b6000612a89600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b9050919050565b600981815481101515612a9f57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b5657600080fd5b600081111515612b6557600080fd5b80612b6e613b51565b10151515612b7b57600080fd5b8060178190555050565b60145481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60046020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c2357600080fd5b806014819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cb757600080fd5b612cbf613ef4565b1515612cca57600080fd5b829150612cd6826118df565b9050600081111515612ce757600080fd5b612cf0826148b8565b612cfa82826149d2565b8173ffffffffffffffffffffffffffffffffffffffff167ff6f55ada4fbb9e2bc6813f97e749a30067f3c13a200ce783269b50e6419e8f64826040518082815260200191505060405180910390a2505050565b60175481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612dae57600080fd5b806013819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b612dec61101f565b1515612df757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515612e5557600080fd5b6000612e5f613b51565b111515612e6b57600080fd5b60016005811115612e7857fe5b600060149054906101000a900460ff166005811115612e9357fe5b141515612e9f57600080fd5b6002600060146101000a81548160ff02191690836005811115612ebe57fe5b02179055507f4722e6c4579996b373f4de030a1847ddba1df215e3fc5388223a9873d563e7ef60405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612f4c57600080fd5b60026005811115612f5957fe5b600060149054906101000a900460ff166005811115612f7457fe5b141515612f8057600080fd5b6003600060146101000a81548160ff02191690836005811115612f9f57fe5b0217905550565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561300657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561304257600080fd5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561309057600080fd5b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131b1828461461490919063ffffffff16565b90506131c88160165461463290919063ffffffff16565b6016819055506131e38160155461463290919063ffffffff16565b6015819055508373ffffffffffffffffffffffffffffffffffffffff167f970dddbfaeeb6347318f1a4b7c03a8ec6e0f99acecd7cbe866303eb1254836e28484604051808381526020018281526020019250505060405180910390a250505050565b60056020528060005260406000206000915090505481565b60026020528060005260406000206000915090505481565b600a5481565b60165481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156132de57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561331a57600080fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156133b4576133b382614670565b5b5050565b60115481565b60155481565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561342257600080fd5b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150848211151561347257600080fd5b83600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115156134bf57600080fd5b82600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561350c57600080fd5b61355e85600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135f384600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061368883600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136de838561461490919063ffffffff16565b9050600260058111156136ed57fe5b600060149054906101000a900460ff16600581111561370857fe5b141561372a576137238160155461463290919063ffffffff16565b6015819055505b8573ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050151561376a57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d0651866040518082815260200191505060405180910390a2505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561381b57600080fd5b6000600581111561382857fe5b600060149054906101000a900460ff16600581111561384357fe5b14151561384f57600080fd5b42841015151561385e57600080fd5b60008311151561386d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156138a957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156138e557600080fd5b83600b8190555062278d008401600c819055508260108190555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600060146101000a81548160ff021916908360058111156139a057fe5b02179055507ffd25b305b4ec040a79a72abbc43d24ff5d3aee83f1d425e0e22f8ffdee016ad460405160405180910390a150505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613a3257600080fd5b600580811115613a3e57fe5b600060149054906101000a900460ff166005811115613a5957fe5b141515613a6557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515613b3157600080fd5b6102c65a03f11515613b4257600080fd5b50505060405180519050505050565b6000613c9c601554600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515613c7357600080fd5b6102c65a03f11515613c8457600080fd5b5050506040518051905061463290919063ffffffff16565b905090565b60086020528060005260406000206000915090505481565b600080613cc4613ef4565b1515613ccf57600080fd5b600d544210151515613ce057600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515613d3857600080fd5b339150613d44826129f6565b9050600081111515613d5557600080fd5b613d5e82614945565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515613e8057600080fd5b6102c65a03f11515613e9157600080fd5b50505060405180519050508173ffffffffffffffffffffffffffffffffffffffff167f160df65e77825f234b36cd56fa84256d633fc5ce97380cebf2386224c52c6907826040518082815260200191505060405180910390a25050565b600d5481565b600060046005811115613f0357fe5b600060149054906101000a900460ff166005811115613f1e57fe5b1415613f2d5760019050613f35565b600c54421190505b90565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613f9357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613fcf57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006140b261409b836129f6565b6140a4846118df565b61461490919063ffffffff16565b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561411457600080fd5b806012819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156141a557600080fd5b6000811115156141b457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156141f057600080fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600980548060010182816142489190614c8b565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101515156142ee57600080fd5b614301828261463290919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061439682600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b60008060006143f860105485614b1e90919063ffffffff16565b9250614427606461441961440a612355565b86614b1e90919063ffffffff16565b614b5990919063ffffffff16565b915061443c828461461490919063ffffffff16565b905080614447613b51565b1015151561445457600080fd5b6144698160155461461490919063ffffffff16565b6015819055506144c183600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061455682600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145a161464b565b156145af576145ae611302565b5b8473ffffffffffffffffffffffffffffffffffffffff167f347f5f0051b895093800553e6e78ef332849e2552639a4f5ffe66535788ae07885858560405180848152602001838152602001828152602001935050505060405180910390a25050505050565b600080828401905083811015151561462857fe5b8091505092915050565b600082821115151561464057fe5b818303905092915050565b6000601754614658613b51565b111515614668576001905061466d565b600090505b90565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506000821115156146c457600080fd5b614755600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b90506002600581111561476457fe5b600060149054906101000a900460ff16600581111561477f57fe5b14156147a15761479a8160155461463290919063ffffffff16565b6015819055505b6147aa83614b74565b8273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156147ea57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d0651836040518082815260200191505060405180910390a2505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015156148b657600080fd5b565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515614af457600080fd5b6102c65a03f11515614b0557600080fd5b505050604051805190501515614b1a57600080fd5b5050565b6000806000841415614b335760009150614b52565b8284029050828482811515614b4457fe5b04141515614b4e57fe5b8091505b5092915050565b6000808284811515614b6757fe5b0490508091505092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b815481835581811511614cb257818360005260206000209182019101614cb19190614cb7565b5b505050565b614cd991905b80821115614cd5576000816000905550600101614cbd565b5090565b905600a165627a7a723058205db8e40549bfc3fcbc97e2befcb3a7476092927487958256753b0b91951246e90029
Deployed Bytecode
0x6060604052600436106102e0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063063575de146102eb578063083ab393146103185780630b8440ec146103415780630e27324d1461036a578063123a8708146103a357806317038cb2146103f4578063185d84c014610417578063200d2ed2146104645780632095f2d41461049b5780632493a2f2146104b05780632c4e722e146104d35780633197cbb6146104fc57806334fcf437146105255780633762346b1461054857806337e931bc1461059357806339ba645b146105e05780633b90176f146106195780633cbf41d21461066657806343f99e681461067b578063489979a3146106c657806348c54b9d146107115780634921e1471461072657806351ac0d1014610749578063521eb2731461077257806366ce5c52146107c757806367d6bcbf146107f057806368fad5041461082957806372d9b86f1461083e5780637321a17b146108535780637489f085146108a057806378a832321461090357806378e9792514610958578063827bc64b1461098157806384e9ec37146109a45780638da5cb5b146109cd5780638deb47ad14610a22578063921200ed14610a6f578063991cc28314610a925780639c0e7d6614610acb5780639ef48a3114610af4578063a39953b214610b17578063a8351c0314610b2c578063ab3a32c414610b41578063ae1133de14610b7a578063b04cd13414610bc7578063b420029414610c14578063b494f1fb14610c3d578063b7ecbaae14610c66578063b9fbe33114610c9f578063c07f773a14610cc8578063c17281d014610cf1578063cab067c014610d45578063db0e16f114610daf578063de5f986614610df1578063e25cdab714610e1a578063e28d8c4b14610e67578063e866563814610e7c578063ecb70fb714610ea5578063f2fde38b14610ed2578063f581308514610f0b578063f9a7c90614610f58578063fc43bbfb14610f7b575b6102e933610fbd565b005b34156102f657600080fd5b6102fe61101f565b604051808215151515815260200191505060405180910390f35b341561032357600080fd5b61032b61103a565b6040518082815260200191505060405180910390f35b341561034c57600080fd5b610354611040565b6040518082815260200191505060405180910390f35b341561037557600080fd5b6103a1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611046565b005b34156103ae57600080fd5b6103da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611198565b604051808215151515815260200191505060405180910390f35b34156103ff57600080fd5b61041560048080359060200190919050506111b8565b005b341561042257600080fd5b61044e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506112d7565b6040518082815260200191505060405180910390f35b341561046f57600080fd5b6104776112ef565b6040518082600581111561048757fe5b60ff16815260200191505060405180910390f35b34156104a657600080fd5b6104ae611302565b005b34156104bb57600080fd5b6104d160048080359060200190919050506113fe565b005b34156104de57600080fd5b6104e661148f565b6040518082815260200191505060405180910390f35b341561050757600080fd5b61050f611495565b6040518082815260200191505060405180910390f35b341561053057600080fd5b610546600480803590602001909190505061149b565b005b341561055357600080fd5b610591600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001909190505061150f565b005b341561059e57600080fd5b6105ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611762565b6040518082815260200191505060405180910390f35b34156105eb57600080fd5b610617600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061177a565b005b341561062457600080fd5b610650600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118df565b6040518082815260200191505060405180910390f35b341561067157600080fd5b610679611979565b005b341561068657600080fd5b6106c4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091908035906020019091905050611b7b565b005b34156106d157600080fd5b61070f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091908035906020019091905050611e81565b005b341561071c57600080fd5b6107246120cc565b005b341561073157600080fd5b61074760048080359060200190919050506122f0565b005b341561075457600080fd5b61075c612355565b6040518082815260200191505060405180910390f35b341561077d57600080fd5b61078561241c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107d257600080fd5b6107da612442565b6040518082815260200191505060405180910390f35b34156107fb57600080fd5b610827600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612448565b005b341561083457600080fd5b61083c61254d565b005b341561084957600080fd5b610851612941565b005b341561085e57600080fd5b61088a600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506129f6565b6040518082815260200191505060405180910390f35b34156108ab57600080fd5b6108c16004808035906020019091905050612a90565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561090e57600080fd5b610916612acf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561096357600080fd5b61096b612af5565b6040518082815260200191505060405180910390f35b341561098c57600080fd5b6109a26004808035906020019091905050612afb565b005b34156109af57600080fd5b6109b7612b85565b6040518082815260200191505060405180910390f35b34156109d857600080fd5b6109e0612b8b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a2d57600080fd5b610a59600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612bb0565b6040518082815260200191505060405180910390f35b3415610a7a57600080fd5b610a906004808035906020019091905050612bc8565b005b3415610a9d57600080fd5b610ac9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c59565b005b3415610ad657600080fd5b610ade612d4d565b6040518082815260200191505060405180910390f35b3415610aff57600080fd5b610b156004808035906020019091905050612d53565b005b3415610b2257600080fd5b610b2a612de4565b005b3415610b3757600080fd5b610b3f612ef1565b005b3415610b4c57600080fd5b610b78600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612fa6565b005b3415610b8557600080fd5b610bb1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613245565b6040518082815260200191505060405180910390f35b3415610bd257600080fd5b610bfe600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061325d565b6040518082815260200191505060405180910390f35b3415610c1f57600080fd5b610c27613275565b6040518082815260200191505060405180910390f35b3415610c4857600080fd5b610c5061327b565b6040518082815260200191505060405180910390f35b3415610c7157600080fd5b610c9d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613281565b005b3415610caa57600080fd5b610cb26133b8565b6040518082815260200191505060405180910390f35b3415610cd357600080fd5b610cdb6133be565b6040518082815260200191505060405180910390f35b3415610cfc57600080fd5b610d43600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919080359060200190919080359060200190919050506133c4565b005b3415610d5057600080fd5b610dad600480803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506137c0565b005b3415610dba57600080fd5b610def600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506139d7565b005b3415610dfc57600080fd5b610e04613b51565b6040518082815260200191505060405180910390f35b3415610e2557600080fd5b610e51600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613ca1565b6040518082815260200191505060405180910390f35b3415610e7257600080fd5b610e7a613cb9565b005b3415610e8757600080fd5b610e8f613eee565b6040518082815260200191505060405180910390f35b3415610eb057600080fd5b610eb8613ef4565b604051808215151515815260200191505060405180910390f35b3415610edd57600080fd5b610f09600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613f38565b005b3415610f1657600080fd5b610f42600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061408d565b6040518082815260200191505060405180910390f35b3415610f6357600080fd5b610f7960048080359060200190919050506140b9565b005b3415610f8657600080fd5b610fbb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061414a565b005b600060026005811115610fcc57fe5b600060149054906101000a900460ff166005811115610fe757fe5b141515610ff357600080fd5b600f54341015151561100457600080fd5b349050611011828261429b565b61101b82826143de565b5050565b6000600b5442101580156110355750600c544211155b905090565b60135481565b60125481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110a357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156110df57600080fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061118e81600a5461461490919063ffffffff16565b600a819055505050565b60036020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121357600080fd5b6004600581111561122057fe5b600060149054906101000a900460ff16600581111561123b57fe5b14151561124757600080fd5b600a548110151561125757600080fd5b61126c81600a5461463290919063ffffffff16565b600a81905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156112d457600080fd5b50565b60076020528060005260406000206000915090505481565b600060149054906101000a900460ff1681565b61130a61464b565b151561136c576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561136b57600080fd5b5b6002600581111561137957fe5b600060149054906101000a900460ff16600581111561139457fe5b1415156113a057600080fd5b624f1a004201600d819055506004600060146101000a81548160ff021916908360058111156113cb57fe5b02179055507fd499d29ff9f7facc77232f25dece0ab9dff206faee2228931a6943fb45707d7460405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145957600080fd5b806011819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b60105481565b600c5481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114f657600080fd5b60008111151561150557600080fd5b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561156c57600080fd5b60008311151561157b57600080fd5b61158e828461461490919063ffffffff16565b905080611599613b51565b101515156115a657600080fd5b6115bb8160155461461490919063ffffffff16565b6015819055506115d68160165461461490919063ffffffff16565b60168190555061162e83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506116c382600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167f0923390e595bc62f1a7afe42725e5bb526f690f2f8badb25ce12e525472d68888484604051808381526020018281526020019250505060405180910390a250505050565b60066020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117d757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561181357600080fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506118c281600a5461463290919063ffffffff16565b600a8190555060008111156118db576118da82614670565b5b5050565b6000611972600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119d457600080fd5b6119dc613ef4565b15156119e757600080fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515611b0357600080fd5b6102c65a03f11515611b1457600080fd5b50505060405180519050141515611b2a57600080fd5b6005600060146101000a81548160ff02191690836005811115611b4957fe5b0217905550611b5661483d565b60003073ffffffffffffffffffffffffffffffffffffffff1631141515611b7957fe5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bd857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515611c1457600080fd5b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611c6257600080fd5b81600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611cb057600080fd5b611cc3828461461490919063ffffffff16565b9050611d1783600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611dac82600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e048160165461463290919063ffffffff16565b601681905550611e1f8160155461463290919063ffffffff16565b6015819055508373ffffffffffffffffffffffffffffffffffffffff167f970dddbfaeeb6347318f1a4b7c03a8ec6e0f99acecd7cbe866303eb1254836e28484604051808381526020018281526020019250505060405180910390a250505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ede57600080fd5b611ee6613ef4565b1515611ef157600080fd5b600083111515611f0057600080fd5b611f13828461461490919063ffffffff16565b905080611f1e613b51565b10151515611f2b57600080fd5b611f408360155461461490919063ffffffff16565b601581905550611f9883600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202d82600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167f75c8b83c19331020aeddea4bf94aff9b29a6215c70f4ab00473e1d583794001b8484604051808381526020018281526020019250505060405180910390a250505050565b6000806120d7613ef4565b15156120e257600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561213a57600080fd5b339150612146826118df565b905060008111151561215757600080fd5b612160826148b8565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561228257600080fd5b6102c65a03f1151561229357600080fd5b50505060405180519050508173ffffffffffffffffffffffffffffffffffffffff167ff6f55ada4fbb9e2bc6813f97e749a30067f3c13a200ce783269b50e6419e8f64826040518082815260200191505060405180910390a25050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561234b57600080fd5b80600f8190555050565b6000806000806000600b544210158015612376575062015180600b54014211155b935062015180600b54014211801561239557506203f480600b54014211155b92506203f480600b5401421180156123b45750620d2f00600b54014211155b9150620d2f00600b5401421180156123ce5750600c544211155b905083156123e0576011549450612415565b82156123f0576012549450612415565b8115612400576013549450612415565b8015612410576014549450612415565b600094505b5050505090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124a657600080fd5b6124ae613ef4565b15156124b957600080fd5b600d5442101515156124ca57600080fd5b8291506124d6826129f6565b90506000811115156124e757600080fd5b6124f082614945565b6124fa82826149d2565b8173ffffffffffffffffffffffffffffffffffffffff167f160df65e77825f234b36cd56fa84256d633fc5ce97380cebf2386224c52c6907826040518082815260200191505060405180910390a2505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125aa57600080fd5b6125b2613ef4565b15156125bd57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156126d757600080fd5b6102c65a03f115156126e857600080fd5b505050604051805190509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc67906000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15156127e257600080fd5b6102c65a03f115156127f357600080fd5b50505060405180519050506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561291a57600080fd5b6102c65a03f1151561292b57600080fd5b5050506040518051905014151561293e57fe5b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561299c57600080fd5b600360058111156129a957fe5b600060149054906101000a900460ff1660058111156129c457fe5b1415156129d057600080fd5b6002600060146101000a81548160ff021916908360058111156129ef57fe5b0217905550565b6000612a89600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b9050919050565b600981815481101515612a9f57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b5657600080fd5b600081111515612b6557600080fd5b80612b6e613b51565b10151515612b7b57600080fd5b8060178190555050565b60145481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60046020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c2357600080fd5b806014819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cb757600080fd5b612cbf613ef4565b1515612cca57600080fd5b829150612cd6826118df565b9050600081111515612ce757600080fd5b612cf0826148b8565b612cfa82826149d2565b8173ffffffffffffffffffffffffffffffffffffffff167ff6f55ada4fbb9e2bc6813f97e749a30067f3c13a200ce783269b50e6419e8f64826040518082815260200191505060405180910390a2505050565b60175481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612dae57600080fd5b806013819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b612dec61101f565b1515612df757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515612e5557600080fd5b6000612e5f613b51565b111515612e6b57600080fd5b60016005811115612e7857fe5b600060149054906101000a900460ff166005811115612e9357fe5b141515612e9f57600080fd5b6002600060146101000a81548160ff02191690836005811115612ebe57fe5b02179055507f4722e6c4579996b373f4de030a1847ddba1df215e3fc5388223a9873d563e7ef60405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612f4c57600080fd5b60026005811115612f5957fe5b600060149054906101000a900460ff166005811115612f7457fe5b141515612f8057600080fd5b6003600060146101000a81548160ff02191690836005811115612f9f57fe5b0217905550565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561300657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561304257600080fd5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561309057600080fd5b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131b1828461461490919063ffffffff16565b90506131c88160165461463290919063ffffffff16565b6016819055506131e38160155461463290919063ffffffff16565b6015819055508373ffffffffffffffffffffffffffffffffffffffff167f970dddbfaeeb6347318f1a4b7c03a8ec6e0f99acecd7cbe866303eb1254836e28484604051808381526020018281526020019250505060405180910390a250505050565b60056020528060005260406000206000915090505481565b60026020528060005260406000206000915090505481565b600a5481565b60165481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156132de57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561331a57600080fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156133b4576133b382614670565b5b5050565b60115481565b60155481565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561342257600080fd5b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150848211151561347257600080fd5b83600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115156134bf57600080fd5b82600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561350c57600080fd5b61355e85600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135f384600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061368883600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136de838561461490919063ffffffff16565b9050600260058111156136ed57fe5b600060149054906101000a900460ff16600581111561370857fe5b141561372a576137238160155461463290919063ffffffff16565b6015819055505b8573ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050151561376a57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d0651866040518082815260200191505060405180910390a2505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561381b57600080fd5b6000600581111561382857fe5b600060149054906101000a900460ff16600581111561384357fe5b14151561384f57600080fd5b42841015151561385e57600080fd5b60008311151561386d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156138a957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156138e557600080fd5b83600b8190555062278d008401600c819055508260108190555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600060146101000a81548160ff021916908360058111156139a057fe5b02179055507ffd25b305b4ec040a79a72abbc43d24ff5d3aee83f1d425e0e22f8ffdee016ad460405160405180910390a150505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613a3257600080fd5b600580811115613a3e57fe5b600060149054906101000a900460ff166005811115613a5957fe5b141515613a6557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515613b3157600080fd5b6102c65a03f11515613b4257600080fd5b50505060405180519050505050565b6000613c9c601554600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515613c7357600080fd5b6102c65a03f11515613c8457600080fd5b5050506040518051905061463290919063ffffffff16565b905090565b60086020528060005260406000206000915090505481565b600080613cc4613ef4565b1515613ccf57600080fd5b600d544210151515613ce057600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515613d3857600080fd5b339150613d44826129f6565b9050600081111515613d5557600080fd5b613d5e82614945565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515613e8057600080fd5b6102c65a03f11515613e9157600080fd5b50505060405180519050508173ffffffffffffffffffffffffffffffffffffffff167f160df65e77825f234b36cd56fa84256d633fc5ce97380cebf2386224c52c6907826040518082815260200191505060405180910390a25050565b600d5481565b600060046005811115613f0357fe5b600060149054906101000a900460ff166005811115613f1e57fe5b1415613f2d5760019050613f35565b600c54421190505b90565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613f9357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613fcf57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006140b261409b836129f6565b6140a4846118df565b61461490919063ffffffff16565b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561411457600080fd5b806012819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156141a557600080fd5b6000811115156141b457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156141f057600080fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600980548060010182816142489190614c8b565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101515156142ee57600080fd5b614301828261463290919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061439682600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b60008060006143f860105485614b1e90919063ffffffff16565b9250614427606461441961440a612355565b86614b1e90919063ffffffff16565b614b5990919063ffffffff16565b915061443c828461461490919063ffffffff16565b905080614447613b51565b1015151561445457600080fd5b6144698160155461461490919063ffffffff16565b6015819055506144c183600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061455682600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145a161464b565b156145af576145ae611302565b5b8473ffffffffffffffffffffffffffffffffffffffff167f347f5f0051b895093800553e6e78ef332849e2552639a4f5ffe66535788ae07885858560405180848152602001838152602001828152602001935050505060405180910390a25050505050565b600080828401905083811015151561462857fe5b8091505092915050565b600082821115151561464057fe5b818303905092915050565b6000601754614658613b51565b111515614668576001905061466d565b600090505b90565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506000821115156146c457600080fd5b614755600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b90506002600581111561476457fe5b600060149054906101000a900460ff16600581111561477f57fe5b14156147a15761479a8160155461463290919063ffffffff16565b6015819055505b6147aa83614b74565b8273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156147ea57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d0651836040518082815260200191505060405180910390a2505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015156148b657600080fd5b565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515614af457600080fd5b6102c65a03f11515614b0557600080fd5b505050604051805190501515614b1a57600080fd5b5050565b6000806000841415614b335760009150614b52565b8284029050828482811515614b4457fe5b04141515614b4e57fe5b8091505b5092915050565b6000808284811515614b6757fe5b0490508091505092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b815481835581811511614cb257818360005260206000209182019101614cb19190614cb7565b5b505050565b614cd991905b80821115614cd5576000816000905550600101614cbd565b5090565b905600a165627a7a723058205db8e40549bfc3fcbc97e2befcb3a7476092927487958256753b0b91951246e90029
Swarm Source
bzzr://5db8e40549bfc3fcbc97e2befcb3a7476092927487958256753b0b91951246e9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.