Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BalanceManager
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-16 */ // SPDX-License-Identifier: (c) Armor.Fi DAO, 2021 pragma solidity ^0.6.6; interface IKeeperRecipient { function keep() external; } interface IArmorMaster { function registerModule(bytes32 _key, address _module) external; function getModule(bytes32 _key) external view returns(address); function keep() external; } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". * * @dev Completely default OpenZeppelin. */ contract Ownable { address private _owner; address private _pendingOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function initializeOwnable() internal { require(_owner == address(0), "already initialized"); _owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "msg.sender is not owner"); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { _pendingOwner = newOwner; } function receiveOwnership() public { require(msg.sender == _pendingOwner, "only pending owner can call this function"); _transferOwnership(_pendingOwner); _pendingOwner = address(0); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[50] private __gap; } library Bytes32 { function toString(bytes32 x) internal pure returns (string memory) { bytes memory bytesString = new bytes(32); uint charCount = 0; for (uint256 j = 0; j < 32; j++) { byte char = byte(bytes32(uint(x) * 2 ** (8 * j))); if (char != 0) { bytesString[charCount] = char; charCount++; } } bytes memory bytesStringTrimmed = new bytes(charCount); for (uint256 j = 0; j < charCount; j++) { bytesStringTrimmed[j] = bytesString[j]; } return string(bytesStringTrimmed); } } /** * @dev Each arCore contract is a module to enable simple communication and interoperability. ArmorMaster.sol is master. **/ contract ArmorModule { IArmorMaster internal _master; using Bytes32 for bytes32; modifier onlyOwner() { require(msg.sender == Ownable(address(_master)).owner(), "only owner can call this function"); _; } modifier doKeep() { _master.keep(); _; } modifier onlyModule(bytes32 _module) { string memory message = string(abi.encodePacked("only module ", _module.toString()," can call this function")); require(msg.sender == getModule(_module), message); _; } /** * @dev Used when multiple can call. **/ modifier onlyModules(bytes32 _moduleOne, bytes32 _moduleTwo) { string memory message = string(abi.encodePacked("only module ", _moduleOne.toString()," or ", _moduleTwo.toString()," can call this function")); require(msg.sender == getModule(_moduleOne) || msg.sender == getModule(_moduleTwo), message); _; } function initializeModule(address _armorMaster) internal { require(address(_master) == address(0), "already initialized"); require(_armorMaster != address(0), "master cannot be zero address"); _master = IArmorMaster(_armorMaster); } function changeMaster(address _newMaster) external onlyOwner { _master = IArmorMaster(_newMaster); } function getModule(bytes32 _key) internal view returns(address) { return _master.getModule(_key); } } /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error * * @dev Default OpenZeppelin */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } /** * @title Balance Expire Traker * @dev Keeps track of expiration of user balances. **/ contract BalanceExpireTracker { using SafeMath for uint64; using SafeMath for uint256; // Don't want to keep typing address(0). Typecasting just for clarity. uint160 private constant EMPTY = uint160(address(0)); // 3 days for each step. uint64 public constant BUCKET_STEP = 3 days; // indicates where to start from // points where TokenInfo with (expiredAt / BUCKET_STEP) == index mapping(uint64 => Bucket) public checkPoints; struct Bucket { uint160 head; uint160 tail; } // points first active nft uint160 public head; // points last active nft uint160 public tail; // maps expireId to deposit info mapping(uint160 => ExpireMetadata) public infos; // pack data to reduce gas struct ExpireMetadata { uint160 next; // zero if there is no further information uint160 prev; uint64 expiresAt; } function expired() internal view returns(bool) { if(infos[head].expiresAt == 0) { return false; } if(infos[head].expiresAt <= uint64(now)){ return true; } return false; } // using typecasted expireId to save gas function push(uint160 expireId, uint64 expiresAt) internal { require(expireId != EMPTY, "info id address(0) cannot be supported"); // If this is a replacement for a current balance, remove it's current link first. if (infos[expireId].expiresAt > 0) pop(expireId); uint64 bucket = uint64( (expiresAt.div(BUCKET_STEP)).mul(BUCKET_STEP) ); if (head == EMPTY) { // all the nfts are expired. so just add head = expireId; tail = expireId; checkPoints[bucket] = Bucket(expireId, expireId); infos[expireId] = ExpireMetadata(EMPTY,EMPTY,expiresAt); return; } // there is active nft. we need to find where to push // first check if this expires faster than head if (infos[head].expiresAt >= expiresAt) { // pushing nft is going to expire first // update head infos[head].prev = expireId; infos[expireId] = ExpireMetadata(head, EMPTY,expiresAt); head = expireId; // update head of bucket Bucket storage b = checkPoints[bucket]; b.head = expireId; if(b.tail == EMPTY) { // if tail is zero, this bucket was empty should fill tail with expireId b.tail = expireId; } // this case can end now return; } // then check if depositing nft will last more than latest if (infos[tail].expiresAt <= expiresAt) { infos[tail].next = expireId; // push nft at tail infos[expireId] = ExpireMetadata(EMPTY,tail,expiresAt); tail = expireId; // update tail of bucket Bucket storage b = checkPoints[bucket]; b.tail = expireId; if(b.head == EMPTY) { // if head is zero, this bucket was empty should fill head with expireId b.head = expireId; } // this case is done now return; } // so our nft is somewhere in between if (checkPoints[bucket].head != EMPTY) { //bucket is not empty //we just need to find our neighbor in the bucket uint160 cursor = checkPoints[bucket].head; // iterate until we find our nft's next while(infos[cursor].expiresAt < expiresAt){ cursor = infos[cursor].next; } infos[expireId] = ExpireMetadata(cursor, infos[cursor].prev, expiresAt); infos[infos[cursor].prev].next = expireId; infos[cursor].prev = expireId; //now update bucket's head/tail data Bucket storage b = checkPoints[bucket]; if (infos[b.head].prev == expireId){ b.head = expireId; } if (infos[b.tail].next == expireId){ b.tail = expireId; } } else { //bucket is empty //should find which bucket has depositing nft's closest neighbor // step 1 find prev bucket uint64 prevCursor = uint64( bucket.sub(BUCKET_STEP) ); while(checkPoints[prevCursor].tail == EMPTY){ prevCursor = uint64( prevCursor.sub(BUCKET_STEP) ); } uint160 prev = checkPoints[prevCursor].tail; uint160 next = infos[prev].next; // step 2 link prev buckets tail - nft - next buckets head infos[expireId] = ExpireMetadata(next,prev,expiresAt); infos[prev].next = expireId; infos[next].prev = expireId; checkPoints[bucket].head = expireId; checkPoints[bucket].tail = expireId; } } function pop(uint160 expireId) internal { uint64 expiresAt = infos[expireId].expiresAt; uint64 bucket = uint64( (expiresAt.div(BUCKET_STEP)).mul(BUCKET_STEP) ); // check if bucket is empty // if bucket is empty, end if(checkPoints[bucket].head == EMPTY){ return; } // if bucket is not empty, iterate through // if expiresAt of current cursor is larger than expiresAt of parameter, reverts for(uint160 cursor = checkPoints[bucket].head; infos[cursor].expiresAt <= expiresAt; cursor = infos[cursor].next) { ExpireMetadata memory info = infos[cursor]; // if expiresAt is same of paramter, check if expireId is same if(info.expiresAt == expiresAt && cursor == expireId) { // if yes, delete it // if cursor was head, move head to cursor.next if(head == cursor) { head = info.next; } // if cursor was tail, move tail to cursor.prev if(tail == cursor) { tail = info.prev; } // if cursor was head of bucket if(checkPoints[bucket].head == cursor){ // and cursor.next is still in same bucket, move head to cursor.next if(infos[info.next].expiresAt.div(BUCKET_STEP) == bucket.div(BUCKET_STEP)){ checkPoints[bucket].head = info.next; } else { // delete whole checkpoint if bucket is now empty delete checkPoints[bucket]; } } else if(checkPoints[bucket].tail == cursor){ // since bucket.tail == bucket.haed == cursor case is handled at the above, // we only have to handle bucket.tail == cursor != bucket.head checkPoints[bucket].tail = info.prev; } // now we handled all tail/head situation, we have to connect prev and next infos[info.prev].next = info.next; infos[info.next].prev = info.prev; // delete info and end delete infos[cursor]; return; } // if not, continue -> since there can be same expires at with multiple expireId } //changed to return for consistency return; //revert("Info does not exist"); } uint256[50] private __gap; } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface IBalanceManager { event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event Loss(address indexed user, uint256 amount); event PriceChange(address indexed user, uint256 price); event AffiliatePaid(address indexed affiliate, address indexed referral, uint256 amount, uint256 timestamp); event ReferralAdded(address indexed affiliate, address indexed referral, uint256 timestamp); function deposit(address _referrer) external payable; function withdraw(uint256 _amount) external; function initialize(address _armormaster, address _devWallet) external; function balanceOf(address _user) external view returns (uint256); function perSecondPrice(address _user) external view returns(uint256); function changePrice(address user, uint64 _newPricePerSec) external; } interface IPlanManager { // Event to notify frontend of plan update. event PlanUpdate(address indexed user, address[] protocols, uint256[] amounts, uint256 endTime); function initialize(address _armorManager) external; function changePrice(address _scAddress, uint256 _pricePerAmount) external; function updatePlan(address[] calldata _protocols, uint256[] calldata _coverAmounts) external; function checkCoverage(address _user, address _protocol, uint256 _hacktime, uint256 _amount) external view returns (uint256, bool); function coverageLeft(address _protocol) external view returns(uint256); function getCurrentPlan(address _user) external view returns(uint128 start, uint128 end); function updateExpireTime(address _user, uint256 _expiry) external; function planRedeemed(address _user, uint256 _planIndex, address _protocol) external; function totalUsedCover(address _scAddress) external view returns (uint256); } interface IRewardDistributionRecipient { function notifyRewardAmount(uint256 reward) payable external; } interface IRewardManager is IRewardDistributionRecipient { function initialize(address _rewardToken, address _stakeManager) external; function stake(address _user, uint256 _coverPrice, uint256 _nftId) external; function withdraw(address _user, uint256 _coverPrice, uint256 _nftId) external; function getReward(address payable _user) external; } interface IUtilizationFarm is IRewardDistributionRecipient { function initialize(address _rewardToken, address _stakeManager) external; function stake(address _user, uint256 _coverPrice) external; function withdraw(address _user, uint256 _coverPrice) external; function getReward(address payable _user) external; } /** * @dev BorrowManager is where borrowers do all their interaction and it holds funds * until they're sent to the StakeManager. **/ contract BalanceManager is ArmorModule, IBalanceManager, BalanceExpireTracker { using SafeMath for uint256; using SafeMath for uint128; // Wallet of the developers for if a developer fee is being paid. address public devWallet; // With lastTime and secondPrice we can determine balance by second. struct Balance { uint64 lastTime; uint64 perSecondPrice; uint128 lastBalance; } // keep track of monthly payments and start/end of those mapping (address => Balance) public balances; // user => referrer mapping (address => address) public referrers; // Percent of funds that go to development--start with 0 and can change. uint128 public devPercent; // Percent of funds referrers receive. 20 = 2%. uint128 public refPercent; // Percent of funds given to governance stakers. uint128 public govPercent; // Denominator used to when distributing tokens 1000 == 100% uint128 public constant DENOMINATOR = 1000; // True if utilization farming is still ongoing bool public ufOn; // Mapping of shields so we don't reward them for U.F. mapping (address => bool) public arShields; // Block withdrawals within 1 hour of depositing. modifier onceAnHour { require(block.timestamp >= balances[msg.sender].lastTime.add(1 hours), "You must wait an hour after your last update to withdraw."); _; } /** * @dev Call updateBalance before any action is taken by a user. * @param _user The user whose balance we need to update. **/ modifier update(address _user) { uint256 _oldBal = _updateBalance(_user); _; _updateBalanceActions(_user, _oldBal); } /** * @dev Keep function can be called by anyone to balances that have been expired. This pays out addresses and removes used cover. * This is external because the doKeep modifier calls back to ArmorMaster, which then calls back to here (and elsewhere). **/ function keep() external { // Restrict each keep to 2 removes max. for (uint256 i = 0; i < 2; i++) { if (infos[head].expiresAt != 0 && infos[head].expiresAt <= now) { address oldHead = address(head); uint256 oldBal = _updateBalance(oldHead); _updateBalanceActions(oldHead, oldBal); } else return; } } /** * @param _armorMaster Address of the ArmorMaster contract. **/ function initialize(address _armorMaster, address _devWallet) external override { initializeModule(_armorMaster); devWallet = _devWallet; devPercent = 0; // 0 % refPercent = 25; // 2.5% govPercent = 0; // 0% ufOn = true; } /** * @dev Borrower deposits an amount of ETH to pay for coverage. * @param _referrer User who referred the depositor. **/ function deposit(address _referrer) external payable override doKeep update(msg.sender) { if ( referrers[msg.sender] == address(0) ) { referrers[msg.sender] = _referrer != address(0) ? _referrer : devWallet; emit ReferralAdded(_referrer, msg.sender, block.timestamp); } require(msg.value > 0, "No Ether was deposited."); balances[msg.sender].lastBalance = uint128(balances[msg.sender].lastBalance.add(msg.value)); emit Deposit(msg.sender, msg.value); } /** * @dev Borrower withdraws ETH from their balance. * @param _amount The amount of ETH to withdraw. **/ function withdraw(uint256 _amount) external override onceAnHour doKeep update(msg.sender) { require(_amount > 0, "Must withdraw more than 0."); Balance memory balance = balances[msg.sender]; // Since cost increases per second, it's difficult to estimate the correct amount. Withdraw it all in that case. if (balance.lastBalance > _amount) { balance.lastBalance = uint128( balance.lastBalance.sub(_amount) ); } else { _amount = balance.lastBalance; balance.lastBalance = 0; } balances[msg.sender] = balance; msg.sender.transfer(_amount); emit Withdraw(msg.sender, _amount); } /** * @dev Find the current balance of a user to the second. * @param _user The user whose balance to find. **/ function balanceOf(address _user) public view override returns (uint256) { Balance memory balance = balances[_user]; // We adjust balance on chain based on how many blocks have passed. uint256 lastBalance = balance.lastBalance; uint256 timeElapsed = block.timestamp.sub(balance.lastTime); uint256 cost = timeElapsed.mul(balance.perSecondPrice); // If the elapsed time has brought balance to 0, make it 0. uint256 newBalance; if (lastBalance > cost) newBalance = lastBalance.sub(cost); else newBalance = 0; return newBalance; } /** * @dev Send funds to governanceStaker and rewardManager (don't want to have to send them with every transaction). **/ function releaseFunds() public { uint256 govBalance = balances[getModule("GOVSTAKE")].lastBalance; // If staking contracts are sent too low of a reward, it can mess up distribution. if (govBalance >= 1 ether / 10) { IRewardManager(getModule("GOVSTAKE")).notifyRewardAmount{value: govBalance}(govBalance); balances[getModule("GOVSTAKE")].lastBalance = 0; } uint256 rewardBalance = balances[getModule("REWARD")].lastBalance; // If staking contracts are sent too low of a reward, it can mess up distribution. if (rewardBalance >= 1 ether / 10) { IRewardManager(getModule("REWARD")).notifyRewardAmount{value: rewardBalance}(rewardBalance); balances[getModule("REWARD")].lastBalance = 0; } } function perSecondPrice(address _user) external override view returns(uint256) { Balance memory balance = balances[_user]; return balance.perSecondPrice; } /** * @dev PlanManager has the ability to change the price that a user is paying for their insurance. * @param _user The user whose price we are changing. * @param _newPrice the new price per second that the user will be paying. **/ function changePrice(address _user, uint64 _newPrice) external override onlyModule("PLAN") { _updateBalance(_user); _priceChange(_user, _newPrice); if (_newPrice > 0) _adjustExpiry(_user, balances[_user].lastBalance.div(_newPrice).add(block.timestamp)); else _adjustExpiry(_user, block.timestamp); } /** * @dev Update a borrower's balance to it's adjusted amount. * @param _user The address to be updated. **/ function _updateBalance(address _user) internal returns (uint256 oldBalance) { Balance memory balance = balances[_user]; oldBalance = balance.lastBalance; uint256 newBalance = balanceOf(_user); // newBalance should never be greater than last balance. uint256 loss = oldBalance.sub(newBalance); _payPercents(_user, uint128(loss)); // Update storage balance. balance.lastBalance = uint128(newBalance); balance.lastTime = uint64(block.timestamp); emit Loss(_user, loss); balances[_user] = balance; } /** * @dev Actions relating to balance updates. * @param _user The user who we're updating. * @param _oldBal The original balance in the tx. **/ function _updateBalanceActions(address _user, uint256 _oldBal) internal { Balance memory balance = balances[_user]; if (_oldBal != balance.lastBalance && balance.perSecondPrice > 0) { _notifyBalanceChange(_user, balance.lastBalance, balance.perSecondPrice); _adjustExpiry(_user, balance.lastBalance.div(balance.perSecondPrice).add(block.timestamp)); } if (balance.lastBalance == 0 && _oldBal != 0) { _priceChange(_user, 0); } } /** * @dev handle the user's balance change. this will interact with UFB * @param _user user's address * @param _newPrice user's new per sec price **/ function _priceChange(address _user, uint64 _newPrice) internal { Balance memory balance = balances[_user]; uint64 originalPrice = balance.perSecondPrice; if(originalPrice == _newPrice) { // no need to process return; } if (ufOn && !arShields[_user]) { if(originalPrice > _newPrice) { // price is decreasing IUtilizationFarm(getModule("UFB")).withdraw(_user, originalPrice.sub(_newPrice)); } else { // price is increasing IUtilizationFarm(getModule("UFB")).stake(_user, _newPrice.sub(originalPrice)); } } balances[_user].perSecondPrice = _newPrice; emit PriceChange(_user, _newPrice); } /** * @dev Adjust when a balance expires. * @param _user Address of the user whose expiry we're adjusting. * @param _newExpiry New Unix timestamp of expiry. **/ function _adjustExpiry(address _user, uint256 _newExpiry) internal { if (_newExpiry == block.timestamp) { BalanceExpireTracker.pop(uint160(_user)); } else { BalanceExpireTracker.push(uint160(_user), uint64(_newExpiry)); } } /** * @dev Balance has changed so PlanManager's expire time must be either increased or reduced. **/ function _notifyBalanceChange(address _user, uint256 _newBalance, uint256 _newPerSec) internal { uint256 expiry = _newBalance.div(_newPerSec).add(block.timestamp); IPlanManager(getModule("PLAN")).updateExpireTime(_user, expiry); } /** * @dev Give rewards to different places. * @param _user User that's being charged. * @param _charged Amount of funds charged to the user. **/ function _payPercents(address _user, uint128 _charged) internal { // percents: 20 = 2%. uint128 refAmount = referrers[_user] != address(0) ? _charged * refPercent / DENOMINATOR : 0; uint128 devAmount = _charged * devPercent / DENOMINATOR; uint128 govAmount = _charged * govPercent / DENOMINATOR; uint128 nftAmount = uint128( _charged.sub(refAmount).sub(devAmount).sub(govAmount) ); if (refAmount > 0) { balances[ referrers[_user] ].lastBalance = uint128( balances[ referrers[_user] ].lastBalance.add(refAmount) ); emit AffiliatePaid(referrers[_user], _user, refAmount, block.timestamp); } if (devAmount > 0) balances[devWallet].lastBalance = uint128( balances[devWallet].lastBalance.add(devAmount) ); if (govAmount > 0) balances[getModule("GOVSTAKE")].lastBalance = uint128( balances[getModule("GOVSTAKE")].lastBalance.add(govAmount) ); if (nftAmount > 0) balances[getModule("REWARD")].lastBalance = uint128( balances[getModule("REWARD")].lastBalance.add(nftAmount) ); } /** * @dev Controller can change how much referrers are paid. * @param _newPercent New percent referrals receive from revenue. 100 == 10%. **/ function changeRefPercent(uint128 _newPercent) external onlyOwner { require(_newPercent <= DENOMINATOR, "new percent cannot be bigger than DENOMINATOR"); refPercent = _newPercent; } /** * @dev Controller can change how much governance is paid. * @param _newPercent New percent that governance will receive from revenue. 100 == 10%. **/ function changeGovPercent(uint128 _newPercent) external onlyOwner { require(_newPercent <= DENOMINATOR, "new percent cannot be bigger than DENOMINATOR"); govPercent = _newPercent; } /** * @dev Controller can change how much developers are paid. * @param _newPercent New percent that devs will receive from revenue. 100 == 10%. **/ function changeDevPercent(uint128 _newPercent) external onlyOwner { require(_newPercent <= DENOMINATOR, "new percent cannot be bigger than DENOMINATOR"); devPercent = _newPercent; } /** * @dev Toggle whether utilization farming should be on or off. **/ function toggleUF() external onlyOwner { ufOn = !ufOn; } /** * @dev Toggle whether address is a shield. **/ function toggleShield(address _shield) external onlyOwner { arShields[_shield] = !arShields[_shield]; } // to reset the buckets function resetExpiry(uint160[] calldata _idxs) external onlyOwner { for(uint256 i = 0; i<_idxs.length; i++) { require(infos[_idxs[i]].expiresAt != 0, "not in linkedlist"); BalanceExpireTracker.pop(_idxs[i]); BalanceExpireTracker.push(_idxs[i], infos[_idxs[i]].expiresAt); } } // set desired head and tail function _resetBucket(uint64 _bucket, uint160 _head, uint160 _tail) internal { require(_bucket % BUCKET_STEP == 0, "INVALID BUCKET"); require( infos[infos[_tail].next].expiresAt >= _bucket + BUCKET_STEP && infos[_tail].expiresAt < _bucket + BUCKET_STEP && infos[_tail].expiresAt >= _bucket, "tail is not tail"); require( infos[infos[_head].prev].expiresAt < _bucket && infos[_head].expiresAt < _bucket + BUCKET_STEP && infos[_head].expiresAt >= _bucket, "head is not head"); checkPoints[_bucket].tail = _tail; checkPoints[_bucket].head = _head; } function resetBuckets(uint64[] calldata _buckets, uint160[] calldata _heads, uint160[] calldata _tails) external onlyOwner{ for(uint256 i = 0 ; i < _buckets.length; i++){ _resetBucket(_buckets[i], _heads[i], _tails[i]); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"affiliate","type":"address"},{"indexed":true,"internalType":"address","name":"referral","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AffiliatePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Loss","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PriceChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"affiliate","type":"address"},{"indexed":true,"internalType":"address","name":"referral","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ReferralAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BUCKET_STEP","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"arShields","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint64","name":"lastTime","type":"uint64"},{"internalType":"uint64","name":"perSecondPrice","type":"uint64"},{"internalType":"uint128","name":"lastBalance","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"_newPercent","type":"uint128"}],"name":"changeDevPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_newPercent","type":"uint128"}],"name":"changeGovPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMaster","type":"address"}],"name":"changeMaster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint64","name":"_newPrice","type":"uint64"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_newPercent","type":"uint128"}],"name":"changeRefPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"checkPoints","outputs":[{"internalType":"uint160","name":"head","type":"uint160"},{"internalType":"uint160","name":"tail","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"devPercent","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"govPercent","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"head","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint160","name":"","type":"uint160"}],"name":"infos","outputs":[{"internalType":"uint160","name":"next","type":"uint160"},{"internalType":"uint160","name":"prev","type":"uint160"},{"internalType":"uint64","name":"expiresAt","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_armorMaster","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"keep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"perSecondPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refPercent","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"_buckets","type":"uint64[]"},{"internalType":"uint160[]","name":"_heads","type":"uint160[]"},{"internalType":"uint160[]","name":"_tails","type":"uint160[]"}],"name":"resetBuckets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160[]","name":"_idxs","type":"uint160[]"}],"name":"resetExpiry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tail","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_shield","type":"address"}],"name":"toggleShield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleUF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ufOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506137fe806100206000396000f3fe6080604052600436106101cd5760003560e01c80638ea5220f116100f7578063d0ecab1511610095578063f340fa0111610064578063f340fa0114610805578063f4ff78bf1461082b578063f887f8621461085e578063fc3c28af14610891576101cd565b8063d0ecab1514610775578063d7693c07146107a8578063e4d06d82146107bd578063e55e8be9146107d2576101cd565b8063b4f54382116100d1578063b4f5438214610665578063bfdb8a4a14610698578063c6448410146106ad578063ce584bfa1461070f576101cd565b80638ea5220f146106265780638f7dcfa31461063b578063918f867414610650576101cd565b80634a3b68cc1161016f5780637115dc331161013e5780637115dc3314610448578063732986671461045d57806376ac760b1461049057806381beb60a1461050b576101cd565b80634a3b68cc1461038a57806359d5335b146103bd57806369d89575146103ee57806370a0823114610403576101cd565b80631c8b453f116101ab5780631c8b453f1461028e57806327e235e3146102bf5780632e1a7d4d14610325578063485cc9551461034f576101cd565b806313d8c840146101d2578063152b36e01461020357806319277b7d1461024a575b600080fd5b3480156101de57600080fd5b506101e76108a6565b604080516001600160a01b039092168252519081900360200190f35b34801561020f57600080fd5b506102366004803603602081101561022657600080fd5b50356001600160a01b03166108b5565b604080519115158252519081900360200190f35b34801561025657600080fd5b5061028c6004803603604081101561026d57600080fd5b5080356001600160a01b031690602001356001600160401b03166108ca565b005b34801561029a57600080fd5b506102a3610ab7565b604080516001600160401b039092168252519081900360200190f35b3480156102cb57600080fd5b506102f2600480360360208110156102e257600080fd5b50356001600160a01b0316610abe565b604080516001600160401b0394851681529290931660208301526001600160801b03168183015290519081900360600190f35b34801561033157600080fd5b5061028c6004803603602081101561034857600080fd5b5035610af7565b34801561035b57600080fd5b5061028c6004803603604081101561037257600080fd5b506001600160a01b0381358116916020013516610d97565b34801561039657600080fd5b506101e7600480360360208110156103ad57600080fd5b50356001600160a01b0316610dec565b3480156103c957600080fd5b506103d2610e07565b604080516001600160801b039092168252519081900360200190f35b3480156103fa57600080fd5b5061028c610e1d565b34801561040f57600080fd5b506104366004803603602081101561042657600080fd5b50356001600160a01b0316611047565b60408051918252519081900360200190f35b34801561045457600080fd5b506103d2611109565b34801561046957600080fd5b5061028c6004803603602081101561048057600080fd5b50356001600160801b0316611118565b34801561049c57600080fd5b5061028c600480360360208110156104b357600080fd5b810190602081018135600160201b8111156104cd57600080fd5b8201836020820111156104df57600080fd5b803590602001918460208302840111600160201b8311171561050057600080fd5b50909250905061123f565b34801561051757600080fd5b5061028c6004803603606081101561052e57600080fd5b810190602081018135600160201b81111561054857600080fd5b82018360208201111561055a57600080fd5b803590602001918460208302840111600160201b8311171561057b57600080fd5b919390929091602081019035600160201b81111561059857600080fd5b8201836020820111156105aa57600080fd5b803590602001918460208302840111600160201b831117156105cb57600080fd5b919390929091602081019035600160201b8111156105e857600080fd5b8201836020820111156105fa57600080fd5b803590602001918460208302840111600160201b8311171561061b57600080fd5b50909250905061143a565b34801561063257600080fd5b506101e7611570565b34801561064757600080fd5b506101e761157f565b34801561065c57600080fd5b506103d261158e565b34801561067157600080fd5b5061028c6004803603602081101561068857600080fd5b50356001600160801b0316611594565b3480156106a457600080fd5b506102366116be565b3480156106b957600080fd5b506106e0600480360360208110156106d057600080fd5b50356001600160401b03166116ce565b60405180836001600160a01b03168152602001826001600160a01b031681526020019250505060405180910390f35b34801561071b57600080fd5b506107426004803603602081101561073257600080fd5b50356001600160a01b03166116f4565b604080516001600160a01b0394851681529290931660208301526001600160401b03168183015290519081900360600190f35b34801561078157600080fd5b5061028c6004803603602081101561079857600080fd5b50356001600160a01b031661172c565b3480156107b457600080fd5b5061028c611813565b3480156107c957600080fd5b5061028c6118f2565b3480156107de57600080fd5b5061028c600480360360208110156107f557600080fd5b50356001600160801b03166119a9565b61028c6004803603602081101561081b57600080fd5b50356001600160a01b0316611ad3565b34801561083757600080fd5b5061028c6004803603602081101561084e57600080fd5b50356001600160a01b0316611cc7565b34801561086a57600080fd5b506104366004803603602081101561088157600080fd5b50356001600160a01b0316611da7565b34801561089d57600080fd5b506103d2611e0c565b6003546001600160a01b031681565b603c6020526000908152604090205460ff1681565b63282620a760e11b60606108dd82611e1b565b60405160200180806b037b7363c9036b7b23ab632960a51b815250600c0182805190602001908083835b602083106109265780518252601f199092019160209182019101610907565b6001836020036101000a038019825116818451168082178552505050505050905001807f2063616e2063616c6c20746869732066756e6374696f6e000000000000000000815250601701915050604051602081830303815290604052905061098d82611f36565b6001600160a01b0316336001600160a01b0316148190610a2b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156109f05781810151838201526020016109d8565b50505050905090810190601f168015610a1d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610a3584611fb5565b50610a40848461211a565b6001600160401b03831615610aa7576001600160a01b038416600090815260386020526040902054610aa2908590610a9d904290610a9790600160801b90046001600160801b03166001600160401b038916612385565b906123a9565b6123c2565b610ab1565b610ab184426123c2565b50505050565b6203f48081565b6038602052600090815260409020546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b33600090815260386020526040902054610b1c906001600160401b0316610e106123a9565b421015610b5a5760405162461bcd60e51b815260040180806020018281038252603981526020018061376a6039913960400191505060405180910390fd5b600080546040805163726836c160e11b815290516001600160a01b039092169263e4d06d829260048084019382900301818387803b158015610b9b57600080fd5b505af1158015610baf573d6000803e3d6000fd5b50505050336000610bbf82611fb5565b905060008311610c16576040805162461bcd60e51b815260206004820152601a60248201527f4d757374207769746864726177206d6f7265207468616e20302e000000000000604482015290519081900360640190fd5b610c1e6136fb565b5033600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b82041692820192909252600160801b9091046001600160801b031691810182905290841015610ca2576040810151610c8f906001600160801b0316856123e2565b6001600160801b03166040820152610cb9565b60408101805160009091526001600160801b031693505b33600081815260386020908152604080832085518154938701518784015167ffffffffffffffff199095166001600160401b039283161767ffffffffffffffff60401b1916600160401b9290911691909102176001600160801b03908116600160801b919094160292909217909155516108fc87150291879190818181858888f19350505050158015610d50573d6000803e3d6000fd5b5060408051858152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a250610d9282826123f7565b505050565b610da0826124ff565b603780546001600160a01b039092166001600160a01b031990921691909117905550601960801b603a55603b805470ffffffffffffffffffffffffffffffffff1916600160801b179055565b6039602052600090815260409020546001600160a01b031681565b603a54600160801b90046001600160801b031681565b600060386000610e3767474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002054600160801b90046001600160801b0316905067016345785d8a00008110610f3357610e8667474f565354414b4560c01b611f36565b6001600160a01b0316633c6b16ab82836040518363ffffffff1660e01b8152600401808281526020019150506000604051808303818588803b158015610ecb57600080fd5b505af1158015610edf573d6000803e3d6000fd5b5050505050600060386000610efe67474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b600060386000610f4b65149155d0549160d21b611f36565b6001600160a01b03168152602081019190915260400160002054600160801b90046001600160801b0316905067016345785d8a0000811061104357610f9865149155d0549160d21b611f36565b6001600160a01b0316633c6b16ab82836040518363ffffffff1660e01b8152600401808281526020019150506000604051808303818588803b158015610fdd57600080fd5b505af1158015610ff1573d6000803e3d6000fd5b505050505060006038600061100e65149155d0549160d21b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b5050565b60006110516136fb565b506001600160a01b0382166000908152603860209081526040808320815160608101835290546001600160401b03808216808452600160401b830490911694830194909452600160801b90046001600160801b03169181018290529290916110ba9042906123e2565b905060006110de84602001516001600160401b0316836125ae90919063ffffffff16565b90506000818411156110fb576110f484836123e2565b90506110ff565b5060005b9695505050505050565b603b546001600160801b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561116457600080fd5b505afa158015611178573d6000803e3d6000fd5b505050506040513d602081101561118e57600080fd5b50516001600160a01b031633146111d65760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6103e86001600160801b03821611156112205760405162461bcd60e51b815260040180806020018281038252602d81526020018061371c602d913960400191505060405180910390fd5b603a80546001600160801b03928316600160801b029216919091179055565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561128b57600080fd5b505afa15801561129f573d6000803e3d6000fd5b505050506040513d60208110156112b557600080fd5b50516001600160a01b031633146112fd5760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b60005b81811015610d92576004600084848481811061131857fe5b602090810292909201356001600160a01b031683525081019190915260400160002060010154600160a01b90046001600160401b0316611393576040805162461bcd60e51b81526020600482015260116024820152701b9bdd081a5b881b1a5b9ad9591b1a5cdd607a1b604482015290519081900360640190fd5b6113b78383838181106113a257fe5b905060200201356001600160a01b03166125d5565b6114328383838181106113c657fe5b905060200201356001600160a01b0316600460008686868181106113e657fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060010160149054906101000a90046001600160401b031661299d565b600101611300565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148657600080fd5b505afa15801561149a573d6000803e3d6000fd5b505050506040513d60208110156114b057600080fd5b50516001600160a01b031633146114f85760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b60005b858110156115675761155f87878381811061151257fe5b905060200201356001600160401b031686868481811061152e57fe5b905060200201356001600160a01b031685858581811061154a57fe5b905060200201356001600160a01b031661309e565b6001016114fb565b50505050505050565b6037546001600160a01b031681565b6002546001600160a01b031681565b6103e881565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e057600080fd5b505afa1580156115f4573d6000803e3d6000fd5b505050506040513d602081101561160a57600080fd5b50516001600160a01b031633146116525760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6103e86001600160801b038216111561169c5760405162461bcd60e51b815260040180806020018281038252602d81526020018061371c602d913960400191505060405180910390fd5b603b80546001600160801b0319166001600160801b0392909216919091179055565b603b54600160801b900460ff1681565b600160208190526000918252604090912080549101546001600160a01b03918216911682565b600460205260009081526040902080546001909101546001600160a01b0391821691811690600160a01b90046001600160401b031683565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561177857600080fd5b505afa15801561178c573d6000803e3d6000fd5b505050506040513d60208110156117a257600080fd5b50516001600160a01b031633146117ea5760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6001600160a01b03166000908152603c60205260409020805460ff19811660ff90911615179055565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561185f57600080fd5b505afa158015611873573d6000803e3d6000fd5b505050506040513d602081101561188957600080fd5b50516001600160a01b031633146118d15760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b603b805460ff60801b198116600160801b9182900460ff1615909102179055565b60005b60028110156119a5576002546001600160a01b0316600090815260046020526040902060010154600160a01b90046001600160401b03161580159061196857506002546001600160a01b031660009081526004602052604090206001015442600160a01b9091046001600160401b031611155b15611997576002546001600160a01b0316600061198482611fb5565b905061199082826123f7565b505061199d565b506119a7565b6001016118f5565b505b565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119f557600080fd5b505afa158015611a09573d6000803e3d6000fd5b505050506040513d6020811015611a1f57600080fd5b50516001600160a01b03163314611a675760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6103e86001600160801b0382161115611ab15760405162461bcd60e51b815260040180806020018281038252602d81526020018061371c602d913960400191505060405180910390fd5b603a80546001600160801b0319166001600160801b0392909216919091179055565b600080546040805163726836c160e11b815290516001600160a01b039092169263e4d06d829260048084019382900301818387803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050336000611b3882611fb5565b336000908152603960205260409020549091506001600160a01b0316611bdd576001600160a01b038316611b77576037546001600160a01b0316611b79565b825b3360008181526039602090815260409182902080546001600160a01b0319166001600160a01b039586161790558151428152915192938716927f3b54244fd9f24308e8af20c841d18d51e8bf31c6d418e821cbac2448146004569281900390910190a35b60003411611c32576040805162461bcd60e51b815260206004820152601760248201527f4e6f20457468657220776173206465706f73697465642e000000000000000000604482015290519081900360640190fd5b33600090815260386020526040902054611c5c90600160801b90046001600160801b0316346123a9565b3360008181526038602090815260409182902080546001600160801b03958616600160801b029516949094179093558051348152905191927fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c92918290030190a2610d9282826123f7565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d1357600080fd5b505afa158015611d27573d6000803e3d6000fd5b505050506040513d6020811015611d3d57600080fd5b50516001600160a01b03163314611d855760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611db16136fb565b50506001600160a01b0316600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b820416928201839052600160801b90046001600160801b031692019190915290565b603a546001600160801b031681565b6040805160208082528183019092526060918291906020820181803683370190505090506000805b6020811015611e99576008810260020a85026001600160f81b0319811615611e905780848481518110611e7257fe5b60200101906001600160f81b031916908160001a9053506001909201915b50600101611e43565b506060816001600160401b0381118015611eb257600080fd5b506040519080825280601f01601f191660200182016040528015611edd576020820181803683370190505b50905060005b82811015611f2d57838181518110611ef757fe5b602001015160f81c60f81b828281518110611f0e57fe5b60200101906001600160f81b031916908160001a905350600101611ee3565b50949350505050565b60008054604080516385acd64160e01b81526004810185905290516001600160a01b03909216916385acd64191602480820192602092909190829003018186803b158015611f8357600080fd5b505afa158015611f97573d6000803e3d6000fd5b505050506040513d6020811015611fad57600080fd5b505192915050565b6000611fbf6136fb565b50506001600160a01b0381166000908152603860209081526040808320815160608101835290546001600160401b038082168352600160401b82041693820193909352600160801b9092046001600160801b03169082018190529161202384611047565b9050600061203184836123e2565b905061203d858261333a565b6001600160801b0382166040808501919091526001600160401b0342168452805182815290516001600160a01b038716917f72fba0ba07d937c660a3130fca36005c0e476cb97b6f00de413976e37eba9501919081900360200190a250506001600160a01b03929092166000908152603860209081526040918290208451815492860151939095015167ffffffffffffffff199092166001600160401b039586161767ffffffffffffffff60401b1916600160401b9590931694909402919091176001600160801b03908116600160801b91909216021790915590565b6121226136fb565b506001600160a01b038216600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b82048116938301849052600160801b9091046001600160801b03169382019390935291831681141561218e575050611043565b603b54600160801b900460ff1680156121c057506001600160a01b0384166000908152603c602052604090205460ff16155b1561230957826001600160401b0316816001600160401b03161115612276576121ee622aa32160e91b611f36565b6001600160a01b031663f3fef3a3856122136001600160401b038581169088166123e2565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561225957600080fd5b505af115801561226d573d6000803e3d6000fd5b50505050612309565b612285622aa32160e91b611f36565b6001600160a01b031663adc9772e856122aa6001600160401b038781169086166123e2565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156122f057600080fd5b505af1158015612304573d6000803e3d6000fd5b505050505b6001600160a01b038416600081815260386020908152604091829020805467ffffffffffffffff60401b1916600160401b6001600160401b03891690810291909117909155825190815291517ffb97d390102d99a2a0210c7da4d6e15528ca897324a726106755393058ae27199281900390910190a250505050565b600080821161239357600080fd5b600082848161239e57fe5b049150505b92915050565b6000828201838110156123bb57600080fd5b9392505050565b428114156123d8576123d3826125d5565b611043565b611043828261299d565b6000828211156123f157600080fd5b50900390565b6123ff6136fb565b506001600160a01b038216600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b82041692820192909252600160801b9091046001600160801b03169181018290529082148015906124765750600081602001516001600160401b0316115b156124d5576124a08382604001516001600160801b031683602001516001600160401b0316613665565b6124d583610a9d42610a9785602001516001600160401b031686604001516001600160801b031661238590919063ffffffff16565b60408101516001600160801b03161580156124ef57508115155b15610d9257610d9283600061211a565b6000546001600160a01b031615612553576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b6001600160a01b038116611d85576040805162461bcd60e51b815260206004820152601d60248201527f6d61737465722063616e6e6f74206265207a65726f2061646472657373000000604482015290519081900360640190fd5b6000826125bd575060006123a3565b828202828482816125ca57fe5b04146123bb57600080fd5b6001600160a01b038116600090815260046020526040812060010154600160a01b90046001600160401b0316906126196203f4806126138482612385565b906125ae565b6001600160401b0381166000908152600160205260409020549091506001600160a01b03166126495750506119a5565b6001600160401b0381166000908152600160205260409020546001600160a01b03165b6001600160a01b0381166000908152600460205260409020600101546001600160401b03808516600160a01b9092041611610ab1576126a96136fb565b506001600160a01b038082166000908152600460209081526040918290208251606081018452815485168152600190910154938416918101919091526001600160401b03600160a01b909304831691810182905291851614801561271e5750846001600160a01b0316826001600160a01b0316145b1561297c576002546001600160a01b038381169116141561275b578051600280546001600160a01b0319166001600160a01b039092169190911790555b6003546001600160a01b0383811691161415612796576020810151600380546001600160a01b0319166001600160a01b039092169190911790555b6001600160401b0383166000908152600160205260409020546001600160a01b038381169116141561288e576127d86001600160401b0384166203f480612385565b81516001600160a01b031660009081526004602052604090206001015461281290600160a01b90046001600160401b03166203f480612385565b14156128545780516001600160401b038416600090815260016020526040902080546001600160a01b0319166001600160a01b03909216919091179055612889565b6001600160401b038316600090815260016020819052604090912080546001600160a01b031990811682559101805490911690555b6128fe565b6001600160401b038316600090815260016020819052604090912001546001600160a01b03838116911614156128fe576020818101516001600160401b03851660009081526001928390526040902090910180546001600160a01b0319166001600160a01b039092169190911790555b8051602080830180516001600160a01b0390811660009081526004909352604080842080549583166001600160a01b03199687161790559151945181168352818320600190810180549683169686169690961790955594909416815292909220805490921682550180546001600160e01b0319169055506119a59050565b506001600160a01b039081166000908152600460205260409020541661266c565b6001600160a01b0382166129e25760405162461bcd60e51b81526004018080602001828103825260268152602001806137a36026913960400191505060405180910390fd5b6001600160a01b038216600090815260046020526040902060010154600160a01b90046001600160401b031615612a1c57612a1c826125d5565b6000612a386203f4806126136001600160401b03851682612385565b6002549091506001600160a01b0316612b2757600280546001600160a01b038086166001600160a01b031992831681179093556003805483168417905560408051808201825284815260208082018681526001600160401b039788166000908152600180845285822094518554908816908916178555915193820180549487169488169490941790935583516060810185528381528083018481528a8a168287019081529885526004909352939092209251835490851690861617835551910180549451909516600160a01b0267ffffffffffffffff60a01b1991909216939092169290921716179055611043565b6002546001600160a01b03166000908152600460205260409020600101546001600160401b03808416600160a01b9092041610612c5057600280546001600160a01b03908116600090815260046020818152604080842060019081018054878c166001600160a01b0319918216811790925583516060810185528954891681528086018881526001600160401b03808e16838801908152858b52988852868a2092518354908c169085161783559051918501805498518216600160a01b0267ffffffffffffffff60a01b19938c169985169990991792909216979097179055885481168217909855938816855291829052909220805490941617835582015416612c49576001810180546001600160a01b0319166001600160a01b0386161790555b5050611043565b6003546001600160a01b03166000908152600460205260409020600101546001600160401b03808416600160a01b9092041611612d7657600380546001600160a01b0390811660009081526004602081815260408084208054868b166001600160a01b031991821681179092558251606081018452868152885488168186019081526001600160401b03808d16838701908152858a5297875285892092518354908b1690851617835590516001928301805498518316600160a01b0267ffffffffffffffff60a01b19928c1699861699909917919091169790971790965588548216831790985593881685529186905290922093840180549091169091179055815416612c495780546001600160a01b0319166001600160a01b03851617905550611043565b6001600160401b0381166000908152600160205260409020546001600160a01b031615612f59576001600160401b0381166000908152600160205260409020546001600160a01b03165b6001600160a01b0381166000908152600460205260409020600101546001600160401b03808516600160a01b909204161015612e16576001600160a01b0390811660009081526004602052604090205416612dc0565b604080516060810182526001600160a01b038084168083526000908152600460208181528583206001908101805486168388019081526001600160401b03808d16898b019081528e89168089528787528b89209a518b54908b166001600160a01b0319918216178c5593519a8601805492518416600160a01b0267ffffffffffffffff60a01b199c8c16938616939093179b909b1691909117909955825488168752898720805483168a1790558254909116881790915589168452808252868420805486168552929091529490912090930154161415612f0a5780546001600160a01b0319166001600160a01b0386161781555b60018101546001600160a01b0390811660009081526004602052604090205481169086161415612f52576001810180546001600160a01b0319166001600160a01b0387161790555b5050610d92565b6000612f716001600160401b0383166203f4806123e2565b90505b6001600160401b038116600090815260016020819052604090912001546001600160a01b0316612fbb57612fb46001600160401b0382166203f4806123e2565b9050612f74565b6001600160401b0390811660009081526001602081815260408084208301546001600160a01b039081168086526004808552838720805485516060810187529085168082528188019485528c8b168288019081528e8716808c52948952878b20925183549088166001600160a01b03199182161784559551928a01805491518d16600160a01b0267ffffffffffffffff60a01b199490981691871691909117929092169590951790558054831682179055918652828620850180548216831790559587168552918390529092208054841683178155018054909216179055505050565b6203f4806001600160401b038416066001600160401b03166000146130fb576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125108109550d2d15560921b604482015290519081900360640190fd5b6001600160a01b0380821660009081526004602052604080822054909216815220600101546001600160401b036203f48085018116600160a01b909204161080159061317957506001600160a01b0381166000908152600460205260409020600101546001600160401b036203f48085018116600160a01b90920416105b80156131b357506001600160a01b0381166000908152600460205260409020600101546001600160401b03808516600160a01b9092041610155b6131f7576040805162461bcd60e51b815260206004820152601060248201526f1d185a5b081a5cc81b9bdd081d185a5b60821b604482015290519081900360640190fd5b6001600160a01b038083166000908152600460205260408082206001908101549093168252902001546001600160401b03808516600160a01b9092041610801561327357506001600160a01b0382166000908152600460205260409020600101546001600160401b036203f48085018116600160a01b90920416105b80156132ad57506001600160a01b0382166000908152600460205260409020600101546001600160401b03808516600160a01b9092041610155b6132f1576040805162461bcd60e51b815260206004820152601060248201526f1a195859081a5cc81b9bdd081a19585960821b604482015290519081900360640190fd5b6001600160401b0392909216600090815260016020819052604090912090810180546001600160a01b03199081166001600160a01b039586161790915581541691909216179055565b6001600160a01b03828116600090815260396020526040812054909116613362576000613380565b603a546103e890600160801b90046001600160801b03908116840216045b603a54603b549192506103e86001600160801b03918216850282168190049282168502821604906000906133cd90838116906133c7908681169082908a8116908a166123e2565b906123e2565b90506001600160801b038416156134b1576001600160a01b03808716600090815260396020908152604080832054909316825260389052205461342490600160801b90046001600160801b039081169086166123a9565b6001600160a01b0380881660008181526039602081815260408084208054871685526038835281852080546001600160801b03998a16600160801b02908a161790559385905291815291548151958a16865242928601929092528051929491909316927fe9e95d6b3dc15e526a9ab8a4879c79c909fd2e3bcf54e63be438051baba8487692918290030190a35b6001600160801b0383161561352f576037546001600160a01b03166000908152603860205260409020546134f990600160801b90046001600160801b039081169085166123a9565b6037546001600160a01b0316600090815260386020526040902080546001600160801b03928316600160801b0292169190911790555b6001600160801b038216156135e057613593826001600160801b03166038600061356367474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002054600160801b90046001600160801b0316906123a9565b603860006135ab67474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b6001600160801b0381161561365d57613612816001600160801b03166038600061356365149155d0549160d21b611f36565b6038600061362865149155d0549160d21b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b505050505050565b600061367542610a978585612385565b905061368763282620a760e11b611f36565b6001600160a01b031663e2872fd685836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156136dd57600080fd5b505af11580156136f1573d6000803e3d6000fd5b5050505050505050565b60408051606081018252600080825260208201819052918101919091529056fe6e65772070657263656e742063616e6e6f7420626520626967676572207468616e2044454e4f4d494e41544f526f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e596f75206d757374207761697420616e20686f757220616674657220796f7572206c6173742075706461746520746f2077697468647261772e696e666f20696420616464726573732830292063616e6e6f7420626520737570706f72746564a26469706673582212206c80c0fe53f2b25936fd840944caa4ac8a12a493707317615caaadb96ab3aa2a64736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80638ea5220f116100f7578063d0ecab1511610095578063f340fa0111610064578063f340fa0114610805578063f4ff78bf1461082b578063f887f8621461085e578063fc3c28af14610891576101cd565b8063d0ecab1514610775578063d7693c07146107a8578063e4d06d82146107bd578063e55e8be9146107d2576101cd565b8063b4f54382116100d1578063b4f5438214610665578063bfdb8a4a14610698578063c6448410146106ad578063ce584bfa1461070f576101cd565b80638ea5220f146106265780638f7dcfa31461063b578063918f867414610650576101cd565b80634a3b68cc1161016f5780637115dc331161013e5780637115dc3314610448578063732986671461045d57806376ac760b1461049057806381beb60a1461050b576101cd565b80634a3b68cc1461038a57806359d5335b146103bd57806369d89575146103ee57806370a0823114610403576101cd565b80631c8b453f116101ab5780631c8b453f1461028e57806327e235e3146102bf5780632e1a7d4d14610325578063485cc9551461034f576101cd565b806313d8c840146101d2578063152b36e01461020357806319277b7d1461024a575b600080fd5b3480156101de57600080fd5b506101e76108a6565b604080516001600160a01b039092168252519081900360200190f35b34801561020f57600080fd5b506102366004803603602081101561022657600080fd5b50356001600160a01b03166108b5565b604080519115158252519081900360200190f35b34801561025657600080fd5b5061028c6004803603604081101561026d57600080fd5b5080356001600160a01b031690602001356001600160401b03166108ca565b005b34801561029a57600080fd5b506102a3610ab7565b604080516001600160401b039092168252519081900360200190f35b3480156102cb57600080fd5b506102f2600480360360208110156102e257600080fd5b50356001600160a01b0316610abe565b604080516001600160401b0394851681529290931660208301526001600160801b03168183015290519081900360600190f35b34801561033157600080fd5b5061028c6004803603602081101561034857600080fd5b5035610af7565b34801561035b57600080fd5b5061028c6004803603604081101561037257600080fd5b506001600160a01b0381358116916020013516610d97565b34801561039657600080fd5b506101e7600480360360208110156103ad57600080fd5b50356001600160a01b0316610dec565b3480156103c957600080fd5b506103d2610e07565b604080516001600160801b039092168252519081900360200190f35b3480156103fa57600080fd5b5061028c610e1d565b34801561040f57600080fd5b506104366004803603602081101561042657600080fd5b50356001600160a01b0316611047565b60408051918252519081900360200190f35b34801561045457600080fd5b506103d2611109565b34801561046957600080fd5b5061028c6004803603602081101561048057600080fd5b50356001600160801b0316611118565b34801561049c57600080fd5b5061028c600480360360208110156104b357600080fd5b810190602081018135600160201b8111156104cd57600080fd5b8201836020820111156104df57600080fd5b803590602001918460208302840111600160201b8311171561050057600080fd5b50909250905061123f565b34801561051757600080fd5b5061028c6004803603606081101561052e57600080fd5b810190602081018135600160201b81111561054857600080fd5b82018360208201111561055a57600080fd5b803590602001918460208302840111600160201b8311171561057b57600080fd5b919390929091602081019035600160201b81111561059857600080fd5b8201836020820111156105aa57600080fd5b803590602001918460208302840111600160201b831117156105cb57600080fd5b919390929091602081019035600160201b8111156105e857600080fd5b8201836020820111156105fa57600080fd5b803590602001918460208302840111600160201b8311171561061b57600080fd5b50909250905061143a565b34801561063257600080fd5b506101e7611570565b34801561064757600080fd5b506101e761157f565b34801561065c57600080fd5b506103d261158e565b34801561067157600080fd5b5061028c6004803603602081101561068857600080fd5b50356001600160801b0316611594565b3480156106a457600080fd5b506102366116be565b3480156106b957600080fd5b506106e0600480360360208110156106d057600080fd5b50356001600160401b03166116ce565b60405180836001600160a01b03168152602001826001600160a01b031681526020019250505060405180910390f35b34801561071b57600080fd5b506107426004803603602081101561073257600080fd5b50356001600160a01b03166116f4565b604080516001600160a01b0394851681529290931660208301526001600160401b03168183015290519081900360600190f35b34801561078157600080fd5b5061028c6004803603602081101561079857600080fd5b50356001600160a01b031661172c565b3480156107b457600080fd5b5061028c611813565b3480156107c957600080fd5b5061028c6118f2565b3480156107de57600080fd5b5061028c600480360360208110156107f557600080fd5b50356001600160801b03166119a9565b61028c6004803603602081101561081b57600080fd5b50356001600160a01b0316611ad3565b34801561083757600080fd5b5061028c6004803603602081101561084e57600080fd5b50356001600160a01b0316611cc7565b34801561086a57600080fd5b506104366004803603602081101561088157600080fd5b50356001600160a01b0316611da7565b34801561089d57600080fd5b506103d2611e0c565b6003546001600160a01b031681565b603c6020526000908152604090205460ff1681565b63282620a760e11b60606108dd82611e1b565b60405160200180806b037b7363c9036b7b23ab632960a51b815250600c0182805190602001908083835b602083106109265780518252601f199092019160209182019101610907565b6001836020036101000a038019825116818451168082178552505050505050905001807f2063616e2063616c6c20746869732066756e6374696f6e000000000000000000815250601701915050604051602081830303815290604052905061098d82611f36565b6001600160a01b0316336001600160a01b0316148190610a2b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156109f05781810151838201526020016109d8565b50505050905090810190601f168015610a1d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610a3584611fb5565b50610a40848461211a565b6001600160401b03831615610aa7576001600160a01b038416600090815260386020526040902054610aa2908590610a9d904290610a9790600160801b90046001600160801b03166001600160401b038916612385565b906123a9565b6123c2565b610ab1565b610ab184426123c2565b50505050565b6203f48081565b6038602052600090815260409020546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b33600090815260386020526040902054610b1c906001600160401b0316610e106123a9565b421015610b5a5760405162461bcd60e51b815260040180806020018281038252603981526020018061376a6039913960400191505060405180910390fd5b600080546040805163726836c160e11b815290516001600160a01b039092169263e4d06d829260048084019382900301818387803b158015610b9b57600080fd5b505af1158015610baf573d6000803e3d6000fd5b50505050336000610bbf82611fb5565b905060008311610c16576040805162461bcd60e51b815260206004820152601a60248201527f4d757374207769746864726177206d6f7265207468616e20302e000000000000604482015290519081900360640190fd5b610c1e6136fb565b5033600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b82041692820192909252600160801b9091046001600160801b031691810182905290841015610ca2576040810151610c8f906001600160801b0316856123e2565b6001600160801b03166040820152610cb9565b60408101805160009091526001600160801b031693505b33600081815260386020908152604080832085518154938701518784015167ffffffffffffffff199095166001600160401b039283161767ffffffffffffffff60401b1916600160401b9290911691909102176001600160801b03908116600160801b919094160292909217909155516108fc87150291879190818181858888f19350505050158015610d50573d6000803e3d6000fd5b5060408051858152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a250610d9282826123f7565b505050565b610da0826124ff565b603780546001600160a01b039092166001600160a01b031990921691909117905550601960801b603a55603b805470ffffffffffffffffffffffffffffffffff1916600160801b179055565b6039602052600090815260409020546001600160a01b031681565b603a54600160801b90046001600160801b031681565b600060386000610e3767474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002054600160801b90046001600160801b0316905067016345785d8a00008110610f3357610e8667474f565354414b4560c01b611f36565b6001600160a01b0316633c6b16ab82836040518363ffffffff1660e01b8152600401808281526020019150506000604051808303818588803b158015610ecb57600080fd5b505af1158015610edf573d6000803e3d6000fd5b5050505050600060386000610efe67474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b600060386000610f4b65149155d0549160d21b611f36565b6001600160a01b03168152602081019190915260400160002054600160801b90046001600160801b0316905067016345785d8a0000811061104357610f9865149155d0549160d21b611f36565b6001600160a01b0316633c6b16ab82836040518363ffffffff1660e01b8152600401808281526020019150506000604051808303818588803b158015610fdd57600080fd5b505af1158015610ff1573d6000803e3d6000fd5b505050505060006038600061100e65149155d0549160d21b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b5050565b60006110516136fb565b506001600160a01b0382166000908152603860209081526040808320815160608101835290546001600160401b03808216808452600160401b830490911694830194909452600160801b90046001600160801b03169181018290529290916110ba9042906123e2565b905060006110de84602001516001600160401b0316836125ae90919063ffffffff16565b90506000818411156110fb576110f484836123e2565b90506110ff565b5060005b9695505050505050565b603b546001600160801b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561116457600080fd5b505afa158015611178573d6000803e3d6000fd5b505050506040513d602081101561118e57600080fd5b50516001600160a01b031633146111d65760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6103e86001600160801b03821611156112205760405162461bcd60e51b815260040180806020018281038252602d81526020018061371c602d913960400191505060405180910390fd5b603a80546001600160801b03928316600160801b029216919091179055565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561128b57600080fd5b505afa15801561129f573d6000803e3d6000fd5b505050506040513d60208110156112b557600080fd5b50516001600160a01b031633146112fd5760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b60005b81811015610d92576004600084848481811061131857fe5b602090810292909201356001600160a01b031683525081019190915260400160002060010154600160a01b90046001600160401b0316611393576040805162461bcd60e51b81526020600482015260116024820152701b9bdd081a5b881b1a5b9ad9591b1a5cdd607a1b604482015290519081900360640190fd5b6113b78383838181106113a257fe5b905060200201356001600160a01b03166125d5565b6114328383838181106113c657fe5b905060200201356001600160a01b0316600460008686868181106113e657fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060010160149054906101000a90046001600160401b031661299d565b600101611300565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148657600080fd5b505afa15801561149a573d6000803e3d6000fd5b505050506040513d60208110156114b057600080fd5b50516001600160a01b031633146114f85760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b60005b858110156115675761155f87878381811061151257fe5b905060200201356001600160401b031686868481811061152e57fe5b905060200201356001600160a01b031685858581811061154a57fe5b905060200201356001600160a01b031661309e565b6001016114fb565b50505050505050565b6037546001600160a01b031681565b6002546001600160a01b031681565b6103e881565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e057600080fd5b505afa1580156115f4573d6000803e3d6000fd5b505050506040513d602081101561160a57600080fd5b50516001600160a01b031633146116525760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6103e86001600160801b038216111561169c5760405162461bcd60e51b815260040180806020018281038252602d81526020018061371c602d913960400191505060405180910390fd5b603b80546001600160801b0319166001600160801b0392909216919091179055565b603b54600160801b900460ff1681565b600160208190526000918252604090912080549101546001600160a01b03918216911682565b600460205260009081526040902080546001909101546001600160a01b0391821691811690600160a01b90046001600160401b031683565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561177857600080fd5b505afa15801561178c573d6000803e3d6000fd5b505050506040513d60208110156117a257600080fd5b50516001600160a01b031633146117ea5760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6001600160a01b03166000908152603c60205260409020805460ff19811660ff90911615179055565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561185f57600080fd5b505afa158015611873573d6000803e3d6000fd5b505050506040513d602081101561188957600080fd5b50516001600160a01b031633146118d15760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b603b805460ff60801b198116600160801b9182900460ff1615909102179055565b60005b60028110156119a5576002546001600160a01b0316600090815260046020526040902060010154600160a01b90046001600160401b03161580159061196857506002546001600160a01b031660009081526004602052604090206001015442600160a01b9091046001600160401b031611155b15611997576002546001600160a01b0316600061198482611fb5565b905061199082826123f7565b505061199d565b506119a7565b6001016118f5565b505b565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119f557600080fd5b505afa158015611a09573d6000803e3d6000fd5b505050506040513d6020811015611a1f57600080fd5b50516001600160a01b03163314611a675760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6103e86001600160801b0382161115611ab15760405162461bcd60e51b815260040180806020018281038252602d81526020018061371c602d913960400191505060405180910390fd5b603a80546001600160801b0319166001600160801b0392909216919091179055565b600080546040805163726836c160e11b815290516001600160a01b039092169263e4d06d829260048084019382900301818387803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050336000611b3882611fb5565b336000908152603960205260409020549091506001600160a01b0316611bdd576001600160a01b038316611b77576037546001600160a01b0316611b79565b825b3360008181526039602090815260409182902080546001600160a01b0319166001600160a01b039586161790558151428152915192938716927f3b54244fd9f24308e8af20c841d18d51e8bf31c6d418e821cbac2448146004569281900390910190a35b60003411611c32576040805162461bcd60e51b815260206004820152601760248201527f4e6f20457468657220776173206465706f73697465642e000000000000000000604482015290519081900360640190fd5b33600090815260386020526040902054611c5c90600160801b90046001600160801b0316346123a9565b3360008181526038602090815260409182902080546001600160801b03958616600160801b029516949094179093558051348152905191927fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c92918290030190a2610d9282826123f7565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d1357600080fd5b505afa158015611d27573d6000803e3d6000fd5b505050506040513d6020811015611d3d57600080fd5b50516001600160a01b03163314611d855760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611db16136fb565b50506001600160a01b0316600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b820416928201839052600160801b90046001600160801b031692019190915290565b603a546001600160801b031681565b6040805160208082528183019092526060918291906020820181803683370190505090506000805b6020811015611e99576008810260020a85026001600160f81b0319811615611e905780848481518110611e7257fe5b60200101906001600160f81b031916908160001a9053506001909201915b50600101611e43565b506060816001600160401b0381118015611eb257600080fd5b506040519080825280601f01601f191660200182016040528015611edd576020820181803683370190505b50905060005b82811015611f2d57838181518110611ef757fe5b602001015160f81c60f81b828281518110611f0e57fe5b60200101906001600160f81b031916908160001a905350600101611ee3565b50949350505050565b60008054604080516385acd64160e01b81526004810185905290516001600160a01b03909216916385acd64191602480820192602092909190829003018186803b158015611f8357600080fd5b505afa158015611f97573d6000803e3d6000fd5b505050506040513d6020811015611fad57600080fd5b505192915050565b6000611fbf6136fb565b50506001600160a01b0381166000908152603860209081526040808320815160608101835290546001600160401b038082168352600160401b82041693820193909352600160801b9092046001600160801b03169082018190529161202384611047565b9050600061203184836123e2565b905061203d858261333a565b6001600160801b0382166040808501919091526001600160401b0342168452805182815290516001600160a01b038716917f72fba0ba07d937c660a3130fca36005c0e476cb97b6f00de413976e37eba9501919081900360200190a250506001600160a01b03929092166000908152603860209081526040918290208451815492860151939095015167ffffffffffffffff199092166001600160401b039586161767ffffffffffffffff60401b1916600160401b9590931694909402919091176001600160801b03908116600160801b91909216021790915590565b6121226136fb565b506001600160a01b038216600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b82048116938301849052600160801b9091046001600160801b03169382019390935291831681141561218e575050611043565b603b54600160801b900460ff1680156121c057506001600160a01b0384166000908152603c602052604090205460ff16155b1561230957826001600160401b0316816001600160401b03161115612276576121ee622aa32160e91b611f36565b6001600160a01b031663f3fef3a3856122136001600160401b038581169088166123e2565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561225957600080fd5b505af115801561226d573d6000803e3d6000fd5b50505050612309565b612285622aa32160e91b611f36565b6001600160a01b031663adc9772e856122aa6001600160401b038781169086166123e2565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156122f057600080fd5b505af1158015612304573d6000803e3d6000fd5b505050505b6001600160a01b038416600081815260386020908152604091829020805467ffffffffffffffff60401b1916600160401b6001600160401b03891690810291909117909155825190815291517ffb97d390102d99a2a0210c7da4d6e15528ca897324a726106755393058ae27199281900390910190a250505050565b600080821161239357600080fd5b600082848161239e57fe5b049150505b92915050565b6000828201838110156123bb57600080fd5b9392505050565b428114156123d8576123d3826125d5565b611043565b611043828261299d565b6000828211156123f157600080fd5b50900390565b6123ff6136fb565b506001600160a01b038216600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b82041692820192909252600160801b9091046001600160801b03169181018290529082148015906124765750600081602001516001600160401b0316115b156124d5576124a08382604001516001600160801b031683602001516001600160401b0316613665565b6124d583610a9d42610a9785602001516001600160401b031686604001516001600160801b031661238590919063ffffffff16565b60408101516001600160801b03161580156124ef57508115155b15610d9257610d9283600061211a565b6000546001600160a01b031615612553576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b6001600160a01b038116611d85576040805162461bcd60e51b815260206004820152601d60248201527f6d61737465722063616e6e6f74206265207a65726f2061646472657373000000604482015290519081900360640190fd5b6000826125bd575060006123a3565b828202828482816125ca57fe5b04146123bb57600080fd5b6001600160a01b038116600090815260046020526040812060010154600160a01b90046001600160401b0316906126196203f4806126138482612385565b906125ae565b6001600160401b0381166000908152600160205260409020549091506001600160a01b03166126495750506119a5565b6001600160401b0381166000908152600160205260409020546001600160a01b03165b6001600160a01b0381166000908152600460205260409020600101546001600160401b03808516600160a01b9092041611610ab1576126a96136fb565b506001600160a01b038082166000908152600460209081526040918290208251606081018452815485168152600190910154938416918101919091526001600160401b03600160a01b909304831691810182905291851614801561271e5750846001600160a01b0316826001600160a01b0316145b1561297c576002546001600160a01b038381169116141561275b578051600280546001600160a01b0319166001600160a01b039092169190911790555b6003546001600160a01b0383811691161415612796576020810151600380546001600160a01b0319166001600160a01b039092169190911790555b6001600160401b0383166000908152600160205260409020546001600160a01b038381169116141561288e576127d86001600160401b0384166203f480612385565b81516001600160a01b031660009081526004602052604090206001015461281290600160a01b90046001600160401b03166203f480612385565b14156128545780516001600160401b038416600090815260016020526040902080546001600160a01b0319166001600160a01b03909216919091179055612889565b6001600160401b038316600090815260016020819052604090912080546001600160a01b031990811682559101805490911690555b6128fe565b6001600160401b038316600090815260016020819052604090912001546001600160a01b03838116911614156128fe576020818101516001600160401b03851660009081526001928390526040902090910180546001600160a01b0319166001600160a01b039092169190911790555b8051602080830180516001600160a01b0390811660009081526004909352604080842080549583166001600160a01b03199687161790559151945181168352818320600190810180549683169686169690961790955594909416815292909220805490921682550180546001600160e01b0319169055506119a59050565b506001600160a01b039081166000908152600460205260409020541661266c565b6001600160a01b0382166129e25760405162461bcd60e51b81526004018080602001828103825260268152602001806137a36026913960400191505060405180910390fd5b6001600160a01b038216600090815260046020526040902060010154600160a01b90046001600160401b031615612a1c57612a1c826125d5565b6000612a386203f4806126136001600160401b03851682612385565b6002549091506001600160a01b0316612b2757600280546001600160a01b038086166001600160a01b031992831681179093556003805483168417905560408051808201825284815260208082018681526001600160401b039788166000908152600180845285822094518554908816908916178555915193820180549487169488169490941790935583516060810185528381528083018481528a8a168287019081529885526004909352939092209251835490851690861617835551910180549451909516600160a01b0267ffffffffffffffff60a01b1991909216939092169290921716179055611043565b6002546001600160a01b03166000908152600460205260409020600101546001600160401b03808416600160a01b9092041610612c5057600280546001600160a01b03908116600090815260046020818152604080842060019081018054878c166001600160a01b0319918216811790925583516060810185528954891681528086018881526001600160401b03808e16838801908152858b52988852868a2092518354908c169085161783559051918501805498518216600160a01b0267ffffffffffffffff60a01b19938c169985169990991792909216979097179055885481168217909855938816855291829052909220805490941617835582015416612c49576001810180546001600160a01b0319166001600160a01b0386161790555b5050611043565b6003546001600160a01b03166000908152600460205260409020600101546001600160401b03808416600160a01b9092041611612d7657600380546001600160a01b0390811660009081526004602081815260408084208054868b166001600160a01b031991821681179092558251606081018452868152885488168186019081526001600160401b03808d16838701908152858a5297875285892092518354908b1690851617835590516001928301805498518316600160a01b0267ffffffffffffffff60a01b19928c1699861699909917919091169790971790965588548216831790985593881685529186905290922093840180549091169091179055815416612c495780546001600160a01b0319166001600160a01b03851617905550611043565b6001600160401b0381166000908152600160205260409020546001600160a01b031615612f59576001600160401b0381166000908152600160205260409020546001600160a01b03165b6001600160a01b0381166000908152600460205260409020600101546001600160401b03808516600160a01b909204161015612e16576001600160a01b0390811660009081526004602052604090205416612dc0565b604080516060810182526001600160a01b038084168083526000908152600460208181528583206001908101805486168388019081526001600160401b03808d16898b019081528e89168089528787528b89209a518b54908b166001600160a01b0319918216178c5593519a8601805492518416600160a01b0267ffffffffffffffff60a01b199c8c16938616939093179b909b1691909117909955825488168752898720805483168a1790558254909116881790915589168452808252868420805486168552929091529490912090930154161415612f0a5780546001600160a01b0319166001600160a01b0386161781555b60018101546001600160a01b0390811660009081526004602052604090205481169086161415612f52576001810180546001600160a01b0319166001600160a01b0387161790555b5050610d92565b6000612f716001600160401b0383166203f4806123e2565b90505b6001600160401b038116600090815260016020819052604090912001546001600160a01b0316612fbb57612fb46001600160401b0382166203f4806123e2565b9050612f74565b6001600160401b0390811660009081526001602081815260408084208301546001600160a01b039081168086526004808552838720805485516060810187529085168082528188019485528c8b168288019081528e8716808c52948952878b20925183549088166001600160a01b03199182161784559551928a01805491518d16600160a01b0267ffffffffffffffff60a01b199490981691871691909117929092169590951790558054831682179055918652828620850180548216831790559587168552918390529092208054841683178155018054909216179055505050565b6203f4806001600160401b038416066001600160401b03166000146130fb576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125108109550d2d15560921b604482015290519081900360640190fd5b6001600160a01b0380821660009081526004602052604080822054909216815220600101546001600160401b036203f48085018116600160a01b909204161080159061317957506001600160a01b0381166000908152600460205260409020600101546001600160401b036203f48085018116600160a01b90920416105b80156131b357506001600160a01b0381166000908152600460205260409020600101546001600160401b03808516600160a01b9092041610155b6131f7576040805162461bcd60e51b815260206004820152601060248201526f1d185a5b081a5cc81b9bdd081d185a5b60821b604482015290519081900360640190fd5b6001600160a01b038083166000908152600460205260408082206001908101549093168252902001546001600160401b03808516600160a01b9092041610801561327357506001600160a01b0382166000908152600460205260409020600101546001600160401b036203f48085018116600160a01b90920416105b80156132ad57506001600160a01b0382166000908152600460205260409020600101546001600160401b03808516600160a01b9092041610155b6132f1576040805162461bcd60e51b815260206004820152601060248201526f1a195859081a5cc81b9bdd081a19585960821b604482015290519081900360640190fd5b6001600160401b0392909216600090815260016020819052604090912090810180546001600160a01b03199081166001600160a01b039586161790915581541691909216179055565b6001600160a01b03828116600090815260396020526040812054909116613362576000613380565b603a546103e890600160801b90046001600160801b03908116840216045b603a54603b549192506103e86001600160801b03918216850282168190049282168502821604906000906133cd90838116906133c7908681169082908a8116908a166123e2565b906123e2565b90506001600160801b038416156134b1576001600160a01b03808716600090815260396020908152604080832054909316825260389052205461342490600160801b90046001600160801b039081169086166123a9565b6001600160a01b0380881660008181526039602081815260408084208054871685526038835281852080546001600160801b03998a16600160801b02908a161790559385905291815291548151958a16865242928601929092528051929491909316927fe9e95d6b3dc15e526a9ab8a4879c79c909fd2e3bcf54e63be438051baba8487692918290030190a35b6001600160801b0383161561352f576037546001600160a01b03166000908152603860205260409020546134f990600160801b90046001600160801b039081169085166123a9565b6037546001600160a01b0316600090815260386020526040902080546001600160801b03928316600160801b0292169190911790555b6001600160801b038216156135e057613593826001600160801b03166038600061356367474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002054600160801b90046001600160801b0316906123a9565b603860006135ab67474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b6001600160801b0381161561365d57613612816001600160801b03166038600061356365149155d0549160d21b611f36565b6038600061362865149155d0549160d21b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b505050505050565b600061367542610a978585612385565b905061368763282620a760e11b611f36565b6001600160a01b031663e2872fd685836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156136dd57600080fd5b505af11580156136f1573d6000803e3d6000fd5b5050505050505050565b60408051606081018252600080825260208201819052918101919091529056fe6e65772070657263656e742063616e6e6f7420626520626967676572207468616e2044454e4f4d494e41544f526f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e596f75206d757374207761697420616e20686f757220616674657220796f7572206c6173742075706461746520746f2077697468647261772e696e666f20696420616464726573732830292063616e6e6f7420626520737570706f72746564a26469706673582212206c80c0fe53f2b25936fd840944caa4ac8a12a493707317615caaadb96ab3aa2a64736f6c634300060c0033
Deployed Bytecode Sourcemap
20274:14898:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7486:19;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;7486:19:0;;;;;;;;;;;;;;21466:42;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21466:42:0;-1:-1:-1;;;;;21466:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;;27087:366;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27087:366:0;;-1:-1:-1;;;;;27087:366:0;;;;;-1:-1:-1;;;;;27087:366:0;;:::i;:::-;;7106:43;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;7106:43:0;;;;;;;;;;;;;;20792:44;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20792:44:0;-1:-1:-1;;;;;20792:44:0;;:::i;:::-;;;;-1:-1:-1;;;;;20792:44:0;;;;;;;;;;;;;-1:-1:-1;;;;;20792:44:0;;;;;;;;;;;;;;;24072:751;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24072:751:0;;:::i;22891:311::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22891:311:0;;;;;;;;;;:::i;20870:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20870:45:0;-1:-1:-1;;;;;20870:45:0;;:::i;21089:25::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;21089:25:0;;;;;;;;;;;;;;25772:824;;;;;;;;;;;;;:::i;24966:660::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24966:660:0;-1:-1:-1;;;;;24966:660:0;;:::i;:::-;;;;;;;;;;;;;;;;21177:25;;;;;;;;;;;;;:::i;32341:223::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32341:223:0;-1:-1:-1;;;;;32341:223:0;;:::i;33821:337::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33821:337:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33821:337:0;;;;;;;;;;-1:-1:-1;33821:337:0;;-1:-1:-1;33821:337:0;-1:-1:-1;33821:337:0;:::i;34910:259::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34910:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34910:259:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34910:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34910:259:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34910:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34910:259:0;;;;;;;;;;-1:-1:-1;34910:259:0;;-1:-1:-1;34910:259:0;-1:-1:-1;34910:259:0;:::i;20500:24::-;;;;;;;;;;;;;:::i;7429:19::-;;;;;;;;;;;;;:::i;21277:42::-;;;;;;;;;;;;;:::i;32752:223::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32752:223:0;-1:-1:-1;;;;;32752:223:0;;:::i;21381:16::-;;;;;;;;;;;;;:::i;7268:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7268:44:0;-1:-1:-1;;;;;7268:44:0;;:::i;:::-;;;;;-1:-1:-1;;;;;7268:44:0;;;;;;-1:-1:-1;;;;;7268:44:0;;;;;;;;;;;;;;;;7552:47;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7552:47:0;-1:-1:-1;;;;;7552:47:0;;:::i;:::-;;;;-1:-1:-1;;;;;7552:47:0;;;;;;;;;;;;;-1:-1:-1;;;;;7552:47:0;;;;;;;;;;;;;;;33648:136;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33648:136:0;-1:-1:-1;;;;;33648:136:0;;:::i;33480:89::-;;;;;;;;;;;;;:::i;22366:433::-;;;;;;;;;;;;;:::i;33158:223::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33158:223:0;-1:-1:-1;;;;;33158:223:0;;:::i;23355:581::-;;;;;;;;;;;;;;;;-1:-1:-1;23355:581:0;-1:-1:-1;;;;;23355:581:0;;:::i;4543:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4543:114:0;-1:-1:-1;;;;;4543:114:0;;:::i;26604:209::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26604:209:0;-1:-1:-1;;;;;26604:209:0;;:::i;21002:25::-;;;;;;;;;;;;;:::i;7486:19::-;;;-1:-1:-1;;;;;7486:19:0;;:::o;21466:42::-;;;;;;;;;;;;;;;:::o;27087:366::-;-1:-1:-1;;;3666:21:0;3730:18;:7;:16;:18::i;:::-;3697:78;;;;;;-1:-1:-1;;;3697:78:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3697:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3666:110;;3809:18;3819:7;3809:9;:18::i;:::-;-1:-1:-1;;;;;3795:32:0;:10;-1:-1:-1;;;;;3795:32:0;;3829:7;3787:50;;;;;-1:-1:-1;;;3787:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27215:21:::1;27230:5;27215:14;:21::i;:::-;;27247:30;27260:5;27267:9;27247:12;:30::i;:::-;-1:-1:-1::0;;;;;27292:13:0;::::1;::::0;27288:157:::1;;-1:-1:-1::0;;;;;27328:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:27;27307:85:::1;::::0;27328:15;;:63:::1;::::0;27375:15:::1;::::0;27328:42:::1;::::0;-1:-1:-1;;;27328:27:0;::::1;-1:-1:-1::0;;;;;27328:27:0::1;-1:-1:-1::0;;;;;27328:42:0;::::1;:31;:42::i;:::-;:46:::0;::::1;:63::i;:::-;27307:13;:85::i;:::-;27288:157;;;27408:37;27422:5;27429:15;27408:13;:37::i;:::-;27087:366:::0;;;;:::o;7106:43::-;7143:6;7106:43;:::o;20792:44::-;;;;;;;;;;;;-1:-1:-1;;;;;20792:44:0;;;;-1:-1:-1;;;20792:44:0;;;;;;-1:-1:-1;;;20792:44:0;;-1:-1:-1;;;;;20792:44:0;;:::o;24072:751::-;21644:10;21635:20;;;;:8;:20;;;;;:29;:42;;-1:-1:-1;;;;;21635:29:0;21669:7;21635:33;:42::i;:::-;21616:15;:61;;21608:131;;;;-1:-1:-1;;;21608:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3576:7:::1;::::0;;:14:::1;::::0;;-1:-1:-1;;;3576:14:0;;;;-1:-1:-1;;;;;3576:7:0;;::::1;::::0;:12:::1;::::0;:14:::1;::::0;;::::1;::::0;;;;;;:7;;:14;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24185:10:::2;21966:15;21984:21;21999:5;21984:14;:21::i;:::-;21966:39;;24231:1:::3;24221:7;:11;24213:50;;;::::0;;-1:-1:-1;;;24213:50:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;24274:22;;:::i;:::-;-1:-1:-1::0;24308:10:0::3;24299:20;::::0;;;:8:::3;:20;::::0;;;;;;;;24274:45;;::::3;::::0;::::3;::::0;;;;-1:-1:-1;;;;;24274:45:0;;::::3;::::0;;-1:-1:-1;;;24274:45:0;::::3;;::::0;;::::3;::::0;;;;-1:-1:-1;;;24274:45:0;;::::3;-1:-1:-1::0;;;;;24274:45:0::3;::::0;;;;;;;-1:-1:-1;;24454:227:0::3;;;24535:19;::::0;::::3;::::0;:32:::3;::::0;-1:-1:-1;;;;;24535:23:0::3;24559:7:::0;24535:23:::3;:32::i;:::-;-1:-1:-1::0;;;;;24504:65:0::3;:19;::::0;::::3;:65:::0;24454:227:::3;;;24612:19;::::0;::::3;::::0;;24668:1:::3;24646:23:::0;;;-1:-1:-1;;;;;24602:29:0::3;::::0;-1:-1:-1;24454:227:0::3;24710:10;24701:20;::::0;;;:8:::3;:20;::::0;;;;;;;:30;;;;;;::::3;::::0;;;::::3;::::0;-1:-1:-1;;24701:30:0;;::::3;-1:-1:-1::0;;;;;24701:30:0;;::::3;;-1:-1:-1::0;;;;24701:30:0::3;-1:-1:-1::0;;;24701:30:0;;;::::3;::::0;;;::::3;;-1:-1:-1::0;;;;;24701:30:0;;::::3;-1:-1:-1::0;;;24701:30:0;;;::::3;;::::0;;;::::3;::::0;;;24742:28;::::3;::::0;::::3;;::::0;;;;;24701:20;24742:28;;24710:10;24742:28;::::3;;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;24786:29:0::3;::::0;;;;;;;24795:10:::3;::::0;24786:29:::3;::::0;;;;;::::3;::::0;;::::3;22016:1;22028:37:::2;22050:5;22057:7;22028:21;:37::i;:::-;3601:1;;24072:751:::0;:::o;22891:311::-;23001:30;23018:12;23001:16;:30::i;:::-;23042:9;:22;;-1:-1:-1;;;;;23042:22:0;;;-1:-1:-1;;;;;;23042:22:0;;;;;;;;;-1:-1:-1;;;;23075:10:0;23111:15;23148:10;:14;;-1:-1:-1;;23183:11:0;-1:-1:-1;;;23183:11:0;;;22891:311::o;20870:45::-;;;;;;;;;;;;-1:-1:-1;;;;;20870:45:0;;:::o;21089:25::-;;;-1:-1:-1;;;21089:25:0;;-1:-1:-1;;;;;21089:25:0;;:::o;25772:824::-;25825:18;25846:8;:31;25855:21;-1:-1:-1;;;25855:9:0;:21::i;:::-;-1:-1:-1;;;;;25846:31:0;;;;;;;;;;;;-1:-1:-1;25846:31:0;:43;-1:-1:-1;;;25846:43:0;;-1:-1:-1;;;;;25846:43:0;;-1:-1:-1;26008:12:0;25994:26;;25990:205;;26051:21;-1:-1:-1;;;26051:9:0;:21::i;:::-;-1:-1:-1;;;;;26036:56:0;;26100:10;26112;26036:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26183:1;26137:8;:31;26146:21;-1:-1:-1;;;26146:9:0;:21::i;:::-;-1:-1:-1;;;;;26137:31:0;;;;;;;;;;;;-1:-1:-1;26137:31:0;:47;;-1:-1:-1;;;;;26137:47:0;;;-1:-1:-1;;;26137:47:0;;;;;;;;;25990:205;26213:21;26237:8;:29;26246:19;-1:-1:-1;;;26246:9:0;:19::i;:::-;-1:-1:-1;;;;;26237:29:0;;;;;;;;;;;;-1:-1:-1;26237:29:0;:41;-1:-1:-1;;;26237:41:0;;-1:-1:-1;;;;;26237:41:0;;-1:-1:-1;26400:12:0;26383:29;;26379:210;;26443:19;-1:-1:-1;;;26443:9:0;:19::i;:::-;-1:-1:-1;;;;;26428:54:0;;26490:13;26505;26428:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26577:1;26533:8;:29;26542:19;-1:-1:-1;;;26542:9:0;:19::i;:::-;-1:-1:-1;;;;;26533:29:0;;;;;;;;;;;;-1:-1:-1;26533:29:0;:45;;-1:-1:-1;;;;;26533:45:0;;;-1:-1:-1;;;26533:45:0;;;;;;;;;26379:210;25772:824;;:::o;24966:660::-;25056:7;25081:22;;:::i;:::-;-1:-1:-1;;;;;;25106:15:0;;;;;;:8;:15;;;;;;;;25081:40;;;;;;;;;-1:-1:-1;;;;;25081:40:0;;;;;;-1:-1:-1;;;25081:40:0;;;;;;;;;;;;-1:-1:-1;;;25081:40:0;;-1:-1:-1;;;;;25081:40:0;;;;;;;;;;25287:37;;:15;;:19;:37::i;:::-;25265:59;;25335:12;25350:39;25366:7;:22;;;-1:-1:-1;;;;;25350:39:0;:11;:15;;:39;;;;:::i;:::-;25335:54;;25471:18;25518:4;25504:11;:18;25500:88;;;25537:21;:11;25553:4;25537:15;:21::i;:::-;25524:34;;25500:88;;;-1:-1:-1;25587:1:0;25500:88;25608:10;24966:660;-1:-1:-1;;;;;;24966:660:0:o;21177:25::-;;;-1:-1:-1;;;;;21177:25:0;;:::o;32341:223::-;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21315:4:::1;-1:-1:-1::0;;;;;32445:26:0;::::1;;;32437:84;;;;-1:-1:-1::0;;;32437:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32532:10;:24:::0;;-1:-1:-1;;;;;32532:24:0;;::::1;-1:-1:-1::0;;;32532:24:0::1;::::0;::::1;::::0;;;::::1;::::0;;32341:223::o;33821:337::-;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33902:9:::1;33898:253;33917:14:::0;;::::1;33898:253;;;33961:5;:15;33967:5;;33973:1;33967:8;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;33967:8:0::1;33961:15:::0;;-1:-1:-1;33961:15:0;::::1;::::0;;;;;;-1:-1:-1;33961:15:0;:25:::1;;::::0;-1:-1:-1;;;33961:25:0;::::1;-1:-1:-1::0;;;;;33961:25:0::1;33953:60;;;::::0;;-1:-1:-1;;;33953:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33953:60:0;;;;;;;;;;;;;::::1;;34028:34;34053:5;;34059:1;34053:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;34053:8:0::1;34028:24;:34::i;:::-;34077:62;34103:5;;34109:1;34103:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;34103:8:0::1;34113:5;:15;34119:5;;34125:1;34119:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;34119:8:0::1;-1:-1:-1::0;;;;;34113:15:0::1;-1:-1:-1::0;;;;;34113:15:0::1;;;;;;;;;;;;:25;;;;;;;;;;-1:-1:-1::0;;;;;34113:25:0::1;34077;:62::i;:::-;33933:3;;33898:253;;34910:259:::0;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35047:9:::1;35043:119;35063:19:::0;;::::1;35043:119;;;35103:47;35116:8;;35125:1;35116:11;;;;;;;;;;;;;-1:-1:-1::0;;;;;35116:11:0::1;35129:6;;35136:1;35129:9;;;;;;;;;;;;;-1:-1:-1::0;;;;;35129:9:0::1;35140:6;;35147:1;35140:9;;;;;;;;;;;;;-1:-1:-1::0;;;;;35140:9:0::1;35103:12;:47::i;:::-;35084:3;;35043:119;;;;34910:259:::0;;;;;;:::o;20500:24::-;;;-1:-1:-1;;;;;20500:24:0;;:::o;7429:19::-;;;-1:-1:-1;;;;;7429:19:0;;:::o;21277:42::-;21315:4;21277:42;:::o;32752:223::-;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21315:4:::1;-1:-1:-1::0;;;;;32856:26:0;::::1;;;32848:84;;;;-1:-1:-1::0;;;32848:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32943:10;:24:::0;;-1:-1:-1;;;;;;32943:24:0::1;-1:-1:-1::0;;;;;32943:24:0;;;::::1;::::0;;;::::1;::::0;;32752:223::o;21381:16::-;;;-1:-1:-1;;;21381:16:0;;;;;:::o;7268:44::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7268:44:0;;;;;;:::o;7552:47::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7552:47:0;;;;;;;-1:-1:-1;;;7552:47:0;;-1:-1:-1;;;;;7552:47:0;;:::o;33648:136::-;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33758:18:0::1;;::::0;;;:9:::1;:18;::::0;;;;;;-1:-1:-1;;33736:40:0;::::1;33758:18;::::0;;::::1;33757:19;33736:40;::::0;;33648:136::o;33480:89::-;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33557:4:::1;::::0;;-1:-1:-1;;;;33549:12:0;::::1;-1:-1:-1::0;;;33557:4:0;;;::::1;;;33556:5;33549:12:::0;;::::1;;::::0;;33480:89::o;22366:433::-;22456:9;22451:341;22475:1;22471;:5;22451:341;;;22518:4;;-1:-1:-1;;;;;22518:4:0;22512:11;;;;:5;:11;;;;;22518:4;22512:21;;-1:-1:-1;;;22512:21:0;;-1:-1:-1;;;;;22512:21:0;:26;;;;:58;;-1:-1:-1;22548:4:0;;-1:-1:-1;;;;;22548:4:0;22542:11;;;;:5;:11;;;;;22548:4;22542:21;;22567:3;-1:-1:-1;;;22542:21:0;;;-1:-1:-1;;;;;22542:21:0;:28;;22512:58;22508:259;;;22617:4;;-1:-1:-1;;;;;22617:4:0;22591:15;22658:23;22617:4;22658:14;:23::i;:::-;22641:40;;22700:38;22722:7;22731:6;22700:21;:38::i;:::-;22508:259;;;;;22760:7;;;22508:259;22478:3;;22451:341;;;;22366:433;:::o;33158:223::-;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21315:4:::1;-1:-1:-1::0;;;;;33262:26:0;::::1;;;33254:84;;;;-1:-1:-1::0;;;33254:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33349:10;:24:::0;;-1:-1:-1;;;;;;33349:24:0::1;-1:-1:-1::0;;;;;33349:24:0;;;::::1;::::0;;;::::1;::::0;;33158:223::o;23355:581::-;3576:7;;;:14;;;-1:-1:-1;;;3576:14:0;;;;-1:-1:-1;;;;;3576:7:0;;;;:12;;:14;;;;;;;;;;:7;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23467:10:::1;21966:15;21984:21;21999:5;21984:14;:21::i;:::-;23510:10:::2;23533:1;23500:21:::0;;;:9:::2;:21;::::0;;;;;21966:39;;-1:-1:-1;;;;;;23500:21:0::2;23495:214;;-1:-1:-1::0;;;;;23577:23:0;::::2;:47;;23615:9;::::0;-1:-1:-1;;;;;23615:9:0::2;23577:47;;;23603:9;23577:47;23563:10;23553:21;::::0;;;:9:::2;:21;::::0;;;;;;;;:71;;-1:-1:-1;;;;;;23553:71:0::2;-1:-1:-1::0;;;;;23553:71:0;;::::2;;::::0;;23644:53;;23681:15:::2;23644:53:::0;;;;23563:10;;23644:53;::::2;::::0;::::2;::::0;;;;;;;;::::2;23495:214;23749:1;23737:9;:13;23729:49;;;::::0;;-1:-1:-1;;;23729:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;23843:10;23834:20;::::0;;;:8:::2;:20;::::0;;;;:32;:47:::2;::::0;-1:-1:-1;;;23834:32:0;::::2;-1:-1:-1::0;;;;;23834:32:0::2;23871:9;23834:36;:47::i;:::-;23800:10;23791:20;::::0;;;:8:::2;:20;::::0;;;;;;;;:91;;-1:-1:-1;;;;;23791:91:0;;::::2;-1:-1:-1::0;;;23791:91:0::2;::::0;::::2;::::0;;;::::2;::::0;;;23898:30;;23918:9:::2;23898:30:::0;;;;23800:10;;23898:30:::2;::::0;;;;;;;::::2;22028:37:::1;22050:5;22057:7;22028:21;:37::i;4543:114::-:0;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4615:7:::1;:34:::0;;-1:-1:-1;;;;;;4615:34:0::1;-1:-1:-1::0;;;;;4615:34:0;;;::::1;::::0;;;::::1;::::0;;4543:114::o;26604:209::-;26700:7;26725:22;;:::i;:::-;-1:-1:-1;;;;;;;26750:15:0;;;;;:8;:15;;;;;;;;;26725:40;;;;;;;;;-1:-1:-1;;;;;26725:40:0;;;;;-1:-1:-1;;;26725:40:0;;;;;;;;;-1:-1:-1;;;26725:40:0;;-1:-1:-1;;;;;26725:40:0;;;;;;;;26604:209::o;21002:25::-;;;-1:-1:-1;;;;;21002:25:0;;:::o;2534:621::-;2639:13;;;2649:2;2639:13;;;;;;;;;2586;;;;2639;;;;;;;;;;;-1:-1:-1;2639:13:0;2612:40;;2663:14;2697:9;2692:232;2716:2;2712:1;:6;2692:232;;;2781:1;:5;;2775:1;:12;2765:22;;-1:-1:-1;;;;;;2808:9:0;;;2804:109;;2863:4;2838:11;2850:9;2838:22;;;;;;;;;;;:29;-1:-1:-1;;;;;2838:29:0;;;;;;;;-1:-1:-1;2886:11:0;;;;;2804:109;-1:-1:-1;2720:3:0;;2692:232;;;;2934:31;2978:9;-1:-1:-1;;;;;2968:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2968:20:0;;2934:54;;3004:9;2999:105;3023:9;3019:1;:13;2999:105;;;3078:11;3090:1;3078:14;;;;;;;;;;;;;;;;3054:18;3073:1;3054:21;;;;;;;;;;;:38;-1:-1:-1;;;;;3054:38:0;;;;;;;;-1:-1:-1;3034:3:0;;2999:105;;;-1:-1:-1;3128:18:0;2534:621;-1:-1:-1;;;;2534:621:0:o;4665:113::-;4720:7;4747;;:23;;;-1:-1:-1;;;4747:23:0;;;;;;;;;;-1:-1:-1;;;;;4747:7:0;;;;:17;;:23;;;;;;;;;;;;;;;:7;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4747:23:0;;4665:113;-1:-1:-1;;4665:113:0:o;27598:641::-;27669:18;27705:22;;:::i;:::-;-1:-1:-1;;;;;;;27730:15:0;;;;;;:8;:15;;;;;;;;27705:40;;;;;;;;;-1:-1:-1;;;;;27705:40:0;;;;;-1:-1:-1;;;27705:40:0;;;;;;;;;;-1:-1:-1;;;27705:40:0;;;-1:-1:-1;;;;;27705:40:0;;;;;;;;27822:16;27730:15;27822:9;:16::i;:::-;27801:37;-1:-1:-1;27917:12:0;27932:26;:10;27801:37;27932:14;:26::i;:::-;27917:41;;27975:34;27988:5;28003:4;27975:12;:34::i;:::-;-1:-1:-1;;;;;28058:41:0;;:19;;;;:41;;;;-1:-1:-1;;;;;28136:15:0;28110:42;;;28168:17;;;;;;;-1:-1:-1;;;;;28168:17:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;28206:15:0;;;;;;;;:8;:15;;;;;;;;;:25;;;;;;;;;;;;;-1:-1:-1;;28206:25:0;;;-1:-1:-1;;;;;28206:25:0;;;;-1:-1:-1;;;;28206:25:0;-1:-1:-1;;;28206:25:0;;;;;;;;;;;;-1:-1:-1;;;;;28206:25:0;;;-1:-1:-1;;;28206:25:0;;;;;;;;;;27598:641::o;29142:833::-;29231:22;;:::i;:::-;-1:-1:-1;;;;;;29256:15:0;;;;;;:8;:15;;;;;;;;;29231:40;;;;;;;;;-1:-1:-1;;;;;29231:40:0;;;;;-1:-1:-1;;;29231:40:0;;;;;;;;;;-1:-1:-1;;;29231:40:0;;;-1:-1:-1;;;;;29231:40:0;;;;;;;;;29351:26;;;;29348:99;;;29429:7;;;;29348:99;29463:4;;-1:-1:-1;;;29463:4:0;;;;:25;;;;-1:-1:-1;;;;;;29472:16:0;;;;;;:9;:16;;;;;;;;29471:17;29463:25;29459:401;;;29524:9;-1:-1:-1;;;;;29508:25:0;:13;-1:-1:-1;;;;;29508:25:0;;29505:343;;;29611:16;-1:-1:-1;;;29611:9:0;:16::i;:::-;-1:-1:-1;;;;;29594:43:0;;29638:5;29645:28;-1:-1:-1;;;;;29645:17:0;;;;:28;;:17;:28::i;:::-;29594:80;;;;;;;;;;;;;-1:-1:-1;;;;;29594:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29505:343;;;29772:16;-1:-1:-1;;;29772:9:0;:16::i;:::-;-1:-1:-1;;;;;29755:40:0;;29796:5;29803:28;-1:-1:-1;;;;;29803:13:0;;;;:28;;:13;:28::i;:::-;29755:77;;;;;;;;;;;;;-1:-1:-1;;;;;29755:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29505:343;-1:-1:-1;;;;;29880:15:0;;;;;;:8;:15;;;;;;;;;:42;;-1:-1:-1;;;;29880:42:0;-1:-1:-1;;;;;;;;29880:42:0;;;;;;;;;;;;29938:29;;;;;;;;;;;;;;;;;29142:833;;;;:::o;5602:303::-;5660:7;5759:1;5755;:5;5747:14;;;;;;5772:9;5788:1;5784;:5;;;;;;;-1:-1:-1;;5602:303:0;;;;;:::o;6281:150::-;6339:7;6371:5;;;6395:6;;;;6387:15;;;;;;6422:1;6281:150;-1:-1:-1;;;6281:150:0:o;30176:293::-;30284:15;30270:10;:29;30266:196;;;30316:40;30349:5;30316:24;:40::i;:::-;30266:196;;;30389:61;30423:5;30438:10;30389:25;:61::i;6043:150::-;6101:7;6134:1;6129;:6;;6121:15;;;;;;-1:-1:-1;6159:5:0;;;6043:150::o;28420:528::-;28515:22;;:::i;:::-;-1:-1:-1;;;;;;28540:15:0;;;;;;:8;:15;;;;;;;;;28515:40;;;;;;;;;-1:-1:-1;;;;;28515:40:0;;;;;-1:-1:-1;;;28515:40:0;;;;;;;;;;-1:-1:-1;;;28515:40:0;;;-1:-1:-1;;;;;28515:40:0;;;;;;;;28570:30;;;;;:60;;;28629:1;28604:7;:22;;;-1:-1:-1;;;;;28604:26:0;;28570:60;28566:270;;;28647:72;28668:5;28675:7;:19;;;-1:-1:-1;;;;;28647:72:0;28696:7;:22;;;-1:-1:-1;;;;;28647:72:0;:20;:72::i;:::-;28734:90;28748:5;28755:68;28807:15;28755:47;28779:7;:22;;;-1:-1:-1;;;;;28755:47:0;:7;:19;;;-1:-1:-1;;;;;28755:23:0;;;:47;;;;:::i;28734:90::-;28850:19;;;;-1:-1:-1;;;;;28850:24:0;;:40;;;;-1:-1:-1;28878:12:0;;;28850:40;28846:95;;;28907:22;28920:5;28927:1;28907:12;:22::i;4271:264::-;4375:1;4355:7;-1:-1:-1;;;;;4355:7:0;4347:30;4339:62;;;;;-1:-1:-1;;;4339:62:0;;;;;;;;;;;;-1:-1:-1;;;4339:62:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;4420:26:0;;4412:68;;;;;-1:-1:-1;;;4412:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5034:433;5092:7;5336:6;5332:47;;-1:-1:-1;5366:1:0;5359:8;;5332:47;5403:5;;;5407:1;5403;:5;:1;5427:5;;;;;:10;5419:19;;;;;12200:2552;-1:-1:-1;;;;;12270:15:0;;12251:16;12270:15;;;:5;:15;;;;;:25;;;-1:-1:-1;;;12270:25:0;;-1:-1:-1;;;;;12270:25:0;;12330:45;7143:6;12331:26;12270:25;7143:6;12331:13;:26::i;:::-;12330:32;;:45::i;:::-;-1:-1:-1;;;;;12464:19:0;;7060:1;12464:19;;;:11;:19;;;;;:24;12306:71;;-1:-1:-1;;;;;;12464:24:0;12461:70;;12513:7;;;;12461:70;-1:-1:-1;;;;;12704:19:0;;12687:14;12704:19;;;:11;:19;;;;;:24;-1:-1:-1;;;;;12704:24:0;12683:1958;-1:-1:-1;;;;;12730:13:0;;;;;;:5;:13;;;;;:23;;;-1:-1:-1;;;;;12730:36:0;;;-1:-1:-1;;;12730:23:0;;;;:36;12683:1958;;12812:26;;:::i;:::-;-1:-1:-1;;;;;;12841:13:0;;;;;;;:5;:13;;;;;;;;;12812:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;12812:42:0;;;;;;;;;;;;12948:27;;;:49;;;;;12989:8;-1:-1:-1;;;;;12979:18:0;:6;-1:-1:-1;;;;;12979:18:0;;12948:49;12945:1591;;;13124:4;;-1:-1:-1;;;;;13124:14:0;;;:4;;:14;13121:78;;;13170:9;;13163:4;:16;;-1:-1:-1;;;;;;13163:16:0;-1:-1:-1;;;;;13163:16:0;;;;;;;;;13121:78;13285:4;;-1:-1:-1;;;;;13285:14:0;;;:4;;:14;13282:78;;;13331:9;;;;13324:4;:16;;-1:-1:-1;;;;;;13324:16:0;-1:-1:-1;;;;;13324:16:0;;;;;;;;;13282:78;-1:-1:-1;;;;;13430:19:0;;;;;;:11;:19;;;;;:24;-1:-1:-1;;;;;13430:34:0;;;:24;;:34;13427:793;;;13628:23;-1:-1:-1;;;;;13628:10:0;;7143:6;13628:10;:23::i;:::-;13587:9;;-1:-1:-1;;;;;13581:16:0;;;;;:5;:16;;;;;:26;;;:43;;-1:-1:-1;;;13581:26:0;;-1:-1:-1;;;;;13581:26:0;7143:6;13581:30;:43::i;:::-;:70;13578:319;;;13706:9;;-1:-1:-1;;;;;13679:19:0;;13706:9;13679:19;;;:11;:19;;;;;:36;;-1:-1:-1;;;;;;13679:36:0;-1:-1:-1;;;;;13679:36:0;;;;;;;;;13578:319;;;-1:-1:-1;;;;;13854:19:0;;;;;;:11;:19;;;;;;;;13847:26;;-1:-1:-1;;;;;;13847:26:0;;;;;;;;;;;;;;13578:319;13427:793;;;-1:-1:-1;;;;;13925:19:0;;;;;;:11;:19;;;;;;;;:24;;-1:-1:-1;;;;;13925:34:0;;;:24;;:34;13922:298;;;14191:9;;;;;-1:-1:-1;;;;;14164:19:0;;;;;;:11;:19;;;;;;;:24;;;:36;;-1:-1:-1;;;;;;14164:36:0;-1:-1:-1;;;;;14164:36:0;;;;;;;;;13922:298;14355:9;;14337;;;;;;-1:-1:-1;;;;;14331:16:0;;;14355:9;14331:16;;;:5;:16;;;;;;;:33;;;;;-1:-1:-1;;;;;;14331:33:0;;;;;;14407:9;;14389;;14383:16;;;;;;;14331:33;14383:21;;;:33;;;;;;;;;;;;;;;14482:13;;;;;;;;;;14475:20;;;;;;;;;;-1:-1:-1;;;;;;14475:20:0;;;-1:-1:-1;14514:7:0;;-1:-1:-1;14514:7:0;12945:1591;-1:-1:-1;;;;;;12777:13:0;;;;;;;:5;:13;;;;;:18;;12683:1958;;8103:4089;-1:-1:-1;;;;;8195:17:0;;8187:68;;;;-1:-1:-1;;;8187:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8364:15:0;;8392:1;8364:15;;;:5;:15;;;;;:25;;;-1:-1:-1;;;8364:25:0;;-1:-1:-1;;;;;8364:25:0;:29;8360:48;;8395:13;8399:8;8395:3;:13::i;:::-;8421;8445:45;7143:6;8446:26;-1:-1:-1;;;;;8446:13:0;;7143:6;8446:13;:26::i;8445:45::-;8507:4;;8421:71;;-1:-1:-1;;;;;;8507:4:0;8503:313;;8591:4;:15;;-1:-1:-1;;;;;8591:15:0;;;-1:-1:-1;;;;;;8591:15:0;;;;;;;;8621:4;:15;;;;;;;;8673:26;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8651:19:0;;;8591:4;8651:19;;;8591:15;8651:19;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8732:37;;;;;;;;;;;;;;;;;;;;;;;;;8714:15;;;:5;:15;;;;;;;:55;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8714:55:0;-1:-1:-1;;;;8714:55:0;;;;;;;;;;;;;;;;8798:7;;8503:313;8970:4;;-1:-1:-1;;;;;8970:4:0;8964:11;;;;:5;:11;;;;;8970:4;8964:21;;-1:-1:-1;;;;;8964:34:0;;;-1:-1:-1;;;8964:21:0;;;;:34;8960:683;;9102:4;;;-1:-1:-1;;;;;9102:4:0;;;9096:11;;;;:5;:11;;;;;;;;9102:4;9096:16;;;:27;;;;;-1:-1:-1;;;;;;9096:27:0;;;;;;;;9156:37;;;;;;;9171:4;;;;9156:37;;;;;;;;-1:-1:-1;;;;;9156:37:0;;;;;;;;;9138:15;;;;;;;;;:55;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9138:55:0;-1:-1:-1;;;;9138:55:0;;;;;;;;;;;;;;;;;;;;9208:15;;;;;;;;;9309:19;;;;;;;;;;;;9343:17;;;;;;;;9396:6;;;;9393:162;;9522:6;;;:17;;-1:-1:-1;;;;;;9522:17:0;-1:-1:-1;;;;;9522:17:0;;;;;9393:162;9625:7;;;;8960:683;9743:4;;-1:-1:-1;;;;;9743:4:0;9737:11;;;;:5;:11;;;;;9743:4;9737:21;;-1:-1:-1;;;;;9737:34:0;;;-1:-1:-1;;;9737:21:0;;;;:34;9733:622;;9794:4;;;-1:-1:-1;;;;;9794:4:0;;;9788:11;;;;:5;:11;;;;;;;;:27;;;;;-1:-1:-1;;;;;;9788:27:0;;;;;;;;9881:36;;;;;;;;;;9902:4;;;;9881:36;;;;;;-1:-1:-1;;;;;9881:36:0;;;;;;;;;9863:15;;;;;;;;;:54;;;;;;;;;;;;;;;9794:4;9863:54;;;;;;;;;-1:-1:-1;;;9863:54:0;-1:-1:-1;;;;9863:54:0;;;;;;;;;;;;;;;;;;;;;9932:15;;;;;;;;;10033:19;;;;;;;;;;;;10067:6;;;:17;;;;;;;;;;10116:6;;;10113:158;;10238:17;;-1:-1:-1;;;;;;10238:17:0;-1:-1:-1;;;;;10238:17:0;;;;;-1:-1:-1;10337:7:0;;9733:622;-1:-1:-1;;;;;10428:19:0;;7060:1;10428:19;;;:11;:19;;;;;:24;-1:-1:-1;;;;;10428:24:0;:33;10424:1761;;-1:-1:-1;;;;;10593:19:0;;10576:14;10593:19;;;:11;:19;;;;;:24;-1:-1:-1;;;;;10593:24:0;10695:104;-1:-1:-1;;;;;10701:13:0;;;;;;:5;:13;;;;;:23;;;-1:-1:-1;;;;;10701:35:0;;;-1:-1:-1;;;10701:23:0;;;;:35;10695:104;;;-1:-1:-1;;;;;10765:13:0;;;;;;;:5;:13;;;;;:18;;10695:104;;;10841:53;;;;;;;;-1:-1:-1;;;;;10841:53:0;;;;;;-1:-1:-1;10864:13:0;;;:5;10841:53;10864:13;;;;;;:18;;;;;;;;10841:53;;;;;;-1:-1:-1;;;;;10841:53:0;;;;;;;;;10823:15;;;;;;;;;;;;:71;;;;;;;-1:-1:-1;;;;;;10823:71:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;10823:71:0;-1:-1:-1;;;;10823:71:0;;;;;;;;;;;;;;;;;;;;;10915:18;;;;10909:25;;;;;:41;;;;;;;;10965:29;;;;;;;;;;11088:19;;;;;;;;;;11146:6;;;;11140:13;;;;;;;;;;:18;;;;;:30;11136:87;;;11190:17;;-1:-1:-1;;;;;;11190:17:0;-1:-1:-1;;;;;11190:17:0;;;;;11136:87;11261:6;;;;-1:-1:-1;;;;;11261:6:0;;;11255:13;;;;:5;:13;;;;;:18;;;:30;;;;11251:87;;;11305:6;;;:17;;-1:-1:-1;;;;;;11305:17:0;-1:-1:-1;;;;;11305:17:0;;;;;11251:87;10424:1761;;;;;11519:17;11547:23;-1:-1:-1;;;;;11547:10:0;;7143:6;11547:10;:23::i;:::-;11519:53;;11601:127;-1:-1:-1;;;;;11607:23:0;;7060:1;11607:23;;;:11;:23;;;;;;;;:28;;-1:-1:-1;;;;;11607:28:0;11601:127;;11683:27;-1:-1:-1;;;;;11683:14:0;;7143:6;11683:14;:27::i;:::-;11662:50;;11601:127;;;-1:-1:-1;;;;;11763:23:0;;;11748:12;11763:23;;;:11;:23;;;;;;;;:28;;;-1:-1:-1;;;;;11763:28:0;;;11821:11;;;:5;:11;;;;;;:16;;11948:35;;;;;;;11821:16;;;11948:35;;;;;;;;;;;;;;;;;;11930:15;;;;;;;;;;;;:53;;;;;;;-1:-1:-1;;;;;;11930:53:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;11930:53:0;-1:-1:-1;;;;11930:53:0;;;;;;;;;;;;;;;;;;;;;11998:27;;;;;;;;12040:11;;;;;;:16;;:27;;;;;;;;12088:19;;;;;;;;;;;;:35;;;;;;;;12138:24;:35;;;;;;;;8103:4089;;;:::o;34200:702::-;7143:6;-1:-1:-1;;;;;34296:21:0;;;-1:-1:-1;;;;;34296:26:0;34321:1;34296:26;34288:53;;;;;-1:-1:-1;;;34288:53:0;;;;;;;;;;;;-1:-1:-1;;;34288:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34382:12:0;;;34376:24;34382:12;;;34376:5;34382:12;;;;;;:17;;;;34376:24;;;34382:17;34376:34;;-1:-1:-1;;;;;7143:6:0;34414:21;;34376:59;;-1:-1:-1;;;34376:34:0;;;;:59;;;;:122;;-1:-1:-1;;;;;;34452:12:0;;;;;;:5;:12;;;;;:22;;;-1:-1:-1;;;;;7143:6:0;34477:21;;34452:46;;-1:-1:-1;;;34452:22:0;;;;:46;34376:122;:172;;;;-1:-1:-1;;;;;;34515:12:0;;;;;;:5;:12;;;;;:22;;;-1:-1:-1;;;;;34515:33:0;;;-1:-1:-1;;;34515:22:0;;;;:33;;34376:172;34354:228;;;;;-1:-1:-1;;;34354:228:0;;;;;;;;;;;;-1:-1:-1;;;34354:228:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34621:12:0;;;34615:24;34621:12;;;34615:5;34621:12;;;;;;:17;;;;;;;;34615:24;;;;:34;;-1:-1:-1;;;;;34615:44:0;;;-1:-1:-1;;;34615:34:0;;;;:44;:107;;;;-1:-1:-1;;;;;;34676:12:0;;;;;;:5;:12;;;;;:22;;;-1:-1:-1;;;;;7143:6:0;34701:21;;34676:46;;-1:-1:-1;;;34676:22:0;;;;:46;34615:107;:157;;;;-1:-1:-1;;;;;;34739:12:0;;;;;;:5;:12;;;;;:22;;;-1:-1:-1;;;;;34739:33:0;;;-1:-1:-1;;;34739:22:0;;;;:33;;34615:157;34593:213;;;;;-1:-1:-1;;;34593:213:0;;;;;;;;;;;;-1:-1:-1;;;34593:213:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34817:20:0;;;;;;;;:11;:20;;;;;;;;:25;;;:33;;-1:-1:-1;;;;;;34817:33:0;;;-1:-1:-1;;;;;34817:33:0;;;;;;;34861;;;;;;;;;;34200:702::o;31051:1113::-;-1:-1:-1;;;;;31189:16:0;;;31169:17;31189:16;;;:9;:16;;;;;;31169:17;;31189:16;:72;;31260:1;31189:72;;;31233:10;;21315:4;;-1:-1:-1;;;31233:10:0;;-1:-1:-1;;;;;31233:10:0;;;31222:21;;:35;;31189:72;31303:10;;31369;;31169:92;;-1:-1:-1;21315:4:0;-1:-1:-1;;;;;31303:10:0;;;31292:21;;:35;;;;;;31369:10;;31358:21;;:35;;;;31272:17;;31433:53;;;;;;:38;;;;;;;;:12;;;;:23;;:12;:23::i;:::-;:27;;:38::i;:53::-;31404:84;-1:-1:-1;;;;;;31513:13:0;;;31509:241;;-1:-1:-1;;;;;31605:16:0;;;31595:28;31605:16;;;:9;:16;;;;;;;;;;;;31595:28;;:8;:28;;;:40;:55;;-1:-1:-1;;;31595:40:0;;-1:-1:-1;;;;;31595:40:0;;;;:55;;:44;:55::i;:::-;-1:-1:-1;;;;;31553:16:0;;;31543:28;31553:16;;;:9;:16;;;;;;;;;;;;31543:28;;:8;:28;;;;;:109;;-1:-1:-1;;;;;31543:109:0;;;-1:-1:-1;;;31543:109:0;;;;;;;31686:16;;;;;;;;;31672:66;;;;;;;31722:15;31672:66;;;;;;;;;31553:16;;31686;;;;;31672:66;;;;;;;;;31509:241;-1:-1:-1;;;;;31764:13:0;;;31760:110;;31831:9;;-1:-1:-1;;;;;31831:9:0;31822:19;;;;:8;:19;;;;;:31;:46;;-1:-1:-1;;;31822:31:0;;-1:-1:-1;;;;;31822:31:0;;;;:46;;:35;:46::i;:::-;31788:9;;-1:-1:-1;;;;;31788:9:0;31779:19;;;;:8;:19;;;;;:91;;-1:-1:-1;;;;;31779:91:0;;;-1:-1:-1;;;31779:91:0;;;;;;;;;31760:110;-1:-1:-1;;;;;31885:13:0;;;31881:134;;31955:58;32003:9;-1:-1:-1;;;;;31955:58:0;:8;:31;31964:21;-1:-1:-1;;;31964:9:0;:21::i;:::-;-1:-1:-1;;;;;31955:31:0;;;;;;;;;;;;-1:-1:-1;31955:31:0;:43;-1:-1:-1;;;31955:43:0;;-1:-1:-1;;;;;31955:43:0;;:47;:58::i;:::-;31900:8;:31;31909:21;-1:-1:-1;;;31909:9:0;:21::i;:::-;-1:-1:-1;;;;;31900:31:0;;;;;;;;;;;;-1:-1:-1;31900:31:0;:115;;-1:-1:-1;;;;;31900:115:0;;;-1:-1:-1;;;31900:115:0;;;;;;;;;31881:134;-1:-1:-1;;;;;32030:13:0;;;32026:130;;32098:56;32144:9;-1:-1:-1;;;;;32098:56:0;:8;:29;32107:19;-1:-1:-1;;;32107:9:0;:19::i;32098:56::-;32045:8;:29;32054:19;-1:-1:-1;;;32054:9:0;:19::i;:::-;-1:-1:-1;;;;;32045:29:0;;;;;;;;;;;;-1:-1:-1;32045:29:0;:111;;-1:-1:-1;;;;;32045:111:0;;;-1:-1:-1;;;32045:111:0;;;;;;;;;32026:130;31051:1113;;;;;;:::o;30598:267::-;30717:14;30734:48;30766:15;30734:27;:11;30750:10;30734:15;:27::i;:48::-;30717:65;;30806:17;-1:-1:-1;;;30806:9:0;:17::i;:::-;-1:-1:-1;;;;;30793:48:0;;30842:5;30849:6;30793:63;;;;;;;;;;;;;-1:-1:-1;;;;;30793:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30598:267;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://6c80c0fe53f2b25936fd840944caa4ac8a12a493707317615caaadb96ab3aa2a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.