ETH Price: $1,685.58 (+0.60%)
Gas: 6 Gwei
 

Overview

ETH Balance

0.0515 ETH

Eth Value

$86.81 (@ $1,685.58/ETH)

Multi Chain

Multichain Addresses

1 address found via
Transaction Hash
Method
Block
From
To
Value
Set Starter Pack62300672018-08-28 17:42:171859 days 16 hrs ago1535478137IN
HogSmashBattle
0 ETH0.00006592
Set Card Draw Pr...62300232018-08-28 17:33:341859 days 16 hrs ago1535477614IN
HogSmashBattle
0 ETH0.000027162
Challenge61860272018-08-21 7:17:391867 days 2 hrs ago1534835859IN
HogSmashBattle
0.02 ETH0.000288842
Challenge61859232018-08-21 6:48:301867 days 3 hrs ago1534834110IN
HogSmashBattle
0.02 ETH0.000272812
Level Up61858912018-08-21 6:40:061867 days 3 hrs ago1534833606IN
HogSmashBattle
0.01 ETH0.000166192
Level Up61858892018-08-21 6:39:501867 days 3 hrs ago1534833590IN
HogSmashBattle
0.01 ETH0.000166312
Challenge61858082018-08-21 6:19:551867 days 3 hrs ago1534832395IN
HogSmashBattle
0.02 ETH0.00031882.1
Level Up61858012018-08-21 6:17:411867 days 3 hrs ago1534832261IN
HogSmashBattle
0.01 ETH0.000217452.2
Generate Initial...61820782018-08-20 15:26:051867 days 18 hrs ago1534778765IN
HogSmashBattle
0 ETH0.00086272.5
Generate Initial...61820102018-08-20 15:08:531867 days 18 hrs ago1534777733IN
HogSmashBattle
0 ETH0.000849642.5
Generate Initial...61818672018-08-20 14:32:501867 days 19 hrs ago1534775570IN
HogSmashBattle
0 ETH0.000862732.5
Generate Initial...61815162018-08-20 13:05:221867 days 20 hrs ago1534770322IN
HogSmashBattle
0 ETH0.000849642.5
Generate Initial...61812362018-08-20 11:56:541867 days 21 hrs ago1534766214IN
HogSmashBattle
0 ETH0.000887142.5
Generate Initial...61803052018-08-20 8:04:591868 days 1 hr ago1534752299IN
HogSmashBattle
0 ETH0.000849642.5
Set Setting Valu...61742882018-08-19 7:44:461869 days 2 hrs ago1534664686IN
HogSmashBattle
0 ETH0.000257772.5
Set Marketplace ...61742182018-08-19 7:27:221869 days 2 hrs ago1534663642IN
HogSmashBattle
0 ETH0.000117372.5
0x610d006061738782018-08-19 6:05:241869 days 3 hrs ago1534658724IN
 Create: Battle
0 ETH0.017258412.5

Latest 2 internal transactions

Advanced mode:
Advanced Filter
Parent Txn Hash Block From To Value
61859232018-08-21 6:48:301867 days 3 hrs ago1534834110
HogSmashBattle
0.01925 ETH
61858082018-08-21 6:19:551867 days 3 hrs ago1534832395
HogSmashBattle
0.01925 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Battle

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-08-19
*/

pragma solidity ^0.4.24;

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    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 a / b;
  }

  /**
  * @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 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}


 /**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;

  
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}


/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    emit Unpause();
  }
}



contract BattleBase is Ownable {
	 using SafeMath for uint256;
	 
	/***********************************************************************************/
	/* EVENTS
	/***********************************************************************************/
	
	/**
	* History sequence will be represented by uint256, in other words the max round is 256 (rounds more than this will decide on hp left or draw)
	*  1 is challenger attack
	*  2 is defender attack
	*  3 is challenger attack with critical
	*  4 is defender attack with critical
	*/
	event BattleHistory(
		uint256 historyId,
		uint8 winner, // 0 - challenger; 1 - defender; 2 - draw;
		uint64 battleTime,
		uint256 sequence,
		uint256 blockNumber,
		uint256 tokensGained);
	
	event BattleHistoryChallenger(
		uint256 historyId,
		uint256 cardId,
		uint8 element,
		uint16 level,
		uint32 attack,
		uint32 defense,
		uint32 hp,
		uint32 speed,
		uint32 criticalRate,
		uint256 rank);
		
	event BattleHistoryDefender(
		uint256 historyId,
		uint256 cardId,
		uint8 element,
		uint16 level,
		uint32 attack,
		uint32 defense,
		uint32 hp,
		uint32 speed,
		uint16 criticalRate,
		uint256 rank);
	
	event RejectChallenge(
		uint256 challengerId,
		uint256 defenderId,
		uint256 defenderRank,
		uint8 rejectCode,
		uint256 blockNumber);
		
	event HashUpdated(
		uint256 cardId, 
		uint256 cardHash);
		
	event LevelUp(uint256 cardId);
	
	event CardCreated(address owner, uint256 cardId);
	
	
	/***********************************************************************************/
	/* CONST DATA
	/***********************************************************************************/		
	uint32[] expToNextLevelArr = [0,103,103,207,207,207,414,414,414,414,724,724,724,828,828,931,931,1035,1035,1138,1138,1242,1242,1345,1345,1449,1449,1552,1552,1656,1656,1759,1759,1863,1863,1966,1966,2070,2070,2173,2173,2173,2277,2277,2380,2380,2484,2484,2587,2587,2691,2691,2794,2794,2898,2898,3001,3001,3105,3105,3208,3208,3312,3312,3415,3415,3519,3519,3622,3622,3622,3726,3726,3829,3829,3933,3933,4036,4036,4140,4140,4243,4243,4347,4347,4450,4450,4554,4554,4657,4657,4761,4761,4864,4864,4968,4968,5071,5071,5175];
	
	uint32[] activeWinExp = [10,11,14,19,26,35,46,59,74,91,100,103,108,116,125,135,146,158,171,185,200,215,231,248,265,283,302,321,341,361,382];
	
	
	/***********************************************************************************/
	/* DATA VARIABLES
	/***********************************************************************************/		
	//Card structure that holds all information for battle
	struct Card {
		uint8 element; // 1 - fire; 2 - water; 3 - wood;    8 - light; 9 - dark;
		uint16 level; //"unlimited" level bound to uint16 Max level is 65535
		uint32 attack;
		uint32 defense;
		uint32 hp;
		uint32 speed;
		uint16 criticalRate; //max 8000
		uint32 flexiGems;
		uint256 cardHash;
		uint32 currentExp;
		uint32 expToNextLevel;
		uint64 createdDatetime;

		uint256 rank; //rank is n-1 (need to add 1 for display);

		//uint8 passiveSkill; //TBC
	}
	
	// Mapping from tokenId to Card Struct
	mapping (uint256 => Card) public cards;
	
	uint256[] ranking; //stores the token id according to array position starts from 0 (rank 1)
	
	// Mapping from rank to amount held in that rank (challenge tokens)
	mapping (uint256 => uint256) public rankTokens;
	
	uint8 public currentElement = 0; //start with 0 as +1 will become fire
	
	uint256 public historyId = 0;
	
	/***********************************************************************************/
	/* CONFIGURATIONS
	/***********************************************************************************/
	/// @dev The address of the HogSmashToken
	HogSmashToken public hogsmashToken;
	
	/// @dev The address of the Marketplace
	Marketplace public marketplace;
			
	// Challenge fee changes on ranking difference
	uint256 public challengeFee;

	// Upgrade fee
	uint256 public upgradeFee;
	
	// Avatar fee
	uint256 public avatarFee;
	
	// Referrer fee in % (x10000)
	uint256 public referrerFee;
	
	// Developer Cut in % (x10000)
	uint256 public developerCut;
	
	uint256 internal totalDeveloperCut;

	// Price for each card draw (in wei)
	uint256 public cardDrawPrice;

	// Gems provided for upgrade every level up
	uint8 public upgradeGems; //
	// Gems provided for upgrade every 10 level up
	uint8 public upgradeGemsSpecial;
	// 1 Gem to attack conversion
	uint16 public gemAttackConversion;
	// 1 Gem to defense conversion
	uint16 public gemDefenseConversion;
	// 1 Gem to hp conversion
	uint16 public gemHpConversion;
	// 1 Gem to speed conversion
	uint16 public gemSpeedConversion;
	// 1 Gem to critical rate conversion divided by 100, eg 25 = 0.25
	uint16 public gemCriticalRateConversion;
	
	//% to get a gold card, 0 to 100
	uint8 public goldPercentage;
	
	//% to get a silver card, 0 to 100
	uint8 public silverPercentage;
 	
	//Range of event card number 1-99999999
	uint32 public eventCardRangeMin;
	
	//Range of event card number 1-99999999
	uint32 public eventCardRangeMax;
	
	// Maximum rounds of battle, cannot exceed 128
	uint8 public maxBattleRounds; //
		
	// Record how much tokens are held as rank tokens
	uint256 internal totalRankTokens;
	
	// Flag for start fighting
	bool internal battleStart;
	
	//Flag for starter pack sale
	bool internal starterPackOnSale;
	
	uint256 public starterPackPrice; //price of starter pack
	
	uint16 public starterPackCardLevel; //card level from starter pack
	
	
	/***********************************************************************************/
	/* ADMIN FUNCTIONS FOR SETTING CONFIGS
	/***********************************************************************************/		
	/// @dev Sets the reference to the marketplace.
	/// @param _address - Address of marketplace.
	function setMarketplaceAddress(address _address) external onlyOwner {
		Marketplace candidateContract = Marketplace(_address);

		require(candidateContract.isMarketplace(),"needs to be marketplace");

		// Set the new contract address
		marketplace = candidateContract;
	}
		
	/**
	* @dev set upgrade gems for each level up and each 10 level up
	* @param _upgradeGems upgrade gems for normal levels
	* @param _upgradeGemsSpecial upgrade gems for every n levels
	* @param _gemAttackConversion gem to attack conversion
	* @param _gemDefenseConversion gem to defense conversion
	* @param _gemHpConversion gem to hp conversion
	* @param _gemSpeedConversion gem to speed conversion
	* @param _gemCriticalRateConversion gem to critical rate conversion
	* @param _goldPercentage percentage to get gold card
	* @param _silverPercentage percentage to get silver card
	* @param _eventCardRangeMin event card hash range start (inclusive)
	* @param _eventCardRangeMax event card hash range end (inclusive)	
	* @param _newMaxBattleRounds maximum battle rounds
	*/
	function setSettingValues(  uint8 _upgradeGems,
	uint8 _upgradeGemsSpecial,
	uint16 _gemAttackConversion,
	uint16 _gemDefenseConversion,
	uint16 _gemHpConversion,
	uint16 _gemSpeedConversion,
	uint16 _gemCriticalRateConversion,
	uint8 _goldPercentage,
	uint8 _silverPercentage,
	uint32 _eventCardRangeMin,
	uint32 _eventCardRangeMax,
	uint8 _newMaxBattleRounds) external onlyOwner {
		require(_eventCardRangeMax >= _eventCardRangeMin, "range max must be larger or equals range min" );
		require(_eventCardRangeMax<100000000, "range max cannot exceed 99999999");
		require((_newMaxBattleRounds <= 128) && (_newMaxBattleRounds >0), "battle rounds must be between 0 and 128");
		upgradeGems = _upgradeGems;
		upgradeGemsSpecial = _upgradeGemsSpecial;
		gemAttackConversion = _gemAttackConversion;
		gemDefenseConversion = _gemDefenseConversion;
		gemHpConversion = _gemHpConversion;
		gemSpeedConversion = _gemSpeedConversion;
		gemCriticalRateConversion = _gemCriticalRateConversion;
		goldPercentage = _goldPercentage;
		silverPercentage = _silverPercentage;
		eventCardRangeMin = _eventCardRangeMin;
		eventCardRangeMax = _eventCardRangeMax;
		maxBattleRounds = _newMaxBattleRounds;
	}
	
	
	// @dev function to allow contract owner to change the price (in wei) per card draw
	function setStarterPack(uint256 _newStarterPackPrice, uint16 _newStarterPackCardLevel) external onlyOwner {
		require(_newStarterPackCardLevel<=20, "starter pack level cannot exceed 20"); //starter pack level cannot exceed 20
		starterPackPrice = _newStarterPackPrice;
		starterPackCardLevel = _newStarterPackCardLevel;		
	} 	
	
	// @dev function to allow contract owner to enable/disable starter pack sale
	function setStarterPackOnSale(bool _newStarterPackOnSale) external onlyOwner {
		starterPackOnSale = _newStarterPackOnSale;
	}
	
	// @dev function to allow contract owner to start/stop the battle
	function setBattleStart(bool _newBattleStart) external onlyOwner {
		battleStart = _newBattleStart;
	}
	
	// @dev function to allow contract owner to change the price (in wei) per card draw
	function setCardDrawPrice(uint256 _newCardDrawPrice) external onlyOwner {
		cardDrawPrice = _newCardDrawPrice;
	}
	
	// @dev function to allow contract owner to change the referrer fee (in %, eg 3.75% is 375)
	function setReferrerFee(uint256 _newReferrerFee) external onlyOwner {
		referrerFee = _newReferrerFee;
	}

	// @dev function to allow contract owner to change the challenge fee (in wei)
	function setChallengeFee(uint256 _newChallengeFee) external onlyOwner {
		challengeFee = _newChallengeFee;
	}

	// @dev function to allow contract owner to change the upgrade fee (in wei)
	function setUpgradeFee(uint256 _newUpgradeFee) external onlyOwner {
		upgradeFee = _newUpgradeFee;
	}
	
	// @dev function to allow contract owner to change the avatar fee (in wei)
	function setAvatarFee(uint256 _newAvatarFee) external onlyOwner {
		avatarFee = _newAvatarFee;
	}
	
	// @dev function to allow contract owner to change the developer cut (%) divide by 100
	function setDeveloperCut(uint256 _newDeveloperCut) external onlyOwner {
		developerCut = _newDeveloperCut;
	}
		
	function getTotalDeveloperCut() external view onlyOwner returns (uint256) {
		return totalDeveloperCut;
	}
		
	function getTotalRankTokens() external view returns (uint256) {
		return totalRankTokens;
	}
	
	
	/***********************************************************************************/
	/* GET SETTINGS FUNCTION
	/***********************************************************************************/	
	/**
	* @dev get upgrade gems and conversion ratios of each field
	* @return _upgradeGems upgrade gems for normal levels
	* @return _upgradeGemsSpecial upgrade gems for every n levels
	* @return _gemAttackConversion gem to attack conversion
	* @return _gemDefenseConversion gem to defense conversion
	* @return _gemHpConversion gem to hp conversion
	* @return _gemSpeedConversion gem to speed conversion
	* @return _gemCriticalRateConversion gem to critical rate conversion
	*/
	function getSettingValues() external view returns(  uint8 _upgradeGems,
															uint8 _upgradeGemsSpecial,
															uint16 _gemAttackConversion,
															uint16 _gemDefenseConversion,
															uint16 _gemHpConversion,
															uint16 _gemSpeedConversion,
															uint16 _gemCriticalRateConversion,
															uint8 _maxBattleRounds)
	{
		_upgradeGems = uint8(upgradeGems);
		_upgradeGemsSpecial = uint8(upgradeGemsSpecial);
		_gemAttackConversion = uint16(gemAttackConversion);
		_gemDefenseConversion = uint16(gemDefenseConversion);
		_gemHpConversion = uint16(gemHpConversion);
		_gemSpeedConversion = uint16(gemSpeedConversion);
		_gemCriticalRateConversion = uint16(gemCriticalRateConversion);
		_maxBattleRounds = uint8(maxBattleRounds);
	}
		

}

/***********************************************************************************/
/* RANDOM GENERATOR
/***********************************************************************************/
contract Random {
	uint private pSeed = block.number;

	function getRandom() internal returns(uint256) {
		return (pSeed = uint(keccak256(abi.encodePacked(pSeed,
		blockhash(block.number - 1),
		blockhash(block.number - 3),
		blockhash(block.number - 5),
		blockhash(block.number - 7))
		)));
	}
}

/***********************************************************************************/
/* CORE BATTLE CONTRACT
/***********************************************************************************/
/**
* Omits fallback to prevent accidentally sending ether to this contract
*/
contract Battle is BattleBase, Random, Pausable {

	/***********************************************************************************/
	/* CONSTRUCTOR
	/***********************************************************************************/
	// @dev Contructor for Battle Contract
	constructor(address _tokenAddress) public {
		HogSmashToken candidateContract = HogSmashToken(_tokenAddress);
		// Set the new contract address
		hogsmashToken = candidateContract;
		
		starterPackPrice = 30000000000000000;
		starterPackCardLevel = 5;
		starterPackOnSale = true; // start by selling starter pack
		
		challengeFee = 10000000000000000;
		
		upgradeFee = 10000000000000000;
		
		avatarFee = 50000000000000000;
		
		developerCut = 375;
		
		referrerFee = 2000;
		
		cardDrawPrice = 15000000000000000;
 		
		battleStart = true;
 		
		paused = false; //default contract paused
				
		totalDeveloperCut = 0; //init to 0
	}
	
	/***********************************************************************************/
	/* MODIFIER
	/***********************************************************************************/
	/**
	* @dev Guarantees msg.sender is owner of the given token
	* @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
	*/
	modifier onlyOwnerOf(uint256 _tokenId) {
		require(hogsmashToken.ownerOf(_tokenId) == msg.sender, "must be owner of token");
		_;
	}
		
	
	/***********************************************************************************/
	/* GAME FUNCTIONS
	/***********************************************************************************/
	/**
	* @dev External function for getting info of card
	* @param _id card id of target query card
	* @return information of the card
	*/
	function getCard(uint256 _id) external view returns (
	uint256 cardId,
	address owner,
	uint8 element,
	uint16 level,
	uint32[] stats,
	uint32 currentExp,
	uint32 expToNextLevel,
	uint256 cardHash,
	uint64 createdDatetime,
	uint256 rank
	) {
		cardId = _id;
		
		owner = hogsmashToken.ownerOf(_id);
		
		Card storage card = cards[_id];
		
		uint32[] memory tempStats = new uint32[](6);

		element = uint8(card.element);
		level = uint16(card.level);
		tempStats[0] = uint32(card.attack);
		tempStats[1] = uint32(card.defense);
		tempStats[2] = uint32(card.hp);
		tempStats[3] = uint32(card.speed);
		tempStats[4] = uint16(card.criticalRate);
		tempStats[5] = uint32(card.flexiGems);
		stats = tempStats;
		currentExp = uint32(card.currentExp);
		expToNextLevel = uint32(card.expToNextLevel);
		cardHash = uint256(card.cardHash);
		createdDatetime = uint64(card.createdDatetime);
		rank = uint256(card.rank);
	}
	
	
	/**
	* @dev External function for querying card Id at rank (zero based)
	* @param _rank zero based rank of the card
	* @return id of the card at the rank
	*/
	function getCardIdByRank(uint256 _rank) external view returns(uint256 cardId) {
		return ranking[_rank];
	}
	

	/**
	* @dev External function for drafting new card
	* @return uint of cardId
	*/
	function draftNewCard() external payable whenNotPaused returns (uint256) {
		require(msg.value == cardDrawPrice, "fee must be equal to draw price"); //make sure the fee is enough for drafting a new card`
				
		require(address(marketplace) != address(0), "marketplace not set"); //need to set up marketplace before drafting new cards is allowed
				
		hogsmashToken.setApprovalForAllByContract(msg.sender, marketplace, true); //let marketplace have approval for escrow if the card goes on sale
		
		totalDeveloperCut = totalDeveloperCut.add(cardDrawPrice);
		
		return _createCard(msg.sender, 1); //level 1 cards
	}
	
	/**
	* @dev External function for drafting new card
	* @return uint of cardId
	*/
	function draftNewCardWithReferrer(address referrer) external payable whenNotPaused returns (uint256 cardId) {
		require(msg.value == cardDrawPrice, "fee must be equal to draw price"); //make sure the fee is enough for drafting a new card`
				
		require(address(marketplace) != address(0), "marketplace not set"); //need to set up marketplace before drafting new cards is allowed
				
		hogsmashToken.setApprovalForAllByContract(msg.sender, marketplace, true); //let marketplace have approval for escrow if the card goes on sale
		
		cardId = _createCard(msg.sender, 1); //level 1 cards
		
		if ((referrer != address(0)) && (referrerFee!=0) && (referrer!=msg.sender) && (hogsmashToken.balanceOf(referrer)>0)) {
			uint256 referrerCut = msg.value.mul(referrerFee)/10000;
			require(referrerCut<=msg.value, "referre cut cannot be larger than fee");
			referrer.transfer(referrerCut);
			totalDeveloperCut = totalDeveloperCut.add(cardDrawPrice.sub(referrerCut));
		} else {
			totalDeveloperCut = totalDeveloperCut.add(cardDrawPrice);
		}		
	}
	

	/**
	* @dev External function for leveling up
	* @param _id card id of target query card
	* @param _attackLevelUp gems allocated to each attribute for upgrade
	* @param _defenseLevelUp gems allocated to each attribute for upgrade
	* @param _hpLevelUp gems allocated to each attribute for upgrade
	* @param _speedLevelUp gems allocated to each attribute for upgrade
	* @param _criticalRateLevelUp gems allocated to each attribute for upgrade
	* @param _flexiGemsLevelUp are gems allocated to each attribute for upgrade
	*/
	function levelUp( 	uint256 _id,
						uint16 _attackLevelUp,
						uint16 _defenseLevelUp,
						uint16 _hpLevelUp,
						uint16 _speedLevelUp,
						uint16 _criticalRateLevelUp,
						uint16 _flexiGemsLevelUp) external payable whenNotPaused onlyOwnerOf(_id) {
		require(
		_attackLevelUp >= 0        &&
		_defenseLevelUp >= 0       &&
		_hpLevelUp >= 0            &&
		_speedLevelUp >= 0         &&
		_criticalRateLevelUp >= 0  &&
		_flexiGemsLevelUp >= 0, "level up attributes must be more than 0"
		); //make sure all upgrade attributes will not be negative

		require(msg.value == upgradeFee, "fee must be equals to upgrade price"); //make sure the fee is enough for upgrade

		Card storage card = cards[_id];		
		require(card.currentExp==card.expToNextLevel, "exp is not max yet for level up"); //reject if currentexp not maxed out
		
		require(card.level < 65535, "card level maximum has reached"); //make sure level is not maxed out, although not likely
		
		require((card.criticalRate + (_criticalRateLevelUp * gemCriticalRateConversion))<=7000, "critical rate max of 70 has reached"); //make sure criticalrate is not upgraded when it reaches 70 to prevent waste

		uint totalInputGems = _attackLevelUp + _defenseLevelUp + _hpLevelUp;
		totalInputGems += _speedLevelUp + _criticalRateLevelUp + _flexiGemsLevelUp;
		
		uint16 numOfSpecials = 0;
				
		//Cater for initial high level cards but have not leveled up before
		if ((card.level > 1) && (card.attack==1) && (card.defense==1) && (card.hp==3) && (card.speed==1) && (card.criticalRate==25) && (card.flexiGems==1)) {
			numOfSpecials = (card.level+1)/5; //auto floor to indicate how many Ns for upgradeGemsSpecial; cardlevel +1 is the new level
			uint totalGems = (numOfSpecials * upgradeGemsSpecial) + (((card.level) - numOfSpecials) * upgradeGems);
			require(totalInputGems==totalGems, "upgrade gems not used up"); //must use up all gems when upgrade
		} else {
			if (((card.level+1)%5)==0) { //special gem every 5 levels
				require(totalInputGems==upgradeGemsSpecial, "upgrade gems not used up"); //must use up all gems when upgrade	
				numOfSpecials = 1;
			} else {
				require(totalInputGems==upgradeGems, "upgrade gems not used up"); //must use up all gems when upgrade
			}
		}
		
		totalDeveloperCut = totalDeveloperCut.add(upgradeFee);
		
		//start level up process
		_upgradeLevel(_id, _attackLevelUp, _defenseLevelUp, _hpLevelUp, _speedLevelUp, _criticalRateLevelUp, _flexiGemsLevelUp, numOfSpecials);
								
		emit LevelUp(_id);
	}

	function _upgradeLevel( uint256 _id,
							uint16 _attackLevelUp,
							uint16 _defenseLevelUp,
							uint16 _hpLevelUp,
							uint16 _speedLevelUp,
							uint16 _criticalRateLevelUp,
							uint16 _flexiGemsLevelUp,
							uint16 numOfSpecials) private {
		Card storage card = cards[_id];
		uint16[] memory extraStats = new uint16[](5); //attack, defense, hp, speed, flexigem
		if (numOfSpecials>0) { //special gem every 5 levels
			if (card.cardHash%100 >= 70) { //6* or 7* cards
				uint cardType = (uint(card.cardHash/10000000000))%100; //0-99
				if (cardType < 20) {
					extraStats[0]+=numOfSpecials;
				} else if (cardType < 40) {
					extraStats[1]+=numOfSpecials;
				} else if (cardType < 60) {
					extraStats[2]+=numOfSpecials;
				} else if (cardType < 80) {
					extraStats[3]+=numOfSpecials;
				} else {
					extraStats[4]+=numOfSpecials;
				}
				
				if (card.cardHash%100 >=90) { //7* cards			
					uint cardTypeInner = cardType%10; //0-9
					if (cardTypeInner < 2) {
						extraStats[0]+=numOfSpecials;
					} else if (cardTypeInner < 4) {
						extraStats[1]+=numOfSpecials;
					} else if (cardTypeInner < 6) {
						extraStats[2]+=numOfSpecials;
					} else if (cardTypeInner < 8) {
						extraStats[3]+=numOfSpecials;
					} else {
						extraStats[4]+=numOfSpecials;
					}
				}
			}
		}
		card.attack += (_attackLevelUp + extraStats[0]) * gemAttackConversion;
		card.defense += (_defenseLevelUp + extraStats[1]) * gemDefenseConversion;
		card.hp += (_hpLevelUp + extraStats[2]) * gemHpConversion;
		card.speed += (_speedLevelUp + extraStats[3]) * gemSpeedConversion;		
		card.criticalRate += uint16(_criticalRateLevelUp * gemCriticalRateConversion);
		card.flexiGems += _flexiGemsLevelUp + extraStats[4]; // turn Gem into FlexiGem
		card.level += 1; //level + 1

		card.currentExp = 0; //reset exp
		//card.expToNextLevel = card.level*100 + max(0,card.level-8) * (1045/1000)**card.level;
		uint256 tempExpLevel = card.level;
		if (tempExpLevel > expToNextLevelArr.length) {
			tempExpLevel = expToNextLevelArr.length; //cap it at max level exp
		}
		card.expToNextLevel = expToNextLevelArr[tempExpLevel];
	}

	function max(uint a, uint b) private pure returns (uint) {
		return a > b ? a : b;
	}

	function challenge( uint256 _challengerCardId,
						uint32[5] _statUp, //0-attack, 1-defense, 2-hp, 3-speed, 4-criticalrate
						uint256 _defenderCardId,						
						uint256 _defenderRank,
						uint16 _defenderLevel) external payable whenNotPaused onlyOwnerOf(_challengerCardId) {
		require(battleStart != false, "battle has not started"); //make sure the battle has started
		require(msg.sender != hogsmashToken.ownerOf(_defenderCardId), "cannot challenge own cards"); //make sure user doesn't attack his own cards
		Card storage challenger = cards[_challengerCardId];		
		require((_statUp[0] + _statUp[1] + _statUp[2] + _statUp[3] + _statUp[4])==challenger.flexiGems, "flexi gems not used up"); //flexi points must be exactly used, not more not less
		
		Card storage defender = cards[_defenderCardId];
		
		if (defender.rank != _defenderRank) {
			emit RejectChallenge(_challengerCardId, _defenderCardId, _defenderRank, 1, uint256(block.number));
			(msg.sender).transfer(msg.value);		
			return;
		}
		
		if (defender.level != _defenderLevel) {
			emit RejectChallenge(_challengerCardId, _defenderCardId, _defenderRank, 2, uint256(block.number));
			(msg.sender).transfer(msg.value);
			return;
		}
		
		uint256 requiredChallengeFee = challengeFee;
		if (defender.rank <150) { //0-149 rank within 150
			requiredChallengeFee = requiredChallengeFee.mul(2);
		}
		require(msg.value == requiredChallengeFee, "fee must be equals to challenge price"); //challenge fee to challenge defender
		
		uint256 developerFee = 0;
		if (msg.value > 0) {
			developerFee = _calculateFee(msg.value);
		}
		
		uint256[] memory stats = new uint256[](14); //challengerattack, challengerdefense, challengerhp, challengerspeed, challengercritical, defendercritical, defenderhp, finalWinner

		stats[0] = challenger.attack + (_statUp[0] * gemAttackConversion);
		stats[1] = challenger.defense + (_statUp[1] * gemDefenseConversion);
		stats[2] = challenger.hp + (_statUp[2] * gemHpConversion);
		stats[3] = challenger.speed + (_statUp[3] * gemSpeedConversion);
		stats[4] = challenger.criticalRate + (_statUp[4] * gemCriticalRateConversion);
		stats[5] = defender.criticalRate;
		stats[6] = defender.hp;
		stats[8] = challenger.hp + (_statUp[2] * gemHpConversion); //challenger hp for record purpose
		stats[9] = challenger.rank; //for looting
		stats[10] = defender.rank; //for looting
		stats[11] = 0; //tokensGained
		stats[12] = _challengerCardId;
		stats[13] = _defenderCardId;

		//check challenger critical rate
		if (stats[4]>7000) {
			stats[4] = 7000; //hard cap at 70 critical rate
		}

		//check defender critical rate
		if (stats[5]>7000) {
			stats[5] = 7000; //hard cap at 70 critical rate
		}

		// 1 - fire; 2 - water; 3 - wood;    8 - light; 9 - dark;
		if (((challenger.element-1) == defender.element) || ((challenger.element==1) && (defender.element==3)) || ((challenger.element==8) && (defender.element==9))) {
			stats[4] += 3000; //30% critical rate increase for challenger
			if (stats[4]>8000) {
				stats[4] = 8000; //hard cap at 80 critical rate for element advantage
			}
		}

		if (((defender.element-1) == challenger.element) || ((defender.element==1) && (challenger.element==3)) || ((defender.element==8) && (challenger.element==9))) {
			stats[5] += 3000; //30% critical rate increase for defender
			if (stats[5]>8000) {
				stats[5] = 8000; //hard cap at 80 critical rate for element advantage
			}
		}
		
		uint256 battleSequence = _simulateBattle(challenger, defender, stats);
		
		stats[11] = _transferFees(_challengerCardId, stats, developerFee);	
		
		
		emit BattleHistory(
			historyId,
			uint8(stats[7]),
			uint64(now),
			uint256(battleSequence),
			uint256(block.number),
			uint256(stats[11])
		);
		
		emit BattleHistoryChallenger(
			historyId,
			uint256(_challengerCardId),
			uint8(challenger.element),
			uint16(challenger.level),
			uint32(stats[0]),
			uint32(stats[1]),
			uint32(stats[8]),
			uint32(stats[3]),
			uint16(stats[4]), //pretty sure trimming down the uint won't affect the number as max is just 80000
			uint256(stats[9])
		);
			
		emit BattleHistoryDefender(	
			historyId,
			uint256(_defenderCardId),
			uint8(defender.element),
			uint16(defender.level),
			uint32(defender.attack),
			uint32(defender.defense),
			uint32(defender.hp),
			uint32(defender.speed),
			uint16(stats[5]),
			uint256(stats[10])
		);
		
		historyId = historyId.add(1); //add one for next history
	}
	
	function _addBattleSequence(uint8 attackType, uint8 rounds, uint256 battleSequence) private pure returns (uint256) {
		// Assumed rounds 0-based; attackType is 0xB (B:0,1,2,3), i.e. the last 2 bits is the value with other bits zeros
		uint256 mask = 0x3;
		mask = ~(mask << 2*rounds);
		uint256 newSeq = battleSequence & mask;

		newSeq = newSeq | (uint256(attackType) << 2*rounds);

		return newSeq;
	}


	function _simulateBattle(Card storage challenger, Card storage defender, uint[] memory stats) private returns (uint256 battleSequence) {
	
		bool continueBattle = true;
		uint8 currentAttacker = 0; //0 challenger, 1 defender
		uint256 tempAttackStrength;
		uint8 battleRound = 0;
		if (!_isChallengerAttackFirst(stats[3], defender.speed)){
			currentAttacker = 1;
		}
		while (continueBattle) {
			if (currentAttacker==0) { //challenger attack
				if (_rollCriticalDice() <= stats[4]){
					tempAttackStrength = stats[0] * 2; //critical hit
					battleSequence = _addBattleSequence(2, battleRound, battleSequence); //move sequence to left and add record
				} else {
					tempAttackStrength = stats[0]; //normal hit
					battleSequence = _addBattleSequence(0, battleRound, battleSequence); //move sequence to left and add record
				}
				if (tempAttackStrength <= defender.defense) {
					tempAttackStrength = 1; //at least deduct 1 hp
				} else {
					tempAttackStrength -= defender.defense;
				}
				if (stats[6] <= tempAttackStrength) {
					stats[6] = 0; //do not let it overflow
				} else {
					stats[6] -= tempAttackStrength; //defender hp
				}
				currentAttacker = 1; //defender turn up next
			} else if (currentAttacker==1) { //defender attack
				if (_rollCriticalDice() <= stats[5]){
					tempAttackStrength = defender.attack * 2; //critical hit
					battleSequence = _addBattleSequence(3, battleRound, battleSequence); //move sequence to left and add record
				} else {
					tempAttackStrength = defender.attack; //normal hit
					battleSequence = _addBattleSequence(1, battleRound, battleSequence); //move sequence to left and add record
				}
				if (tempAttackStrength <= stats[1]) {
					tempAttackStrength = 1; //at least deduct 1 hp
				} else {
					tempAttackStrength -= stats[1];
				}
				if (stats[2] <= tempAttackStrength) {
					stats[2] = 0; //do not let it overflow
				} else {
					stats[2] -= tempAttackStrength; //challenger hp
				}
				currentAttacker = 0; //challenger turn up next
			}
			battleRound ++;

			if ((battleRound>=maxBattleRounds) || (stats[6]<=0) || (stats[2]<=0)){
				continueBattle = false; //end battle
			}
		}

		uint32 challengerGainExp = 0;
		uint32 defenderGainExp = 0;

		//calculate Exp
		if (challenger.level == defender.level) { //challenging a same level card
			challengerGainExp = activeWinExp[10];
		} else if (challenger.level > defender.level) { //challenging a lower level card
			if ((challenger.level - defender.level) >= 11) {
				challengerGainExp = 1; //defender too weak, grant only 1 exp
			} else {
				//challengerGainExp = (((1 + ((defender.level - challenger.level)/10))**2) + (1/10)) * baseExp;
				challengerGainExp = activeWinExp[10 + defender.level - challenger.level]; //0 - 9
			}
		} else if (challenger.level < defender.level) { //challenging a higher level card
			//challengerGainExp = ((1 + ((defender.level - challenger.level)/10)**(3/2))) * baseExp;
			uint256 levelDiff = defender.level - challenger.level;
			if (levelDiff > 20) {
				levelDiff = 20; //limit level difference to 20 as max exp gain
			}
			challengerGainExp = activeWinExp[10+levelDiff];
		}
		
		if (stats[2] == stats[6]) { //challenger hp = defender hp
			stats[7] = 2; //draw
			//No EXP when draw
		} else if (stats[2] > stats[6]) { //challenger hp > defender hp
			stats[7] = 0; //challenger wins
			if (defender.rank < challenger.rank) { //swap ranks
				ranking[defender.rank] = stats[12]; //update ranking table position
				ranking[challenger.rank] = stats[13]; //update ranking table position
				uint256 tempRank = defender.rank;
				defender.rank = challenger.rank; //update rank on card
				challenger.rank = tempRank; //update rank on card
			}

			//award Exp
			//active win
			challenger.currentExp += challengerGainExp;
			if (challenger.currentExp > challenger.expToNextLevel) {
				challenger.currentExp = challenger.expToNextLevel; //cap it at max exp for level up
			}

			//passive lose
			//defenderGainExp = challengerGainExp*35/100*30/100 + (5/10);
			defenderGainExp = ((challengerGainExp*105/100) + 5)/10; // 30% of 35% + round up
			if (defenderGainExp <= 0) {
				defenderGainExp = 1; //at least 1 Exp
			}
			defender.currentExp += defenderGainExp;
			if (defender.currentExp > defender.expToNextLevel) {
				defender.currentExp = defender.expToNextLevel; //cap it at max exp for level up
			}

		} else if (stats[6] > stats[2]) { //defender hp > challenger hp
			stats[7] = 1; //defender wins
			//award Exp
			//active lose
			uint32 tempChallengerGain = challengerGainExp*35/100; //35% of winning
			if (tempChallengerGain <= 0) {
				tempChallengerGain = 1; //at least 1 Exp
			}
			challenger.currentExp += tempChallengerGain; //35% of winning
			if (challenger.currentExp > challenger.expToNextLevel) {
				challenger.currentExp = challenger.expToNextLevel; //cap it at max exp for level up
			}

			//passive win
			defenderGainExp = challengerGainExp*30/100;
			if (defenderGainExp <= 0) {
				defenderGainExp = 1; //at least 1 Exp
			}
			defender.currentExp += defenderGainExp;
			if (defender.currentExp > defender.expToNextLevel) {
				defender.currentExp = defender.expToNextLevel; //cap it at max exp for level up
			}
		}
		
		return battleSequence;
	}
	
	
	
	function _transferFees(uint256 _challengerCardId, uint[] stats, uint256 developerFee) private returns (uint256 totalGained) {
		totalDeveloperCut = totalDeveloperCut.add(developerFee);		
		uint256 remainFee = msg.value.sub(developerFee); //minus developer fee
		totalGained = 0;
		if (stats[7] == 1) { //challenger loses			
			// put all of challenger fee in rankTokens (minus developerfee of course)			
			rankTokens[stats[10]] = rankTokens[stats[10]].add(remainFee);
			totalRankTokens = totalRankTokens.add(remainFee);
		} else { //draw or challenger wins
			address challengerAddress = hogsmashToken.ownerOf(_challengerCardId); //get address of card owner
			if (stats[7] == 0) { //challenger wins				
				if (stats[9] > stats[10]) { //challenging a higher ranking defender					
					//1. get tokens from defender rank if defender rank is higher
					if (rankTokens[stats[10]] > 0) {
						totalGained = totalGained.add(rankTokens[stats[10]]);
						totalRankTokens = totalRankTokens.sub(rankTokens[stats[10]]);
						rankTokens[stats[10]] = 0;						
					}
					//2. get self rank tokens if moved to higher rank
					if (rankTokens[stats[9]] > 0) {
						totalGained = totalGained.add(rankTokens[stats[9]]);
						totalRankTokens = totalRankTokens.sub(rankTokens[stats[9]]);
						rankTokens[stats[9]] = 0;
					}					
				} else { //challenging a lower ranking defender					
					if (stats[9]<50) { //rank 1-50 gets to get self rank tokens and lower rank (within 150) tokens if win
						if ((stats[10] < 150) && (rankTokens[stats[10]] > 0)) { // can get defender rank tokens if defender rank within top 150 (0-149)
							totalGained = totalGained.add(rankTokens[stats[10]]);
							totalRankTokens = totalRankTokens.sub(rankTokens[stats[10]]);
							rankTokens[stats[10]] = 0;
						}
						
						if ((stats[10] < 150) && (rankTokens[stats[9]] > 0)) { //can get self rank tokens if defender rank within top 150
							totalGained = totalGained.add(rankTokens[stats[9]]);
							totalRankTokens = totalRankTokens.sub(rankTokens[stats[9]]);
							rankTokens[stats[9]] = 0;
						}
					}
				}
				challengerAddress.transfer(totalGained.add(remainFee)); //give back challenge fee untouched + total gained				
			} else { //draw
				challengerAddress.transfer(remainFee); //give back challenge fee untouched
			} 
		}			
	}
	

	function _rollCriticalDice() private returns (uint16 result){
		return uint16((getRandom() % 10000) + 1); //get 1 to 10000
	}

	function _isChallengerAttackFirst(uint _challengerSpeed, uint _defenderSpeed ) private returns (bool){
		uint8 randResult = uint8((getRandom() % 100) + 1); //get 1 to 100
		uint challengerChance = (((_challengerSpeed * 10 ** 3) / (_challengerSpeed + _defenderSpeed))+5) / 10;//round
		if (randResult <= challengerChance) {
			return true;
		} else {
			return false;
		}
	}

	
	/// @dev function to buy starter package, with card and tokens directly from contract
	function buyStarterPack() external payable whenNotPaused returns (uint256){
		require(starterPackOnSale==true, "starter pack is not on sale");
		require(msg.value==starterPackPrice, "fee must be equals to starter pack price");
		require(address(marketplace) != address(0), "marketplace not set"); //need to set up marketplace before drafting new cards is allowed
		
		totalDeveloperCut = totalDeveloperCut.add(starterPackPrice);
				
		hogsmashToken.setApprovalForAllByContract(msg.sender, marketplace, true); //let marketplace have approval for escrow if the card goes on sale
		
		return _createCard(msg.sender, starterPackCardLevel); //level n cards
	}
		
	/**
	* @dev Create card function
	* @param _to The address that will own the minted card
	* @param _initLevel The level to start with, usually 1
	* @return uint256 ID of the new card
	*/
	function _createCard(address _to, uint16 _initLevel) private returns (uint256) {
		require(_to != address(0), "cannot create card for unknown address"); //check if address is not 0 (the origin address)

		currentElement+= 1;
		if (currentElement==4) {
			currentElement = 8;
		}
		if (currentElement == 10) {
			currentElement = 1;
		}
		uint256 tempExpLevel = _initLevel;
		if (tempExpLevel > expToNextLevelArr.length) {
			tempExpLevel = expToNextLevelArr.length; //cap it at max level exp
		}
		
		uint32 tempCurrentExp = 0;
		if (_initLevel>1) { //let exp max out so that user can level up the card according to preference
			tempCurrentExp = expToNextLevelArr[tempExpLevel];
		}
		
		uint256 tokenId = hogsmashToken.mint(_to);
		
		// use memory as this is a temporary variable, cheaper and will not be stored since cards store all of them
		Card memory _card = Card({
			element: currentElement, // 1 - fire; 2 - water; 3 - wood;    8 - light; 9 - dark;
			level: _initLevel, // level
			attack: 1, // attack,
			defense: 1, // defense,
			hp: 3, // hp,
			speed: 1, // speed,
			criticalRate: 25, // criticalRate
			flexiGems: 1, // flexiGems,
			currentExp: tempCurrentExp, // currentExp,
			expToNextLevel: expToNextLevelArr[tempExpLevel], // expToNextLevel,
			cardHash: generateHash(),
			createdDatetime :uint64(now),
			rank: tokenId // rank
		});
		
		cards[tokenId] = _card;
		ranking.push(tokenId); //push to ranking mapping
		
		emit CardCreated(msg.sender, tokenId);

		return tokenId;
	}
	
	function generateHash() private returns (uint256 hash){
		hash = uint256((getRandom()%1000000000000)/10000000000);		
		hash = hash.mul(10000000000);
		
		uint256 tempHash = ((getRandom()%(eventCardRangeMax-eventCardRangeMin+1))+eventCardRangeMin)*100;
		hash = hash.add(tempHash);
		
		tempHash = getRandom()%100;
		
		if (tempHash < goldPercentage) {
			hash = hash.add(90);
		} else if (tempHash < (goldPercentage+silverPercentage)) {
			hash = hash.add(70);
		} else {
			hash = hash.add(50);
		}
	}
	
	/// @dev function to update avatar hash 
	function updateAvatar(uint256 _cardId, uint256 avatarHash) external payable whenNotPaused onlyOwnerOf(_cardId) {
		require(msg.value==avatarFee, "fee must be equals to avatar price");
				
		Card storage card = cards[_cardId];
		
		uint256 tempHash = card.cardHash%1000000000000; //retain hash fixed section
		
		card.cardHash = tempHash.add(avatarHash.mul(1000000000000));
		
		emit HashUpdated(_cardId, card.cardHash);		
	}
		
	
	/// @dev Compute developer's fee
	/// @param _challengeFee - transaction fee
	function _calculateFee(uint256 _challengeFee) internal view returns (uint256) {
		return developerCut.mul(_challengeFee/10000);
	}
	
	
	/***********************************************************************************/
	/* ADMIN FUNCTIONS
	/***********************************************************************************/	
	/**
	* @dev External function for drafting new card for Owner, for promotional purposes
	* @param _cardLevel initial level of card created, must be less or equals to 20
	* @return uint of cardId
	*/
	function generateInitialCard(uint16 _cardLevel) external whenNotPaused onlyOwner returns (uint256) {
		require(address(marketplace) != address(0), "marketplace not set"); //need to set up marketplace before drafting new cards is allowed
		require(_cardLevel<=20, "maximum level cannot exceed 20"); //set maximum level at 20 that Owner can generate
		
		hogsmashToken.setApprovalForAllByContract(msg.sender, marketplace, true); //let marketplace have approval for escrow if the card goes on sale

		return _createCard(msg.sender, _cardLevel); //level 1 cards
	}
	
	/// @dev Function for contract owner to put tokens into ranks for events
	function distributeTokensToRank(uint[] ranks, uint256 tokensPerRank) external payable onlyOwner {
		require(msg.value == (tokensPerRank*ranks.length), "tokens must be enough to distribute among ranks");
		uint i;
		for (i=0; i<ranks.length; i++) {
			rankTokens[ranks[i]] = rankTokens[ranks[i]].add(tokensPerRank);
			totalRankTokens = totalRankTokens.add(tokensPerRank);
		}
	}
	
	
	// @dev Allows contract owner to withdraw the all developer cut from the contract
	function withdrawBalance() external onlyOwner {
		address thisAddress = this;
		uint256 balance = thisAddress.balance;
		uint256 withdrawalSum = totalDeveloperCut;

		if (balance >= withdrawalSum) {
			totalDeveloperCut = 0;
			owner.transfer(withdrawalSum);
		}
	}
}

/***********************************************************************************/
/* INTERFACES
/***********************************************************************************/
interface Marketplace {
	function isMarketplace() external returns (bool);
}

interface HogSmashToken {
	function ownerOf(uint256 _tokenId) external view returns (address);
	function balanceOf(address _owner) external view returns (uint256);
	function tokensOf(address _owner) external view returns (uint256[]);
	function mint(address _to) external returns (uint256 _tokenId);
	function setTokenURI(uint256 _tokenId, string _uri) external;
	function setApprovalForAllByContract(address _sender, address _to, bool _approved) external;
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"gemCriticalRateConversion","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"upgradeGems","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"challengeFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_upgradeGems","type":"uint8"},{"name":"_upgradeGemsSpecial","type":"uint8"},{"name":"_gemAttackConversion","type":"uint16"},{"name":"_gemDefenseConversion","type":"uint16"},{"name":"_gemHpConversion","type":"uint16"},{"name":"_gemSpeedConversion","type":"uint16"},{"name":"_gemCriticalRateConversion","type":"uint16"},{"name":"_goldPercentage","type":"uint8"},{"name":"_silverPercentage","type":"uint8"},{"name":"_eventCardRangeMin","type":"uint32"},{"name":"_eventCardRangeMax","type":"uint32"},{"name":"_newMaxBattleRounds","type":"uint8"}],"name":"setSettingValues","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_attackLevelUp","type":"uint16"},{"name":"_defenseLevelUp","type":"uint16"},{"name":"_hpLevelUp","type":"uint16"},{"name":"_speedLevelUp","type":"uint16"},{"name":"_criticalRateLevelUp","type":"uint16"},{"name":"_flexiGemsLevelUp","type":"uint16"}],"name":"levelUp","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDeveloperCut","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"starterPackCardLevel","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newChallengeFee","type":"uint256"}],"name":"setChallengeFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxBattleRounds","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradeFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"ranks","type":"uint256[]"},{"name":"tokensPerRank","type":"uint256"}],"name":"distributeTokensToRank","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newCardDrawPrice","type":"uint256"}],"name":"setCardDrawPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"eventCardRangeMax","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newStarterPackPrice","type":"uint256"},{"name":"_newStarterPackCardLevel","type":"uint16"}],"name":"setStarterPack","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"starterPackPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gemAttackConversion","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_challengerCardId","type":"uint256"},{"name":"_statUp","type":"uint32[5]"},{"name":"_defenderCardId","type":"uint256"},{"name":"_defenderRank","type":"uint256"},{"name":"_defenderLevel","type":"uint16"}],"name":"challenge","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"gemSpeedConversion","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"rankTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newStarterPackOnSale","type":"bool"}],"name":"setStarterPackOnSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hogsmashToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"upgradeGemsSpecial","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"referrerFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cardId","type":"uint256"},{"name":"avatarHash","type":"uint256"}],"name":"updateAvatar","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newBattleStart","type":"bool"}],"name":"setBattleStart","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"silverPercentage","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalRankTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"cards","outputs":[{"name":"element","type":"uint8"},{"name":"level","type":"uint16"},{"name":"attack","type":"uint32"},{"name":"defense","type":"uint32"},{"name":"hp","type":"uint32"},{"name":"speed","type":"uint32"},{"name":"criticalRate","type":"uint16"},{"name":"flexiGems","type":"uint32"},{"name":"cardHash","type":"uint256"},{"name":"currentExp","type":"uint32"},{"name":"expToNextLevel","type":"uint32"},{"name":"createdDatetime","type":"uint64"},{"name":"rank","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rank","type":"uint256"}],"name":"getCardIdByRank","outputs":[{"name":"cardId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getCard","outputs":[{"name":"cardId","type":"uint256"},{"name":"owner","type":"address"},{"name":"element","type":"uint8"},{"name":"level","type":"uint16"},{"name":"stats","type":"uint32[]"},{"name":"currentExp","type":"uint32"},{"name":"expToNextLevel","type":"uint32"},{"name":"cardHash","type":"uint256"},{"name":"createdDatetime","type":"uint64"},{"name":"rank","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"draftNewCard","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"cardDrawPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gemHpConversion","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"referrer","type":"address"}],"name":"draftNewCardWithReferrer","outputs":[{"name":"cardId","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_cardLevel","type":"uint16"}],"name":"generateInitialCard","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"marketplace","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setMarketplaceAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAvatarFee","type":"uint256"}],"name":"setAvatarFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newUpgradeFee","type":"uint256"}],"name":"setUpgradeFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gemDefenseConversion","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"historyId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"goldPercentage","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentElement","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"eventCardRangeMin","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"developerCut","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"buyStarterPack","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newDeveloperCut","type":"uint256"}],"name":"setDeveloperCut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newReferrerFee","type":"uint256"}],"name":"setReferrerFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"avatarFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSettingValues","outputs":[{"name":"_upgradeGems","type":"uint8"},{"name":"_upgradeGemsSpecial","type":"uint8"},{"name":"_gemAttackConversion","type":"uint16"},{"name":"_gemDefenseConversion","type":"uint16"},{"name":"_gemHpConversion","type":"uint16"},{"name":"_gemSpeedConversion","type":"uint16"},{"name":"_gemCriticalRateConversion","type":"uint16"},{"name":"_maxBattleRounds","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_tokenAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"historyId","type":"uint256"},{"indexed":false,"name":"winner","type":"uint8"},{"indexed":false,"name":"battleTime","type":"uint64"},{"indexed":false,"name":"sequence","type":"uint256"},{"indexed":false,"name":"blockNumber","type":"uint256"},{"indexed":false,"name":"tokensGained","type":"uint256"}],"name":"BattleHistory","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"historyId","type":"uint256"},{"indexed":false,"name":"cardId","type":"uint256"},{"indexed":false,"name":"element","type":"uint8"},{"indexed":false,"name":"level","type":"uint16"},{"indexed":false,"name":"attack","type":"uint32"},{"indexed":false,"name":"defense","type":"uint32"},{"indexed":false,"name":"hp","type":"uint32"},{"indexed":false,"name":"speed","type":"uint32"},{"indexed":false,"name":"criticalRate","type":"uint32"},{"indexed":false,"name":"rank","type":"uint256"}],"name":"BattleHistoryChallenger","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"historyId","type":"uint256"},{"indexed":false,"name":"cardId","type":"uint256"},{"indexed":false,"name":"element","type":"uint8"},{"indexed":false,"name":"level","type":"uint16"},{"indexed":false,"name":"attack","type":"uint32"},{"indexed":false,"name":"defense","type":"uint32"},{"indexed":false,"name":"hp","type":"uint32"},{"indexed":false,"name":"speed","type":"uint32"},{"indexed":false,"name":"criticalRate","type":"uint16"},{"indexed":false,"name":"rank","type":"uint256"}],"name":"BattleHistoryDefender","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"challengerId","type":"uint256"},{"indexed":false,"name":"defenderId","type":"uint256"},{"indexed":false,"name":"defenderRank","type":"uint256"},{"indexed":false,"name":"rejectCode","type":"uint8"},{"indexed":false,"name":"blockNumber","type":"uint256"}],"name":"RejectChallenge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"cardId","type":"uint256"},{"indexed":false,"name":"cardHash","type":"uint256"}],"name":"HashUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"cardId","type":"uint256"}],"name":"LevelUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"cardId","type":"uint256"}],"name":"CardCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

610d0060405260006080908152606760a081905260c05260cf60e08190526101008190526101205261019e6101408190526101608190526101808190526101a0526102d46101c08190526101e08190526102005261033c610220819052610240526103a36102608190526102805261040b6102a08190526102c0526104726102e0819052610300526104da61032081905261034052610541610360819052610380526105a96103a08190526103c0526106106103e081905261040052610678610420819052610440526106df610460819052610480526107476104a08190526104c0526107ae6104e0819052610500526108166105208190526105405261087d6105608190526105808190526105a0526108e56105c08190526105e05261094c610600819052610620526109b461064081905261066052610a1b6106808190526106a052610a836106c08190526106e052610aea61070081905261072052610b5261074081905261076052610bb96107808190526107a052610c216107c08190526107e052610c8861080081905261082052610cf061084081905261086052610d576108808190526108a052610dbf6108c08190526108e052610e2661090081905261092081905261094052610e8e61096081905261098052610ef56109a08190526109c052610f5d6109e0819052610a0052610fc4610a20819052610a405261102c610a60819052610a8052611093610aa0819052610ac0526110fb610ae0819052610b0052611162610b20819052610b40526111ca610b60819052610b8052611231610ba0819052610bc052611299610be0819052610c0052611300610c20819052610c4052611368610c60819052610c80526113cf610ca0819052610cc052611437610ce052620002989060019060646200048f565b50604080516103e081018252600a8152600b6020820152600e9181019190915260136060820152601a6080820152602360a0820152602e60c0820152603b60e0820152604a610100820152605b61012082015260646101408201526067610160820152606c61018082015260746101a0820152607d6101c082015260876101e08201526092610200820152609e61022082015260ab61024082015260b961026082015260c861028082015260d76102a082015260e76102c082015260f86102e082015261010961030082015261011b61032082015261012e6103408201526101416103608201526101556103808201526101696103a082015261017e6103c0820152620003aa90600290601f6200048f565b506006805460ff19908116909155600060075543601655601780549091169055348015620003d757600080fd5b5060405160208062005668833981016040525160008054600160a060020a03199081163317825560088054600160a060020a039094169390911692909217909155666a94d74f4300006014556015805461ffff1916600517905560138054662386f26fc10000600a819055600b5566b1a2bc2ec50000600c55610177600e556107d0600d5566354a6ba7a1800060105560ff1961ff0019909116610100178116600117909155601780549091169055600f556200056a565b82805482825590600052602060002090600701600890048101928215620005315791602002820160005b83821115620004fd57835183826101000a81548163ffffffff021916908361ffff1602179055509260200192600401602081600301049283019260010302620004b9565b80156200052f5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620004fd565b505b506200053f92915062000543565b5090565b6200056791905b808211156200053f57805463ffffffff191681556001016200054a565b90565b6150ee806200057a6000396000f3006080604052600436106102845763ffffffff60e060020a60003504166301d5c48881146102895780630f0308fb146102b55780631bd8f9ca146102e05780631c70362c1461030757806329aec173146103725780632d06fd13146103a25780632ed73df6146103b757806335bf82f6146103cc5780633d82cf5a146103e45780633f4ba83a146103f957806340fa61f71461040e5780634341aebc1461042357806344d1a9ae1461043a5780634cd7699a14610452578063570200c0146104805780635c714e901461049f5780635c7b0288146104b45780635c975abb146104c95780635cc236ce146104f25780635f96d9fa1461050d5780635fd8c7101461052257806360e71f2f14610537578063682bc77e1461054f5780636a30eb24146105695780636e6b80041461059a5780636e88a7bd146105af5780637a70abda146105c4578063809ae91e146105d25780638456cb59146105ec5780638911cd9a146106015780638b6715cd146106165780638da5cb5b1461062b5780638dc10768146106405780639070222e146106e05780639188d312146106f8578063923ce65f146107ef57806393af339f146107f75780639cd0126a1461080c5780639f91d14514610821578063a14cf39414610835578063abc8c7af14610851578063b47cc55614610866578063b61cb05814610887578063bae18ac31461089f578063c0ba6adf146108b7578063cd2d8a2d146108cc578063d08e2354146108e1578063d127bb9d146108f6578063d77ff9ea1461090b578063e72fd4e114610920578063f114572714610935578063f2fde38b1461093d578063f6cf3a7d1461095e578063f81a95db14610976578063f945ba2d1461098e578063fefd336c146109a3575b600080fd5b34801561029557600080fd5b5061029e610a09565b6040805161ffff9092168252519081900360200190f35b3480156102c157600080fd5b506102ca610a21565b6040805160ff9092168252519081900360200190f35b3480156102ec57600080fd5b506102f5610a2a565b60408051918252519081900360200190f35b34801561031357600080fd5b5061037060ff60043581169060243581169061ffff60443581169160643582169160843581169160a43582169160c435169060e4358116906101043581169063ffffffff6101243581169161014435909116906101643516610a30565b005b61037060043561ffff60243581169060443581169060643581169060843581169060a43581169060c43516610d2a565b3480156103ae57600080fd5b506102f56113c3565b3480156103c357600080fd5b5061029e6113e2565b3480156103d857600080fd5b506103706004356113ec565b3480156103f057600080fd5b506102ca611408565b34801561040557600080fd5b5061037061142b565b34801561041a57600080fd5b506102f5611488565b61037060246004803582810192910135903561148e565b34801561044657600080fd5b506103706004356115b8565b34801561045e57600080fd5b506104676115d4565b6040805163ffffffff9092168252519081900360200190f35b34801561048c57600080fd5b5061037060043561ffff602435166115f6565b3480156104ab57600080fd5b506102f56116ad565b3480156104c057600080fd5b5061029e6116b3565b3480156104d557600080fd5b506104de6116c3565b604080519115158252519081900360200190f35b610370600435602460c43560e43561ffff61010435166116cc565b34801561051957600080fd5b5061029e612410565b34801561052e57600080fd5b50610370612426565b34801561054357600080fd5b506102f5600435612497565b34801561055b57600080fd5b5061037060043515156124a9565b34801561057557600080fd5b5061057e6124da565b60408051600160a060020a039092168252519081900360200190f35b3480156105a657600080fd5b506102ca6124e9565b3480156105bb57600080fd5b506102f56124f7565b6103706004356024356124fd565b3480156105de57600080fd5b5061037060043515156126fe565b3480156105f857600080fd5b50610370612728565b34801561060d57600080fd5b506102ca612787565b34801561062257600080fd5b506102f56127a1565b34801561063757600080fd5b5061057e6127a7565b34801561064c57600080fd5b506106586004356127b6565b6040805160ff909e168e5261ffff9c8d1660208f015263ffffffff9b8c168e820152998b1660608e0152978a1660808d015295891660a08c01529390981660c08a015290861660e08901526101008801529484166101208701529390921661014085015267ffffffffffffffff90921661016084015261018083015251908190036101a00190f35b3480156106ec57600080fd5b506102f5600435612870565b34801561070457600080fd5b50610710600435612893565b604051808b81526020018a600160a060020a0316600160a060020a031681526020018960ff1660ff1681526020018861ffff1661ffff168152602001806020018763ffffffff1663ffffffff1681526020018663ffffffff1663ffffffff1681526020018581526020018467ffffffffffffffff1667ffffffffffffffff168152602001838152602001828103825288818151815260200191508051906020019060200280838360005b838110156107d25781810151838201526020016107ba565b505050509050019b50505050505050505050505060405180910390f35b6102f5612b01565b34801561080357600080fd5b506102f5612c5f565b34801561081857600080fd5b5061029e612c65565b6102f5600160a060020a0360043516612c79565b34801561084157600080fd5b506102f561ffff60043516612fb6565b34801561085d57600080fd5b5061057e613116565b34801561087257600080fd5b50610370600160a060020a0360043516613125565b34801561089357600080fd5b50610370600435613230565b3480156108ab57600080fd5b5061037060043561324c565b3480156108c357600080fd5b5061029e613268565b3480156108d857600080fd5b506102f561327a565b3480156108ed57600080fd5b506102ca613280565b34801561090257600080fd5b506102ca613299565b34801561091757600080fd5b506104676132a2565b34801561092c57600080fd5b506102f56132c0565b6102f56132c6565b34801561094957600080fd5b50610370600160a060020a03600435166134b0565b34801561096a57600080fd5b50610370600435613544565b34801561098257600080fd5b50610370600435613560565b34801561099a57600080fd5b506102f561357c565b3480156109af57600080fd5b506109b8613582565b6040805160ff998a168152978916602089015261ffff968716888201529486166060880152928516608087015290841660a086015290921660c0840152921660e08201529051908190036101000190f35b6011546a0100000000000000000000900461ffff1681565b60115460ff1681565b600a5481565b600054600160a060020a03163314610a4757600080fd5b63ffffffff8084169083161015610ace576040805160e560020a62461bcd02815260206004820152602c60248201527f72616e6765206d6178206d757374206265206c6172676572206f72206571756160448201527f6c732072616e6765206d696e0000000000000000000000000000000000000000606482015290519081900360840190fd5b6305f5e10063ffffffff831610610b2f576040805160e560020a62461bcd02815260206004820181905260248201527f72616e6765206d61782063616e6e6f7420657863656564203939393939393939604482015290519081900360640190fd5b60808160ff1611158015610b46575060008160ff16115b1515610bc2576040805160e560020a62461bcd02815260206004820152602760248201527f626174746c6520726f756e6473206d757374206265206265747765656e20302060448201527f616e642031323800000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8b601160006101000a81548160ff021916908360ff1602179055508a601160016101000a81548160ff021916908360ff16021790555089601160026101000a81548161ffff021916908361ffff16021790555088601160046101000a81548161ffff021916908361ffff16021790555087601160066101000a81548161ffff021916908361ffff16021790555086601160086101000a81548161ffff021916908361ffff160217905550856011600a6101000a81548161ffff021916908361ffff160217905550846011600c6101000a81548160ff021916908360ff160217905550836011600d6101000a81548160ff021916908360ff160217905550826011600e6101000a81548163ffffffff021916908363ffffffff16021790555081601160126101000a81548163ffffffff021916908363ffffffff16021790555080601160166101000a81548160ff021916908360ff160217905550505050505050505050505050565b60175460009081908190819060ff1615610d4357600080fd5b6008546040805160e160020a6331a9108f028152600481018e905290518d923392600160a060020a0390911691636352211e916024808201926020929091908290030181600087803b158015610d9857600080fd5b505af1158015610dac573d6000803e3d6000fd5b505050506040513d6020811015610dc257600080fd5b5051600160a060020a031614610e22576040805160e560020a62461bcd02815260206004820152601660248201527f6d757374206265206f776e6572206f6620746f6b656e00000000000000000000604482015290519081900360640190fd5b60008b61ffff1610158015610e3c575060008a61ffff1610155b8015610e4d575060008961ffff1610155b8015610e5e575060008861ffff1610155b8015610e6f575060008761ffff1610155b8015610e80575060008661ffff1610155b1515610efc576040805160e560020a62461bcd02815260206004820152602760248201527f6c6576656c2075702061747472696275746573206d757374206265206d6f726560448201527f207468616e203000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b543414610f7b576040805160e560020a62461bcd02815260206004820152602360248201527f666565206d75737420626520657175616c7320746f207570677261646520707260448201527f6963650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008c8152600360205260409020600281015490955063ffffffff8082166401000000009092041614610ff8576040805160e560020a62461bcd02815260206004820152601f60248201527f657870206973206e6f74206d61782079657420666f72206c6576656c20757000604482015290519081900360640190fd5b845461ffff61010090910481161061105a576040805160e560020a62461bcd02815260206004820152601e60248201527f63617264206c6576656c206d6178696d756d2068617320726561636865640000604482015290519081900360640190fd5b6011548554611b586a010000000000000000000090920461ffff9081168a02609860020a909204811691909101161115611104576040805160e560020a62461bcd02815260206004820152602360248201527f637269746963616c2072617465206d6178206f6620373020686173207265616360448201527f6865640000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8454888801870161ffff9081168d8d018c01821601955060009450600161010090920416118015611143575084546301000000900463ffffffff166001145b801561116157508454670100000000000000900463ffffffff166001145b8015611183575084546b010000000000000000000000900463ffffffff166003145b80156111a9575084546f01000000000000000000000000000000900463ffffffff166001145b80156111c157508454609860020a900461ffff166019145b80156111db5750845460a860020a900463ffffffff166001145b15611273578454601154600561ffff61010093849004811660018101821692909204965092820460ff9081168702918790039216919091020116915083821461126e576040805160e560020a62461bcd02815260206004820152601860248201527f757067726164652067656d73206e6f7420757365642075700000000000000000604482015290519081900360640190fd5b61135a565b845460059061ffff6101009091048116600101160661ffff16600014156112fe57601154610100900460ff1684146112f5576040805160e560020a62461bcd02815260206004820152601860248201527f757067726164652067656d73206e6f7420757365642075700000000000000000604482015290519081900360640190fd5b6001925061135a565b60115460ff16841461135a576040805160e560020a62461bcd02815260206004820152601860248201527f757067726164652067656d73206e6f7420757365642075700000000000000000604482015290519081900360640190fd5b600b54600f5461136f9163ffffffff6135f516565b600f556113828c8c8c8c8c8c8c8a613602565b604080518d815290517f6a1b6f91db361bdf7356d3942ed64f2ee2fea430979dbba7ea23f44e8b2110079181900360200190a1505050505050505050505050565b60008054600160a060020a031633146113db57600080fd5b50600f5490565b60155461ffff1681565b600054600160a060020a0316331461140357600080fd5b600a55565b601154760100000000000000000000000000000000000000000000900460ff1681565b600054600160a060020a0316331461144257600080fd5b60175460ff16151561145357600080fd5b6017805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b600b5481565b60008054600160a060020a031633146114a657600080fd5b3482840214611525576040805160e560020a62461bcd02815260206004820152602f60248201527f746f6b656e73206d75737420626520656e6f75676820746f206469737472696260448201527f75746520616d6f6e672072616e6b730000000000000000000000000000000000606482015290519081900360840190fd5b5060005b828110156115b257611569826005600087878681811061154557fe5b905060200201358152602001908152602001600020546135f590919063ffffffff16565b6005600086868581811061157957fe5b905060200201358152602001908152602001600020819055506115a7826012546135f590919063ffffffff16565b601255600101611529565b50505050565b600054600160a060020a031633146115cf57600080fd5b601055565b6011547201000000000000000000000000000000000000900463ffffffff1681565b600054600160a060020a0316331461160d57600080fd5b601461ffff82161115611690576040805160e560020a62461bcd02815260206004820152602360248201527f73746172746572207061636b206c6576656c2063616e6e6f742065786365656460448201527f2032300000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6014919091556015805461ffff191661ffff909216919091179055565b60145481565b60115462010000900461ffff1681565b60175460ff1681565b601754600090819081908190606090829060ff16156116ea57600080fd5b6008546040805160e160020a6331a9108f028152600481018e905290518d923392600160a060020a0390911691636352211e916024808201926020929091908290030181600087803b15801561173f57600080fd5b505af1158015611753573d6000803e3d6000fd5b505050506040513d602081101561176957600080fd5b5051600160a060020a0316146117c9576040805160e560020a62461bcd02815260206004820152601660248201527f6d757374206265206f776e6572206f6620746f6b656e00000000000000000000604482015290519081900360640190fd5b60135460ff161515611825576040805160e560020a62461bcd02815260206004820152601660248201527f626174746c6520686173206e6f74207374617274656400000000000000000000604482015290519081900360640190fd5b6008546040805160e160020a6331a9108f028152600481018d90529051600160a060020a0390921691636352211e916024808201926020929091908290030181600087803b15801561187657600080fd5b505af115801561188a573d6000803e3d6000fd5b505050506040513d60208110156118a057600080fd5b5051600160a060020a0316331415611902576040805160e560020a62461bcd02815260206004820152601a60248201527f63616e6e6f74206368616c6c656e6765206f776e206361726473000000000000604482015290519081900360640190fd5b60008c8152600360205260409020805490975060a860020a900463ffffffff168b6004602002013563ffffffff168c600360058110151561193f57fe5b602002013563ffffffff168d600260058110151561195957fe5b602002013563ffffffff168e600160058110151561197357fe5b602002013563ffffffff168f600060058110151561198d57fe5b602002013563ffffffff160101010163ffffffff161415156119f9576040805160e560020a62461bcd02815260206004820152601660248201527f666c6578692067656d73206e6f74207573656420757000000000000000000000604482015290519081900360640190fd5b60008a8152600360208190526040909120908101549096508914611a9657604080518d8152602081018c90528082018b90526001606082015243608082015290517faf2d0f76f81104661d314f5e65f3eb5d70d9bd6112c30547b2720753baf1a8319181900360a00190a160405133903480156108fc02916000818181858888f19350505050158015611a90573d6000803e3d6000fd5b50612402565b855461ffff8981166101009092041614611b2357604080518d8152602081018c90528082018b90526002606082015243608082015290517faf2d0f76f81104661d314f5e65f3eb5d70d9bd6112c30547b2720753baf1a8319181900360a00190a160405133903480156108fc02916000818181858888f19350505050158015611a90573d6000803e3d6000fd5b600a549450609686600301541015611b4957611b4685600263ffffffff613ac816565b94505b348514611bc6576040805160e560020a62461bcd02815260206004820152602560248201527f666565206d75737420626520657175616c7320746f206368616c6c656e67652060448201527f7072696365000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600093506000341115611bdf57611bdc34613af1565b93505b60408051600e8082526101e0820190925290602082016101c08038833950506011549194505062010000900461ffff168b6000602002013563ffffffff16028760000160039054906101000a900463ffffffff160163ffffffff16836000815181101515611c4957fe5b6020908102909101015260115461ffff640100000000909104168b6001602002013563ffffffff16028760000160079054906101000a900463ffffffff160163ffffffff16836001815181101515611c9d57fe5b6020908102909101015260115461ffff6601000000000000909104168b6002602002013563ffffffff160287600001600b9054906101000a900463ffffffff160163ffffffff16836002815181101515611cf357fe5b6020908102909101015260115461ffff68010000000000000000909104168b6003602002013563ffffffff160287600001600f9054906101000a900463ffffffff160163ffffffff16836003815181101515611d4b57fe5b6020908102909101015260115461ffff6a0100000000000000000000909104168b6004602002013563ffffffff16028760000160139054906101000a900461ffff1661ffff160163ffffffff16836004815181101515611da757fe5b602090810291909101015285548351609860020a90910461ffff169084906005908110611dd057fe5b6020908102919091010152855483516b01000000000000000000000090910463ffffffff169084906006908110611e0357fe5b6020908102909101015260115461ffff6601000000000000909104168b6002602002013563ffffffff160287600001600b9054906101000a900463ffffffff160163ffffffff16836008815181101515611e5957fe5b602090810290910101526003870154835184906009908110611e7757fe5b60209081029091010152600386015483518490600a908110611e9557fe5b6020908102909101015282516000908490600b908110611eb157fe5b6020908102909101015282518c908490600c908110611ecc57fe5b6020908102909101015282518a908490600d908110611ee757fe5b602090810290910101528251611b589084906004908110611f0457fe5b906020019060200201511115611f3157611b58836004815181101515611f2657fe5b602090810290910101525b611b58836005815181101515611f4357fe5b906020019060200201511115611f7057611b58836005815181101515611f6557fe5b602090810290910101525b8554875460001960ff91821601811691161480611fa05750865460ff166001148015611fa05750855460ff166003145b80611fbe5750865460ff166008148015611fbe5750855460ff166009145b1561202557610bb8836004815181101515611fd557fe5b602090810290910101805190910190528251611f409084906004908110611ff857fe5b90602001906020020151111561202557611f4083600481518110151561201a57fe5b602090810290910101525b8654865460001960ff918216018116911614806120555750855460ff1660011480156120555750865460ff166003145b806120735750855460ff1660081480156120735750865460ff166009145b156120da57610bb883600581518110151561208a57fe5b602090810290910101805190910190528251611f4090849060059081106120ad57fe5b9060200190602002015111156120da57611f408360058151811015156120cf57fe5b602090810290910101525b6120e5878785613b0b565b91506120f28c8486614317565b83600b81518110151561210157fe5b602090810290910101526007805484517f1f3610bd2f9b39fa4fb2aed817ac07ddade00f9054b95f8c2c4d89a8e7ff70f7928691811061213d57fe5b9060200190602002015142854388600b81518110151561215957fe5b60209081029091018101516040805197885260ff9096169187019190915267ffffffffffffffff909316858501526060850191909152608084015260a0830152519081900360c00190a1600754875484517f7caf0b6ddcfcca510ad0e5b907cf2aec2baf462762e21fbc5275602854fdb77a92918f9160ff821691610100900461ffff1690889060009081106121eb57fe5b9060200190602002015188600181518110151561220457fe5b9060200190602002015189600881518110151561221d57fe5b906020019060200201518a600381518110151561223657fe5b906020019060200201518b600481518110151561224f57fe5b906020019060200201518c600981518110151561226857fe5b6020908102909101810151604080519b8c52918b019990995260ff9097168988015261ffff95861660608a015263ffffffff94851660808a015292841660a089015290831660c088015290911660e08601521661010084015261012083019190915251908190036101400190a1600754865484517f431176de03c5a30b34c79db5b4f5d69ec4101b6ee399cf47a4cfc063af47dd7892918d9160ff82169161ffff6101008204169163ffffffff6301000000830481169267010000000000000081048216926b01000000000000000000000082048316926f01000000000000000000000000000000909204909116908c90600590811061236457fe5b906020019060200201518c600a81518110151561237d57fe5b6020908102909101810151604080519b8c52918b019990995260ff9097168988015261ffff95861660608a015263ffffffff94851660808a015292841660a089015290831660c088015290911660e08601521661010084015261012083019190915251908190036101400190a16007546123fe90600163ffffffff6135f516565b6007555b505050505050505050505050565b60115468010000000000000000900461ffff1681565b6000805481908190600160a060020a0316331461244257600080fd5b5050600f54309150813190808210612492576000600f8190558054604051600160a060020a039091169183156108fc02918491818181858888f193505050501580156115b2573d6000803e3d6000fd5b505050565b60056020526000908152604090205481565b600054600160a060020a031633146124c057600080fd5b601380549115156101000261ff0019909216919091179055565b600854600160a060020a031681565b601154610100900460ff1681565b600d5481565b601754600090819060ff161561251257600080fd5b6008546040805160e160020a6331a9108f02815260048101879052905186923392600160a060020a0390911691636352211e916024808201926020929091908290030181600087803b15801561256757600080fd5b505af115801561257b573d6000803e3d6000fd5b505050506040513d602081101561259157600080fd5b5051600160a060020a0316146125f1576040805160e560020a62461bcd02815260206004820152601660248201527f6d757374206265206f776e6572206f6620746f6b656e00000000000000000000604482015290519081900360640190fd5b600c543414612670576040805160e560020a62461bcd02815260206004820152602260248201527f666565206d75737420626520657175616c7320746f206176617461722070726960448201527f6365000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000858152600360205260409020600181015490935064e8d4a51000900691506126b56126a88564e8d4a5100063ffffffff613ac816565b839063ffffffff6135f516565b6001840181905560408051878152602081019290925280517ff393c23ec42fd629a14bf283f25a6976256f2be74ca5ea8a762dc54a2be6e9e69281900390910190a15050505050565b600054600160a060020a0316331461271557600080fd5b6013805460ff1916911515919091179055565b600054600160a060020a0316331461273f57600080fd5b60175460ff161561274f57600080fd5b6017805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6011546d0100000000000000000000000000900460ff1681565b60125490565b600054600160a060020a031681565b6003602081905260009182526040909120805460018201546002830154929093015460ff821693610100830461ffff908116946301000000850463ffffffff9081169567010000000000000081048216956b01000000000000000000000082048316956f010000000000000000000000000000008304841695609860020a8404169460a860020a9093048416939092818116926401000000008204909216916801000000000000000090910467ffffffffffffffff16908d565b600060048281548110151561288157fe5b90600052602060002001549050919050565b600080600080606060008060008060008060608c9b50600860009054906101000a9004600160a060020a0316600160a060020a0316636352211e8e6040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b15801561290757600080fd5b505af115801561291b573d6000803e3d6000fd5b505050506040513d602081101561293157600080fd5b505160008e8152600360209081526040918290208251600680825260e08201909452939e509450820160c08038833950508354825160ff82169d50610100820461ffff169c509293506301000000900463ffffffff1691839150600090811061299657fe5b63ffffffff928316602091820290920101528254825167010000000000000090910490911690829060019081106129c957fe5b63ffffffff92831660209182029092010152825482516b0100000000000000000000009091049091169082906002908110612a0057fe5b63ffffffff92831660209182029092010152825482516f010000000000000000000000000000009091049091169082906003908110612a3b57fe5b63ffffffff929092166020928302919091019091015281548151609860020a90910461ffff169082906004908110612a6f57fe5b63ffffffff928316602091820290920101528254825160a860020a9091049091169082906005908110612a9e57fe5b63ffffffff9283166020918202929092010152600283015460018401546003909401549d9f9c9e509a9c999b919a8082169a640100000000820490921699509297506801000000000000000090920467ffffffffffffffff169550909350915050565b60175460009060ff1615612b1457600080fd5b6010543414612b6d576040805160e560020a62461bcd02815260206004820152601f60248201527f666565206d75737420626520657175616c20746f206472617720707269636500604482015290519081900360640190fd5b600954600160a060020a03161515612bbd576040805160e560020a62461bcd02815260206004820152601360248201526000805160206150a3833981519152604482015290519081900360640190fd5b6008546009546040805160e060020a63b28945a5028152336004820152600160a060020a039283166024820152600160448201529051919092169163b28945a591606480830192600092919082900301818387803b158015612c1e57600080fd5b505af1158015612c32573d6000803e3d6000fd5b5050601054600f54612c4c9350915063ffffffff6135f516565b600f55612c5a33600161487e565b905090565b60105481565b6011546601000000000000900461ffff1681565b601754600090819060ff1615612c8e57600080fd5b6010543414612ce7576040805160e560020a62461bcd02815260206004820152601f60248201527f666565206d75737420626520657175616c20746f206472617720707269636500604482015290519081900360640190fd5b600954600160a060020a03161515612d37576040805160e560020a62461bcd02815260206004820152601360248201526000805160206150a3833981519152604482015290519081900360640190fd5b6008546009546040805160e060020a63b28945a5028152336004820152600160a060020a039283166024820152600160448201529051919092169163b28945a591606480830192600092919082900301818387803b158015612d9857600080fd5b505af1158015612dac573d6000803e3d6000fd5b50505050612dbb33600161487e565b9150600160a060020a03831615801590612dd65750600d5415155b8015612deb5750600160a060020a0383163314155b8015612e8b5750600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915160009392909216916370a082319160248082019260209290919082900301818787803b158015612e5d57600080fd5b505af1158015612e71573d6000803e3d6000fd5b505050506040513d6020811015612e8757600080fd5b5051115b15612f9757612710612ea8600d5434613ac890919063ffffffff16565b811515612eb157fe5b04905034811115612f32576040805160e560020a62461bcd02815260206004820152602560248201527f72656665727265206375742063616e6e6f74206265206c61726765722074686160448201527f6e20666565000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b604051600160a060020a0384169082156108fc029083906000818181858888f19350505050158015612f68573d6000803e3d6000fd5b50601054612f8f90612f80908363ffffffff614d6e16565b600f549063ffffffff6135f516565b600f55612fb0565b601054600f54612fac9163ffffffff6135f516565b600f555b50919050565b60175460009060ff1615612fc957600080fd5b600054600160a060020a03163314612fe057600080fd5b600954600160a060020a03161515613030576040805160e560020a62461bcd02815260206004820152601360248201526000805160206150a3833981519152604482015290519081900360640190fd5b601461ffff8316111561308d576040805160e560020a62461bcd02815260206004820152601e60248201527f6d6178696d756d206c6576656c2063616e6e6f74206578636565642032300000604482015290519081900360640190fd5b6008546009546040805160e060020a63b28945a5028152336004820152600160a060020a039283166024820152600160448201529051919092169163b28945a591606480830192600092919082900301818387803b1580156130ee57600080fd5b505af1158015613102573d6000803e3d6000fd5b50505050613110338361487e565b92915050565b600954600160a060020a031681565b60008054600160a060020a0316331461313d57600080fd5b81905080600160a060020a031663f4b86c486040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561317e57600080fd5b505af1158015613192573d6000803e3d6000fd5b505050506040513d60208110156131a857600080fd5b50511515613200576040805160e560020a62461bcd02815260206004820152601760248201527f6e6565647320746f206265206d61726b6574706c616365000000000000000000604482015290519081900360640190fd5b6009805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905550565b600054600160a060020a0316331461324757600080fd5b600c55565b600054600160a060020a0316331461326357600080fd5b600b55565b601154640100000000900461ffff1681565b60075481565b6011546c01000000000000000000000000900460ff1681565b60065460ff1681565b6011546e010000000000000000000000000000900463ffffffff1681565b600e5481565b60175460009060ff16156132d957600080fd5b60135460ff61010090910416151560011461333e576040805160e560020a62461bcd02815260206004820152601b60248201527f73746172746572207061636b206973206e6f74206f6e2073616c650000000000604482015290519081900360640190fd5b60145434146133bd576040805160e560020a62461bcd02815260206004820152602860248201527f666565206d75737420626520657175616c7320746f207374617274657220706160448201527f636b207072696365000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600954600160a060020a0316151561340d576040805160e560020a62461bcd02815260206004820152601360248201526000805160206150a3833981519152604482015290519081900360640190fd5b601454600f546134229163ffffffff6135f516565b600f556008546009546040805160e060020a63b28945a5028152336004820152600160a060020a039283166024820152600160448201529051919092169163b28945a591606480830192600092919082900301818387803b15801561348657600080fd5b505af115801561349a573d6000803e3d6000fd5b5050601554612c5a925033915061ffff1661487e565b600054600160a060020a031633146134c757600080fd5b600160a060020a03811615156134dc57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a0316331461355b57600080fd5b600e55565b600054600160a060020a0316331461357757600080fd5b600d55565b600c5481565b60115460ff80821692610100830482169261ffff6201000082048116936401000000008304821693660100000000000084048316936801000000000000000081048416936a0100000000000000000000820416927601000000000000000000000000000000000000000000009091041690565b8181018281101561311057fe5b6000888152600360205260408082208151600580825260c0820190935290926060929091829182919081602001602082028038833901905050935060008661ffff1611156137d157600185015460469060649006106137d15760018501546064906402540be400900406925060148310156136a2578584600081518110151561368757fe5b602090810290910101805161ffff9201919091169052613714565b60288310156136bb578584600181518110151561368757fe5b603c8310156136d4578584600281518110151561368757fe5b60508310156136ed578584600381518110151561368757fe5b858460048151811015156136fd57fe5b602090810290910101805161ffff92019190911690525b6001850154605a9060649006106137d157600a83069150600282101561375f578584600081518110151561374457fe5b602090810290910101805161ffff92019190911690526137d1565b6004821015613778578584600181518110151561374457fe5b6006821015613791578584600281518110151561374457fe5b60088210156137aa578584600381518110151561374457fe5b858460048151811015156137ba57fe5b602090810290910101805161ffff92019190911690525b601160029054906101000a900461ffff168460008151811015156137f157fe5b906020019060200201518d010261ffff168560000160038282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601160049054906101000a900461ffff1684600181518110151561385957fe5b906020019060200201518c010261ffff168560000160078282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601160069054906101000a900461ffff168460028151811015156138c157fe5b906020019060200201518b010261ffff1685600001600b8282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601160089054906101000a900461ffff1684600381518110151561392957fe5b6020908102919091010151865472ffffffff000000000000000000000000000000198116918c019290920261ffff9081166f010000000000000000000000000000009384900463ffffffff90811691909101169092021780875560115474ffff000000000000000000000000000000000000001982166a010000000000000000000090910483168b02609860020a92839004841601909216021785558351849060049081106139d457fe5b60209081029091010151855461010063ffffffff60a860020a808404821661ffff958d018616019091160278ffffffff0000000000000000000000000000000000000000001990921691909117818104831660019081018416830262ffff00199092169190911780895560028901805463ffffffff1916905590549190049091169150811115613a6357506001545b6001805482908110613a7157fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff168560020160046101000a81548163ffffffff021916908363ffffffff16021790555050505050505050505050505050565b6000821515613ad957506000613110565b50818102818382811515613ae957fe5b041461311057fe5b600061311061271083600e5491900463ffffffff613ac816565b600080600080600080600080600080600198506000975060009550613b638b6003815181101515613b3857fe5b602090810290910101518d5463ffffffff6f0100000000000000000000000000000090910416614d80565b1515613b6e57600197505b8815613e575760ff88161515613ca7578a6004815181101515613b8d57fe5b90602001906020020151613b9f614de1565b61ffff1611613bd9578a6000815181101515613bb757fe5b906020019060200201516002029650613bd26002878c614e00565b9950613c03565b8a6000815181101515613be857fe5b906020019060200201519650613c006000878c614e00565b99505b8b54670100000000000000900463ffffffff168711613c255760019650613c3d565b8b54670100000000000000900463ffffffff16909603955b868b6006815181101515613c4d57fe5b6020908102909101015111613c7c5760008b6006815181101515613c6d57fe5b60209081029091010152613c9e565b868b6006815181101515613c8c57fe5b60209081029091010180519190910390525b60019750613dd3565b8760ff1660011415613dd3578a6005815181101515613cc257fe5b90602001906020020151613cd4614de1565b61ffff1611613d07578b54600263ffffffff6301000000909204821602169650613d006003878c614e00565b9950613d27565b8b546301000000900463ffffffff169650613d246001878c614e00565b99505b8a6001815181101515613d3657fe5b602090810290910101518711613d4f5760019650613d6d565b8a6001815181101515613d5e57fe5b90602001906020020151870396505b868b6002815181101515613d7d57fe5b6020908102909101015111613dac5760008b6002815181101515613d9d57fe5b60209081029091010152613dce565b868b6002815181101515613dbc57fe5b60209081029091010180519190910390525b600097505b60115460019096019560ff7601000000000000000000000000000000000000000000009091048116908716101580613e24575060008b6006815181101515613e1757fe5b9060200190602002015111155b80613e48575060008b6002815181101515613e3b57fe5b9060200190602002015111155b15613e5257600098505b613b6e565b8b548d54600096508695506101009182900461ffff90811692909104161415613eb65760028054600a908110613e8957fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff169450613fad565b8b548d5461ffff61010092839004811692909104161115613f2d578b548d54600b61ffff610100938490048116939092048216929092031610613efc5760019450613f28565b8c548c5460028054909261ffff61010091829004811691909304831603600a01909116908110613e8957fe5b613fad565b8b548d5461ffff61010092839004811692909104161015613fad578c548c5461ffff610100928390048116929091048116919091031692506014831115613f7357601492505b60028054600a8501908110613f8457fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1694505b8a6006815181101515613fbc57fe5b906020019060200201518b6002815181101515613fd557fe5b9060200190602002015114156140055760028b6007815181101515613ff657fe5b60209081029091010152614307565b8a600681518110151561401457fe5b906020019060200201518b600281518110151561402d57fe5b9060200190602002015111156141cd5760008b600781518110151561404e57fe5b602090810290910101526003808e0154908d015410156140ed578a600c81518110151561407757fe5b9060200190602002015160048d6003015481548110151561409457fe5b6000918252602090912001558a518b90600d9081106140af57fe5b9060200190602002015160048e600301548154811015156140cc57fe5b6000918252602090912001556003808d018054918f01805490915581905591505b60028d01805463ffffffff19811663ffffffff918216880182161791829055640100000000820481169116111561413f5760028d018054640100000000810463ffffffff1663ffffffff199091161790555b600a606463ffffffff60698802160460050163ffffffff1681151561416057fe5b049350600063ffffffff85161161417657600193505b60028c01805463ffffffff19811663ffffffff91821687018216179182905564010000000082048116911611156141c85760028c018054640100000000810463ffffffff1663ffffffff199091161790555b614307565b8a60028151811015156141dc57fe5b906020019060200201518b60068151811015156141f557fe5b9060200190602002015111156143075760018b600781518110151561421657fe5b60209081029091010152606463ffffffff6023870216049050600063ffffffff821611614241575060015b60028d01805463ffffffff19811663ffffffff91821684018216179182905564010000000082048116911611156142935760028d018054640100000000810463ffffffff1663ffffffff199091161790555b606463ffffffff601e870216049350600063ffffffff8516116142b557600193505b60028c01805463ffffffff19811663ffffffff91821687018216179182905564010000000082048116911611156143075760028c018054640100000000810463ffffffff1663ffffffff199091161790555b5050505050505050509392505050565b600080600061433184600f546135f590919063ffffffff16565b600f55614344348563ffffffff614d6e16565b91506000925084600781518110151561435957fe5b90602001906020020151600114156143f1576143a9826005600088600a81518110151561438257fe5b906020019060200201518152602001908152602001600020546135f590919063ffffffff16565b6005600087600a8151811015156143bc57fe5b60209081029091018101518252810191909152604001600020556012546143e9908363ffffffff6135f516565b601255614875565b6008546040805160e160020a6331a9108f028152600481018990529051600160a060020a0390921691636352211e916024808201926020929091908290030181600087803b15801561444257600080fd5b505af1158015614456573d6000803e3d6000fd5b505050506040513d602081101561446c57600080fd5b505185519091508590600790811061448057fe5b906020019060200201516000141561483d5784600a8151811015156144a157fe5b906020019060200201518560098151811015156144ba57fe5b9060200190602002015111156146555760006005600087600a8151811015156144df57fe5b9060200190602002015181526020019081526020016000205411156145b65761453c6005600087600a81518110151561451457fe5b90602001906020020151815260200190815260200160002054846135f590919063ffffffff16565b925061457e6005600087600a81518110151561455457fe5b90602001906020020151815260200190815260200160002054601254614d6e90919063ffffffff16565b60128190555060006005600087600a81518110151561459957fe5b906020019060200201518152602001908152602001600020819055505b6000600560008760098151811015156145cb57fe5b906020019060200201518152602001908152602001600020541115614650576146006005600087600981518110151561451457fe5b92506146186005600087600981518110151561455457fe5b60128190555060006005600087600981518110151561463357fe5b906020019060200201518152602001908152602001600020819055505b6147f2565b603285600981518110151561466657fe5b9060200190602002015110156147f257609685600a81518110151561468757fe5b906020019060200201511080156146c9575060006005600087600a8151811015156146ae57fe5b90602001906020020151815260200190815260200160002054115b15614734576146e46005600087600a81518110151561451457fe5b92506146fc6005600087600a81518110151561455457fe5b60128190555060006005600087600a81518110151561471757fe5b906020019060200201518152602001908152602001600020819055505b609685600a81518110151561474557fe5b90602001906020020151108015614787575060006005600087600981518110151561476c57fe5b90602001906020020151815260200190815260200160002054115b156147f2576147a26005600087600981518110151561451457fe5b92506147ba6005600087600981518110151561455457fe5b6012819055506000600560008760098151811015156147d557fe5b906020019060200201518152602001908152602001600020819055505b600160a060020a0381166108fc61480f858563ffffffff6135f516565b6040518115909202916000818181858888f19350505050158015614837573d6000803e3d6000fd5b50614875565b604051600160a060020a0382169083156108fc029084906000818181858888f19350505050158015614873573d6000803e3d6000fd5b505b50509392505050565b60008060008061488c615036565b600160a060020a0387161515614912576040805160e560020a62461bcd02815260206004820152602660248201527f63616e6e6f7420637265617465206361726420666f7220756e6b6e6f776e206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6006805460ff198116600160ff92831601821617918290551660041415614941576006805460ff191660081790555b60065460ff16600a141561495d576006805460ff191660011790555b60015461ffff871694508411156149745760015493505b6000925060018661ffff1611156149bc57600180548590811061499357fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1692505b600854604080517f6a627842000000000000000000000000000000000000000000000000000000008152600160a060020a038a8116600483015291519190921691636a6278429160248083019260209291908290030181600087803b158015614a2457600080fd5b505af1158015614a38573d6000803e3d6000fd5b505050506040513d6020811015614a4e57600080fd5b5051604080516101a08101825260065460ff16815261ffff891660208201526001918101829052606081018290526003608082015260a08101829052601960c082015260e08101919091529092506101008101614aa9614e20565b81526020018463ffffffff168152602001600186815481101515614ac957fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681526020014267ffffffffffffffff168152602001838152509050806003600084815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160000160136101000a81548161ffff021916908361ffff16021790555060e08201518160000160156101000a81548163ffffffff021916908363ffffffff16021790555061010082015181600101556101208201518160020160006101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160020160046101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550610180820151816003015590505060048290806001815401808255809150509060018203906000526020600020016000909192909190915055507ff9c4ddffd4aef856c95622e875f2337d049085a3d12c8095c51eca343a9a1fe333836040518083600160a060020a0316600160a060020a031681526020018281526020019250505060405180910390a15095945050505050565b600082821115614d7a57fe5b50900390565b60008060006064614d8f614f7d565b811515614d9857fe5b066001019150600a848601866103e802811515614db157fe5b04600501811515614dbe57fe5b04905060ff82168110614dd45760019250614dd9565b600092505b505092915050565b6000612710614dee614f7d565b811515614df757fe5b06600101905090565b6003600292830260ff90811690930a908102199190911692909116021790565b6000806402540be40064e8d4a51000614e37614f7d565b811515614e4057fe5b06811515614e4a57fe5b049150614e62826402540be40063ffffffff613ac816565b60115490925063ffffffff6e01000000000000000000000000000082048116916001720100000000000000000000000000000000000090910482168390030116614eaa614f7d565b811515614eb357fe5b06016064029050614ecd81836135f590919063ffffffff16565b91506064614ed9614f7d565b811515614ee257fe5b60115491900691506c01000000000000000000000000900460ff16811015614f1c57614f1582605a63ffffffff6135f516565b9150614f79565b6011546c01000000000000000000000000810460ff9081166d010000000000000000000000000090920481169190910116811015614f6557614f1582604663ffffffff6135f516565b614f7682603263ffffffff6135f516565b91505b5090565b60165460408051602080820193909352436000198101408284015260021981014060608301526004198101406080830152600619014060a0808301919091528251808303909101815260c09091019182905280516000939192918291908401908083835b602083106150005780518252601f199092019160209182019101614fe1565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091206016819055949350505050565b604080516101a081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081018290526101808101919091529056006d61726b6574706c616365206e6f742073657400000000000000000000000000a165627a7a72305820bcbe2d0f8c761e0b8f5e6c28256e268c350d361db7e971d7fef2140b04cfee7e00290000000000000000000000003a633c367c4276311c06d13c92a156f40a272c4c

Deployed Bytecode

0x6080604052600436106102845763ffffffff60e060020a60003504166301d5c48881146102895780630f0308fb146102b55780631bd8f9ca146102e05780631c70362c1461030757806329aec173146103725780632d06fd13146103a25780632ed73df6146103b757806335bf82f6146103cc5780633d82cf5a146103e45780633f4ba83a146103f957806340fa61f71461040e5780634341aebc1461042357806344d1a9ae1461043a5780634cd7699a14610452578063570200c0146104805780635c714e901461049f5780635c7b0288146104b45780635c975abb146104c95780635cc236ce146104f25780635f96d9fa1461050d5780635fd8c7101461052257806360e71f2f14610537578063682bc77e1461054f5780636a30eb24146105695780636e6b80041461059a5780636e88a7bd146105af5780637a70abda146105c4578063809ae91e146105d25780638456cb59146105ec5780638911cd9a146106015780638b6715cd146106165780638da5cb5b1461062b5780638dc10768146106405780639070222e146106e05780639188d312146106f8578063923ce65f146107ef57806393af339f146107f75780639cd0126a1461080c5780639f91d14514610821578063a14cf39414610835578063abc8c7af14610851578063b47cc55614610866578063b61cb05814610887578063bae18ac31461089f578063c0ba6adf146108b7578063cd2d8a2d146108cc578063d08e2354146108e1578063d127bb9d146108f6578063d77ff9ea1461090b578063e72fd4e114610920578063f114572714610935578063f2fde38b1461093d578063f6cf3a7d1461095e578063f81a95db14610976578063f945ba2d1461098e578063fefd336c146109a3575b600080fd5b34801561029557600080fd5b5061029e610a09565b6040805161ffff9092168252519081900360200190f35b3480156102c157600080fd5b506102ca610a21565b6040805160ff9092168252519081900360200190f35b3480156102ec57600080fd5b506102f5610a2a565b60408051918252519081900360200190f35b34801561031357600080fd5b5061037060ff60043581169060243581169061ffff60443581169160643582169160843581169160a43582169160c435169060e4358116906101043581169063ffffffff6101243581169161014435909116906101643516610a30565b005b61037060043561ffff60243581169060443581169060643581169060843581169060a43581169060c43516610d2a565b3480156103ae57600080fd5b506102f56113c3565b3480156103c357600080fd5b5061029e6113e2565b3480156103d857600080fd5b506103706004356113ec565b3480156103f057600080fd5b506102ca611408565b34801561040557600080fd5b5061037061142b565b34801561041a57600080fd5b506102f5611488565b61037060246004803582810192910135903561148e565b34801561044657600080fd5b506103706004356115b8565b34801561045e57600080fd5b506104676115d4565b6040805163ffffffff9092168252519081900360200190f35b34801561048c57600080fd5b5061037060043561ffff602435166115f6565b3480156104ab57600080fd5b506102f56116ad565b3480156104c057600080fd5b5061029e6116b3565b3480156104d557600080fd5b506104de6116c3565b604080519115158252519081900360200190f35b610370600435602460c43560e43561ffff61010435166116cc565b34801561051957600080fd5b5061029e612410565b34801561052e57600080fd5b50610370612426565b34801561054357600080fd5b506102f5600435612497565b34801561055b57600080fd5b5061037060043515156124a9565b34801561057557600080fd5b5061057e6124da565b60408051600160a060020a039092168252519081900360200190f35b3480156105a657600080fd5b506102ca6124e9565b3480156105bb57600080fd5b506102f56124f7565b6103706004356024356124fd565b3480156105de57600080fd5b5061037060043515156126fe565b3480156105f857600080fd5b50610370612728565b34801561060d57600080fd5b506102ca612787565b34801561062257600080fd5b506102f56127a1565b34801561063757600080fd5b5061057e6127a7565b34801561064c57600080fd5b506106586004356127b6565b6040805160ff909e168e5261ffff9c8d1660208f015263ffffffff9b8c168e820152998b1660608e0152978a1660808d015295891660a08c01529390981660c08a015290861660e08901526101008801529484166101208701529390921661014085015267ffffffffffffffff90921661016084015261018083015251908190036101a00190f35b3480156106ec57600080fd5b506102f5600435612870565b34801561070457600080fd5b50610710600435612893565b604051808b81526020018a600160a060020a0316600160a060020a031681526020018960ff1660ff1681526020018861ffff1661ffff168152602001806020018763ffffffff1663ffffffff1681526020018663ffffffff1663ffffffff1681526020018581526020018467ffffffffffffffff1667ffffffffffffffff168152602001838152602001828103825288818151815260200191508051906020019060200280838360005b838110156107d25781810151838201526020016107ba565b505050509050019b50505050505050505050505060405180910390f35b6102f5612b01565b34801561080357600080fd5b506102f5612c5f565b34801561081857600080fd5b5061029e612c65565b6102f5600160a060020a0360043516612c79565b34801561084157600080fd5b506102f561ffff60043516612fb6565b34801561085d57600080fd5b5061057e613116565b34801561087257600080fd5b50610370600160a060020a0360043516613125565b34801561089357600080fd5b50610370600435613230565b3480156108ab57600080fd5b5061037060043561324c565b3480156108c357600080fd5b5061029e613268565b3480156108d857600080fd5b506102f561327a565b3480156108ed57600080fd5b506102ca613280565b34801561090257600080fd5b506102ca613299565b34801561091757600080fd5b506104676132a2565b34801561092c57600080fd5b506102f56132c0565b6102f56132c6565b34801561094957600080fd5b50610370600160a060020a03600435166134b0565b34801561096a57600080fd5b50610370600435613544565b34801561098257600080fd5b50610370600435613560565b34801561099a57600080fd5b506102f561357c565b3480156109af57600080fd5b506109b8613582565b6040805160ff998a168152978916602089015261ffff968716888201529486166060880152928516608087015290841660a086015290921660c0840152921660e08201529051908190036101000190f35b6011546a0100000000000000000000900461ffff1681565b60115460ff1681565b600a5481565b600054600160a060020a03163314610a4757600080fd5b63ffffffff8084169083161015610ace576040805160e560020a62461bcd02815260206004820152602c60248201527f72616e6765206d6178206d757374206265206c6172676572206f72206571756160448201527f6c732072616e6765206d696e0000000000000000000000000000000000000000606482015290519081900360840190fd5b6305f5e10063ffffffff831610610b2f576040805160e560020a62461bcd02815260206004820181905260248201527f72616e6765206d61782063616e6e6f7420657863656564203939393939393939604482015290519081900360640190fd5b60808160ff1611158015610b46575060008160ff16115b1515610bc2576040805160e560020a62461bcd02815260206004820152602760248201527f626174746c6520726f756e6473206d757374206265206265747765656e20302060448201527f616e642031323800000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8b601160006101000a81548160ff021916908360ff1602179055508a601160016101000a81548160ff021916908360ff16021790555089601160026101000a81548161ffff021916908361ffff16021790555088601160046101000a81548161ffff021916908361ffff16021790555087601160066101000a81548161ffff021916908361ffff16021790555086601160086101000a81548161ffff021916908361ffff160217905550856011600a6101000a81548161ffff021916908361ffff160217905550846011600c6101000a81548160ff021916908360ff160217905550836011600d6101000a81548160ff021916908360ff160217905550826011600e6101000a81548163ffffffff021916908363ffffffff16021790555081601160126101000a81548163ffffffff021916908363ffffffff16021790555080601160166101000a81548160ff021916908360ff160217905550505050505050505050505050565b60175460009081908190819060ff1615610d4357600080fd5b6008546040805160e160020a6331a9108f028152600481018e905290518d923392600160a060020a0390911691636352211e916024808201926020929091908290030181600087803b158015610d9857600080fd5b505af1158015610dac573d6000803e3d6000fd5b505050506040513d6020811015610dc257600080fd5b5051600160a060020a031614610e22576040805160e560020a62461bcd02815260206004820152601660248201527f6d757374206265206f776e6572206f6620746f6b656e00000000000000000000604482015290519081900360640190fd5b60008b61ffff1610158015610e3c575060008a61ffff1610155b8015610e4d575060008961ffff1610155b8015610e5e575060008861ffff1610155b8015610e6f575060008761ffff1610155b8015610e80575060008661ffff1610155b1515610efc576040805160e560020a62461bcd02815260206004820152602760248201527f6c6576656c2075702061747472696275746573206d757374206265206d6f726560448201527f207468616e203000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b543414610f7b576040805160e560020a62461bcd02815260206004820152602360248201527f666565206d75737420626520657175616c7320746f207570677261646520707260448201527f6963650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008c8152600360205260409020600281015490955063ffffffff8082166401000000009092041614610ff8576040805160e560020a62461bcd02815260206004820152601f60248201527f657870206973206e6f74206d61782079657420666f72206c6576656c20757000604482015290519081900360640190fd5b845461ffff61010090910481161061105a576040805160e560020a62461bcd02815260206004820152601e60248201527f63617264206c6576656c206d6178696d756d2068617320726561636865640000604482015290519081900360640190fd5b6011548554611b586a010000000000000000000090920461ffff9081168a02609860020a909204811691909101161115611104576040805160e560020a62461bcd02815260206004820152602360248201527f637269746963616c2072617465206d6178206f6620373020686173207265616360448201527f6865640000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8454888801870161ffff9081168d8d018c01821601955060009450600161010090920416118015611143575084546301000000900463ffffffff166001145b801561116157508454670100000000000000900463ffffffff166001145b8015611183575084546b010000000000000000000000900463ffffffff166003145b80156111a9575084546f01000000000000000000000000000000900463ffffffff166001145b80156111c157508454609860020a900461ffff166019145b80156111db5750845460a860020a900463ffffffff166001145b15611273578454601154600561ffff61010093849004811660018101821692909204965092820460ff9081168702918790039216919091020116915083821461126e576040805160e560020a62461bcd02815260206004820152601860248201527f757067726164652067656d73206e6f7420757365642075700000000000000000604482015290519081900360640190fd5b61135a565b845460059061ffff6101009091048116600101160661ffff16600014156112fe57601154610100900460ff1684146112f5576040805160e560020a62461bcd02815260206004820152601860248201527f757067726164652067656d73206e6f7420757365642075700000000000000000604482015290519081900360640190fd5b6001925061135a565b60115460ff16841461135a576040805160e560020a62461bcd02815260206004820152601860248201527f757067726164652067656d73206e6f7420757365642075700000000000000000604482015290519081900360640190fd5b600b54600f5461136f9163ffffffff6135f516565b600f556113828c8c8c8c8c8c8c8a613602565b604080518d815290517f6a1b6f91db361bdf7356d3942ed64f2ee2fea430979dbba7ea23f44e8b2110079181900360200190a1505050505050505050505050565b60008054600160a060020a031633146113db57600080fd5b50600f5490565b60155461ffff1681565b600054600160a060020a0316331461140357600080fd5b600a55565b601154760100000000000000000000000000000000000000000000900460ff1681565b600054600160a060020a0316331461144257600080fd5b60175460ff16151561145357600080fd5b6017805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b600b5481565b60008054600160a060020a031633146114a657600080fd5b3482840214611525576040805160e560020a62461bcd02815260206004820152602f60248201527f746f6b656e73206d75737420626520656e6f75676820746f206469737472696260448201527f75746520616d6f6e672072616e6b730000000000000000000000000000000000606482015290519081900360840190fd5b5060005b828110156115b257611569826005600087878681811061154557fe5b905060200201358152602001908152602001600020546135f590919063ffffffff16565b6005600086868581811061157957fe5b905060200201358152602001908152602001600020819055506115a7826012546135f590919063ffffffff16565b601255600101611529565b50505050565b600054600160a060020a031633146115cf57600080fd5b601055565b6011547201000000000000000000000000000000000000900463ffffffff1681565b600054600160a060020a0316331461160d57600080fd5b601461ffff82161115611690576040805160e560020a62461bcd02815260206004820152602360248201527f73746172746572207061636b206c6576656c2063616e6e6f742065786365656460448201527f2032300000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6014919091556015805461ffff191661ffff909216919091179055565b60145481565b60115462010000900461ffff1681565b60175460ff1681565b601754600090819081908190606090829060ff16156116ea57600080fd5b6008546040805160e160020a6331a9108f028152600481018e905290518d923392600160a060020a0390911691636352211e916024808201926020929091908290030181600087803b15801561173f57600080fd5b505af1158015611753573d6000803e3d6000fd5b505050506040513d602081101561176957600080fd5b5051600160a060020a0316146117c9576040805160e560020a62461bcd02815260206004820152601660248201527f6d757374206265206f776e6572206f6620746f6b656e00000000000000000000604482015290519081900360640190fd5b60135460ff161515611825576040805160e560020a62461bcd02815260206004820152601660248201527f626174746c6520686173206e6f74207374617274656400000000000000000000604482015290519081900360640190fd5b6008546040805160e160020a6331a9108f028152600481018d90529051600160a060020a0390921691636352211e916024808201926020929091908290030181600087803b15801561187657600080fd5b505af115801561188a573d6000803e3d6000fd5b505050506040513d60208110156118a057600080fd5b5051600160a060020a0316331415611902576040805160e560020a62461bcd02815260206004820152601a60248201527f63616e6e6f74206368616c6c656e6765206f776e206361726473000000000000604482015290519081900360640190fd5b60008c8152600360205260409020805490975060a860020a900463ffffffff168b6004602002013563ffffffff168c600360058110151561193f57fe5b602002013563ffffffff168d600260058110151561195957fe5b602002013563ffffffff168e600160058110151561197357fe5b602002013563ffffffff168f600060058110151561198d57fe5b602002013563ffffffff160101010163ffffffff161415156119f9576040805160e560020a62461bcd02815260206004820152601660248201527f666c6578692067656d73206e6f74207573656420757000000000000000000000604482015290519081900360640190fd5b60008a8152600360208190526040909120908101549096508914611a9657604080518d8152602081018c90528082018b90526001606082015243608082015290517faf2d0f76f81104661d314f5e65f3eb5d70d9bd6112c30547b2720753baf1a8319181900360a00190a160405133903480156108fc02916000818181858888f19350505050158015611a90573d6000803e3d6000fd5b50612402565b855461ffff8981166101009092041614611b2357604080518d8152602081018c90528082018b90526002606082015243608082015290517faf2d0f76f81104661d314f5e65f3eb5d70d9bd6112c30547b2720753baf1a8319181900360a00190a160405133903480156108fc02916000818181858888f19350505050158015611a90573d6000803e3d6000fd5b600a549450609686600301541015611b4957611b4685600263ffffffff613ac816565b94505b348514611bc6576040805160e560020a62461bcd02815260206004820152602560248201527f666565206d75737420626520657175616c7320746f206368616c6c656e67652060448201527f7072696365000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600093506000341115611bdf57611bdc34613af1565b93505b60408051600e8082526101e0820190925290602082016101c08038833950506011549194505062010000900461ffff168b6000602002013563ffffffff16028760000160039054906101000a900463ffffffff160163ffffffff16836000815181101515611c4957fe5b6020908102909101015260115461ffff640100000000909104168b6001602002013563ffffffff16028760000160079054906101000a900463ffffffff160163ffffffff16836001815181101515611c9d57fe5b6020908102909101015260115461ffff6601000000000000909104168b6002602002013563ffffffff160287600001600b9054906101000a900463ffffffff160163ffffffff16836002815181101515611cf357fe5b6020908102909101015260115461ffff68010000000000000000909104168b6003602002013563ffffffff160287600001600f9054906101000a900463ffffffff160163ffffffff16836003815181101515611d4b57fe5b6020908102909101015260115461ffff6a0100000000000000000000909104168b6004602002013563ffffffff16028760000160139054906101000a900461ffff1661ffff160163ffffffff16836004815181101515611da757fe5b602090810291909101015285548351609860020a90910461ffff169084906005908110611dd057fe5b6020908102919091010152855483516b01000000000000000000000090910463ffffffff169084906006908110611e0357fe5b6020908102909101015260115461ffff6601000000000000909104168b6002602002013563ffffffff160287600001600b9054906101000a900463ffffffff160163ffffffff16836008815181101515611e5957fe5b602090810290910101526003870154835184906009908110611e7757fe5b60209081029091010152600386015483518490600a908110611e9557fe5b6020908102909101015282516000908490600b908110611eb157fe5b6020908102909101015282518c908490600c908110611ecc57fe5b6020908102909101015282518a908490600d908110611ee757fe5b602090810290910101528251611b589084906004908110611f0457fe5b906020019060200201511115611f3157611b58836004815181101515611f2657fe5b602090810290910101525b611b58836005815181101515611f4357fe5b906020019060200201511115611f7057611b58836005815181101515611f6557fe5b602090810290910101525b8554875460001960ff91821601811691161480611fa05750865460ff166001148015611fa05750855460ff166003145b80611fbe5750865460ff166008148015611fbe5750855460ff166009145b1561202557610bb8836004815181101515611fd557fe5b602090810290910101805190910190528251611f409084906004908110611ff857fe5b90602001906020020151111561202557611f4083600481518110151561201a57fe5b602090810290910101525b8654865460001960ff918216018116911614806120555750855460ff1660011480156120555750865460ff166003145b806120735750855460ff1660081480156120735750865460ff166009145b156120da57610bb883600581518110151561208a57fe5b602090810290910101805190910190528251611f4090849060059081106120ad57fe5b9060200190602002015111156120da57611f408360058151811015156120cf57fe5b602090810290910101525b6120e5878785613b0b565b91506120f28c8486614317565b83600b81518110151561210157fe5b602090810290910101526007805484517f1f3610bd2f9b39fa4fb2aed817ac07ddade00f9054b95f8c2c4d89a8e7ff70f7928691811061213d57fe5b9060200190602002015142854388600b81518110151561215957fe5b60209081029091018101516040805197885260ff9096169187019190915267ffffffffffffffff909316858501526060850191909152608084015260a0830152519081900360c00190a1600754875484517f7caf0b6ddcfcca510ad0e5b907cf2aec2baf462762e21fbc5275602854fdb77a92918f9160ff821691610100900461ffff1690889060009081106121eb57fe5b9060200190602002015188600181518110151561220457fe5b9060200190602002015189600881518110151561221d57fe5b906020019060200201518a600381518110151561223657fe5b906020019060200201518b600481518110151561224f57fe5b906020019060200201518c600981518110151561226857fe5b6020908102909101810151604080519b8c52918b019990995260ff9097168988015261ffff95861660608a015263ffffffff94851660808a015292841660a089015290831660c088015290911660e08601521661010084015261012083019190915251908190036101400190a1600754865484517f431176de03c5a30b34c79db5b4f5d69ec4101b6ee399cf47a4cfc063af47dd7892918d9160ff82169161ffff6101008204169163ffffffff6301000000830481169267010000000000000081048216926b01000000000000000000000082048316926f01000000000000000000000000000000909204909116908c90600590811061236457fe5b906020019060200201518c600a81518110151561237d57fe5b6020908102909101810151604080519b8c52918b019990995260ff9097168988015261ffff95861660608a015263ffffffff94851660808a015292841660a089015290831660c088015290911660e08601521661010084015261012083019190915251908190036101400190a16007546123fe90600163ffffffff6135f516565b6007555b505050505050505050505050565b60115468010000000000000000900461ffff1681565b6000805481908190600160a060020a0316331461244257600080fd5b5050600f54309150813190808210612492576000600f8190558054604051600160a060020a039091169183156108fc02918491818181858888f193505050501580156115b2573d6000803e3d6000fd5b505050565b60056020526000908152604090205481565b600054600160a060020a031633146124c057600080fd5b601380549115156101000261ff0019909216919091179055565b600854600160a060020a031681565b601154610100900460ff1681565b600d5481565b601754600090819060ff161561251257600080fd5b6008546040805160e160020a6331a9108f02815260048101879052905186923392600160a060020a0390911691636352211e916024808201926020929091908290030181600087803b15801561256757600080fd5b505af115801561257b573d6000803e3d6000fd5b505050506040513d602081101561259157600080fd5b5051600160a060020a0316146125f1576040805160e560020a62461bcd02815260206004820152601660248201527f6d757374206265206f776e6572206f6620746f6b656e00000000000000000000604482015290519081900360640190fd5b600c543414612670576040805160e560020a62461bcd02815260206004820152602260248201527f666565206d75737420626520657175616c7320746f206176617461722070726960448201527f6365000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000858152600360205260409020600181015490935064e8d4a51000900691506126b56126a88564e8d4a5100063ffffffff613ac816565b839063ffffffff6135f516565b6001840181905560408051878152602081019290925280517ff393c23ec42fd629a14bf283f25a6976256f2be74ca5ea8a762dc54a2be6e9e69281900390910190a15050505050565b600054600160a060020a0316331461271557600080fd5b6013805460ff1916911515919091179055565b600054600160a060020a0316331461273f57600080fd5b60175460ff161561274f57600080fd5b6017805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6011546d0100000000000000000000000000900460ff1681565b60125490565b600054600160a060020a031681565b6003602081905260009182526040909120805460018201546002830154929093015460ff821693610100830461ffff908116946301000000850463ffffffff9081169567010000000000000081048216956b01000000000000000000000082048316956f010000000000000000000000000000008304841695609860020a8404169460a860020a9093048416939092818116926401000000008204909216916801000000000000000090910467ffffffffffffffff16908d565b600060048281548110151561288157fe5b90600052602060002001549050919050565b600080600080606060008060008060008060608c9b50600860009054906101000a9004600160a060020a0316600160a060020a0316636352211e8e6040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b15801561290757600080fd5b505af115801561291b573d6000803e3d6000fd5b505050506040513d602081101561293157600080fd5b505160008e8152600360209081526040918290208251600680825260e08201909452939e509450820160c08038833950508354825160ff82169d50610100820461ffff169c509293506301000000900463ffffffff1691839150600090811061299657fe5b63ffffffff928316602091820290920101528254825167010000000000000090910490911690829060019081106129c957fe5b63ffffffff92831660209182029092010152825482516b0100000000000000000000009091049091169082906002908110612a0057fe5b63ffffffff92831660209182029092010152825482516f010000000000000000000000000000009091049091169082906003908110612a3b57fe5b63ffffffff929092166020928302919091019091015281548151609860020a90910461ffff169082906004908110612a6f57fe5b63ffffffff928316602091820290920101528254825160a860020a9091049091169082906005908110612a9e57fe5b63ffffffff9283166020918202929092010152600283015460018401546003909401549d9f9c9e509a9c999b919a8082169a640100000000820490921699509297506801000000000000000090920467ffffffffffffffff169550909350915050565b60175460009060ff1615612b1457600080fd5b6010543414612b6d576040805160e560020a62461bcd02815260206004820152601f60248201527f666565206d75737420626520657175616c20746f206472617720707269636500604482015290519081900360640190fd5b600954600160a060020a03161515612bbd576040805160e560020a62461bcd02815260206004820152601360248201526000805160206150a3833981519152604482015290519081900360640190fd5b6008546009546040805160e060020a63b28945a5028152336004820152600160a060020a039283166024820152600160448201529051919092169163b28945a591606480830192600092919082900301818387803b158015612c1e57600080fd5b505af1158015612c32573d6000803e3d6000fd5b5050601054600f54612c4c9350915063ffffffff6135f516565b600f55612c5a33600161487e565b905090565b60105481565b6011546601000000000000900461ffff1681565b601754600090819060ff1615612c8e57600080fd5b6010543414612ce7576040805160e560020a62461bcd02815260206004820152601f60248201527f666565206d75737420626520657175616c20746f206472617720707269636500604482015290519081900360640190fd5b600954600160a060020a03161515612d37576040805160e560020a62461bcd02815260206004820152601360248201526000805160206150a3833981519152604482015290519081900360640190fd5b6008546009546040805160e060020a63b28945a5028152336004820152600160a060020a039283166024820152600160448201529051919092169163b28945a591606480830192600092919082900301818387803b158015612d9857600080fd5b505af1158015612dac573d6000803e3d6000fd5b50505050612dbb33600161487e565b9150600160a060020a03831615801590612dd65750600d5415155b8015612deb5750600160a060020a0383163314155b8015612e8b5750600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915160009392909216916370a082319160248082019260209290919082900301818787803b158015612e5d57600080fd5b505af1158015612e71573d6000803e3d6000fd5b505050506040513d6020811015612e8757600080fd5b5051115b15612f9757612710612ea8600d5434613ac890919063ffffffff16565b811515612eb157fe5b04905034811115612f32576040805160e560020a62461bcd02815260206004820152602560248201527f72656665727265206375742063616e6e6f74206265206c61726765722074686160448201527f6e20666565000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b604051600160a060020a0384169082156108fc029083906000818181858888f19350505050158015612f68573d6000803e3d6000fd5b50601054612f8f90612f80908363ffffffff614d6e16565b600f549063ffffffff6135f516565b600f55612fb0565b601054600f54612fac9163ffffffff6135f516565b600f555b50919050565b60175460009060ff1615612fc957600080fd5b600054600160a060020a03163314612fe057600080fd5b600954600160a060020a03161515613030576040805160e560020a62461bcd02815260206004820152601360248201526000805160206150a3833981519152604482015290519081900360640190fd5b601461ffff8316111561308d576040805160e560020a62461bcd02815260206004820152601e60248201527f6d6178696d756d206c6576656c2063616e6e6f74206578636565642032300000604482015290519081900360640190fd5b6008546009546040805160e060020a63b28945a5028152336004820152600160a060020a039283166024820152600160448201529051919092169163b28945a591606480830192600092919082900301818387803b1580156130ee57600080fd5b505af1158015613102573d6000803e3d6000fd5b50505050613110338361487e565b92915050565b600954600160a060020a031681565b60008054600160a060020a0316331461313d57600080fd5b81905080600160a060020a031663f4b86c486040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561317e57600080fd5b505af1158015613192573d6000803e3d6000fd5b505050506040513d60208110156131a857600080fd5b50511515613200576040805160e560020a62461bcd02815260206004820152601760248201527f6e6565647320746f206265206d61726b6574706c616365000000000000000000604482015290519081900360640190fd5b6009805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905550565b600054600160a060020a0316331461324757600080fd5b600c55565b600054600160a060020a0316331461326357600080fd5b600b55565b601154640100000000900461ffff1681565b60075481565b6011546c01000000000000000000000000900460ff1681565b60065460ff1681565b6011546e010000000000000000000000000000900463ffffffff1681565b600e5481565b60175460009060ff16156132d957600080fd5b60135460ff61010090910416151560011461333e576040805160e560020a62461bcd02815260206004820152601b60248201527f73746172746572207061636b206973206e6f74206f6e2073616c650000000000604482015290519081900360640190fd5b60145434146133bd576040805160e560020a62461bcd02815260206004820152602860248201527f666565206d75737420626520657175616c7320746f207374617274657220706160448201527f636b207072696365000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600954600160a060020a0316151561340d576040805160e560020a62461bcd02815260206004820152601360248201526000805160206150a3833981519152604482015290519081900360640190fd5b601454600f546134229163ffffffff6135f516565b600f556008546009546040805160e060020a63b28945a5028152336004820152600160a060020a039283166024820152600160448201529051919092169163b28945a591606480830192600092919082900301818387803b15801561348657600080fd5b505af115801561349a573d6000803e3d6000fd5b5050601554612c5a925033915061ffff1661487e565b600054600160a060020a031633146134c757600080fd5b600160a060020a03811615156134dc57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a0316331461355b57600080fd5b600e55565b600054600160a060020a0316331461357757600080fd5b600d55565b600c5481565b60115460ff80821692610100830482169261ffff6201000082048116936401000000008304821693660100000000000084048316936801000000000000000081048416936a0100000000000000000000820416927601000000000000000000000000000000000000000000009091041690565b8181018281101561311057fe5b6000888152600360205260408082208151600580825260c0820190935290926060929091829182919081602001602082028038833901905050935060008661ffff1611156137d157600185015460469060649006106137d15760018501546064906402540be400900406925060148310156136a2578584600081518110151561368757fe5b602090810290910101805161ffff9201919091169052613714565b60288310156136bb578584600181518110151561368757fe5b603c8310156136d4578584600281518110151561368757fe5b60508310156136ed578584600381518110151561368757fe5b858460048151811015156136fd57fe5b602090810290910101805161ffff92019190911690525b6001850154605a9060649006106137d157600a83069150600282101561375f578584600081518110151561374457fe5b602090810290910101805161ffff92019190911690526137d1565b6004821015613778578584600181518110151561374457fe5b6006821015613791578584600281518110151561374457fe5b60088210156137aa578584600381518110151561374457fe5b858460048151811015156137ba57fe5b602090810290910101805161ffff92019190911690525b601160029054906101000a900461ffff168460008151811015156137f157fe5b906020019060200201518d010261ffff168560000160038282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601160049054906101000a900461ffff1684600181518110151561385957fe5b906020019060200201518c010261ffff168560000160078282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601160069054906101000a900461ffff168460028151811015156138c157fe5b906020019060200201518b010261ffff1685600001600b8282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601160089054906101000a900461ffff1684600381518110151561392957fe5b6020908102919091010151865472ffffffff000000000000000000000000000000198116918c019290920261ffff9081166f010000000000000000000000000000009384900463ffffffff90811691909101169092021780875560115474ffff000000000000000000000000000000000000001982166a010000000000000000000090910483168b02609860020a92839004841601909216021785558351849060049081106139d457fe5b60209081029091010151855461010063ffffffff60a860020a808404821661ffff958d018616019091160278ffffffff0000000000000000000000000000000000000000001990921691909117818104831660019081018416830262ffff00199092169190911780895560028901805463ffffffff1916905590549190049091169150811115613a6357506001545b6001805482908110613a7157fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff168560020160046101000a81548163ffffffff021916908363ffffffff16021790555050505050505050505050505050565b6000821515613ad957506000613110565b50818102818382811515613ae957fe5b041461311057fe5b600061311061271083600e5491900463ffffffff613ac816565b600080600080600080600080600080600198506000975060009550613b638b6003815181101515613b3857fe5b602090810290910101518d5463ffffffff6f0100000000000000000000000000000090910416614d80565b1515613b6e57600197505b8815613e575760ff88161515613ca7578a6004815181101515613b8d57fe5b90602001906020020151613b9f614de1565b61ffff1611613bd9578a6000815181101515613bb757fe5b906020019060200201516002029650613bd26002878c614e00565b9950613c03565b8a6000815181101515613be857fe5b906020019060200201519650613c006000878c614e00565b99505b8b54670100000000000000900463ffffffff168711613c255760019650613c3d565b8b54670100000000000000900463ffffffff16909603955b868b6006815181101515613c4d57fe5b6020908102909101015111613c7c5760008b6006815181101515613c6d57fe5b60209081029091010152613c9e565b868b6006815181101515613c8c57fe5b60209081029091010180519190910390525b60019750613dd3565b8760ff1660011415613dd3578a6005815181101515613cc257fe5b90602001906020020151613cd4614de1565b61ffff1611613d07578b54600263ffffffff6301000000909204821602169650613d006003878c614e00565b9950613d27565b8b546301000000900463ffffffff169650613d246001878c614e00565b99505b8a6001815181101515613d3657fe5b602090810290910101518711613d4f5760019650613d6d565b8a6001815181101515613d5e57fe5b90602001906020020151870396505b868b6002815181101515613d7d57fe5b6020908102909101015111613dac5760008b6002815181101515613d9d57fe5b60209081029091010152613dce565b868b6002815181101515613dbc57fe5b60209081029091010180519190910390525b600097505b60115460019096019560ff7601000000000000000000000000000000000000000000009091048116908716101580613e24575060008b6006815181101515613e1757fe5b9060200190602002015111155b80613e48575060008b6002815181101515613e3b57fe5b9060200190602002015111155b15613e5257600098505b613b6e565b8b548d54600096508695506101009182900461ffff90811692909104161415613eb65760028054600a908110613e8957fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff169450613fad565b8b548d5461ffff61010092839004811692909104161115613f2d578b548d54600b61ffff610100938490048116939092048216929092031610613efc5760019450613f28565b8c548c5460028054909261ffff61010091829004811691909304831603600a01909116908110613e8957fe5b613fad565b8b548d5461ffff61010092839004811692909104161015613fad578c548c5461ffff610100928390048116929091048116919091031692506014831115613f7357601492505b60028054600a8501908110613f8457fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1694505b8a6006815181101515613fbc57fe5b906020019060200201518b6002815181101515613fd557fe5b9060200190602002015114156140055760028b6007815181101515613ff657fe5b60209081029091010152614307565b8a600681518110151561401457fe5b906020019060200201518b600281518110151561402d57fe5b9060200190602002015111156141cd5760008b600781518110151561404e57fe5b602090810290910101526003808e0154908d015410156140ed578a600c81518110151561407757fe5b9060200190602002015160048d6003015481548110151561409457fe5b6000918252602090912001558a518b90600d9081106140af57fe5b9060200190602002015160048e600301548154811015156140cc57fe5b6000918252602090912001556003808d018054918f01805490915581905591505b60028d01805463ffffffff19811663ffffffff918216880182161791829055640100000000820481169116111561413f5760028d018054640100000000810463ffffffff1663ffffffff199091161790555b600a606463ffffffff60698802160460050163ffffffff1681151561416057fe5b049350600063ffffffff85161161417657600193505b60028c01805463ffffffff19811663ffffffff91821687018216179182905564010000000082048116911611156141c85760028c018054640100000000810463ffffffff1663ffffffff199091161790555b614307565b8a60028151811015156141dc57fe5b906020019060200201518b60068151811015156141f557fe5b9060200190602002015111156143075760018b600781518110151561421657fe5b60209081029091010152606463ffffffff6023870216049050600063ffffffff821611614241575060015b60028d01805463ffffffff19811663ffffffff91821684018216179182905564010000000082048116911611156142935760028d018054640100000000810463ffffffff1663ffffffff199091161790555b606463ffffffff601e870216049350600063ffffffff8516116142b557600193505b60028c01805463ffffffff19811663ffffffff91821687018216179182905564010000000082048116911611156143075760028c018054640100000000810463ffffffff1663ffffffff199091161790555b5050505050505050509392505050565b600080600061433184600f546135f590919063ffffffff16565b600f55614344348563ffffffff614d6e16565b91506000925084600781518110151561435957fe5b90602001906020020151600114156143f1576143a9826005600088600a81518110151561438257fe5b906020019060200201518152602001908152602001600020546135f590919063ffffffff16565b6005600087600a8151811015156143bc57fe5b60209081029091018101518252810191909152604001600020556012546143e9908363ffffffff6135f516565b601255614875565b6008546040805160e160020a6331a9108f028152600481018990529051600160a060020a0390921691636352211e916024808201926020929091908290030181600087803b15801561444257600080fd5b505af1158015614456573d6000803e3d6000fd5b505050506040513d602081101561446c57600080fd5b505185519091508590600790811061448057fe5b906020019060200201516000141561483d5784600a8151811015156144a157fe5b906020019060200201518560098151811015156144ba57fe5b9060200190602002015111156146555760006005600087600a8151811015156144df57fe5b9060200190602002015181526020019081526020016000205411156145b65761453c6005600087600a81518110151561451457fe5b90602001906020020151815260200190815260200160002054846135f590919063ffffffff16565b925061457e6005600087600a81518110151561455457fe5b90602001906020020151815260200190815260200160002054601254614d6e90919063ffffffff16565b60128190555060006005600087600a81518110151561459957fe5b906020019060200201518152602001908152602001600020819055505b6000600560008760098151811015156145cb57fe5b906020019060200201518152602001908152602001600020541115614650576146006005600087600981518110151561451457fe5b92506146186005600087600981518110151561455457fe5b60128190555060006005600087600981518110151561463357fe5b906020019060200201518152602001908152602001600020819055505b6147f2565b603285600981518110151561466657fe5b9060200190602002015110156147f257609685600a81518110151561468757fe5b906020019060200201511080156146c9575060006005600087600a8151811015156146ae57fe5b90602001906020020151815260200190815260200160002054115b15614734576146e46005600087600a81518110151561451457fe5b92506146fc6005600087600a81518110151561455457fe5b60128190555060006005600087600a81518110151561471757fe5b906020019060200201518152602001908152602001600020819055505b609685600a81518110151561474557fe5b90602001906020020151108015614787575060006005600087600981518110151561476c57fe5b90602001906020020151815260200190815260200160002054115b156147f2576147a26005600087600981518110151561451457fe5b92506147ba6005600087600981518110151561455457fe5b6012819055506000600560008760098151811015156147d557fe5b906020019060200201518152602001908152602001600020819055505b600160a060020a0381166108fc61480f858563ffffffff6135f516565b6040518115909202916000818181858888f19350505050158015614837573d6000803e3d6000fd5b50614875565b604051600160a060020a0382169083156108fc029084906000818181858888f19350505050158015614873573d6000803e3d6000fd5b505b50509392505050565b60008060008061488c615036565b600160a060020a0387161515614912576040805160e560020a62461bcd02815260206004820152602660248201527f63616e6e6f7420637265617465206361726420666f7220756e6b6e6f776e206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6006805460ff198116600160ff92831601821617918290551660041415614941576006805460ff191660081790555b60065460ff16600a141561495d576006805460ff191660011790555b60015461ffff871694508411156149745760015493505b6000925060018661ffff1611156149bc57600180548590811061499357fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1692505b600854604080517f6a627842000000000000000000000000000000000000000000000000000000008152600160a060020a038a8116600483015291519190921691636a6278429160248083019260209291908290030181600087803b158015614a2457600080fd5b505af1158015614a38573d6000803e3d6000fd5b505050506040513d6020811015614a4e57600080fd5b5051604080516101a08101825260065460ff16815261ffff891660208201526001918101829052606081018290526003608082015260a08101829052601960c082015260e08101919091529092506101008101614aa9614e20565b81526020018463ffffffff168152602001600186815481101515614ac957fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681526020014267ffffffffffffffff168152602001838152509050806003600084815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160000160136101000a81548161ffff021916908361ffff16021790555060e08201518160000160156101000a81548163ffffffff021916908363ffffffff16021790555061010082015181600101556101208201518160020160006101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160020160046101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550610180820151816003015590505060048290806001815401808255809150509060018203906000526020600020016000909192909190915055507ff9c4ddffd4aef856c95622e875f2337d049085a3d12c8095c51eca343a9a1fe333836040518083600160a060020a0316600160a060020a031681526020018281526020019250505060405180910390a15095945050505050565b600082821115614d7a57fe5b50900390565b60008060006064614d8f614f7d565b811515614d9857fe5b066001019150600a848601866103e802811515614db157fe5b04600501811515614dbe57fe5b04905060ff82168110614dd45760019250614dd9565b600092505b505092915050565b6000612710614dee614f7d565b811515614df757fe5b06600101905090565b6003600292830260ff90811690930a908102199190911692909116021790565b6000806402540be40064e8d4a51000614e37614f7d565b811515614e4057fe5b06811515614e4a57fe5b049150614e62826402540be40063ffffffff613ac816565b60115490925063ffffffff6e01000000000000000000000000000082048116916001720100000000000000000000000000000000000090910482168390030116614eaa614f7d565b811515614eb357fe5b06016064029050614ecd81836135f590919063ffffffff16565b91506064614ed9614f7d565b811515614ee257fe5b60115491900691506c01000000000000000000000000900460ff16811015614f1c57614f1582605a63ffffffff6135f516565b9150614f79565b6011546c01000000000000000000000000810460ff9081166d010000000000000000000000000090920481169190910116811015614f6557614f1582604663ffffffff6135f516565b614f7682603263ffffffff6135f516565b91505b5090565b60165460408051602080820193909352436000198101408284015260021981014060608301526004198101406080830152600619014060a0808301919091528251808303909101815260c09091019182905280516000939192918291908401908083835b602083106150005780518252601f199092019160209182019101614fe1565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091206016819055949350505050565b604080516101a081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081018290526101808101919091529056006d61726b6574706c616365206e6f742073657400000000000000000000000000a165627a7a72305820bcbe2d0f8c761e0b8f5e6c28256e268c350d361db7e971d7fef2140b04cfee7e0029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000003a633c367c4276311c06d13c92a156f40a272c4c

-----Decoded View---------------
Arg [0] : _tokenAddress (address): 0x3a633c367C4276311c06D13c92a156F40a272c4c

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003a633c367c4276311c06d13c92a156f40a272c4c


Swarm Source

bzzr://bcbe2d0f8c761e0b8f5e6c28256e268c350d361db7e971d7fef2140b04cfee7e

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.