Overview
ETH Balance
0.043569354628740621 ETH
Eth Value
$159.14 (@ $3,652.65/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 74 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy Xname | 6454699 | 2267 days ago | IN | 0.00007875 ETH | 0.00025994 | ||||
Buy Xname | 6396198 | 2276 days ago | IN | 0.00007875 ETH | 0.00025994 | ||||
Buy Xname | 6386048 | 2278 days ago | IN | 0.00157508 ETH | 0.00017329 | ||||
Buy Xname | 6217118 | 2306 days ago | IN | 0.000075 ETH | 0.00034958 | ||||
Re Load Xname | 6217112 | 2306 days ago | IN | 0 ETH | 0.00038561 | ||||
Buy Xname | 6217111 | 2306 days ago | IN | 0.00082501 ETH | 0.00036359 | ||||
Buy Xname | 6217111 | 2306 days ago | IN | 0.000075 ETH | 0.00040375 | ||||
Buy Xname | 6215915 | 2306 days ago | IN | 0.00007875 ETH | 0.00043964 | ||||
Buy Xname | 6214166 | 2306 days ago | IN | 0.00007875 ETH | 0.00006447 | ||||
Buy Xname | 6214163 | 2306 days ago | IN | 0.00007875 ETH | 0.00006447 | ||||
Buy Xname | 6214159 | 2306 days ago | IN | 0.00007875 ETH | 0.00031672 | ||||
Buy Xname | 6206875 | 2308 days ago | IN | 0.00007875 ETH | 0.00036372 | ||||
Buy Xname | 6206875 | 2308 days ago | IN | 0.00007875 ETH | 0.00036372 | ||||
Buy Xname | 6206875 | 2308 days ago | IN | 0.00007875 ETH | 0.00036372 | ||||
Buy Xname | 6206789 | 2308 days ago | IN | 0.000075 ETH | 0.00037971 | ||||
Buy Xname | 6206789 | 2308 days ago | IN | 0.000825 ETH | 0.00066062 | ||||
Withdraw | 6204324 | 2308 days ago | IN | 0 ETH | 0.00129814 | ||||
Buy Xname | 6198352 | 2309 days ago | IN | 0.00007883 ETH | 0.00036372 | ||||
Buy Xname | 6198308 | 2309 days ago | IN | 0.00007883 ETH | 0.00036372 | ||||
Buy Xname | 6198273 | 2309 days ago | IN | 0.00007507 ETH | 0.00034971 | ||||
Buy Xname | 6198209 | 2309 days ago | IN | 0.00007507 ETH | 0.00062791 | ||||
Re Load Xid | 6197476 | 2309 days ago | IN | 0 ETH | 0.00077068 | ||||
Withdraw | 6197242 | 2309 days ago | IN | 0 ETH | 0.00025349 | ||||
Re Load Xid | 6197227 | 2309 days ago | IN | 0 ETH | 0.0000636 | ||||
Buy Xid | 6197218 | 2309 days ago | IN | 0.01 ETH | 0.00036245 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
6454699 | 2267 days ago | 0.00000098 ETH | ||||
6454699 | 2267 days ago | 0.00000787 ETH | ||||
6454699 | 2267 days ago | 0.00000393 ETH | ||||
6454699 | 2267 days ago | 0.00000393 ETH | ||||
6396198 | 2276 days ago | 0.00000098 ETH | ||||
6396198 | 2276 days ago | 0.00000787 ETH | ||||
6396198 | 2276 days ago | 0.00000393 ETH | ||||
6396198 | 2276 days ago | 0.00000393 ETH | ||||
6386048 | 2278 days ago | 0.0000464 ETH | ||||
6386048 | 2278 days ago | 0.0000464 ETH | ||||
6217118 | 2306 days ago | 0.00000093 ETH | ||||
6217118 | 2306 days ago | 0.00000093 ETH | ||||
6217118 | 2306 days ago | 0.0000075 ETH | ||||
6217118 | 2306 days ago | 0.00000375 ETH | ||||
6217118 | 2306 days ago | 0.00000375 ETH | ||||
6217112 | 2306 days ago | 0.00000093 ETH | ||||
6217112 | 2306 days ago | 0.00000093 ETH | ||||
6217112 | 2306 days ago | 0.0000075 ETH | ||||
6217112 | 2306 days ago | 0.00000375 ETH | ||||
6217112 | 2306 days ago | 0.00000375 ETH | ||||
6217111 | 2306 days ago | 0.00001031 ETH | ||||
6217111 | 2306 days ago | 0.00001031 ETH | ||||
6217111 | 2306 days ago | 0.0000825 ETH | ||||
6217111 | 2306 days ago | 0.00004125 ETH | ||||
6217111 | 2306 days ago | 0.00004125 ETH |
Loading...
Loading
Contract Name:
Duang8
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-08-20 */ pragma solidity ^0.4.24; contract F3Devents { // fired whenever a player registers a name event onNewName ( uint256 indexed playerID, address indexed playerAddress, bytes32 indexed playerName, bool isNewPlayer, uint256 affiliateID, address affiliateAddress, bytes32 affiliateName, uint256 amountPaid, uint256 timeStamp ); // fired at end of buy or reload event onEndTx ( uint256 compressedData, uint256 compressedIDs, bytes32 playerName, address playerAddress, uint256 ethIn, uint256 keysBought, address winnerAddr, bytes32 winnerName, uint256 amountWon, uint256 newPot, uint256 P3DAmount, uint256 genAmount, uint256 potAmount, uint256 airDropPot ); // fired whenever theres a withdraw event onWithdraw ( uint256 indexed playerID, address playerAddress, bytes32 playerName, uint256 ethOut, uint256 timeStamp ); // fired whenever a withdraw forces end round to be ran event onWithdrawAndDistribute ( address playerAddress, bytes32 playerName, uint256 ethOut, uint256 compressedData, uint256 compressedIDs, address winnerAddr, bytes32 winnerName, uint256 amountWon, uint256 newPot, uint256 P3DAmount, uint256 genAmount ); // (fomo3d short only) fired whenever a player tries a buy after round timer // hit zero, and causes end round to be ran. event onBuyAndDistribute ( address playerAddress, bytes32 playerName, uint256 ethIn, uint256 compressedData, uint256 compressedIDs, address winnerAddr, bytes32 winnerName, uint256 amountWon, uint256 newPot, uint256 P3DAmount, uint256 genAmount ); // (fomo3d short only) fired whenever a player tries a reload after round timer // hit zero, and causes end round to be ran. event onReLoadAndDistribute ( address playerAddress, bytes32 playerName, uint256 compressedData, uint256 compressedIDs, address winnerAddr, bytes32 winnerName, uint256 amountWon, uint256 newPot, uint256 P3DAmount, uint256 genAmount ); // fired whenever an affiliate is paid event onAffiliatePayout ( uint256 indexed affiliateID, address affiliateAddress, bytes32 affiliateName, uint256 indexed roundID, uint256 indexed buyerID, uint256 amount, uint256 timeStamp ); // received pot swap deposit event onPotSwapDeposit ( uint256 roundID, uint256 amountAddedToPot ); // received end Round event onEndRound ( uint256 roundID, address winnerAddr, bytes32 winnerName, uint256 amountWon, uint256 newPot ); } //============================================================================== // _ _ _ _|_ _ _ __|_ _ _ _|_ _ . // (_(_)| | | | (_|(_ | _\(/_ | |_||_) . //====================================|========================================= contract modularShort is F3Devents {} contract Duang8 is modularShort { using SafeMath for *; using NameFilter for string; using F3DKeysCalcShort for uint256; PlayerBookInterface constant private PlayerBook = PlayerBookInterface(0xE840E25BaB3F1F02eb1244a3aDC8965F5864f22E); //============================================================================== // _ _ _ |`. _ _ _ |_ | _ _ . // (_(_)| |~|~|(_||_|| (_||_)|(/__\ . (game settings) //=================_|=========================================================== address private admin = msg.sender; address private shareCom = 0x2F0839f736197117796967452310F025a330DA45; address private groupCut = 0x2924C3BfA7A20eB7AEcB6c38F4576eDcf7a72Df3; string constant public name = "duang8"; string constant public symbol = "duang8"; uint256 private rndExtra_ = 0; // length of the very first ICO uint256 private rndGap_ = 2 minutes; // length of ICO phase, set to 1 year for EOS. uint256 constant private rndInit_ = 24 hours; // round timer starts at this uint256 constant private rndInc_ = 30 seconds; // every full key purchased adds this much to the timer uint256 constant private rndMax_ = 24 hours; // max length a round timer can be uint256 constant private rndLimit_ = 5000; // limit rnd eth purchase //============================================================================== // _| _ _|_ _ _ _ _|_ _ . // (_|(_| | (_| _\(/_ | |_||_) . (data used to store game info that changes) //=============================|================================================ uint256 public airDropPot_; // person who gets the airdrop wins part of this pot uint256 public airDropTracker_ = 0; // incremented each time a "qualified" tx occurs. used to determine winning air drop uint256 public rID_; // round id number / total rounds that have happened //**************** // PLAYER DATA //**************** mapping (address => uint256) public pIDxAddr_; // (addr => pID) returns player id by address mapping (bytes32 => uint256) public pIDxName_; // (name => pID) returns player id by name mapping (uint256 => F3Ddatasets.Player) public plyr_; // (pID => data) player data mapping (uint256 => mapping (uint256 => F3Ddatasets.PlayerRounds)) public plyrRnds_; // (pID => rID => data) player round data by player id & round id mapping (uint256 => mapping (bytes32 => bool)) public plyrNames_; // (pID => name => bool) list of names a player owns. (used so you can change your display name amongst any name you own) //**************** // ROUND DATA //**************** mapping (uint256 => F3Ddatasets.Round) public round_; // (rID => data) round data mapping (uint256 => mapping(uint256 => uint256)) public rndTmEth_; // (rID => tID => data) eth in per team, by round id and team id //**************** // TEAM FEE DATA //**************** mapping (uint256 => F3Ddatasets.TeamFee) public fees_; // (team => fees) fee distribution by team mapping (uint256 => F3Ddatasets.PotSplit) public potSplit_; // (team => fees) pot split distribution by team //============================================================================== // _ _ _ __|_ _ __|_ _ _ . // (_(_)| |_\ | | |_|(_ | (_)| . (initial data setup upon contract deploy) //============================================================================== constructor() public { // Team allocation structures // 0 = whales // 1 = bears // 2 = sneks // 3 = bulls // Team allocation percentages // (F3D) + (Pot , Referrals, Community) // Referrals / Community rewards are mathematically designed to come from the winner's share of the pot. fees_[0] = F3Ddatasets.TeamFee(23,0); //48% to pot, 18% to aff, 10% to com, 1% to air drop pot fees_[1] = F3Ddatasets.TeamFee(33,0); //38% to pot, 18% to aff, 10% to com, 1% to air drop pot fees_[2] = F3Ddatasets.TeamFee(53,0); //18% to pot, 18% to aff, 10% to com, 1% to air drop pot fees_[3] = F3Ddatasets.TeamFee(43,0); //28% to pot, 18% to aff, 10% to com, 1% to air drop pot // how to split up the final pot based on which team was picked // (F3D) potSplit_[0] = F3Ddatasets.PotSplit(42,0); //48% to winner, 0% to next round, 10% to com potSplit_[1] = F3Ddatasets.PotSplit(34,0); //48% to winner, 8% to next round, 10% to com potSplit_[2] = F3Ddatasets.PotSplit(18,0); //48% to winner, 24% to next round, 10% to com potSplit_[3] = F3Ddatasets.PotSplit(26,0); //48% to winner, 16% to next round, 10% to com } //============================================================================== // _ _ _ _|. |`. _ _ _ . // | | |(_)(_||~|~|(/_| _\ . (these are safety checks) //============================================================================== /** * @dev used to make sure no one can interact with contract until it has * been activated. */ modifier isActivated() { require(activated_ == true, "its not ready yet. check ?eta in discord"); _; } /** * @dev prevents contracts from interacting with fomo3d */ modifier isHuman() { address _addr = msg.sender; uint256 _codeLength; assembly {_codeLength := extcodesize(_addr)} require(_codeLength == 0, "sorry humans only"); _; } /** * @dev sets boundaries for incoming tx */ modifier isWithinLimits(uint256 _eth) { require(_eth >= 1000000000, "pocket lint: not a valid currency"); require(_eth <= 100000000000000000000000, "no vitalik, no"); _; } //============================================================================== // _ |_ |. _ |` _ __|_. _ _ _ . // |_)|_||_)||(_ ~|~|_|| |(_ | |(_)| |_\ . (use these to interact with contract) //====|========================================================================= /** * @dev emergency buy uses last stored affiliate ID and team snek */ function() isActivated() isHuman() isWithinLimits(msg.value) public payable { // set up our tx event data and determine if player is new or not F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_); // fetch player id uint256 _pID = pIDxAddr_[msg.sender]; // buy core buyCore(_pID, plyr_[_pID].laff, 2, _eventData_); } function buyXid(uint256 _affCode, uint256 _team) isActivated() isHuman() isWithinLimits(msg.value) public payable { // set up our tx event data and determine if player is new or not F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_); // fetch player id uint256 _pID = pIDxAddr_[msg.sender]; // manage affiliate residuals // if no affiliate code was given or player tried to use their own, lolz if (_affCode == 0 || _affCode == _pID) { // use last stored affiliate code _affCode = plyr_[_pID].laff; // if affiliate code was given & its not the same as previously stored } else if (_affCode != plyr_[_pID].laff) { // update last affiliate plyr_[_pID].laff = _affCode; } // verify a valid team was selected _team = verifyTeam(_team); // buy core buyCore(_pID, _affCode, _team, _eventData_); } function buyXaddr(address _affCode, uint256 _team) isActivated() isHuman() isWithinLimits(msg.value) public payable { // set up our tx event data and determine if player is new or not F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_); // fetch player id uint256 _pID = pIDxAddr_[msg.sender]; // manage affiliate residuals uint256 _affID; // if no affiliate code was given or player tried to use their own, lolz if (_affCode == address(0) || _affCode == msg.sender) { // use last stored affiliate code _affID = plyr_[_pID].laff; // if affiliate code was given } else { // get affiliate ID from aff Code _affID = pIDxAddr_[_affCode]; // if affID is not the same as previously stored if (_affID != plyr_[_pID].laff) { // update last affiliate plyr_[_pID].laff = _affID; } } // verify a valid team was selected _team = verifyTeam(_team); // buy core buyCore(_pID, _affID, _team, _eventData_); } function buyXname(bytes32 _affCode, uint256 _team) isActivated() isHuman() isWithinLimits(msg.value) public payable { // set up our tx event data and determine if player is new or not F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_); // fetch player id uint256 _pID = pIDxAddr_[msg.sender]; // manage affiliate residuals uint256 _affID; // if no affiliate code was given or player tried to use their own, lolz if (_affCode == '' || _affCode == plyr_[_pID].name) { // use last stored affiliate code _affID = plyr_[_pID].laff; // if affiliate code was given } else { // get affiliate ID from aff Code _affID = pIDxName_[_affCode]; // if affID is not the same as previously stored if (_affID != plyr_[_pID].laff) { // update last affiliate plyr_[_pID].laff = _affID; } } // verify a valid team was selected _team = verifyTeam(_team); // buy core buyCore(_pID, _affID, _team, _eventData_); } function reLoadXid(uint256 _affCode, uint256 _team, uint256 _eth) isActivated() isHuman() isWithinLimits(_eth) public { // set up our tx event data F3Ddatasets.EventReturns memory _eventData_; // fetch player ID uint256 _pID = pIDxAddr_[msg.sender]; // manage affiliate residuals // if no affiliate code was given or player tried to use their own, lolz if (_affCode == 0 || _affCode == _pID) { // use last stored affiliate code _affCode = plyr_[_pID].laff; // if affiliate code was given & its not the same as previously stored } else if (_affCode != plyr_[_pID].laff) { // update last affiliate plyr_[_pID].laff = _affCode; } // verify a valid team was selected _team = verifyTeam(_team); // reload core reLoadCore(_pID, _affCode, _team, _eth, _eventData_); } function reLoadXaddr(address _affCode, uint256 _team, uint256 _eth) isActivated() isHuman() isWithinLimits(_eth) public { // set up our tx event data F3Ddatasets.EventReturns memory _eventData_; // fetch player ID uint256 _pID = pIDxAddr_[msg.sender]; // manage affiliate residuals uint256 _affID; // if no affiliate code was given or player tried to use their own, lolz if (_affCode == address(0) || _affCode == msg.sender) { // use last stored affiliate code _affID = plyr_[_pID].laff; // if affiliate code was given } else { // get affiliate ID from aff Code _affID = pIDxAddr_[_affCode]; // if affID is not the same as previously stored if (_affID != plyr_[_pID].laff) { // update last affiliate plyr_[_pID].laff = _affID; } } // verify a valid team was selected _team = verifyTeam(_team); // reload core reLoadCore(_pID, _affID, _team, _eth, _eventData_); } function reLoadXname(bytes32 _affCode, uint256 _team, uint256 _eth) isActivated() isHuman() isWithinLimits(_eth) public { // set up our tx event data F3Ddatasets.EventReturns memory _eventData_; // fetch player ID uint256 _pID = pIDxAddr_[msg.sender]; // manage affiliate residuals uint256 _affID; // if no affiliate code was given or player tried to use their own, lolz if (_affCode == '' || _affCode == plyr_[_pID].name) { // use last stored affiliate code _affID = plyr_[_pID].laff; // if affiliate code was given } else { // get affiliate ID from aff Code _affID = pIDxName_[_affCode]; // if affID is not the same as previously stored if (_affID != plyr_[_pID].laff) { // update last affiliate plyr_[_pID].laff = _affID; } } // verify a valid team was selected _team = verifyTeam(_team); // reload core reLoadCore(_pID, _affID, _team, _eth, _eventData_); } /** * @dev withdraws all of your earnings. * -functionhash- 0x3ccfd60b */ function withdraw() isActivated() isHuman() public { // setup local rID uint256 _rID = rID_; // grab time uint256 _now = now; // fetch player ID uint256 _pID = pIDxAddr_[msg.sender]; // setup temp var for player eth uint256 _eth; uint256 _withdrawFee; // check to see if round has ended and no one has run round end yet if (_now > round_[_rID].end && round_[_rID].ended == false && round_[_rID].plyr != 0) { // set up our tx event data F3Ddatasets.EventReturns memory _eventData_; // end the round (distributes pot) round_[_rID].ended = true; _eventData_ = endRound(_eventData_); // get their earnings _eth = withdrawEarnings(_pID); // gib moni if (_eth > 0) { //10% trade tax _withdrawFee = _eth / 10; uint256 _p1 = _withdrawFee / 2; uint256 _p2 = _withdrawFee / 2; shareCom.transfer(_p1); admin.transfer(_p2); plyr_[_pID].addr.transfer(_eth.sub(_withdrawFee)); } // build event data _eventData_.compressedData = _eventData_.compressedData + (_now * 1000000000000000000); _eventData_.compressedIDs = _eventData_.compressedIDs + _pID; // fire withdraw and distribute event emit F3Devents.onWithdrawAndDistribute ( msg.sender, plyr_[_pID].name, _eth, _eventData_.compressedData, _eventData_.compressedIDs, _eventData_.winnerAddr, _eventData_.winnerName, _eventData_.amountWon, _eventData_.newPot, _eventData_.P3DAmount, _eventData_.genAmount ); // in any other situation } else { // get their earnings _eth = withdrawEarnings(_pID); // gib moni if (_eth > 0) { //10% trade tax _withdrawFee = _eth / 10; _p1 = _withdrawFee / 2; _p2 = _withdrawFee / 2; shareCom.transfer(_p1); admin.transfer(_p2); plyr_[_pID].addr.transfer(_eth.sub(_withdrawFee)); } // fire withdraw event emit F3Devents.onWithdraw(_pID, msg.sender, plyr_[_pID].name, _eth, _now); } } function registerNameXID(string _nameString, uint256 _affCode, bool _all) isHuman() public payable { bytes32 _name = _nameString.nameFilter(); address _addr = msg.sender; uint256 _paid = msg.value; (bool _isNewPlayer, uint256 _affID) = PlayerBook.registerNameXIDFromDapp.value(_paid)(_addr, _name, _affCode, _all); uint256 _pID = pIDxAddr_[_addr]; // fire event emit F3Devents.onNewName(_pID, _addr, _name, _isNewPlayer, _affID, plyr_[_affID].addr, plyr_[_affID].name, _paid, now); } function registerNameXaddr(string _nameString, address _affCode, bool _all) isHuman() public payable { bytes32 _name = _nameString.nameFilter(); address _addr = msg.sender; uint256 _paid = msg.value; (bool _isNewPlayer, uint256 _affID) = PlayerBook.registerNameXaddrFromDapp.value(msg.value)(msg.sender, _name, _affCode, _all); uint256 _pID = pIDxAddr_[_addr]; // fire event emit F3Devents.onNewName(_pID, _addr, _name, _isNewPlayer, _affID, plyr_[_affID].addr, plyr_[_affID].name, _paid, now); } function registerNameXname(string _nameString, bytes32 _affCode, bool _all) isHuman() public payable { bytes32 _name = _nameString.nameFilter(); address _addr = msg.sender; uint256 _paid = msg.value; (bool _isNewPlayer, uint256 _affID) = PlayerBook.registerNameXnameFromDapp.value(msg.value)(msg.sender, _name, _affCode, _all); uint256 _pID = pIDxAddr_[_addr]; // fire event emit F3Devents.onNewName(_pID, _addr, _name, _isNewPlayer, _affID, plyr_[_affID].addr, plyr_[_affID].name, _paid, now); } //============================================================================== // _ _ _|__|_ _ _ _ . // (_|(/_ | | (/_| _\ . (for UI & viewing things on etherscan) //=====_|======================================================================= /** * @dev return the price buyer will pay for next 1 individual key. * -functionhash- 0x018a25e8 * @return price for next key bought (in wei format) */ function getBuyPrice() public view returns(uint256) { // setup local rID uint256 _rID = rID_; // grab time uint256 _now = now; // are we in a round? if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0))) return ( (round_[_rID].keys.add(1000000000000000000)).ethRec(1000000000000000000) ); else // rounds over. need price for new round return ( 100000000000000 ); // init } /** * @dev returns time left. dont spam this, you'll ddos yourself from your node * provider * -functionhash- 0xc7e284b8 * @return time left in seconds */ function getTimeLeft() public view returns(uint256) { // setup local rID uint256 _rID = rID_; // grab time uint256 _now = now; if (_now < round_[_rID].end) if (_now > round_[_rID].strt + rndGap_) return( (round_[_rID].end).sub(_now) ); else return( (round_[_rID].strt + rndGap_).sub(_now) ); else return(0); } function getPlayerVaults(uint256 _pID) public view //win,gen,aff returns(uint256 ,uint256, uint256) { // setup local rID uint256 _rID = rID_; // if round has ended. but round end has not been run (so contract has not distributed winnings) if (now > round_[_rID].end && round_[_rID].ended == false && round_[_rID].plyr != 0) { // if player is winner if (round_[_rID].plyr == _pID) { return ( (plyr_[_pID].win).add( ((round_[_rID].pot).mul(48)) / 100 ), (plyr_[_pID].gen).add( getPlayerVaultsHelper(_pID, _rID).sub(plyrRnds_[_pID][_rID].mask) ), plyr_[_pID].aff ); // if player is not the winner } else { return ( plyr_[_pID].win, (plyr_[_pID].gen).add( getPlayerVaultsHelper(_pID, _rID).sub(plyrRnds_[_pID][_rID].mask) ), plyr_[_pID].aff ); } // if round is still going on, or round has ended and round end has been ran } else { return ( plyr_[_pID].win, (plyr_[_pID].gen).add(calcUnMaskedEarnings(_pID, plyr_[_pID].lrnd)), plyr_[_pID].aff ); } } /** * solidity hates stack limits. this lets us avoid that hate */ function getPlayerVaultsHelper(uint256 _pID, uint256 _rID) private view returns(uint256) { return( ((((round_[_rID].mask).add(((((round_[_rID].pot).mul(potSplit_[round_[_rID].team].gen)) / 100).mul(1000000000000000000)) / (round_[_rID].keys))).mul(plyrRnds_[_pID][_rID].keys)) / 1000000000000000000) ); } function getCurrentRoundInfo() public view returns(uint256, uint256, uint256, uint256, uint256, uint256, uint256, address, bytes32, uint256, uint256, uint256, uint256, uint256) { // setup local rID uint256 _rID = rID_; return ( round_[_rID].ico, //0 _rID, //1 round_[_rID].keys, //2 round_[_rID].end, //3 round_[_rID].strt, //4 round_[_rID].pot, //5 (round_[_rID].team + (round_[_rID].plyr * 10)), //6 plyr_[round_[_rID].plyr].addr, //7 plyr_[round_[_rID].plyr].name, //8 rndTmEth_[_rID][0], //9 rndTmEth_[_rID][1], //10 rndTmEth_[_rID][2], //11 rndTmEth_[_rID][3], //12 airDropTracker_ + (airDropPot_ * 1000) //13 ); } function getPlayerInfoByAddress(address _addr) public view returns(uint256, bytes32, uint256, uint256, uint256, uint256, uint256) { // setup local rID uint256 _rID = rID_; if (_addr == address(0)) { _addr == msg.sender; } uint256 _pID = pIDxAddr_[_addr]; return ( _pID, //0 plyr_[_pID].name, //1 plyrRnds_[_pID][_rID].keys, //2 plyr_[_pID].win, //3 (plyr_[_pID].gen).add(calcUnMaskedEarnings(_pID, plyr_[_pID].lrnd)), //4 plyr_[_pID].aff, //5 plyrRnds_[_pID][_rID].eth //6 ); } //============================================================================== // _ _ _ _ | _ _ . _ . // (_(_)| (/_ |(_)(_||(_ . (this + tools + calcs + modules = our softwares engine) //=====================_|======================================================= /** * @dev logic runs whenever a buy order is executed. determines how to handle * incoming eth depending on if we are in an active round or not */ function buyCore(uint256 _pID, uint256 _affID, uint256 _team, F3Ddatasets.EventReturns memory _eventData_) private { // setup local rID uint256 _rID = rID_; // grab time uint256 _now = now; // if round is active if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0))) { // call core core(_rID, _pID, msg.value, _affID, _team, _eventData_); // if round is not active } else { // check to see if end round needs to be ran if (_now > round_[_rID].end && round_[_rID].ended == false) { // end the round (distributes pot) & start new round round_[_rID].ended = true; _eventData_ = endRound(_eventData_); // build event data _eventData_.compressedData = _eventData_.compressedData + (_now * 1000000000000000000); _eventData_.compressedIDs = _eventData_.compressedIDs + _pID; // fire buy and distribute event emit F3Devents.onBuyAndDistribute ( msg.sender, plyr_[_pID].name, msg.value, _eventData_.compressedData, _eventData_.compressedIDs, _eventData_.winnerAddr, _eventData_.winnerName, _eventData_.amountWon, _eventData_.newPot, _eventData_.P3DAmount, _eventData_.genAmount ); } // put eth in players vault plyr_[_pID].gen = plyr_[_pID].gen.add(msg.value); } } /** * @dev logic runs whenever a reload order is executed. determines how to handle * incoming eth depending on if we are in an active round or not */ function reLoadCore(uint256 _pID, uint256 _affID, uint256 _team, uint256 _eth, F3Ddatasets.EventReturns memory _eventData_) private { // setup local rID uint256 _rID = rID_; // grab time uint256 _now = now; // if round is active if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0))) { // get earnings from all vaults and return unused to gen vault // because we use a custom safemath library. this will throw if player // tried to spend more eth than they have. plyr_[_pID].gen = withdrawEarnings(_pID).sub(_eth); // call core core(_rID, _pID, _eth, _affID, _team, _eventData_); // if round is not active and end round needs to be ran } else if (_now > round_[_rID].end && round_[_rID].ended == false) { // end the round (distributes pot) & start new round round_[_rID].ended = true; _eventData_ = endRound(_eventData_); // build event data _eventData_.compressedData = _eventData_.compressedData + (_now * 1000000000000000000); _eventData_.compressedIDs = _eventData_.compressedIDs + _pID; // fire buy and distribute event emit F3Devents.onReLoadAndDistribute ( msg.sender, plyr_[_pID].name, _eventData_.compressedData, _eventData_.compressedIDs, _eventData_.winnerAddr, _eventData_.winnerName, _eventData_.amountWon, _eventData_.newPot, _eventData_.P3DAmount, _eventData_.genAmount ); } } /** * @dev this is the core logic for any buy/reload that happens while a round * is live. */ function core(uint256 _rID, uint256 _pID, uint256 _eth, uint256 _affID, uint256 _team, F3Ddatasets.EventReturns memory _eventData_) private { // if player is new to round if (plyrRnds_[_pID][_rID].keys == 0) _eventData_ = managePlayer(_pID, _eventData_); // if eth left is greater than min eth allowed (sorry no pocket lint) if (_eth > 1000000000) { // mint the new keys uint256 _keys = (round_[_rID].eth).keysRec(_eth); // if they bought at least 1 whole key if (_keys >= 1000000000000000000) { updateTimer(_keys, _rID); // set new leaders if (round_[_rID].plyr != _pID) round_[_rID].plyr = _pID; if (round_[_rID].team != _team) round_[_rID].team = _team; // set the new leader bool to true _eventData_.compressedData = _eventData_.compressedData + 100; } // manage airdrops if (_eth >= 100000000000000000) { airDropTracker_++; if (airdrop() == true) { // gib muni uint256 _prize; if (_eth >= 10000000000000000000) { // calculate prize and give it to winner _prize = ((airDropPot_).mul(75)) / 100; plyr_[_pID].win = (plyr_[_pID].win).add(_prize); // adjust airDropPot airDropPot_ = (airDropPot_).sub(_prize); // let event know a tier 3 prize was won _eventData_.compressedData += 300000000000000000000000000000000; } else if (_eth >= 1000000000000000000 && _eth < 10000000000000000000) { // calculate prize and give it to winner _prize = ((airDropPot_).mul(50)) / 100; plyr_[_pID].win = (plyr_[_pID].win).add(_prize); // adjust airDropPot airDropPot_ = (airDropPot_).sub(_prize); // let event know a tier 2 prize was won _eventData_.compressedData += 200000000000000000000000000000000; } else if (_eth >= 100000000000000000 && _eth < 1000000000000000000) { // calculate prize and give it to winner _prize = ((airDropPot_).mul(25)) / 100; plyr_[_pID].win = (plyr_[_pID].win).add(_prize); // adjust airDropPot airDropPot_ = (airDropPot_).sub(_prize); // let event know a tier 3 prize was won _eventData_.compressedData += 300000000000000000000000000000000; } // set airdrop happened bool to true _eventData_.compressedData += 10000000000000000000000000000000; // let event know how much was won _eventData_.compressedData += _prize * 1000000000000000000000000000000000; // reset air drop tracker airDropTracker_ = 0; } } // store the air drop tracker number (number of buys since last airdrop) _eventData_.compressedData = _eventData_.compressedData + (airDropTracker_ * 1000); // update player plyrRnds_[_pID][_rID].keys = _keys.add(plyrRnds_[_pID][_rID].keys); plyrRnds_[_pID][_rID].eth = _eth.add(plyrRnds_[_pID][_rID].eth); // update round round_[_rID].keys = _keys.add(round_[_rID].keys); round_[_rID].eth = _eth.add(round_[_rID].eth); rndTmEth_[_rID][_team] = _eth.add(rndTmEth_[_rID][_team]); // distribute eth _eventData_ = distributeExternal(_rID, _pID, _eth, _affID, _team, _eventData_); _eventData_ = distributeInternal(_rID, _pID, _eth, _team, _keys, _eventData_); // call end tx function to fire end tx event. endTx(_pID, _team, _eth, _keys, _eventData_); } } //============================================================================== // _ _ | _ | _ _|_ _ _ _ . // (_(_||(_|_||(_| | (_)| _\ . //============================================================================== /** * @dev calculates unmasked earnings (just calculates, does not update mask) * @return earnings in wei format */ function calcUnMaskedEarnings(uint256 _pID, uint256 _rIDlast) private view returns(uint256) { return( (((round_[_rIDlast].mask).mul(plyrRnds_[_pID][_rIDlast].keys)) / (1000000000000000000)).sub(plyrRnds_[_pID][_rIDlast].mask) ); } /** * @dev returns the amount of keys you would get given an amount of eth. * -functionhash- 0xce89c80c * @param _rID round ID you want price for * @param _eth amount of eth sent in * @return keys received */ function calcKeysReceived(uint256 _rID, uint256 _eth) public view returns(uint256) { // grab time uint256 _now = now; // are we in a round? if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0))) return ( (round_[_rID].eth).keysRec(_eth) ); else // rounds over. need keys for new round return ( (_eth).keys() ); } /** * @dev returns current eth price for X keys. * -functionhash- 0xcf808000 * @param _keys number of keys desired (in 18 decimal format) * @return amount of eth needed to send */ function iWantXKeys(uint256 _keys) public view returns(uint256) { // setup local rID uint256 _rID = rID_; // grab time uint256 _now = now; // are we in a round? if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0))) return ( (round_[_rID].keys.add(_keys)).ethRec(_keys) ); else // rounds over. need price for new round return ( (_keys).eth() ); } //============================================================================== // _|_ _ _ | _ . // | (_)(_)|_\ . //============================================================================== /** * @dev receives name/player info from names contract */ function receivePlayerInfo(uint256 _pID, address _addr, bytes32 _name, uint256 _laff) external { require (msg.sender == address(PlayerBook), "your not playerNames contract... hmmm.."); if (pIDxAddr_[_addr] != _pID) pIDxAddr_[_addr] = _pID; if (pIDxName_[_name] != _pID) pIDxName_[_name] = _pID; if (plyr_[_pID].addr != _addr) plyr_[_pID].addr = _addr; if (plyr_[_pID].name != _name) plyr_[_pID].name = _name; if (plyr_[_pID].laff != _laff) plyr_[_pID].laff = _laff; if (plyrNames_[_pID][_name] == false) plyrNames_[_pID][_name] = true; } /** * @dev receives entire player name list */ function receivePlayerNameList(uint256 _pID, bytes32 _name) external { require (msg.sender == address(PlayerBook), "your not playerNames contract... hmmm.."); if(plyrNames_[_pID][_name] == false) plyrNames_[_pID][_name] = true; } /** * @dev gets existing or registers new pID. use this when a player may be new * @return pID */ function determinePID(F3Ddatasets.EventReturns memory _eventData_) private returns (F3Ddatasets.EventReturns) { uint256 _pID = pIDxAddr_[msg.sender]; // if player is new to this version of fomo3d if (_pID == 0) { // grab their player ID, name and last aff ID, from player names contract _pID = PlayerBook.getPlayerID(msg.sender); bytes32 _name = PlayerBook.getPlayerName(_pID); uint256 _laff = PlayerBook.getPlayerLAff(_pID); // set up player account pIDxAddr_[msg.sender] = _pID; plyr_[_pID].addr = msg.sender; if (_name != "") { pIDxName_[_name] = _pID; plyr_[_pID].name = _name; plyrNames_[_pID][_name] = true; } if (_laff != 0 && _laff != _pID) plyr_[_pID].laff = _laff; // set the new player bool to true _eventData_.compressedData = _eventData_.compressedData + 1; } return (_eventData_); } /** * @dev checks to make sure user picked a valid team. if not sets team * to default (sneks) */ function verifyTeam(uint256 _team) private pure returns (uint256) { if (_team < 0 || _team > 3) return(2); else return(_team); } /** * @dev decides if round end needs to be run & new round started. and if * player unmasked earnings from previously played rounds need to be moved. */ function managePlayer(uint256 _pID, F3Ddatasets.EventReturns memory _eventData_) private returns (F3Ddatasets.EventReturns) { // if player has played a previous round, move their unmasked earnings // from that round to gen vault. if (plyr_[_pID].lrnd != 0) updateGenVault(_pID, plyr_[_pID].lrnd); // update player's last round played plyr_[_pID].lrnd = rID_; // set the joined round bool to true _eventData_.compressedData = _eventData_.compressedData + 10; return(_eventData_); } /** * @dev ends the round. manages paying out winner/splitting up pot */ function endRound(F3Ddatasets.EventReturns memory _eventData_) private returns (F3Ddatasets.EventReturns) { // setup local rID uint256 _rID = rID_; // grab our winning player and team id's uint256 _winPID = round_[_rID].plyr; uint256 _winTID = round_[_rID].team; // grab our pot amount uint256 _pot = round_[_rID].pot; // calculate our winner share, community rewards, gen share, // p3d share, and amount reserved for next pot uint256 _win = (_pot.mul(48)) / 100; uint256 _com = (_pot / 10); uint256 _gen = (_pot.mul(potSplit_[_winTID].gen)) / 100; uint256 _res = (((_pot.sub(_win)).sub(_com)).sub(_gen)); // calculate ppt for round mask uint256 _ppt = (_gen.mul(1000000000000000000)) / (round_[_rID].keys); uint256 _dust = _gen.sub((_ppt.mul(round_[_rID].keys)) / 1000000000000000000); if (_dust > 0) { _gen = _gen.sub(_dust); _res = _res.add(_dust); } // pay our winner plyr_[_winPID].win = _win.add(plyr_[_winPID].win); // community rewards shareCom.transfer((_com / 2)); admin.transfer((_com / 2)); // distribute gen portion to key holders round_[_rID].mask = _ppt.add(round_[_rID].mask); // prepare event data _eventData_.compressedData = _eventData_.compressedData + (round_[_rID].end * 1000000); _eventData_.compressedIDs = _eventData_.compressedIDs + (_winPID * 100000000000000000000000000) + (_winTID * 100000000000000000); _eventData_.winnerAddr = plyr_[_winPID].addr; _eventData_.winnerName = plyr_[_winPID].name; _eventData_.amountWon = _win; _eventData_.genAmount = _gen; _eventData_.P3DAmount = 0; _eventData_.newPot = _res; // uint256 roundID, // address winnerAddr, // bytes32 winnerName, // uint256 amountWon, // uint256 newPot emit F3Devents.onEndRound ( _rID, plyr_[_winPID].addr, plyr_[_winPID].name, _win, _res ); // start next round rID_++; _rID++; round_[_rID].strt = now; round_[_rID].end = now.add(rndInit_).add(rndGap_); round_[_rID].pot = _res; return(_eventData_); } /** * @dev moves any unmasked earnings to gen vault. updates earnings mask */ function updateGenVault(uint256 _pID, uint256 _rIDlast) private { uint256 _earnings = calcUnMaskedEarnings(_pID, _rIDlast); if (_earnings > 0) { // put in gen vault plyr_[_pID].gen = _earnings.add(plyr_[_pID].gen); // zero out their earnings by updating mask plyrRnds_[_pID][_rIDlast].mask = _earnings.add(plyrRnds_[_pID][_rIDlast].mask); } } /** * @dev updates round timer based on number of whole keys bought. */ function updateTimer(uint256 _keys, uint256 _rID) private { // grab time uint256 _now = now; uint256 _rndInc = rndInc_; if(round_[_rID].pot > rndLimit_) { _rndInc = _rndInc / 2; } // calculate time based on number of keys bought uint256 _newTime; if (_now > round_[_rID].end && round_[_rID].plyr == 0) _newTime = (((_keys) / (1000000000000000000)).mul(_rndInc)).add(_now); else _newTime = (((_keys) / (1000000000000000000)).mul(_rndInc)).add(round_[_rID].end); // compare to max and set new end time if (_newTime < (rndMax_).add(_now)) round_[_rID].end = _newTime; else round_[_rID].end = rndMax_.add(_now); } /** * @dev generates a random number between 0-99 and checks to see if thats * resulted in an airdrop win * @return do we have a winner? */ function airdrop() private view returns(bool) { uint256 seed = uint256(keccak256(abi.encodePacked( (block.timestamp).add (block.difficulty).add ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)).add (block.gaslimit).add ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)).add (block.number) ))); if((seed - ((seed / 1000) * 1000)) < airDropTracker_) return(true); else return(false); } /** * @dev distributes eth based on fees to com, aff, and p3d */ function distributeExternal(uint256 _rID, uint256 _pID, uint256 _eth, uint256 _affID, uint256 _team, F3Ddatasets.EventReturns memory _eventData_) private returns(F3Ddatasets.EventReturns) { // pay community rewards uint256 _com = _eth / 10; uint256 _p3d; if (address(admin).call.value((_com / 2))() == false) { _p3d = _com / 2; _com = _com / 2; } if (address(shareCom).call.value((_com / 2))() == false) { _p3d += (_com / 2); _com = _com.sub(_com / 2); } // pay 1% out to FoMo3D short // uint256 _long = _eth / 100; // otherF3D_.potSwap.value(_long)(); _p3d = _p3d.add(distributeAff(_rID,_pID,_eth,_affID)); // pay out p3d // _p3d = _p3d.add((_eth.mul(fees_[_team].p3d)) / (100)); if (_p3d > 0) { // deposit to divies contract uint256 _potAmount = _p3d / 2; uint256 _amount = _p3d.sub(_potAmount); shareCom.transfer((_amount / 2)); admin.transfer((_amount / 2)); round_[_rID].pot = round_[_rID].pot.add(_potAmount); // set up event data _eventData_.P3DAmount = _p3d.add(_eventData_.P3DAmount); } return(_eventData_); } function distributeAff(uint256 _rID, uint256 _pID, uint256 _eth, uint256 _affID) private returns(uint256) { uint256 _addP3d = 0; // distribute share to affiliate uint256 _aff1 = _eth / 10; uint256 _aff2 = _eth / 20; uint256 _aff3 = _eth / 34; groupCut.transfer(_aff1); // decide what to do with affiliate share of fees // affiliate must not be self, and must have a name registered if ((_affID != 0) && (_affID != _pID) && (plyr_[_affID].name != '')) { plyr_[_pID].laffID = _affID; plyr_[_affID].aff = _aff2.add(plyr_[_affID].aff); emit F3Devents.onAffiliatePayout(_affID, plyr_[_affID].addr, plyr_[_affID].name, _rID, _pID, _aff2, now); //second level aff uint256 _secLaff = plyr_[_affID].laffID; if((_secLaff != 0) && (_secLaff != _pID)) { plyr_[_secLaff].aff = _aff3.add(plyr_[_secLaff].aff); emit F3Devents.onAffiliatePayout(_secLaff, plyr_[_secLaff].addr, plyr_[_secLaff].name, _rID, _pID, _aff3, now); } else { _addP3d = _addP3d.add(_aff3); } } else { _addP3d = _addP3d.add(_aff2); } return(_addP3d); } function getPlayerAff(uint256 _pID) public view returns (uint256,uint256,uint256) { uint256 _affID = plyr_[_pID].laffID; if (_affID != 0) { //second level aff uint256 _secondLaff = plyr_[_affID].laffID; if(_secondLaff != 0) { //third level aff uint256 _thirdAff = plyr_[_secondLaff].laffID; } } return (_affID,_secondLaff,_thirdAff); } function potSwap() external payable { // setup local rID uint256 _rID = rID_ + 1; round_[_rID].pot = round_[_rID].pot.add(msg.value); emit F3Devents.onPotSwapDeposit(_rID, msg.value); } /** * @dev distributes eth based on fees to gen and pot */ function distributeInternal(uint256 _rID, uint256 _pID, uint256 _eth, uint256 _team, uint256 _keys, F3Ddatasets.EventReturns memory _eventData_) private returns(F3Ddatasets.EventReturns) { // calculate gen share uint256 _gen = (_eth.mul(fees_[_team].gen)) / 100; // toss 1% into airdrop pot uint256 _air = (_eth / 100); airDropPot_ = airDropPot_.add(_air); // update eth balance (eth = eth - (com share + pot swap share + aff share + p3d share + airdrop pot share)) //_eth = _eth.sub(((_eth.mul(14)) / 100).add((_eth.mul(fees_[_team].p3d)) / 100)); _eth = _eth.sub(_eth.mul(29) / 100); // calculate pot uint256 _pot = _eth.sub(_gen); // distribute gen share (thats what updateMasks() does) and adjust // balances for dust. uint256 _dust = updateMasks(_rID, _pID, _gen, _keys); if (_dust > 0) _gen = _gen.sub(_dust); // add eth to pot round_[_rID].pot = _pot.add(_dust).add(round_[_rID].pot); // set up event data _eventData_.genAmount = _gen.add(_eventData_.genAmount); _eventData_.potAmount = _pot; return(_eventData_); } /** * @dev updates masks for round and player when keys are bought * @return dust left over */ function updateMasks(uint256 _rID, uint256 _pID, uint256 _gen, uint256 _keys) private returns(uint256) { // calc profit per key & round mask based on this buy: (dust goes to pot) uint256 _ppt = (_gen.mul(1000000000000000000)) / (round_[_rID].keys); round_[_rID].mask = _ppt.add(round_[_rID].mask); // calculate player earning from their own buy (only based on the keys // they just bought). & update player earnings mask uint256 _pearn = (_ppt.mul(_keys)) / (1000000000000000000); plyrRnds_[_pID][_rID].mask = (((round_[_rID].mask.mul(_keys)) / (1000000000000000000)).sub(_pearn)).add(plyrRnds_[_pID][_rID].mask); // calculate & return dust return(_gen.sub((_ppt.mul(round_[_rID].keys)) / (1000000000000000000))); } /** * @dev adds up unmasked earnings, & vault earnings, sets them all to 0 * @return earnings in wei format */ function withdrawEarnings(uint256 _pID) private returns(uint256) { // update gen vault updateGenVault(_pID, plyr_[_pID].lrnd); // from vaults uint256 _earnings = (plyr_[_pID].win).add(plyr_[_pID].gen).add(plyr_[_pID].aff); if (_earnings > 0) { plyr_[_pID].win = 0; plyr_[_pID].gen = 0; plyr_[_pID].aff = 0; } return(_earnings); } /** * @dev prepares compression data and fires event for buy or reload tx's */ function endTx(uint256 _pID, uint256 _team, uint256 _eth, uint256 _keys, F3Ddatasets.EventReturns memory _eventData_) private { _eventData_.compressedData = _eventData_.compressedData + (now * 1000000000000000000) + (_team * 100000000000000000000000000000); _eventData_.compressedIDs = _eventData_.compressedIDs + _pID + (rID_ * 10000000000000000000000000000000000000000000000000000); emit F3Devents.onEndTx ( _eventData_.compressedData, _eventData_.compressedIDs, plyr_[_pID].name, msg.sender, _eth, _keys, _eventData_.winnerAddr, _eventData_.winnerName, _eventData_.amountWon, _eventData_.newPot, _eventData_.P3DAmount, _eventData_.genAmount, _eventData_.potAmount, airDropPot_ ); } //============================================================================== // (~ _ _ _._|_ . // _)(/_(_|_|| | | \/ . //====================/========================================================= /** upon contract deploy, it will be deactivated. this is a one time * use function that will activate the contract. we do this so devs * have time to set things up on the web end **/ bool public activated_ = false; function activate() public { // only team just can activate require(msg.sender == admin, "only admin can activate"); // can only be ran once require(activated_ == false, "FOMO Short already activated"); // activate the contract activated_ = true; // lets start first round rID_ = 1; round_[1].strt = now + rndExtra_ - rndGap_; round_[1].end = now + rndInit_ + rndExtra_; } } //============================================================================== // __|_ _ __|_ _ . // _\ | | |_|(_ | _\ . //============================================================================== library F3Ddatasets { //compressedData key // [76-33][32][31][30][29][28-18][17][16-6][5-3][2][1][0] // 0 - new player (bool) // 1 - joined round (bool) // 2 - new leader (bool) // 3-5 - air drop tracker (uint 0-999) // 6-16 - round end time // 17 - winnerTeam // 18 - 28 timestamp // 29 - team // 30 - 0 = reinvest (round), 1 = buy (round), 2 = buy (ico), 3 = reinvest (ico) // 31 - airdrop happened bool // 32 - airdrop tier // 33 - airdrop amount won //compressedIDs key // [77-52][51-26][25-0] // 0-25 - pID // 26-51 - winPID // 52-77 - rID struct EventReturns { uint256 compressedData; uint256 compressedIDs; address winnerAddr; // winner address bytes32 winnerName; // winner name uint256 amountWon; // amount won uint256 newPot; // amount in new pot uint256 P3DAmount; // amount distributed to p3d uint256 genAmount; // amount distributed to gen uint256 potAmount; // amount added to pot } struct Player { address addr; // player address bytes32 name; // player name uint256 win; // winnings vault uint256 gen; // general vault uint256 aff; // affiliate vault uint256 lrnd; // last round played uint256 laff; // last affiliate id used uint256 laffID; // last affiliate id unaffected } struct PlayerRounds { uint256 eth; // eth player has added to round (used for eth limiter) uint256 keys; // keys uint256 mask; // player mask uint256 ico; // ICO phase investment } struct Round { uint256 plyr; // pID of player in lead uint256 team; // tID of team in lead uint256 end; // time ends/ended bool ended; // has round end function been ran uint256 strt; // time round started uint256 keys; // keys uint256 eth; // total eth in uint256 pot; // eth to pot (during round) / final amount paid to winner (after round ends) uint256 mask; // global mask uint256 ico; // total eth sent in during ICO phase uint256 icoGen; // total eth for gen during ICO phase uint256 icoAvg; // average key price for ICO phase } struct TeamFee { uint256 gen; // % of buy in thats paid to key holders of current round uint256 p3d; // % of buy in thats paid to p3d holders } struct PotSplit { uint256 gen; // % of pot thats paid to key holders of current round uint256 p3d; // % of pot thats paid to p3d holders } } //============================================================================== // | _ _ _ | _ . // |<(/_\/ (_(_||(_ . //=======/====================================================================== library F3DKeysCalcShort { using SafeMath for *; /** * @dev calculates number of keys received given X eth * @param _curEth current amount of eth in contract * @param _newEth eth being spent * @return amount of ticket purchased */ function keysRec(uint256 _curEth, uint256 _newEth) internal pure returns (uint256) { return(keys((_curEth).add(_newEth)).sub(keys(_curEth))); } /** * @dev calculates amount of eth received if you sold X keys * @param _curKeys current amount of keys that exist * @param _sellKeys amount of keys you wish to sell * @return amount of eth received */ function ethRec(uint256 _curKeys, uint256 _sellKeys) internal pure returns (uint256) { return((eth(_curKeys)).sub(eth(_curKeys.sub(_sellKeys)))); } /** * @dev calculates how many keys would exist with given an amount of eth * @param _eth eth "in contract" * @return number of keys that would exist */ function keys(uint256 _eth) internal pure returns(uint256) { return ((((((_eth).mul(1000000000000000000)).mul(312500000000000000000000000)).add(5624988281256103515625000000000000000000000000000000000000000000)).sqrt()).sub(74999921875000000000000000000000)) / (156250000); } /** * @dev calculates how much eth would be in contract given a number of keys * @param _keys number of keys "in contract" * @return eth that would exists */ function eth(uint256 _keys) internal pure returns(uint256) { return ((78125000).mul(_keys.sq()).add(((149999843750000).mul(_keys.mul(1000000000000000000))) / (2))) / ((1000000000000000000).sq()); } } //============================================================================== // . _ _|_ _ _ |` _ _ _ _ . // || | | (/_| ~|~(_|(_(/__\ . //============================================================================== interface PlayerBookInterface { function getPlayerID(address _addr) external returns (uint256); function getPlayerName(uint256 _pID) external view returns (bytes32); function getPlayerLAff(uint256 _pID) external view returns (uint256); function getPlayerAddr(uint256 _pID) external view returns (address); function getNameFee() external view returns (uint256); function registerNameXIDFromDapp(address _addr, bytes32 _name, uint256 _affCode, bool _all) external payable returns(bool, uint256); function registerNameXaddrFromDapp(address _addr, bytes32 _name, address _affCode, bool _all) external payable returns(bool, uint256); function registerNameXnameFromDapp(address _addr, bytes32 _name, bytes32 _affCode, bool _all) external payable returns(bool, uint256); } library NameFilter { function nameFilter(string _input) internal pure returns(bytes32) { bytes memory _temp = bytes(_input); uint256 _length = _temp.length; //sorry limited to 32 characters require (_length <= 32 && _length > 0, "string must be between 1 and 32 characters"); // make sure it doesnt start with or end with space require(_temp[0] != 0x20 && _temp[_length-1] != 0x20, "string cannot start or end with space"); // make sure first two characters are not 0x if (_temp[0] == 0x30) { require(_temp[1] != 0x78, "string cannot start with 0x"); require(_temp[1] != 0x58, "string cannot start with 0X"); } // create a bool to track if we have a non number character bool _hasNonNumber; // convert & check for (uint256 i = 0; i < _length; i++) { // if its uppercase A-Z if (_temp[i] > 0x40 && _temp[i] < 0x5b) { // convert to lower case a-z _temp[i] = byte(uint(_temp[i]) + 32); // we have a non number if (_hasNonNumber == false) _hasNonNumber = true; } else { require ( // require character is a space _temp[i] == 0x20 || // OR lowercase a-z (_temp[i] > 0x60 && _temp[i] < 0x7b) || // or 0-9 (_temp[i] > 0x2f && _temp[i] < 0x3a), "string contains invalid characters" ); // make sure theres not 2x spaces in a row if (_temp[i] == 0x20) require( _temp[i+1] != 0x20, "string cannot contain consecutive spaces"); // see if we have a character other than a number if (_hasNonNumber == false && (_temp[i] < 0x30 || _temp[i] > 0x39)) _hasNonNumber = true; } } require(_hasNonNumber == true, "string cannot be only numbers"); bytes32 _ret; assembly { _ret := mload(add(_temp, 32)) } return (_ret); } } library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { if (a == 0) { return 0; } c = a * b; require(c / a == b, "SafeMath mul failed"); return c; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath sub failed"); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; require(c >= a, "SafeMath add failed"); return c; } /** * @dev gives square root of given x. */ function sqrt(uint256 x) internal pure returns (uint256 y) { uint256 z = ((add(x,1)) / 2); y = x; while (z < y) { y = z; z = ((add((x / z),z)) / 2); } } /** * @dev gives square. multiplies x by x */ function sq(uint256 x) internal pure returns (uint256) { return (mul(x,x)); } /** * @dev x to the power of y */ function pwr(uint256 x, uint256 y) internal pure returns (uint256) { if (x==0) return (0); else if (y==0) return (1); else { uint256 z = x; for (uint256 i=1; i < y; i++) z = mul(z,x); return (z); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"getBuyPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"bytes32"},{"name":"_team","type":"uint256"},{"name":"_eth","type":"uint256"}],"name":"reLoadXname","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"activate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pIDxAddr_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"airDropTracker_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"round_","outputs":[{"name":"plyr","type":"uint256"},{"name":"team","type":"uint256"},{"name":"end","type":"uint256"},{"name":"ended","type":"bool"},{"name":"strt","type":"uint256"},{"name":"keys","type":"uint256"},{"name":"eth","type":"uint256"},{"name":"pot","type":"uint256"},{"name":"mask","type":"uint256"},{"name":"ico","type":"uint256"},{"name":"icoGen","type":"uint256"},{"name":"icoAvg","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"bytes32"}],"name":"plyrNames_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fees_","outputs":[{"name":"gen","type":"uint256"},{"name":"p3d","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"pIDxName_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"uint256"},{"name":"_team","type":"uint256"},{"name":"_eth","type":"uint256"}],"name":"reLoadXid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_affCode","type":"address"},{"name":"_all","type":"bool"}],"name":"registerNameXaddr","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_pID","type":"uint256"},{"name":"_addr","type":"address"},{"name":"_name","type":"bytes32"},{"name":"_laff","type":"uint256"}],"name":"receivePlayerInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"rndTmEth_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rID_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_pID","type":"uint256"}],"name":"getPlayerVaults","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_pID","type":"uint256"}],"name":"getPlayerAff","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_affCode","type":"bytes32"},{"name":"_all","type":"bool"}],"name":"registerNameXname","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentRoundInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"address"},{"name":"_team","type":"uint256"},{"name":"_eth","type":"uint256"}],"name":"reLoadXaddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"uint256"},{"name":"_team","type":"uint256"}],"name":"buyXid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_pID","type":"uint256"},{"name":"_name","type":"bytes32"}],"name":"receivePlayerNameList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_affCode","type":"uint256"},{"name":"_all","type":"bool"}],"name":"registerNameXID","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"address"},{"name":"_team","type":"uint256"}],"name":"buyXaddr","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"plyrRnds_","outputs":[{"name":"eth","type":"uint256"},{"name":"keys","type":"uint256"},{"name":"mask","type":"uint256"},{"name":"ico","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"bytes32"},{"name":"_team","type":"uint256"}],"name":"buyXname","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"potSplit_","outputs":[{"name":"gen","type":"uint256"},{"name":"p3d","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTimeLeft","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rID","type":"uint256"},{"name":"_eth","type":"uint256"}],"name":"calcKeysReceived","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_keys","type":"uint256"}],"name":"iWantXKeys","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"activated_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"airDropPot_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"plyr_","outputs":[{"name":"addr","type":"address"},{"name":"name","type":"bytes32"},{"name":"win","type":"uint256"},{"name":"gen","type":"uint256"},{"name":"aff","type":"uint256"},{"name":"lrnd","type":"uint256"},{"name":"laff","type":"uint256"},{"name":"laffID","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"potSwap","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"getPlayerInfoByAddress","outputs":[{"name":"","type":"uint256"},{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerID","type":"uint256"},{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":true,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"isNewPlayer","type":"bool"},{"indexed":false,"name":"affiliateID","type":"uint256"},{"indexed":false,"name":"affiliateAddress","type":"address"},{"indexed":false,"name":"affiliateName","type":"bytes32"},{"indexed":false,"name":"amountPaid","type":"uint256"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onNewName","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"ethIn","type":"uint256"},{"indexed":false,"name":"keysBought","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"},{"indexed":false,"name":"P3DAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"},{"indexed":false,"name":"potAmount","type":"uint256"},{"indexed":false,"name":"airDropPot","type":"uint256"}],"name":"onEndTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerID","type":"uint256"},{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethOut","type":"uint256"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethOut","type":"uint256"},{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"},{"indexed":false,"name":"P3DAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"}],"name":"onWithdrawAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethIn","type":"uint256"},{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"},{"indexed":false,"name":"P3DAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"}],"name":"onBuyAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"},{"indexed":false,"name":"P3DAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"}],"name":"onReLoadAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"affiliateID","type":"uint256"},{"indexed":false,"name":"affiliateAddress","type":"address"},{"indexed":false,"name":"affiliateName","type":"bytes32"},{"indexed":true,"name":"roundID","type":"uint256"},{"indexed":true,"name":"buyerID","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onAffiliatePayout","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"roundID","type":"uint256"},{"indexed":false,"name":"amountAddedToPot","type":"uint256"}],"name":"onPotSwapDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"roundID","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"}],"name":"onEndRound","type":"event"}]
Contract Creation Code
608060405260008054600160a060020a031990811633178255600180548216732f0839f736197117796967452310f025a330da4517905560028054909116732924c3bfa7a20eb7aecb6c38f4576edcf7a72df3179055600381905560786004556006556011805460ff1916905534801561007857600080fd5b506040805180820182526017815260006020808301828152828052600f80835293517ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37555517ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec376558351808501855260218152808201838152600180855285845291517f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f55517f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f890558451808601865260358152808301848152600280865286855291517fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead55517fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeeae5585518087018752602b8152808401858152600380875296855290517f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc829682855517f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc82968295585518087018752602a8152808401858152858052601080865291517f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb0155517f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb02558651808801885260228152808501868152938652818552517f8c6065603763fec3f5742441d3833f3f43b982453612d76adb39a885e3006b5f5591517f8c6065603763fec3f5742441d3833f3f43b982453612d76adb39a885e3006b60558551808701875260128152808401858152918552828452517f853b2fefe141400fef543280f93d98bd49996069f632d0d20236afeeed8e46a255517f853b2fefe141400fef543280f93d98bd49996069f632d0d20236afeeed8e46a3558451808601909552601a8552848201838152939092525290517fb3edd0d534d647cffdae9f1294f11ad21f3fcf2814bea44c92bbb8d384a57d9e55517fb3edd0d534d647cffdae9f1294f11ad21f3fcf2814bea44c92bbb8d384a57d9f5561552880620003886000396000f3006080604052600436106101cc5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663018a25e8811461036c57806306fdde0314610393578063079ce3271461041d5780630f15f4c01461043d57806310f01eba1461045257806311a09ae71461047357806324c33d33146104885780632660316e146104ff5780632ce219991461052e5780632e19ebdc1461055f578063349cdcac146105775780633ccfd60b146105955780633ddd4698146105aa57806349cc635d146106065780635893d48114610630578063624ae5c01461064b5780636306643414610660578063633891c414610696578063685ffd83146106ae578063747dff421461070157806382bfc7391461078c5780638f38f309146107b35780638f7140ea146107c1578063921dec21146107dc57806395d89b411461039357806398a0871d1461082f578063a2bccae914610846578063a65b37a114610887578063c519500e14610895578063c7e284b8146108ad578063ce89c80c146108c2578063cf808000146108dd578063d53b2679146108f5578063d87574e01461090a578063de7874f31461091f578063ed78cf4a14610982578063ee0b5d8b1461098a575b6101d4615403565b60115460009060ff161515600114610238576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b801561027f576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b34633b9aca008110156102d7576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af6800000811115610327576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b610330856109e3565b33600090815260086020908152604080832054808452600a909252909120600601549196509450610365908590600288610c97565b5050505050005b34801561037857600080fd5b50610381610ed2565b60408051918252519081900360200190f35b34801561039f57600080fd5b506103a8610f98565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103e25781810151838201526020016103ca565b50505050905090810190601f16801561040f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042957600080fd5b5061043b600435602435604435610fcf565b005b34801561044957600080fd5b5061043b6111db565b34801561045e57600080fd5b50610381600160a060020a0360043516611310565b34801561047f57600080fd5b50610381611322565b34801561049457600080fd5b506104a0600435611328565b604080519c8d5260208d019b909b528b8b019990995296151560608b015260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083015251908190036101800190f35b34801561050b57600080fd5b5061051a60043560243561138b565b604080519115158252519081900360200190f35b34801561053a57600080fd5b506105466004356113ab565b6040805192835260208301919091528051918290030190f35b34801561056b57600080fd5b506103816004356113c4565b34801561058357600080fd5b5061043b6004356024356044356113d6565b3480156105a157600080fd5b5061043b6115bc565b6040805160206004803580820135601f810184900484028501840190955284845261043b94369492936024939284019190819084018382808284375094975050600160a060020a03853516955050505050602001351515611a6d565b34801561061257600080fd5b5061043b600435600160a060020a0360243516604435606435611c26565b34801561063c57600080fd5b50610381600435602435611e17565b34801561065757600080fd5b50610381611e34565b34801561066c57600080fd5b50610678600435611e3a565b60408051938452602084019290925282820152519081900360600190f35b3480156106a257600080fd5b50610678600435611fe0565b6040805160206004803580820135601f810184900484028501840190955284845261043b943694929360249392840191908190840183828082843750949750508435955050505050602001351515612039565b34801561070d57600080fd5b50610716612119565b604080519e8f5260208f019d909d528d8d019b909b5260608d019990995260808c019790975260a08b019590955260c08a0193909352600160a060020a0390911660e08901526101008801526101208701526101408601526101608501526101808401526101a083015251908190036101c00190f35b34801561079857600080fd5b5061043b600160a060020a0360043516602435604435612317565b61043b600435602435612513565b3480156107cd57600080fd5b5061043b600435602435612703565b6040805160206004803580820135601f810184900484028501840190955284845261043b9436949293602493928401919081908401838280828437509497505084359550505050506020013515156127e0565b61043b600160a060020a03600435166024356128c0565b34801561085257600080fd5b50610861600435602435612ad7565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61043b600435602435612b09565b3480156108a157600080fd5b50610546600435612d06565b3480156108b957600080fd5b50610381612d1f565b3480156108ce57600080fd5b50610381600435602435612db0565b3480156108e957600080fd5b50610381600435612e57565b34801561090157600080fd5b5061051a612f0a565b34801561091657600080fd5b50610381612f13565b34801561092b57600080fd5b50610937600435612f19565b60408051600160a060020a0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b61043b612f66565b34801561099657600080fd5b506109ab600160a060020a0360043516612fe4565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b6109eb615403565b336000908152600860205260408120549080821515610c8e57604080517fe56556a9000000000000000000000000000000000000000000000000000000008152336004820152905173e840e25bab3f1f02eb1244a3adc8965f5864f22e9163e56556a99160248083019260209291908290030181600087803b158015610a7057600080fd5b505af1158015610a84573d6000803e3d6000fd5b505050506040513d6020811015610a9a57600080fd5b5051604080517f82e37b2c00000000000000000000000000000000000000000000000000000000815260048101839052905191945073e840e25bab3f1f02eb1244a3adc8965f5864f22e916382e37b2c916024808201926020929091908290030181600087803b158015610b0d57600080fd5b505af1158015610b21573d6000803e3d6000fd5b505050506040513d6020811015610b3757600080fd5b5051604080517fe3c08adf00000000000000000000000000000000000000000000000000000000815260048101869052905191935073e840e25bab3f1f02eb1244a3adc8965f5864f22e9163e3c08adf916024808201926020929091908290030181600087803b158015610baa57600080fd5b505af1158015610bbe573d6000803e3d6000fd5b505050506040513d6020811015610bd457600080fd5b5051336000818152600860209081526040808320889055878352600a9091529020805473ffffffffffffffffffffffffffffffffffffffff1916909117905590508115610c5d576000828152600960209081526040808320869055858352600a82528083206001908101869055600c8352818420868552909252909120805460ff191690911790555b8015801590610c6c5750828114155b15610c86576000838152600a602052604090206006018190555b845160010185525b50929392505050565b600754600480546000838152600d602052604090209091015442910181118015610d0357506000828152600d602052604090206002015481111580610d0357506000828152600d602052604090206002015481118015610d0357506000828152600d6020526040902054155b15610d1b57610d168287348888886130b9565b610eca565b6000828152600d602052604090206002015481118015610d4d57506000828152600d602052604090206003015460ff16155b15610e95576000828152600d60205260409020600301805460ff19166001179055610d7783613519565b925080670de0b6b3a764000002836000015101836000018181525050858360200151018360200181815250507fa7801a70b37e729a11492aad44fd3dba89b4149f0609dc0f6837bf9e57e2671a33600a6000898152602001908152602001600020600101543486600001518760200151886040015189606001518a608001518b60a001518c60c001518d60e00151604051808c600160a060020a0316600160a060020a031681526020018b600019166000191681526020018a815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405180910390a15b6000868152600a6020526040902060030154610eb7903463ffffffff61397916565b6000878152600a60205260409020600301555b505050505050565b600754600480546000838152600d602052604081209092015491929142910181118015610f4157506000828152600d602052604090206002015481111580610f4157506000828152600d602052604090206002015481118015610f4157506000828152600d6020526040902054155b15610f89576000828152600d6020526040902060050154610f8290670de0b6b3a764000090610f76908263ffffffff61397916565b9063ffffffff6139da16565b9250610f93565b655af3107a400092505b505090565b60408051808201909152600681527f6475616e67380000000000000000000000000000000000000000000000000000602082015281565b610fd7615403565b601154600090819060ff16151560011461103d576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b8015611084576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b85633b9aca008110156110dc576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af680000081111561112c576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b33600090815260086020526040902054945088158061115b57506000858152600a602052604090206001015489145b15611179576000858152600a602052604090206006015493506111b8565b600089815260096020908152604080832054888452600a9092529091206006015490945084146111b8576000858152600a602052604090206006018490555b6111c188613a07565b97506111d085858a8a8a613a2c565b505050505050505050565b600054600160a060020a0316331461123d576040805160e560020a62461bcd02815260206004820152601760248201527f6f6e6c792061646d696e2063616e206163746976617465000000000000000000604482015290519081900360640190fd5b60115460ff1615611298576040805160e560020a62461bcd02815260206004820152601c60248201527f464f4d4f2053686f727420616c72656164792061637469766174656400000000604482015290519081900360640190fd5b6011805460ff191660019081179091556007819055600454600354600092909252600d602052429091019081037ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c95562015180017ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c755565b60086020526000908152604090205481565b60065481565b600d60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b909b0154999a9899979860ff909716979596949593949293919290918c565b600c60209081526000928352604080842090915290825290205460ff1681565b600f602052600090815260409020805460019091015482565b60096020526000908152604090205481565b6113de615403565b60115460009060ff161515600114611442576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b8015611489576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b84633b9aca008110156114e1576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af6800000811115611531576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b33600090815260086020526040902054935087158061154f57508388145b1561156d576000848152600a6020526040902060060154975061159a565b6000848152600a6020526040902060060154881461159a576000848152600a602052604090206006018890555b6115a387613a07565b96506115b28489898989613a2c565b5050505050505050565b60008060008060006115cc615403565b601154600090819060ff161515600114611632576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b8015611679576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b60075433600090815260086020908152604080832054848452600d90925290912060020154919b50429a509850891180156116c6575060008a8152600d602052604090206003015460ff16155b80156116df575060008a8152600d602052604090205415155b156119185760008a8152600d60205260409020600301805460ff1916600117905561170985613519565b945061171488613c49565b965060008711156117f857600154604051600a89049750600288049550859450600160a060020a03909116906108fc8515029085906000818181858888f19350505050158015611768573d6000803e3d6000fd5b5060008054604051600160a060020a039091169185156108fc02918691818181858888f193505050501580156117a2573d6000803e3d6000fd5b506000888152600a6020526040902054600160a060020a03166108fc6117ce898963ffffffff613cd016565b6040518115909202916000818181858888f193505050501580156117f6573d6000803e3d6000fd5b505b88670de0b6b3a764000002856000015101856000018181525050878560200151018560200181815250507f0bd0dba8ab932212fa78150cdb7b0275da72e255875967b5cad11464cf71bedc33600a60008b81526020019081526020016000206001015489886000015189602001518a604001518b606001518c608001518d60a001518e60c001518f60e00151604051808c600160a060020a0316600160a060020a031681526020018b600019166000191681526020018a815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405180910390a1611a61565b61192188613c49565b96506000871115611a0557600154604051600a89049750600288049550859450600160a060020a03909116906108fc8515029085906000818181858888f19350505050158015611975573d6000803e3d6000fd5b5060008054604051600160a060020a039091169185156108fc02918691818181858888f193505050501580156119af573d6000803e3d6000fd5b506000888152600a6020526040902054600160a060020a03166108fc6119db898963ffffffff613cd016565b6040518115909202916000818181858888f19350505050158015611a03573d6000803e3d6000fd5b505b6000888152600a602090815260409182902060010154825133815291820152808201899052606081018b9052905189917f8f36579a548bc439baa172a6521207464154da77f411e2da3db2f53affe6cc3a919081900360800190a25b50505050505050505050565b6000808080808033803b8015611abb576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b611ac48b613d30565b604080517faa4d490b000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052600160a060020a038e1660448301528c151560648301528251939b50995034985073e840e25bab3f1f02eb1244a3adc8965f5864f22e9263aa4d490b928a926084808201939182900301818588803b158015611b5557600080fd5b505af1158015611b69573d6000803e3d6000fd5b50505050506040513d6040811015611b8057600080fd5b508051602091820151600160a060020a03808b16600081815260088652604080822054858352600a8852918190208054600190910154825188151581529889018790529416878201526060870193909352608086018c90524260a0870152915193995091975095508a92909186917fdd6176433ff5026bbce96b068584b7bbe3514227e72df9c630b749ae87e64442919081900360c00190a45050505050505050505050565b3373e840e25bab3f1f02eb1244a3adc8965f5864f22e14611cb7576040805160e560020a62461bcd02815260206004820152602760248201527f796f7572206e6f7420706c617965724e616d657320636f6e74726163742e2e2e60448201527f20686d6d6d2e2e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0383166000908152600860205260409020548414611cf257600160a060020a03831660009081526008602052604090208490555b6000828152600960205260409020548414611d195760008281526009602052604090208490555b6000848152600a6020526040902054600160a060020a03848116911614611d6f576000848152600a60205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b6000848152600a60205260409020600101548214611d9c576000848152600a602052604090206001018290555b6000848152600a60205260409020600601548114611dc9576000848152600a602052604090206006018190555b6000848152600c6020908152604080832085845290915290205460ff161515611e11576000848152600c602090815260408083208584529091529020805460ff191660011790555b50505050565b600e60209081526000928352604080842090915290825290205481565b60075481565b6007546000818152600d60205260408120600201549091829182919042118015611e7657506000818152600d602052604090206003015460ff16155b8015611e8f57506000818152600d602052604090205415155b15611fb0576000818152600d6020526040902054851415611f74576000818152600d6020526040902060070154611efd90606490611ed490603063ffffffff61454316565b811515611edd57fe5b6000888152600a602052604090206002015491900463ffffffff61397916565b6000868152600b60209081526040808320858452909152902060020154611f5690611f3890611f2c89866145ba565b9063ffffffff613cd016565b6000888152600a60205260409020600301549063ffffffff61397916565b6000878152600a602052604090206004015491955093509150611fd8565b6000858152600a60209081526040808320600290810154600b8452828520868652909352922090910154611f5690611f3890611f2c89866145ba565b6000858152600a602052604090206002810154600590910154611f5690611f38908890614688565b509193909250565b6000818152600a6020526040812060070154819081908180821561202c576000838152600a60205260409020600701549150811561202c57506000818152600a60205260409020600701545b9196909550909350915050565b6000808080808033803b8015612087576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b6120908b613d30565b604080517f745ea0c1000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052604482018e90528c151560648301528251939b50995034985073e840e25bab3f1f02eb1244a3adc8965f5864f22e9263745ea0c1928a926084808201939182900301818588803b158015611b5557600080fd5b60008060008060008060008060008060008060008060006007549050600d60008281526020019081526020016000206009015481600d600084815260200190815260200160002060050154600d600085815260200190815260200160002060020154600d600086815260200190815260200160002060040154600d600087815260200190815260200160002060070154600d600088815260200190815260200160002060000154600a02600d60008981526020019081526020016000206001015401600a6000600d60008b815260200190815260200160002060000154815260200190815260200160002060000160009054906101000a9004600160a060020a0316600a6000600d60008c815260200190815260200160002060000154815260200190815260200160002060010154600e60008b8152602001908152602001600020600080815260200190815260200160002054600e60008c815260200190815260200160002060006001815260200190815260200160002054600e60008d815260200190815260200160002060006002815260200190815260200160002054600e60008e8152602001908152602001600020600060038152602001908152602001600020546005546103e802600654019e509e509e509e509e509e509e509e509e509e509e509e509e509e5050909192939495969798999a9b9c9d565b61231f615403565b601154600090819060ff161515600114612385576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b80156123cc576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b85633b9aca00811015612424576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af6800000811115612474576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b336000908152600860205260409020549450600160a060020a03891615806124a45750600160a060020a03891633145b156124c2576000858152600a602052604090206006015493506111b8565b600160a060020a038916600090815260086020908152604080832054888452600a9092529091206006015490945084146111b8576000858152600a602052604090206006018490556111c188613a07565b61251b615403565b60115460009060ff16151560011461257f576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b80156125c6576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b34633b9aca0081101561261e576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af680000081111561266e576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b612677856109e3565b33600090815260086020526040902054909550935086158061269857508387145b156126b6576000848152600a602052604090206006015496506126e3565b6000848152600a602052604090206006015487146126e3576000848152600a602052604090206006018790555b6126ec86613a07565b95506126fa84888888610c97565b50505050505050565b3373e840e25bab3f1f02eb1244a3adc8965f5864f22e14612794576040805160e560020a62461bcd02815260206004820152602760248201527f796f7572206e6f7420706c617965724e616d657320636f6e74726163742e2e2e60448201527f20686d6d6d2e2e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000828152600c6020908152604080832084845290915290205460ff1615156127dc576000828152600c602090815260408083208484529091529020805460ff191660011790555b5050565b6000808080808033803b801561282e576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b6128378b613d30565b604080517fc0942dfd000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052604482018e90528c151560648301528251939b50995034985073e840e25bab3f1f02eb1244a3adc8965f5864f22e9263c0942dfd928a926084808201939182900301818588803b158015611b5557600080fd5b6128c8615403565b601154600090819060ff16151560011461292e576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b8015612975576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b34633b9aca008110156129cd576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af6800000811115612a1d576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b612a26866109e3565b336000908152600860205260409020549096509450600160a060020a0388161580612a595750600160a060020a03881633145b15612a77576000858152600a60205260409020600601549350612ac0565b600160a060020a038816600090815260086020908152604080832054888452600a909252909120600601549094508414612ac0576000858152600a602052604090206006018490555b612ac987613a07565b96506115b285858989610c97565b600b60209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b612b11615403565b601154600090819060ff161515600114612b77576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b8015612bbe576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b34633b9aca00811015612c16576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af6800000811115612c66576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b612c6f866109e3565b336000908152600860205260409020549096509450871580612ca157506000858152600a602052604090206001015488145b15612cbf576000858152600a60205260409020600601549350612ac0565b600088815260096020908152604080832054888452600a909252909120600601549094508414612ac0576000858152600a60205260409020600601849055612ac987613a07565b6010602052600090815260409020805460019091015482565b6007546000818152600d60205260408120600201549091904290811015612da757600480546000848152600d602052604090209091015401811115612d80576000828152600d6020526040902060020154610f82908263ffffffff613cd016565b600480546000848152600d6020526040902090910154610f8291018263ffffffff613cd016565b60009250610f93565b600480546000848152600d602052604081209092015442910181118015612e1957506000848152600d602052604090206002015481111580612e1957506000848152600d602052604090206002015481118015612e1957506000848152600d6020526040902054155b15612e47576000848152600d6020526040902060060154612e40908463ffffffff6146e516565b9150612e50565b612e4083614706565b5092915050565b600754600480546000838152600d602052604081209092015491929142910181118015612ec657506000828152600d602052604090206002015481111580612ec657506000828152600d602052604090206002015481118015612ec657506000828152600d6020526040902054155b15612efa576000828152600d6020526040902060050154612ef3908590610f76908263ffffffff61397916565b9250612f03565b612ef38461477e565b5050919050565b60115460ff1681565b60055481565b600a6020526000908152604090208054600182015460028301546003840154600485015460058601546006870154600790970154600160a060020a03909616969495939492939192909188565b600780546001016000818152600d6020526040902090910154612f8f903463ffffffff61397916565b6000828152600d6020908152604091829020600701929092558051838152349281019290925280517f74b1d2f771e0eff1b2c36c38499febdbea80fe4013bdace4fc4b653322c2895c9281900390910190a150565b6000806000806000806000806000600754915050600160a060020a038916600090815260086020908152604080832054808452600a808452828520600180820154600b875285882089895287529487200154958390529352600283015460059093015490938493909161307a9061305c908690614688565b6000878152600a60205260409020600301549063ffffffff61397916565b6000958652600a6020908152604080882060040154600b83528189209989529890915290952054939e929d50909b509950919750919550909350915050565b6000858152600b60209081526040808320898452909152812060010154819015156130eb576130e887846147eb565b92505b633b9aca008611156115b2576000888152600d6020526040902060060154613119908763ffffffff6146e516565b9150670de0b6b3a7640000821061319057613134828961484a565b6000888152600d6020526040902054871461315b576000888152600d602052604090208790555b6000888152600d60205260409020600101548414613188576000888152600d602052604090206001018490555b825160640183525b67016345785d8a000086106133d0576006805460010190556131b061494c565b1515600114156133d057678ac7230489e800008610613251576005546064906131e090604b63ffffffff61454316565b8115156131e957fe5b6000898152600a60205260409020600201549190049150613210908263ffffffff61397916565b6000888152600a6020526040902060020155600554613235908263ffffffff613cd016565b60055582516d0eca8847c4129106ce83000000000183526133a5565b670de0b6b3a764000086101580156132705750678ac7230489e8000086105b156132fd5760055460649061328c90603263ffffffff61454316565b81151561329557fe5b6000898152600a602052604090206002015491900491506132bc908263ffffffff61397916565b6000888152600a60205260409020600201556005546132e1908263ffffffff613cd016565b60055582516d09dc5ada82b70b59df02000000000183526133a5565b67016345785d8a0000861015801561331c5750670de0b6b3a764000086105b156133a55760055460649061333890601963ffffffff61454316565b81151561334157fe5b6000898152600a60205260409020600201549190049150613368908263ffffffff61397916565b6000888152600a602052604090206002015560055461338d908263ffffffff613cd016565b60055582516d0eca8847c4129106ce83000000000183525b82516d314dc6448d9338c15b0a000000008202016c7e37be2022c0914b268000000001835260006006555b60065483516103e89091020183526000878152600b602090815260408083208b845290915290206001015461340c90839063ffffffff61397916565b6000888152600b602090815260408083208c84529091529020600181019190915554613439908790613979565b6000888152600b602090815260408083208c8452825280832093909355600d9052206005015461347090839063ffffffff61397916565b6000898152600d6020526040902060058101919091556006015461349b90879063ffffffff61397916565b6000898152600d6020908152604080832060060193909355600e8152828220878352905220546134d290879063ffffffff61397916565b6000898152600e602090815260408083208884529091529020556134fa888888888888614b63565b925061350a888888878688614d03565b92506115b28785888587614e31565b613521615403565b600780546000818152600d6020526040812080546001820154919094015492939290918080808080606461355c88603063ffffffff61454316565b81151561356557fe5b049550600a8760008a815260106020526040902054919004955060649061359390899063ffffffff61454316565b81151561359c57fe5b0493506135b584611f2c87818b8b63ffffffff613cd016565b60008b8152600d60205260409020600501549093506135e285670de0b6b3a764000063ffffffff61454316565b8115156135eb57fe5b60008c8152600d6020526040902060050154919004925061363990670de0b6b3a76400009061362190859063ffffffff61454316565b81151561362a57fe5b8691900463ffffffff613cd016565b9050600081111561366957613654848263ffffffff613cd016565b9350613666838263ffffffff61397916565b92505b6000898152600a602052604090206002015461368c90879063ffffffff61397916565b60008a8152600a60205260409020600290810191909155600154600160a060020a0316906108fc9087049081150290604051600060405180830381858888f193505050501580156136e1573d6000803e3d6000fd5b50600054600160a060020a03166108fc600287049081150290604051600060405180830381858888f19350505050158015613720573d6000803e3d6000fd5b5060008a8152600d602052604090206008015461374490839063ffffffff61397916565b600d60008c815260200190815260200160002060080181905550600d60008b815260200190815260200160002060020154620f4240028c60000151018c60000181815250508767016345785d8a000002896a52b7d2dcc80cd2e4000000028d6020015101018c6020018181525050600a60008a815260200190815260200160002060000160009054906101000a9004600160a060020a03168c60400190600160a060020a03169081600160a060020a031681525050600a60008a8152602001908152602001600020600101548c606001906000191690816000191681525050858c6080018181525050838c60e001818152505060008c60c0018181525050828c60a00181815250507f0f10d353302c6027c82cea0f21a24b8a12e0ee636dba4021bb71a50ec292cb038a600a60008c815260200190815260200160002060000160009054906101000a9004600160a060020a0316600a60008d81526020019081526020016000206001015489876040518086815260200185600160a060020a0316600160a060020a0316815260200184600019166000191681526020018381526020018281526020019550505050505060405180910390a1600780546001908101909155999099016000818152600d602052604090204260049182018190559054919a9161394b9161393f906201518063ffffffff61397916565b9063ffffffff61397916565b60008b8152600d6020526040902060028101919091556007018390558b9a5050505050505050505050919050565b818101828110156139d4576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d61746820616464206661696c656400000000000000000000000000604482015290519081900360640190fd5b92915050565b6000613a006139f76139f2858563ffffffff613cd016565b61477e565b611f2c8561477e565b9392505050565b600080821080613a175750600382115b15613a2457506002613a27565b50805b919050565b600754600480546000838152600d602052604090209091015442910181118015613a9857506000828152600d602052604090206002015481111580613a9857506000828152600d602052604090206002015481118015613a9857506000828152600d6020526040902054155b15613acf57613aaa84611f2c89613c49565b6000888152600a6020526040902060030155613aca8288868989886130b9565b6126fa565b6000828152600d602052604090206002015481118015613b0157506000828152600d602052604090206003015460ff16155b156126fa576000828152600d60205260409020600301805460ff19166001179055613b2b83613519565b925080670de0b6b3a764000002836000015101836000018181525050868360200151018360200181815250507f88261ac70d02d5ea73e54fa6da17043c974de1021109573ec1f6f57111c823dd33600a60008a815260200190815260200160002060010154856000015186602001518760400151886060015189608001518a60a001518b60c001518c60e00151604051808b600160a060020a0316600160a060020a031681526020018a6000191660001916815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390a150505050505050565b6000818152600a60205260408120600501548190613c68908490614f9f565b6000838152600a6020526040902060048101546003820154600290920154613c9a9261393f919063ffffffff61397916565b90506000811115613cc6576000838152600a602052604081206002810182905560038101829055600401555b8091505b50919050565b600082821115613d2a576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d61746820737562206661696c656400000000000000000000000000604482015290519081900360640190fd5b50900390565b8051600090829082808060208411801590613d4b5750600084115b1515613dc7576040805160e560020a62461bcd02815260206004820152602a60248201527f737472696e67206d757374206265206265747765656e203120616e642033322060448201527f6368617261637465727300000000000000000000000000000000000000000000606482015290519081900360840190fd5b846000815181101515613dd657fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214158015613e3d57508460018503815181101515613e1557fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214155b1515613eb9576040805160e560020a62461bcd02815260206004820152602560248201527f737472696e672063616e6e6f74207374617274206f7220656e6420776974682060448201527f7370616365000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b846000815181101515613ec857fe5b90602001015160f860020a900460f860020a02600160f860020a031916603060f860020a02141561400b57846001815181101515613f0257fe5b90602001015160f860020a900460f860020a02600160f860020a031916607860f860020a0214151515613f7f576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030780000000000604482015290519081900360640190fd5b846001815181101515613f8e57fe5b90602001015160f860020a900460f860020a02600160f860020a031916605860f860020a021415151561400b576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030580000000000604482015290519081900360640190fd5b600091505b838210156144db5784517f40000000000000000000000000000000000000000000000000000000000000009086908490811061404857fe5b90602001015160f860020a900460f860020a02600160f860020a0319161180156140bc575084517f5b000000000000000000000000000000000000000000000000000000000000009086908490811061409d57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b156141295784828151811015156140cf57fe5b90602001015160f860020a900460f860020a0260f860020a900460200160f860020a02858381518110151561410057fe5b906020010190600160f860020a031916908160001a90535082151561412457600192505b6144d0565b848281518110151561413757fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021480614207575084517f60000000000000000000000000000000000000000000000000000000000000009086908490811061419357fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015614207575084517f7b00000000000000000000000000000000000000000000000000000000000000908690849081106141e857fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b806142b1575084517f2f000000000000000000000000000000000000000000000000000000000000009086908490811061423d57fe5b90602001015160f860020a900460f860020a02600160f860020a0319161180156142b1575084517f3a000000000000000000000000000000000000000000000000000000000000009086908490811061429257fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b151561432d576040805160e560020a62461bcd02815260206004820152602260248201527f737472696e6720636f6e7461696e7320696e76616c696420636861726163746560448201527f7273000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b848281518110151561433b57fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a02141561441a57848260010181518110151561437757fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021415151561441a576040805160e560020a62461bcd02815260206004820152602860248201527f737472696e672063616e6e6f7420636f6e7461696e20636f6e7365637574697660448201527f6520737061636573000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b821580156144c6575084517f30000000000000000000000000000000000000000000000000000000000000009086908490811061445357fe5b90602001015160f860020a900460f860020a02600160f860020a03191610806144c6575084517f3900000000000000000000000000000000000000000000000000000000000000908690849081106144a757fe5b90602001015160f860020a900460f860020a02600160f860020a031916115b156144d057600192505b600190910190614010565b600183151514614535576040805160e560020a62461bcd02815260206004820152601d60248201527f737472696e672063616e6e6f74206265206f6e6c79206e756d62657273000000604482015290519081900360640190fd5b505050506020015192915050565b6000821515614554575060006139d4565b5081810281838281151561456457fe5b04146139d4576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d617468206d756c206661696c656400000000000000000000000000604482015290519081900360640190fd5b6000828152600b602090815260408083208484528252808320600190810154600d808552838620600581015493810154875260108652938620548787529452600790920154670de0b6b3a764000093614677939261466b92909161464291879160649161462c9163ffffffff61454316565b81151561463557fe5b049063ffffffff61454316565b81151561464b57fe5b6000888152600d602052604090206008015491900463ffffffff61397916565b9063ffffffff61454316565b81151561468057fe5b049392505050565b6000828152600b6020908152604080832084845282528083206002810154600190910154600d90935290832060080154613a0092670de0b6b3a7640000916146cf91614543565b8115156146d857fe5b049063ffffffff613cd016565b6000613a006146f384614706565b611f2c614706868663ffffffff61397916565b60006309502f9061476e6d03b2a1d15167e7c5699bfde00000611f2c6147697a0dac7055469777a6122ee4310dd6c14410500f290484000000000061393f6b01027e72f1f128130880000061466b8a670de0b6b3a764000063ffffffff61454316565b615036565b81151561477757fe5b0492915050565b6000614791670de0b6b3a7640000615089565b61476e60026147c46147b186670de0b6b3a764000063ffffffff61454316565b65886c8f6730709063ffffffff61454316565b8115156147cd57fe5b0461393f6147da86615089565b6304a817c89063ffffffff61454316565b6147f3615403565b6000838152600a602052604090206005015415614827576000838152600a6020526040902060050154614827908490614f9f565b506007546000928352600a60208190526040909320600501558051909101815290565b6000818152600d60205260408120600701544291601e916113881015614871576002820491505b6000848152600d60205260409020600201548311801561489d57506000848152600d6020526040902054155b156148c0576148b98361393f84670de0b6b3a764000089614635565b90506148ec565b6000848152600d60205260409020600201546148e99061393f84670de0b6b3a764000089614635565b90505b6148ff620151808463ffffffff61397916565b81101561491f576000848152600d60205260409020600201819055614945565b614932620151808463ffffffff61397916565b6000858152600d60205260409020600201555b5050505050565b600080614abd4361393f42336040516020018082600160a060020a0316600160a060020a03166c010000000000000000000000000281526014019150506040516020818303038152906040526040518082805190602001908083835b602083106149c75780518252601f1990920191602091820191016149a8565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120925050508115156149fd57fe5b0461393f4561393f42416040516020018082600160a060020a0316600160a060020a03166c010000000000000000000000000281526014019150506040516020818303038152906040526040518082805190602001908083835b60208310614a765780518252601f199092019160209182019101614a57565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912092505050811515614aac57fe5b0461393f424463ffffffff61397916565b604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310614b0b5780518252601f199092019160209182019101614aec565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912060065490945092506103e89150839050046103e80282031015614b5a5760019150614b5f565b600091505b5090565b614b6b615403565b60008054604051600a8804929182918291600160a060020a03169060028604908381818185875af115159250614ba8915050576002909304928392505b600154600160a060020a03166002850460405160006040518083038185875af115159250614bea91505057600284049290920191614be760028561362a565b93505b614c06614bf98c8c8c8c615095565b849063ffffffff61397916565b92506000831115614cf457600283049150614c27838363ffffffff613cd016565b600154604051919250600160a060020a0316906002830480156108fc02916000818181858888f19350505050158015614c64573d6000803e3d6000fd5b50600054600160a060020a03166108fc600283049081150290604051600060405180830381858888f19350505050158015614ca3573d6000803e3d6000fd5b5060008b8152600d6020526040902060070154614cc6908363ffffffff61397916565b60008c8152600d602052604090206007015560c0860151614cee90849063ffffffff61397916565b60c08701525b50939998505050505050505050565b614d0b615403565b6000848152600f6020526040812054819081908190606490614d34908b9063ffffffff61454316565b811515614d3d57fe5b049350606489049250614d5b8360055461397990919063ffffffff16565b600555614d8c6064614d748b601d63ffffffff61454316565b811515614d7d57fe5b8b91900463ffffffff613cd016565b9850614d9e898563ffffffff613cd016565b9150614dac8b8b868a6152b2565b90506000811115614dca57614dc7848263ffffffff613cd016565b93505b60008b8152600d6020526040902060070154614df09061393f848463ffffffff61397916565b60008c8152600d602052604090206007015560e0860151614e1890859063ffffffff61397916565b60e0870152506101008501525091979650505050505050565b836c01431e0fae6d7217caa00000000242670de0b6b3a76400000282600001510101816000018181525050600754751aba4714957d300d0e549208b31adb100000000000000285826020015101018160200181815250507f500e72a0e114930aebdbcb371ccdbf43922c49f979794b5de4257ff7e310c74681600001518260200151600a6000898152602001908152602001600020600101543387878760400151886060015189608001518a60a001518b60c001518c60e001518d6101000151600554604051808f81526020018e81526020018d600019166000191681526020018c600160a060020a0316600160a060020a031681526020018b81526020018a815260200189600160a060020a0316600160a060020a0316815260200188600019166000191681526020018781526020018681526020018581526020018481526020018381526020018281526020019e50505050505050505050505050505060405180910390a15050505050565b6000614fab8383614688565b90506000811115615031576000838152600a6020526040902060030154614fd990829063ffffffff61397916565b6000848152600a6020908152604080832060030193909355600b81528282208583529052206002015461501390829063ffffffff61397916565b6000848152600b602090815260408083208684529091529020600201555b505050565b6000806002615046846001613979565b81151561504f57fe5b0490508291505b81811015613cca578091506002615078828581151561507157fe5b0483613979565b81151561508157fe5b049050615056565b60006139d48283614543565b6002546040516000918291600a860491601487049160228804918591600160a060020a03909116906108fc86150290869084818181858888f193505050501580156150e4573d6000803e3d6000fd5b5086158015906150f45750888714155b801561511057506000878152600a602052604090206001015415155b15615291576000898152600a602052604080822060070189905588825290206004015461514490849063ffffffff61397916565b6000888152600a6020908152604091829020600481019390935582546001909301548251600160a060020a03909416845290830152818101859052426060830152518a918c918a917f590bbc0fc16915a85269a48f74783c39842b7ae9eceb7c295c95dbe8b3ec7331919081900360800190a4506000868152600a602052604090206007015480158015906151d95750888114155b15615279576000818152600a602052604090206004015461520190839063ffffffff61397916565b6000828152600a6020908152604091829020600481019390935582546001909301548251600160a060020a03909416845290830152818101849052426060830152518a918c9184917f590bbc0fc16915a85269a48f74783c39842b7ae9eceb7c295c95dbe8b3ec7331919081900360800190a461528c565b615289858363ffffffff61397916565b94505b6152a4565b6152a1858463ffffffff61397916565b94505b509298975050505050505050565b6000848152600d6020526040812060050154819081906152e086670de0b6b3a764000063ffffffff61454316565b8115156152e957fe5b6000898152600d6020526040902060080154919004925061531190839063ffffffff61397916565b6000888152600d6020526040902060080155670de0b6b3a764000061533c838663ffffffff61454316565b81151561534557fe5b6000888152600b602090815260408083208c8452825280832060020154600d909252909120600801549290910492506153989161393f908490670de0b6b3a7640000906146cf908a63ffffffff61454316565b6000878152600b602090815260408083208b8452825280832060020193909355600d905220600501546153f890670de0b6b3a7640000906153e090859063ffffffff61454316565b8115156153e957fe5b8791900463ffffffff613cd016565b979650505050505050565b6101206040519081016040528060008152602001600081526020016000600160a060020a03168152602001600080191681526020016000815260200160008152602001600081526020016000815260200160008152509056006e20646973636f72640000000000000000000000000000000000000000000000706f636b6574206c696e743a206e6f7420612076616c69642063757272656e63697473206e6f74207265616479207965742e2020636865636b203f65746120696e6f20766974616c696b2c206e6f000000000000000000000000000000000000736f7272792068756d616e73206f6e6c79000000000000000000000000000000a165627a7a7230582046dd443fda47cd333d99eb3a88341b0dd6d57ea5be02f732b42751b91d8aff990029
Deployed Bytecode
0x6080604052600436106101cc5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663018a25e8811461036c57806306fdde0314610393578063079ce3271461041d5780630f15f4c01461043d57806310f01eba1461045257806311a09ae71461047357806324c33d33146104885780632660316e146104ff5780632ce219991461052e5780632e19ebdc1461055f578063349cdcac146105775780633ccfd60b146105955780633ddd4698146105aa57806349cc635d146106065780635893d48114610630578063624ae5c01461064b5780636306643414610660578063633891c414610696578063685ffd83146106ae578063747dff421461070157806382bfc7391461078c5780638f38f309146107b35780638f7140ea146107c1578063921dec21146107dc57806395d89b411461039357806398a0871d1461082f578063a2bccae914610846578063a65b37a114610887578063c519500e14610895578063c7e284b8146108ad578063ce89c80c146108c2578063cf808000146108dd578063d53b2679146108f5578063d87574e01461090a578063de7874f31461091f578063ed78cf4a14610982578063ee0b5d8b1461098a575b6101d4615403565b60115460009060ff161515600114610238576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b801561027f576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b34633b9aca008110156102d7576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af6800000811115610327576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b610330856109e3565b33600090815260086020908152604080832054808452600a909252909120600601549196509450610365908590600288610c97565b5050505050005b34801561037857600080fd5b50610381610ed2565b60408051918252519081900360200190f35b34801561039f57600080fd5b506103a8610f98565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103e25781810151838201526020016103ca565b50505050905090810190601f16801561040f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042957600080fd5b5061043b600435602435604435610fcf565b005b34801561044957600080fd5b5061043b6111db565b34801561045e57600080fd5b50610381600160a060020a0360043516611310565b34801561047f57600080fd5b50610381611322565b34801561049457600080fd5b506104a0600435611328565b604080519c8d5260208d019b909b528b8b019990995296151560608b015260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083015251908190036101800190f35b34801561050b57600080fd5b5061051a60043560243561138b565b604080519115158252519081900360200190f35b34801561053a57600080fd5b506105466004356113ab565b6040805192835260208301919091528051918290030190f35b34801561056b57600080fd5b506103816004356113c4565b34801561058357600080fd5b5061043b6004356024356044356113d6565b3480156105a157600080fd5b5061043b6115bc565b6040805160206004803580820135601f810184900484028501840190955284845261043b94369492936024939284019190819084018382808284375094975050600160a060020a03853516955050505050602001351515611a6d565b34801561061257600080fd5b5061043b600435600160a060020a0360243516604435606435611c26565b34801561063c57600080fd5b50610381600435602435611e17565b34801561065757600080fd5b50610381611e34565b34801561066c57600080fd5b50610678600435611e3a565b60408051938452602084019290925282820152519081900360600190f35b3480156106a257600080fd5b50610678600435611fe0565b6040805160206004803580820135601f810184900484028501840190955284845261043b943694929360249392840191908190840183828082843750949750508435955050505050602001351515612039565b34801561070d57600080fd5b50610716612119565b604080519e8f5260208f019d909d528d8d019b909b5260608d019990995260808c019790975260a08b019590955260c08a0193909352600160a060020a0390911660e08901526101008801526101208701526101408601526101608501526101808401526101a083015251908190036101c00190f35b34801561079857600080fd5b5061043b600160a060020a0360043516602435604435612317565b61043b600435602435612513565b3480156107cd57600080fd5b5061043b600435602435612703565b6040805160206004803580820135601f810184900484028501840190955284845261043b9436949293602493928401919081908401838280828437509497505084359550505050506020013515156127e0565b61043b600160a060020a03600435166024356128c0565b34801561085257600080fd5b50610861600435602435612ad7565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61043b600435602435612b09565b3480156108a157600080fd5b50610546600435612d06565b3480156108b957600080fd5b50610381612d1f565b3480156108ce57600080fd5b50610381600435602435612db0565b3480156108e957600080fd5b50610381600435612e57565b34801561090157600080fd5b5061051a612f0a565b34801561091657600080fd5b50610381612f13565b34801561092b57600080fd5b50610937600435612f19565b60408051600160a060020a0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b61043b612f66565b34801561099657600080fd5b506109ab600160a060020a0360043516612fe4565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b6109eb615403565b336000908152600860205260408120549080821515610c8e57604080517fe56556a9000000000000000000000000000000000000000000000000000000008152336004820152905173e840e25bab3f1f02eb1244a3adc8965f5864f22e9163e56556a99160248083019260209291908290030181600087803b158015610a7057600080fd5b505af1158015610a84573d6000803e3d6000fd5b505050506040513d6020811015610a9a57600080fd5b5051604080517f82e37b2c00000000000000000000000000000000000000000000000000000000815260048101839052905191945073e840e25bab3f1f02eb1244a3adc8965f5864f22e916382e37b2c916024808201926020929091908290030181600087803b158015610b0d57600080fd5b505af1158015610b21573d6000803e3d6000fd5b505050506040513d6020811015610b3757600080fd5b5051604080517fe3c08adf00000000000000000000000000000000000000000000000000000000815260048101869052905191935073e840e25bab3f1f02eb1244a3adc8965f5864f22e9163e3c08adf916024808201926020929091908290030181600087803b158015610baa57600080fd5b505af1158015610bbe573d6000803e3d6000fd5b505050506040513d6020811015610bd457600080fd5b5051336000818152600860209081526040808320889055878352600a9091529020805473ffffffffffffffffffffffffffffffffffffffff1916909117905590508115610c5d576000828152600960209081526040808320869055858352600a82528083206001908101869055600c8352818420868552909252909120805460ff191690911790555b8015801590610c6c5750828114155b15610c86576000838152600a602052604090206006018190555b845160010185525b50929392505050565b600754600480546000838152600d602052604090209091015442910181118015610d0357506000828152600d602052604090206002015481111580610d0357506000828152600d602052604090206002015481118015610d0357506000828152600d6020526040902054155b15610d1b57610d168287348888886130b9565b610eca565b6000828152600d602052604090206002015481118015610d4d57506000828152600d602052604090206003015460ff16155b15610e95576000828152600d60205260409020600301805460ff19166001179055610d7783613519565b925080670de0b6b3a764000002836000015101836000018181525050858360200151018360200181815250507fa7801a70b37e729a11492aad44fd3dba89b4149f0609dc0f6837bf9e57e2671a33600a6000898152602001908152602001600020600101543486600001518760200151886040015189606001518a608001518b60a001518c60c001518d60e00151604051808c600160a060020a0316600160a060020a031681526020018b600019166000191681526020018a815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405180910390a15b6000868152600a6020526040902060030154610eb7903463ffffffff61397916565b6000878152600a60205260409020600301555b505050505050565b600754600480546000838152600d602052604081209092015491929142910181118015610f4157506000828152600d602052604090206002015481111580610f4157506000828152600d602052604090206002015481118015610f4157506000828152600d6020526040902054155b15610f89576000828152600d6020526040902060050154610f8290670de0b6b3a764000090610f76908263ffffffff61397916565b9063ffffffff6139da16565b9250610f93565b655af3107a400092505b505090565b60408051808201909152600681527f6475616e67380000000000000000000000000000000000000000000000000000602082015281565b610fd7615403565b601154600090819060ff16151560011461103d576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b8015611084576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b85633b9aca008110156110dc576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af680000081111561112c576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b33600090815260086020526040902054945088158061115b57506000858152600a602052604090206001015489145b15611179576000858152600a602052604090206006015493506111b8565b600089815260096020908152604080832054888452600a9092529091206006015490945084146111b8576000858152600a602052604090206006018490555b6111c188613a07565b97506111d085858a8a8a613a2c565b505050505050505050565b600054600160a060020a0316331461123d576040805160e560020a62461bcd02815260206004820152601760248201527f6f6e6c792061646d696e2063616e206163746976617465000000000000000000604482015290519081900360640190fd5b60115460ff1615611298576040805160e560020a62461bcd02815260206004820152601c60248201527f464f4d4f2053686f727420616c72656164792061637469766174656400000000604482015290519081900360640190fd5b6011805460ff191660019081179091556007819055600454600354600092909252600d602052429091019081037ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c95562015180017ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c755565b60086020526000908152604090205481565b60065481565b600d60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b909b0154999a9899979860ff909716979596949593949293919290918c565b600c60209081526000928352604080842090915290825290205460ff1681565b600f602052600090815260409020805460019091015482565b60096020526000908152604090205481565b6113de615403565b60115460009060ff161515600114611442576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b8015611489576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b84633b9aca008110156114e1576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af6800000811115611531576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b33600090815260086020526040902054935087158061154f57508388145b1561156d576000848152600a6020526040902060060154975061159a565b6000848152600a6020526040902060060154881461159a576000848152600a602052604090206006018890555b6115a387613a07565b96506115b28489898989613a2c565b5050505050505050565b60008060008060006115cc615403565b601154600090819060ff161515600114611632576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b8015611679576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b60075433600090815260086020908152604080832054848452600d90925290912060020154919b50429a509850891180156116c6575060008a8152600d602052604090206003015460ff16155b80156116df575060008a8152600d602052604090205415155b156119185760008a8152600d60205260409020600301805460ff1916600117905561170985613519565b945061171488613c49565b965060008711156117f857600154604051600a89049750600288049550859450600160a060020a03909116906108fc8515029085906000818181858888f19350505050158015611768573d6000803e3d6000fd5b5060008054604051600160a060020a039091169185156108fc02918691818181858888f193505050501580156117a2573d6000803e3d6000fd5b506000888152600a6020526040902054600160a060020a03166108fc6117ce898963ffffffff613cd016565b6040518115909202916000818181858888f193505050501580156117f6573d6000803e3d6000fd5b505b88670de0b6b3a764000002856000015101856000018181525050878560200151018560200181815250507f0bd0dba8ab932212fa78150cdb7b0275da72e255875967b5cad11464cf71bedc33600a60008b81526020019081526020016000206001015489886000015189602001518a604001518b606001518c608001518d60a001518e60c001518f60e00151604051808c600160a060020a0316600160a060020a031681526020018b600019166000191681526020018a815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405180910390a1611a61565b61192188613c49565b96506000871115611a0557600154604051600a89049750600288049550859450600160a060020a03909116906108fc8515029085906000818181858888f19350505050158015611975573d6000803e3d6000fd5b5060008054604051600160a060020a039091169185156108fc02918691818181858888f193505050501580156119af573d6000803e3d6000fd5b506000888152600a6020526040902054600160a060020a03166108fc6119db898963ffffffff613cd016565b6040518115909202916000818181858888f19350505050158015611a03573d6000803e3d6000fd5b505b6000888152600a602090815260409182902060010154825133815291820152808201899052606081018b9052905189917f8f36579a548bc439baa172a6521207464154da77f411e2da3db2f53affe6cc3a919081900360800190a25b50505050505050505050565b6000808080808033803b8015611abb576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b611ac48b613d30565b604080517faa4d490b000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052600160a060020a038e1660448301528c151560648301528251939b50995034985073e840e25bab3f1f02eb1244a3adc8965f5864f22e9263aa4d490b928a926084808201939182900301818588803b158015611b5557600080fd5b505af1158015611b69573d6000803e3d6000fd5b50505050506040513d6040811015611b8057600080fd5b508051602091820151600160a060020a03808b16600081815260088652604080822054858352600a8852918190208054600190910154825188151581529889018790529416878201526060870193909352608086018c90524260a0870152915193995091975095508a92909186917fdd6176433ff5026bbce96b068584b7bbe3514227e72df9c630b749ae87e64442919081900360c00190a45050505050505050505050565b3373e840e25bab3f1f02eb1244a3adc8965f5864f22e14611cb7576040805160e560020a62461bcd02815260206004820152602760248201527f796f7572206e6f7420706c617965724e616d657320636f6e74726163742e2e2e60448201527f20686d6d6d2e2e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0383166000908152600860205260409020548414611cf257600160a060020a03831660009081526008602052604090208490555b6000828152600960205260409020548414611d195760008281526009602052604090208490555b6000848152600a6020526040902054600160a060020a03848116911614611d6f576000848152600a60205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b6000848152600a60205260409020600101548214611d9c576000848152600a602052604090206001018290555b6000848152600a60205260409020600601548114611dc9576000848152600a602052604090206006018190555b6000848152600c6020908152604080832085845290915290205460ff161515611e11576000848152600c602090815260408083208584529091529020805460ff191660011790555b50505050565b600e60209081526000928352604080842090915290825290205481565b60075481565b6007546000818152600d60205260408120600201549091829182919042118015611e7657506000818152600d602052604090206003015460ff16155b8015611e8f57506000818152600d602052604090205415155b15611fb0576000818152600d6020526040902054851415611f74576000818152600d6020526040902060070154611efd90606490611ed490603063ffffffff61454316565b811515611edd57fe5b6000888152600a602052604090206002015491900463ffffffff61397916565b6000868152600b60209081526040808320858452909152902060020154611f5690611f3890611f2c89866145ba565b9063ffffffff613cd016565b6000888152600a60205260409020600301549063ffffffff61397916565b6000878152600a602052604090206004015491955093509150611fd8565b6000858152600a60209081526040808320600290810154600b8452828520868652909352922090910154611f5690611f3890611f2c89866145ba565b6000858152600a602052604090206002810154600590910154611f5690611f38908890614688565b509193909250565b6000818152600a6020526040812060070154819081908180821561202c576000838152600a60205260409020600701549150811561202c57506000818152600a60205260409020600701545b9196909550909350915050565b6000808080808033803b8015612087576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b6120908b613d30565b604080517f745ea0c1000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052604482018e90528c151560648301528251939b50995034985073e840e25bab3f1f02eb1244a3adc8965f5864f22e9263745ea0c1928a926084808201939182900301818588803b158015611b5557600080fd5b60008060008060008060008060008060008060008060006007549050600d60008281526020019081526020016000206009015481600d600084815260200190815260200160002060050154600d600085815260200190815260200160002060020154600d600086815260200190815260200160002060040154600d600087815260200190815260200160002060070154600d600088815260200190815260200160002060000154600a02600d60008981526020019081526020016000206001015401600a6000600d60008b815260200190815260200160002060000154815260200190815260200160002060000160009054906101000a9004600160a060020a0316600a6000600d60008c815260200190815260200160002060000154815260200190815260200160002060010154600e60008b8152602001908152602001600020600080815260200190815260200160002054600e60008c815260200190815260200160002060006001815260200190815260200160002054600e60008d815260200190815260200160002060006002815260200190815260200160002054600e60008e8152602001908152602001600020600060038152602001908152602001600020546005546103e802600654019e509e509e509e509e509e509e509e509e509e509e509e509e509e5050909192939495969798999a9b9c9d565b61231f615403565b601154600090819060ff161515600114612385576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b80156123cc576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b85633b9aca00811015612424576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af6800000811115612474576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b336000908152600860205260409020549450600160a060020a03891615806124a45750600160a060020a03891633145b156124c2576000858152600a602052604090206006015493506111b8565b600160a060020a038916600090815260086020908152604080832054888452600a9092529091206006015490945084146111b8576000858152600a602052604090206006018490556111c188613a07565b61251b615403565b60115460009060ff16151560011461257f576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b80156125c6576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b34633b9aca0081101561261e576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af680000081111561266e576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b612677856109e3565b33600090815260086020526040902054909550935086158061269857508387145b156126b6576000848152600a602052604090206006015496506126e3565b6000848152600a602052604090206006015487146126e3576000848152600a602052604090206006018790555b6126ec86613a07565b95506126fa84888888610c97565b50505050505050565b3373e840e25bab3f1f02eb1244a3adc8965f5864f22e14612794576040805160e560020a62461bcd02815260206004820152602760248201527f796f7572206e6f7420706c617965724e616d657320636f6e74726163742e2e2e60448201527f20686d6d6d2e2e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000828152600c6020908152604080832084845290915290205460ff1615156127dc576000828152600c602090815260408083208484529091529020805460ff191660011790555b5050565b6000808080808033803b801561282e576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b6128378b613d30565b604080517fc0942dfd000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052604482018e90528c151560648301528251939b50995034985073e840e25bab3f1f02eb1244a3adc8965f5864f22e9263c0942dfd928a926084808201939182900301818588803b158015611b5557600080fd5b6128c8615403565b601154600090819060ff16151560011461292e576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b8015612975576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b34633b9aca008110156129cd576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af6800000811115612a1d576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b612a26866109e3565b336000908152600860205260409020549096509450600160a060020a0388161580612a595750600160a060020a03881633145b15612a77576000858152600a60205260409020600601549350612ac0565b600160a060020a038816600090815260086020908152604080832054888452600a909252909120600601549094508414612ac0576000858152600a602052604090206006018490555b612ac987613a07565b96506115b285858989610c97565b600b60209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b612b11615403565b601154600090819060ff161515600114612b77576040805160e560020a62461bcd028152602060048201526029602482015260008051602061549d833981519152604482015260008051602061545d833981519152606482015290519081900360840190fd5b33803b8015612bbe576040805160e560020a62461bcd02815260206004820152601160248201526000805160206154dd833981519152604482015290519081900360640190fd5b34633b9aca00811015612c16576040805160e560020a62461bcd028152602060048201526021602482015260008051602061547d833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af6800000811115612c66576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206154bd833981519152604482015290519081900360640190fd5b612c6f866109e3565b336000908152600860205260409020549096509450871580612ca157506000858152600a602052604090206001015488145b15612cbf576000858152600a60205260409020600601549350612ac0565b600088815260096020908152604080832054888452600a909252909120600601549094508414612ac0576000858152600a60205260409020600601849055612ac987613a07565b6010602052600090815260409020805460019091015482565b6007546000818152600d60205260408120600201549091904290811015612da757600480546000848152600d602052604090209091015401811115612d80576000828152600d6020526040902060020154610f82908263ffffffff613cd016565b600480546000848152600d6020526040902090910154610f8291018263ffffffff613cd016565b60009250610f93565b600480546000848152600d602052604081209092015442910181118015612e1957506000848152600d602052604090206002015481111580612e1957506000848152600d602052604090206002015481118015612e1957506000848152600d6020526040902054155b15612e47576000848152600d6020526040902060060154612e40908463ffffffff6146e516565b9150612e50565b612e4083614706565b5092915050565b600754600480546000838152600d602052604081209092015491929142910181118015612ec657506000828152600d602052604090206002015481111580612ec657506000828152600d602052604090206002015481118015612ec657506000828152600d6020526040902054155b15612efa576000828152600d6020526040902060050154612ef3908590610f76908263ffffffff61397916565b9250612f03565b612ef38461477e565b5050919050565b60115460ff1681565b60055481565b600a6020526000908152604090208054600182015460028301546003840154600485015460058601546006870154600790970154600160a060020a03909616969495939492939192909188565b600780546001016000818152600d6020526040902090910154612f8f903463ffffffff61397916565b6000828152600d6020908152604091829020600701929092558051838152349281019290925280517f74b1d2f771e0eff1b2c36c38499febdbea80fe4013bdace4fc4b653322c2895c9281900390910190a150565b6000806000806000806000806000600754915050600160a060020a038916600090815260086020908152604080832054808452600a808452828520600180820154600b875285882089895287529487200154958390529352600283015460059093015490938493909161307a9061305c908690614688565b6000878152600a60205260409020600301549063ffffffff61397916565b6000958652600a6020908152604080882060040154600b83528189209989529890915290952054939e929d50909b509950919750919550909350915050565b6000858152600b60209081526040808320898452909152812060010154819015156130eb576130e887846147eb565b92505b633b9aca008611156115b2576000888152600d6020526040902060060154613119908763ffffffff6146e516565b9150670de0b6b3a7640000821061319057613134828961484a565b6000888152600d6020526040902054871461315b576000888152600d602052604090208790555b6000888152600d60205260409020600101548414613188576000888152600d602052604090206001018490555b825160640183525b67016345785d8a000086106133d0576006805460010190556131b061494c565b1515600114156133d057678ac7230489e800008610613251576005546064906131e090604b63ffffffff61454316565b8115156131e957fe5b6000898152600a60205260409020600201549190049150613210908263ffffffff61397916565b6000888152600a6020526040902060020155600554613235908263ffffffff613cd016565b60055582516d0eca8847c4129106ce83000000000183526133a5565b670de0b6b3a764000086101580156132705750678ac7230489e8000086105b156132fd5760055460649061328c90603263ffffffff61454316565b81151561329557fe5b6000898152600a602052604090206002015491900491506132bc908263ffffffff61397916565b6000888152600a60205260409020600201556005546132e1908263ffffffff613cd016565b60055582516d09dc5ada82b70b59df02000000000183526133a5565b67016345785d8a0000861015801561331c5750670de0b6b3a764000086105b156133a55760055460649061333890601963ffffffff61454316565b81151561334157fe5b6000898152600a60205260409020600201549190049150613368908263ffffffff61397916565b6000888152600a602052604090206002015560055461338d908263ffffffff613cd016565b60055582516d0eca8847c4129106ce83000000000183525b82516d314dc6448d9338c15b0a000000008202016c7e37be2022c0914b268000000001835260006006555b60065483516103e89091020183526000878152600b602090815260408083208b845290915290206001015461340c90839063ffffffff61397916565b6000888152600b602090815260408083208c84529091529020600181019190915554613439908790613979565b6000888152600b602090815260408083208c8452825280832093909355600d9052206005015461347090839063ffffffff61397916565b6000898152600d6020526040902060058101919091556006015461349b90879063ffffffff61397916565b6000898152600d6020908152604080832060060193909355600e8152828220878352905220546134d290879063ffffffff61397916565b6000898152600e602090815260408083208884529091529020556134fa888888888888614b63565b925061350a888888878688614d03565b92506115b28785888587614e31565b613521615403565b600780546000818152600d6020526040812080546001820154919094015492939290918080808080606461355c88603063ffffffff61454316565b81151561356557fe5b049550600a8760008a815260106020526040902054919004955060649061359390899063ffffffff61454316565b81151561359c57fe5b0493506135b584611f2c87818b8b63ffffffff613cd016565b60008b8152600d60205260409020600501549093506135e285670de0b6b3a764000063ffffffff61454316565b8115156135eb57fe5b60008c8152600d6020526040902060050154919004925061363990670de0b6b3a76400009061362190859063ffffffff61454316565b81151561362a57fe5b8691900463ffffffff613cd016565b9050600081111561366957613654848263ffffffff613cd016565b9350613666838263ffffffff61397916565b92505b6000898152600a602052604090206002015461368c90879063ffffffff61397916565b60008a8152600a60205260409020600290810191909155600154600160a060020a0316906108fc9087049081150290604051600060405180830381858888f193505050501580156136e1573d6000803e3d6000fd5b50600054600160a060020a03166108fc600287049081150290604051600060405180830381858888f19350505050158015613720573d6000803e3d6000fd5b5060008a8152600d602052604090206008015461374490839063ffffffff61397916565b600d60008c815260200190815260200160002060080181905550600d60008b815260200190815260200160002060020154620f4240028c60000151018c60000181815250508767016345785d8a000002896a52b7d2dcc80cd2e4000000028d6020015101018c6020018181525050600a60008a815260200190815260200160002060000160009054906101000a9004600160a060020a03168c60400190600160a060020a03169081600160a060020a031681525050600a60008a8152602001908152602001600020600101548c606001906000191690816000191681525050858c6080018181525050838c60e001818152505060008c60c0018181525050828c60a00181815250507f0f10d353302c6027c82cea0f21a24b8a12e0ee636dba4021bb71a50ec292cb038a600a60008c815260200190815260200160002060000160009054906101000a9004600160a060020a0316600a60008d81526020019081526020016000206001015489876040518086815260200185600160a060020a0316600160a060020a0316815260200184600019166000191681526020018381526020018281526020019550505050505060405180910390a1600780546001908101909155999099016000818152600d602052604090204260049182018190559054919a9161394b9161393f906201518063ffffffff61397916565b9063ffffffff61397916565b60008b8152600d6020526040902060028101919091556007018390558b9a5050505050505050505050919050565b818101828110156139d4576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d61746820616464206661696c656400000000000000000000000000604482015290519081900360640190fd5b92915050565b6000613a006139f76139f2858563ffffffff613cd016565b61477e565b611f2c8561477e565b9392505050565b600080821080613a175750600382115b15613a2457506002613a27565b50805b919050565b600754600480546000838152600d602052604090209091015442910181118015613a9857506000828152600d602052604090206002015481111580613a9857506000828152600d602052604090206002015481118015613a9857506000828152600d6020526040902054155b15613acf57613aaa84611f2c89613c49565b6000888152600a6020526040902060030155613aca8288868989886130b9565b6126fa565b6000828152600d602052604090206002015481118015613b0157506000828152600d602052604090206003015460ff16155b156126fa576000828152600d60205260409020600301805460ff19166001179055613b2b83613519565b925080670de0b6b3a764000002836000015101836000018181525050868360200151018360200181815250507f88261ac70d02d5ea73e54fa6da17043c974de1021109573ec1f6f57111c823dd33600a60008a815260200190815260200160002060010154856000015186602001518760400151886060015189608001518a60a001518b60c001518c60e00151604051808b600160a060020a0316600160a060020a031681526020018a6000191660001916815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390a150505050505050565b6000818152600a60205260408120600501548190613c68908490614f9f565b6000838152600a6020526040902060048101546003820154600290920154613c9a9261393f919063ffffffff61397916565b90506000811115613cc6576000838152600a602052604081206002810182905560038101829055600401555b8091505b50919050565b600082821115613d2a576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d61746820737562206661696c656400000000000000000000000000604482015290519081900360640190fd5b50900390565b8051600090829082808060208411801590613d4b5750600084115b1515613dc7576040805160e560020a62461bcd02815260206004820152602a60248201527f737472696e67206d757374206265206265747765656e203120616e642033322060448201527f6368617261637465727300000000000000000000000000000000000000000000606482015290519081900360840190fd5b846000815181101515613dd657fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214158015613e3d57508460018503815181101515613e1557fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214155b1515613eb9576040805160e560020a62461bcd02815260206004820152602560248201527f737472696e672063616e6e6f74207374617274206f7220656e6420776974682060448201527f7370616365000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b846000815181101515613ec857fe5b90602001015160f860020a900460f860020a02600160f860020a031916603060f860020a02141561400b57846001815181101515613f0257fe5b90602001015160f860020a900460f860020a02600160f860020a031916607860f860020a0214151515613f7f576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030780000000000604482015290519081900360640190fd5b846001815181101515613f8e57fe5b90602001015160f860020a900460f860020a02600160f860020a031916605860f860020a021415151561400b576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030580000000000604482015290519081900360640190fd5b600091505b838210156144db5784517f40000000000000000000000000000000000000000000000000000000000000009086908490811061404857fe5b90602001015160f860020a900460f860020a02600160f860020a0319161180156140bc575084517f5b000000000000000000000000000000000000000000000000000000000000009086908490811061409d57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b156141295784828151811015156140cf57fe5b90602001015160f860020a900460f860020a0260f860020a900460200160f860020a02858381518110151561410057fe5b906020010190600160f860020a031916908160001a90535082151561412457600192505b6144d0565b848281518110151561413757fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021480614207575084517f60000000000000000000000000000000000000000000000000000000000000009086908490811061419357fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015614207575084517f7b00000000000000000000000000000000000000000000000000000000000000908690849081106141e857fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b806142b1575084517f2f000000000000000000000000000000000000000000000000000000000000009086908490811061423d57fe5b90602001015160f860020a900460f860020a02600160f860020a0319161180156142b1575084517f3a000000000000000000000000000000000000000000000000000000000000009086908490811061429257fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b151561432d576040805160e560020a62461bcd02815260206004820152602260248201527f737472696e6720636f6e7461696e7320696e76616c696420636861726163746560448201527f7273000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b848281518110151561433b57fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a02141561441a57848260010181518110151561437757fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021415151561441a576040805160e560020a62461bcd02815260206004820152602860248201527f737472696e672063616e6e6f7420636f6e7461696e20636f6e7365637574697660448201527f6520737061636573000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b821580156144c6575084517f30000000000000000000000000000000000000000000000000000000000000009086908490811061445357fe5b90602001015160f860020a900460f860020a02600160f860020a03191610806144c6575084517f3900000000000000000000000000000000000000000000000000000000000000908690849081106144a757fe5b90602001015160f860020a900460f860020a02600160f860020a031916115b156144d057600192505b600190910190614010565b600183151514614535576040805160e560020a62461bcd02815260206004820152601d60248201527f737472696e672063616e6e6f74206265206f6e6c79206e756d62657273000000604482015290519081900360640190fd5b505050506020015192915050565b6000821515614554575060006139d4565b5081810281838281151561456457fe5b04146139d4576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d617468206d756c206661696c656400000000000000000000000000604482015290519081900360640190fd5b6000828152600b602090815260408083208484528252808320600190810154600d808552838620600581015493810154875260108652938620548787529452600790920154670de0b6b3a764000093614677939261466b92909161464291879160649161462c9163ffffffff61454316565b81151561463557fe5b049063ffffffff61454316565b81151561464b57fe5b6000888152600d602052604090206008015491900463ffffffff61397916565b9063ffffffff61454316565b81151561468057fe5b049392505050565b6000828152600b6020908152604080832084845282528083206002810154600190910154600d90935290832060080154613a0092670de0b6b3a7640000916146cf91614543565b8115156146d857fe5b049063ffffffff613cd016565b6000613a006146f384614706565b611f2c614706868663ffffffff61397916565b60006309502f9061476e6d03b2a1d15167e7c5699bfde00000611f2c6147697a0dac7055469777a6122ee4310dd6c14410500f290484000000000061393f6b01027e72f1f128130880000061466b8a670de0b6b3a764000063ffffffff61454316565b615036565b81151561477757fe5b0492915050565b6000614791670de0b6b3a7640000615089565b61476e60026147c46147b186670de0b6b3a764000063ffffffff61454316565b65886c8f6730709063ffffffff61454316565b8115156147cd57fe5b0461393f6147da86615089565b6304a817c89063ffffffff61454316565b6147f3615403565b6000838152600a602052604090206005015415614827576000838152600a6020526040902060050154614827908490614f9f565b506007546000928352600a60208190526040909320600501558051909101815290565b6000818152600d60205260408120600701544291601e916113881015614871576002820491505b6000848152600d60205260409020600201548311801561489d57506000848152600d6020526040902054155b156148c0576148b98361393f84670de0b6b3a764000089614635565b90506148ec565b6000848152600d60205260409020600201546148e99061393f84670de0b6b3a764000089614635565b90505b6148ff620151808463ffffffff61397916565b81101561491f576000848152600d60205260409020600201819055614945565b614932620151808463ffffffff61397916565b6000858152600d60205260409020600201555b5050505050565b600080614abd4361393f42336040516020018082600160a060020a0316600160a060020a03166c010000000000000000000000000281526014019150506040516020818303038152906040526040518082805190602001908083835b602083106149c75780518252601f1990920191602091820191016149a8565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120925050508115156149fd57fe5b0461393f4561393f42416040516020018082600160a060020a0316600160a060020a03166c010000000000000000000000000281526014019150506040516020818303038152906040526040518082805190602001908083835b60208310614a765780518252601f199092019160209182019101614a57565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912092505050811515614aac57fe5b0461393f424463ffffffff61397916565b604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310614b0b5780518252601f199092019160209182019101614aec565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912060065490945092506103e89150839050046103e80282031015614b5a5760019150614b5f565b600091505b5090565b614b6b615403565b60008054604051600a8804929182918291600160a060020a03169060028604908381818185875af115159250614ba8915050576002909304928392505b600154600160a060020a03166002850460405160006040518083038185875af115159250614bea91505057600284049290920191614be760028561362a565b93505b614c06614bf98c8c8c8c615095565b849063ffffffff61397916565b92506000831115614cf457600283049150614c27838363ffffffff613cd016565b600154604051919250600160a060020a0316906002830480156108fc02916000818181858888f19350505050158015614c64573d6000803e3d6000fd5b50600054600160a060020a03166108fc600283049081150290604051600060405180830381858888f19350505050158015614ca3573d6000803e3d6000fd5b5060008b8152600d6020526040902060070154614cc6908363ffffffff61397916565b60008c8152600d602052604090206007015560c0860151614cee90849063ffffffff61397916565b60c08701525b50939998505050505050505050565b614d0b615403565b6000848152600f6020526040812054819081908190606490614d34908b9063ffffffff61454316565b811515614d3d57fe5b049350606489049250614d5b8360055461397990919063ffffffff16565b600555614d8c6064614d748b601d63ffffffff61454316565b811515614d7d57fe5b8b91900463ffffffff613cd016565b9850614d9e898563ffffffff613cd016565b9150614dac8b8b868a6152b2565b90506000811115614dca57614dc7848263ffffffff613cd016565b93505b60008b8152600d6020526040902060070154614df09061393f848463ffffffff61397916565b60008c8152600d602052604090206007015560e0860151614e1890859063ffffffff61397916565b60e0870152506101008501525091979650505050505050565b836c01431e0fae6d7217caa00000000242670de0b6b3a76400000282600001510101816000018181525050600754751aba4714957d300d0e549208b31adb100000000000000285826020015101018160200181815250507f500e72a0e114930aebdbcb371ccdbf43922c49f979794b5de4257ff7e310c74681600001518260200151600a6000898152602001908152602001600020600101543387878760400151886060015189608001518a60a001518b60c001518c60e001518d6101000151600554604051808f81526020018e81526020018d600019166000191681526020018c600160a060020a0316600160a060020a031681526020018b81526020018a815260200189600160a060020a0316600160a060020a0316815260200188600019166000191681526020018781526020018681526020018581526020018481526020018381526020018281526020019e50505050505050505050505050505060405180910390a15050505050565b6000614fab8383614688565b90506000811115615031576000838152600a6020526040902060030154614fd990829063ffffffff61397916565b6000848152600a6020908152604080832060030193909355600b81528282208583529052206002015461501390829063ffffffff61397916565b6000848152600b602090815260408083208684529091529020600201555b505050565b6000806002615046846001613979565b81151561504f57fe5b0490508291505b81811015613cca578091506002615078828581151561507157fe5b0483613979565b81151561508157fe5b049050615056565b60006139d48283614543565b6002546040516000918291600a860491601487049160228804918591600160a060020a03909116906108fc86150290869084818181858888f193505050501580156150e4573d6000803e3d6000fd5b5086158015906150f45750888714155b801561511057506000878152600a602052604090206001015415155b15615291576000898152600a602052604080822060070189905588825290206004015461514490849063ffffffff61397916565b6000888152600a6020908152604091829020600481019390935582546001909301548251600160a060020a03909416845290830152818101859052426060830152518a918c918a917f590bbc0fc16915a85269a48f74783c39842b7ae9eceb7c295c95dbe8b3ec7331919081900360800190a4506000868152600a602052604090206007015480158015906151d95750888114155b15615279576000818152600a602052604090206004015461520190839063ffffffff61397916565b6000828152600a6020908152604091829020600481019390935582546001909301548251600160a060020a03909416845290830152818101849052426060830152518a918c9184917f590bbc0fc16915a85269a48f74783c39842b7ae9eceb7c295c95dbe8b3ec7331919081900360800190a461528c565b615289858363ffffffff61397916565b94505b6152a4565b6152a1858463ffffffff61397916565b94505b509298975050505050505050565b6000848152600d6020526040812060050154819081906152e086670de0b6b3a764000063ffffffff61454316565b8115156152e957fe5b6000898152600d6020526040902060080154919004925061531190839063ffffffff61397916565b6000888152600d6020526040902060080155670de0b6b3a764000061533c838663ffffffff61454316565b81151561534557fe5b6000888152600b602090815260408083208c8452825280832060020154600d909252909120600801549290910492506153989161393f908490670de0b6b3a7640000906146cf908a63ffffffff61454316565b6000878152600b602090815260408083208b8452825280832060020193909355600d905220600501546153f890670de0b6b3a7640000906153e090859063ffffffff61454316565b8115156153e957fe5b8791900463ffffffff613cd016565b979650505050505050565b6101206040519081016040528060008152602001600081526020016000600160a060020a03168152602001600080191681526020016000815260200160008152602001600081526020016000815260200160008152509056006e20646973636f72640000000000000000000000000000000000000000000000706f636b6574206c696e743a206e6f7420612076616c69642063757272656e63697473206e6f74207265616479207965742e2020636865636b203f65746120696e6f20766974616c696b2c206e6f000000000000000000000000000000000000736f7272792068756d616e73206f6e6c79000000000000000000000000000000a165627a7a7230582046dd443fda47cd333d99eb3a88341b0dd6d57ea5be02f732b42751b91d8aff990029
Swarm Source
bzzr://46dd443fda47cd333d99eb3a88341b0dd6d57ea5be02f732b42751b91d8aff99
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,652.65 | 0.0436 | $159.14 |
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.