Source Code
Latest 25 from a total of 1,196 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Claim Many From ... | 16467135 | 1126 days ago | IN | 0.009 ETH | 0.00775299 | ||||
| Claim Many From ... | 16467128 | 1126 days ago | IN | 0.0018 ETH | 0.0029008 | ||||
| Claim Many From ... | 16467118 | 1126 days ago | IN | 0.1098 ETH | 0.06350395 | ||||
| Claim Many Alpha... | 16048441 | 1184 days ago | IN | 0 ETH | 0.00187449 | ||||
| Claim Many Alpha... | 16048440 | 1184 days ago | IN | 0 ETH | 0.00114149 | ||||
| Claim Many From ... | 15996259 | 1192 days ago | IN | 0.0018 ETH | 0.00283416 | ||||
| Claim Many From ... | 15913362 | 1203 days ago | IN | 0.0054 ETH | 0.00513306 | ||||
| Claim Many From ... | 15913360 | 1203 days ago | IN | 0.0036 ETH | 0.00380168 | ||||
| Claim Many From ... | 15912530 | 1203 days ago | IN | 0.0594 ETH | 0.0255467 | ||||
| Claim Many Alpha... | 15903092 | 1205 days ago | IN | 0 ETH | 0.00136164 | ||||
| Claim Many Alpha... | 15903090 | 1205 days ago | IN | 0 ETH | 0.00108769 | ||||
| Add Many To Stak... | 15890250 | 1206 days ago | IN | 0 ETH | 0.00736026 | ||||
| Claim Many From ... | 15880131 | 1208 days ago | IN | 0.0018 ETH | 0.0027153 | ||||
| Claim Many From ... | 15878450 | 1208 days ago | IN | 0.0036 ETH | 0.00354684 | ||||
| Claim Many From ... | 15876979 | 1208 days ago | IN | 0.0036 ETH | 0.00410339 | ||||
| Claim Many From ... | 15859460 | 1211 days ago | IN | 0.0108 ETH | 0.00353008 | ||||
| Claim Many Alpha... | 15849258 | 1212 days ago | IN | 0 ETH | 0.00360431 | ||||
| Claim Many From ... | 15849181 | 1212 days ago | IN | 0.0018 ETH | 0.00262033 | ||||
| Claim Many From ... | 15846101 | 1212 days ago | IN | 0.0558 ETH | 0.02086101 | ||||
| Claim Many Alpha... | 15845300 | 1213 days ago | IN | 0 ETH | 0.00551571 | ||||
| Claim Many From ... | 15845295 | 1213 days ago | IN | 0.009 ETH | 0.00505369 | ||||
| Claim Many From ... | 15845289 | 1213 days ago | IN | 0.0144 ETH | 0.00631403 | ||||
| Claim Many From ... | 15845284 | 1213 days ago | IN | 0.0648 ETH | 0.02454663 | ||||
| Claim Many From ... | 15844933 | 1213 days ago | IN | 0.0036 ETH | 0.00278974 | ||||
| Claim Many From ... | 15844562 | 1213 days ago | IN | 0.0018 ETH | 0.00181886 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 16467135 | 1126 days ago | 0.009 ETH | ||||
| Transfer | 16467128 | 1126 days ago | 0.0018 ETH | ||||
| Transfer | 16467118 | 1126 days ago | 0.1098 ETH | ||||
| Transfer | 15996259 | 1192 days ago | 0.0018 ETH | ||||
| Transfer | 15913362 | 1203 days ago | 0.0054 ETH | ||||
| Transfer | 15913360 | 1203 days ago | 0.0036 ETH | ||||
| Transfer | 15880131 | 1208 days ago | 0.0018 ETH | ||||
| Transfer | 15878450 | 1208 days ago | 0.0036 ETH | ||||
| Transfer | 15876979 | 1208 days ago | 0.0036 ETH | ||||
| Transfer | 15859460 | 1211 days ago | 0.0108 ETH | ||||
| Transfer | 15845295 | 1213 days ago | 0.009 ETH | ||||
| Transfer | 15845289 | 1213 days ago | 0.0144 ETH | ||||
| Transfer | 15845284 | 1213 days ago | 0.0648 ETH | ||||
| Transfer | 15844933 | 1213 days ago | 0.0036 ETH | ||||
| Transfer | 15844562 | 1213 days ago | 0.0018 ETH | ||||
| Transfer | 15844553 | 1213 days ago | 0.0018 ETH | ||||
| Transfer | 15844518 | 1213 days ago | 0.0018 ETH | ||||
| Transfer | 15844512 | 1213 days ago | 0.0018 ETH | ||||
| Transfer | 15844286 | 1213 days ago | 0.0018 ETH | ||||
| Transfer | 15844063 | 1213 days ago | 0.0036 ETH | ||||
| Transfer | 15843407 | 1213 days ago | 0.0054 ETH | ||||
| Transfer | 15843307 | 1213 days ago | 0.0702 ETH | ||||
| Transfer | 15842083 | 1213 days ago | 0.0036 ETH | ||||
| Transfer | 15841527 | 1213 days ago | 0.0054 ETH | ||||
| Transfer | 15839572 | 1213 days ago | 0.0018 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DogeWorld
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "./interfaces/INFT.sol";
import "./interfaces/ITOPIA.sol";
import "./interfaces/IHub.sol";
import "./interfaces/IDogeWorld.sol";
import "./interfaces/IRandomizer.sol";
contract DogeWorld is IDogeWorld, Ownable, ReentrancyGuard, IERC721Receiver, Pausable {
using EnumerableSet for EnumerableSet.UintSet;
// maximum rank for a Dog/Cat
uint8 public constant MAX_RANK = 8;
// struct to store a stake's token, owner, and earning values
struct Stake {
uint16 tokenId;
uint80 value;
address owner;
uint80 stakedAt;
}
// struct to store a stake's token, owner, and earning values
struct StakeAlpha {
uint16 tokenId;
uint80 value;
address owner;
uint80 stakedAt;
}
mapping(uint16 => uint8) public genesisType;
// number of Cats staked
uint256 private numCatsStaked;
// number of Dog staked
uint256 private numDogStaked;
// number of Veterinarian staked
uint256 private numVeterinarianStaked;
// number of Alpha staked
uint256 private numAlphasStaked;
uint256 public PERIOD = 1 days;
event TokenStaked(address indexed owner, uint256 indexed tokenId, uint8 tokenType, uint256 value);
event CatClaimed(uint256 indexed tokenId, bool indexed unstaked, uint256 earned);
event CatUnStaked(address indexed owner, uint256 indexed tokenId, uint256 blockNum, uint256 timeStamp);
event CatStolen(uint16 indexed tokenId, address indexed victim, address indexed thief, uint256 blockNum, uint256 timeStamp);
event DogClaimed(uint256 indexed tokenId, bool indexed unstaked, uint256 earned);
event DogUnStaked(address indexed owner, uint256 indexed tokenId, uint256 blockNum, uint256 timeStamp);
event DogStolen(uint16 indexed tokenId, address indexed victim, address indexed thief, uint256 blockNum, uint256 timeStamp);
event VeterinarianClaimed(uint256 indexed tokenId, bool indexed unstaked, uint256 earned);
event VeterinarianUnStaked(address indexed owner, uint256 indexed tokenId, uint256 blockNum, uint256 timeStamp);
event AlphaStaked(address indexed owner, uint256 indexed tokenId, uint256 value);
event AlphaClaimed(uint256 indexed tokenId, bool indexed unstaked, uint256 earned);
event AlphaUnstaked(address indexed owner, uint256 indexed tokenId, uint256 blockNum, uint256 timeStamp);
// reference to the NFT contract
INFT public lfGenesis;
INFT public lfAlpha;
// reference to the $TOPIA contract for minting $TOPIA earnings
ITOPIA public TOPIAToken;
IHub public HUB;
// reference to Randomizer
IRandomizer public randomizer;
address payable vrf;
// maps Cat tokenId to stake
mapping(uint256 => Stake) private cat;
// maps Alpha tokenId to stakeAlpha
mapping(uint256 => StakeAlpha) private alpha;
// maps Dog tokenId to stake
mapping(uint256 => Stake) private dog;
// array of Dog token ids;
// uint256[] private yieldIds;
EnumerableSet.UintSet private dogIds;
// maps Veterinarian tokenId to stake
mapping(uint256 => Stake) private veterinarian;
// array of Veterinarian token ids;
EnumerableSet.UintSet private veterinarianIds;
mapping(address => uint256) ownerBalanceStaked;
// array of Owned Genesis token ids;
mapping(address => EnumerableSet.UintSet) genesisOwnedIds;
// array of Owned Alpha token ids;
mapping(address => EnumerableSet.UintSet) alphaOwnedIds;
// any rewards distributed when no Dogs are staked
uint256 private unaccountedDogRewards;
// amount of $TOPIA due for each dog staked
uint256 private TOPIAPerDog;
// any rewards distributed when no Veterinarians are staked
uint256 private unaccountedVeterinarianRewards;
// amount of $TOPIA due for each Veterinarian staked
uint256 private TOPIAPerVeterinarian;
// Cats earn 20 $TOPIA per day
uint256 public DAILY_CAT_RATE = 20 * 10**18;
// Cats earn 35 $TOPIA per day
uint256 public DAILY_ALPHA_RATE = 35 * 10**18;
// Cats must have 2 days worth of $TOPIA to un-stake or else they're still remaining the armory
uint256 public MINIMUM = 40 * 10**18;
// rolling price
uint256 public UPGRADE_COST = 40 * 10**18;
// Veterinarians take a 3% tax on all $TOPIA claimed
uint256 public DOG_TAX_RATE = 300;
// Veterinarians take a 3% tax on all $TOPIA from upgrades
uint256 public VETERINARIAN_TAX_RATE = 300;
// tx cost for getting random numbers
uint256 public SEED_COST = .0008 ether;
// amount of $TOPIA earned so far
uint256 public totalTOPIAEarned;
// the last time $TOPIA was claimed
uint80 public claimEndTime;
// emergency rescue to allow un-staking without any checks but without $TOPIA
bool public rescueEnabled = false;
/**
*/
constructor() {
_pause();
}
/** CRITICAL TO SETUP */
modifier requireContractsSet() {
require(address(lfGenesis) != address(0) && address(TOPIAToken) != address(0)
&& address(randomizer) != address(0) && address(HUB) != address(0), "Contracts not set");
_;
}
function setContracts(address _lfGenesis, address _lfAlpha, address _TOPIA, address _HUB, address payable _rand) external onlyOwner {
lfGenesis = INFT(_lfGenesis);
lfAlpha = INFT(_lfAlpha);
TOPIAToken = ITOPIA(_TOPIA);
randomizer = IRandomizer(_rand);
HUB = IHub(_HUB);
vrf = _rand;
}
// mass update the nftType mapping
function setBatchNFTType(uint16[] calldata tokenIds, uint8[] calldata _types) external onlyOwner {
require(tokenIds.length == _types.length , " _idNumbers.length != _types.length: Each token ID must have exactly 1 corresponding type!");
for (uint16 i = 0; i < tokenIds.length; i++) {
require(_types[i] != 0 , "Invalid nft type - cannot be 0");
genesisType[tokenIds[i]] = _types[i];
}
}
/** STAKING */
/**
* adds Dogs and Cat
* @param account the address of the staker
* @param tokenIds the IDs of the Dogs and Cat to stake
*/
function addManyToStakingPool(address account, uint16[] calldata tokenIds) external override nonReentrant {
require(tx.origin == msg.sender, "Only EOA");
require(account == tx.origin, "account to send mismatch");
for (uint i = 0; i < tokenIds.length; i++) {
require(lfGenesis.ownerOf(tokenIds[i]) == msg.sender, "You don't own this token");
if (genesisType[tokenIds[i]] == 1) {
lfGenesis.transferFrom(msg.sender, address(this), tokenIds[i]);
_addCatToStakingPool(account, tokenIds[i]);
} else if (genesisType[tokenIds[i]] == 2) {
lfGenesis.transferFrom(msg.sender, address(this), tokenIds[i]);
_addDogToStakingPool(account, tokenIds[i]);
} else if (genesisType[tokenIds[i]] == 3) {
lfGenesis.transferFrom(msg.sender, address(this), tokenIds[i]);
_addVeterinarianToStakingPool(account, tokenIds[i]);
} else if (genesisType[tokenIds[i]] == 0) {
revert('invalid token id');
}
}
HUB.emitGenesisStaked(account, tokenIds, 2);
}
/**
* adds a single Dog to the Armory
* @param account the address of the staker
* @param tokenId the ID of the Dog/Veterinarian to add to the Staking Pool
*/
function _addDogToStakingPool(address account, uint256 tokenId) internal whenNotPaused {
dog[tokenId] = Stake({
owner : account,
tokenId : uint16(tokenId),
value : uint80(TOPIAPerDog),
stakedAt : uint80(block.timestamp)
});
dogIds.add(tokenId);
genesisOwnedIds[account].add(tokenId);
numDogStaked += 1;
emit TokenStaked(account, tokenId, 2, TOPIAPerDog);
}
/**
* adds a single Veterinarian to the Armory
* @param account the address of the staker
* @param tokenId the ID of the Dog/Veterinarian to add to the Staking Pool
*/
function _addVeterinarianToStakingPool(address account, uint256 tokenId) internal whenNotPaused {
veterinarian[tokenId] = Stake({
owner : account,
tokenId : uint16(tokenId),
value : uint80(TOPIAPerVeterinarian),
stakedAt : uint80(block.timestamp)
});
veterinarianIds.add(tokenId);
genesisOwnedIds[account].add(tokenId);
numVeterinarianStaked += 1;
emit TokenStaked(account, tokenId, 3, TOPIAPerVeterinarian);
}
/**
* adds a single Cat to the armory
* @param account the address of the staker
* @param tokenId the ID of the Cat to add to the Staking Pool
*/
function _addCatToStakingPool(address account, uint256 tokenId) internal {
cat[tokenId] = Stake({
owner : account,
tokenId : uint16(tokenId),
value : uint80(block.timestamp),
stakedAt : uint80(block.timestamp)
});
// Add the cat to the armory
genesisOwnedIds[account].add(tokenId);
numCatsStaked += 1;
emit TokenStaked(account, tokenId, 1, block.timestamp);
}
/** CLAIMING / UNSTAKING */
/**
* realize $TOPIA earnings and optionally unstake tokens from the Armory / Yield
* to unstake a Cat it will require it has 2 days worth of $TOPIA unclaimed
* @param tokenIds the IDs of the tokens to claim earnings from
* @param unstake whether or not to unstake ALL of the tokens listed in tokenIds
*/
function claimManyFromArmoryAndYield(uint16[] calldata tokenIds, bool unstake) external payable whenNotPaused nonReentrant returns (uint16[] memory stolenNFTs){
require(tx.origin == msg.sender, "Only EOA");
uint256 numWords = tokenIds.length;
require(msg.value == SEED_COST * numWords, "Invalid value for randomness");
if(unstake) {
stolenNFTs = new uint16[](numWords);
HUB.emitGenesisUnstaked(msg.sender, tokenIds);
} else {
stolenNFTs = new uint16[](1);
stolenNFTs[0] = 0;
}
uint256 remainingWords = randomizer.getRemainingWords();
require(remainingWords >= numWords, "Not enough random numbers. Please try again soon.");
uint256[] memory seed = randomizer.getRandomWords(numWords);
uint256 owed = 0;
for (uint i = 0; i < tokenIds.length; i++) {
if (genesisType[tokenIds[i]] == 1) {
(uint256 _owed, uint16 _stolen) = _claimCatFromArmory(tokenIds[i], unstake, seed[i]);
owed += _owed;
if(unstake) {stolenNFTs[i] = _stolen;}
} else if (genesisType[tokenIds[i]] == 2) {
(uint256 _owed, uint16 _stolen) = _claimDogFromYield(tokenIds[i], unstake, seed[i]);
owed += _owed;
if(unstake) {stolenNFTs[i] = _stolen;}
} else if (genesisType[tokenIds[i]] == 3) {
owed += _claimVeterinarianFromYield(tokenIds[i], unstake);
} else if (genesisType[tokenIds[i]] == 0) {
revert('invalid token id');
}
}
if (owed == 0) {
return stolenNFTs;
}
totalTOPIAEarned += owed;
TOPIAToken.mint(msg.sender, owed);
HUB.emitTopiaClaimed(msg.sender, owed);
vrf.transfer(msg.value);
}
/**
* realize $TOPIA earnings for a single Cat and optionally unstake it
* if not unstaking, lose x% chance * y% percent of accumulated $TOPIA to the staked Dogs based on it's upgrade
* if unstaking, there is a % chanc of losing Cat NFT
* @param tokenId the ID of the Cat to claim earnings from
* @param unstake whether or not to unstake the Cat
* @return owed - the amount of $TOPIA earned
*/
function _claimCatFromArmory(uint16 tokenId, bool unstake, uint256 seed) internal returns (uint256 owed, uint16 tokId) {
require(cat[tokenId].owner == msg.sender, "Don't own the given token");
if(block.timestamp <= claimEndTime) {
owed = (block.timestamp - cat[tokenId].value) * DAILY_CAT_RATE / PERIOD;
} else if (cat[tokenId].value < claimEndTime) {
owed = (claimEndTime - cat[tokenId].value) * DAILY_CAT_RATE / PERIOD;
} else {
owed = 0;
}
uint256 seedChance = seed >> 16;
bool stolen = false;
address thief;
if (unstake) {
if ((seed & 0xFFFF) % 100 < 10) {
thief = randomDogOwner(seed);
lfGenesis.safeTransferFrom(address(this), thief, tokenId);
stolen = true;
} else {
// lose accumulated tokens 50% chance and 60 percent of all token
if ((seedChance & 0xFFFF) % 100 < 50) {
_payTax(owed * 25 / 100);
owed = owed * 75 / 100;
}
}
delete cat[tokenId];
numCatsStaked -= 1;
genesisOwnedIds[msg.sender].remove(tokenId);
if (stolen) {
emit CatStolen(tokenId, msg.sender, thief, block.number, block.timestamp);
tokId = tokenId;
} else {
// Always transfer last to guard against reentrance
lfGenesis.safeTransferFrom(address(this), msg.sender, tokenId, "");
}
emit CatUnStaked(msg.sender, tokenId, block.number, block.timestamp);
} else {// Claiming
// lose accumulated tokens 50% chance and 25 percent of all token
if ((seedChance & 0xFFFF) % 100 < 50) {
_payTax(owed * 25 / 100);
owed = owed * 75 / 100;
}
cat[tokenId].value = uint80(block.timestamp);
// reset stake
}
emit CatClaimed(tokenId, unstake, owed);
}
/**
* realize $TOPIA earnings for a single Dog and optionally unstake it
* Dogs earn $TOPIA
* @param tokenId the ID of the Dog to claim earnings from
* @param unstake whether or not to unstake the Dog
*/
function _claimDogFromYield(uint16 tokenId, bool unstake, uint256 seed) internal returns (uint256 owed, uint16 tokId) {
require(dog[tokenId].owner == msg.sender, "Doesn't own given token");
owed = TOPIAPerDog - dog[tokenId].value;
if (unstake) {
address thief;
bool stolen;
if ((seed & 0xFFFF) % 100 < 10) {
thief = randomVeterinarianOwner(seed);
lfGenesis.safeTransferFrom(address(this), thief, tokenId);
stolen = true;
}
delete dog[tokenId];
dogIds.remove(tokenId);
genesisOwnedIds[msg.sender].remove(tokenId);
numDogStaked -= 1;
// Always remove last to guard against reentrance
if (stolen) {
emit DogStolen(tokenId, msg.sender, thief, block.number, block.timestamp);
tokId = tokenId;
} else {
lfGenesis.safeTransferFrom(address(this), msg.sender, tokenId, "");
}
emit DogUnStaked(msg.sender, tokenId, block.number, block.timestamp);
} else {
dog[tokenId].value = uint80(TOPIAPerDog);
// reset stake
}
emit DogClaimed(tokenId, unstake, owed);
}
/**
* realize $TOPIA earnings for a Veterinarian Dog and optionally unstake it
* Dogs earn $TOPIA
* @param tokenId the ID of the Dog to claim earnings from
* @param unstake whether or not to unstake the Veterinarian Dog
*/
function _claimVeterinarianFromYield(uint256 tokenId, bool unstake) internal returns (uint256 owed) {
require(veterinarian[tokenId].owner == msg.sender, "Doesn't own given token");
owed = TOPIAPerVeterinarian - veterinarian[tokenId].value;
if (unstake) {
delete veterinarian[tokenId];
veterinarianIds.remove(tokenId);
genesisOwnedIds[msg.sender].remove(tokenId);
numVeterinarianStaked -= 1;
// Always remove last to guard against reentrance
lfGenesis.safeTransferFrom(address(this), msg.sender, tokenId, "");
// Send back Veterinarian
emit VeterinarianUnStaked(msg.sender, tokenId, block.number, block.timestamp);
} else {
veterinarian[tokenId].value = uint80(TOPIAPerVeterinarian);
// reset stake
}
emit VeterinarianClaimed(tokenId, unstake, owed);
}
/**
* emergency unstake tokens
* @param tokenIds the IDs of the tokens to claim earnings from
*/
function rescue(uint16[] calldata tokenIds) external nonReentrant {
require(rescueEnabled, "RESCUE DISABLED");
uint16 tokenId;
for (uint i = 0; i < tokenIds.length; i++) {
tokenId = tokenIds[i];
if (genesisType[tokenId] == 1) {
require(cat[tokenId].owner == msg.sender, "SWIPER, NO SWIPING");
delete cat[tokenId];
genesisOwnedIds[msg.sender].remove(tokenId);
numCatsStaked -= 1;
lfGenesis.safeTransferFrom(address(this), msg.sender, tokenId, "");
emit CatClaimed(tokenId, true, 0);
} else if (genesisType[tokenId] == 2) {
require(dog[tokenId].owner == msg.sender, "SWIPER, NO SWIPING");
delete dog[tokenId];
dogIds.remove(tokenId);
genesisOwnedIds[msg.sender].remove(tokenId);
numDogStaked -= 1;
lfGenesis.safeTransferFrom(address(this), msg.sender, tokenId, "");
emit DogClaimed(tokenId, true, 0);
} else if (genesisType[tokenId] == 3) {
require(veterinarian[tokenId].owner == msg.sender, "SWIPER, NO SWIPING");
delete veterinarian[tokenId];
veterinarianIds.remove(tokenId);
genesisOwnedIds[msg.sender].remove(tokenId);
numVeterinarianStaked -= 1;
lfGenesis.safeTransferFrom(address(this), msg.sender, tokenId, "");
emit VeterinarianClaimed(tokenId, true, 0);
} else if (genesisType[tokenIds[i]] == 0) {
revert('invalid token id');
}
}
HUB.emitGenesisUnstaked(msg.sender, tokenIds);
}
/** ACCOUNTING */
/**
* add $TOPIA to claimable pot for the Yield
* @param amount $TOPIA to add to the pot
*/
function _payTax(uint256 amount) internal {
uint256 _dogTax = amount * DOG_TAX_RATE / 10000;
uint256 _vetTax = amount * VETERINARIAN_TAX_RATE / 10000;
if (numDogStaked == 0 && numVeterinarianStaked == 0) {// if there's no staked dogs
unaccountedDogRewards += _dogTax;
unaccountedVeterinarianRewards += _vetTax;
// keep track of $TOPIA due to dogs
return;
} else if (numDogStaked == 0 && numVeterinarianStaked > 0) {
unaccountedDogRewards += _dogTax;
TOPIAPerVeterinarian += (_vetTax + unaccountedVeterinarianRewards) / numVeterinarianStaked;
unaccountedVeterinarianRewards = 0;
return;
} else if (numDogStaked > 0 && numVeterinarianStaked == 0) {
TOPIAPerDog += (_dogTax + unaccountedDogRewards) / numDogStaked;
unaccountedDogRewards = 0;
unaccountedVeterinarianRewards += _vetTax;
return;
} else {
TOPIAPerDog += (amount + unaccountedDogRewards) / numDogStaked;
unaccountedDogRewards = 0;
TOPIAPerVeterinarian += (amount + unaccountedVeterinarianRewards) / numVeterinarianStaked;
unaccountedVeterinarianRewards = 0;
}
}
/**
* add $TOPIA to claimable pot for the Veterinarian Yield
* @param amount $TOPIA to add to the pot
*/
function _payVeterinarianTax(uint256 amount) internal {
if (numVeterinarianStaked == 0) {// if there's no staked veterinarians
unaccountedVeterinarianRewards += amount;
// keep track of $TOPIA due to veterinarians
return;
}
// makes sure to include any unaccounted $GP
TOPIAPerVeterinarian += (amount + unaccountedVeterinarianRewards) / numVeterinarianStaked;
unaccountedVeterinarianRewards = 0;
}
/** ALPHA FUNCTIONS */
/**
* adds Dogs and Cat
* @param account the address of the staker
* @param tokenIds the IDs of the Dogs and Cat to stake
*/
function addManyAlphaToStakingPool(address account, uint16[] calldata tokenIds) external nonReentrant {
require(tx.origin == msg.sender, "Only EOA");
require(account == tx.origin, "account to send mismatch");
for (uint i = 0; i < tokenIds.length; i++) {
require(lfAlpha.ownerOf(tokenIds[i]) == msg.sender, "You don't own this token");
lfAlpha.transferFrom(msg.sender, address(this), tokenIds[i]);
alpha[tokenIds[i]] = StakeAlpha({
owner : account,
tokenId : uint16(tokenIds[i]),
value : uint80(block.timestamp),
stakedAt : uint80(block.timestamp)
});
// Add the cat to the armory
alphaOwnedIds[account].add(tokenIds[i]);
numAlphasStaked += 1;
emit AlphaStaked(account, tokenIds[i], block.timestamp);
}
HUB.emitAlphaStaked(account, tokenIds, 2);
}
/**
* realize $TOPIA earnings and optionally unstake Alpha tokens
* @param tokenIds the IDs of the tokens to claim earnings from
* @param unstake whether or not to unstake ALL of the tokens listed in tokenIds
*/
function claimManyAlphas(uint16[] calldata tokenIds, bool unstake) external whenNotPaused nonReentrant {
require(tx.origin == msg.sender, "Only EOA");
uint256 owed = 0;
for (uint i = 0; i < tokenIds.length; i++) {
require(alpha[tokenIds[i]].owner == msg.sender, "Don't own the given token");
if(block.timestamp <= claimEndTime) {
owed += (block.timestamp - alpha[tokenIds[i]].value) * DAILY_ALPHA_RATE / PERIOD;
} else if (alpha[tokenIds[i]].value < claimEndTime) {
owed += (claimEndTime - alpha[tokenIds[i]].value) * DAILY_ALPHA_RATE / PERIOD;
} else {
owed += 0;
}
if (unstake) {
delete alpha[tokenIds[i]];
numAlphasStaked -= 1;
alphaOwnedIds[msg.sender].remove(tokenIds[i]);
lfAlpha.transferFrom(address(this), msg.sender, tokenIds[i]);
emit AlphaUnstaked(msg.sender, tokenIds[i], block.number, block.timestamp);
} else {
alpha[tokenIds[i]].value = uint80(block.timestamp);
}
emit AlphaClaimed(tokenIds[i], unstake, owed);
}
if (owed == 0) {
return;
}
if(unstake) { HUB.emitAlphaUnstaked(msg.sender, tokenIds); }
HUB.emitTopiaClaimed(msg.sender, owed);
TOPIAToken.mint(msg.sender, owed);
totalTOPIAEarned += owed;
}
/**
* emergency unstake tokens
* @param tokenIds the IDs of the tokens to claim earnings from
*/
function rescueAlpha(uint16[] calldata tokenIds) external nonReentrant {
require(rescueEnabled, "RESCUE DISABLED");
uint16 tokenId;
for (uint i = 0; i < tokenIds.length; i++) {
tokenId = tokenIds[i];
require(alpha[tokenId].owner == msg.sender, "SWIPER, NO SWIPING");
delete alpha[tokenId];
numAlphasStaked -= 1;
alphaOwnedIds[msg.sender].remove(tokenId);
lfAlpha.transferFrom(address(this), msg.sender, tokenId);
emit AlphaUnstaked(msg.sender, tokenId, block.number, block.timestamp);
}
HUB.emitAlphaUnstaked(msg.sender, tokenIds);
}
/** ADMIN */
/**
* allows owner to enable "rescue mode"
* simplifies accounting, prioritizes tokens out in emergency
*/
function setRescueEnabled(bool _enabled) external onlyOwner {
rescueEnabled = _enabled;
}
function isOwner(uint16 tokenId, address owner) external view override returns (bool validOwner) {
if (genesisType[tokenId] == 1) {
return cat[tokenId].owner == owner;
} else if (genesisType[tokenId] == 2) {
return dog[tokenId].owner == owner;
} else if (genesisType[tokenId] == 3) {
return veterinarian[tokenId].owner == owner;
}
}
/**
* enables owner to pause / unpause contract
*/
function setPaused(bool _paused) external requireContractsSet onlyOwner {
if (_paused) _pause();
else _unpause();
}
/** READ ONLY */
function getUnclaimedAlpha(uint16 tokenId) external view returns (uint256) {
if(alpha[tokenId].value > 0) {
if(block.timestamp <= claimEndTime) {
return (block.timestamp - alpha[tokenId].value) * DAILY_ALPHA_RATE / PERIOD;
} else if (alpha[tokenId].value < claimEndTime) {
return (claimEndTime - alpha[tokenId].value) * DAILY_ALPHA_RATE / PERIOD;
} else {
return 0;
}
} else {
return 0;
}
}
function getUnclaimedGenesis(uint16 tokenId) external view returns (uint256 owed) {
owed = 0;
if (genesisType[tokenId] == 1 && cat[tokenId].value > 0) {
if(block.timestamp <= claimEndTime) {
return (block.timestamp - cat[tokenId].value) * DAILY_CAT_RATE / PERIOD;
} else if (cat[tokenId].value < claimEndTime) {
return (claimEndTime - cat[tokenId].value) * DAILY_CAT_RATE / PERIOD;
} else {
return 0;
}
} else if (genesisType[tokenId] == 2 && dog[tokenId].owner != address(0)) {
return TOPIAPerDog - dog[tokenId].value;
} else if (genesisType[tokenId] == 3 && veterinarian[tokenId].owner != address(0)) {
return TOPIAPerVeterinarian - veterinarian[tokenId].value;
}
return owed;
}
function getUnclaimedTopiaForUser(address _account) external view returns (uint256) {
uint256 owed;
uint256 genesisLength = genesisOwnedIds[_account].length();
uint256 alphaLength = alphaOwnedIds[_account].length();
for (uint i = 0; i < genesisLength; i++) {
uint16 tokenId = uint16(genesisOwnedIds[_account].at(i));
if (genesisType[tokenId] == 1) {
if(block.timestamp <= claimEndTime) {
owed += (block.timestamp - cat[tokenId].value) * DAILY_CAT_RATE / PERIOD;
} else if (cat[tokenId].value < claimEndTime) {
owed += (claimEndTime - cat[tokenId].value) * DAILY_CAT_RATE / PERIOD;
} else {
owed += 0;
}
} else if (genesisType[tokenId] == 2) {
owed += TOPIAPerDog - dog[tokenId].value;
} else if (genesisType[tokenId] == 3) {
owed += TOPIAPerVeterinarian - veterinarian[tokenId].value;
} else if (genesisType[tokenId] == 0) {
continue;
}
}
for (uint i = 0; i < alphaLength; i++) {
uint16 tokenId = uint16(alphaOwnedIds[_account].at(i));
if(block.timestamp <= claimEndTime) {
owed += (block.timestamp - alpha[tokenId].value) * DAILY_ALPHA_RATE / PERIOD;
} else if (cat[tokenId].value < claimEndTime) {
owed += (claimEndTime - alpha[tokenId].value) * DAILY_ALPHA_RATE / PERIOD;
} else {
owed += 0;
}
}
return owed;
}
function getStakedGenesisForUser(address _account) external view returns (uint16[] memory stakedGensis) {
uint256 length = genesisOwnedIds[_account].length();
stakedGensis = new uint16[](length);
for (uint i = 0; i < length; i++) {
stakedGensis[i] = uint16(genesisOwnedIds[_account].at(i));
}
}
function getStakedAlphasForUser(address _account) external view returns (uint16[] memory stakedAlphas) {
uint256 length = alphaOwnedIds[_account].length();
stakedAlphas = new uint16[](length);
for (uint i = 0; i < length; i++) {
stakedAlphas[i] = uint16(alphaOwnedIds[_account].at(i));
}
}
/**
* chooses a random Dog thief when an unstaking token is stolen
* @param seed a random value to choose a Dog from
* @return the owner of the randomly selected Cat thief
*/
function randomDogOwner(uint256 seed) internal view returns (address) {
if (dogIds.length() == 0) {
return address(0x0);
}
uint256 bucket = (seed & 0xFFFFFFFF) % dogIds.length();
return dog[dogIds.at(bucket)].owner;
}
/**
* chooses a random Veterinarian thief when a an unstaking token is stolen
* @param seed a random value to choose a Veterinarian from
* @return the owner of the randomly selected Dog thief
*/
function randomVeterinarianOwner(uint256 seed) internal view returns (address) {
if (veterinarianIds.length() == 0) {
return address(0x0);
}
uint256 bucket = (seed & 0xFFFFFFFF) % veterinarianIds.length();
return veterinarian[veterinarianIds.at(bucket)].owner;
}
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external pure override returns (bytes4) {
return IERC721Receiver.onERC721Received.selector;
}
function updateMinimumExit(uint256 _minimum) external onlyOwner {
MINIMUM = _minimum;
}
function updatePeriod(uint256 _period) external onlyOwner {
PERIOD = _period;
}
function updateDailyCatRate(uint256 _rate) external onlyOwner {
DAILY_CAT_RATE = _rate;
}
function updateDailyAlphaRate(uint256 _rate) external onlyOwner {
DAILY_ALPHA_RATE = _rate;
}
function updateTaxRates(uint8 _dogRate, uint8 _vetRate) external onlyOwner {
require(_dogRate + _vetRate == 100, "rates must equal 100");
DOG_TAX_RATE = _dogRate;
VETERINARIAN_TAX_RATE = _vetRate;
}
function updateSeedCost(uint256 _cost) external onlyOwner {
SEED_COST = _cost;
}
function closeSeasonEearnings(uint80 _timestamp) external onlyOwner {
claimEndTime = _timestamp;
}
}// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;
interface IRandomizer {
function requestRandomWords() external returns (uint256);
function requestManyRandomWords(uint256 numWords) external returns (uint256);
function getRandomWords(uint256 number) external returns (uint256[] memory);
function getRemainingWords() external view returns (uint256);
}// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;
interface IDogeWorld {
function addManyToStakingPool(address account, uint16[] calldata tokenIds) external;
function isOwner(uint16 tokenId, address owner) external view returns (bool);
}// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;
interface IHub {
function emitGenesisStaked(address owner, uint16[] calldata tokenIds, uint8 gameId) external;
function emitAlphaStaked(address owner, uint16[] calldata tokenIds, uint8 gameId) external;
function emitGenesisUnstaked(address owner, uint16[] calldata tokenIds) external;
function emitAlphaUnstaked(address owner, uint16[] calldata tokenIds) external;
function emitTopiaClaimed(address owner, uint256 amount) external;
function balanceOf(address owner) external view returns (uint256);
}// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;
interface ITOPIA {
function mint(address to, uint256 amount) external;
function burn(uint256 amount) external;
function burnFrom(address from, uint256 amount) external;
function updateOriginAccess() external;
function transferFrom(address sender, address recipient, uint256 amount) external returns(bool);
}// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
interface INFT is IERC721Enumerable {
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol)
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet.
* ====
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastValue;
// Update the index for the moved value
set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
return _values(set._inner);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "byzantium",
"viaIR": true,
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"unstaked","type":"bool"},{"indexed":false,"internalType":"uint256","name":"earned","type":"uint256"}],"name":"AlphaClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AlphaStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"AlphaUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"unstaked","type":"bool"},{"indexed":false,"internalType":"uint256","name":"earned","type":"uint256"}],"name":"CatClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"tokenId","type":"uint16"},{"indexed":true,"internalType":"address","name":"victim","type":"address"},{"indexed":true,"internalType":"address","name":"thief","type":"address"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"CatStolen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"CatUnStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"unstaked","type":"bool"},{"indexed":false,"internalType":"uint256","name":"earned","type":"uint256"}],"name":"DogClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"tokenId","type":"uint16"},{"indexed":true,"internalType":"address","name":"victim","type":"address"},{"indexed":true,"internalType":"address","name":"thief","type":"address"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"DogStolen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"DogUnStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"tokenType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"unstaked","type":"bool"},{"indexed":false,"internalType":"uint256","name":"earned","type":"uint256"}],"name":"VeterinarianClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"VeterinarianUnStaked","type":"event"},{"inputs":[],"name":"DAILY_ALPHA_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAILY_CAT_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOG_TAX_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HUB","outputs":[{"internalType":"contract IHub","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RANK","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEED_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOPIAToken","outputs":[{"internalType":"contract ITOPIA","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VETERINARIAN_TAX_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"addManyAlphaToStakingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"addManyToStakingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEndTime","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bool","name":"unstake","type":"bool"}],"name":"claimManyAlphas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bool","name":"unstake","type":"bool"}],"name":"claimManyFromArmoryAndYield","outputs":[{"internalType":"uint16[]","name":"stolenNFTs","type":"uint16[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint80","name":"_timestamp","type":"uint80"}],"name":"closeSeasonEearnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"genesisType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getStakedAlphasForUser","outputs":[{"internalType":"uint16[]","name":"stakedAlphas","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getStakedGenesisForUser","outputs":[{"internalType":"uint16[]","name":"stakedGensis","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"getUnclaimedAlpha","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"getUnclaimedGenesis","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getUnclaimedTopiaForUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"address","name":"owner","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"validOwner","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lfAlpha","outputs":[{"internalType":"contract INFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lfGenesis","outputs":[{"internalType":"contract INFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomizer","outputs":[{"internalType":"contract IRandomizer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"rescueAlpha","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"uint8[]","name":"_types","type":"uint8[]"}],"name":"setBatchNFTType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lfGenesis","type":"address"},{"internalType":"address","name":"_lfAlpha","type":"address"},{"internalType":"address","name":"_TOPIA","type":"address"},{"internalType":"address","name":"_HUB","type":"address"},{"internalType":"address payable","name":"_rand","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setRescueEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalTOPIAEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"updateDailyAlphaRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"updateDailyCatRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimum","type":"uint256"}],"name":"updateMinimumExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"updatePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"updateSeedCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_dogRate","type":"uint8"},{"internalType":"uint8","name":"_vetRate","type":"uint8"}],"name":"updateTaxRates","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608080604052346100f1576000805433600160a060020a03198216811783557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258936020939092600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09084a360018055600160ff1960025416620151806008556801158e460913d00000601e556801e5b8fa8fe2ac0000601f5568022b1c8c1227a0000080855560215561012c806022556023556602d79883d200006024556aff00000000000000000000196026541660265517600255338152a160405161454c90816100f78239f35b600080fdfe6080604052600436101561001257600080fd5b7c01000000000000000000000000000000000000000000000000000000006000350480630a6b6f1c14611eee57806313667ed814611909578063140233cf146118eb578063150b7a021461186957806316c38b3c146116e357806318f5c7711461166a5780631b218df514611643578063201123781461162557806321c8da9a146111ae5780632b6c88bf146111135780632d062c3f146110f557806339db714f146110c557806340d1d2551461109e5780634f047196146110595780635a3082dc1461103b5780635c975abb1461101857806367efe74914610ff15780636f7c0d4614610fb0578063715018a614610f525780637653100814610efa5780637bc09e3e14610ed95780637d5f954714610ebb578063887dd1db14610e245780638aca0cad14610e035780638da5cb5b14610ddc5780639073c1b314610db95780639c484b5c14610d9c5780639e3bcb8d14610d80578063a079eb9514610d62578063a2bddd1714610d3b578063a4c52b8614610d14578063a6d2de9814610ce9578063b4d1d79514610ccb578063bd48652e14610cad578063be07528b14610c77578063c2286ab514610974578063dbce286414610941578063dbdfa89914610920578063e270d1df146108ff578063e4e85a9e1461060c578063e5d7c2bc146105d4578063e835bae3146105b3578063efa09d68146103e4578063f10fb584146103bd578063f2fde38b146102dd5763f63bf8bd1461023257600080fd5b346102d85760a03660031901126102d85761024b61210c565b610253612122565b90604435600160a060020a03908181168091036102d857606435918083168093036102d857608435948186168096036102d85761028e612217565b81600160a060020a031995168560095416176009551683600a541617600a5582600b541617600b558282600d541617600d5581600c541617600c55600e541617600e556000604051f35b600080fd5b346102d85760203660031901126102d8576102f661210c565b6102fe612217565b600160a060020a038091169081156103505760009182549181600160a060020a0319841617845560405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08484a3f35b608460405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346102d85760003660031901126102d8576020600160a060020a03600d5416604051908152f35b346102d85760403660031901126102d85767ffffffffffffffff6004358181116102d8576104169036906004016120dc565b9060249283359081116102d8576104319036906004016120dc565b9261043a612217565b8381036105205760005b61ffff808216908382101561051e5760ff908161046a610465858b8a612272565b61229b565b16156104d75761049161048c610484610465868c8b612272565b94878a612272565b6122a9565b1660005260036020526040600020911660ff1982541617905561ffff8091169081146104bf57600101610444565b8560e060020a634e487b710260005260116004526000fd5b606489601e6040519160e560020a62461bcd028352602060048401528201527f496e76616c6964206e66742074797065202d2063616e6e6f74206265203000006044820152fd5b005b60a485605a6040519160e560020a62461bcd028352602060048401528201527f205f69644e756d626572732e6c656e67746820213d205f74797065732e6c656e60448201527f6774683a204561636820746f6b656e204944206d75737420686176652065786160648201527f63746c79203120636f72726573706f6e64696e672074797065210000000000006084820152fd5b346102d85760203660031901126102d8576105cc612217565b600435602055005b346102d85760203660031901126102d85761ffff6105f0612206565b166000526003602052602060ff60406000205416604051908152f35b346102d85761061a36612138565b61062c600260019493945414156122b8565b600260015561063c333214612306565b61065032600160a060020a03841614612354565b60005b8181106106dc5750600160a060020a03600c5416803b156102d8576106ac9360008094604051968795869485937fdca3b79e000000000000000000000000000000000000000000000000000000008552600485016124f7565b03925af180156106d0576106c1575b60018055005b6106ca906123b1565b806106bb565b6040513d6000823e3d90fd5b600160a060020a03600a54166106f661048c838588612272565b61ffff604051917f6352211e000000000000000000000000000000000000000000000000000000008352166004820152602081602481855afa80156106d057610752916000916108d0575b50600160a060020a0316331461243b565b61076061048c838588612272565b90803b156102d85761079260009291839260405194858094819360e060020a6323b872dd028352303360048501612489565b03925af180156106d0576108c1575b5061080f6107b361048c838588612272565b61ffff604051916107c3836123de565b168152426001605060020a031660208201819052600160a060020a0386166040830152606082015261ffff6107fc61048c85878a612272565b1660005260106020526040600020612559565b600160a060020a0383166000526019602052610841604060002061ffff61083a61048c85878a612272565b169061278b565b506007908154600181018091116108a8576108a3925561ffff61086861048c838689612272565b166040514281527f9a3548e7da710b05c129b310e734c5830e4c53cc9255c7d47219adf7f1098ea16020600160a060020a03881692a36123a2565b610653565b60e060020a634e487b7102600052601160045260246000fd5b6108ca906123b1565b846107a1565b6108f2915060203d6020116108f8575b6108ea81836123fa565b81019061241c565b87610741565b503d6108e0565b346102d85760203660031901126102d857610918612217565b600435600855005b346102d85760203660031901126102d857610939612217565b600435601e55005b346102d8576106bb610952366121ca565b9161095b6125d6565b61096a600260015414156122b8565b6002600155613d21565b346102d8576020806003193601126102d85761098e61210c565b600160a060020a0360009116806000526018808452604060002054601991828652604060002054916000915b818310610ad0575050506000916001605060020a039081602654169081421115955b8486106109ed578888604051908152f35b9091929394959796610a6b908260005283895261ffff610a11896040600020612697565b905460089291830260020a9004168b15610a7957610a659291610a5f9160005260108c52610a57610a4e8a6201000060406000205404164261380f565b601f549061282d565b9054906137ec565b906125c9565b966123a2565b9493929190979596976109dc565b600052600f8a5286620100008b888383604060002054041610600014610ac657610abb610a5f93610a659695936010610a57945260406000205404168a6137d3565b8a601f54911661282d565b50505050966123a2565b9091949392969584600052818752610aec866040600020612697565b91905461ffff6008918260029502850a900416806000526003808b5260ff946001866040600020541614600014610bd5575050602654610b7494506001605060020a03918b918316428110610b815750610b65610a5f93600f610b6e979694610a5794600052526201000060406000205404164261380f565b601e549061282d565b956123a2565b91909692939495966109ba565b9150600052600f8b5262010000818382604060002054041610600014610bcb5782610bc1610b6e969593610a5f95610a57946040600020540416906137d3565b601e54911661282d565b50505050956123a2565b909193948093506040600020541614600014610c22575050610b7491610a5f610b6e92601b549060005260118b526001605060020a036201000060406000205404169061380f565b6123a2565b908092506040600020541614600014610c615750610b6e610b7491610a5f601d5460148b526001605060020a036201000060406000205404169061380f565b95610b74919660406000205416610c1d576123a2565b346102d85760403660031901126102d8576020610ca3610c95612206565b610c9d612122565b90614186565b6040519015158152f35b346102d85760003660031901126102d8576020602554604051908152f35b346102d85760003660031901126102d8576020600854604051908152f35b346102d85760203660031901126102d8576020610d0c610d07612206565b6142c8565b604051908152f35b346102d85760003660031901126102d8576020600160a060020a03600c5416604051908152f35b346102d85760003660031901126102d8576020600160a060020a03600a5416604051908152f35b346102d85760003660031901126102d8576020601e54604051908152f35b346102d85760003660031901126102d857602060405160088152f35b346102d85760003660031901126102d85760208054604051908152f35b346102d85760203660031901126102d8576020610d0c610dd7612206565b614237565b346102d85760003660031901126102d8576020600160a060020a0360005416604051908152f35b346102d85760203660031901126102d857610e1c612217565b600435602455005b346102d8576020806003193601126102d857600160a060020a03610e4661210c565b169081600052601880825260406000205491610e6183612858565b9360005b848110610e7e5760405180610e7a888261218b565b0390f35b610eb6908260005284845261ffff6008610e9c836040600020612697565b9054910260020a900416610eb0828961288a565b526123a2565b610e65565b346102d85760003660031901126102d8576020602454604051908152f35b346102d85760203660031901126102d857610ef2612217565b600435601f55005b346102d85760203660031901126102d857610f1361217c565b610f1b612217565b602680546aff0000000000000000000019169115156a0100000000000000000000026aff0000000000000000000016919091179055005b346102d85760003660031901126102d857610f6b612217565b60008054600160a060020a03198116825581600160a060020a0360405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08284a3f35b610e7a610fe1610fbf366121ca565b91610fc86125d6565b610fd7600260015414156122b8565b60026001556128c0565b600180556040519182918261218b565b346102d85760003660031901126102d8576020600160a060020a0360095416604051908152f35b346102d85760003660031901126102d857602060ff600254166040519015158152f35b346102d85760003660031901126102d8576020602254604051908152f35b346102d85760203660031901126102d8576004356001605060020a0381168091036102d857611086612217565b6001605060020a031960265416176026556000604051f35b346102d85760003660031901126102d85760206001605060020a0360265416604051908152f35b346102d85760003660031901126102d857602060ff6a010000000000000000000060265404166040519015158152f35b346102d85760003660031901126102d8576020602154604051908152f35b346102d85760403660031901126102d85760043560ff81168091036102d8576024359060ff82168092036102d857611149612217565b81810160ff81116108a85760ff606491160361116757602255602355005b606460405160e560020a62461bcd02815260206004820152601460248201527f7261746573206d75737420657175616c203130300000000000000000000000006044820152fd5b346102d85760203660031901126102d85760043567ffffffffffffffff81116102d8576111df9036906004016120dc565b906111ef600260015414156122b8565b600260015561120f60ff6a01000000000000000000006026540416613b49565b60005b82811061126c5750600160a060020a03600c541691823b156102d8576106ac92600092836040518096819582947fd8cd1ec4000000000000000000000000000000000000000000000000000000008452336004850161289d565b61127a61048c828585612272565b9061ffff808316600052600380602052600160ff604060002054161460001461139f5750808316600052600f80602052600160a060020a03906112cb82606060020a60406000205404163314613b97565b828516600052602052600060016040822082815501553360005260186020526112fa82851660406000206139fe565b5060045460001981019081116108a8576004556009541692833b156102d8576000604051809560e160020a635c46a7ef02825281838161133f87333060048501613826565b03925af19384156106d05760206001937f9d0506b1ae607b45d2348e6a50324de1b56a719784a612e9813b81a4d89160559261138b97611390575b5060405193600085521692a36123a2565b611212565b611399906123b1565b8961137a565b60406000205460ff166002036114a657508083166000526011602052600160a060020a036113db81606060020a60406000205404163314613b97565b8382166000818152601160205260408120818155600101556113fc90613951565b5033600052601860205261141682851660406000206139fe565b50600580546000198101919082116108a857556009541692833b156102d8576000604051809560e160020a635c46a7ef02825281838161145b87333060048501613826565b03925af19384156106d05760206001937f0d572cea43328e1d4e1413c88ed43ad6f3b2110c4c8dc5b69bb45bad6fecb3b29261138b97611390575060405193600085521692a36123a2565b60406000205460ff1681036115ae5750808316600052601480602052600160a060020a03906114e382606060020a60406000205404163314613b97565b8285166000526020526000600160408220828155015561150482851661385a565b5033600052601860205261151e82851660406000206139fe565b50600680546000198101919082116108a857556009541692833b156102d8576000604051809560e160020a635c46a7ef02825281838161156387333060048501613826565b03925af19384156106d05760206001937fec79ac5fef475f3046422d4af4bec1c70dfb25c3dc442e2b04d3871a49d92ae99261138b97611390575060405193600085521692a36123a2565b9192506115bf61048c848787612272565b1660005260205260ff60406000205416156115dd5761138b906123a2565b60405160e560020a62461bcd02815260206004820152601060248201527f696e76616c696420746f6b656e206964000000000000000000000000000000006044820152606490fd5b346102d85760003660031901126102d8576020602354604051908152f35b346102d85760003660031901126102d8576020600160a060020a03600b5416604051908152f35b346102d8576020806003193601126102d857600160a060020a0361168c61210c565b1690816000526019808252604060002054916116a783612858565b9360005b8481106116c05760405180610e7a888261218b565b6116de908260005284845261ffff6008610e9c836040600020612697565b6116ab565b346102d85760203660031901126102d8576116fc61217c565b600160a060020a0380600954161515908161185b575b8161184d575b8161183f575b50156117f85761172c612217565b15611772576117396125d6565b600160ff1960025416176002557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b60025460ff8116156117b15760ff19166002557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b606460405160e560020a62461bcd02815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152fd5b606460405160e560020a62461bcd02815260206004820152601160248201527f436f6e747261637473206e6f74207365740000000000000000000000000000006044820152fd5b9050600c541615158261171e565b600d54811615159150611718565b600b54811615159150611712565b346102d85760803660031901126102d85761188261210c565b5061188b612122565b5060643567ffffffffffffffff8082116102d857366023830112156102d85781600401359081116102d857369101602401116102d85760206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b346102d85760003660031901126102d8576020601f54604051908152f35b346102d85761191736612138565b611929600260019493945414156122b8565b6002600155611939333214612306565b61194d32600160a060020a03841614612354565b60005b8181106119a95750600160a060020a03600c5416803b156102d8576106ac9360008094604051968795869485937fb25ada4a000000000000000000000000000000000000000000000000000000008552600485016124f7565b929190600160a060020a03600954166119c661048c868487612272565b61ffff604051917f6352211e000000000000000000000000000000000000000000000000000000008352166004820152602081602481855afa80156106d057611a21916000916108d05750600160a060020a0316331461243b565b61ffff611a3261048c878588612272565b16600052600360205260ff6001816040600020541614600014611b99575050909192600160a060020a0360095416611a6e61048c838588612272565b90803b156102d857611aa060009291839260405194858094819360e060020a6323b872dd028352303360048501612489565b03925af180156106d057611b8a575b5061ffff611ac161048c838588612272565b1690611b0d6001605060020a03421660405190611add826123de565b848252806020830152600160a060020a0387166040830152606082015283600052600f6020526040600020612559565b600160a060020a0384166000526018602052611b2d82604060002061278b565b5060045491600183018093116108a857611b8592600455604051600181524260208201527fadd17b9d82cb146eaff151f4f864faa55b09599b4eff7714935025b99054fe1c6040600160a060020a03881692a36123a2565b611950565b611b93906123b1565b84611aaf565b61ffff611baa61048c888689612272565b1660005260036020526002816040600020541614600014611d3e575050600160a060020a0360095416611be161048c868487612272565b90803b156102d857611c1360009291839260405194858094819360e060020a6323b872dd028352303360048501612489565b03925af180156106d057611d2f575b5061ffff611c3461048c868487612272565b1693611c3e6125d6565b6001605060020a0394601b868154169660405197611c5b896123de565b8389526020890152600160a060020a03861660408901524216606088015281600052611c91601197886020526040600020612559565b611c9a82612739565b50600160a060020a0385166000526018602052611cbb82604060002061278b565b50600580549060018201809211611d1757611b8595969798505554604051906002825260208201527fadd17b9d82cb146eaff151f4f864faa55b09599b4eff7714935025b99054fe1c6040600160a060020a03881692a36123a2565b8860e060020a634e487b710260005260045260246000fd5b611d38906123b1565b84611c22565b61ffff611d5361048c8886899a979899612272565b1660005260036020526003816040600020541614600014611ebd5750611d7d61048c838588612272565b90803b156102d857611daf60009291839260405194858094819360e060020a6323b872dd028352303360048501612489565b03925af180156106d057611eae575b5061ffff611dd061048c838588612272565b1690611dda6125d6565b6001605060020a0391611e2c601d93808554169060405191611dfb836123de565b8483526020830152600160a060020a0388166040830152421660608201528260005260146020526040600020612559565b611e35816126af565b50600160a060020a0385166000526018602052611e5681604060002061278b565b506006928354600181018091116108a857611b85945554604051906003825260208201527fadd17b9d82cb146eaff151f4f864faa55b09599b4eff7714935025b99054fe1c6040600160a060020a03881692a36123a2565b611eb7906123b1565b84611dbe565b905061ffff611ed061048c848689612272565b16600052600360205260406000205416156115dd57611b85906123a2565b346102d8576020806003193601126102d85760043567ffffffffffffffff81116102d857611f209036906004016120dc565b90600192611f326002855414156122b8565b60028455611f5160ff6a01000000000000000000006026540416613b49565b60005b838110611fcf575050600160a060020a03600c541691823b156102d857611faf92600092836040518096819582947fc5f52096000000000000000000000000000000000000000000000000000000008452336004850161289d565b03925af180156106d057611fc257508055005b611fcb906123b1565b8055005b611fdd61048c828686612272565b9061ffff8216806000526010808552600160a060020a039061200d3383606060020a604060002054041614613b97565b826000528552600088604082208281550155600780549060001982019182116108a8575533600052601985526120478260406000206139fe565b50600a5416803b156102d85761207d60009491859260405196878094819360e060020a6323b872dd028352333060048501612489565b03925af19283156106d0576120c8936120cd575b5060405143815242858201527f01284f151397024a42410c824f8bbe00dc1e79227f1bd99799bdf4878c9385d060403392a36123a2565b611f54565b6120d6906123b1565b87612091565b9181601f840112156102d85782359167ffffffffffffffff83116102d8576020808501948185020101116102d857565b60043590600160a060020a03821682036102d857565b60243590600160a060020a03821682036102d857565b9060406003198301126102d857600435600160a060020a03811681036102d857916024359067ffffffffffffffff82116102d857612178916004016120dc565b9091565b6004359081151582036102d857565b6020908160408183019282815285518094520193019160005b8281106121b2575050505090565b835161ffff16855293810193928101926001016121a4565b60406003198201126102d8576004359067ffffffffffffffff82116102d8576121f5916004016120dc565b909160243580151581036102d85790565b6004359061ffff821682036102d857565b600160a060020a0360005416330361222b57565b606460405160e560020a62461bcd02815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9190811015612282576020020190565b60e060020a634e487b7102600052603260045260246000fd5b3560ff811681036102d85790565b3561ffff811681036102d85790565b156122bf57565b606460405160e560020a62461bcd02815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b1561230d57565b606460405160e560020a62461bcd02815260206004820152600860248201527f4f6e6c7920454f410000000000000000000000000000000000000000000000006044820152fd5b1561235b57565b606460405160e560020a62461bcd02815260206004820152601860248201527f6163636f756e7420746f2073656e64206d69736d6174636800000000000000006044820152fd5b60001981146108a85760010190565b67ffffffffffffffff81116123c557604052565b60e060020a634e487b7102600052604160045260246000fd5b6080810190811067ffffffffffffffff8211176123c557604052565b90601f8019910116810190811067ffffffffffffffff8211176123c557604052565b908160209103126102d85751600160a060020a03811681036102d85790565b1561244257565b606460405160e560020a62461bcd02815260206004820152601860248201527f596f7520646f6e2774206f776e207468697320746f6b656e00000000000000006044820152fd5b600160a060020a0391821681529116602082015261ffff909116604082015260600190565b9190808252602080920192916000805b8382106124cd57505050505090565b9091929394853561ffff81168091036124f35781528301948301939291600101906124be565b8280fd5b939260029261251f91600160a060020a036040941687526060602088015260608701916124ae565b930152565b906bffffffffffffffffffff0000620100006001605060020a03845493160216906bffffffffffffffffffff00001916179055565b61ffff82511661ffff19825416178155606060016001605060020a03926125868460208701511682612524565b600160a060020a036040860151166bffffffffffffffffffffffff825491606060020a8219910216911617815501920151166001605060020a0319825416179055565b919082018092116108a857565b60ff600254166125e257565b606460405160e560020a62461bcd02815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152fd5b6015548110156122825760156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750190600090565b6012548110156122825760126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440190600090565b80548210156122825760005260206000200190600090565b600081815260166020526040812054612734576015546801000000000000000081101561271d5790826127096126ed84600160409601601555612629565b819391549060080260020a918260000392839102169119161790565b905560155492815260166020522055600190565b60248260e060020a634e487b710281526041600452fd5b905090565b600081815260136020526040812054612734576012546801000000000000000081101561271d5790826127776126ed84600160409601601255612660565b905560125492815260136020522055600190565b919060018301600090828252806020526040822054156000146127fb57845494680100000000000000008610156127e457836127d46126ed886001604098999a01855584612697565b9055549382526020522055600190565b60248360e060020a634e487b710281526041600452fd5b50925050565b8060001904601911811515166108a85760190290565b8060001904604b11811515166108a857604b0290565b80600019048211811515166108a8570290565b67ffffffffffffffff81116123c55760208091020190565b9061286282612840565b61286f60405191826123fa565b8281528092612880601f1991612840565b0190602036910137565b8051821015612282576020809202010190565b604090600160a060020a036128bd959316815281602082015201916124ae565b90565b909291926128cf333214612306565b602454916128df8260009461282d565b340361373e5784156136d6576128f482612858565b94600160a060020a03600c5416803b156136d2578460405180927fd8cd1ec40000000000000000000000000000000000000000000000000000000082528183816129438a8a336004850161289d565b03925af18015613607576136bf575b505b600160a060020a03600d5416906040517f4ea943e7000000000000000000000000000000000000000000000000000000008152602081600481865afa9081156136b457908591879161367f575b5010613612578480926024604051809581937f4b3c08f30000000000000000000000000000000000000000000000000000000083528960048401525af1918215613607578592613569575b509190849396959496845b818110612b665750505050509091928015612b6257612a18816025546125c9565b602555600160a060020a03600b5416803b156124f3576040517f40c10f19000000000000000000000000000000000000000000000000000000008152336004820152602481018390529083908290604490829084905af18015612b5757908391612b3f575b5050600160a060020a03600c541690813b156124f3576040517f1fb2e3e700000000000000000000000000000000000000000000000000000000815233600482015260248101919091529082908290604490829084905af18015612b3457908291612b1d575b50808080600160a060020a03600e541681903415612b13575b3491f115612b075750565b604051903d90823e3d90fd5b6108fc9150612afc565b612b26906123b1565b612b31578038612ae3565b80fd5b6040513d84823e3d90fd5b612b48906123b1565b612b53578138612a7d565b5080fd5b6040513d85823e3d90fd5b5050565b61ffff612b7761048c838588612272565b168652600380602052600160ff60408920541614600014612fed5750612ba161048c828487612272565b612bab828561288a565b51879a61ffff83168952600f602052612bd833600160a060020a03606060020a60408d2054041614613785565b60265489906001605060020a0316428110612f805750612c1c610b656001605060020a03620100006040612c259561ffff8a168152600f602052205404164261380f565b600854906137ec565b915b89808a15612f0e576064600a8161ffff86160610600014612ec957505050612c4e90614445565b600160a060020a0360095416803b15612e9a578a60405180927f42842e0e000000000000000000000000000000000000000000000000000000008252818381612c9c8b893060048501612489565b03925af18015612e8f57908b91612eb5575b505060019c5b61ffff85168b52600f6020528a60016040822082815501556004549d8e600019810111612e9e578a9b9c9d9e60009b999a9b1901600455338d526018602052612d058d604061ffff891691206139fe565b5015612dfe575091612dcd91612dd9959493600160a060020a0360405191438352426020840152169033907fbfe03633277207bb2d952ce7fa2845cfabe2b0a760f345ef8247eb8d562864ea604061ffff891692a4835b60405143815242602082015261ffff8216907f76b5f35e80089203e2412b07430e059b3cb41ac9a79d20a6fd2dd3f30416032e60403392a35b6040518381527f9d0506b1ae607b45d2348e6a50324de1b56a719784a612e9813b81a4d8916055602061ffff8c1515941692a36125c9565b97612de7575b506123a2565b9796959497939291936129f7565b61ffff612df4838d61288a565b9116905238612dd3565b94959650509091600160a060020a0360095416803b15612e9a578a604051809260e160020a635c46a7ef028252818381612e3d88333060048501613826565b03925af18015612e8f578a979695949392918c91612e68575b505091612dcd91612dd9959493612d5c565b612e799192939495969798506123b1565b612e8b57908895949392918a38612e56565b8980fd5b6040513d8d823e3d90fd5b8a80fd5b60248c60e060020a634e487b710281526011600452fd5b612ebe906123b1565b612e8b578938612cae565b9092919e918161ffff6201000060329304160610612ee8575b50612cb4565b909380612f0183612efb612f0694612801565b04613be5565b612817565b049238612ee2565b505091612dcd91612dd99594620100008b9c9d9e9f9560329061ffff60649e9c9d9e93849204160610612f65575b5061ffff81168d52600f602052612f608d60406001605060020a0342169120612524565b612d95565b909280612f0183612efb612f7894612801565b049138612f3c565b905061ffff84168a52600f6020528962010000826001605060020a03826040852054041610600014612fe457612fde926001605060020a03612fcc926040612c1c9520540416906137d3565b6001605060020a03601e54911661282d565b91612c27565b50905091612c27565b61ffff612ffe61048c848689612272565b16875280602052600260ff60408920541614600014613326575061302661048c828487612272565b613030828561288a565b5199879061ffff83168952601160205261305e33600160a060020a03606060020a60408d2054041614613afb565b601b549161ffff84168a52601160205261308a6001605060020a036201000060408d205404168461380f565b9289156132e8575089908a9d600a606461ffff8316061061325c575b5061ffff85168b5260116020528a60016040822082815501556130cc61ffff8616613951565b50338b5260186020526130e661ffff861660408d206139fe565b506005549d8e600019810111612e9e578a9b9c9d9e60009b999a9b19016005556000146131cf575091612dcd91612dd9959493600160a060020a0360405191438352426020840152169033907f2e8fd27b98fca4655779498875e649621ade0d8d27de5c6b557d51bec253b1ee604061ffff891692a4835b60405143815242602082015261ffff8216907fb937dd524bce48c03476dedde62ed2caa9be7ca3e870dd867efdbfa12039533460403392a35b6040518381527f0d572cea43328e1d4e1413c88ed43ad6f3b2110c4c8dc5b69bb45bad6fecb3b2602061ffff8c1515941692a36125c9565b94959650509091600160a060020a0360095416803b15612e9a578a604051809260e160020a635c46a7ef02825281838161320e88333060048501613826565b03925af18015612e8f578a979695949392918c91613239575b505091612dcd91612dd995949361315e565b61324a9192939495969798506123b1565b612e8b57908895949392918a38613227565b909d5061326991506144b1565b600160a060020a0360095416803b15612e9a578a60405180927f42842e0e0000000000000000000000000000000000000000000000000000000082528183816132b78b893060048501612489565b03925af18015612e8f57908b916132d4575b505060019c386130a6565b6132dd906123b1565b612e8b5789386132c9565b8a9b9c9d5091846133218b9c60406001605060020a03612dcd979d9e9c9d61ffff612dd99c9b9a989a1684526011602052169120612524565b613197565b61ffff61334061048c8486899a98999e969b9c9d9e612272565b168852806020528060ff60408a20541614600014613539575061ffff61336a61048c888589612272565b16908188526014918260205261339433600160a060020a03606060020a60408d2054041614613afb565b601d5492818a528060205260406133be8b620100006001605060020a03938492205404168661380f565b948b8815613515579050839150526020528860016040822082815501556133e48161385a565b5033895260186020526133fa8160408b206139fe565b50600680546000198101919082116134fe5755600160a060020a0360095416803b15612e8b5789809160a46040518094819360e160020a635c46a7ef028352306004840152336024840152876044840152608060648401528160848401525af180156134f357908a916134db575b505091610b6e9183612dd9946040514381524260208201527faed802881887622cc27c368474bcd51da909a9a27383edb3d5a56b4c317a62ef60403392a35b604051908382527fec79ac5fef475f3046422d4af4bec1c70dfb25c3dc442e2b04d3871a49d92ae9602089151593a36125c9565b6134e4906123b1565b6134ef578838613468565b8880fd5b6040513d8c823e3d90fd5b60248b60e060020a634e487b710281526011600452fd5b9161353491610b6e969486612dd9999795526020521660408d20612524565b6134a7565b61ffff61354d61048c89868a9b969b612272565b16885260205260ff604088205416156115dd57612dd9906123a2565b9091503d8086833e61357b81836123fa565b8101906020818303126135ff5780519067ffffffffffffffff821161360357019080601f830112156135ff5781516135b281612840565b926135c060405194856123fa565b81845260208080860193028201019283116135fb57602001905b8282106135eb5750505090386129ec565b81518152602091820191016135da565b8780fd5b8580fd5b8680fd5b6040513d87823e3d90fd5b608460405160e560020a62461bcd02815260206004820152603160248201527f4e6f7420656e6f7567682072616e646f6d206e756d626572732e20506c65617360448201527f652074727920616761696e20736f6f6e2e0000000000000000000000000000006064820152fd5b9150506020813d6020116136ac575b8161369b602093836123fa565b810103126135ff57849051386129a1565b3d915061368e565b6040513d88823e3d90fd5b6136cb909491946123b1565b9238612952565b8480fd5b604051946040860186811067ffffffffffffffff821117613727576040526001865260208601602036823786511561371057849052612954565b60248560e060020a634e487b710281526032600452fd5b60248560e060020a634e487b710281526041600452fd5b606460405160e560020a62461bcd02815260206004820152601c60248201527f496e76616c69642076616c756520666f722072616e646f6d6e657373000000006044820152fd5b1561378c57565b606460405160e560020a62461bcd02815260206004820152601960248201527f446f6e2774206f776e2074686520676976656e20746f6b656e000000000000006044820152fd5b6001605060020a0391821690821603919082116108a857565b81156137f6570490565b60e060020a634e487b7102600052601260045260246000fd5b919082039182116108a857565b81156137f6570690565b919261ffff9160a094600160a060020a03809216855216602084015216604082015260806060820152600060808201520190565b600081815260166020526040812054909190801561394c5760001990808201818111613935576015549083820191821161391e578082036138e6575b50505060155480156138cf57016138ac81612629565b60088254910260020a850319169055601555815260166020526040812055600190565b60248460e060020a634e487b710281526031600452fd5b61390860086138f76126ed94612629565b9054910260020a9004928392612629565b9055845260166020526040842055388080613896565b60248660e060020a634e487b710281526011600452fd5b60248560e060020a634e487b710281526011600452fd5b505090565b600081815260136020526040812054909190801561394c5760001990808201818111613935576012549083820191821161391e578082036139c6575b50505060125480156138cf57016139a381612660565b60088254910260020a850319169055601255815260136020526040812055600190565b6139e860086139d76126ed94612660565b9054910260020a9004928392612660565b905584526013602052604084205538808061398d565b906001820190600092818452826020526040842054801515600014613af45760001990808201818111613add57835490838201918211613ac657808203613a8d575b50505081548015613a76570190613a578282612697565b60088254910260020a8703191690555582526020526040812055600190565b60248660e060020a634e487b710281526031600452fd5b613ab16008613a9f6126ed9488612697565b9054910260020a900492839287612697565b90558652846020526040862055388080613a40565b60248860e060020a634e487b710281526011600452fd5b60248760e060020a634e487b710281526011600452fd5b5050505090565b15613b0257565b606460405160e560020a62461bcd02815260206004820152601760248201527f446f65736e2774206f776e20676976656e20746f6b656e0000000000000000006044820152fd5b15613b5057565b606460405160e560020a62461bcd02815260206004820152600f60248201527f5245534355452044495341424c454400000000000000000000000000000000006044820152fd5b15613b9e57565b606460405160e560020a62461bcd02815260206004820152601260248201527f5357495045522c204e4f2053574950494e4700000000000000000000000000006044820152fd5b6127109081613bf66022548361282d565b0491613c046023548361282d565b04906005548015808091613d17575b15613c3a57505050613c2a613c3592601a546125c9565b601a55601c546125c9565b601c55565b8080613d0c575b15613c8657505050613c6b613c7491613c5f613c7c94601a546125c9565b601a55601c54906125c9565b600654906137ec565b601d546125c9565b601d556000601c55565b1580613d02575b15613ccb575050613cbb613cb3613caa613c3594601a54906125c9565b600554906137ec565b601b546125c9565b601b556000601a55601c546125c9565b613c7c9350613c74925090613cf1613cb3613c6b93613cec601a54856125c9565b6137ec565b601b556000601a55601c54906125c9565b5060065415613c8d565b506006541515613c41565b5060065415613c13565b613d2c333214612306565b600092835b838110613eae57508315613ea857613e32575b5050600160a060020a0380600c5416803b156102d8576040517f1fb2e3e700000000000000000000000000000000000000000000000000000000815233600482015260248101849052906000908290604490829084905af180156106d057613e23575b50600b541690813b156102d8576040517f40c10f1900000000000000000000000000000000000000000000000000000000815233600482015260248101829052916000908390604490829084905af19182156106d057613e0f92613e14575b506025546125c9565b602555565b613e1d906123b1565b38613e06565b613e2c906123b1565b38613da7565b600160a060020a03600c541691823b156102d857613e8492600092836040518096819582947fc5f52096000000000000000000000000000000000000000000000000000000008452336004850161289d565b03925af180156106d057613e99575b80613d44565b613ea2906123b1565b38613e93565b50505050565b61ffff80613ec061048c848888612272565b166000526010602091818352600160a060020a03604092613eee3383606060020a8760002054041614613785565b876001605060020a039a8b85898d83602654168a888d834211156000146140fd575050505092612c1c92613f2f61048c610a4e94610a5f97613f479a612272565b16600052868b52620100008a6000205404164261380f565b995b898989156140a95785925088613f629261048c92612272565b166000528452600060018482208281550155600780549060001982019182116108a857553360005260198452613fab8360002083613fa461048c898d8d612272565b16906139fe565b50600a5416613fbe61048c868a8a612272565b90803b156102d857613fef600092918392865194858094819360e060020a6323b872dd028352333060048501612489565b03925af1801561409e57917fe9083238ed5c128b67831b957929cef6c82beb49da6f7f4d156f6391a5a651319161408a9695949361408f575b5061403761048c868b8b612272565b81845191438352428784015216907f01284f151397024a42410c824f8bbe00dc1e79227f1bd99799bdf4878c9385d0853392a35b61407961048c868b8b612272565b1691519289845286151593a36123a2565b613d31565b614098906123b1565b38614028565b83513d6000823e3d90fd5b7fe9083238ed5c128b67831b957929cef6c82beb49da6f7f4d156f6391a5a65131945092856140e761048c8b6140f8969561408a9d9c9b9a98612272565b166000528652421684600020612524565b61406b565b9390949195929697988361411561048c858585612272565b16600052858552878962010000809960002054041610600014614177579461416794610a5f989461415561048c8c9996612c1c9b966141719f9e98612272565b16600052528c600020540416906137d3565b601f54911661282d565b99613f49565b50505050505050505099613f49565b60009061ffff600091168082526003602052604092600160ff8585205416146000146141ce57508152600f602052606060020a600160a060020a039283922054041691161490565b8383205460ff166002036141fe575081526011602052606060020a600160a060020a039283922054041691161490565b949392919050600360ff83832054161461421757505050565b60146020522054606060020a9004600160a060020a039081169116149150565b61ffff1660009080825260106020526001605060020a0390620100009082826040862054041615156000146142c2576026548316428110614293575091610a4e91604085612c1c956128bd97526010602052205404164261380f565b82915083819360408720540416106000146142c2578291612c1c936141679260406128bd9720540416906137d3565b50505090565b600061ffff6000921690818352602060038152604091600160ff84872054161480614427575b1561436357506026546001605060020a039390841642811061432c5750610b659285600f612c1c969462010000946128bd995252205404164261380f565b9291600f91865252620100009082848383882054041610600014613af4579183610bc192612c1c95946128bd9720540416906137d3565b600382959252600260ff84842054161480614408575b156143a457506001605060020a0391620100009160116128bd96601b5496835252205404169061380f565b93925060038352600360ff838320541614806143e9575b6143c55750505090565b6128bd93506001605060020a039162010000916014601d549552205404169061380f565b5060148352600160a060020a03606060020a83832054041615156143bb565b5060118552600160a060020a03606060020a8484205404161515614379565b50600f82526001605060020a036201000084872054041615156142ee565b6012549081156144aa578163ffffffff61445f921661381c565b90811015612282577fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344401546000526011602052600160a060020a03606060020a604060002054041690565b5050600090565b6015549081156144aa578163ffffffff6144cb921661381c565b90811015612282577f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47501546000526014602052600160a060020a03606060020a60406000205404169056fea2646970667358221220677f2325239d3a3b0252aa97eebd506dc17ef7d4e6a68363cb4690753ca75fe164736f6c63430008100033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b7c01000000000000000000000000000000000000000000000000000000006000350480630a6b6f1c14611eee57806313667ed814611909578063140233cf146118eb578063150b7a021461186957806316c38b3c146116e357806318f5c7711461166a5780631b218df514611643578063201123781461162557806321c8da9a146111ae5780632b6c88bf146111135780632d062c3f146110f557806339db714f146110c557806340d1d2551461109e5780634f047196146110595780635a3082dc1461103b5780635c975abb1461101857806367efe74914610ff15780636f7c0d4614610fb0578063715018a614610f525780637653100814610efa5780637bc09e3e14610ed95780637d5f954714610ebb578063887dd1db14610e245780638aca0cad14610e035780638da5cb5b14610ddc5780639073c1b314610db95780639c484b5c14610d9c5780639e3bcb8d14610d80578063a079eb9514610d62578063a2bddd1714610d3b578063a4c52b8614610d14578063a6d2de9814610ce9578063b4d1d79514610ccb578063bd48652e14610cad578063be07528b14610c77578063c2286ab514610974578063dbce286414610941578063dbdfa89914610920578063e270d1df146108ff578063e4e85a9e1461060c578063e5d7c2bc146105d4578063e835bae3146105b3578063efa09d68146103e4578063f10fb584146103bd578063f2fde38b146102dd5763f63bf8bd1461023257600080fd5b346102d85760a03660031901126102d85761024b61210c565b610253612122565b90604435600160a060020a03908181168091036102d857606435918083168093036102d857608435948186168096036102d85761028e612217565b81600160a060020a031995168560095416176009551683600a541617600a5582600b541617600b558282600d541617600d5581600c541617600c55600e541617600e556000604051f35b600080fd5b346102d85760203660031901126102d8576102f661210c565b6102fe612217565b600160a060020a038091169081156103505760009182549181600160a060020a0319841617845560405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08484a3f35b608460405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346102d85760003660031901126102d8576020600160a060020a03600d5416604051908152f35b346102d85760403660031901126102d85767ffffffffffffffff6004358181116102d8576104169036906004016120dc565b9060249283359081116102d8576104319036906004016120dc565b9261043a612217565b8381036105205760005b61ffff808216908382101561051e5760ff908161046a610465858b8a612272565b61229b565b16156104d75761049161048c610484610465868c8b612272565b94878a612272565b6122a9565b1660005260036020526040600020911660ff1982541617905561ffff8091169081146104bf57600101610444565b8560e060020a634e487b710260005260116004526000fd5b606489601e6040519160e560020a62461bcd028352602060048401528201527f496e76616c6964206e66742074797065202d2063616e6e6f74206265203000006044820152fd5b005b60a485605a6040519160e560020a62461bcd028352602060048401528201527f205f69644e756d626572732e6c656e67746820213d205f74797065732e6c656e60448201527f6774683a204561636820746f6b656e204944206d75737420686176652065786160648201527f63746c79203120636f72726573706f6e64696e672074797065210000000000006084820152fd5b346102d85760203660031901126102d8576105cc612217565b600435602055005b346102d85760203660031901126102d85761ffff6105f0612206565b166000526003602052602060ff60406000205416604051908152f35b346102d85761061a36612138565b61062c600260019493945414156122b8565b600260015561063c333214612306565b61065032600160a060020a03841614612354565b60005b8181106106dc5750600160a060020a03600c5416803b156102d8576106ac9360008094604051968795869485937fdca3b79e000000000000000000000000000000000000000000000000000000008552600485016124f7565b03925af180156106d0576106c1575b60018055005b6106ca906123b1565b806106bb565b6040513d6000823e3d90fd5b600160a060020a03600a54166106f661048c838588612272565b61ffff604051917f6352211e000000000000000000000000000000000000000000000000000000008352166004820152602081602481855afa80156106d057610752916000916108d0575b50600160a060020a0316331461243b565b61076061048c838588612272565b90803b156102d85761079260009291839260405194858094819360e060020a6323b872dd028352303360048501612489565b03925af180156106d0576108c1575b5061080f6107b361048c838588612272565b61ffff604051916107c3836123de565b168152426001605060020a031660208201819052600160a060020a0386166040830152606082015261ffff6107fc61048c85878a612272565b1660005260106020526040600020612559565b600160a060020a0383166000526019602052610841604060002061ffff61083a61048c85878a612272565b169061278b565b506007908154600181018091116108a8576108a3925561ffff61086861048c838689612272565b166040514281527f9a3548e7da710b05c129b310e734c5830e4c53cc9255c7d47219adf7f1098ea16020600160a060020a03881692a36123a2565b610653565b60e060020a634e487b7102600052601160045260246000fd5b6108ca906123b1565b846107a1565b6108f2915060203d6020116108f8575b6108ea81836123fa565b81019061241c565b87610741565b503d6108e0565b346102d85760203660031901126102d857610918612217565b600435600855005b346102d85760203660031901126102d857610939612217565b600435601e55005b346102d8576106bb610952366121ca565b9161095b6125d6565b61096a600260015414156122b8565b6002600155613d21565b346102d8576020806003193601126102d85761098e61210c565b600160a060020a0360009116806000526018808452604060002054601991828652604060002054916000915b818310610ad0575050506000916001605060020a039081602654169081421115955b8486106109ed578888604051908152f35b9091929394959796610a6b908260005283895261ffff610a11896040600020612697565b905460089291830260020a9004168b15610a7957610a659291610a5f9160005260108c52610a57610a4e8a6201000060406000205404164261380f565b601f549061282d565b9054906137ec565b906125c9565b966123a2565b9493929190979596976109dc565b600052600f8a5286620100008b888383604060002054041610600014610ac657610abb610a5f93610a659695936010610a57945260406000205404168a6137d3565b8a601f54911661282d565b50505050966123a2565b9091949392969584600052818752610aec866040600020612697565b91905461ffff6008918260029502850a900416806000526003808b5260ff946001866040600020541614600014610bd5575050602654610b7494506001605060020a03918b918316428110610b815750610b65610a5f93600f610b6e979694610a5794600052526201000060406000205404164261380f565b601e549061282d565b956123a2565b91909692939495966109ba565b9150600052600f8b5262010000818382604060002054041610600014610bcb5782610bc1610b6e969593610a5f95610a57946040600020540416906137d3565b601e54911661282d565b50505050956123a2565b909193948093506040600020541614600014610c22575050610b7491610a5f610b6e92601b549060005260118b526001605060020a036201000060406000205404169061380f565b6123a2565b908092506040600020541614600014610c615750610b6e610b7491610a5f601d5460148b526001605060020a036201000060406000205404169061380f565b95610b74919660406000205416610c1d576123a2565b346102d85760403660031901126102d8576020610ca3610c95612206565b610c9d612122565b90614186565b6040519015158152f35b346102d85760003660031901126102d8576020602554604051908152f35b346102d85760003660031901126102d8576020600854604051908152f35b346102d85760203660031901126102d8576020610d0c610d07612206565b6142c8565b604051908152f35b346102d85760003660031901126102d8576020600160a060020a03600c5416604051908152f35b346102d85760003660031901126102d8576020600160a060020a03600a5416604051908152f35b346102d85760003660031901126102d8576020601e54604051908152f35b346102d85760003660031901126102d857602060405160088152f35b346102d85760003660031901126102d85760208054604051908152f35b346102d85760203660031901126102d8576020610d0c610dd7612206565b614237565b346102d85760003660031901126102d8576020600160a060020a0360005416604051908152f35b346102d85760203660031901126102d857610e1c612217565b600435602455005b346102d8576020806003193601126102d857600160a060020a03610e4661210c565b169081600052601880825260406000205491610e6183612858565b9360005b848110610e7e5760405180610e7a888261218b565b0390f35b610eb6908260005284845261ffff6008610e9c836040600020612697565b9054910260020a900416610eb0828961288a565b526123a2565b610e65565b346102d85760003660031901126102d8576020602454604051908152f35b346102d85760203660031901126102d857610ef2612217565b600435601f55005b346102d85760203660031901126102d857610f1361217c565b610f1b612217565b602680546aff0000000000000000000019169115156a0100000000000000000000026aff0000000000000000000016919091179055005b346102d85760003660031901126102d857610f6b612217565b60008054600160a060020a03198116825581600160a060020a0360405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08284a3f35b610e7a610fe1610fbf366121ca565b91610fc86125d6565b610fd7600260015414156122b8565b60026001556128c0565b600180556040519182918261218b565b346102d85760003660031901126102d8576020600160a060020a0360095416604051908152f35b346102d85760003660031901126102d857602060ff600254166040519015158152f35b346102d85760003660031901126102d8576020602254604051908152f35b346102d85760203660031901126102d8576004356001605060020a0381168091036102d857611086612217565b6001605060020a031960265416176026556000604051f35b346102d85760003660031901126102d85760206001605060020a0360265416604051908152f35b346102d85760003660031901126102d857602060ff6a010000000000000000000060265404166040519015158152f35b346102d85760003660031901126102d8576020602154604051908152f35b346102d85760403660031901126102d85760043560ff81168091036102d8576024359060ff82168092036102d857611149612217565b81810160ff81116108a85760ff606491160361116757602255602355005b606460405160e560020a62461bcd02815260206004820152601460248201527f7261746573206d75737420657175616c203130300000000000000000000000006044820152fd5b346102d85760203660031901126102d85760043567ffffffffffffffff81116102d8576111df9036906004016120dc565b906111ef600260015414156122b8565b600260015561120f60ff6a01000000000000000000006026540416613b49565b60005b82811061126c5750600160a060020a03600c541691823b156102d8576106ac92600092836040518096819582947fd8cd1ec4000000000000000000000000000000000000000000000000000000008452336004850161289d565b61127a61048c828585612272565b9061ffff808316600052600380602052600160ff604060002054161460001461139f5750808316600052600f80602052600160a060020a03906112cb82606060020a60406000205404163314613b97565b828516600052602052600060016040822082815501553360005260186020526112fa82851660406000206139fe565b5060045460001981019081116108a8576004556009541692833b156102d8576000604051809560e160020a635c46a7ef02825281838161133f87333060048501613826565b03925af19384156106d05760206001937f9d0506b1ae607b45d2348e6a50324de1b56a719784a612e9813b81a4d89160559261138b97611390575b5060405193600085521692a36123a2565b611212565b611399906123b1565b8961137a565b60406000205460ff166002036114a657508083166000526011602052600160a060020a036113db81606060020a60406000205404163314613b97565b8382166000818152601160205260408120818155600101556113fc90613951565b5033600052601860205261141682851660406000206139fe565b50600580546000198101919082116108a857556009541692833b156102d8576000604051809560e160020a635c46a7ef02825281838161145b87333060048501613826565b03925af19384156106d05760206001937f0d572cea43328e1d4e1413c88ed43ad6f3b2110c4c8dc5b69bb45bad6fecb3b29261138b97611390575060405193600085521692a36123a2565b60406000205460ff1681036115ae5750808316600052601480602052600160a060020a03906114e382606060020a60406000205404163314613b97565b8285166000526020526000600160408220828155015561150482851661385a565b5033600052601860205261151e82851660406000206139fe565b50600680546000198101919082116108a857556009541692833b156102d8576000604051809560e160020a635c46a7ef02825281838161156387333060048501613826565b03925af19384156106d05760206001937fec79ac5fef475f3046422d4af4bec1c70dfb25c3dc442e2b04d3871a49d92ae99261138b97611390575060405193600085521692a36123a2565b9192506115bf61048c848787612272565b1660005260205260ff60406000205416156115dd5761138b906123a2565b60405160e560020a62461bcd02815260206004820152601060248201527f696e76616c696420746f6b656e206964000000000000000000000000000000006044820152606490fd5b346102d85760003660031901126102d8576020602354604051908152f35b346102d85760003660031901126102d8576020600160a060020a03600b5416604051908152f35b346102d8576020806003193601126102d857600160a060020a0361168c61210c565b1690816000526019808252604060002054916116a783612858565b9360005b8481106116c05760405180610e7a888261218b565b6116de908260005284845261ffff6008610e9c836040600020612697565b6116ab565b346102d85760203660031901126102d8576116fc61217c565b600160a060020a0380600954161515908161185b575b8161184d575b8161183f575b50156117f85761172c612217565b15611772576117396125d6565b600160ff1960025416176002557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b60025460ff8116156117b15760ff19166002557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b606460405160e560020a62461bcd02815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152fd5b606460405160e560020a62461bcd02815260206004820152601160248201527f436f6e747261637473206e6f74207365740000000000000000000000000000006044820152fd5b9050600c541615158261171e565b600d54811615159150611718565b600b54811615159150611712565b346102d85760803660031901126102d85761188261210c565b5061188b612122565b5060643567ffffffffffffffff8082116102d857366023830112156102d85781600401359081116102d857369101602401116102d85760206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b346102d85760003660031901126102d8576020601f54604051908152f35b346102d85761191736612138565b611929600260019493945414156122b8565b6002600155611939333214612306565b61194d32600160a060020a03841614612354565b60005b8181106119a95750600160a060020a03600c5416803b156102d8576106ac9360008094604051968795869485937fb25ada4a000000000000000000000000000000000000000000000000000000008552600485016124f7565b929190600160a060020a03600954166119c661048c868487612272565b61ffff604051917f6352211e000000000000000000000000000000000000000000000000000000008352166004820152602081602481855afa80156106d057611a21916000916108d05750600160a060020a0316331461243b565b61ffff611a3261048c878588612272565b16600052600360205260ff6001816040600020541614600014611b99575050909192600160a060020a0360095416611a6e61048c838588612272565b90803b156102d857611aa060009291839260405194858094819360e060020a6323b872dd028352303360048501612489565b03925af180156106d057611b8a575b5061ffff611ac161048c838588612272565b1690611b0d6001605060020a03421660405190611add826123de565b848252806020830152600160a060020a0387166040830152606082015283600052600f6020526040600020612559565b600160a060020a0384166000526018602052611b2d82604060002061278b565b5060045491600183018093116108a857611b8592600455604051600181524260208201527fadd17b9d82cb146eaff151f4f864faa55b09599b4eff7714935025b99054fe1c6040600160a060020a03881692a36123a2565b611950565b611b93906123b1565b84611aaf565b61ffff611baa61048c888689612272565b1660005260036020526002816040600020541614600014611d3e575050600160a060020a0360095416611be161048c868487612272565b90803b156102d857611c1360009291839260405194858094819360e060020a6323b872dd028352303360048501612489565b03925af180156106d057611d2f575b5061ffff611c3461048c868487612272565b1693611c3e6125d6565b6001605060020a0394601b868154169660405197611c5b896123de565b8389526020890152600160a060020a03861660408901524216606088015281600052611c91601197886020526040600020612559565b611c9a82612739565b50600160a060020a0385166000526018602052611cbb82604060002061278b565b50600580549060018201809211611d1757611b8595969798505554604051906002825260208201527fadd17b9d82cb146eaff151f4f864faa55b09599b4eff7714935025b99054fe1c6040600160a060020a03881692a36123a2565b8860e060020a634e487b710260005260045260246000fd5b611d38906123b1565b84611c22565b61ffff611d5361048c8886899a979899612272565b1660005260036020526003816040600020541614600014611ebd5750611d7d61048c838588612272565b90803b156102d857611daf60009291839260405194858094819360e060020a6323b872dd028352303360048501612489565b03925af180156106d057611eae575b5061ffff611dd061048c838588612272565b1690611dda6125d6565b6001605060020a0391611e2c601d93808554169060405191611dfb836123de565b8483526020830152600160a060020a0388166040830152421660608201528260005260146020526040600020612559565b611e35816126af565b50600160a060020a0385166000526018602052611e5681604060002061278b565b506006928354600181018091116108a857611b85945554604051906003825260208201527fadd17b9d82cb146eaff151f4f864faa55b09599b4eff7714935025b99054fe1c6040600160a060020a03881692a36123a2565b611eb7906123b1565b84611dbe565b905061ffff611ed061048c848689612272565b16600052600360205260406000205416156115dd57611b85906123a2565b346102d8576020806003193601126102d85760043567ffffffffffffffff81116102d857611f209036906004016120dc565b90600192611f326002855414156122b8565b60028455611f5160ff6a01000000000000000000006026540416613b49565b60005b838110611fcf575050600160a060020a03600c541691823b156102d857611faf92600092836040518096819582947fc5f52096000000000000000000000000000000000000000000000000000000008452336004850161289d565b03925af180156106d057611fc257508055005b611fcb906123b1565b8055005b611fdd61048c828686612272565b9061ffff8216806000526010808552600160a060020a039061200d3383606060020a604060002054041614613b97565b826000528552600088604082208281550155600780549060001982019182116108a8575533600052601985526120478260406000206139fe565b50600a5416803b156102d85761207d60009491859260405196878094819360e060020a6323b872dd028352333060048501612489565b03925af19283156106d0576120c8936120cd575b5060405143815242858201527f01284f151397024a42410c824f8bbe00dc1e79227f1bd99799bdf4878c9385d060403392a36123a2565b611f54565b6120d6906123b1565b87612091565b9181601f840112156102d85782359167ffffffffffffffff83116102d8576020808501948185020101116102d857565b60043590600160a060020a03821682036102d857565b60243590600160a060020a03821682036102d857565b9060406003198301126102d857600435600160a060020a03811681036102d857916024359067ffffffffffffffff82116102d857612178916004016120dc565b9091565b6004359081151582036102d857565b6020908160408183019282815285518094520193019160005b8281106121b2575050505090565b835161ffff16855293810193928101926001016121a4565b60406003198201126102d8576004359067ffffffffffffffff82116102d8576121f5916004016120dc565b909160243580151581036102d85790565b6004359061ffff821682036102d857565b600160a060020a0360005416330361222b57565b606460405160e560020a62461bcd02815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9190811015612282576020020190565b60e060020a634e487b7102600052603260045260246000fd5b3560ff811681036102d85790565b3561ffff811681036102d85790565b156122bf57565b606460405160e560020a62461bcd02815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b1561230d57565b606460405160e560020a62461bcd02815260206004820152600860248201527f4f6e6c7920454f410000000000000000000000000000000000000000000000006044820152fd5b1561235b57565b606460405160e560020a62461bcd02815260206004820152601860248201527f6163636f756e7420746f2073656e64206d69736d6174636800000000000000006044820152fd5b60001981146108a85760010190565b67ffffffffffffffff81116123c557604052565b60e060020a634e487b7102600052604160045260246000fd5b6080810190811067ffffffffffffffff8211176123c557604052565b90601f8019910116810190811067ffffffffffffffff8211176123c557604052565b908160209103126102d85751600160a060020a03811681036102d85790565b1561244257565b606460405160e560020a62461bcd02815260206004820152601860248201527f596f7520646f6e2774206f776e207468697320746f6b656e00000000000000006044820152fd5b600160a060020a0391821681529116602082015261ffff909116604082015260600190565b9190808252602080920192916000805b8382106124cd57505050505090565b9091929394853561ffff81168091036124f35781528301948301939291600101906124be565b8280fd5b939260029261251f91600160a060020a036040941687526060602088015260608701916124ae565b930152565b906bffffffffffffffffffff0000620100006001605060020a03845493160216906bffffffffffffffffffff00001916179055565b61ffff82511661ffff19825416178155606060016001605060020a03926125868460208701511682612524565b600160a060020a036040860151166bffffffffffffffffffffffff825491606060020a8219910216911617815501920151166001605060020a0319825416179055565b919082018092116108a857565b60ff600254166125e257565b606460405160e560020a62461bcd02815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152fd5b6015548110156122825760156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750190600090565b6012548110156122825760126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440190600090565b80548210156122825760005260206000200190600090565b600081815260166020526040812054612734576015546801000000000000000081101561271d5790826127096126ed84600160409601601555612629565b819391549060080260020a918260000392839102169119161790565b905560155492815260166020522055600190565b60248260e060020a634e487b710281526041600452fd5b905090565b600081815260136020526040812054612734576012546801000000000000000081101561271d5790826127776126ed84600160409601601255612660565b905560125492815260136020522055600190565b919060018301600090828252806020526040822054156000146127fb57845494680100000000000000008610156127e457836127d46126ed886001604098999a01855584612697565b9055549382526020522055600190565b60248360e060020a634e487b710281526041600452fd5b50925050565b8060001904601911811515166108a85760190290565b8060001904604b11811515166108a857604b0290565b80600019048211811515166108a8570290565b67ffffffffffffffff81116123c55760208091020190565b9061286282612840565b61286f60405191826123fa565b8281528092612880601f1991612840565b0190602036910137565b8051821015612282576020809202010190565b604090600160a060020a036128bd959316815281602082015201916124ae565b90565b909291926128cf333214612306565b602454916128df8260009461282d565b340361373e5784156136d6576128f482612858565b94600160a060020a03600c5416803b156136d2578460405180927fd8cd1ec40000000000000000000000000000000000000000000000000000000082528183816129438a8a336004850161289d565b03925af18015613607576136bf575b505b600160a060020a03600d5416906040517f4ea943e7000000000000000000000000000000000000000000000000000000008152602081600481865afa9081156136b457908591879161367f575b5010613612578480926024604051809581937f4b3c08f30000000000000000000000000000000000000000000000000000000083528960048401525af1918215613607578592613569575b509190849396959496845b818110612b665750505050509091928015612b6257612a18816025546125c9565b602555600160a060020a03600b5416803b156124f3576040517f40c10f19000000000000000000000000000000000000000000000000000000008152336004820152602481018390529083908290604490829084905af18015612b5757908391612b3f575b5050600160a060020a03600c541690813b156124f3576040517f1fb2e3e700000000000000000000000000000000000000000000000000000000815233600482015260248101919091529082908290604490829084905af18015612b3457908291612b1d575b50808080600160a060020a03600e541681903415612b13575b3491f115612b075750565b604051903d90823e3d90fd5b6108fc9150612afc565b612b26906123b1565b612b31578038612ae3565b80fd5b6040513d84823e3d90fd5b612b48906123b1565b612b53578138612a7d565b5080fd5b6040513d85823e3d90fd5b5050565b61ffff612b7761048c838588612272565b168652600380602052600160ff60408920541614600014612fed5750612ba161048c828487612272565b612bab828561288a565b51879a61ffff83168952600f602052612bd833600160a060020a03606060020a60408d2054041614613785565b60265489906001605060020a0316428110612f805750612c1c610b656001605060020a03620100006040612c259561ffff8a168152600f602052205404164261380f565b600854906137ec565b915b89808a15612f0e576064600a8161ffff86160610600014612ec957505050612c4e90614445565b600160a060020a0360095416803b15612e9a578a60405180927f42842e0e000000000000000000000000000000000000000000000000000000008252818381612c9c8b893060048501612489565b03925af18015612e8f57908b91612eb5575b505060019c5b61ffff85168b52600f6020528a60016040822082815501556004549d8e600019810111612e9e578a9b9c9d9e60009b999a9b1901600455338d526018602052612d058d604061ffff891691206139fe565b5015612dfe575091612dcd91612dd9959493600160a060020a0360405191438352426020840152169033907fbfe03633277207bb2d952ce7fa2845cfabe2b0a760f345ef8247eb8d562864ea604061ffff891692a4835b60405143815242602082015261ffff8216907f76b5f35e80089203e2412b07430e059b3cb41ac9a79d20a6fd2dd3f30416032e60403392a35b6040518381527f9d0506b1ae607b45d2348e6a50324de1b56a719784a612e9813b81a4d8916055602061ffff8c1515941692a36125c9565b97612de7575b506123a2565b9796959497939291936129f7565b61ffff612df4838d61288a565b9116905238612dd3565b94959650509091600160a060020a0360095416803b15612e9a578a604051809260e160020a635c46a7ef028252818381612e3d88333060048501613826565b03925af18015612e8f578a979695949392918c91612e68575b505091612dcd91612dd9959493612d5c565b612e799192939495969798506123b1565b612e8b57908895949392918a38612e56565b8980fd5b6040513d8d823e3d90fd5b8a80fd5b60248c60e060020a634e487b710281526011600452fd5b612ebe906123b1565b612e8b578938612cae565b9092919e918161ffff6201000060329304160610612ee8575b50612cb4565b909380612f0183612efb612f0694612801565b04613be5565b612817565b049238612ee2565b505091612dcd91612dd99594620100008b9c9d9e9f9560329061ffff60649e9c9d9e93849204160610612f65575b5061ffff81168d52600f602052612f608d60406001605060020a0342169120612524565b612d95565b909280612f0183612efb612f7894612801565b049138612f3c565b905061ffff84168a52600f6020528962010000826001605060020a03826040852054041610600014612fe457612fde926001605060020a03612fcc926040612c1c9520540416906137d3565b6001605060020a03601e54911661282d565b91612c27565b50905091612c27565b61ffff612ffe61048c848689612272565b16875280602052600260ff60408920541614600014613326575061302661048c828487612272565b613030828561288a565b5199879061ffff83168952601160205261305e33600160a060020a03606060020a60408d2054041614613afb565b601b549161ffff84168a52601160205261308a6001605060020a036201000060408d205404168461380f565b9289156132e8575089908a9d600a606461ffff8316061061325c575b5061ffff85168b5260116020528a60016040822082815501556130cc61ffff8616613951565b50338b5260186020526130e661ffff861660408d206139fe565b506005549d8e600019810111612e9e578a9b9c9d9e60009b999a9b19016005556000146131cf575091612dcd91612dd9959493600160a060020a0360405191438352426020840152169033907f2e8fd27b98fca4655779498875e649621ade0d8d27de5c6b557d51bec253b1ee604061ffff891692a4835b60405143815242602082015261ffff8216907fb937dd524bce48c03476dedde62ed2caa9be7ca3e870dd867efdbfa12039533460403392a35b6040518381527f0d572cea43328e1d4e1413c88ed43ad6f3b2110c4c8dc5b69bb45bad6fecb3b2602061ffff8c1515941692a36125c9565b94959650509091600160a060020a0360095416803b15612e9a578a604051809260e160020a635c46a7ef02825281838161320e88333060048501613826565b03925af18015612e8f578a979695949392918c91613239575b505091612dcd91612dd995949361315e565b61324a9192939495969798506123b1565b612e8b57908895949392918a38613227565b909d5061326991506144b1565b600160a060020a0360095416803b15612e9a578a60405180927f42842e0e0000000000000000000000000000000000000000000000000000000082528183816132b78b893060048501612489565b03925af18015612e8f57908b916132d4575b505060019c386130a6565b6132dd906123b1565b612e8b5789386132c9565b8a9b9c9d5091846133218b9c60406001605060020a03612dcd979d9e9c9d61ffff612dd99c9b9a989a1684526011602052169120612524565b613197565b61ffff61334061048c8486899a98999e969b9c9d9e612272565b168852806020528060ff60408a20541614600014613539575061ffff61336a61048c888589612272565b16908188526014918260205261339433600160a060020a03606060020a60408d2054041614613afb565b601d5492818a528060205260406133be8b620100006001605060020a03938492205404168661380f565b948b8815613515579050839150526020528860016040822082815501556133e48161385a565b5033895260186020526133fa8160408b206139fe565b50600680546000198101919082116134fe5755600160a060020a0360095416803b15612e8b5789809160a46040518094819360e160020a635c46a7ef028352306004840152336024840152876044840152608060648401528160848401525af180156134f357908a916134db575b505091610b6e9183612dd9946040514381524260208201527faed802881887622cc27c368474bcd51da909a9a27383edb3d5a56b4c317a62ef60403392a35b604051908382527fec79ac5fef475f3046422d4af4bec1c70dfb25c3dc442e2b04d3871a49d92ae9602089151593a36125c9565b6134e4906123b1565b6134ef578838613468565b8880fd5b6040513d8c823e3d90fd5b60248b60e060020a634e487b710281526011600452fd5b9161353491610b6e969486612dd9999795526020521660408d20612524565b6134a7565b61ffff61354d61048c89868a9b969b612272565b16885260205260ff604088205416156115dd57612dd9906123a2565b9091503d8086833e61357b81836123fa565b8101906020818303126135ff5780519067ffffffffffffffff821161360357019080601f830112156135ff5781516135b281612840565b926135c060405194856123fa565b81845260208080860193028201019283116135fb57602001905b8282106135eb5750505090386129ec565b81518152602091820191016135da565b8780fd5b8580fd5b8680fd5b6040513d87823e3d90fd5b608460405160e560020a62461bcd02815260206004820152603160248201527f4e6f7420656e6f7567682072616e646f6d206e756d626572732e20506c65617360448201527f652074727920616761696e20736f6f6e2e0000000000000000000000000000006064820152fd5b9150506020813d6020116136ac575b8161369b602093836123fa565b810103126135ff57849051386129a1565b3d915061368e565b6040513d88823e3d90fd5b6136cb909491946123b1565b9238612952565b8480fd5b604051946040860186811067ffffffffffffffff821117613727576040526001865260208601602036823786511561371057849052612954565b60248560e060020a634e487b710281526032600452fd5b60248560e060020a634e487b710281526041600452fd5b606460405160e560020a62461bcd02815260206004820152601c60248201527f496e76616c69642076616c756520666f722072616e646f6d6e657373000000006044820152fd5b1561378c57565b606460405160e560020a62461bcd02815260206004820152601960248201527f446f6e2774206f776e2074686520676976656e20746f6b656e000000000000006044820152fd5b6001605060020a0391821690821603919082116108a857565b81156137f6570490565b60e060020a634e487b7102600052601260045260246000fd5b919082039182116108a857565b81156137f6570690565b919261ffff9160a094600160a060020a03809216855216602084015216604082015260806060820152600060808201520190565b600081815260166020526040812054909190801561394c5760001990808201818111613935576015549083820191821161391e578082036138e6575b50505060155480156138cf57016138ac81612629565b60088254910260020a850319169055601555815260166020526040812055600190565b60248460e060020a634e487b710281526031600452fd5b61390860086138f76126ed94612629565b9054910260020a9004928392612629565b9055845260166020526040842055388080613896565b60248660e060020a634e487b710281526011600452fd5b60248560e060020a634e487b710281526011600452fd5b505090565b600081815260136020526040812054909190801561394c5760001990808201818111613935576012549083820191821161391e578082036139c6575b50505060125480156138cf57016139a381612660565b60088254910260020a850319169055601255815260136020526040812055600190565b6139e860086139d76126ed94612660565b9054910260020a9004928392612660565b905584526013602052604084205538808061398d565b906001820190600092818452826020526040842054801515600014613af45760001990808201818111613add57835490838201918211613ac657808203613a8d575b50505081548015613a76570190613a578282612697565b60088254910260020a8703191690555582526020526040812055600190565b60248660e060020a634e487b710281526031600452fd5b613ab16008613a9f6126ed9488612697565b9054910260020a900492839287612697565b90558652846020526040862055388080613a40565b60248860e060020a634e487b710281526011600452fd5b60248760e060020a634e487b710281526011600452fd5b5050505090565b15613b0257565b606460405160e560020a62461bcd02815260206004820152601760248201527f446f65736e2774206f776e20676976656e20746f6b656e0000000000000000006044820152fd5b15613b5057565b606460405160e560020a62461bcd02815260206004820152600f60248201527f5245534355452044495341424c454400000000000000000000000000000000006044820152fd5b15613b9e57565b606460405160e560020a62461bcd02815260206004820152601260248201527f5357495045522c204e4f2053574950494e4700000000000000000000000000006044820152fd5b6127109081613bf66022548361282d565b0491613c046023548361282d565b04906005548015808091613d17575b15613c3a57505050613c2a613c3592601a546125c9565b601a55601c546125c9565b601c55565b8080613d0c575b15613c8657505050613c6b613c7491613c5f613c7c94601a546125c9565b601a55601c54906125c9565b600654906137ec565b601d546125c9565b601d556000601c55565b1580613d02575b15613ccb575050613cbb613cb3613caa613c3594601a54906125c9565b600554906137ec565b601b546125c9565b601b556000601a55601c546125c9565b613c7c9350613c74925090613cf1613cb3613c6b93613cec601a54856125c9565b6137ec565b601b556000601a55601c54906125c9565b5060065415613c8d565b506006541515613c41565b5060065415613c13565b613d2c333214612306565b600092835b838110613eae57508315613ea857613e32575b5050600160a060020a0380600c5416803b156102d8576040517f1fb2e3e700000000000000000000000000000000000000000000000000000000815233600482015260248101849052906000908290604490829084905af180156106d057613e23575b50600b541690813b156102d8576040517f40c10f1900000000000000000000000000000000000000000000000000000000815233600482015260248101829052916000908390604490829084905af19182156106d057613e0f92613e14575b506025546125c9565b602555565b613e1d906123b1565b38613e06565b613e2c906123b1565b38613da7565b600160a060020a03600c541691823b156102d857613e8492600092836040518096819582947fc5f52096000000000000000000000000000000000000000000000000000000008452336004850161289d565b03925af180156106d057613e99575b80613d44565b613ea2906123b1565b38613e93565b50505050565b61ffff80613ec061048c848888612272565b166000526010602091818352600160a060020a03604092613eee3383606060020a8760002054041614613785565b876001605060020a039a8b85898d83602654168a888d834211156000146140fd575050505092612c1c92613f2f61048c610a4e94610a5f97613f479a612272565b16600052868b52620100008a6000205404164261380f565b995b898989156140a95785925088613f629261048c92612272565b166000528452600060018482208281550155600780549060001982019182116108a857553360005260198452613fab8360002083613fa461048c898d8d612272565b16906139fe565b50600a5416613fbe61048c868a8a612272565b90803b156102d857613fef600092918392865194858094819360e060020a6323b872dd028352333060048501612489565b03925af1801561409e57917fe9083238ed5c128b67831b957929cef6c82beb49da6f7f4d156f6391a5a651319161408a9695949361408f575b5061403761048c868b8b612272565b81845191438352428784015216907f01284f151397024a42410c824f8bbe00dc1e79227f1bd99799bdf4878c9385d0853392a35b61407961048c868b8b612272565b1691519289845286151593a36123a2565b613d31565b614098906123b1565b38614028565b83513d6000823e3d90fd5b7fe9083238ed5c128b67831b957929cef6c82beb49da6f7f4d156f6391a5a65131945092856140e761048c8b6140f8969561408a9d9c9b9a98612272565b166000528652421684600020612524565b61406b565b9390949195929697988361411561048c858585612272565b16600052858552878962010000809960002054041610600014614177579461416794610a5f989461415561048c8c9996612c1c9b966141719f9e98612272565b16600052528c600020540416906137d3565b601f54911661282d565b99613f49565b50505050505050505099613f49565b60009061ffff600091168082526003602052604092600160ff8585205416146000146141ce57508152600f602052606060020a600160a060020a039283922054041691161490565b8383205460ff166002036141fe575081526011602052606060020a600160a060020a039283922054041691161490565b949392919050600360ff83832054161461421757505050565b60146020522054606060020a9004600160a060020a039081169116149150565b61ffff1660009080825260106020526001605060020a0390620100009082826040862054041615156000146142c2576026548316428110614293575091610a4e91604085612c1c956128bd97526010602052205404164261380f565b82915083819360408720540416106000146142c2578291612c1c936141679260406128bd9720540416906137d3565b50505090565b600061ffff6000921690818352602060038152604091600160ff84872054161480614427575b1561436357506026546001605060020a039390841642811061432c5750610b659285600f612c1c969462010000946128bd995252205404164261380f565b9291600f91865252620100009082848383882054041610600014613af4579183610bc192612c1c95946128bd9720540416906137d3565b600382959252600260ff84842054161480614408575b156143a457506001605060020a0391620100009160116128bd96601b5496835252205404169061380f565b93925060038352600360ff838320541614806143e9575b6143c55750505090565b6128bd93506001605060020a039162010000916014601d549552205404169061380f565b5060148352600160a060020a03606060020a83832054041615156143bb565b5060118552600160a060020a03606060020a8484205404161515614379565b50600f82526001605060020a036201000084872054041615156142ee565b6012549081156144aa578163ffffffff61445f921661381c565b90811015612282577fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344401546000526011602052600160a060020a03606060020a604060002054041690565b5050600090565b6015549081156144aa578163ffffffff6144cb921661381c565b90811015612282577f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47501546000526014602052600160a060020a03606060020a60406000205404169056fea2646970667358221220677f2325239d3a3b0252aa97eebd506dc17ef7d4e6a68363cb4690753ca75fe164736f6c63430008100033
Deployed Bytecode Sourcemap
547:30684:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4518:36;547:30684;4518:36;;;547:30684;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1063:62:0;;:::i;:::-;547:30684:9;-1:-1:-1;;;;;547:30684:9;;;;5668:28;547:30684;;;5668:28;547:30684;;;5706:24;547:30684;;;5706:24;547:30684;;5740:27;547:30684;;;5740:27;547:30684;;;5777:31;547:30684;;;5777:31;547:30684;;5818:16;547:30684;;;5818:16;547:30684;5844:11;547:30684;;;5844:11;547:30684;;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;547:30684:9;;;2169:22:0;;;547:30684:9;;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;2573:40:0;;;;547:30684:9;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;-1:-1:-1;;;;;2993:29:9;547:30684;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;1063:62:0;;;:::i;:::-;6022:32:9;;;547:30684;;;6200:3;547:30684;;;;6179:19;;;;;;;547:30684;6227:9;;;;;;;;:::i;:::-;;:::i;:::-;547:30684;6227:14;547:30684;;6303:11;;6318:9;;;;;;:::i;:::-;6303:11;;;;:::i;:::-;;:::i;:::-;547:30684;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6165:12;;547:30684;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;6179:19;547:30684;;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;1063:62:0;;:::i;:::-;547:30684:9;;;1744:1:2;547:30684:9;;;;;;;-1:-1:-1;;547:30684:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2317:63:2;1744:1;2325:7;547:30684:9;;;;2325:19:2;;2317:63;:::i;:::-;1744:1;2325:7;1744:1;21206:44:9;21227:10;21214:9;:23;21206:44;:::i;:::-;21260:57;21214:9;-1:-1:-1;;;;;547:30684:9;;21268:20;21260:57;:::i;:::-;547:30684;21344:19;;;;;;547:30684;-1:-1:-1;;;;;21981:3:9;547:30684;;21981:41;;;;;;547:30684;;;;;;21981:41;;;;;;;547:30684;21981:41;;547:30684;21981:41;;;:::i;:::-;;;;;;;;;;;21327:645;2325:7:2;1744:1;;547:30684:9;21981:41;;;;:::i;:::-;;;;;547:30684;;;;;;;;;21365:3;-1:-1:-1;;;;;21392:7:9;547:30684;;21408:11;;;;;;:::i;:::-;547:30684;;;21392:28;547:30684;21392:28;;547:30684;;21392:28;;547:30684;21392:28;;547:30684;21392:28;;;;;;;;21384:79;21392:28;547:30684;21392:28;;;21365:3;-1:-1:-1;;;;;;547:30684:9;21227:10;21392:42;21384:79;:::i;:::-;21525:11;;;;;;:::i;:::-;21477:60;;;;;;;547:30684;;;;;;;21477:60;;;;;;-1:-1:-1;;;;;21477:60:9;;21518:4;21227:10;547:30684;21477:60;;;:::i;:::-;;;;;;;;;;;21365:3;21644:11;547:30684;21644:11;;;;;;:::i;:::-;547:30684;;;;;;;:::i;:::-;;;;21685:15;-1:-1:-1;;;;;547:30684:9;21392:28;21573:191;;547:30684;;;-1:-1:-1;;;;;547:30684:9;;;21573:191;;547:30684;21573:191;;;547:30684;;21558:11;;;;;;:::i;:::-;547:30684;;;21552:5;21392:28;547:30684;;;;;:::i;:::-;-1:-1:-1;;;;;547:30684:9;;;;21819:13;21392:28;547:30684;10606:32:8;547:30684:9;;;;21846:11;;;;;;:::i;:::-;547:30684;10606:32:8;;:::i;:::-;;21872:20:9;547:30684;;;2325:7:2;547:30684:9;;;;;;;21365:3;1744:1:2;;547:30684:9;21932:11;;;;;;:::i;:::-;547:30684;;;21685:15;547:30684;;21911:50;21392:28;-1:-1:-1;;;;;547:30684:9;;21911:50;;21365:3;:::i;:::-;21332:10;;547:30684;-1:-1:-1;;;;;547:30684:9;;;;;;;;21477:60;;;;:::i;:::-;;;;21392:28;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;547:30684;;;;;;-1:-1:-1;;547:30684:9;;;;1063:62:0;;:::i;:::-;547:30684:9;;30538:16;1744:1:2;547:30684:9;;;;;;;-1:-1:-1;;547:30684:9;;;;1063:62:0;;:::i;:::-;547:30684:9;;30639:22;1744:1:2;547:30684:9;;;;;2484:1:2;547:30684:9;;;:::i;:::-;1204:72:1;;;:::i;:::-;2317:63:2;1744:1;2325:7;547:30684:9;2325:19:2;;2317:63;:::i;:::-;1744:1;2325:7;1744:1;2484;:::i;547:30684:9:-;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;547:30684:9;;;;;;26955:15;547:30684;;;;;;;27021:13;547:30684;;;;;;;;27068:10;547:30684;27063:874;27080:17;;;;;;27951:10;;;547:30684;;-1:-1:-1;;;;;547:30684:9;;28089:12;547:30684;;28070:15;;;:31;;27946:475;27963:15;;;;;;547:30684;;;;;;;;27980:3;547:30684;;;;;;;;27980:3;547:30684;;;;;;;;4904:18:8;547:30684:9;;;;4904:18:8;:::i;:::-;547:30684:9;;;;;;;;;;;;28067:344;;;;28121:76;547:30684;;28129:68;547:30684;;;28148:5;547:30684;;28129:59;28130:38;547:30684;;;;;;;;28070:15;28130:38;:::i;:::-;28172:16;547:30684;28129:59;;:::i;:::-;547:30684;;28129:68;;:::i;:::-;28121:76;;:::i;:::-;28067:344;27980:3;:::i;:::-;27951:10;;;;;;;;;;;28067:344;547:30684;;28222:3;547:30684;;;;;;;;;;;;;;28222:33;28218:193;28222:33;;;28284:35;28283:65;547:30684;28275:73;547:30684;;;28299:5;28283:56;547:30684;;;;;;;;28284:35;;:::i;:::-;547:30684;28323:16;547:30684;;;28283:56;:::i;28218:193::-;28387:9;;;;28218:193;27980:3;:::i;27099:::-;547:30684;;;;;;;;;;;;;4904:18:8;547:30684:9;;;;4904:18:8;:::i;:::-;547:30684:9;;;;;;;;;;;;;;;;;;;;;;;;27216:1;547:30684;;;;;;27192:25;27188:739;27216:1;;;-1:-1:-1;;27259:12:9;547:30684;27099:3;;-1:-1:-1;;;;;;547:30684:9;;;;;27240:15;:31;-1:-1:-1;27240:31:9;;547:30684;27304:36;27303:64;547:30684;27322:3;27295:72;547:30684;;;27303:55;547:30684;;;;;;;;;;;27240:15;27304:36;:::i;:::-;27344:14;547:30684;27303:55;;:::i;27295:72::-;27237:360;27099:3;:::i;:::-;27068:10;;;;;;;;;;27237:360;547:30684;;;;27396:3;547:30684;;;;;;;;;;;;27396:33;27392:205;27396:33;;;547:30684;27462:33;27453:69;547:30684;;;27461:61;547:30684;27461:52;547:30684;;;;;;;27462:33;;:::i;:::-;27499:14;547:30684;;;27461:52;:::i;27392:205::-;27569:9;;;;27392:205;27980:3;:::i;27188:739::-;547:30684;;;;;;;;;;;;27621:25;27617:310;547:30684;;;;;27099:3;547:30684;27674:32;27666:40;547:30684;27674:11;547:30684;;;;27688:3;547:30684;;-1:-1:-1;;;;;547:30684:9;;;;;;;27674:32;;:::i;27617:310::-;27980:3;:::i;27617:310::-;547:30684;;;;;;;;;27731:25;27727:200;27192:11;;;547:30684;27776:58;27099:3;547:30684;27784:50;:20;547:30684;27807:12;547:30684;;-1:-1:-1;;;;;547:30684:9;;;;;;;27784:50;;:::i;27727:200::-;547:30684;27099:3;547:30684;;;;;;;27617:310;27855:72;27099:3;:::i;547:30684::-;;;;;;-1:-1:-1;;547:30684:9;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;4964:31;547:30684;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;1467:30;547:30684;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;-1:-1:-1;;;;;2940:15:9;547:30684;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;-1:-1:-1;;;;;2815:19:9;547:30684;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;4281:43;547:30684;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;;758:1;547:30684;;;;;;;;;-1:-1:-1;;547:30684:9;;;;4518:36;547:30684;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;547:30684:9;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;1063:62:0;;:::i;:::-;547:30684:9;;31089:17;1744:1:2;547:30684:9;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;:::i;:::-;;;;;;28586:15;547:30684;;;;;;;28645:20;;;;:::i;:::-;28680:10;547:30684;28692:10;;;;;;547:30684;;;;;;;:::i;:::-;;;;28704:3;;547:30684;;;;;;;;;4904:18:8;547:30684:9;;;;4904:18:8;:::i;:::-;547:30684:9;;;;;;;;;28723:57;;;;:::i;:::-;547:30684;28704:3;:::i;:::-;28680:10;;547:30684;;;;;;-1:-1:-1;;547:30684:9;;;;;4881:38;547:30684;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;1063:62:0;;:::i;:::-;547:30684:9;;30748:24;1744:1:2;547:30684:9;;;;;;;-1:-1:-1;;547:30684:9;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;24750:24:9;547:30684;;-1:-1:-1;;547:30684:9;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;1063:62:0;;:::i;:::-;547:30684:9;;;-1:-1:-1;;;;;547:30684:9;;;;;;-1:-1:-1;;;;;547:30684:9;;;;2573:40:0;;;;547:30684:9;;;2484:1:2;547:30684:9;;;:::i;:::-;1204:72:1;;;:::i;:::-;2317:63:2;1744:1;2325:7;547:30684:9;2325:19:2;;2317:63;:::i;:::-;1744:1;2325:7;1744:1;2484;:::i;:::-;2325:7;1744:1;;547:30684:9;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;547:30684:9;;;;;-1:-1:-1;;;;;2787:21:9;547:30684;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;1685:7:1;547:30684:9;;;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;4687:33;547:30684;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;547:30684:9;31197:25;547:30684;;;31197:25;547:30684;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;-1:-1:-1;;;;;5041:26:9;547:30684;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;;5156:33;547:30684;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;4582:41;547:30684;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;;;;1063:62:0;;:::i;:::-;547:30684:9;;;;;;;;;30905:3;547:30684;;30882:26;547:30684;;30943:23;1744:1:2;30976:32:9;1744:1:2;547:30684:9;;30905:3;547:30684;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;;;;;;;;;;;;;:::i;:::-;;2317:63:2;1744:1;2325:7;547:30684:9;2325:19:2;;2317:63;:::i;:::-;1744:1;2325:7;1744:1;17226:41:9;547:30684;;17234:13;547:30684;;;17226:41;:::i;:::-;547:30684;17318:19;;;;;;547:30684;-1:-1:-1;;;;;18848:3:9;547:30684;;18848:45;;;;;;;547:30684;;;;;;18848:45;;;;;;547:30684;18848:45;;18872:10;547:30684;18848:45;;;:::i;17339:3::-;17368:11;;;;;;:::i;:::-;547:30684;;;;;;;;;;;2325:7:2;547:30684:9;;;;;;17410:25;17406:1423;2325:7:2;;;547:30684:9;;;;;;17463:3;547:30684;;;-1:-1:-1;;;;;547:30684:9;17455:63;547:30684;-1:-1:-1;;;547:30684:9;;;;;;17485:10;17463:32;17455:63;:::i;:::-;547:30684;;;;;;;;2325:7:2;547:30684:9;;;;;;;;17485:10;547:30684;;17573:15;547:30684;;10906:35:8;547:30684:9;;;;;;10906:35:8;:::i;:::-;-1:-1:-1;547:30684:9;;-1:-1:-1;;547:30684:9;;;;;;;;1744:1:2;17670:9:9;547:30684;;17670:66;;;;;;547:30684;;;17670:66;;-1:-1:-1;;;;;17670:66:9;;17485:10;;;17670:66;17485:10;;17705:4;547:30684;17670:66;;;:::i;:::-;;;;;;;;;;547:30684;2325:7:2;17670:66:9;17759:28;17670:66;17339:3;17670:66;;;17406:1423;547:30684;;;;;;;;17759:28;;17339:3;:::i;:::-;17306:10;;17670:66;;;;:::i;:::-;;;;17406:1423;547:30684;;;;;;1744:1:2;17812:25:9;1744:1:2;;547:30684:9;;;;;;17865:3;547:30684;;-1:-1:-1;;;;;17857:63:9;547:30684;-1:-1:-1;;;547:30684:9;;;;;;17887:10;17865:32;17857:63;:::i;:::-;547:30684;;;;;;;17865:3;547:30684;;;;;;;;2325:7:2;547:30684:9;;10906:35:8;;;:::i;:::-;;17887:10:9;547:30684;;18015:15;547:30684;;10906:35:8;547:30684:9;;;;;;10906:35:8;:::i;:::-;-1:-1:-1;18076:17:9;547:30684;;-1:-1:-1;;547:30684:9;;;18076:17;547:30684;;;;1744:1:2;18111:9:9;547:30684;;18111:66;;;;;;547:30684;;;18111:66;;-1:-1:-1;;;;;18111:66:9;;17887:10;;;18111:66;17887:10;;18146:4;547:30684;18111:66;;;:::i;:::-;;;;;;;;;;547:30684;2325:7:2;18111:66:9;18200:28;18111:66;17339:3;18111:66;;;547:30684;;;;;;;;18200:28;;17339:3;:::i;17808:1021::-;547:30684;;;;;;18253:25;;17410:11;;547:30684;;;;;;18306:12;547:30684;;;-1:-1:-1;;;;;547:30684:9;18298:72;547:30684;-1:-1:-1;;;547:30684:9;;;;;;18337:10;18306:41;18298:72;:::i;:::-;547:30684;;;;;;;;2325:7:2;547:30684:9;;;;;;;;10906:35:8;547:30684:9;;;10906:35:8;:::i;:::-;;18337:10:9;547:30684;;18483:15;547:30684;;10906:35:8;547:30684:9;;;;;;10906:35:8;:::i;:::-;-1:-1:-1;18544:26:9;547:30684;;-1:-1:-1;;547:30684:9;;;18544:26;547:30684;;;;1744:1:2;18588:9:9;547:30684;;18588:66;;;;;;547:30684;;;18588:66;;-1:-1:-1;;;;;18588:66:9;;18337:10;;;18588:66;18337:10;;18623:4;547:30684;18588:66;;;:::i;:::-;;;;;;;;;;547:30684;2325:7:2;18588:66:9;18677:37;18588:66;17339:3;18588:66;;;547:30684;;;;;;;;18677:37;;27980:3;:::i;18249:580::-;18751:11;;;;;;;;;:::i;:::-;547:30684;;;;;;;;;;;18739:29;18735:94;;17339:3;18249:580;27980:3;:::i;18735:94::-;547:30684;;-1:-1:-1;;;;;18788:26:9;;547:30684;;18788:26;;547:30684;;;;;;;;;;;;;18788:26;547:30684;;;;;;-1:-1:-1;;547:30684:9;;;;;4790:42;547:30684;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;-1:-1:-1;;;;;2909:24:9;547:30684;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;:::i;:::-;;;;;;28933:13;547:30684;;;;;;;28990:20;;;;:::i;:::-;29025:10;547:30684;29037:10;;;;;;547:30684;;;;;;;:::i;29049:3::-;;547:30684;;;;;;;;;4904:18:8;547:30684:9;;;;4904:18:8;:::i;29049:3:9:-;29025:10;;547:30684;;;;;;-1:-1:-1;;547:30684:9;;;;;;:::i;:::-;-1:-1:-1;;;;;547:30684:9;5344:9;547:30684;;5336:32;;:69;;;;547:30684;5336:114;;;547:30684;5336:144;;;547:30684;;;;;1063:62:0;;:::i;:::-;25344:46:9;;;1204:72:1;;:::i;:::-;2255:4;547:30684:9;;2245:14:1;547:30684:9;;;2245:14:1;547:30684:9;2274:20:1;547:30684:9;;;719:10:6;547:30684:9;;2274:20:1;547:30684:9;25344:46;1685:7:1;547:30684:9;;;;;;;;;;1685:7:1;547:30684:9;2521:22:1;547:30684:9;;;719:10:6;547:30684:9;;2521:22:1;547:30684:9;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;5336:144;547:30684;;5462:3;547:30684;;5454:26;;5336:144;;;:114;5425:10;547:30684;;;5417:33;;;-1:-1:-1;5336:114:9;;:69;5380:10;547:30684;;;5372:33;;;-1:-1:-1;5336:69:9;;547:30684;;;;;;-1:-1:-1;;547:30684:9;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30307:41;547:30684;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;4366:45;547:30684;;;;;;;;;;;;;;:::i;:::-;2317:63:2;1744:1;2325:7;547:30684:9;;;;2325:19:2;;2317:63;:::i;:::-;1744:1;2325:7;1744:1;6632:44:9;6653:10;6640:9;:23;6632:44;:::i;:::-;6686:57;6640:9;-1:-1:-1;;;;;547:30684:9;;6694:20;6686:57;:::i;:::-;547:30684;6770:19;;;;;;547:30684;-1:-1:-1;;;;;7617:3:9;547:30684;;7617:43;;;;;;547:30684;;;;;;7617:43;;;;;;;547:30684;7617:43;;547:30684;7617:43;;;:::i;6791:3::-;547:30684;;;-1:-1:-1;;;;;6818:9:9;547:30684;;6836:11;;;;;;:::i;:::-;547:30684;;;6818:30;547:30684;6818:30;;547:30684;;6818:30;;547:30684;6818:30;;547:30684;6818:30;;;;;;;;6810:81;6818:30;547:30684;6818:30;;;-1:-1:-1;;;;;;547:30684:9;6653:10;6818:44;6810:81;:::i;:::-;547:30684;6922:11;;;;;;:::i;:::-;547:30684;;;6910:11;6818:30;547:30684;;2325:7:2;547:30684:9;;;;;;6910:29;6906:691;2325:7:2;;;547:30684:9;;;;;-1:-1:-1;;;;;6818:9:9;547:30684;;7009:11;;;;;;:::i;:::-;6959:62;;;;;;;547:30684;;;;;;;6959:62;;;;;;-1:-1:-1;;;;;6959:62:9;;7002:4;6653:10;547:30684;6959:62;;;:::i;:::-;;;;;;;;;;;6906:691;7069:11;547:30684;7069:11;;;;;;:::i;:::-;547:30684;9343:15;547:30684;-1:-1:-1;;;;;9343:15:9;547:30684;;;;;;;:::i;:::-;;;;9252:162;6818:30;9252:162;;547:30684;-1:-1:-1;;;;;547:30684:9;;;9252:162;;547:30684;9252:162;;;547:30684;;;;9237:3;6818:30;547:30684;;;;;:::i;:::-;-1:-1:-1;;;;;547:30684:9;;;;9461:15;6818:30;547:30684;10606:32:8;547:30684:9;;;;10606:32:8;:::i;:::-;;547:30684:9;;;2325:7:2;547:30684:9;;;;;;;6791:3;1744:1:2;547:30684:9;1744:1:2;547:30684:9;;2325:7:2;547:30684:9;;9343:15;6818:30;547:30684;;;9541:49;547:30684;-1:-1:-1;;;;;547:30684:9;;9541:49;;6791:3;:::i;:::-;6758:10;;6959:62;;;;:::i;:::-;;;;6906:691;547:30684;7118:11;;;;;;:::i;:::-;547:30684;;;6910:11;6818:30;547:30684;1744:1:2;547:30684:9;;;;;;7106:29;7102:495;1744:1:2;;;547:30684:9;;-1:-1:-1;;;;;6818:9:9;547:30684;;7205:11;;;;;;:::i;:::-;7155:62;;;;;;;547:30684;;;;;;;7155:62;;;;;;-1:-1:-1;;;;;7155:62:9;;7198:4;6653:10;547:30684;7155:62;;;:::i;:::-;;;;;;;;;;;7102:495;7265:11;547:30684;7265:11;;;;;;:::i;:::-;547:30684;1204:72:1;;;:::i;:::-;-1:-1:-1;;;;;8055:11:9;;547:30684;;;;;;;;;;;:::i;:::-;;;;6818:30;7964:158;;547:30684;-1:-1:-1;;;;;547:30684:9;;;7964:158;;547:30684;8095:15;547:30684;7964:158;;;547:30684;;;;;7949:3;547:30684;;6818:30;547:30684;;;;;:::i;:::-;10606:32:8;;;:::i;:::-;;-1:-1:-1;;;;;547:30684:9;;;;8161:15;6818:30;547:30684;10606:32:8;547:30684:9;;;;10606:32:8;:::i;:::-;;8208:17:9;547:30684;;;2325:7:2;547:30684:9;;;;;;;6791:3;1744:1:2;;;;;;547:30684:9;;;;1744:1:2;547:30684:9;;6818:30;547:30684;;;8240:45;547:30684;-1:-1:-1;;;;;547:30684:9;;8240:45;;6791:3;:::i;547:30684::-;;-1:-1:-1;;;;;547:30684:9;;;;;;;7155:62;;;;:::i;:::-;;;;7102:495;547:30684;7314:11;;;;;;;;;;:::i;:::-;547:30684;;;6910:11;6818:30;547:30684;6910:11;547:30684;;;;;;7302:29;7298:299;6910:11;;;7401;;;;;;;:::i;:::-;7351:62;;;;;;;547:30684;;;;;;;7351:62;;;;;;-1:-1:-1;;;;;7351:62:9;;7394:4;6653:10;547:30684;7351:62;;;:::i;:::-;;;;;;;;;;;7298:299;7470:11;547:30684;7470:11;;;;;;:::i;:::-;547:30684;1204:72:1;;;:::i;:::-;-1:-1:-1;;;;;8708:20:9;547:30684;8708:20;547:30684;;;;;;;;;;;;:::i;:::-;;;;6818:30;8617:167;;547:30684;-1:-1:-1;;;;;547:30684:9;;;8617:167;;547:30684;8757:15;547:30684;8617:167;;;547:30684;;;;8593:12;6818:30;547:30684;;;;;:::i;:::-;10606:32:8;;;:::i;:::-;;-1:-1:-1;;;;;547:30684:9;;;;8832:15;6818:30;547:30684;10606:32:8;547:30684:9;;;;10606:32:8;:::i;:::-;;8879:26:9;547:30684;;;2325:7:2;547:30684:9;;;;;;;6791:3;1744:1:2;;547:30684:9;;;;6910:11;547:30684;;6818:30;547:30684;;;8920:54;547:30684;-1:-1:-1;;;;;547:30684:9;;8920:54;;27980:3;:::i;7351:62::-;;;;:::i;:::-;;;;7298:299;7519:11;;547:30684;7519:11;;;;;;:::i;:::-;547:30684;;;6910:11;6818:30;547:30684;;;;;;7507:29;7503:94;;6791:3;7298:299;27980:3;:::i;547:30684::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2325:7:2;;547:30684:9;2317:63:2;1744:1;547:30684:9;;2325:19:2;;2317:63;:::i;:::-;1744:1;;;23949:41:9;547:30684;;23957:13;547:30684;;;23949:41;:::i;:::-;547:30684;24041:19;;;;;;547:30684;;-1:-1:-1;;;;;24480:3:9;547:30684;;24480:43;;;;;;;547:30684;;;;;;24480:43;;;;;;547:30684;24480:43;;24148:10;547:30684;24480:43;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;1744:1:2;;547:30684:9;24480:43;;;;:::i;:::-;1744:1:2;;547:30684:9;24062:3;24091:11;;;;;;:::i;:::-;547:30684;;;;;;;24124:5;547:30684;;;-1:-1:-1;;;;;24148:10:9;24116:65;24148:10;547:30684;-1:-1:-1;;;547:30684:9;;;;;;24124:34;24116:65;:::i;:::-;547:30684;;;;;;;;;;;;;;;24231:20;547:30684;;;;;;;;;;;;1744:1:2;24148:10:9;547:30684;;24265:13;547:30684;;10906:35:8;547:30684:9;;;;10906:35:8;:::i;:::-;;24320:7:9;547:30684;;24320:56;;;;;;547:30684;;;;;;;24320:56;;;;;;-1:-1:-1;;;;;24320:56:9;;24148:10;24349:4;547:30684;24320:56;;;:::i;:::-;;;;;;;;;;24062:3;24320:56;;;24062:3;547:30684;;;24430:12;547:30684;;24444:15;547:30684;;;;24395:65;547:30684;24148:10;24395:65;;24062:3;:::i;:::-;24029:10;;24320:56;;;;:::i;:::-;;;;547:30684;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;:::o;:::-;;;-1:-1:-1;;547:30684:9;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1359:130:0:-;-1:-1:-1;;;;;1273:6:0;547:30684:9;;719:10:6;1422:23:0;547:30684:9;;1359:130:0:o;547:30684:9:-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;1744:1:2:-;;;;:::o;:::-;;547:30684:9;;-1:-1:-1;;;;;1744:1:2;;;;;;;;;;;547:30684:9;1744:1:2;547:30684:9;;;1744:1:2;;547:30684:9;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;547:30684:9;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1744:1:2;547:30684:9;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;547:30684:9;;;;;;;;;-1:-1:-1;;;547:30684:9;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;:::o;:::-;;;;;;;;;;:::o;1767:106:1:-;547:30684:9;1685:7:1;547:30684:9;;;;1767:106:1:o;547:30684:9:-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;8794:15;547:30684;;;;;;8794:15;-1:-1:-1;547:30684:9;;;;-1:-1:-1;547:30684:9;:::o;:::-;8132:6;547:30684;;;;;;8132:6;-1:-1:-1;547:30684:9;;;;-1:-1:-1;547:30684:9;:::o;:::-;;;;;;;;-1:-1:-1;547:30684:9;;-1:-1:-1;547:30684:9;;;-1:-1:-1;547:30684:9;:::o;2113:404:8:-;-1:-1:-1;547:30684:9;;;4250:12:8;547:30684:9;;;;;;;;8794:15;547:30684;;;;;;;;;;;;4250:12:8;547:30684:9;;;8794:15;547:30684;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;8794:15;547:30684;;;;4250:12:8;547:30684:9;;;1744:1:2;4250:12:8;2446:11;:::o;547:30684:9:-;;;-1:-1:-1;;;;;547:30684:9;;;;;;2192:319:8;2488:12;;;:::o;2113:404::-;-1:-1:-1;547:30684:9;;;4250:12:8;547:30684:9;;;;;;;;8132:6;547:30684;;;;;;;;;;;;4250:12:8;547:30684:9;;;8132:6;547:30684;;:::i;:::-;;;8132:6;547:30684;;;;4250:12:8;547:30684:9;;;1744:1:2;4250:12:8;2446:11;:::o;2113:404::-;;;4250:12;;;-1:-1:-1;547:30684:9;;;;;;;;;;;4250:24:8;2192:319;547:30684:9;;;;;;;;;;;;;;;;4250:12:8;547:30684:9;;;;;;;;;:::i;:::-;;;;;;;;;;1744:1:2;4250:12:8;2446:11;:::o;547:30684:9:-;;;-1:-1:-1;;;;;547:30684:9;;;;;;2192:319:8;-1:-1:-1;2488:12:8;-1:-1:-1;;2488:12:8:o;547:30684:9:-;;;;;14108:2;547:30684;;;;;;;14108:2;547:30684;;:::o;:::-;;;;;14149:2;547:30684;;;;;;;14149:2;547:30684;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;:::i;:::-;;:::o;9966:1858::-;;;;;10135:44;10156:10;10143:9;:23;10135:44;:::i;:::-;10254:9;547:30684;;10254:20;547:30684;-1:-1:-1;10254:20:9;;:::i;:::-;10241:9;:33;547:30684;;10326:222;;;;10366:22;;;:::i;:::-;547:30684;-1:-1:-1;;;;;10402:3:9;547:30684;;10402:45;;;;;547:30684;;;10402:45;;547:30684;10402:45;;10156:10;;;10402:45;10156:10;;;10402:45;;;;:::i;:::-;;;;;;;;;;;10326:222;;;-1:-1:-1;;;;;10582:10:9;547:30684;;;;;;10582:30;;;;;;;;;;;;;;;;;;;;;10326:222;10630:26;;547:30684;;;;;10254:9;547:30684;;10744:35;;;;547:30684;10744:35;;;10582:30;10744:35;;547:30684;10744:35;;;;;;;;;;;10326:222;10789:16;;;;;;;;10820:10;;10832:19;;;;;;11607:9;;;;;;;;;;11603:57;;11669:24;547:30684;11669:24;547:30684;11669:24;:::i;:::-;;1744:1:2;-1:-1:-1;;;;;11703:10:9;547:30684;;11703:33;;;;;547:30684;;;11703:33;;10156:10;10582:30;11703:33;;547:30684;;;;;;;;;;;;;;;;;;11703:33;;;;;;;;;;;10815:779;547:30684;;-1:-1:-1;;;;;11746:3:9;547:30684;;11746:38;;;;;;547:30684;;;11746:38;;10156:10;10582:30;11746:38;;547:30684;;;;;;;;;;;;;;;;;;;11746:38;;;;;;;;;;;10815:779;547:30684;;;;-1:-1:-1;;;;;11794:3:9;547:30684;;11794:23;10241:9;;11794:23;;;10815:779;10241:9;11794:23;;;;;9966:1858;:::o;11794:23::-;547:30684;;;;;;;;;;11794:23;;;-1:-1:-1;11794:23:9;;11746:38;;;;:::i;:::-;547:30684;;11746:38;;;;547:30684;;;11746:38;547:30684;;;;;;;;;11703:33;;;;:::i;:::-;547:30684;;11703:33;;;;547:30684;;;;11703:33;547:30684;;;;;;;;;11603:57;11632:17;;:::o;10853:3::-;547:30684;10888:11;;;;;;:::i;:::-;547:30684;;;10876:11;547:30684;10582:30;547:30684;10904:1;547:30684;;;;;;10876:29;10872:712;10904:1;;;10979:11;;;;;;;:::i;:::-;11001:7;;;;:::i;:::-;547:30684;12363:12;547:30684;;;;;;12400:3;10582:30;547:30684;12392:70;10156:10;-1:-1:-1;;;;;;;;547:30684:9;;;;;;12400:32;12392:70;:::i;:::-;12494:12;547:30684;;;-1:-1:-1;;;;;547:30684:9;12475:15;:31;-1:-1:-1;12475:31:9;;547:30684;12529:55;12530:36;-1:-1:-1;;;;;547:30684:9;;12529:64;547:30684;;;;;;12400:3;10582:30;547:30684;;;;;12475:15;12530:36;:::i;12529:55::-;12587:6;547:30684;12529:64;;:::i;:::-;12472:309;;12832:19;;12884:1383;;;;12933:3;12939:2;12916:13;547:30684;12916:13;;547:30684;12915:26;12911:466;12939:2;;;12969:20;;;;;;:::i;:::-;-1:-1:-1;;;;;13007:9:9;547:30684;;13007:57;;;;;547:30684;;;13007:57;;547:30684;13007:57;;13042:4;;;13007:57;13042:4;;;10582:30;13007:57;;;:::i;:::-;;;;;;;;;;;;;;12911:466;13082:13;;10904:1;12911:466;;547:30684;;;;;12400:3;10582:30;547:30684;;10904:1;547:30684;;;;;;;;10582:30;547:30684;;;;;;;;;;;;;;;;;;;;;;10582:30;1744:1:2;10156:10:9;547:30684;;13455:15;10582:30;547:30684;10906:35:8;547:30684:9;;;;;;;10906:35:8;:::i;:::-;-1:-1:-1;13512:324:9;;;547:30684;;11027:13;547:30684;10853:3;547:30684;;;-1:-1:-1;;;;;547:30684:9;;13585:12;;547:30684;;12475:15;10582:30;547:30684;;;;10156:10;;547:30684;13547:68;547:30684;;;;13547:68;;13633:15;13512:324;547:30684;;13887:12;547:30684;;12475:15;10582:30;547:30684;;;;;;10156:10;13854:63;547:30684;10156:10;13854:63;;12884:1383;547:30684;;;;;14281:34;10582:30;547:30684;;;;;;14281:34;;11027:13;:::i;:::-;11058:38;;;12884:1383;10872:712;10853:3;:::i;:::-;10820:10;;;;;;;;;;;11058:38;547:30684;11071:23;;;;:::i;:::-;547:30684;;;;11058:38;;;13512:324;547:30684;;;;;;;-1:-1:-1;;;;;13755:9:9;547:30684;;13755:66;;;;;547:30684;;;13755:66;;-1:-1:-1;;;;;13755:66:9;;10156:10;;;13755:66;10156:10;;13790:4;10582:30;13755:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13512:324;;;;11027:13;13512:324;10853:3;13512:324;;;;;13755:66;;;;;;;;;;;;:::i;:::-;547:30684;;13755:66;;;;;;;;;;;547:30684;;;;13755:66;547:30684;;;;;;;;;13755:66;547:30684;;;;10254:9;547:30684;-1:-1:-1;;;;;547:30684:9;;;10582:30;547:30684;;13007:57;;;;:::i;:::-;547:30684;;13007:57;;;;12911:466;547:30684;;;;;;;;13250:2;547:30684;;13221:19;547:30684;13220:32;13216:147;;12911:466;;;;13216:147;13284:9;;;:15;:9;;13329;13284;;:::i;:::-;547:30684;13284:15;:::i;:::-;13329:9;:::i;:::-;547:30684;13216:147;;;;12884:1383;14065:3;;;11027:13;14065:3;10853;14065;;547:30684;14065:3;;;;;;14071:2;14065:3;547:30684;14065:3;;;;;547:30684;;;;14042:19;547:30684;14041:32;14037:135;;12884:1383;547:30684;;;;;;12400:3;10582:30;547:30684;14185:44;12475:15;547:30684;-1:-1:-1;;;;;12475:15:9;547:30684;;;14185:44;:::i;:::-;12884:1383;;14037:135;14101:9;;;:15;:9;;14142;14101;;:::i;14142:::-;547:30684;14037:135;;;;12472:309;547:30684;;;;;;;12400:3;10582:30;547:30684;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;12614:33;12610:171;12614:33;;;12670:61;547:30684;-1:-1:-1;;;;;12671:33:9;547:30684;;12670:52;547:30684;;;;;12671:33;;:::i;:::-;-1:-1:-1;;;;;12708:14:9;547:30684;;;12670:52;:::i;:61::-;12610:171;12472:309;;12610:171;12762:8;;;12610:171;12472:309;;10872:712;547:30684;11132:11;;;;;;:::i;:::-;547:30684;;;;10582:30;547:30684;11148:1;547:30684;;;;;;11120:29;11116:468;11148:1;;;11222:11;;;;;;;:::i;:::-;11244:7;;;;:::i;:::-;547:30684;11203:49;14661:12;547:30684;;;;;;14693:3;10582:30;547:30684;14685:68;10156:10;-1:-1:-1;;;;;;;;547:30684:9;;;;;;14693:32;14685:68;:::i;:::-;14770:11;547:30684;;;;;;;14693:3;10582:30;547:30684;14770:32;-1:-1:-1;;;;;547:30684:9;;;;;;;14770:32;;:::i;:::-;14812:984;;;;;14839:13;;14866:11;;14896:13;14919:2;14913:3;547:30684;14896:13;;547:30684;14895:26;14891:208;;14812:984;547:30684;;;;;;14693:3;10582:30;547:30684;;10904:1;547:30684;;;;;;;;10906:35:8;547:30684:9;;;10906:35:8;:::i;:::-;;10156:10:9;547:30684;;15182:15;10582:30;547:30684;10906:35:8;547:30684:9;;;;;;10906:35:8;:::i;:::-;;15239:17:9;547:30684;;;;;;;;;;;;;;;;;;;;;;15239:17;1744:1:2;15332:273:9;;;;547:30684;;11270:13;547:30684;10853:3;547:30684;;;-1:-1:-1;;;;;547:30684:9;;15405:12;;547:30684;;15419:15;10582:30;547:30684;;;;10156:10;;547:30684;15367:68;547:30684;;;;15367:68;;15453:15;15332:273;547:30684;;15656:12;547:30684;;15670:15;10582:30;547:30684;;;;;;10156:10;15623:63;547:30684;10156:10;15623:63;;14812:984;547:30684;;;;;15810:34;10582:30;547:30684;;;;;;15810:34;;11270:13;:::i;15332:273::-;547:30684;;;;;;;-1:-1:-1;;;;;15524:9:9;547:30684;;15524:66;;;;;547:30684;;;15524:66;;-1:-1:-1;;;;;15524:66:9;;10156:10;;;15524:66;10156:10;;15559:4;10582:30;15524:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15332:273;;;;11270:13;15332:273;10853:3;15332:273;;;;;15524:66;;;;;;;;;;;;:::i;:::-;547:30684;;15524:66;;;;;;;;;;;14891:208;14949:29;;;;;;;:::i;:::-;-1:-1:-1;;;;;14996:9:9;547:30684;;14996:57;;;;;547:30684;;;14996:57;;547:30684;14996:57;;15031:4;;;14996:57;15031:4;;;10582:30;14996:57;;;:::i;:::-;;;;;;;;;;;;;;14891:208;15071:13;;10904:1;14891:208;;;;14996:57;;;;:::i;:::-;547:30684;;14996:57;;;;14812:984;547:30684;;;;;;;15717:40;547:30684;;;-1:-1:-1;;;;;11270:13:9;547:30684;;;;;;10853:3;547:30684;;;;;;;;14693:3;10582:30;547:30684;;;;15717:40;:::i;:::-;14812:984;;11116:468;547:30684;11375:11;;;;;;;;;;;;;;;:::i;:::-;547:30684;;;;10582:30;547:30684;;;;;;;;11363:29;11359:225;10876:11;;;11448;547:30684;11448:11;;;;;;:::i;:::-;547:30684;;;;;16223:12;547:30684;;10582:30;547:30684;16215:77;10156:10;-1:-1:-1;;;;;;;;547:30684:9;;;;;;16223:41;16215:77;:::i;:::-;16309:20;547:30684;;;;;;10582:30;547:30684;;16309:50;547:30684;;-1:-1:-1;;;;;547:30684:9;;;;;;;16309:50;;:::i;:::-;16369:596;;;;;;547:30684;;;;;;10582:30;547:30684;;10904:1;547:30684;;;;;;;;10906:35:8;;;:::i;:::-;;10156:10:9;547:30684;;16483:15;10582:30;547:30684;10906:35:8;547:30684:9;;;;10906:35:8;:::i;:::-;-1:-1:-1;16540:26:9;547:30684;;-1:-1:-1;;547:30684:9;;;16540:26;547:30684;;;;1744:1:2;-1:-1:-1;;;;;16642:9:9;547:30684;;16642:66;;;;;547:30684;;;;;;16642:66;;;;-1:-1:-1;;;;;16642:66:9;;16677:4;10582:30;16642:66;;547:30684;10156:10;10254:9;547:30684;;;;;;;;;;;;;;;;;;16642:66;;;;;;;;;;;16369:596;547:30684;;;11412:57;547:30684;;10853:3;547:30684;;;16807:12;547:30684;;16821:15;10582:30;547:30684;;;16765:72;547:30684;10156:10;16765:72;;16369:596;547:30684;;;;;;16979:43;10582:30;547:30684;;;16979:43;;11412:57;:::i;16642:66::-;;;;:::i;:::-;547:30684;;16642:66;;;;547:30684;;;;16642:66;547:30684;;;;;;;;;;10254:9;547:30684;-1:-1:-1;;;;;547:30684:9;;;10582:30;547:30684;;16369:596;547:30684;16868:58;547:30684;11412:57;547:30684;;;10853:3;547:30684;;;;10582:30;547:30684;;;;;16868:58;:::i;:::-;16369:596;;11359:225;547:30684;11506:11;;;;;;;;;:::i;:::-;547:30684;;;10582:30;547:30684;;;;;;;11494:29;11490:94;;10853:3;11359:225;27980:3;:::i;10744:35::-;;;;;;;;;;;;;:::i;:::-;;;547:30684;10582:30;547:30684;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;10582:30;547:30684;;;;;;;;;;;;;;10582:30;547:30684;;;;;;;;10744:35;;;;;;;547:30684;;;;;10582:30;547:30684;;;;;;;;;;;;;;;;;;;10744:35;547:30684;;;;;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;10582:30;;547:30684;;;;10254:9;547:30684;;;;;;;;;;;;;;10582:30;;;;;;;;;;;;;;;;;;:::i;:::-;;;547:30684;;;;;;;10582:30;;;;;;-1:-1:-1;10582:30:9;;;547:30684;;;;;;;;;10402:45;;;;;;;:::i;:::-;;;;;;547:30684;;;10326:222;547:30684;;;;;;;;;;;;;;;;;10504:1;547:30684;;;;;;;;;10478:28;547:30684;;;;;;;10326:222;;547:30684;10254:9;547:30684;-1:-1:-1;;;;;547:30684:9;;;;;;;10254:9;547:30684;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;10254:9;547:30684;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2685:1388:8:-;-1:-1:-1;547:30684:9;;;2888:12:8;547:30684:9;;;;;;-1:-1:-1;;547:30684:9;2922:15:8;;;;-1:-1:-1;;547:30684:9;;;;;;;;;18434:15;547:30684;;;;;;;;;;3404:26:8;;;3400:398;;2918:1149;547:30684:9;;;18434:15;547:30684;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;18434:15;547:30684;;;2888:12:8;547:30684:9;;;;;;2888:12:8;4002:11;:::o;547:30684:9:-;;;-1:-1:-1;;;;;547:30684:9;;;;;;3400:398:8;547:30684:9;;3470:22:8;3592:26;3470:22;;:::i;:::-;547:30684:9;;;;;;;;;;;3592:26:8;:::i;547:30684:9:-;;;;;2888:12:8;547:30684:9;;;;;1744:1:2;3400:398:8;;;;;547:30684:9;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;2918:1149:8;4044:12;;;:::o;2685:1388::-;-1:-1:-1;547:30684:9;;;2888:12:8;547:30684:9;;;;;;-1:-1:-1;;547:30684:9;2922:15:8;;;;-1:-1:-1;;547:30684:9;;;;;;;;;17975:6;547:30684;;;;;;;;;;3404:26:8;;;3400:398;;2918:1149;547:30684:9;;;17975:6;547:30684;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;17975:6;547:30684;;;2888:12:8;547:30684:9;;;;;;2888:12:8;4002:11;:::o;3400:398::-;547:30684:9;;3470:22:8;3592:26;3470:22;;:::i;:::-;547:30684:9;;;;;;;;;;;3592:26:8;:::i;547:30684:9:-;;;;;2888:12:8;547:30684:9;;;;;1744:1:2;3400:398:8;;;;;2685:1388;;2888:12;;;-1:-1:-1;;547:30684:9;;;;;;;;;;;2922:15:8;;;2918:1149;2922:15;;;-1:-1:-1;;547:30684:9;;;;;;;;;;;;;;;;;;;;3404:26:8;;;3400:398;;2918:1149;547:30684:9;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2888:12:8;4002:11;:::o;547:30684:9:-;;;-1:-1:-1;;;;;547:30684:9;;;;;;3400:398:8;547:30684:9;;3470:22:8;3592:26;3470:22;;;:::i;:::-;547:30684:9;;;;;;;;;;;3592:26:8;;:::i;547:30684:9:-;;;;;;;;;;;1744:1:2;3400:398:8;;;;;547:30684:9;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;-1:-1:-1;;;;;547:30684:9;;;;;;2918:1149:8;4044:12;;;;;:::o;547:30684:9:-;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;;;;;;;;19038:1272;19132:5;547:30684;;19108:21;19117:12;547:30684;19108:21;;:::i;:::-;547:30684;;19165:30;19174:21;547:30684;19165:30;;:::i;:::-;547:30684;;19217:12;547:30684;19217:17;;:47;;;;;19038:1272;19213:1091;;;547:30684;;;19308:32;19354:41;547:30684;19308:32;547:30684;19308:32;:::i;:::-;;1744:1:2;19354:41:9;547:30684;19354:41;:::i;:::-;;1744:1:2;19457:7:9:o;19213:1091::-;19484:46;;;;19213:1091;19480:824;;;547:30684;;;19617:40;19616:66;547:30684;19546:32;19592:90;547:30684;19546:32;547:30684;19546:32;:::i;:::-;;1744:1:2;19627:30:9;547:30684;19617:40;;:::i;:::-;19661:21;547:30684;19616:66;;:::i;:::-;19592:90;547:30684;19592:90;:::i;:::-;;1744:1:2;-1:-1:-1;19627:30:9;1744:1:2;19744:7:9:o;19480:824::-;19771:16;:46;;;19480:824;19767:537;;;547:30684;;19833:63;19848:48;19849:31;19949:41;547:30684;19859:21;547:30684;19849:31;;:::i;:::-;19217:12;547:30684;19848:48;;:::i;:::-;19833:63;547:30684;19833:63;:::i;:::-;;1744:1:2;-1:-1:-1;19859:21:9;1744:1:2;19949:41:9;547:30684;19949:41;:::i;19767:537::-;20156:89;547:30684;;20180:65;547:30684;;;20041:62;20056:47;20181:39;547:30684;20057:30;20066:21;547:30684;20057:30;;:::i;:::-;20056:47;:::i;20041:62::-;;1744:1:2;-1:-1:-1;20066:21:9;1744:1:2;20190:30:9;547:30684;20181:39;;:::i;19771:46::-;547:30684;19791:21;547:30684;19791:26;19771:46;;19484;547:30684;19505:21;547:30684;19505:25;;19484:46;;19217:47;547:30684;19238:21;547:30684;19238:26;19217:47;;22267:1481;22380:44;22401:10;22388:9;:23;22380:44;:::i;:::-;22449:1;22465:10;;22477:19;;;;;;23506:9;;;23502:46;;23557:60;;22460:1033;547:30684;;-1:-1:-1;;;;;547:30684:9;23626:3;547:30684;;23626:38;;;;;547:30684;;;23626:38;;22401:10;23626:38;;;547:30684;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;-1:-1:-1;;23626:38:9;;;;;;;;22460:1033;547:30684;23674:10;547:30684;;23674:33;;;;;;547:30684;;;23674:33;;22401:10;23626:38;23674:33;;547:30684;;;;;;;;-1:-1:-1;;547:30684:9;;;;;;-1:-1:-1;;23674:33:9;;;;;;;23717:24;23674:33;;;22460:1033;547:30684;23717:24;547:30684;23717:24;:::i;:::-;;1744:1:2;22267:1481:9:o;23674:33::-;;;;:::i;:::-;;;;23626:38;;;;:::i;:::-;;;;23557:60;-1:-1:-1;;;;;23571:3:9;547:30684;;23571:43;;;;;;;547:30684;22449:1;547:30684;;;;23571:43;;;;;;547:30684;23571:43;;22401:10;23571:43;;;;:::i;:::-;;;;;;;;;;;23557:60;;;;23571:43;;;;:::i;:::-;;;;23502:46;23531:7;;;;:::o;22498:3::-;547:30684;22532:11;;;;;;;:::i;:::-;547:30684;22449:1;547:30684;22526:5;547:30684;;;;;-1:-1:-1;;;;;547:30684:9;22401:10;22518:76;22401:10;547:30684;-1:-1:-1;;;547:30684:9;22449:1;547:30684;;;;22526:38;22518:76;:::i;:::-;547:30684;-1:-1:-1;;;;;547:30684:9;;;;;;22643:12;547:30684;;22624:15;;;;;:31;;22621:358;22624:31;;;22708:11;;;;;22683:63;22708:11;;;22684:42;22708:11;22683:72;22708:11;22675:80;22708:11;;:::i;:::-;547:30684;22449:1;547:30684;;;;;;22449:1;547:30684;;;;22624:15;22684:42;:::i;22675:80::-;22621:358;;22993:431;;;;;;23037:11;;;;;;;;;:::i;:::-;547:30684;22449:1;547:30684;;;22449:1;547:30684;;;;;;;;;23067:20;547:30684;;;;;;;;;;;;1744:1:2;22401:10:9;22449:1;547:30684;23105:13;547:30684;;10906:35:8;547:30684:9;22449:1;547:30684;23138:11;;;;;;;:::i;:::-;547:30684;10906:35:8;;:::i;:::-;;23168:7:9;547:30684;;23216:11;;;;;;:::i;:::-;23168:60;;;;;;;22449:1;547:30684;;;;;;23168:60;;;;;;-1:-1:-1;;;;;23168:60:9;;22401:10;23197:4;23168:60;;;;:::i;:::-;;;;;;;;;;23442:40;23168:60;22498:3;23168:60;;;;;;22993:431;23277:11;;;;;;;:::i;:::-;547:30684;;;23290:12;;547:30684;;22624:15;547:30684;;;;;22401:10;23251:69;22401:10;;23251:69;;22993:431;23455:11;;;;;;:::i;:::-;547:30684;;;;;;;;;;23442:40;;22498:3;:::i;:::-;22465:10;;23168:60;;;;:::i;:::-;;;;;547:30684;;;22449:1;547:30684;;;;;22993:431;23442:40;23365:11;;;;;;;23359:50;23365:11;;22498:3;23365:11;;;;;;:::i;:::-;547:30684;22449:1;547:30684;;;22624:15;547:30684;;22449:1;547:30684;23359:50;:::i;:::-;22993:431;;22621:358;22786:11;;;;;;;;;;;;;;;;:::i;:::-;547:30684;22449:1;547:30684;;;;;;;;;22449:1;547:30684;;;;22780:39;22776:203;22780:39;;;22869:11;22848:39;22869:11;22847:69;22869:11;;;;;;;22847:60;22869:11;;22839:77;22869:11;;;;:::i;:::-;547:30684;22449:1;547:30684;;;22449:1;547:30684;;;;22848:39;;:::i;:::-;22891:16;547:30684;;;22847:60;:::i;22839:77::-;22776:203;22621:358;;22776:203;22955:9;;;;;;;;;22776:203;22621:358;;24787:404;547:30684;24867:15;547:30684;;;;;;;24898:11;547:30684;;;;24922:1;547:30684;;;;;;24898:25;24894:291;24922:1;;;547:30684;;;24946:3;547:30684;;-1:-1:-1;;;;;;;;547:30684:9;;;;;;;;;24946:27;24939:34;:::o;24894:291::-;547:30684;;;;;;25018:1;24994:25;25018:1;;547:30684;;;25042:3;547:30684;;-1:-1:-1;;;;;;;;547:30684:9;;;;;;;;;25042:27;25035:34;:::o;24990:195::-;547:30684;;;;;;24898:11;547:30684;;;;;;25090:25;25086:99;;24990:195;;;24787:404::o;25086:99::-;25138:12;547:30684;;;;-1:-1:-1;;;547:30684:9;;-1:-1:-1;;;;;547:30684:9;;;;;25138:36;;-1:-1:-1;25131:43:9:o;25425:526::-;547:30684;;-1:-1:-1;547:30684:9;;;;25513:5;547:30684;;-1:-1:-1;;;;;547:30684:9;;;;;;;;;;;25513:24;;25510:435;547:30684;;;25575:12;547:30684;;;25556:15;:31;-1:-1:-1;25556:31:9;;547:30684;;25615:38;547:30684;;;25614:59;547:30684;25614:68;547:30684;;25513:5;547:30684;;;;;;25556:15;25615:38;:::i;25553:343::-;547:30684;;;;;;;;;;;;25707:35;25703:193;25707:35;;;547:30684;;25769:56;547:30684;25770:35;547:30684;;25769:65;547:30684;;;;;25770:35;;:::i;25703:193::-;25873:8;;;;:::o;25957:852::-;26056:1;547:30684;26056:1;547:30684;;;;;;;26071:11;547:30684;;;;26095:1;547:30684;;;;;;26071:25;:51;;;25957:852;26067:715;;;-1:-1:-1;26160:12:9;547:30684;-1:-1:-1;;;;;547:30684:9;;;;26141:15;:31;-1:-1:-1;26141:31:9;;547:30684;26200:36;547:30684;;26218:3;26199:55;547:30684;;;;26199:64;547:30684;;;;;;;26141:15;26200:36;:::i;26138:333::-;547:30684;;26288:3;547:30684;;;;;;;;;;;;;;;26288:33;26284:187;26288:33;;;547:30684;;26349:33;547:30684;26348:52;547:30684;;26348:61;547:30684;;;;;26349:33;;:::i;26067:715::-;26071:11;547:30684;;;;26515:1;547:30684;;;;;;26491:25;:61;;;26067:715;26487:295;;;547:30684;-1:-1:-1;;;;;547:30684:9;;;26589:3;26575:32;547:30684;26575:11;547:30684;;;;;;;;;26575:32;;:::i;26487:295::-;547:30684;;;26071:11;547:30684;;26071:11;547:30684;;;;;;26628:25;:70;;;26487:295;26624:158;;26487:295;;;25957:852;:::o;26624:158::-;26721:50;547:30684;;-1:-1:-1;;;;;547:30684:9;;;26744:12;26721:20;547:30684;;;;;;;26721:50;;:::i;26628:70::-;547:30684;26657:12;547:30684;;-1:-1:-1;;;;;;;;547:30684:9;;;;;;26657:41;;26628:70;;26491:61;547:30684;26520:3;547:30684;;-1:-1:-1;;;;;;;;547:30684:9;;;;;;26520:32;;26491:61;;26071:51;547:30684;26100:3;547:30684;;-1:-1:-1;;;;;547:30684:9;;;;;;;26100:22;;26071:51;;29341:265;29425:6;547:30684;29425:20;;;29421:70;;29518:17;29525:10;29517:37;29518:17;;29517:37;:::i;:::-;547:30684;;;;;;;;;-1:-1:-1;547:30684:9;29571:3;547:30684;;-1:-1:-1;;;;;;;;547:30684:9;-1:-1:-1;547:30684:9;;;;29341:265;:::o;29421:70::-;29461:19;;-1:-1:-1;29461:19:9;:::o;29827:310::-;29920:15;547:30684;29920:29;;;29916:79;;30022:17;30029:10;30021:46;30022:17;;30021:46;:::i;:::-;547:30684;;;;;;;;;-1:-1:-1;547:30684:9;30084:12;547:30684;;-1:-1:-1;;;;;;;;547:30684:9;-1:-1:-1;547:30684:9;;;;29827:310;:::o
Swarm Source
ipfs://677f2325239d3a3b0252aa97eebd506dc17ef7d4e6a68363cb4690753ca75fe1
Loading...
Loading
Loading...
Loading
Net Worth in USD
$473.48
Net Worth in ETH
0.2394
Token Allocations
ETH
100.00%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $1,977.79 | 0.2394 | $473.48 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.