Source Code
Latest 25 from a total of 912 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 10652782 | 2023 days ago | IN | 0 ETH | 0.00486617 | ||||
| Become New King | 10599494 | 2031 days ago | IN | 0.0092727 ETH | 0.00114155 | ||||
| Withdraw Winners | 10514536 | 2044 days ago | IN | 0 ETH | 0.00147594 | ||||
| Withdraw Winners | 10514281 | 2044 days ago | IN | 0 ETH | 0.00127914 | ||||
| Jackpot WIN | 10514189 | 2044 days ago | IN | 0 ETH | 0.07855177 | ||||
| Nuke | 10468783 | 2051 days ago | IN | 0.13397 ETH | 0.00804236 | ||||
| Become New King | 10423645 | 2058 days ago | IN | 0.0092727 ETH | 0.002561 | ||||
| Become New King | 10378604 | 2065 days ago | IN | 0.0092727 ETH | 0.00580069 | ||||
| Nuke | 10333631 | 2072 days ago | IN | 0.13005 ETH | 0.0064449 | ||||
| Up Love | 10292391 | 2079 days ago | IN | 0 ETH | 0.00105596 | ||||
| Become New King | 10289084 | 2079 days ago | IN | 0.0092727 ETH | 0.00331164 | ||||
| Become New King | 10244314 | 2086 days ago | IN | 0.0092727 ETH | 0.00439761 | ||||
| Become New King | 10199293 | 2093 days ago | IN | 0.0092727 ETH | 0.00179249 | ||||
| Become New King | 10154374 | 2100 days ago | IN | 0.0092727 ETH | 0.0033113 | ||||
| Become New King | 10109564 | 2107 days ago | IN | 0.0092727 ETH | 0.00354783 | ||||
| Become New King | 10064985 | 2114 days ago | IN | 0.0092727 ETH | 0.00319304 | ||||
| Become New King | 10019943 | 2121 days ago | IN | 0.0092727 ETH | 0.00226564 | ||||
| Up Love | 9996165 | 2125 days ago | IN | 0 ETH | 0.0001178 | ||||
| Become New King | 9974973 | 2128 days ago | IN | 0.0092727 ETH | 0.00103452 | ||||
| Become New King | 9930214 | 2135 days ago | IN | 0.0092727 ETH | 0.0005913 | ||||
| Up Love | 9897999 | 2140 days ago | IN | 0 ETH | 0.00036812 | ||||
| Up Love | 9897539 | 2140 days ago | IN | 0 ETH | 0.0003286 | ||||
| Up Love | 9897479 | 2140 days ago | IN | 0 ETH | 0.00054936 | ||||
| Up Love | 9897475 | 2140 days ago | IN | 0 ETH | 0.00083506 | ||||
| Become New King | 9888027 | 2141 days ago | IN | 0.0092727 ETH | 0.0001301 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 10652782 | 2023 days ago | 5.17506287 ETH | ||||
| - | 10514536 | 2044 days ago | 2.375 ETH | ||||
| - | 10514281 | 2044 days ago | 3 ETH | ||||
| - | 10468783 | 2051 days ago | 0.00079915 ETH | ||||
| - | 10468783 | 2051 days ago | 0.00266341 ETH | ||||
| - | 10468783 | 2051 days ago | 0.00266341 ETH | ||||
| - | 10468783 | 2051 days ago | 0.00266341 ETH | ||||
| - | 10468783 | 2051 days ago | 0.0246366 ETH | ||||
| - | 10468783 | 2051 days ago | 0.03728783 ETH | ||||
| - | 10423645 | 2058 days ago | 0.00018545 ETH | ||||
| - | 10423645 | 2058 days ago | 0.00095045 ETH | ||||
| - | 10423645 | 2058 days ago | 0.00095045 ETH | ||||
| - | 10423645 | 2058 days ago | 0.00278181 ETH | ||||
| - | 10378604 | 2065 days ago | 0.00018545 ETH | ||||
| - | 10378604 | 2065 days ago | 0.00095045 ETH | ||||
| - | 10378604 | 2065 days ago | 0.00095045 ETH | ||||
| - | 10378604 | 2065 days ago | 0.00278181 ETH | ||||
| - | 10333631 | 2072 days ago | 0.00077869 ETH | ||||
| - | 10333631 | 2072 days ago | 0.00258542 ETH | ||||
| - | 10333631 | 2072 days ago | 0.00258542 ETH | ||||
| - | 10333631 | 2072 days ago | 0.00258542 ETH | ||||
| - | 10333631 | 2072 days ago | 0.02391519 ETH | ||||
| - | 10333631 | 2072 days ago | 0.03619596 ETH | ||||
| - | 10289084 | 2079 days ago | 0.00018545 ETH | ||||
| - | 10289084 | 2079 days ago | 0.00095045 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SuperCountriesWar
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2018-10-25
*/
pragma solidity ^0.4.25;
/*
SuperCountries War Game #2 - Nuke countries and share a huge war chest
SuperCountries Original Game #1 - Each player earns ether forever
███████╗██╗ ██╗██████╗ ███████╗██████╗
██╔════╝██║ ██║██╔══██╗██╔════╝██╔══██╗
███████╗██║ ██║██████╔╝█████╗ ██████╔╝
╚════██║██║ ██║██╔═══╝ ██╔══╝ ██╔══██╗
███████║╚██████╔╝██║ ███████╗██║ ██║
╚══════╝ ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝
██████╗ ██████╗ ██╗ ██╗███╗ ██╗████████╗██████╗ ██╗███████╗███████╗
██╔════╝██╔═══██╗██║ ██║████╗ ██║╚══██╔══╝██╔══██╗██║██╔════╝██╔════╝
██║ ██║ ██║██║ ██║██╔██╗ ██║ ██║ ██████╔╝██║█████╗ ███████╗
██║ ██║ ██║██║ ██║██║╚██╗██║ ██║ ██╔══██╗██║██╔══╝ ╚════██║
╚██████╗╚██████╔╝╚██████╔╝██║ ╚████║ ██║ ██║ ██║██║███████╗███████║
╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝╚══════╝
██╗ ██╗ █████╗ ██████╗
██║ ██║██╔══██╗██╔══██╗
█████╗ ██║ █╗ ██║███████║██████╔╝ █████╗
╚════╝ ██║███╗██║██╔══██║██╔══██╗ ╚════╝
╚███╔███╔╝██║ ██║██║ ██║
╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝
© 2018 SuperCountries
所有权 - 4CE434B6058EC7C24889EC2512734B5DBA26E39891C09DF50C3CE3191CE9C51E
Xuxuxu - LB - Xufo - MyPartridge
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
///// /////
///// CALLING EXTERNAL CONTRACTS /////
///// /////
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
////////////////////////////////////////////////
/// SUPERCOUNTRIES CONTRACT FUNCTIONS ///
////////////////////////////////////////////////
contract SuperCountriesExternal {
using SafeMath for uint256;
function ownerOf(uint256) public pure returns (address) { }
function priceOf(uint256) public pure returns (uint256) { }
}
////////////////////////////////////////////////////////////
/// SUPERCOUNTRIES TROPHY CARDS CONTRACT FUNCTIONS ///
////////////////////////////////////////////////////////////
contract SuperCountriesTrophyCardsExternal {
using SafeMath for uint256;
function countTrophyCards() public pure returns (uint256) { }
function getTrophyCardIdFromIndex(uint256) public pure returns (uint256) { }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
///// /////
///// SUPERCOUNTRIES WAR - NEW CONTRACT /////
///// /////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
contract SuperCountriesWar {
using SafeMath for uint256;
////////////////////////////
/// CONSTRUCTOR ///
////////////////////////////
constructor () public {
owner = msg.sender;
continentKing.length = 16;
newOwner.length = 256;
nukerAddress.length = 256;
}
address public owner;
////////////////////////////////
/// USEFUL MODIFIERS ///
////////////////////////////////
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner == msg.sender);
_;
}
/**
* @dev Throws if called by address 0x0
*/
modifier onlyRealAddress() {
require(msg.sender != address(0));
_;
}
/**
* @dev Can only be called when a game is running / unpaused
*/
modifier onlyGameNOTPaused() {
require(gameRunning == true);
_;
}
/**
* @dev Can only be called when a game is paused / ended
*/
modifier onlyGamePaused() {
require(gameRunning == false);
_;
}
///////////////////////////////////////
/// TROPHY CARDS FUNCTIONS ///
///////////////////////////////////////
///Update the index of the next trophy card to get dividends, after each buy a new card will get divs
function nextTrophyCardUpdateAndGetOwner() internal returns (address){
uint256 cardsLength = getTrophyCount();
address trophyCardOwner;
if (nextTrophyCardToGetDivs < cardsLength){
uint256 nextCard = getTrophyFromIndex(nextTrophyCardToGetDivs);
trophyCardOwner = getCountryOwner(nextCard);
}
/// Update for next time
if (nextTrophyCardToGetDivs.add(1) < cardsLength){
nextTrophyCardToGetDivs++;
}
else nextTrophyCardToGetDivs = 0;
return trophyCardOwner;
}
/// Get the address of the owner of the "next trophy card to get divs"
function getNextTrophyCardOwner()
public
view
returns (
address nextTrophyCardOwner_,
uint256 nextTrophyCardIndex_,
uint256 nextTrophyCardId_
)
{
uint256 cardsLength = getTrophyCount();
address trophyCardOwner;
if (nextTrophyCardToGetDivs < cardsLength){
uint256 nextCard = getTrophyFromIndex(nextTrophyCardToGetDivs);
trophyCardOwner = getCountryOwner(nextCard);
}
return (
trophyCardOwner,
nextTrophyCardToGetDivs,
nextCard
);
}
////////////////////////////////////////////////////////
/// CALL OF OTHER SUPERCOUNTRIES CONTRACTS ///
////////////////////////////////////////////////////////
/// EXTERNAL VALUES
address private contractSC = 0xdf203118A954c918b967a94E51f3570a2FAbA4Ac; /// SuperCountries Original game
address private contractTrophyCards = 0xEaf763328604e6e54159aba7bF1394f2FbcC016e; /// SuperCountries Trophy Cards
SuperCountriesExternal SC = SuperCountriesExternal(contractSC);
SuperCountriesTrophyCardsExternal SCTrophy = SuperCountriesTrophyCardsExternal(contractTrophyCards);
////////////////////////////////////////////////////
/// GET FUNCTIONS FROM EXTERNAL CONTRACTS ///
////////////////////////////////////////////////////
/// SuperCountries Original
function getCountryOwner(uint256 _countryId) public view returns (address){
return SC.ownerOf(_countryId);
}
/// SuperCountries Original
function getPriceOfCountry(uint256 _countryId) public view returns (uint256){
return SC.priceOf(_countryId);
}
/// SuperCountries Trophy Cards
function getTrophyFromIndex(uint256 _index) public view returns (uint256){
return SCTrophy.getTrophyCardIdFromIndex(_index);
}
/// SuperCountries Trophy Cards
function getTrophyCount() public view returns (uint256){
return SCTrophy.countTrophyCards();
}
////////////////////////////////////////
/// VARIABLES & MAPPINGS ///
////////////////////////////////////////
/// Game enabled?
bool private gameRunning;
uint256 private gameVersion = 1; /// game Id
/// Dates & timestamps
uint256 private jackpotTimestamp; /// if this timestamp is reached, the jackpot can be shared
mapping(uint256 => bool) private thisJackpotIsPlayedAndNotWon; /// true if currently played and not won, false if already won or not yet played
/// *** J A C K P O T *** ///
/// Unwithdrawn jackpot per winner
mapping(uint256 => mapping(address => uint256)) private winnersJackpot;
mapping(uint256 => uint256) private winningCountry; /// List of winning countries
/// Payable functions prices: nuke a country, become a king ///
uint256 private startingPrice = 1e16; /// ETHER /// First raw price to nuke a country /// nuke = nextPrice (or startingPrice) + kCountry*LastKnownCountryPrice
mapping(uint256 => uint256) private nextPrice; /// ETHER /// Current raw price to nuke a country /// nuke = nextPrice + kCountry*LastKnownCountryPrice
uint256 private kingPrice = 9e15; /// ETHER /// Current king price
/// Factors ///
uint256 private kCountry = 4; /// PERCENTS /// nuke = nextPrice + kCountry*LastKnownCountryPrice (4 = 4%)
uint256 private kCountryLimit = 5e17; /// ETHER /// kCountry * lastKnownPrice cannot exceed this limit
uint256 private kNext = 1037; /// PERTHOUSAND /// price increase after each nuke (1037 = 3.7% increase)
uint256 private maxFlips = 16; /// king price will increase after maxFlips kings
uint256 private continentFlips; /// Current kings flips
uint256 private kKings = 101; /// king price increase (101 = 1% increase)
/// Kings //
address[] private continentKing;
/// Nukers ///
address[] private nukerAddress;
/// Lovers ///
struct LoverStructure {
mapping(uint256 => mapping(address => uint256)) loves; /// howManyNuked => lover address => number of loves
mapping(uint256 => uint256) maxLoves; /// highest number of loves for this country
address bestLover; /// current best lover for this country (highest number of loves)
}
mapping(uint256 => mapping(uint256 => LoverStructure)) private loversSTR; /// GameVersion > CountryId > LoverStructure
uint256 private mostLovedCountry; /// The mostLovedCountry cannot be nuked if > 4 countries on the map
mapping(address => uint256) private firstLove; /// timestamp for loves
mapping(address => uint256) private remainingLoves; /// remaining loves for today
uint256 private freeRemainingLovesPerDay = 2; /// Number of free loves per day sub 1
/// Cuts in perthousand /// the rest = potCut
uint256 private devCut = 280; /// Including riddles and medals rewards
uint256 private playerCut = 20; /// trophy card, best lover & country owner
uint256 private potCutSuperCountries = 185;
/// Jackpot redistribution /// 10 000 = 100%
uint256 private lastNukerShare = 5000;
uint256 private winningCountryShare = 4400; /// if 1 country stands, the current owner takes it all, otherwise shared between owners of remaining countries (of the winning continent)
uint256 private continentShare = 450;
uint256 private freePlayerShare = 150;
/// Minimal jackpot guarantee /// Initial funding by SuperCountries
uint256 private lastNukerMin = 3e18; /// 3 ethers
uint256 private countryOwnerMin = 3e18; /// 3 ethers
uint256 private continentMin = 1e18; /// 1 ether
uint256 private freePlayerMin = 1e18; /// 1 ether
uint256 private withdrawMinOwner; /// Dev can withdraw his initial funding if the jackpot equals this value.
/// Trophy cards
uint256 private nextTrophyCardToGetDivs; /// returns next trophy card INDEX to get dividends
/// Countries ///
uint256 private allCountriesLength = 256; /// how many countries
mapping(uint256 => mapping(uint256 => bool)) private eliminated; /// is this country eliminated? gameVersion > countryId > bool
uint256 private howManyEliminated; /// how many eliminated countries
uint256 private howManyNuked; /// how many nuked countries
uint256 private howManyReactivated; /// players are allowed to reactivate 1 country for 8 nukes
uint256 private lastNukedCountry; /// last nuked country ID
mapping(uint256 => uint256) lastKnownCountryPrice; ///
address[] private newOwner; /// Latest known country owners /// A new buyer must send at least one love or reanimate its country to be in the array
/// Continents ///
mapping(uint256 => uint256) private countryToContinent; /// country Id to Continent Id
/// Time (seconds) ///
uint256 public SLONG = 86400; /// 1 day
uint256 public DLONG = 172800; /// 2 days
uint256 public DSHORT = 14400; /// 4 hrs
////////////////////////
/// EVENTS ///
////////////////////////
/// Pause / UnPause
event PausedOrUnpaused(uint256 indexed blockTimestamp_, bool indexed gameRunning_);
/// New Game ///
event NewGameLaunched(uint256 indexed gameVersion_, uint256 indexed blockTimestamp_, address indexed msgSender_, uint256 jackpotTimestamp_);
event ErrorCountry(uint256 indexed countryId_);
/// Updates ///
event CutsUpdated(uint256 indexed newDevcut_, uint256 newPlayercut_, uint256 newJackpotCountriescut_, uint256 indexed blockTimestamp_);
event ConstantsUpdated(uint256 indexed newStartPrice_, uint256 indexed newkKingPrice_, uint256 newKNext_, uint256 newKCountry_, uint256 newKLimit_, uint256 newkKings, uint256 newMaxFlips);
event NewContractAddress(address indexed newAddress_);
event NewValue(uint256 indexed code_, uint256 indexed newValue_, uint256 indexed blockTimestamp_);
event NewCountryToContinent(uint256 indexed countryId_, uint256 indexed continentId_, uint256 indexed blockTimestamp_);
/// Players Events ///
event PlayerEvent(uint256 indexed eventCode_, uint256 indexed countryId_, address indexed player_, uint256 timestampNow_, uint256 customValue_, uint256 gameId_);
event Nuked(address indexed player_, uint256 indexed lastNukedCountry_, uint256 priceToPay_, uint256 priceRaw_);
event Reactivation(uint256 indexed countryId_, uint256 indexed howManyReactivated_);
event NewKingContinent(address indexed player_, uint256 indexed continentId_, uint256 priceToPay_);
event newMostLovedCountry(uint256 indexed countryId_, uint256 indexed maxLovesBest_);
event NewBestLover(address indexed lover_, uint256 indexed countryId_, uint256 maxLovesBest_);
event NewLove(address indexed lover_, uint256 indexed countryId_, uint256 playerLoves_, uint256 indexed gameId_, uint256 nukeCount_);
event LastCountryStanding(uint256 indexed countryId_, address indexed player_, uint256 contractBalance_, uint256 indexed gameId_, uint256 jackpotTimestamp);
event ThereIsANewOwner(address indexed newOwner_, uint256 indexed countryId_);
/// Payments ///
event CutsPaidInfos(uint256 indexed blockTimestamp_, uint256 indexed countryId_, address countryOwner_, address trophyCardOwner_, address bestLover_);
event CutsPaidValue(uint256 indexed blockTimestamp_, uint256 indexed paidPrice_, uint256 thisBalance_, uint256 devCut_, uint256 playerCut_, uint256 indexed SuperCountriesCut_);
event CutsPaidLight(uint256 indexed blockTimestamp_, uint256 indexed paidPrice_, uint256 thisBalance_, uint256 devCut_, uint256 playerCut_, address trophyCardOwner_, uint256 indexed SuperCountriesCut_);
event NewKingPrice(uint256 indexed kingPrice_, uint256 indexed kKings_);
/// Jackpot & Withdraws ///
event NewJackpotTimestamp(uint256 indexed jackpotTimestamp_, uint256 indexed timestamp_);
event WithdrawByDev(uint256 indexed blockTimestamp_, uint256 indexed withdrawn_, uint256 indexed withdrawMinOwner_, uint256 jackpot_);
event WithdrawJackpot(address indexed winnerAddress_, uint256 indexed jackpotToTransfer_, uint256 indexed gameVersion_);
event JackpotDispatch(address indexed winner, uint256 indexed jackpotShare_, uint256 customValue_, bytes32 indexed customText_);
event JackpotDispatchAll(uint256 indexed gameVersion_, uint256 indexed winningCountry_, uint256 indexed continentId_, uint256 timestampNow_, uint256 jackpotTimestamp_, uint256 pot_,uint256 potDispatched_, uint256 thisBalance);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////
/// PUBLIC GET FUNCTIONS ///
////////////////////////////
/// Checks if a player can nuke or be a king
function canPlayTimestamp() public view returns (bool ok_){
uint256 timestampNow = block.timestamp;
uint256 jT = jackpotTimestamp;
bool canPlayTimestamp_;
if (timestampNow < jT || timestampNow > jT.add(DSHORT)){
canPlayTimestamp_ = true;
}
return canPlayTimestamp_;
}
/// When eliminated, the country cannot be eliminated again unless someone rebuys this country
function isEliminated(uint256 _countryId) public view returns (bool isEliminated_){
return eliminated[gameVersion][_countryId];
}
/// The player can love few times a day (or more if loved yesterday)
function canPlayerLove(address _player) public view returns (bool playerCanLove_){
if (firstLove[_player].add(SLONG) > block.timestamp && remainingLoves[_player] == 0){
bool canLove = false;
} else canLove = true;
return canLove;
}
/// To reanimate a country, a player must rebuy it first on the marketplace then click the reanima button
/// Reanimations are limited: 1 allowed for 8 nukes ; disallowed if only 8 countries on the map
function canPlayerReanimate(
uint256 _countryId,
address _player
)
public
view
returns (bool canReanimate_)
{
if (
(lastKnownCountryPrice[_countryId] < getPriceOfCountry(_countryId)) &&
(isEliminated(_countryId) == true) &&
(_countryId != lastNukedCountry) &&
(block.timestamp.add(SLONG) < jackpotTimestamp || block.timestamp > jackpotTimestamp.add(DSHORT)) &&
(allCountriesLength.sub(howManyEliminated) > 8) && /// If only 8 countries left, no more reactivation allowed even if other requires could allow
((howManyReactivated.add(1)).mul(8) < howManyNuked) && /// 1 reactivation for 8 Nukes
(lastKnownCountryPrice[_countryId] > 0) &&
(_player == getCountryOwner(_countryId))
) {
bool canReanima = true;
} else canReanima = false;
return canReanima;
}
/// Get the current gameVersion
function constant_getGameVersion() public view returns (uint256 currentGameVersion_){
return gameVersion;
}
/// Returns some useful informations for a country
function country_getInfoForCountry(uint256 _countryId)
public
view
returns (
bool eliminatedBool_,
uint256 whichContinent_,
address currentBestLover_,
uint256 maxLovesForTheBest_,
address countryOwner_,
uint256 lastKnownPrice_
)
{
LoverStructure storage c = loversSTR[gameVersion][_countryId];
if (eliminated[gameVersion][_countryId]){uint256 nukecount = howManyNuked.sub(1);} else nukecount = howManyNuked;
return (
eliminated[gameVersion][_countryId],
countryToContinent[_countryId],
c.bestLover,
c.maxLoves[nukecount],
newOwner[_countryId],
lastKnownCountryPrice[_countryId]
);
}
/// Returns the number of loves
function loves_getLoves(uint256 _countryId, address _player) public view returns (uint256 loves_) {
LoverStructure storage c = loversSTR[gameVersion][_countryId];
return c.loves[howManyNuked][_player];
}
/// Returns the number of loves of a player for a country for an old gameId for howManyNukedId (loves reset after each nuke)
function loves_getOldLoves(
uint256 _countryId,
address _player,
uint256 _gameId,
uint256 _oldHowManyNuked
)
public
view
returns (uint256 loves_)
{
return loversSTR[_gameId][_countryId].loves[_oldHowManyNuked][_player];
}
/// Calculate how many loves left for a player for today
function loves_getPlayerInfo(address _player)
public
view
returns (
uint256 playerFirstLove_,
uint256 playerRemainingLoves_,
uint256 realRemainingLoves_
)
{
uint256 timestampNow = block.timestamp;
uint256 firstLoveAdd24 = firstLove[_player].add(SLONG);
uint256 firstLoveAdd48 = firstLove[_player].add(DLONG);
uint256 remainStored = remainingLoves[_player];
/// This player loved today but has some loves left, remainingLoves are correct
if (firstLoveAdd24 > timestampNow && remainStored > 0){
uint256 remainReal = remainStored;
}
/// This player loved yesterday but not today, he can love "howManyEliminated.div(4)" + "freeRemainingLovesPerDay + 1" times today
else if (firstLoveAdd24 < timestampNow && firstLoveAdd48 > timestampNow){
remainReal = (howManyEliminated.div(4)).add(freeRemainingLovesPerDay).add(1);
}
/// This player didn't love for 48h, he can love "freeRemainingLovesPerDay + 1" today
else if (firstLoveAdd48 < timestampNow){
remainReal = freeRemainingLovesPerDay.add(1);
}
else remainReal = 0;
return (
firstLove[_player],
remainStored,
remainReal
);
}
/// Returns the unwithdrawn jackpot of a player for a GameId
function player_getPlayerJackpot(
address _player,
uint256 _gameId
)
public
view
returns (
uint256 playerNowPot_,
uint256 playerOldPot_
)
{
return (
winnersJackpot[gameVersion][_player],
winnersJackpot[_gameId][_player]
);
}
/// Returns informations for a country for previous games
function country_getOldInfoForCountry(uint256 _countryId, uint256 _gameId)
public
view
returns (
bool oldEliminatedBool_,
uint256 oldMaxLovesForTheBest_
)
{
LoverStructure storage c = loversSTR[_gameId][_countryId];
return (
eliminated[_gameId][_countryId],
c.maxLoves[howManyNuked]
);
}
/// Returns informations for a country for previous games requiring more parameters
function loves_getOldNukesMaxLoves(
uint256 _countryId,
uint256 _gameId,
uint256 _howManyNuked
)
public view returns (uint256 oldMaxLovesForTheBest2_)
{
return (loversSTR[_gameId][_countryId].maxLoves[_howManyNuked]);
}
/// Returns other informations for a country for previous games
function country_getCountriesGeneralInfo()
public
view
returns (
uint256 lastNuked_,
address lastNukerAddress_,
uint256 allCountriesLength_,
uint256 howManyEliminated_,
uint256 howManyNuked_,
uint256 howManyReactivated_,
uint256 mostLovedNation_
)
{
return (
lastNukedCountry,
nukerAddress[lastNukedCountry],
allCountriesLength,
howManyEliminated,
howManyNuked,
howManyReactivated,
mostLovedCountry
);
}
/// Get the address of the king for a continent
function player_getKingOne(uint256 _continentId) public view returns (address king_) {
return continentKing[_continentId];
}
/// Return all kings
function player_getKingsAll() public view returns (address[] _kings) {
uint256 kingsLength = continentKing.length;
address[] memory kings = new address[](kingsLength);
uint256 kingsCounter = 0;
for (uint256 i = 0; i < kingsLength; i++) {
kings[kingsCounter] = continentKing[i];
kingsCounter++;
}
return kings;
}
/// Return lengths of arrays
function constant_getLength()
public
view
returns (
uint256 kingsLength_,
uint256 newOwnerLength_,
uint256 nukerLength_
)
{
return (
continentKing.length,
newOwner.length,
nukerAddress.length
);
}
/// Return the nuker's address - If a country was nuked twice (for example after a reanimation), we store the last nuker only
function player_getNuker(uint256 _countryId) public view returns (address nuker_) {
return nukerAddress[_countryId];
}
/// How many countries were nuked by a player?
/// Warning: if a country was nuked twice (for example after a reanimation), only the last nuker counts
function player_howManyNuked(address _player) public view returns (uint256 nukeCount_) {
uint256 counter = 0;
for (uint256 i = 0; i < nukerAddress.length; i++) {
if (nukerAddress[i] == _player) {
counter++;
}
}
return counter;
}
/// Which countries were nuked by a player?
function player_getNukedCountries(address _player) public view returns (uint256[] myNukedCountriesIds_) {
uint256 howLong = player_howManyNuked(_player);
uint256[] memory myNukedCountries = new uint256[](howLong);
uint256 nukeCounter = 0;
for (uint256 i = 0; i < allCountriesLength; i++) {
if (nukerAddress[i] == _player){
myNukedCountries[nukeCounter] = i;
nukeCounter++;
}
if (nukeCounter == howLong){break;}
}
return myNukedCountries;
}
/// Which percentage of the jackpot will the winners share?
function constant_getPriZZZes()
public
view
returns (
uint256 lastNukeShare_,
uint256 countryOwnShare_,
uint256 contintShare_,
uint256 freePlayerShare_
)
{
return (
lastNukerShare,
winningCountryShare,
continentShare,
freePlayerShare
);
}
/// Returns the minimal jackpot part for each winner (if accurate)
/// Only accurate for the first game. If new games are started later, these values will be set to 0
function constant_getPriZZZesMini()
public
view
returns (
uint256 lastNukeMini_,
uint256 countryOwnMini_,
uint256 contintMini_,
uint256 freePlayerMini_,
uint256 withdrMinOwner_
)
{
return (
lastNukerMin,
countryOwnerMin,
continentMin,
freePlayerMin,
withdrawMinOwner
);
}
/// Returns some values for the current game
function constant_getPrices()
public
view
returns (
uint256 nextPrice_,
uint256 startingPrice_,
uint256 kingPrice_,
uint256 kNext_,
uint256 kCountry_,
uint256 kCountryLimit_,
uint256 kKings_)
{
return (
nextPrice[gameVersion],
startingPrice,
kingPrice,
kNext,
kCountry,
kCountryLimit,
kKings
);
}
/// Returns other values for the current game
function constant_getSomeDetails()
public
view
returns (
bool gameRunng_,
uint256 currentContractBalance_,
uint256 jackptTimstmp_,
uint256 maxFlip_,
uint256 continentFlip_,
bool jackpotNotWonYet_)
{
return (
gameRunning,
address(this).balance,
jackpotTimestamp,
maxFlips,
continentFlips,
thisJackpotIsPlayedAndNotWon[gameVersion]
);
}
/// Returns some values for previous games
function constant_getOldDetails(uint256 _gameId)
public
view
returns (
uint256 oldWinningCountry_,
bool oldJackpotBool_,
uint256 oldNextPrice_
)
{
return (
winningCountry[_gameId],
thisJackpotIsPlayedAndNotWon[_gameId],
nextPrice[_gameId]
);
}
/// Returns cuts
function constant_getCuts()
public
view
returns (
uint256 playerCut_,
uint256 potCutSC,
uint256 developerCut_)
{
return (
playerCut,
potCutSuperCountries,
devCut
);
}
/// Returns linked contracts addresses: SuperCountries core contract, Trophy Cards Contract
function constant_getContracts() public view returns (address SuperCountries_, address TrophyCards_) {
return (contractSC, contractTrophyCards);
}
/// Calculates the raw price of a next nuke
/// This value will be used to calculate a nuke price for a specified country depending of its market price
function war_getNextNukePriceRaw() public view returns (uint256 price_) {
if (nextPrice[gameVersion] != 0) {
uint256 price = nextPrice[gameVersion];
}
else price = startingPrice;
return price;
}
/// Calculates the exact price to nuke a country using the raw price (calculated above) and the market price of a country
function war_getNextNukePriceForCountry(uint256 _countryId) public view returns (uint256 priceOfThisCountry_) {
uint256 priceRaw = war_getNextNukePriceRaw();
uint256 k = lastKnownCountryPrice[_countryId].mul(kCountry).div(100);
if (k > kCountryLimit){
uint256 priceOfThisCountry = priceRaw.add(kCountryLimit);
}
else priceOfThisCountry = priceRaw.add(k);
return priceOfThisCountry;
}
/// Returns all countries for a continent
function country_getAllCountriesForContinent(uint256 _continentId) public view returns (uint256[] countries_) {
uint256 howManyCountries = country_countCountriesForContinent(_continentId);
uint256[] memory countries = new uint256[](howManyCountries);
uint256 countryCounter = 0;
for (uint256 i = 0; i < allCountriesLength; i++) {
if (countryToContinent[i] == _continentId){
countries[countryCounter] = i;
countryCounter++;
}
if (countryCounter == howManyCountries){break;}
}
return countries;
}
/// Count all countries for a continent (standing and non standing)
function country_countCountriesForContinent(uint256 _continentId) public view returns (uint256 howManyCountries_) {
uint256 countryCounter = 0;
for (uint256 i = 0; i < allCountriesLength; i++) {
if (countryToContinent[i] == _continentId){
countryCounter++;
}
}
return countryCounter;
}
/// Return the ID of all STANDING countries for a continent (or not Standing if FALSE)
function country_getAllStandingCountriesForContinent(
uint256 _continentId,
bool _standing
)
public
view
returns (uint256[] countries_)
{
uint256 howManyCountries = country_countStandingCountriesForContinent(_continentId, _standing);
uint256[] memory countries = new uint256[](howManyCountries);
uint256 countryCounter = 0;
uint256 gameId = gameVersion;
for (uint256 i = 0; i < allCountriesLength; i++) {
if (countryToContinent[i] == _continentId && eliminated[gameId][i] != _standing){
countries[countryCounter] = i;
countryCounter++;
}
if (countryCounter == howManyCountries){break;}
}
return countries;
}
/// Count all STANDING countries for a continent (or not Standing if FALSE)
function country_countStandingCountriesForContinent(
uint256 _continentId,
bool _standing
)
public
view
returns (uint256 howManyCountries_)
{
uint256 standingCountryCounter = 0;
uint256 gameId = gameVersion;
for (uint256 i = 0; i < allCountriesLength; i++) {
if (countryToContinent[i] == _continentId && eliminated[gameId][i] != _standing){
standingCountryCounter++;
}
}
return standingCountryCounter;
}
/// Calculate the jackpot to share between all winners
/// realJackpot: the real value to use when sharing
/// expected: this is the jackpot as we should expect if there was no minimal guarantee. It can be different from the real one if we have not reached the minimal value yet.
/// WARNING: between the real and the expected, the REAL one is the only value to use ; the expected one is for information only and will never be used in any calculation
function calculateJackpot()
public
view
returns (
uint256 nukerJackpot_,
uint256 countryJackpot_,
uint256 continentJackpot_,
uint256 freeJackpot_,
uint256 realJackpot_,
uint256 expectedJackpot_
)
{
/// If thisJackpot = false, that would mean it was already won or not yet played,
/// if true it's currently played and not won yet
if (thisJackpotIsPlayedAndNotWon[gameVersion] != true) {
uint256 nukerJPT = 0;
uint256 countryJPT = 0;
uint256 continentJPT = 0;
uint256 freeJPT = 0;
uint256 realJackpotToShare = 0;
uint256 expectedJackpotFromRates = 0;
}
else {
uint256 devGift = lastNukerMin.add(countryOwnerMin).add(continentMin).add(freePlayerMin);
expectedJackpotFromRates = ((address(this).balance).add(withdrawMinOwner).sub(devGift)).div(10000);
uint256 temp_share = expectedJackpotFromRates.mul(lastNukerShare);
if (temp_share > lastNukerMin){
nukerJPT = temp_share;
} else nukerJPT = lastNukerMin;
temp_share = expectedJackpotFromRates.mul(winningCountryShare);
if (temp_share > countryOwnerMin){
countryJPT = temp_share;
} else countryJPT = countryOwnerMin;
temp_share = expectedJackpotFromRates.mul(continentShare);
if (temp_share > continentMin){
continentJPT = temp_share;
} else continentJPT = continentMin;
temp_share = expectedJackpotFromRates.mul(freePlayerShare);
if (temp_share > freePlayerMin){
freeJPT = temp_share;
} else freeJPT = freePlayerMin;
realJackpotToShare = nukerJPT.add(countryJPT).add(continentJPT).add(freeJPT);
}
return (
nukerJPT,
countryJPT,
continentJPT,
freeJPT,
realJackpotToShare,
expectedJackpotFromRates.mul(10000)
);
}
/// Calculate how much the dev can withdraw now
/// If the dev funded a minimal guarantee, he can withdraw gradually its funding when jackpot rises up to its funding amount
function whatDevCanWithdraw() public view returns(uint256 toWithdrawByDev_){
uint256 devGift = lastNukerMin.add(countryOwnerMin).add(continentMin).add(freePlayerMin);
uint256 balance = address(this).balance;
(,,,,uint256 jackpotToDispatch,) = calculateJackpot();
uint256 leftToWithdraw = devGift.sub(withdrawMinOwner);
uint256 leftInTheContract = balance.sub(jackpotToDispatch);
if (leftToWithdraw > 0 && balance > jackpotToDispatch){
/// ok he can still withdraw
if (leftInTheContract > leftToWithdraw){
uint256 devToWithdraw = leftToWithdraw;
} else devToWithdraw = leftInTheContract;
}
return devToWithdraw;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////
/// INTERNAL FUNCTIONS ///
//////////////////////////
/// Heavy pay function for Nukes ///
function payCuts(
uint256 _value,
uint256 _balance,
uint256 _countryId,
uint256 _timestamp
)
internal
{
require(_value <= _balance);
require(_value != 0);
/// Get the next trophy card owner to send cuts
address nextTrophyOwner = nextTrophyCardUpdateAndGetOwner();
if (nextTrophyOwner == 0) {
nextTrophyOwner = owner;
}
/// Get the country owner to send cuts
address countryOwner = newOwner[_countryId];
if (countryOwner == 0) {
countryOwner = owner;
}
/// Get the best lover to send cuts
address bestLoverToGetDivs = loversSTR[gameVersion][_countryId].bestLover;
if (bestLoverToGetDivs == 0) {
bestLoverToGetDivs = owner;
}
/// Calculate cuts
uint256 devCutPay = _value.mul(devCut).div(1000);
uint256 superCountriesPotCutPay = _value.mul(potCutSuperCountries).div(1000);
uint256 trophyAndOwnerCutPay = _value.mul(playerCut).div(1000);
/// Pay cuts ///
owner.transfer(devCutPay);
contractSC.transfer(superCountriesPotCutPay);
nextTrophyOwner.transfer(trophyAndOwnerCutPay);
countryOwner.transfer(trophyAndOwnerCutPay);
bestLoverToGetDivs.transfer(trophyAndOwnerCutPay);
emit CutsPaidInfos(_timestamp, _countryId, countryOwner, nextTrophyOwner, bestLoverToGetDivs);
emit CutsPaidValue(_timestamp, _value, address(this).balance, devCutPay, trophyAndOwnerCutPay, superCountriesPotCutPay);
assert(_balance.sub(_value) <= address(this).balance);
assert((trophyAndOwnerCutPay.mul(3).add(devCutPay).add(superCountriesPotCutPay)) < _value);
}
/// Light pay function for Kings ///
function payCutsLight(
uint256 _value,
uint256 _balance,
uint256 _timestamp
)
internal
{
require(_value <= _balance);
require(_value != 0);
/// Get the next trophy card owner to send cuts
address nextTrophyOwner = nextTrophyCardUpdateAndGetOwner();
if (nextTrophyOwner == 0) {
nextTrophyOwner = owner;
}
/// Get the last nuker to send cuts
address lastNuker = nukerAddress[lastNukedCountry];
if (lastNuker == 0) {
lastNuker = owner;
}
/// Calculate cuts
uint256 trophyCutPay = _value.mul(playerCut).div(1000);
uint256 superCountriesPotCutPay = ((_value.mul(potCutSuperCountries).div(1000)).add(trophyCutPay)).div(2); /// Divide by 2: one part for SCPot, one for lastNuker
uint256 devCutPay = (_value.mul(devCut).div(1000)).add(trophyCutPay);
/// Pay cuts ///
owner.transfer(devCutPay);
contractSC.transfer(superCountriesPotCutPay);
lastNuker.transfer(superCountriesPotCutPay);
nextTrophyOwner.transfer(trophyCutPay);
emit CutsPaidLight(_timestamp, _value, address(this).balance, devCutPay, trophyCutPay, nextTrophyOwner, superCountriesPotCutPay);
assert(_balance.sub(_value) <= address(this).balance);
assert((trophyCutPay.add(devCutPay).add(superCountriesPotCutPay)) < _value);
}
/// Refund the nuker / new king if excess
function excessRefund(
address _payer,
uint256 _priceToPay,
uint256 paidPrice
)
internal
{
uint256 excess = paidPrice.sub(_priceToPay);
if (excess > 0) {
_payer.transfer(excess);
}
}
/// Update the jackpot timestamp each time a country is nuked or a new king crowned
function updateJackpotTimestamp(uint256 _timestamp) internal {
jackpotTimestamp = _timestamp.add(604800); /// 1 week
emit NewJackpotTimestamp(jackpotTimestamp, _timestamp);
}
/// If first love > 24h, the player can love again
/// and get extra loves if loved yesterday
function updateLovesForToday(address _player, uint256 _timestampNow) internal {
uint256 firstLoveAdd24 = firstLove[_player].add(SLONG);
uint256 firstLoveAdd48 = firstLove[_player].add(DLONG);
uint256 remainV = remainingLoves[_player];
/// This player loved today but has some loves left
if (firstLoveAdd24 > _timestampNow && remainV > 0){
remainingLoves[_player] = remainV.sub(1);
}
/// This player loved yesterday but not today
else if (firstLoveAdd24 < _timestampNow && firstLoveAdd48 > _timestampNow){
remainingLoves[_player] = (howManyEliminated.div(4)).add(freeRemainingLovesPerDay);
firstLove[_player] = _timestampNow;
}
/// This player didn't love for 48h, he can love today
else if (firstLoveAdd48 < _timestampNow){
remainingLoves[_player] = freeRemainingLovesPerDay;
firstLove[_player] = _timestampNow;
}
/// This player is a zombie
else remainingLoves[_player] = 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////
/// WAR - PUBLIC FUNCTIONS ///
////////////////////////////////////
//////////////////////
/// NUKE A COUNTRY ///
//////////////////////
function nuke(uint256 _countryId) payable public onlyGameNOTPaused{
require(_countryId < allCountriesLength);
require(msg.value >= war_getNextNukePriceForCountry(_countryId));
require(war_getNextNukePriceForCountry(_countryId) > 0);
require(isEliminated(_countryId) == false);
require(canPlayTimestamp()); /// Impossible to nuke 2 hours after the jackpot
require(loversSTR[gameVersion][_countryId].bestLover != msg.sender); /// The best lover cannot nuke his favorite country
require(_countryId != mostLovedCountry || allCountriesLength.sub(howManyEliminated) < 5); /// We cannot nuke the mostLovedCountry if more than 4 countries stand
address player = msg.sender;
uint256 timestampNow = block.timestamp;
uint256 gameId = gameVersion;
uint256 thisBalance = address(this).balance;
uint256 priceToPay = war_getNextNukePriceForCountry(_countryId);
/// Update the latest nuker of the game in the nukerAddress array
nukerAddress[_countryId] = player;
/// Get last known price of this country for next time
uint256 lastPriceOld = lastKnownCountryPrice[_countryId];
lastKnownCountryPrice[_countryId] = getPriceOfCountry(_countryId);
/// Change the activation of this country
eliminated[gameId][_countryId] = true;
howManyEliminated++;
if (howManyEliminated.add(1) == allCountriesLength){
jackpotTimestamp = block.timestamp;
emit LastCountryStanding(_countryId, player, thisBalance, gameId, jackpotTimestamp);
}
else {
/// Update next price
uint priceRaw = war_getNextNukePriceRaw();
nextPrice[gameId] = priceRaw.mul(kNext).div(1000);
/// and update the jackpot
updateJackpotTimestamp(timestampNow);
}
lastNukedCountry = _countryId;
payCuts(priceToPay, thisBalance, _countryId, timestampNow);
excessRefund(player, priceToPay, msg.value);
howManyNuked++;
/// emit the event
emit Nuked(player, _countryId, priceToPay, priceRaw);
emit PlayerEvent(1, _countryId, player, timestampNow, howManyEliminated, gameId);
assert(lastKnownCountryPrice[_countryId] >= lastPriceOld);
}
///////////////////////////
/// REANIMATE A COUNTRY ///
///////////////////////////
function reanimateCountry(uint256 _countryId) public onlyGameNOTPaused{
require(canPlayerReanimate(_countryId, msg.sender) == true);
address player = msg.sender;
eliminated[gameVersion][_countryId] = false;
newOwner[_countryId] = player;
howManyEliminated = howManyEliminated.sub(1);
howManyReactivated++;
emit Reactivation(_countryId, howManyReactivated);
emit PlayerEvent(2, _countryId, player, block.timestamp, howManyEliminated, gameVersion);
}
/////////////////////
/// BECOME A KING ///
/////////////////////
function becomeNewKing(uint256 _continentId) payable public onlyGameNOTPaused{
require(msg.value >= kingPrice);
require(canPlayTimestamp()); /// Impossible to play 2 hours after the jackpot
address player = msg.sender;
uint256 timestampNow = block.timestamp;
uint256 gameId = gameVersion;
uint256 thisBalance = address(this).balance;
uint256 priceToPay = kingPrice;
continentKing[_continentId] = player;
updateJackpotTimestamp(timestampNow);
if (continentFlips >= maxFlips){
kingPrice = priceToPay.mul(kKings).div(100);
continentFlips = 0;
emit NewKingPrice(kingPrice, kKings);
} else continentFlips++;
payCutsLight(priceToPay, thisBalance, timestampNow);
excessRefund(player, priceToPay, msg.value);
/// emit the event
emit NewKingContinent(player, _continentId, priceToPay);
emit PlayerEvent(3, _continentId, player, timestampNow, continentFlips, gameId);
}
//////////////////////////////
/// SEND LOVE TO A COUNTRY ///
//////////////////////////////
/// Everybody can love few times a day, and get extra loves if loved yesterday
function upLove(uint256 _countryId) public onlyGameNOTPaused{
require(canPlayerLove(msg.sender));
require(_countryId < allCountriesLength);
require(!isEliminated(_countryId)); /// We cannot love an eliminated country
require(block.timestamp.add(DSHORT) < jackpotTimestamp || block.timestamp > jackpotTimestamp.add(DSHORT));
address lover = msg.sender;
address countryOwner = getCountryOwner(_countryId);
uint256 gameId = gameVersion;
LoverStructure storage c = loversSTR[gameId][_countryId];
uint256 nukecount = howManyNuked;
/// Increase the number of loves for this lover for this country
c.loves[nukecount][lover]++;
uint256 playerLoves = c.loves[nukecount][lover];
uint256 maxLovesBest = c.maxLoves[nukecount];
/// Update the bestlover if this is the case
if (playerLoves > maxLovesBest){
c.maxLoves[nukecount]++;
/// Update the mostLovedCountry
if (_countryId != mostLovedCountry && playerLoves > loversSTR[gameId][mostLovedCountry].maxLoves[nukecount]){
mostLovedCountry = _countryId;
emit newMostLovedCountry(_countryId, playerLoves);
}
/// If the best lover is a new bets lover, update
if (c.bestLover != lover){
c.bestLover = lover;
/// Send a free love to the king of this continent if he is not the best lover and remaining loves lesser than 16
address ourKing = continentKing[countryToContinent[_countryId]];
if (ourKing != lover && remainingLoves[ourKing] < 16){
remainingLoves[ourKing]++;
}
}
emit NewBestLover(lover, _countryId, playerLoves);
}
/// Update the ownership if this is the case
if (newOwner[_countryId] != countryOwner){
newOwner[_countryId] = countryOwner;
emit ThereIsANewOwner(countryOwner, _countryId);
}
/// Update the number of loves for today
updateLovesForToday(lover, block.timestamp);
/// Emit the event
emit NewLove(lover, _countryId, playerLoves, gameId, nukecount);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////
/// UPDATE FUNCTIONS ///
////////////////////////
/// Get the price of all countries before the start of the game
function storePriceOfAllCountries(uint256 _limitDown, uint256 _limitUp) public onlyOwner {
require (_limitDown < _limitUp);
require (_limitUp <= allCountriesLength);
uint256 getPrice;
address getTheOwner;
for (uint256 i = _limitDown; i < _limitUp; i++) {
getPrice = getPriceOfCountry(i);
getTheOwner = getCountryOwner(i);
lastKnownCountryPrice[i] = getPrice;
newOwner[i] = getTheOwner;
if (getPrice == 0 || getTheOwner ==0){
emit ErrorCountry(i);
}
}
}
/// Update cuts ///
/// Beware, cuts are PERTHOUSAND, not percent
function updateCuts(uint256 _newDevcut, uint256 _newPlayercut, uint256 _newSuperCountriesJackpotCut) public onlyOwner {
require(_newPlayercut.mul(3).add(_newDevcut).add(_newSuperCountriesJackpotCut) <= 700);
require(_newDevcut > 100);
devCut = _newDevcut;
playerCut = _newPlayercut;
potCutSuperCountries = _newSuperCountriesJackpotCut;
emit CutsUpdated(_newDevcut, _newPlayercut, _newSuperCountriesJackpotCut, block.timestamp);
}
/// Change nuke and kings prices and other price parameters
function updatePrices(
uint256 _newStartingPrice,
uint256 _newKingPrice,
uint256 _newKNext,
uint256 _newKCountry,
uint256 _newKLimit,
uint256 _newkKings,
uint256 _newMaxFlips
)
public
onlyOwner
{
startingPrice = _newStartingPrice;
kingPrice = _newKingPrice;
kNext = _newKNext;
kCountry = _newKCountry;
kCountryLimit = _newKLimit;
kKings = _newkKings;
maxFlips = _newMaxFlips;
emit ConstantsUpdated(_newStartingPrice, _newKingPrice, _newKNext, _newKCountry, _newKLimit, _newkKings, _newMaxFlips);
}
/// Change various parameters
function updateValue(uint256 _code, uint256 _newValue) public onlyOwner {
if (_code == 1 ){
continentKing.length = _newValue;
}
else if (_code == 2 ){
allCountriesLength = _newValue;
}
else if (_code == 3 ){
freeRemainingLovesPerDay = _newValue;
}
emit NewValue(_code, _newValue, block.timestamp);
}
/// Store countries into continents - multi countries for 1 continent function
function updateCountryToContinentMany(uint256[] _countryIds, uint256 _continentId) external onlyOwner {
for (uint256 i = 0; i < _countryIds.length; i++) {
updateCountryToContinent(_countryIds[i], _continentId);
}
}
/// Store countries into continents - 1 country for 1 continent function
function updateCountryToContinent(uint256 _countryId, uint256 _continentId) public onlyOwner {
require(_countryId < allCountriesLength);
require(_continentId < continentKing.length);
countryToContinent[_countryId] = _continentId;
emit NewCountryToContinent(_countryId, _continentId, block.timestamp);
}
/// If needed, update the external Trophy Cards contract address
function updateTCContract(address _newAddress) public onlyOwner() {
contractTrophyCards = _newAddress;
SCTrophy = SuperCountriesTrophyCardsExternal(_newAddress);
emit NewContractAddress(_newAddress);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////
/// WIN THE JACKPOT FUNCTIONS ///
/////////////////////////////////
function jackpotShareDispatch(
address _winner,
uint256 _share,
uint256 _customValue,
bytes32 _customText
)
internal
returns (uint256 shareDispatched_)
{
if (_winner == 0){
_winner = owner;
}
uint256 potDispatched = _share;
winnersJackpot[gameVersion][_winner] += _share;
emit JackpotDispatch(_winner, _share, _customValue, _customText);
return potDispatched;
}
/// Internal jackpot function for Country Owners ///
function jackpotCountryReward(uint256 _countryPot) internal returns (uint256 winningCountry_, uint256 dispatched_){
/// Is there a last standing country or not?
uint256 potDispatched;
if (howManyStandingOrNot(true) == 1){
/// There is only one country left: the winning country is the last standing country
/// And the owner of this country will not share the countryPot with other owners, all is for him!
uint256 winningCountryId = lastStanding();
address tempWinner = newOwner[winningCountryId];
potDispatched = jackpotShareDispatch(tempWinner, _countryPot, winningCountryId, "lastOwner");
}
else {
/// if else, there is more than one country standing,
/// we will reward the standing countries of the last nuked country continent
winningCountryId = lastNukedCountry;
uint256 continentId = countryToContinent[winningCountryId];
uint256[] memory standingNations = country_getAllStandingCountriesForContinent(continentId, true);
uint256 howManyCountries = standingNations.length;
/// If there is at least one standing country in this continent
if (howManyCountries > 0) {
uint256 winningCounter;
uint256 countryPotForOne = _countryPot.div(howManyCountries);
for (uint256 i = 0; i < howManyCountries && potDispatched <= _countryPot; i++) {
uint256 tempCountry = standingNations[i];
/// Get the current owner
tempWinner = newOwner[tempCountry];
potDispatched += jackpotShareDispatch(tempWinner, countryPotForOne, tempCountry, "anOwner");
winningCounter++;
if (winningCounter == howManyCountries || potDispatched.add(countryPotForOne) > _countryPot){
break;
}
}
}
/// There is no standing country in this continent, the owner of the last nuked country wins the jackpot (owner's share)
else {
tempWinner = newOwner[winningCountryId];
potDispatched = jackpotShareDispatch(tempWinner, _countryPot, winningCountryId, "lastNukedOwner");
}
}
return (winningCountryId, potDispatched);
}
/// PUBLIC JACKPOT FUNCTION TO CALL TO SHARE THE JACKPOT
/// After the jackpot, anyone can call the jackpotWIN function, it will dispatch prizes between winners
function jackpotWIN() public onlyGameNOTPaused {
require(block.timestamp > jackpotTimestamp); /// True if latestPayer + 7 days or Only one country standing
require(address(this).balance >= 1e11);
require(thisJackpotIsPlayedAndNotWon[gameVersion]); /// if true, we are currently playing this jackpot and it's not won yet
uint256 gameId = gameVersion;
/// Pause the game
gameRunning = false;
///////////////////////////////////////////////
////////// How much for the winners? //////////
///////////////////////////////////////////////
/// Calculate shares
(uint256 nukerPot, uint256 countryPot, uint256 continentPot, uint256 freePot, uint256 pot,) = calculateJackpot();
/// This jackpot is won, disable it
/// If false, this function will not be callable again
thisJackpotIsPlayedAndNotWon[gameId] = false;
////////////////////////////////////////////////////
////////// Which country won the jackpot? //////////
////////////////////////////////////////////////////
/// Dispatch shares between country owners and save the winning country ///
(uint256 winningCountryId, uint256 potDispatched) = jackpotCountryReward(countryPot);
winningCountry[gameId] = winningCountryId;
uint256 continentId = countryToContinent[winningCountryId];
////////////////////////////////////////////////
////////// Who are the other winners? //////////
////////////////////////////////////////////////
/// The king of the right continent
potDispatched += jackpotShareDispatch(continentKing[continentId], continentPot, continentId, "continent");
/// The best lover for this country
potDispatched += jackpotShareDispatch(loversSTR[gameId][winningCountryId].bestLover, freePot, 0, "free");
/// The last nuker
potDispatched += jackpotShareDispatch(nukerAddress[winningCountryId], nukerPot, 0, "nuker");
/// Emit the events ///
emit JackpotDispatchAll(gameId, winningCountryId, continentId, block.timestamp, jackpotTimestamp, pot, potDispatched, address(this).balance);
emit PausedOrUnpaused(block.timestamp, gameRunning);
/// Last check ///
assert(potDispatched <= address(this).balance);
}
/// After the sharing, all winners will be able to call this function to withdraw the won share to the their wallets
function withdrawWinners() public onlyRealAddress {
require(winnersJackpot[gameVersion][msg.sender] > 0);
address _winnerAddress = msg.sender;
uint256 gameId = gameVersion;
/// Prepare for the withdrawal
uint256 jackpotToTransfer = winnersJackpot[gameId][_winnerAddress];
winnersJackpot[gameId][_winnerAddress] = 0;
/// fire event
emit WithdrawJackpot(_winnerAddress, jackpotToTransfer, gameId);
/// Withdraw
_winnerAddress.transfer(jackpotToTransfer);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////
/// RESTART A NEW GAME ///
///////////////////////////////
/// After the jackpot, restart a new game with same settings ///
/// The owner can restart 2 hrs after the jackpot
/// If the owner doesn't restart the game 30 days after the jackpot, all players can restart the game
function restartNewGame() public onlyGamePaused{
require((msg.sender == owner && block.timestamp > jackpotTimestamp.add(DSHORT)) || block.timestamp > jackpotTimestamp.add(2629000));
uint256 timestampNow = block.timestamp;
/// Clear all values, loves, nextPrices... but bestlovers, lovers will remain
if (nextPrice[gameVersion] !=0){
gameVersion++;
lastNukedCountry = 0;
howManyNuked = 0;
howManyReactivated = 0;
howManyEliminated = 0;
lastNukerMin = 0;
countryOwnerMin = 0;
continentMin = 0;
freePlayerMin = 0;
withdrawMinOwner = 0;
kingPrice = 1e16;
newOwner.length = 0;
nukerAddress.length = 0;
newOwner.length = allCountriesLength;
nukerAddress.length = allCountriesLength;
}
/// Set new jackpot timestamp
updateJackpotTimestamp(timestampNow);
/// Restart
gameRunning = true;
thisJackpotIsPlayedAndNotWon[gameVersion] = true;
/// fire event
emit NewGameLaunched(gameVersion, timestampNow, msg.sender, jackpotTimestamp);
emit PausedOrUnpaused(block.timestamp, gameRunning);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////
/// USEFUL FUNCTIONS ///
////////////////////////
/**
* @dev Fallback function to accept all ether sent directly to the contract
* Nothing is lost, it will raise the jackpot!
*/
function() payable public { }
/// After the jackpot, the owner can restart a new game or withdraw if winners don't want their part
function withdraw() public onlyOwner {
require(block.timestamp > jackpotTimestamp.add(DSHORT) || address(this).balance <= 1e11 || whatDevCanWithdraw() > 0);
uint256 thisBalance = address(this).balance;
if (block.timestamp > jackpotTimestamp.add(DSHORT) || thisBalance <= 1e11 ){
uint256 toWithdraw = thisBalance;
}
else {
toWithdraw = whatDevCanWithdraw();
withdrawMinOwner += toWithdraw;
}
emit WithdrawByDev(block.timestamp, toWithdraw, withdrawMinOwner, thisBalance);
owner.transfer(toWithdraw);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////
/// LAST STANDING FUNCTIONS ///
///////////////////////////////
function trueStandingFalseEliminated(bool _standing) public view returns (uint256[] countries_) {
uint256 howLong = howManyStandingOrNot(_standing);
uint256[] memory countries = new uint256[](howLong);
uint256 standingCounter = 0;
uint256 gameId = gameVersion;
for (uint256 i = 0; i < allCountriesLength; i++) {
if (eliminated[gameId][i] != _standing){
countries[standingCounter] = i;
standingCounter++;
}
if (standingCounter == howLong){break;}
}
return countries;
}
function howManyStandingOrNot(bool _standing) public view returns (uint256 howManyCountries_) {
uint256 standingCounter = 0;
uint256 gameId = gameVersion;
for (uint256 i = 0; i < allCountriesLength; i++) {
if (eliminated[gameId][i] != _standing){
standingCounter++;
}
}
return standingCounter;
}
function lastStanding() public view returns (uint256 lastStandingNation_) {
require (howManyStandingOrNot(true) == 1);
return trueStandingFalseEliminated(true)[0];
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[],"name":"player_getKingsAll","outputs":[{"name":"_kings","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"constant_getLength","outputs":[{"name":"kingsLength_","type":"uint256"},{"name":"newOwnerLength_","type":"uint256"},{"name":"nukerLength_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_countryId","type":"uint256"}],"name":"getCountryOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_countryId","type":"uint256"}],"name":"nuke","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_continentId","type":"uint256"},{"name":"_standing","type":"bool"}],"name":"country_countStandingCountriesForContinent","outputs":[{"name":"howManyCountries_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_limitDown","type":"uint256"},{"name":"_limitUp","type":"uint256"}],"name":"storePriceOfAllCountries","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"constant_getPriZZZesMini","outputs":[{"name":"lastNukeMini_","type":"uint256"},{"name":"countryOwnMini_","type":"uint256"},{"name":"contintMini_","type":"uint256"},{"name":"freePlayerMini_","type":"uint256"},{"name":"withdrMinOwner_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawWinners","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_countryId","type":"uint256"}],"name":"war_getNextNukePriceForCountry","outputs":[{"name":"priceOfThisCountry_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"restartNewGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_countryId","type":"uint256"},{"name":"_player","type":"address"},{"name":"_gameId","type":"uint256"},{"name":"_oldHowManyNuked","type":"uint256"}],"name":"loves_getOldLoves","outputs":[{"name":"loves_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNextTrophyCardOwner","outputs":[{"name":"nextTrophyCardOwner_","type":"address"},{"name":"nextTrophyCardIndex_","type":"uint256"},{"name":"nextTrophyCardId_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SLONG","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_countryIds","type":"uint256[]"},{"name":"_continentId","type":"uint256"}],"name":"updateCountryToContinentMany","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_standing","type":"bool"}],"name":"trueStandingFalseEliminated","outputs":[{"name":"countries_","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"calculateJackpot","outputs":[{"name":"nukerJackpot_","type":"uint256"},{"name":"countryJackpot_","type":"uint256"},{"name":"continentJackpot_","type":"uint256"},{"name":"freeJackpot_","type":"uint256"},{"name":"realJackpot_","type":"uint256"},{"name":"expectedJackpot_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getTrophyFromIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newStartingPrice","type":"uint256"},{"name":"_newKingPrice","type":"uint256"},{"name":"_newKNext","type":"uint256"},{"name":"_newKCountry","type":"uint256"},{"name":"_newKLimit","type":"uint256"},{"name":"_newkKings","type":"uint256"},{"name":"_newMaxFlips","type":"uint256"}],"name":"updatePrices","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_countryId","type":"uint256"}],"name":"upLove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newDevcut","type":"uint256"},{"name":"_newPlayercut","type":"uint256"},{"name":"_newSuperCountriesJackpotCut","type":"uint256"}],"name":"updateCuts","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_player","type":"address"}],"name":"player_getNukedCountries","outputs":[{"name":"myNukedCountriesIds_","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_player","type":"address"},{"name":"_gameId","type":"uint256"}],"name":"player_getPlayerJackpot","outputs":[{"name":"playerNowPot_","type":"uint256"},{"name":"playerOldPot_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"canPlayTimestamp","outputs":[{"name":"ok_","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_code","type":"uint256"},{"name":"_newValue","type":"uint256"}],"name":"updateValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastStanding","outputs":[{"name":"lastStandingNation_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"country_getCountriesGeneralInfo","outputs":[{"name":"lastNuked_","type":"uint256"},{"name":"lastNukerAddress_","type":"address"},{"name":"allCountriesLength_","type":"uint256"},{"name":"howManyEliminated_","type":"uint256"},{"name":"howManyNuked_","type":"uint256"},{"name":"howManyReactivated_","type":"uint256"},{"name":"mostLovedNation_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"updateTCContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_player","type":"address"}],"name":"player_howManyNuked","outputs":[{"name":"nukeCount_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_countryId","type":"uint256"}],"name":"country_getInfoForCountry","outputs":[{"name":"eliminatedBool_","type":"bool"},{"name":"whichContinent_","type":"uint256"},{"name":"currentBestLover_","type":"address"},{"name":"maxLovesForTheBest_","type":"uint256"},{"name":"countryOwner_","type":"address"},{"name":"lastKnownPrice_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTrophyCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"whatDevCanWithdraw","outputs":[{"name":"toWithdrawByDev_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_countryId","type":"uint256"}],"name":"player_getNuker","outputs":[{"name":"nuker_","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_countryId","type":"uint256"}],"name":"isEliminated","outputs":[{"name":"isEliminated_","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"constant_getGameVersion","outputs":[{"name":"currentGameVersion_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"war_getNextNukePriceRaw","outputs":[{"name":"price_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"constant_getSomeDetails","outputs":[{"name":"gameRunng_","type":"bool"},{"name":"currentContractBalance_","type":"uint256"},{"name":"jackptTimstmp_","type":"uint256"},{"name":"maxFlip_","type":"uint256"},{"name":"continentFlip_","type":"uint256"},{"name":"jackpotNotWonYet_","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_standing","type":"bool"}],"name":"howManyStandingOrNot","outputs":[{"name":"howManyCountries_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DSHORT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_countryId","type":"uint256"},{"name":"_player","type":"address"}],"name":"canPlayerReanimate","outputs":[{"name":"canReanimate_","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_countryId","type":"uint256"},{"name":"_gameId","type":"uint256"},{"name":"_howManyNuked","type":"uint256"}],"name":"loves_getOldNukesMaxLoves","outputs":[{"name":"oldMaxLovesForTheBest2_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"constant_getCuts","outputs":[{"name":"playerCut_","type":"uint256"},{"name":"potCutSC","type":"uint256"},{"name":"developerCut_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_player","type":"address"}],"name":"canPlayerLove","outputs":[{"name":"playerCanLove_","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_continentId","type":"uint256"}],"name":"player_getKingOne","outputs":[{"name":"king_","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_continentId","type":"uint256"}],"name":"becomeNewKing","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"constant_getPriZZZes","outputs":[{"name":"lastNukeShare_","type":"uint256"},{"name":"countryOwnShare_","type":"uint256"},{"name":"contintShare_","type":"uint256"},{"name":"freePlayerShare_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"constant_getPrices","outputs":[{"name":"nextPrice_","type":"uint256"},{"name":"startingPrice_","type":"uint256"},{"name":"kingPrice_","type":"uint256"},{"name":"kNext_","type":"uint256"},{"name":"kCountry_","type":"uint256"},{"name":"kCountryLimit_","type":"uint256"},{"name":"kKings_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_countryId","type":"uint256"},{"name":"_player","type":"address"}],"name":"loves_getLoves","outputs":[{"name":"loves_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_countryId","type":"uint256"}],"name":"reanimateCountry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_continentId","type":"uint256"}],"name":"country_getAllCountriesForContinent","outputs":[{"name":"countries_","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"constant_getContracts","outputs":[{"name":"SuperCountries_","type":"address"},{"name":"TrophyCards_","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_continentId","type":"uint256"}],"name":"country_countCountriesForContinent","outputs":[{"name":"howManyCountries_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"jackpotWIN","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_countryId","type":"uint256"},{"name":"_continentId","type":"uint256"}],"name":"updateCountryToContinent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_countryId","type":"uint256"}],"name":"getPriceOfCountry","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_gameId","type":"uint256"}],"name":"constant_getOldDetails","outputs":[{"name":"oldWinningCountry_","type":"uint256"},{"name":"oldJackpotBool_","type":"bool"},{"name":"oldNextPrice_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DLONG","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_player","type":"address"}],"name":"loves_getPlayerInfo","outputs":[{"name":"playerFirstLove_","type":"uint256"},{"name":"playerRemainingLoves_","type":"uint256"},{"name":"realRemainingLoves_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_continentId","type":"uint256"},{"name":"_standing","type":"bool"}],"name":"country_getAllStandingCountriesForContinent","outputs":[{"name":"countries_","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_countryId","type":"uint256"},{"name":"_gameId","type":"uint256"}],"name":"country_getOldInfoForCountry","outputs":[{"name":"oldEliminatedBool_","type":"bool"},{"name":"oldMaxLovesForTheBest_","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":"blockTimestamp_","type":"uint256"},{"indexed":true,"name":"gameRunning_","type":"bool"}],"name":"PausedOrUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"gameVersion_","type":"uint256"},{"indexed":true,"name":"blockTimestamp_","type":"uint256"},{"indexed":true,"name":"msgSender_","type":"address"},{"indexed":false,"name":"jackpotTimestamp_","type":"uint256"}],"name":"NewGameLaunched","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"countryId_","type":"uint256"}],"name":"ErrorCountry","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newDevcut_","type":"uint256"},{"indexed":false,"name":"newPlayercut_","type":"uint256"},{"indexed":false,"name":"newJackpotCountriescut_","type":"uint256"},{"indexed":true,"name":"blockTimestamp_","type":"uint256"}],"name":"CutsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newStartPrice_","type":"uint256"},{"indexed":true,"name":"newkKingPrice_","type":"uint256"},{"indexed":false,"name":"newKNext_","type":"uint256"},{"indexed":false,"name":"newKCountry_","type":"uint256"},{"indexed":false,"name":"newKLimit_","type":"uint256"},{"indexed":false,"name":"newkKings","type":"uint256"},{"indexed":false,"name":"newMaxFlips","type":"uint256"}],"name":"ConstantsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newAddress_","type":"address"}],"name":"NewContractAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"code_","type":"uint256"},{"indexed":true,"name":"newValue_","type":"uint256"},{"indexed":true,"name":"blockTimestamp_","type":"uint256"}],"name":"NewValue","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"countryId_","type":"uint256"},{"indexed":true,"name":"continentId_","type":"uint256"},{"indexed":true,"name":"blockTimestamp_","type":"uint256"}],"name":"NewCountryToContinent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"eventCode_","type":"uint256"},{"indexed":true,"name":"countryId_","type":"uint256"},{"indexed":true,"name":"player_","type":"address"},{"indexed":false,"name":"timestampNow_","type":"uint256"},{"indexed":false,"name":"customValue_","type":"uint256"},{"indexed":false,"name":"gameId_","type":"uint256"}],"name":"PlayerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"player_","type":"address"},{"indexed":true,"name":"lastNukedCountry_","type":"uint256"},{"indexed":false,"name":"priceToPay_","type":"uint256"},{"indexed":false,"name":"priceRaw_","type":"uint256"}],"name":"Nuked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"countryId_","type":"uint256"},{"indexed":true,"name":"howManyReactivated_","type":"uint256"}],"name":"Reactivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"player_","type":"address"},{"indexed":true,"name":"continentId_","type":"uint256"},{"indexed":false,"name":"priceToPay_","type":"uint256"}],"name":"NewKingContinent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"countryId_","type":"uint256"},{"indexed":true,"name":"maxLovesBest_","type":"uint256"}],"name":"newMostLovedCountry","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lover_","type":"address"},{"indexed":true,"name":"countryId_","type":"uint256"},{"indexed":false,"name":"maxLovesBest_","type":"uint256"}],"name":"NewBestLover","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lover_","type":"address"},{"indexed":true,"name":"countryId_","type":"uint256"},{"indexed":false,"name":"playerLoves_","type":"uint256"},{"indexed":true,"name":"gameId_","type":"uint256"},{"indexed":false,"name":"nukeCount_","type":"uint256"}],"name":"NewLove","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"countryId_","type":"uint256"},{"indexed":true,"name":"player_","type":"address"},{"indexed":false,"name":"contractBalance_","type":"uint256"},{"indexed":true,"name":"gameId_","type":"uint256"},{"indexed":false,"name":"jackpotTimestamp","type":"uint256"}],"name":"LastCountryStanding","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newOwner_","type":"address"},{"indexed":true,"name":"countryId_","type":"uint256"}],"name":"ThereIsANewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"blockTimestamp_","type":"uint256"},{"indexed":true,"name":"countryId_","type":"uint256"},{"indexed":false,"name":"countryOwner_","type":"address"},{"indexed":false,"name":"trophyCardOwner_","type":"address"},{"indexed":false,"name":"bestLover_","type":"address"}],"name":"CutsPaidInfos","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"blockTimestamp_","type":"uint256"},{"indexed":true,"name":"paidPrice_","type":"uint256"},{"indexed":false,"name":"thisBalance_","type":"uint256"},{"indexed":false,"name":"devCut_","type":"uint256"},{"indexed":false,"name":"playerCut_","type":"uint256"},{"indexed":true,"name":"SuperCountriesCut_","type":"uint256"}],"name":"CutsPaidValue","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"blockTimestamp_","type":"uint256"},{"indexed":true,"name":"paidPrice_","type":"uint256"},{"indexed":false,"name":"thisBalance_","type":"uint256"},{"indexed":false,"name":"devCut_","type":"uint256"},{"indexed":false,"name":"playerCut_","type":"uint256"},{"indexed":false,"name":"trophyCardOwner_","type":"address"},{"indexed":true,"name":"SuperCountriesCut_","type":"uint256"}],"name":"CutsPaidLight","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"kingPrice_","type":"uint256"},{"indexed":true,"name":"kKings_","type":"uint256"}],"name":"NewKingPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"jackpotTimestamp_","type":"uint256"},{"indexed":true,"name":"timestamp_","type":"uint256"}],"name":"NewJackpotTimestamp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"blockTimestamp_","type":"uint256"},{"indexed":true,"name":"withdrawn_","type":"uint256"},{"indexed":true,"name":"withdrawMinOwner_","type":"uint256"},{"indexed":false,"name":"jackpot_","type":"uint256"}],"name":"WithdrawByDev","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"winnerAddress_","type":"address"},{"indexed":true,"name":"jackpotToTransfer_","type":"uint256"},{"indexed":true,"name":"gameVersion_","type":"uint256"}],"name":"WithdrawJackpot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"winner","type":"address"},{"indexed":true,"name":"jackpotShare_","type":"uint256"},{"indexed":false,"name":"customValue_","type":"uint256"},{"indexed":true,"name":"customText_","type":"bytes32"}],"name":"JackpotDispatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"gameVersion_","type":"uint256"},{"indexed":true,"name":"winningCountry_","type":"uint256"},{"indexed":true,"name":"continentId_","type":"uint256"},{"indexed":false,"name":"timestampNow_","type":"uint256"},{"indexed":false,"name":"jackpotTimestamp_","type":"uint256"},{"indexed":false,"name":"pot_","type":"uint256"},{"indexed":false,"name":"potDispatched_","type":"uint256"},{"indexed":false,"name":"thisBalance","type":"uint256"}],"name":"JackpotDispatchAll","type":"event"}]Contract Creation Code
608060405273df203118a954c918b967a94e51f3570a2faba4ac600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073eaf763328604e6e54159aba7bf1394f2fbcc016e600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600555662386f26fc10000600a55661ff973cafa8000600c556004600d556706f05b59d3b20000600e5561040d600f556010805560656012556002601955610118601a556014601b5560b9601c55611388601d55611130601e556101c2601f5560966020556729a2241af62c00006021556729a2241af62c0000602255670de0b6b3a7640000602355670de0b6b3a7640000602455610100602755620151806030556202a3006031556138406032553480156200023257600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506010601381620002849190620002b1565b50610100602e81620002979190620002b1565b50610100601481620002aa9190620002b1565b5062000308565b815481835581811115620002db57818360005260206000209182019101620002da9190620002e0565b5b505050565b6200030591905b8082111562000301576000816000905550600101620002e7565b5090565b90565b615fb080620003186000396000f3006080604052600436106102d5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806307b86793146102d75780630a099606146103435780630ad125de1461037c5780630d95508d146103e95780630f6bd9b2146104095780631033910e14610456578063192687891461048d5780631f1f59b7146104d457806322ae1a13146104eb578063240c06da1461052c578063250ce943146105435780632f5e2090146105b85780632f81fa7a1461061d578063363d30461461064857806337737ff81461068d5780633ccfd60b146107115780633e199f15146107285780633e7689e6146107765780633f4e2597146107b75780634109d1c41461082057806346a8f78f1461084d5780634c8781c51461088e5780634e7eaf121461092657806355cb1c581461098e5780635b500826146109bd5780635bd39e72146109f45780636033478a14610a1f57806360db225814610aa05780636183785f14610ae35780636626abc914610b3a57806366dc561814610bfa5780636748355e14610c255780636808ef2414610c50578063751f489114610cbd5780638414ba6014610d0257806387a433bd14610d2d5780638da5cb5b14610d585780638e8f4c6d14610daf57806392372e9d14610e0557806396b1759114610e485780639c508f4614610e735780639de6adc114610ed8578063a05bb77414610f2d578063a87cac2514610f66578063a969337e14610fc1578063aef65ca41461102e578063b0641cbb1461104e578063bec0723f1461108e578063c07f589d146110e3578063c9a2d64514611144578063d429b6d914611171578063d4ee7097146111f3578063d54702091461127d578063d732be6c146112be578063d9f6f5ce146112d5578063de4b385c1461130c578063e2a2deea1461134d578063e46d5ba6146113a0578063eb996fab146113cb578063f346a44214611430578063fe760a61146114be575b005b3480156102e357600080fd5b506102ec611514565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561032f578082015181840152602081019050610314565b505050509050019250505060405180910390f35b34801561034f57600080fd5b5061035861160b565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561038857600080fd5b506103a76004803603810190808035906020019092919050505061162d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61040760048036038101908080359060200190929190505050611702565b005b34801561041557600080fd5b5061044060048036038101908080359060200190929190803515159060200190929190505050611b4a565b6040518082815260200191505060405180910390f35b34801561046257600080fd5b5061048b6004803603810190808035906020019092919080359060200190929190505050611be6565b005b34801561049957600080fd5b506104a2611d63565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b3480156104e057600080fd5b506104e9611d8b565b005b3480156104f757600080fd5b5061051660048036038101908080359060200190929190505050611f6e565b6040518082815260200191505060405180910390f35b34801561053857600080fd5b50610541612002565b005b34801561054f57600080fd5b506105a260048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612277565b6040518082815260200191505060405180910390f35b3480156105c457600080fd5b506105cd6122f9565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b34801561062957600080fd5b50610632612342565b6040518082815260200191505060405180910390f35b34801561065457600080fd5b5061068b60048036038101908080359060200190820180359060200191909192939192939080359060200190929190505050612348565b005b34801561069957600080fd5b506106ba6004803603810190808035151590602001909291905050506123e6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106fd5780820151818401526020810190506106e2565b505050509050019250505060405180910390f35b34801561071d57600080fd5b506107266124d1565b005b34801561073457600080fd5b5061073d61269f565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b34801561078257600080fd5b506107a1600480360381019080803590602001909291905050506128c2565b6040518082815260200191505060405180910390f35b3480156107c357600080fd5b5061081e60048036038101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612997565b005b34801561082c57600080fd5b5061084b60048036038101908080359060200190929190505050612a85565b005b34801561085957600080fd5b5061088c600480360381019080803590602001909291908035906020019092919080359060200190929190505050613074565b005b34801561089a57600080fd5b506108cf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613181565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109125780820151818401526020810190506108f7565b505050509050019250505060405180910390f35b34801561093257600080fd5b50610971600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613293565b604051808381526020018281526020019250505060405180910390f35b34801561099a57600080fd5b506109a3613345565b604051808215151515815260200191505060405180910390f35b3480156109c957600080fd5b506109f26004803603810190808035906020019092919080359060200190929190505050613387565b005b348015610a0057600080fd5b50610a0961345a565b6040518082815260200191505060405180910390f35b348015610a2b57600080fd5b50610a3461349b565b604051808881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b348015610aac57600080fd5b50610ae1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061350b565b005b348015610aef57600080fd5b50610b24600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061362e565b6040518082815260200191505060405180910390f35b348015610b4657600080fd5b50610b65600480360381019080803590602001909291905050506136d5565b60405180871515151581526020018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001965050505050505060405180910390f35b348015610c0657600080fd5b50610c0f61384d565b6040518082815260200191505060405180910390f35b348015610c3157600080fd5b50610c3a613915565b6040518082815260200191505060405180910390f35b348015610c5c57600080fd5b50610c7b600480360381019080803590602001909291905050506139eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cc957600080fd5b50610ce860048036038101908080359060200190929190505050613a2e565b604051808215151515815260200191505060405180910390f35b348015610d0e57600080fd5b50610d17613a6b565b6040518082815260200191505060405180910390f35b348015610d3957600080fd5b50610d42613a75565b6040518082815260200191505060405180910390f35b348015610d6457600080fd5b50610d6d613ac1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610dbb57600080fd5b50610dc4613ae6565b604051808715151515815260200186815260200185815260200184815260200183815260200182151515158152602001965050505050505060405180910390f35b348015610e1157600080fd5b50610e32600480360381019080803515159060200190929190505050613b57565b6040518082815260200191505060405180910390f35b348015610e5457600080fd5b50610e5d613bd4565b6040518082815260200191505060405180910390f35b348015610e7f57600080fd5b50610ebe60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bda565b604051808215151515815260200191505060405180910390f35b348015610ee457600080fd5b50610f17600480360381019080803590602001909291908035906020019092919080359060200190929190505050613d34565b6040518082815260200191505060405180910390f35b348015610f3957600080fd5b50610f42613d78565b60405180848152602001838152602001828152602001935050505060405180910390f35b348015610f7257600080fd5b50610fa7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613d91565b604051808215151515815260200191505060405180910390f35b348015610fcd57600080fd5b50610fec60048036038101908080359060200190929190505050613e51565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61104c60048036038101908080359060200190929190505050613e94565b005b34801561105a57600080fd5b506110636140ca565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b34801561109a57600080fd5b506110a36140ea565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b3480156110ef57600080fd5b5061112e60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614134565b6040518082815260200191505060405180910390f35b34801561115057600080fd5b5061116f600480360381019080803590602001909291905050506141bd565b005b34801561117d57600080fd5b5061119c6004803603810190808035906020019092919050505061435e565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156111df5780820151818401526020810190506111c4565b505050509050019250505060405180910390f35b3480156111ff57600080fd5b5061120861441e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b34801561128957600080fd5b506112a86004803603810190808035906020019092919050505061446f565b6040518082815260200191505060405180910390f35b3480156112ca57600080fd5b506112d36144c1565b005b3480156112e157600080fd5b5061130a600480360381019080803590602001909291908035906020019092919050505061481f565b005b34801561131857600080fd5b50611337600480360381019080803590602001909291905050506148e8565b6040518082815260200191505060405180910390f35b34801561135957600080fd5b50611378600480360381019080803590602001909291905050506149bd565b6040518084815260200183151515158152602001828152602001935050505060405180910390f35b3480156113ac57600080fd5b506113b5614a18565b6040518082815260200191505060405180910390f35b3480156113d757600080fd5b5061140c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614a1e565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561143c57600080fd5b5061146760048036038101908080359060200190929190803515159060200190929190505050614c0e565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156114aa57808201518184015260208101905061148f565b505050509050019250505060405180910390f35b3480156114ca57600080fd5b506114f36004803603810190808035906020019092919080359060200190929190505050614d19565b60405180831515151581526020018281526020019250505060405180910390f35b6060600060606000806013805490509350836040519080825280602002602001820160405280156115545781602001602082028038833980820191505090505b50925060009150600090505b838110156116015760138181548110151561157757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015156115b057fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081806001019250508080600101915050611560565b8294505050505090565b6000806000601380549050602e80549050601480549050925092509250909192565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1580156116c057600080fd5b505af11580156116d4573d6000803e3d6000fd5b505050506040513d60208110156116ea57600080fd5b81019080805190602001909291905050509050919050565b600080600080600080600060011515600460149054906101000a900460ff16151514151561172f57600080fd5b6027548810151561173f57600080fd5b61174888611f6e565b341015151561175657600080fd5b600061176189611f6e565b11151561176d57600080fd5b6000151561177a89613a2e565b151514151561178857600080fd5b611790613345565b151561179b57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1660156000600554815260200190815260200160002060008a815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561181f57600080fd5b6016548814158061184657506005611844602954602754614d9a90919063ffffffff16565b105b151561185157600080fd5b33965042955060055494503073ffffffffffffffffffffffffffffffffffffffff1631935061187f88611f6e565b92508660148981548110151561189157fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602d60008981526020019081526020016000205491506118f8886148e8565b602d60008a81526020019081526020016000208190555060016028600087815260200190815260200160002060008a815260200190815260200160002060006101000a81548160ff0219169083151502179055506029600081548092919060010191905055506027546119776001602954614db390919063ffffffff16565b14156119e35742600681905550848773ffffffffffffffffffffffffffffffffffffffff16897f3486832d53b74dbbd4d34dafef80a0962ff195ec58fcdd20347a58afa8c1432587600654604051808381526020018281526020019250505060405180910390a4611a37565b6119eb613a75565b9050611a166103e8611a08600f5484614dd190919063ffffffff16565b614e0c90919063ffffffff16565b600b600087815260200190815260200160002081905550611a3686614e27565b5b87602c81905550611a4a83858a89614e76565b611a558784346153d4565b602a60008154809291906001019190505550878773ffffffffffffffffffffffffffffffffffffffff167f53e4c84cbbd880ccd53f5f64e9eb4882e8062c9b8198f8d829c235fa228c08868584604051808381526020018281526020019250505060405180910390a38673ffffffffffffffffffffffffffffffffffffffff168860017f38b92e33abe0fac579118740c3fc5c104cdceb9c7f7976c489bc1149880277d2896029548a60405180848152602001838152602001828152602001935050505060405180910390a481602d60008a81526020019081526020016000205410151515611b4057fe5b5050505050505050565b600080600080600092506005549150600090505b602754811015611bda5785602f600083815260200190815260200160002054148015611bbf575084151560286000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16151514155b15611bcd5782806001019350505b8080600101915050611b5e565b82935050505092915050565b60008060003373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611c4657600080fd5b8385101515611c5457600080fd5b6027548411151515611c6557600080fd5b8490505b83811015611d5c57611c7a816148e8565b9250611c858161162d565b915082602d60008381526020019081526020016000208190555081602e82815481101515611caf57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000831480611d1c575060008273ffffffffffffffffffffffffffffffffffffffff16145b15611d4f57807f857f57125da7470f5fe5d3b1a47a8a86bd29e99df62d0888bc97e33411756ca060405160405180910390a25b8080600101915050611c69565b5050505050565b6000806000806000602154602254602354602454602554945094509450945094509091929394565b60008060008073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515611dcb57600080fd5b600060086000600554815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111515611e2c57600080fd5b33925060055491506008600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006008600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081818473ffffffffffffffffffffffffffffffffffffffff167fb17deb1436986ea5c7646c09b9e0895fb0bb278a822745fcd513a08a43ed6b1b60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611f68573d6000803e3d6000fd5b50505050565b600080600080611f7c613a75565b9250611fb96064611fab600d54602d60008a815260200190815260200160002054614dd190919063ffffffff16565b614e0c90919063ffffffff16565b9150600e54821115611fe157611fda600e5484614db390919063ffffffff16565b9050611ff7565b611ff48284614db390919063ffffffff16565b90505b809350505050919050565b6000801515600460149054906101000a900460ff16151514151561202557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480156120965750612093603254600654614db390919063ffffffff16565b42115b806120b757506120b462281d88600654614db390919063ffffffff16565b42115b15156120c257600080fd5b4290506000600b600060055481526020019081526020016000205414151561218f576005600081548092919060010191905055506000602c819055506000602a819055506000602b81905550600060298190555060006021819055506000602281905550600060238190555060006024819055506000602581905550662386f26fc10000600c819055506000602e8161215b9190615f33565b50600060148161216b9190615f33565b50602754602e8161217c9190615f33565b5060275460148161218d9190615f33565b505b61219881614e27565b6001600460146101000a81548160ff021916908315150217905550600160076000600554815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16816005547f31cf8b881fab26e052efcde5603a90b262ee4e69640a44bb1b890b349166ff8f6006546040518082815260200191505060405180910390a4600460149054906101000a900460ff161515427f3f48654986365594e0cf33207b515e17f54536bda4f2358203fbae2e412e49b760405160405180910390a350565b6000601560008481526020019081526020016000206000868152602001908152602001600020600001600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050949350505050565b60008060008060008061230a61384d565b925082602654101561232f576123216026546128c2565b905061232c8161162d565b91505b8160265482955095509550505050909192565b60305481565b60003373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156123a557600080fd5b600090505b838390508110156123e0576123d384848381811015156123c657fe5b905060200201358361481f565b80806001019150506123aa565b50505050565b60606000606060008060006123fa87613b57565b94508460405190808252806020026020018201604052801561242b5781602001602082028038833980820191505090505b509350600092506005549150600090505b6027548110156124c45786151560286000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff1615151415156124aa5780848481518110151561249357fe5b906020019060200201818152505082806001019350505b848314156124b7576124c4565b808060010191505061243c565b8395505050505050919050565b6000803373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561252f57600080fd5b612546603254600654614db390919063ffffffff16565b42118061256f575064174876e8003073ffffffffffffffffffffffffffffffffffffffff163111155b806125815750600061257f613915565b115b151561258c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff163191506125bd603254600654614db390919063ffffffff16565b4211806125cf575064174876e8008211155b156125dc578190506125f7565b6125e4613915565b9050806025600082825401925050819055505b60255481427f033ca17165c0bc6454fcdd79d2feb3e2d7be80e1e33d80739c3985f6b102847f856040518082815260200191505060405180910390a46000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561269a573d6000803e3d6000fd5b505050565b6000806000806000806000806000806000806000806001151560076000600554815260200190815260200160002060009054906101000a900460ff1615151415156127015760009750600096506000955060009450600093506000925061288c565b612740602454612732602354612724602254602154614db390919063ffffffff16565b614db390919063ffffffff16565b614db390919063ffffffff16565b9150612794612710612786846127786025543073ffffffffffffffffffffffffffffffffffffffff1631614db390919063ffffffff16565b614d9a90919063ffffffff16565b614e0c90919063ffffffff16565b92506127ab601d5484614dd190919063ffffffff16565b90506021548111156127bf578097506127c5565b60215497505b6127da601e5484614dd190919063ffffffff16565b90506022548111156127ee578096506127f4565b60225496505b612809601f5484614dd190919063ffffffff16565b905060235481111561281d57809550612823565b60235495505b61283860205484614dd190919063ffffffff16565b905060245481111561284c57809450612852565b60245494505b6128898561287b8861286d8b8d614db390919063ffffffff16565b614db390919063ffffffff16565b614db390919063ffffffff16565b93505b87878787876128a661271089614dd190919063ffffffff16565b9d509d509d509d509d509d505050505050505050909192939495565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634ca383a6836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561295557600080fd5b505af1158015612969573d6000803e3d6000fd5b505050506040513d602081101561297f57600080fd5b81019080805190602001909291905050509050919050565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156129f257600080fd5b86600a8190555085600c8190555084600f8190555083600d8190555082600e81905550816012819055508060108190555085877f46f10d2e5eff980419f4d35103088aef1aa5efd691b495c0bd7147b759129bf68787878787604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a350505050505050565b60008060008060008060008060011515600460149054906101000a900460ff161515141515612ab357600080fd5b612abc33613d91565b1515612ac757600080fd5b60275489101515612ad757600080fd5b612ae089613a2e565b151515612aec57600080fd5b600654612b0460325442614db390919063ffffffff16565b1080612b255750612b22603254600654614db390919063ffffffff16565b42115b1515612b3057600080fd5b339750612b3c8961162d565b965060055495506015600087815260200190815260200160002060008a81526020019081526020016000209450602a54935084600001600085815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050555084600001600085815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054925084600101600085815260200190815260200160002054915081831115612efc57846001016000858152602001908152602001600020600081548092919060010191905055506016548914158015612cb55750601560008781526020019081526020016000206000601654815260200190815260200160002060010160008581526020019081526020016000205483115b15612cf0578860168190555082897f1518498cd4823b78728367d04a3c23213b5b749b05afcf1dda3ae0ff7a083ea960405160405180910390a35b8773ffffffffffffffffffffffffffffffffffffffff168560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612eac57878560020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506013602f60008b815260200190815260200160002054815481101515612dae57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612e5657506010601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b15612eab57601860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055505b5b888873ffffffffffffffffffffffffffffffffffffffff167f4848d0745980235b3dcebedef926aed65bb7595f3ee5c943cc1b25c99bd54b6c856040518082815260200191505060405180910390a35b8673ffffffffffffffffffffffffffffffffffffffff16602e8a815481101515612f2257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156130075786602e8a815481101515612f7a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550888773ffffffffffffffffffffffffffffffffffffffff167f75e9e2c539e6b1a2171d30152b7738bfa96bcb25ca4773fc666328785a0106d660405160405180910390a35b6130118842615442565b85898973ffffffffffffffffffffffffffffffffffffffff167f2076776e77635974502c71ea6c8d36d8df9ae6b0d47957f091e6b335d86ad9fa8688604051808381526020018281526020019250505060405180910390a4505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156130cf57600080fd5b6102bc61310a826130fc866130ee600388614dd190919063ffffffff16565b614db390919063ffffffff16565b614db390919063ffffffff16565b1115151561311757600080fd5b60648311151561312657600080fd5b82601a8190555081601b8190555080601c8190555042837f85caf2c87b15cee668c2907b605ad3ccedcc2c8bf49422b10cceec1e2e9a7c868484604051808381526020018281526020019250505060405180910390a3505050565b6060600060606000806131938661362e565b9350836040519080825280602002602001820160405280156131c45781602001602082028038833980820191505090505b50925060009150600090505b602754811015613287578573ffffffffffffffffffffffffffffffffffffffff1660148281548110151561320057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561326d5780838381518110151561325657fe5b906020019060200201818152505081806001019250505b8382141561327a57613287565b80806001019150506131d0565b82945050505050919050565b60008060086000600554815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546008600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915091509250929050565b600080600080429250600654915081831080613374575061337160325483614db390919063ffffffff16565b83115b1561337e57600190505b80935050505090565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156133e257600080fd5b60018214156133ff57806013816133f99190615f33565b50613427565b60028214156134145780602781905550613426565b600382141561342557806019819055505b5b5b4281837fba11e319aee26e7bbac889432515ba301ec8f6d27bf6b94829c21a65c5f6ff2560405160405180910390a45050565b600060016134686001613b57565b14151561347457600080fd5b61347e60016123e6565b600081518110151561348c57fe5b90602001906020020151905090565b6000806000806000806000602c546014602c548154811015156134ba57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16602754602954602a54602b54601654965096509650965096509650965090919293949596565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561356657600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f347df869dd398e5c7c4a228fdfcd621e29beffbb21d815233f9af7114bbea6c360405160405180910390a250565b6000806000809150600090505b6014805490508110156136cb578373ffffffffffffffffffffffffffffffffffffffff1660148281548110151561366e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156136be5781806001019250505b808060010191505061363b565b8192505050919050565b60008060008060008060008060156000600554815260200190815260200160002060008a8152602001908152602001600020915060286000600554815260200190815260200160002060008a815260200190815260200160002060009054906101000a900460ff161561375f576137586001602a54614d9a90919063ffffffff16565b9050613765565b602a5490505b60286000600554815260200190815260200160002060008a815260200190815260200160002060009054906101000a900460ff16602f60008b8152602001908152602001600020548360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600101600085815260200190815260200160002054602e8d8154811015156137f757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16602d60008f815260200190815260200160002054975097509750975097509750505091939550919395565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630ef19f626040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156138d557600080fd5b505af11580156138e9573d6000803e3d6000fd5b505050506040513d60208110156138ff57600080fd5b8101908080519060200190929190505050905090565b600080600080600080600061395f602454613951602354613943602254602154614db390919063ffffffff16565b614db390919063ffffffff16565b614db390919063ffffffff16565b95503073ffffffffffffffffffffffffffffffffffffffff1631945061398361269f565b5097505050505061399f60255487614d9a90919063ffffffff16565b92506139b48486614d9a90919063ffffffff16565b91506000831180156139c557508385115b156139df57828211156139da578290506139de565b8190505b5b80965050505050505090565b60006014828154811015156139fc57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000602860006005548152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600554905090565b6000806000600b6000600554815260200190815260200160002054141515613ab457600b60006005548152602001908152602001600020549050613aba565b600a5490505b8091505090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600460149054906101000a900460ff163073ffffffffffffffffffffffffffffffffffffffff163160065460105460115460076000600554815260200190815260200160002060009054906101000a900460ff16955095509550955095509550909192939495565b600080600080600092506005549150600090505b602754811015613bc95784151560286000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff161515141515613bbc5782806001019350505b8080600101915050613b6b565b829350505050919050565b60325481565b600080613be6846148e8565b602d600086815260200190815260200160002054108015613c13575060011515613c0f85613a2e565b1515145b8015613c215750602c548414155b8015613c625750600654613c4060305442614db390919063ffffffff16565b1080613c615750613c5e603254600654614db390919063ffffffff16565b42115b5b8015613c8457506008613c82602954602754614d9a90919063ffffffff16565b115b8015613cb95750602a54613cb76008613ca96001602b54614db390919063ffffffff16565b614dd190919063ffffffff16565b105b8015613cd857506000602d600086815260200190815260200160002054115b8015613d175750613ce88461162d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15613d255760019050613d2a565b600090505b8091505092915050565b600060156000848152602001908152602001600020600085815260200190815260200160002060010160008381526020019081526020016000205490509392505050565b6000806000601b54601c54601a54925092509250909192565b60008042613de9603054601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db390919063ffffffff16565b118015613e3557506000601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15613e435760009050613e48565b600190505b80915050919050565b6000601382815481101515613e6257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600080600060011515600460149054906101000a900460ff161515141515613ebe57600080fd5b600c543410151515613ecf57600080fd5b613ed7613345565b1515613ee257600080fd5b33945042935060055492503073ffffffffffffffffffffffffffffffffffffffff16319150600c54905084601387815481101515613f1c57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613f6d84614e27565b601054601154101515613fe757613fa26064613f9460125484614dd190919063ffffffff16565b614e0c90919063ffffffff16565b600c819055506000601181905550601254600c547f8cff3ec64108175daaeba709284b8628592a5981c57d5078effbfb50458e972160405160405180910390a3613ffa565b6011600081548092919060010191905055505b614005818386615754565b6140108582346153d4565b858573ffffffffffffffffffffffffffffffffffffffff167f9751b20f55856a6193a87509948a771cbeb4305d5126d0b01926421db1557e1c836040518082815260200191505060405180910390a38473ffffffffffffffffffffffffffffffffffffffff168660037f38b92e33abe0fac579118740c3fc5c104cdceb9c7f7976c489bc1149880277d2876011548860405180848152602001838152602001828152602001935050505060405180910390a4505050505050565b600080600080601d54601e54601f54602054935093509350935090919293565b6000806000806000806000600b6000600554815260200190815260200160002054600a54600c54600f54600d54600e54601254965096509650965096509650965090919293949596565b60008060156000600554815260200190815260200160002060008581526020019081526020016000209050806000016000602a54815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491505092915050565b600060011515600460149054906101000a900460ff1615151415156141e157600080fd5b600115156141ef8333613bda565b15151415156141fd57600080fd5b3390506000602860006005548152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff02191690831515021790555080602e8381548110151561424f57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506142ad6001602954614d9a90919063ffffffff16565b602981905550602b60008154809291906001019190505550602b54827fb74e387413529a3c4aae6fc97db66b4b21490f571864edbfa5e7ad931af1925c60405160405180910390a38073ffffffffffffffffffffffffffffffffffffffff168260027f38b92e33abe0fac579118740c3fc5c104cdceb9c7f7976c489bc1149880277d24260295460055460405180848152602001838152602001828152602001935050505060405180910390a45050565b6060600060606000806143708661446f565b9350836040519080825280602002602001820160405280156143a15781602001602082028038833980820191505090505b50925060009150600090505b6027548110156144125785602f60008381526020019081526020016000205414156143f8578083838151811015156143e157fe5b906020019060200201818152505081806001019250505b8382141561440557614412565b80806001019150506143ad565b82945050505050919050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b6000806000809150600090505b6027548110156144b75783602f60008381526020019081526020016000205414156144aa5781806001019250505b808060010191505061447c565b8192505050919050565b600080600080600080600080600060011515600460149054906101000a900460ff1615151415156144f157600080fd5b6006544211151561450157600080fd5b64174876e8003073ffffffffffffffffffffffffffffffffffffffff16311015151561452c57600080fd5b60076000600554815260200190815260200160002060009054906101000a900460ff16151561455a57600080fd5b60055498506000600460146101000a81548160ff02191690831515021790555061458261269f565b50975097509750975097506000600760008b815260200190815260200160002060006101000a81548160ff0219169083151502179055506145c287615b65565b9250925082600960008b815260200190815260200160002081905550602f600084815260200190815260200160002054905061465960138281548110151561460657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687837f636f6e74696e656e740000000000000000000000000000000000000000000000615db0565b820191506146d1601560008b8152602001908152602001600020600085815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660007f6672656500000000000000000000000000000000000000000000000000000000615db0565b8201915061473b6014848154811015156146e757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168960007f6e756b6572000000000000000000000000000000000000000000000000000000615db0565b8201915080838a7f49b2b7e626169d21a8df8d3ffc18870287c2841dcd8d6cca0d83f885e272f5ba4260065489883073ffffffffffffffffffffffffffffffffffffffff1631604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a4600460149054906101000a900460ff161515427f3f48654986365594e0cf33207b515e17f54536bda4f2358203fbae2e412e49b760405160405180910390a33073ffffffffffffffffffffffffffffffffffffffff1631821115151561481457fe5b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561487a57600080fd5b6027548210151561488a57600080fd5b6013805490508110151561489d57600080fd5b80602f6000848152602001908152602001600020819055504281837f15b63fecbefebbd0213710ce626dcc5257730a9d9c2eb78d726bab0be1eb688260405160405180910390a45050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b9186d7d836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561497b57600080fd5b505af115801561498f573d6000803e3d6000fd5b505050506040513d60208110156149a557600080fd5b81019080805190602001909291905050509050919050565b600080600060096000858152602001908152602001600020546007600086815260200190815260200160002060009054906101000a900460ff16600b6000878152602001908152602001600020549250925092509193909250565b60315481565b600080600080600080600080429450614a81603054601760008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db390919063ffffffff16565b9350614ad7603154601760008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db390919063ffffffff16565b9250601860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491508484118015614b2a5750600082115b15614b3757819050614bba565b8484108015614b4557508483115b15614b8e57614b876001614b79601954614b6b6004602954614e0c90919063ffffffff16565b614db390919063ffffffff16565b614db390919063ffffffff16565b9050614bb9565b84831015614bb357614bac6001601954614db390919063ffffffff16565b9050614bb8565b600090505b5b5b601760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054828297509750975050505050509193909250565b6060600060606000806000614c238888611b4a565b945084604051908082528060200260200182016040528015614c545781602001602082028038833980820191505090505b509350600092506005549150600090505b602754811015614d0b5787602f600083815260200190815260200160002054148015614cc6575086151560286000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16151514155b15614cf157808484815181101515614cda57fe5b906020019060200201818152505082806001019350505b84831415614cfe57614d0b565b8080600101915050614c65565b839550505050505092915050565b6000806000601560008581526020019081526020016000206000868152602001908152602001600020905060286000858152602001908152602001600020600086815260200190815260200160002060009054906101000a900460ff16816001016000602a5481526020019081526020016000205492509250509250929050565b6000828211151515614da857fe5b818303905092915050565b6000808284019050838110151515614dc757fe5b8091505092915050565b6000806000841415614de65760009150614e05565b8284029050828482811515614df757fe5b04141515614e0157fe5b8091505b5092915050565b6000808284811515614e1a57fe5b0490508091505092915050565b614e3d62093a8082614db390919063ffffffff16565b600681905550806006547f47a7f4458200a5e64e30731204e5b71ac28fb052cedccc0df77a197fae7639fd60405160405180910390a350565b600080600080600080888a11151515614e8e57600080fd5b60008a14151515614e9e57600080fd5b614ea6615eba565b955060008673ffffffffffffffffffffffffffffffffffffffff161415614eec576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1695505b602e88815481101515614efb57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16945060008573ffffffffffffffffffffffffffffffffffffffff161415614f6c576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694505b601560006005548152602001908152602001600020600089815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935060008473ffffffffffffffffffffffffffffffffffffffff161415614ffc576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693505b6150256103e8615017601a548d614dd190919063ffffffff16565b614e0c90919063ffffffff16565b92506150506103e8615042601c548d614dd190919063ffffffff16565b614e0c90919063ffffffff16565b915061507b6103e861506d601b548d614dd190919063ffffffff16565b614e0c90919063ffffffff16565b90506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156150e4573d6000803e3d6000fd5b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561514d573d6000803e3d6000fd5b508573ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015615194573d6000803e3d6000fd5b508473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156151db573d6000803e3d6000fd5b508373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015615222573d6000803e3d6000fd5b5087877ff7fc667e57dff8ed055d939d6d3b7d2272bdbef9e2c0a44372616b61fd6c595a878988604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a3818a887f08021fe1335f6aa4501453b4c8b6fb5104b6248e5d841ca6b9ceb723fb2083783073ffffffffffffffffffffffffffffffffffffffff1631878660405180848152602001838152602001828152602001935050505060405180910390a43073ffffffffffffffffffffffffffffffffffffffff163161537c8b8b614d9a90919063ffffffff16565b1115151561538657fe5b896153bf836153b1866153a3600387614dd190919063ffffffff16565b614db390919063ffffffff16565b614db390919063ffffffff16565b1015156153c857fe5b50505050505050505050565b60006153e98383614d9a90919063ffffffff16565b9050600081111561543c578373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561543a573d6000803e3d6000fd5b505b50505050565b600080600061549b603054601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db390919063ffffffff16565b92506154f1603154601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db390919063ffffffff16565b9150601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083831180156155445750600081115b156155a55761555d600182614d9a90919063ffffffff16565b601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061574d565b83831080156155b357508382115b1561566e576155e26019546155d46004602954614e0c90919063ffffffff16565b614db390919063ffffffff16565b601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061574c565b8382101561570557601954601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061574b565b6000601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5b5050505050565b600080600080600086881115151561576b57600080fd5b6000881415151561577b57600080fd5b615783615eba565b945060008573ffffffffffffffffffffffffffffffffffffffff1614156157c9576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694505b6014602c548154811015156157da57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935060008473ffffffffffffffffffffffffffffffffffffffff16141561584b576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693505b6158746103e8615866601b548b614dd190919063ffffffff16565b614e0c90919063ffffffff16565b92506158c460026158b6856158a86103e861589a601c548f614dd190919063ffffffff16565b614e0c90919063ffffffff16565b614db390919063ffffffff16565b614e0c90919063ffffffff16565b9150615901836158f36103e86158e5601a548d614dd190919063ffffffff16565b614e0c90919063ffffffff16565b614db390919063ffffffff16565b90506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561596a573d6000803e3d6000fd5b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156159d3573d6000803e3d6000fd5b508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015615a1a573d6000803e3d6000fd5b508473ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015615a61573d6000803e3d6000fd5b508188877f3ebea32ecf272442ce56bf53fdd3bf2e6ed6d615248ac0a159ec4f53d0d3b2b63073ffffffffffffffffffffffffffffffffffffffff163185888b604051808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a43073ffffffffffffffffffffffffffffffffffffffff1631615b228989614d9a90919063ffffffff16565b11151515615b2c57fe5b87615b5283615b448487614db390919063ffffffff16565b614db390919063ffffffff16565b101515615b5b57fe5b5050505050505050565b600080600080600080606060008060008060006001615b846001613b57565b1415615c0357615b9261345a565b9850602e89815481101515615ba357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169750615bfc888e8b7f6c6173744f776e65720000000000000000000000000000000000000000000000615db0565b9950615d9b565b602c549850602f60008a8152602001908152602001600020549650615c29876001614c0e565b9550855194506000851115615d2f57615c4b858e614e0c90919063ffffffff16565b9250600091505b8482108015615c6157508c8a11155b15615d2a578582815181101515615c7457fe5b906020019060200201519050602e81815481101515615c8f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169750615ce88884837f616e4f776e657200000000000000000000000000000000000000000000000000615db0565b8a019950838060010194505084841480615d1357508c615d11848c614db390919063ffffffff16565b115b15615d1d57615d2a565b8180600101925050615c52565b615d9a565b602e89815481101515615d3e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169750615d97888e8b7f6c6173744e756b65644f776e6572000000000000000000000000000000000000615db0565b99505b5b888a9b509b5050505050505050505050915091565b60008060008673ffffffffffffffffffffffffffffffffffffffff161415615df7576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1695505b8490508460086000600554815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508260001916858773ffffffffffffffffffffffffffffffffffffffff167f38209bb2453adb961c3a76c443583925b7f61a3bc6a9fa44d7dfce8d1b4bbf7b876040518082815260200191505060405180910390a480915050949350505050565b600080600080615ec861384d565b9250826026541015615eed57615edf6026546128c2565b9050615eea8161162d565b91505b82615f046001602654614db390919063ffffffff16565b1015615f2157602660008154809291906001019190505550615f2a565b60006026819055505b81935050505090565b815481835581811115615f5a57818360005260206000209182019101615f599190615f5f565b5b505050565b615f8191905b80821115615f7d576000816000905550600101615f65565b5090565b905600a165627a7a723058201351020b44735e02df1c9ed47cdfdf4129d8ff3fcc27dd791e5f084138b5c6da0029
Deployed Bytecode
0x6080604052600436106102d5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806307b86793146102d75780630a099606146103435780630ad125de1461037c5780630d95508d146103e95780630f6bd9b2146104095780631033910e14610456578063192687891461048d5780631f1f59b7146104d457806322ae1a13146104eb578063240c06da1461052c578063250ce943146105435780632f5e2090146105b85780632f81fa7a1461061d578063363d30461461064857806337737ff81461068d5780633ccfd60b146107115780633e199f15146107285780633e7689e6146107765780633f4e2597146107b75780634109d1c41461082057806346a8f78f1461084d5780634c8781c51461088e5780634e7eaf121461092657806355cb1c581461098e5780635b500826146109bd5780635bd39e72146109f45780636033478a14610a1f57806360db225814610aa05780636183785f14610ae35780636626abc914610b3a57806366dc561814610bfa5780636748355e14610c255780636808ef2414610c50578063751f489114610cbd5780638414ba6014610d0257806387a433bd14610d2d5780638da5cb5b14610d585780638e8f4c6d14610daf57806392372e9d14610e0557806396b1759114610e485780639c508f4614610e735780639de6adc114610ed8578063a05bb77414610f2d578063a87cac2514610f66578063a969337e14610fc1578063aef65ca41461102e578063b0641cbb1461104e578063bec0723f1461108e578063c07f589d146110e3578063c9a2d64514611144578063d429b6d914611171578063d4ee7097146111f3578063d54702091461127d578063d732be6c146112be578063d9f6f5ce146112d5578063de4b385c1461130c578063e2a2deea1461134d578063e46d5ba6146113a0578063eb996fab146113cb578063f346a44214611430578063fe760a61146114be575b005b3480156102e357600080fd5b506102ec611514565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561032f578082015181840152602081019050610314565b505050509050019250505060405180910390f35b34801561034f57600080fd5b5061035861160b565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561038857600080fd5b506103a76004803603810190808035906020019092919050505061162d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61040760048036038101908080359060200190929190505050611702565b005b34801561041557600080fd5b5061044060048036038101908080359060200190929190803515159060200190929190505050611b4a565b6040518082815260200191505060405180910390f35b34801561046257600080fd5b5061048b6004803603810190808035906020019092919080359060200190929190505050611be6565b005b34801561049957600080fd5b506104a2611d63565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b3480156104e057600080fd5b506104e9611d8b565b005b3480156104f757600080fd5b5061051660048036038101908080359060200190929190505050611f6e565b6040518082815260200191505060405180910390f35b34801561053857600080fd5b50610541612002565b005b34801561054f57600080fd5b506105a260048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612277565b6040518082815260200191505060405180910390f35b3480156105c457600080fd5b506105cd6122f9565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b34801561062957600080fd5b50610632612342565b6040518082815260200191505060405180910390f35b34801561065457600080fd5b5061068b60048036038101908080359060200190820180359060200191909192939192939080359060200190929190505050612348565b005b34801561069957600080fd5b506106ba6004803603810190808035151590602001909291905050506123e6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106fd5780820151818401526020810190506106e2565b505050509050019250505060405180910390f35b34801561071d57600080fd5b506107266124d1565b005b34801561073457600080fd5b5061073d61269f565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b34801561078257600080fd5b506107a1600480360381019080803590602001909291905050506128c2565b6040518082815260200191505060405180910390f35b3480156107c357600080fd5b5061081e60048036038101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612997565b005b34801561082c57600080fd5b5061084b60048036038101908080359060200190929190505050612a85565b005b34801561085957600080fd5b5061088c600480360381019080803590602001909291908035906020019092919080359060200190929190505050613074565b005b34801561089a57600080fd5b506108cf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613181565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109125780820151818401526020810190506108f7565b505050509050019250505060405180910390f35b34801561093257600080fd5b50610971600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613293565b604051808381526020018281526020019250505060405180910390f35b34801561099a57600080fd5b506109a3613345565b604051808215151515815260200191505060405180910390f35b3480156109c957600080fd5b506109f26004803603810190808035906020019092919080359060200190929190505050613387565b005b348015610a0057600080fd5b50610a0961345a565b6040518082815260200191505060405180910390f35b348015610a2b57600080fd5b50610a3461349b565b604051808881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b348015610aac57600080fd5b50610ae1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061350b565b005b348015610aef57600080fd5b50610b24600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061362e565b6040518082815260200191505060405180910390f35b348015610b4657600080fd5b50610b65600480360381019080803590602001909291905050506136d5565b60405180871515151581526020018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001965050505050505060405180910390f35b348015610c0657600080fd5b50610c0f61384d565b6040518082815260200191505060405180910390f35b348015610c3157600080fd5b50610c3a613915565b6040518082815260200191505060405180910390f35b348015610c5c57600080fd5b50610c7b600480360381019080803590602001909291905050506139eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cc957600080fd5b50610ce860048036038101908080359060200190929190505050613a2e565b604051808215151515815260200191505060405180910390f35b348015610d0e57600080fd5b50610d17613a6b565b6040518082815260200191505060405180910390f35b348015610d3957600080fd5b50610d42613a75565b6040518082815260200191505060405180910390f35b348015610d6457600080fd5b50610d6d613ac1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610dbb57600080fd5b50610dc4613ae6565b604051808715151515815260200186815260200185815260200184815260200183815260200182151515158152602001965050505050505060405180910390f35b348015610e1157600080fd5b50610e32600480360381019080803515159060200190929190505050613b57565b6040518082815260200191505060405180910390f35b348015610e5457600080fd5b50610e5d613bd4565b6040518082815260200191505060405180910390f35b348015610e7f57600080fd5b50610ebe60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bda565b604051808215151515815260200191505060405180910390f35b348015610ee457600080fd5b50610f17600480360381019080803590602001909291908035906020019092919080359060200190929190505050613d34565b6040518082815260200191505060405180910390f35b348015610f3957600080fd5b50610f42613d78565b60405180848152602001838152602001828152602001935050505060405180910390f35b348015610f7257600080fd5b50610fa7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613d91565b604051808215151515815260200191505060405180910390f35b348015610fcd57600080fd5b50610fec60048036038101908080359060200190929190505050613e51565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61104c60048036038101908080359060200190929190505050613e94565b005b34801561105a57600080fd5b506110636140ca565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b34801561109a57600080fd5b506110a36140ea565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b3480156110ef57600080fd5b5061112e60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614134565b6040518082815260200191505060405180910390f35b34801561115057600080fd5b5061116f600480360381019080803590602001909291905050506141bd565b005b34801561117d57600080fd5b5061119c6004803603810190808035906020019092919050505061435e565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156111df5780820151818401526020810190506111c4565b505050509050019250505060405180910390f35b3480156111ff57600080fd5b5061120861441e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b34801561128957600080fd5b506112a86004803603810190808035906020019092919050505061446f565b6040518082815260200191505060405180910390f35b3480156112ca57600080fd5b506112d36144c1565b005b3480156112e157600080fd5b5061130a600480360381019080803590602001909291908035906020019092919050505061481f565b005b34801561131857600080fd5b50611337600480360381019080803590602001909291905050506148e8565b6040518082815260200191505060405180910390f35b34801561135957600080fd5b50611378600480360381019080803590602001909291905050506149bd565b6040518084815260200183151515158152602001828152602001935050505060405180910390f35b3480156113ac57600080fd5b506113b5614a18565b6040518082815260200191505060405180910390f35b3480156113d757600080fd5b5061140c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614a1e565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561143c57600080fd5b5061146760048036038101908080359060200190929190803515159060200190929190505050614c0e565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156114aa57808201518184015260208101905061148f565b505050509050019250505060405180910390f35b3480156114ca57600080fd5b506114f36004803603810190808035906020019092919080359060200190929190505050614d19565b60405180831515151581526020018281526020019250505060405180910390f35b6060600060606000806013805490509350836040519080825280602002602001820160405280156115545781602001602082028038833980820191505090505b50925060009150600090505b838110156116015760138181548110151561157757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015156115b057fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081806001019250508080600101915050611560565b8294505050505090565b6000806000601380549050602e80549050601480549050925092509250909192565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1580156116c057600080fd5b505af11580156116d4573d6000803e3d6000fd5b505050506040513d60208110156116ea57600080fd5b81019080805190602001909291905050509050919050565b600080600080600080600060011515600460149054906101000a900460ff16151514151561172f57600080fd5b6027548810151561173f57600080fd5b61174888611f6e565b341015151561175657600080fd5b600061176189611f6e565b11151561176d57600080fd5b6000151561177a89613a2e565b151514151561178857600080fd5b611790613345565b151561179b57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1660156000600554815260200190815260200160002060008a815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561181f57600080fd5b6016548814158061184657506005611844602954602754614d9a90919063ffffffff16565b105b151561185157600080fd5b33965042955060055494503073ffffffffffffffffffffffffffffffffffffffff1631935061187f88611f6e565b92508660148981548110151561189157fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602d60008981526020019081526020016000205491506118f8886148e8565b602d60008a81526020019081526020016000208190555060016028600087815260200190815260200160002060008a815260200190815260200160002060006101000a81548160ff0219169083151502179055506029600081548092919060010191905055506027546119776001602954614db390919063ffffffff16565b14156119e35742600681905550848773ffffffffffffffffffffffffffffffffffffffff16897f3486832d53b74dbbd4d34dafef80a0962ff195ec58fcdd20347a58afa8c1432587600654604051808381526020018281526020019250505060405180910390a4611a37565b6119eb613a75565b9050611a166103e8611a08600f5484614dd190919063ffffffff16565b614e0c90919063ffffffff16565b600b600087815260200190815260200160002081905550611a3686614e27565b5b87602c81905550611a4a83858a89614e76565b611a558784346153d4565b602a60008154809291906001019190505550878773ffffffffffffffffffffffffffffffffffffffff167f53e4c84cbbd880ccd53f5f64e9eb4882e8062c9b8198f8d829c235fa228c08868584604051808381526020018281526020019250505060405180910390a38673ffffffffffffffffffffffffffffffffffffffff168860017f38b92e33abe0fac579118740c3fc5c104cdceb9c7f7976c489bc1149880277d2896029548a60405180848152602001838152602001828152602001935050505060405180910390a481602d60008a81526020019081526020016000205410151515611b4057fe5b5050505050505050565b600080600080600092506005549150600090505b602754811015611bda5785602f600083815260200190815260200160002054148015611bbf575084151560286000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16151514155b15611bcd5782806001019350505b8080600101915050611b5e565b82935050505092915050565b60008060003373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611c4657600080fd5b8385101515611c5457600080fd5b6027548411151515611c6557600080fd5b8490505b83811015611d5c57611c7a816148e8565b9250611c858161162d565b915082602d60008381526020019081526020016000208190555081602e82815481101515611caf57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000831480611d1c575060008273ffffffffffffffffffffffffffffffffffffffff16145b15611d4f57807f857f57125da7470f5fe5d3b1a47a8a86bd29e99df62d0888bc97e33411756ca060405160405180910390a25b8080600101915050611c69565b5050505050565b6000806000806000602154602254602354602454602554945094509450945094509091929394565b60008060008073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515611dcb57600080fd5b600060086000600554815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111515611e2c57600080fd5b33925060055491506008600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006008600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081818473ffffffffffffffffffffffffffffffffffffffff167fb17deb1436986ea5c7646c09b9e0895fb0bb278a822745fcd513a08a43ed6b1b60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611f68573d6000803e3d6000fd5b50505050565b600080600080611f7c613a75565b9250611fb96064611fab600d54602d60008a815260200190815260200160002054614dd190919063ffffffff16565b614e0c90919063ffffffff16565b9150600e54821115611fe157611fda600e5484614db390919063ffffffff16565b9050611ff7565b611ff48284614db390919063ffffffff16565b90505b809350505050919050565b6000801515600460149054906101000a900460ff16151514151561202557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480156120965750612093603254600654614db390919063ffffffff16565b42115b806120b757506120b462281d88600654614db390919063ffffffff16565b42115b15156120c257600080fd5b4290506000600b600060055481526020019081526020016000205414151561218f576005600081548092919060010191905055506000602c819055506000602a819055506000602b81905550600060298190555060006021819055506000602281905550600060238190555060006024819055506000602581905550662386f26fc10000600c819055506000602e8161215b9190615f33565b50600060148161216b9190615f33565b50602754602e8161217c9190615f33565b5060275460148161218d9190615f33565b505b61219881614e27565b6001600460146101000a81548160ff021916908315150217905550600160076000600554815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16816005547f31cf8b881fab26e052efcde5603a90b262ee4e69640a44bb1b890b349166ff8f6006546040518082815260200191505060405180910390a4600460149054906101000a900460ff161515427f3f48654986365594e0cf33207b515e17f54536bda4f2358203fbae2e412e49b760405160405180910390a350565b6000601560008481526020019081526020016000206000868152602001908152602001600020600001600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050949350505050565b60008060008060008061230a61384d565b925082602654101561232f576123216026546128c2565b905061232c8161162d565b91505b8160265482955095509550505050909192565b60305481565b60003373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156123a557600080fd5b600090505b838390508110156123e0576123d384848381811015156123c657fe5b905060200201358361481f565b80806001019150506123aa565b50505050565b60606000606060008060006123fa87613b57565b94508460405190808252806020026020018201604052801561242b5781602001602082028038833980820191505090505b509350600092506005549150600090505b6027548110156124c45786151560286000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff1615151415156124aa5780848481518110151561249357fe5b906020019060200201818152505082806001019350505b848314156124b7576124c4565b808060010191505061243c565b8395505050505050919050565b6000803373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561252f57600080fd5b612546603254600654614db390919063ffffffff16565b42118061256f575064174876e8003073ffffffffffffffffffffffffffffffffffffffff163111155b806125815750600061257f613915565b115b151561258c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff163191506125bd603254600654614db390919063ffffffff16565b4211806125cf575064174876e8008211155b156125dc578190506125f7565b6125e4613915565b9050806025600082825401925050819055505b60255481427f033ca17165c0bc6454fcdd79d2feb3e2d7be80e1e33d80739c3985f6b102847f856040518082815260200191505060405180910390a46000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561269a573d6000803e3d6000fd5b505050565b6000806000806000806000806000806000806000806001151560076000600554815260200190815260200160002060009054906101000a900460ff1615151415156127015760009750600096506000955060009450600093506000925061288c565b612740602454612732602354612724602254602154614db390919063ffffffff16565b614db390919063ffffffff16565b614db390919063ffffffff16565b9150612794612710612786846127786025543073ffffffffffffffffffffffffffffffffffffffff1631614db390919063ffffffff16565b614d9a90919063ffffffff16565b614e0c90919063ffffffff16565b92506127ab601d5484614dd190919063ffffffff16565b90506021548111156127bf578097506127c5565b60215497505b6127da601e5484614dd190919063ffffffff16565b90506022548111156127ee578096506127f4565b60225496505b612809601f5484614dd190919063ffffffff16565b905060235481111561281d57809550612823565b60235495505b61283860205484614dd190919063ffffffff16565b905060245481111561284c57809450612852565b60245494505b6128898561287b8861286d8b8d614db390919063ffffffff16565b614db390919063ffffffff16565b614db390919063ffffffff16565b93505b87878787876128a661271089614dd190919063ffffffff16565b9d509d509d509d509d509d505050505050505050909192939495565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634ca383a6836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561295557600080fd5b505af1158015612969573d6000803e3d6000fd5b505050506040513d602081101561297f57600080fd5b81019080805190602001909291905050509050919050565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156129f257600080fd5b86600a8190555085600c8190555084600f8190555083600d8190555082600e81905550816012819055508060108190555085877f46f10d2e5eff980419f4d35103088aef1aa5efd691b495c0bd7147b759129bf68787878787604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a350505050505050565b60008060008060008060008060011515600460149054906101000a900460ff161515141515612ab357600080fd5b612abc33613d91565b1515612ac757600080fd5b60275489101515612ad757600080fd5b612ae089613a2e565b151515612aec57600080fd5b600654612b0460325442614db390919063ffffffff16565b1080612b255750612b22603254600654614db390919063ffffffff16565b42115b1515612b3057600080fd5b339750612b3c8961162d565b965060055495506015600087815260200190815260200160002060008a81526020019081526020016000209450602a54935084600001600085815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050555084600001600085815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054925084600101600085815260200190815260200160002054915081831115612efc57846001016000858152602001908152602001600020600081548092919060010191905055506016548914158015612cb55750601560008781526020019081526020016000206000601654815260200190815260200160002060010160008581526020019081526020016000205483115b15612cf0578860168190555082897f1518498cd4823b78728367d04a3c23213b5b749b05afcf1dda3ae0ff7a083ea960405160405180910390a35b8773ffffffffffffffffffffffffffffffffffffffff168560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612eac57878560020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506013602f60008b815260200190815260200160002054815481101515612dae57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612e5657506010601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b15612eab57601860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055505b5b888873ffffffffffffffffffffffffffffffffffffffff167f4848d0745980235b3dcebedef926aed65bb7595f3ee5c943cc1b25c99bd54b6c856040518082815260200191505060405180910390a35b8673ffffffffffffffffffffffffffffffffffffffff16602e8a815481101515612f2257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156130075786602e8a815481101515612f7a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550888773ffffffffffffffffffffffffffffffffffffffff167f75e9e2c539e6b1a2171d30152b7738bfa96bcb25ca4773fc666328785a0106d660405160405180910390a35b6130118842615442565b85898973ffffffffffffffffffffffffffffffffffffffff167f2076776e77635974502c71ea6c8d36d8df9ae6b0d47957f091e6b335d86ad9fa8688604051808381526020018281526020019250505060405180910390a4505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156130cf57600080fd5b6102bc61310a826130fc866130ee600388614dd190919063ffffffff16565b614db390919063ffffffff16565b614db390919063ffffffff16565b1115151561311757600080fd5b60648311151561312657600080fd5b82601a8190555081601b8190555080601c8190555042837f85caf2c87b15cee668c2907b605ad3ccedcc2c8bf49422b10cceec1e2e9a7c868484604051808381526020018281526020019250505060405180910390a3505050565b6060600060606000806131938661362e565b9350836040519080825280602002602001820160405280156131c45781602001602082028038833980820191505090505b50925060009150600090505b602754811015613287578573ffffffffffffffffffffffffffffffffffffffff1660148281548110151561320057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561326d5780838381518110151561325657fe5b906020019060200201818152505081806001019250505b8382141561327a57613287565b80806001019150506131d0565b82945050505050919050565b60008060086000600554815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546008600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915091509250929050565b600080600080429250600654915081831080613374575061337160325483614db390919063ffffffff16565b83115b1561337e57600190505b80935050505090565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156133e257600080fd5b60018214156133ff57806013816133f99190615f33565b50613427565b60028214156134145780602781905550613426565b600382141561342557806019819055505b5b5b4281837fba11e319aee26e7bbac889432515ba301ec8f6d27bf6b94829c21a65c5f6ff2560405160405180910390a45050565b600060016134686001613b57565b14151561347457600080fd5b61347e60016123e6565b600081518110151561348c57fe5b90602001906020020151905090565b6000806000806000806000602c546014602c548154811015156134ba57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16602754602954602a54602b54601654965096509650965096509650965090919293949596565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561356657600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f347df869dd398e5c7c4a228fdfcd621e29beffbb21d815233f9af7114bbea6c360405160405180910390a250565b6000806000809150600090505b6014805490508110156136cb578373ffffffffffffffffffffffffffffffffffffffff1660148281548110151561366e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156136be5781806001019250505b808060010191505061363b565b8192505050919050565b60008060008060008060008060156000600554815260200190815260200160002060008a8152602001908152602001600020915060286000600554815260200190815260200160002060008a815260200190815260200160002060009054906101000a900460ff161561375f576137586001602a54614d9a90919063ffffffff16565b9050613765565b602a5490505b60286000600554815260200190815260200160002060008a815260200190815260200160002060009054906101000a900460ff16602f60008b8152602001908152602001600020548360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600101600085815260200190815260200160002054602e8d8154811015156137f757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16602d60008f815260200190815260200160002054975097509750975097509750505091939550919395565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630ef19f626040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156138d557600080fd5b505af11580156138e9573d6000803e3d6000fd5b505050506040513d60208110156138ff57600080fd5b8101908080519060200190929190505050905090565b600080600080600080600061395f602454613951602354613943602254602154614db390919063ffffffff16565b614db390919063ffffffff16565b614db390919063ffffffff16565b95503073ffffffffffffffffffffffffffffffffffffffff1631945061398361269f565b5097505050505061399f60255487614d9a90919063ffffffff16565b92506139b48486614d9a90919063ffffffff16565b91506000831180156139c557508385115b156139df57828211156139da578290506139de565b8190505b5b80965050505050505090565b60006014828154811015156139fc57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000602860006005548152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600554905090565b6000806000600b6000600554815260200190815260200160002054141515613ab457600b60006005548152602001908152602001600020549050613aba565b600a5490505b8091505090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600460149054906101000a900460ff163073ffffffffffffffffffffffffffffffffffffffff163160065460105460115460076000600554815260200190815260200160002060009054906101000a900460ff16955095509550955095509550909192939495565b600080600080600092506005549150600090505b602754811015613bc95784151560286000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff161515141515613bbc5782806001019350505b8080600101915050613b6b565b829350505050919050565b60325481565b600080613be6846148e8565b602d600086815260200190815260200160002054108015613c13575060011515613c0f85613a2e565b1515145b8015613c215750602c548414155b8015613c625750600654613c4060305442614db390919063ffffffff16565b1080613c615750613c5e603254600654614db390919063ffffffff16565b42115b5b8015613c8457506008613c82602954602754614d9a90919063ffffffff16565b115b8015613cb95750602a54613cb76008613ca96001602b54614db390919063ffffffff16565b614dd190919063ffffffff16565b105b8015613cd857506000602d600086815260200190815260200160002054115b8015613d175750613ce88461162d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15613d255760019050613d2a565b600090505b8091505092915050565b600060156000848152602001908152602001600020600085815260200190815260200160002060010160008381526020019081526020016000205490509392505050565b6000806000601b54601c54601a54925092509250909192565b60008042613de9603054601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db390919063ffffffff16565b118015613e3557506000601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15613e435760009050613e48565b600190505b80915050919050565b6000601382815481101515613e6257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600080600060011515600460149054906101000a900460ff161515141515613ebe57600080fd5b600c543410151515613ecf57600080fd5b613ed7613345565b1515613ee257600080fd5b33945042935060055492503073ffffffffffffffffffffffffffffffffffffffff16319150600c54905084601387815481101515613f1c57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613f6d84614e27565b601054601154101515613fe757613fa26064613f9460125484614dd190919063ffffffff16565b614e0c90919063ffffffff16565b600c819055506000601181905550601254600c547f8cff3ec64108175daaeba709284b8628592a5981c57d5078effbfb50458e972160405160405180910390a3613ffa565b6011600081548092919060010191905055505b614005818386615754565b6140108582346153d4565b858573ffffffffffffffffffffffffffffffffffffffff167f9751b20f55856a6193a87509948a771cbeb4305d5126d0b01926421db1557e1c836040518082815260200191505060405180910390a38473ffffffffffffffffffffffffffffffffffffffff168660037f38b92e33abe0fac579118740c3fc5c104cdceb9c7f7976c489bc1149880277d2876011548860405180848152602001838152602001828152602001935050505060405180910390a4505050505050565b600080600080601d54601e54601f54602054935093509350935090919293565b6000806000806000806000600b6000600554815260200190815260200160002054600a54600c54600f54600d54600e54601254965096509650965096509650965090919293949596565b60008060156000600554815260200190815260200160002060008581526020019081526020016000209050806000016000602a54815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491505092915050565b600060011515600460149054906101000a900460ff1615151415156141e157600080fd5b600115156141ef8333613bda565b15151415156141fd57600080fd5b3390506000602860006005548152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff02191690831515021790555080602e8381548110151561424f57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506142ad6001602954614d9a90919063ffffffff16565b602981905550602b60008154809291906001019190505550602b54827fb74e387413529a3c4aae6fc97db66b4b21490f571864edbfa5e7ad931af1925c60405160405180910390a38073ffffffffffffffffffffffffffffffffffffffff168260027f38b92e33abe0fac579118740c3fc5c104cdceb9c7f7976c489bc1149880277d24260295460055460405180848152602001838152602001828152602001935050505060405180910390a45050565b6060600060606000806143708661446f565b9350836040519080825280602002602001820160405280156143a15781602001602082028038833980820191505090505b50925060009150600090505b6027548110156144125785602f60008381526020019081526020016000205414156143f8578083838151811015156143e157fe5b906020019060200201818152505081806001019250505b8382141561440557614412565b80806001019150506143ad565b82945050505050919050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b6000806000809150600090505b6027548110156144b75783602f60008381526020019081526020016000205414156144aa5781806001019250505b808060010191505061447c565b8192505050919050565b600080600080600080600080600060011515600460149054906101000a900460ff1615151415156144f157600080fd5b6006544211151561450157600080fd5b64174876e8003073ffffffffffffffffffffffffffffffffffffffff16311015151561452c57600080fd5b60076000600554815260200190815260200160002060009054906101000a900460ff16151561455a57600080fd5b60055498506000600460146101000a81548160ff02191690831515021790555061458261269f565b50975097509750975097506000600760008b815260200190815260200160002060006101000a81548160ff0219169083151502179055506145c287615b65565b9250925082600960008b815260200190815260200160002081905550602f600084815260200190815260200160002054905061465960138281548110151561460657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687837f636f6e74696e656e740000000000000000000000000000000000000000000000615db0565b820191506146d1601560008b8152602001908152602001600020600085815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660007f6672656500000000000000000000000000000000000000000000000000000000615db0565b8201915061473b6014848154811015156146e757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168960007f6e756b6572000000000000000000000000000000000000000000000000000000615db0565b8201915080838a7f49b2b7e626169d21a8df8d3ffc18870287c2841dcd8d6cca0d83f885e272f5ba4260065489883073ffffffffffffffffffffffffffffffffffffffff1631604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a4600460149054906101000a900460ff161515427f3f48654986365594e0cf33207b515e17f54536bda4f2358203fbae2e412e49b760405160405180910390a33073ffffffffffffffffffffffffffffffffffffffff1631821115151561481457fe5b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561487a57600080fd5b6027548210151561488a57600080fd5b6013805490508110151561489d57600080fd5b80602f6000848152602001908152602001600020819055504281837f15b63fecbefebbd0213710ce626dcc5257730a9d9c2eb78d726bab0be1eb688260405160405180910390a45050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b9186d7d836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561497b57600080fd5b505af115801561498f573d6000803e3d6000fd5b505050506040513d60208110156149a557600080fd5b81019080805190602001909291905050509050919050565b600080600060096000858152602001908152602001600020546007600086815260200190815260200160002060009054906101000a900460ff16600b6000878152602001908152602001600020549250925092509193909250565b60315481565b600080600080600080600080429450614a81603054601760008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db390919063ffffffff16565b9350614ad7603154601760008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db390919063ffffffff16565b9250601860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491508484118015614b2a5750600082115b15614b3757819050614bba565b8484108015614b4557508483115b15614b8e57614b876001614b79601954614b6b6004602954614e0c90919063ffffffff16565b614db390919063ffffffff16565b614db390919063ffffffff16565b9050614bb9565b84831015614bb357614bac6001601954614db390919063ffffffff16565b9050614bb8565b600090505b5b5b601760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054828297509750975050505050509193909250565b6060600060606000806000614c238888611b4a565b945084604051908082528060200260200182016040528015614c545781602001602082028038833980820191505090505b509350600092506005549150600090505b602754811015614d0b5787602f600083815260200190815260200160002054148015614cc6575086151560286000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16151514155b15614cf157808484815181101515614cda57fe5b906020019060200201818152505082806001019350505b84831415614cfe57614d0b565b8080600101915050614c65565b839550505050505092915050565b6000806000601560008581526020019081526020016000206000868152602001908152602001600020905060286000858152602001908152602001600020600086815260200190815260200160002060009054906101000a900460ff16816001016000602a5481526020019081526020016000205492509250509250929050565b6000828211151515614da857fe5b818303905092915050565b6000808284019050838110151515614dc757fe5b8091505092915050565b6000806000841415614de65760009150614e05565b8284029050828482811515614df757fe5b04141515614e0157fe5b8091505b5092915050565b6000808284811515614e1a57fe5b0490508091505092915050565b614e3d62093a8082614db390919063ffffffff16565b600681905550806006547f47a7f4458200a5e64e30731204e5b71ac28fb052cedccc0df77a197fae7639fd60405160405180910390a350565b600080600080600080888a11151515614e8e57600080fd5b60008a14151515614e9e57600080fd5b614ea6615eba565b955060008673ffffffffffffffffffffffffffffffffffffffff161415614eec576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1695505b602e88815481101515614efb57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16945060008573ffffffffffffffffffffffffffffffffffffffff161415614f6c576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694505b601560006005548152602001908152602001600020600089815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935060008473ffffffffffffffffffffffffffffffffffffffff161415614ffc576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693505b6150256103e8615017601a548d614dd190919063ffffffff16565b614e0c90919063ffffffff16565b92506150506103e8615042601c548d614dd190919063ffffffff16565b614e0c90919063ffffffff16565b915061507b6103e861506d601b548d614dd190919063ffffffff16565b614e0c90919063ffffffff16565b90506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156150e4573d6000803e3d6000fd5b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561514d573d6000803e3d6000fd5b508573ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015615194573d6000803e3d6000fd5b508473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156151db573d6000803e3d6000fd5b508373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015615222573d6000803e3d6000fd5b5087877ff7fc667e57dff8ed055d939d6d3b7d2272bdbef9e2c0a44372616b61fd6c595a878988604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a3818a887f08021fe1335f6aa4501453b4c8b6fb5104b6248e5d841ca6b9ceb723fb2083783073ffffffffffffffffffffffffffffffffffffffff1631878660405180848152602001838152602001828152602001935050505060405180910390a43073ffffffffffffffffffffffffffffffffffffffff163161537c8b8b614d9a90919063ffffffff16565b1115151561538657fe5b896153bf836153b1866153a3600387614dd190919063ffffffff16565b614db390919063ffffffff16565b614db390919063ffffffff16565b1015156153c857fe5b50505050505050505050565b60006153e98383614d9a90919063ffffffff16565b9050600081111561543c578373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561543a573d6000803e3d6000fd5b505b50505050565b600080600061549b603054601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db390919063ffffffff16565b92506154f1603154601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db390919063ffffffff16565b9150601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083831180156155445750600081115b156155a55761555d600182614d9a90919063ffffffff16565b601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061574d565b83831080156155b357508382115b1561566e576155e26019546155d46004602954614e0c90919063ffffffff16565b614db390919063ffffffff16565b601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061574c565b8382101561570557601954601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061574b565b6000601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5b5050505050565b600080600080600086881115151561576b57600080fd5b6000881415151561577b57600080fd5b615783615eba565b945060008573ffffffffffffffffffffffffffffffffffffffff1614156157c9576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694505b6014602c548154811015156157da57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935060008473ffffffffffffffffffffffffffffffffffffffff16141561584b576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693505b6158746103e8615866601b548b614dd190919063ffffffff16565b614e0c90919063ffffffff16565b92506158c460026158b6856158a86103e861589a601c548f614dd190919063ffffffff16565b614e0c90919063ffffffff16565b614db390919063ffffffff16565b614e0c90919063ffffffff16565b9150615901836158f36103e86158e5601a548d614dd190919063ffffffff16565b614e0c90919063ffffffff16565b614db390919063ffffffff16565b90506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561596a573d6000803e3d6000fd5b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156159d3573d6000803e3d6000fd5b508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015615a1a573d6000803e3d6000fd5b508473ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015615a61573d6000803e3d6000fd5b508188877f3ebea32ecf272442ce56bf53fdd3bf2e6ed6d615248ac0a159ec4f53d0d3b2b63073ffffffffffffffffffffffffffffffffffffffff163185888b604051808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a43073ffffffffffffffffffffffffffffffffffffffff1631615b228989614d9a90919063ffffffff16565b11151515615b2c57fe5b87615b5283615b448487614db390919063ffffffff16565b614db390919063ffffffff16565b101515615b5b57fe5b5050505050505050565b600080600080600080606060008060008060006001615b846001613b57565b1415615c0357615b9261345a565b9850602e89815481101515615ba357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169750615bfc888e8b7f6c6173744f776e65720000000000000000000000000000000000000000000000615db0565b9950615d9b565b602c549850602f60008a8152602001908152602001600020549650615c29876001614c0e565b9550855194506000851115615d2f57615c4b858e614e0c90919063ffffffff16565b9250600091505b8482108015615c6157508c8a11155b15615d2a578582815181101515615c7457fe5b906020019060200201519050602e81815481101515615c8f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169750615ce88884837f616e4f776e657200000000000000000000000000000000000000000000000000615db0565b8a019950838060010194505084841480615d1357508c615d11848c614db390919063ffffffff16565b115b15615d1d57615d2a565b8180600101925050615c52565b615d9a565b602e89815481101515615d3e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169750615d97888e8b7f6c6173744e756b65644f776e6572000000000000000000000000000000000000615db0565b99505b5b888a9b509b5050505050505050505050915091565b60008060008673ffffffffffffffffffffffffffffffffffffffff161415615df7576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1695505b8490508460086000600554815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508260001916858773ffffffffffffffffffffffffffffffffffffffff167f38209bb2453adb961c3a76c443583925b7f61a3bc6a9fa44d7dfce8d1b4bbf7b876040518082815260200191505060405180910390a480915050949350505050565b600080600080615ec861384d565b9250826026541015615eed57615edf6026546128c2565b9050615eea8161162d565b91505b82615f046001602654614db390919063ffffffff16565b1015615f2157602660008154809291906001019190505550615f2a565b60006026819055505b81935050505090565b815481835581811115615f5a57818360005260206000209182019101615f599190615f5f565b5b505050565b615f8191905b80821115615f7d576000816000905550600101615f65565b5090565b905600a165627a7a723058201351020b44735e02df1c9ed47cdfdf4129d8ff3fcc27dd791e5f084138b5c6da0029
Swarm Source
bzzr://1351020b44735e02df1c9ed47cdfdf4129d8ff3fcc27dd791e5f084138b5c6da
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.