Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Initialize | 14527087 | 1027 days ago | IN | 0 ETH | 0.01323407 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
veSPA_v1
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.7; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@// //@@@@@@@@&....(@@@@@@@@@@@@@..../@@@@@@@@@// //@@@@@@........../@@@@@@@........../@@@@@@// //@@@@@............(@@@@@............(@@@@@// //@@@@@(............@@@@@(...........&@@@@@// //@@@@@@@...........&@@@@@@.........@@@@@@@// //@@@@@@@@@@@@@@%..../@@@@@@@@@@@@@@@@@@@@@// //@@@@@@@@@@@@@@@@@@@...@@@@@@@@@@@@@@@@@@@// //@@@@@@@@@@@@@@@@@@@@@......(&@@@@@@@@@@@@// //@@@@@@#.........@@@@@@#...........@@@@@@@// //@@@@@/...........%@@@@@............%@@@@@// //@@@@@............#@@@@@............%@@@@@// //@@@@@@..........#@@@@@@@/.........#@@@@@@// //@@@@@@@@@&/.(@@@@@@@@@@@@@@&/.(&@@@@@@@@@// //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@// import "./ReentrancyGuardUpgradeable.sol"; import "./OwnableUpgradeable.sol"; import "./SafeERC20Upgradeable.sol"; import "./IveSPA.sol"; // @title Voting Escrow // @notice Cooldown logic is added in the contract // @notice Make contract upgradeable // @notice This is a Solidity implementation of the CURVE's voting escrow. // @notice Votes have a weight depending on time, so that users are // committed to the future of (whatever they are voting for) // @dev Vote weight decays linearly over time. Lock time cannot be // more than `MAX_TIME` (4 years). /** # Voting escrow to have time-weighted votes # w ^ # 1 + / # | / # | / # | / # |/ # 0 +--------+------> time # maxtime (4 years?) */ contract veSPA_v1 is IveSPA, OwnableUpgradeable, ReentrancyGuardUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; enum ActionType { DEPOSIT_FOR, CREATE_LOCK, INCREASE_AMOUNT, INCREASE_LOCK_TIME, INITIATE_COOLDOWN } event UserCheckpoint( ActionType indexed actionType, bool autoCooldown, address indexed provider, uint256 value, uint256 indexed locktime ); event GlobalCheckpoint(address caller, uint256 epoch); event Withdraw(address indexed provider, uint256 value, uint256 ts); event Supply(uint256 prevSupply, uint256 supply); struct Point { int128 bias; // veSPA value at this point int128 slope; // slope at this point int128 residue; // residue calculated at this point uint256 ts; // timestamp of this point uint256 blk; // block number of this point } /* We cannot really do block numbers per se b/c slope is per time, not per block * and per block could be fairly bad b/c Ethereum changes blocktimes. * What we can do is to extrapolate ***At functions */ struct LockedBalance { bool autoCooldown; // if true, the user's deposit will have a default cooldown. bool cooldownInitiated; // Determines if the cooldown has been initiated. uint128 amount; // amount of SPA locked for a user. uint256 end; // the expiry time of the deposit. } string public version; string public constant name = "Vote-escrow SPA"; string public constant symbol = "veSPA"; uint8 public constant decimals = 18; uint256 public totalSPALocked; uint256 public constant WEEK = 1 weeks; uint256 public constant MAX_TIME = 4 * 365 days; uint256 public constant MIN_TIME = 1 * WEEK; uint256 public constant MULTIPLIER = 10**18; int128 public constant I_YEAR = int128(uint128(365 days)); int128 public constant I_MIN_TIME = int128(uint128(WEEK)); address public SPA; // @dev Mappings to store global point information uint256 public epoch; mapping(uint256 => Point) public pointHistory; // epoch -> unsigned point mapping(uint256 => int128) public slopeChanges; // time -> signed slope change // @dev Mappings to store user deposit information mapping(address => LockedBalance) public lockedBalances; // user Deposits mapping(address => mapping(uint256 => Point)) public userPointHistory; // user -> point[userEpoch] mapping(address => uint256) public override userPointEpoch; // @dev Constructor function initialize(address _SPA, string memory _version) public initializer { require(_SPA != address(0), "_SPA is zero address"); OwnableUpgradeable.__Ownable_init(); ReentrancyGuardUpgradeable.__ReentrancyGuard_init(); SPA = _SPA; version = _version; pointHistory[0].blk = block.number; pointHistory[0].ts = block.timestamp; } // @notice Get the most recently recorded rate of voting power decrease for `addr` // @param addr The address to get the rate for // @return value of the slope function getLastUserSlope(address addr) external view override returns (int128) { uint256 uEpoch = userPointEpoch[addr]; if (uEpoch == 0) { return 0; } return userPointHistory[addr][uEpoch].slope; } // @notice Get the timestamp for checkpoint `idx` for `addr` // @param addr User wallet address // @param idx User epoch number // @return Epoch time of the checkpoint function getUserPointHistoryTS(address addr, uint256 idx) external view override returns (uint256) { return userPointHistory[addr][idx].ts; } // @notice Get timestamp when `addr`'s lock finishes // @param addr User wallet address // @return Timestamp when lock finishes function lockedEnd(address addr) external view override returns (uint256) { return lockedBalances[addr].end; } // @notice add checkpoints to pointHistory for every week from last added checkpoint until now // @dev block number for each added checkpoint is estimated by their respective timestamp and the blockslope // where the blockslope is estimated by the last added time/block point and the current time/block point // @dev pointHistory include all weekly global checkpoints and some additional in-week global checkpoints // @return lastPoint by calling this function function _updateGlobalPoint() private returns (Point memory lastPoint) { uint256 _epoch = epoch; lastPoint = Point({ bias: 0, slope: 0, residue: 0, ts: block.timestamp, blk: block.number //TODO: arbi-main-fork cannot test it }); Point memory initialLastPoint = Point({ bias: 0, slope: 0, residue: 0, ts: block.timestamp, blk: block.number }); if (_epoch > 0) { lastPoint = pointHistory[_epoch]; initialLastPoint = pointHistory[_epoch]; } uint256 lastCheckpoint = lastPoint.ts; uint256 blockSlope = 0; // dblock/dt if (block.timestamp > lastPoint.ts) { blockSlope = (MULTIPLIER * (block.number - lastPoint.blk)) / (block.timestamp - lastPoint.ts); } { uint256 ti = (lastCheckpoint / WEEK) * WEEK; for (uint256 i = 0; i < 255; i++) { ti += WEEK; int128 dslope = 0; if (ti > block.timestamp) { ti = block.timestamp; } else { dslope = slopeChanges[ti]; } // calculate the slope and bia of the new last point lastPoint.bias -= lastPoint.slope * int128(int256(ti) - int256(lastCheckpoint)); lastPoint.slope += dslope; if (lastPoint.bias < 0) { lastPoint.bias = 0; } if (lastPoint.slope < 0) { lastPoint.slope = 0; } lastCheckpoint = ti; lastPoint.ts = ti; lastPoint.blk = initialLastPoint.blk + (blockSlope * (ti - initialLastPoint.ts)) / MULTIPLIER; _epoch += 1; if (ti == block.timestamp) { lastPoint.blk = block.number; pointHistory[_epoch] = lastPoint; break; } pointHistory[_epoch] = lastPoint; } } epoch = _epoch; return lastPoint; } // @notice Record global and per-user data to checkpoint // @param addr User wallet address. No user checkpoint if 0x0 // @param oldDeposit Previous locked balance / end lock time for the user // @param newDeposit New locked balance / end lock time for the user function _checkpoint( address addr, LockedBalance memory oldDeposit, LockedBalance memory newDeposit ) internal { Point memory uOld = Point(0, 0, 0, 0, 0); Point memory uNew = Point(0, 0, 0, 0, 0); int128 dSlopeOld = 0; int128 dSlopeNew = 0; if (oldDeposit.amount > 0) { int128 amt = int128(oldDeposit.amount); if (!oldDeposit.cooldownInitiated) { uOld.residue = (amt * I_MIN_TIME) / I_YEAR; oldDeposit.end -= WEEK; } if (oldDeposit.end > block.timestamp) { uOld.slope = amt / I_YEAR; uOld.bias = uOld.slope * int128(int256(oldDeposit.end) - int256(block.timestamp)); } } if ((newDeposit.end > block.timestamp) && (newDeposit.amount > 0)) { int128 amt = int128(newDeposit.amount); if (!newDeposit.cooldownInitiated) { uNew.residue = (amt * I_MIN_TIME) / I_YEAR; newDeposit.end -= WEEK; } if (newDeposit.end > block.timestamp) { uNew.slope = amt / I_YEAR; uNew.bias = uNew.slope * int128(int256(newDeposit.end) - int256(block.timestamp)); } } dSlopeOld = slopeChanges[oldDeposit.end]; if (newDeposit.end != 0) { dSlopeNew = slopeChanges[newDeposit.end]; } // add all global checkpoints from last added global check point until now Point memory lastPoint = _updateGlobalPoint(); // update the last global checkpoint (now) with user action's consequences lastPoint.slope += (uNew.slope - uOld.slope); lastPoint.bias += (uNew.bias - uOld.bias); lastPoint.residue += (uNew.residue - uOld.residue); if (lastPoint.slope < 0) { lastPoint.slope = 0; } if (lastPoint.bias < 0) { lastPoint.bias = 0; } pointHistory[epoch] = lastPoint; if (oldDeposit.end > block.timestamp) { // old_dslope was <something> - u_old.slope, so we cancel that dSlopeOld += uOld.slope; if (newDeposit.end == oldDeposit.end) { dSlopeOld -= uNew.slope; } slopeChanges[oldDeposit.end] = dSlopeOld; } if (newDeposit.end > block.timestamp) { if (newDeposit.end > oldDeposit.end) { dSlopeNew -= uNew.slope; // old slope disappeared at this point slopeChanges[newDeposit.end] = dSlopeNew; } // else: we recorded it already in old_dslopes̄ } uint256 userEpc = userPointEpoch[addr] + 1; userPointEpoch[addr] = userEpc; uNew.ts = block.timestamp; uNew.blk = block.number; userPointHistory[addr][userEpc] = uNew; } // @notice Deposit and lock tokens for a user // @param addr Address of the user // @param value Amount of tokens to deposit // @param unlockTime Time when the tokens will be unlocked // @param oldDeposit Previous locked balance of the user / timestamp function _depositFor( address addr, bool autoCooldown, bool enableCooldown, uint128 value, uint256 unlockTime, LockedBalance memory oldDeposit, ActionType _type ) internal { LockedBalance memory newDeposit = lockedBalances[addr]; uint256 prevSupply = totalSPALocked; totalSPALocked += value; newDeposit.amount += value; newDeposit.autoCooldown = autoCooldown; newDeposit.cooldownInitiated = enableCooldown; if (unlockTime != 0) { newDeposit.end = unlockTime; } lockedBalances[addr] = newDeposit; _checkpoint(addr, oldDeposit, newDeposit); if (value != 0) { IERC20Upgradeable(SPA).safeTransferFrom( _msgSender(), address(this), value ); } emit UserCheckpoint(_type, autoCooldown, addr, value, newDeposit.end); emit Supply(prevSupply, totalSPALocked); } // @notice Record global data to checkpoint function checkpoint() external override { _updateGlobalPoint(); emit GlobalCheckpoint(_msgSender(), epoch); } // @notice Deposit and lock tokens for a user // @dev Anyone (even a smart contract) can deposit tokens for someone else, but // cannot extend their locktime and deposit for a user that is not locked // @param addr Address of the user // @param value Amount of tokens to deposit function depositFor(address addr, uint128 value) external override nonReentrant { LockedBalance memory existingDeposit = lockedBalances[addr]; require(value > 0, "Cannot deposit 0 tokens"); require(existingDeposit.amount > 0, "No existing lock"); if (!existingDeposit.autoCooldown) { require( !existingDeposit.cooldownInitiated, "Cannot deposit during cooldown" ); } // else: auto-cooldown is on, so user can deposit anytime prior to expiry require( existingDeposit.end > block.timestamp, "Lock expired. Withdraw" ); _depositFor( addr, existingDeposit.autoCooldown, existingDeposit.cooldownInitiated, value, 0, existingDeposit, ActionType.DEPOSIT_FOR ); } // @notice Deposit `value` for `msg.sender` and lock untill `unlockTime` // @param value Amount of tokens to deposit // @param unlockTime Time when the tokens will be unlocked // @param autoCooldown Choose to opt in to auto-cooldown // @dev if autoCooldown is true, the user's veSPA balance will // decay to 0 after `unlockTime` else the user's veSPA balance // will remain = residual balance till user initiates cooldown // @dev unlockTime is rownded down to whole weeks function createLock( uint128 value, uint256 unlockTime, bool autoCooldown ) external override nonReentrant { address account = _msgSender(); uint256 roundedUnlockTime = (unlockTime / WEEK) * WEEK; LockedBalance memory existingDeposit = lockedBalances[account]; require(value > 0, "Cannot lock 0 tokens"); require(existingDeposit.amount == 0, "Withdraw old tokens first"); require(roundedUnlockTime > block.timestamp, "Cannot lock in the past"); require( roundedUnlockTime <= block.timestamp + MAX_TIME, "Voting lock can be 4 years max" ); _depositFor( account, autoCooldown, autoCooldown, value, roundedUnlockTime, existingDeposit, ActionType.CREATE_LOCK ); } // @notice Deposit `value` additional tokens for `msg.sender` without // modifying the locktime // @param value Amount of tokens to deposit function increaseAmount(uint128 value) external override nonReentrant { address account = _msgSender(); LockedBalance memory existingDeposit = lockedBalances[account]; require(value > 0, "Cannot deposit 0 tokens"); require(existingDeposit.amount > 0, "No existing lock found"); if (!existingDeposit.autoCooldown) { require( !existingDeposit.cooldownInitiated, "Cannot deposit during cooldown" ); } // else: auto-cooldown is on, so user can deposit anytime prior to expiry require( existingDeposit.end > block.timestamp, "Lock expired. Withdraw" ); _depositFor( account, existingDeposit.autoCooldown, existingDeposit.cooldownInitiated, value, 0, existingDeposit, ActionType.INCREASE_AMOUNT ); } // @notice Extend the locktime of `msg.sender`'s tokens to `unlockTime` // @param unlockTime New locktime function increaseUnlockTime(uint256 unlockTime) external override { address account = _msgSender(); LockedBalance memory existingDeposit = lockedBalances[account]; uint256 roundedUnlockTime = (unlockTime / WEEK) * WEEK; // Locktime is rounded down to weeks require(existingDeposit.amount > 0, "No existing lock found"); if (!existingDeposit.autoCooldown) { require( !existingDeposit.cooldownInitiated, "Deposit is in cooldown" ); } // else: auto-cooldown is on, so user can increase unlocktime anytime prior to expiry require( existingDeposit.end > block.timestamp, "Lock expired. Withdraw" ); require( roundedUnlockTime > existingDeposit.end, "Can only increase lock duration" ); require( roundedUnlockTime <= block.timestamp + MAX_TIME, "Voting lock can be 4 years max" ); _depositFor( account, existingDeposit.autoCooldown, existingDeposit.cooldownInitiated, 0, roundedUnlockTime, existingDeposit, ActionType.INCREASE_LOCK_TIME ); } // @notice Initiate the cooldown period for `msg.sender`'s deposit function initiateCooldown() external override { address account = _msgSender(); LockedBalance memory existingDeposit = lockedBalances[account]; require(existingDeposit.amount > 0, "No existing lock found"); require( !existingDeposit.cooldownInitiated, "Cooldown already initiated" ); require( block.timestamp >= existingDeposit.end - MIN_TIME, "Can not initiate cool down" ); uint256 roundedUnlockTime = ((block.timestamp + MIN_TIME) / WEEK) * WEEK; _depositFor( account, existingDeposit.autoCooldown, true, 0, roundedUnlockTime, existingDeposit, ActionType.INITIATE_COOLDOWN ); } // @notice Withdraw tokens for `msg.sender` // @dev Only possible if the locktime has expired function withdraw() external override nonReentrant { address account = _msgSender(); LockedBalance memory existingDeposit = lockedBalances[account]; require(existingDeposit.amount > 0, "No existing lock found"); require(existingDeposit.cooldownInitiated, "No cooldown initiated"); require(block.timestamp >= existingDeposit.end, "Lock not expired."); uint128 value = existingDeposit.amount; LockedBalance memory oldDeposit = lockedBalances[account]; lockedBalances[account] = LockedBalance(false, false, 0, 0); uint256 prevSupply = totalSPALocked; totalSPALocked -= value; // oldDeposit can have either expired <= timestamp or 0 end // existingDeposit has 0 end // Both can have >= 0 amount _checkpoint(account, oldDeposit, LockedBalance(false, false, 0, 0)); IERC20Upgradeable(SPA).safeTransfer(account, value); emit Withdraw(account, value, block.timestamp); emit Supply(prevSupply, totalSPALocked); } // ----------------------VIEW functions---------------------- // NOTE:The following ERC20/minime-compatible methods are not real balanceOf and supply!! // They measure the weights for the purpose of voting, so they don't represent real coins. // @notice Binary search to estimate timestamp for block number // @param blockNumber Block number to estimate timestamp for // @param maxEpoch Don't go beyond this epoch // @return Estimated timestamp for block number function _findBlockEpoch(uint256 blockNumber, uint256 maxEpoch) internal view returns (uint256) { uint256 min = 0; uint256 max = maxEpoch; for (uint256 i = 0; i < 128; i++) { if (min >= max) { break; } uint256 mid = (min + max + 1) / 2; if (pointHistory[mid].blk <= blockNumber) { min = mid; } else { max = mid - 1; } } return min; } function _findUserTimestampEpoch(address addr, uint256 ts) internal view returns (uint256) { uint256 min = 0; uint256 max = userPointEpoch[addr]; for (uint256 i = 0; i < 128; i++) { if (min >= max) { break; } uint256 mid = (min + max + 1) / 2; if (userPointHistory[addr][mid].ts <= ts) { min = mid; } else { max = mid - 1; } } return min; } function _findGlobalTimestampEpoch(uint256 ts) internal view returns (uint256) { uint256 min = 0; uint256 max = epoch; for (uint256 i = 0; i < 128; i++) { if (min >= max) { break; } uint256 mid = (min + max + 1) / 2; if (pointHistory[mid].ts <= ts) { min = mid; } else { max = mid - 1; } } return min; } // @notice Function to estimate the user deposit // @param autoCooldown Choose to opt in to auto-cooldown // @param value Amount of SPA to deposit // @param expectedUnlockTime The expected unlock time // @dev if autoCooldown is true, the user's veSPA balance will // decay to 0 after `unlockTime` else the user's veSPA balance // will remain = residual balance till user initiates cooldown // @return Estimated deposit function estimateDeposit( bool autoCooldown, uint128 value, uint256 expectedUnlockTime ) public view returns ( bool, int128 initialVespaBalance, // initial veSPA balance int128 slope, // slope of the user's graph int128 bias, // bias of the user's graph int128 residue, // residual balance uint256 actualUnlockTime, // actual rounded unlock time uint256 providedUnlockTime, // expected unlock time uint256 residuePeriodStart ) { actualUnlockTime = (expectedUnlockTime / WEEK) * WEEK; require(actualUnlockTime > block.timestamp, "Cannot lock in the past"); require( actualUnlockTime <= block.timestamp + MAX_TIME, "Voting lock can be 4 years max" ); int128 amt = int128(value); slope = amt / I_YEAR; if (!autoCooldown) { residue = (amt * I_MIN_TIME) / I_YEAR; residuePeriodStart = actualUnlockTime - WEEK; bias = slope * int128( int256(actualUnlockTime - WEEK) - int256(block.timestamp) ); } else { bias = slope * int128(int256(actualUnlockTime) - int256(block.timestamp)); } if (bias <= 0) { bias = 0; } initialVespaBalance = bias + residue; return ( autoCooldown, initialVespaBalance, slope, bias, residue, actualUnlockTime, expectedUnlockTime, residuePeriodStart ); } // @notice Get the voting power for a user at the specified timestamp // @dev Adheres to ERC20 `balanceOf` interface for Aragon compatibility // @param addr User wallet address // @param ts Timestamp to get voting power at // @return Voting power of user at timestamp function balanceOf(address addr, uint256 ts) public view override returns (uint256) { uint256 _epoch = _findUserTimestampEpoch(addr, ts); if (_epoch == 0) { return 0; } else { Point memory lastPoint = userPointHistory[addr][_epoch]; lastPoint.bias -= lastPoint.slope * int128(int256(ts) - int256(lastPoint.ts)); if (lastPoint.bias < 0) { lastPoint.bias = 0; } lastPoint.bias += lastPoint.residue; return uint256(int256(lastPoint.bias)); } } // @notice Get the current voting power for a user // @param addr User wallet address // @return Voting power of user at current timestamp function balanceOf(address addr) public view override returns (uint256) { return balanceOf(addr, block.timestamp); } // @notice Get the voting power of `addr` at block `blockNumber` // @param addr User wallet address // @param blockNumber Block number to get voting power at // @return Voting power of user at block number function balanceOfAt(address addr, uint256 blockNumber) public view override returns (uint256) { uint256 min = 0; uint256 max = userPointEpoch[addr]; // Find the approximate timestamp for the block number for (uint256 i = 0; i < 128; i++) { if (min >= max) { break; } uint256 mid = (min + max + 1) / 2; if (userPointHistory[addr][mid].blk <= blockNumber) { min = mid; } else { max = mid - 1; } } // min is the userEpoch nearest to the block number Point memory uPoint = userPointHistory[addr][min]; uint256 maxEpoch = epoch; // blocktime using the global point history uint256 _epoch = _findBlockEpoch(blockNumber, maxEpoch); Point memory point0 = pointHistory[_epoch]; uint256 dBlock = 0; uint256 dt = 0; if (_epoch < maxEpoch) { Point memory point1 = pointHistory[_epoch + 1]; dBlock = point1.blk - point0.blk; dt = point1.ts - point0.ts; } else { dBlock = blockNumber - point0.blk; dt = block.timestamp - point0.ts; } uint256 blockTime = point0.ts; if (dBlock != 0) { blockTime += (dt * (blockNumber - point0.blk)) / dBlock; } uPoint.bias -= uPoint.slope * int128(int256(blockTime) - int256(uPoint.ts)); if (uPoint.bias < 0) { uPoint.bias = 0; } uPoint.bias += uPoint.residue; return uint256(int256(uPoint.bias)); } // @notice Calculate total voting power at some point in the past // @param point The point (bias/slope) to start search from // @param ts Timestamp to calculate total voting power at // @return Total voting power at timestamp function supplyAt(Point memory point, uint256 ts) internal view returns (uint256) { Point memory lastPoint = point; uint256 ti = (lastPoint.ts / WEEK) * WEEK; // Calculate the missing checkpoints for (uint256 i = 0; i < 255; i++) { ti += WEEK; int128 dSlope = 0; if (ti > ts) { ti = ts; } else { dSlope = slopeChanges[ti]; } lastPoint.bias -= lastPoint.slope * int128(int256(ti) - int256(lastPoint.ts)); if (ti == ts) { break; } lastPoint.slope += dSlope; lastPoint.ts = ti; } if (lastPoint.bias < 0) { lastPoint.bias = 0; } lastPoint.bias += lastPoint.residue; return uint256(int256(lastPoint.bias)); } // @notice Calculate total voting power at a given timestamp // @return Total voting power at timestamp function totalSupply(uint256 ts) public view override returns (uint256) { uint256 _epoch = _findGlobalTimestampEpoch(ts); Point memory lastPoint = pointHistory[_epoch]; return supplyAt(lastPoint, ts); } // @notice Calculate total voting power at current timestamp // @return Total voting power at current timestamp function totalSupply() public view override returns (uint256) { return totalSupply(block.timestamp); } // @notice Calculate total voting power at a given block number in past // @param blockNumber Block number to calculate total voting power at // @return Total voting power at block number function totalSupplyAt(uint256 blockNumber) external view override returns (uint256) { require(blockNumber <= block.number); uint256 _epoch = epoch; uint256 targetEpoch = _findBlockEpoch(blockNumber, _epoch); Point memory point0 = pointHistory[targetEpoch]; uint256 dt = 0; if (targetEpoch < _epoch) { Point memory point1 = pointHistory[targetEpoch + 1]; dt = ((blockNumber - point0.blk) * (point1.ts - point0.ts)) / (point1.blk - point0.blk); } else { if (point0.blk != block.number) { dt = ((blockNumber - point0.blk) * (block.timestamp - point0.ts)) / (block.number - point0.blk); } } // Now dt contains info on how far we are beyond point0 return supplyAt(point0, point0.ts + dt); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "./Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; import "./AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.7; interface IveSPA { function getLastUserSlope(address addr) external view returns (int128); function getUserPointHistoryTS(address addr, uint256 idx) external view returns (uint256); function userPointEpoch(address addr) external view returns (uint256); function checkpoint() external; function lockedEnd(address addr) external view returns (uint256); function depositFor(address addr, uint128 value) external; function createLock( uint128 value, uint256 unlockTime, bool autoCooldown ) external; function increaseAmount(uint128 value) external; function increaseUnlockTime(uint256 unlockTime) external; function initiateCooldown() external; function withdraw() external; function balanceOf(address addr, uint256 ts) external view returns (uint256); function balanceOf(address addr) external view returns (uint256); function balanceOfAt(address, uint256 blockNumber) external view returns (uint256); function totalSupply(uint256 ts) external view returns (uint256); function totalSupply() external view returns (uint256); function totalSupplyAt(uint256 blockNumber) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./ContextUpgradeable.sol"; import "./Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; import "./Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "./IERC20Upgradeable.sol"; import "./AddressUpgradeable.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20Upgradeable { using AddressUpgradeable for address; function safeTransfer( IERC20Upgradeable token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20Upgradeable token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20Upgradeable token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20Upgradeable token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20Upgradeable token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"GlobalCheckpoint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"Supply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum veSPA_v1.ActionType","name":"actionType","type":"uint8"},{"indexed":false,"internalType":"bool","name":"autoCooldown","type":"bool"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"locktime","type":"uint256"}],"name":"UserCheckpoint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"I_MIN_TIME","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"I_YEAR","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SPA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WEEK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"ts","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"value","type":"uint128"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"bool","name":"autoCooldown","type":"bool"}],"name":"createLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint128","name":"value","type":"uint128"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"autoCooldown","type":"bool"},{"internalType":"uint128","name":"value","type":"uint128"},{"internalType":"uint256","name":"expectedUnlockTime","type":"uint256"}],"name":"estimateDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"int128","name":"initialVespaBalance","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"residue","type":"int128"},{"internalType":"uint256","name":"actualUnlockTime","type":"uint256"},{"internalType":"uint256","name":"providedUnlockTime","type":"uint256"},{"internalType":"uint256","name":"residuePeriodStart","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getLastUserSlope","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"idx","type":"uint256"}],"name":"getUserPointHistoryTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"value","type":"uint128"}],"name":"increaseAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"increaseUnlockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_SPA","type":"address"},{"internalType":"string","name":"_version","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initiateCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedBalances","outputs":[{"internalType":"bool","name":"autoCooldown","type":"bool"},{"internalType":"bool","name":"cooldownInitiated","type":"bool"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint256","name":"end","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"lockedEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pointHistory","outputs":[{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"int128","name":"residue","type":"int128"},{"internalType":"uint256","name":"ts","type":"uint256"},{"internalType":"uint256","name":"blk","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"slopeChanges","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSPALocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ts","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userPointEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userPointHistory","outputs":[{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"int128","name":"residue","type":"int128"},{"internalType":"uint256","name":"ts","type":"uint256"},{"internalType":"uint256","name":"blk","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613717806100206000396000f3fe608060405234801561001057600080fd5b506004361061023c5760003560e01c806381fc83bb1161013b578063c2c4c5c1116100b8578063f2fde38b1161007c578063f2fde38b14610668578063f399e22e1461067b578063f3a6d6081461068e578063f4359ce5146106a1578063f52a36f7146106ab57600080fd5b8063c2c4c5c114610601578063cd48098e14610609578063e2c5b4d214610611578063ebc65dbd1461064a578063eda2108d1461065d57600080fd5b8063911dcf5c116100ff578063911dcf5c1461058757806395d89b41146105a4578063981b24d0146105c85780639a3f14f7146105db578063bd85b039146105ee57600080fd5b806381fc83bb146104fe5780638ad4c4471461051e5780638da5cb5b146105655780638ff07b5b14610576578063900cf0cf1461057e57600080fd5b80633ccfd60b116101c9578063538daac41161018d578063538daac41461049d57806354fd4d50146104c857806370a08231146104d0578063715018a6146104e35780637c616fe6146104eb57600080fd5b80633ccfd60b1461043857806344e83ccf146104425780634deafcae1461044b5780634e3430ca146104775780634ee2cd7e1461048a57600080fd5b806306fdde031161021057806306fdde031461034b57806318160ddd14610386578063269499841461038e578063313ce5671461039957806334d901a4146103b357600080fd5b8062fdd58e14610241578063034a2c36146102675780630483a7f6146102c4578063059f8b161461033c575b600080fd5b61025461024f36600461315a565b6106ce565b6040519081526020015b60405180910390f35b61027a6102753660046131a1565b6107dd565b604080519815158952600f97880b60208a015295870b9588019590955292850b6060870152930b608085015260a084019290925260c083019190915260e08201526101000161025e565b61030b6102d236600461304a565b609d602052600090815260409020805460019091015460ff80831692610100810490911691620100009091046001600160801b03169084565b60405161025e9493929190931515845291151560208401526001600160801b03166040830152606082015260800190565b610254670de0b6b3a764000081565b6103796040518060400160405280600f81526020016e566f74652d657363726f772053504160881b81525081565b60405161025e919061326f565b61025461092e565b610254630784ce0081565b6103a1601281565b60405160ff909116815260200161025e565b6104056103c136600461315a565b609e6020908152600092835260408084209091529082529020805460018201546002830154600390930154600f83810b94600160801b909404810b9392900b919085565b60408051600f96870b815294860b60208601529290940b918301919091526060820152608081019190915260a00161025e565b61044061093e565b005b61025460985481565b61025461045936600461304a565b6001600160a01b03166000908152609d602052604090206001015490565b6104406104853660046131df565b610c31565b61025461049836600461315a565b610dc2565b6099546104b0906001600160a01b031681565b6040516001600160a01b03909116815260200161025e565b6103796110e2565b6102546104de36600461304a565b611170565b61044061117c565b6104406104f936600461323a565b6111e2565b61025461050c36600461304a565b609f6020526000908152604090205481565b61040561052c36600461323a565b609b602052600090815260409020805460018201546002830154600390930154600f83810b94600160801b909404810b9392900b919085565b6033546001600160a01b03166104b0565b610254611391565b610254609a5481565b61059162093a8081565b604051600f9190910b815260200161025e565b61037960405180604001604052806005815260200164766553504160d81b81525081565b6102546105d636600461323a565b6113a2565b6104406105e9366004613127565b611563565b6102546105fc36600461323a565b611716565b61044061179b565b6104406117e4565b61025461061f36600461315a565b6001600160a01b03919091166000908152609e60209081526040808320938352929052206002015490565b6104406106583660046131fa565b611960565b6105916301e1338081565b61044061067636600461304a565b611b39565b610440610689366004613065565b611c04565b61059161069c36600461304a565b611d99565b61025462093a8081565b6105916106b936600461323a565b609c60205260009081526040902054600f0b81565b6000806106db8484611df6565b9050806106ec5760009150506107d7565b6001600160a01b0384166000908152609e60209081526040808320848452825291829020825160a0810184528154600f81810b810b810b8352600160801b909104810b810b810b938201939093526001820154830b830b90920b9282019290925260028201546060820181905260039092015460808201529061076f90856135a3565b816020015161077e919061349f565b8151829061078d908390613553565b600f90810b810b90915282516000910b121590506107aa57600081525b6040810151815182906107be9083906133bb565b600f90810b810b909152915190910b92506107d7915050565b92915050565b60008080808080808062093a806107f4818b61348b565b6107fe9190613534565b925042831161084e5760405162461bcd60e51b815260206004820152601760248201527610d85b9b9bdd081b1bd8dac81a5b881d1a19481c185cdd604a1b60448201526064015b60405180910390fd5b61085c630784ce0042613435565b83111561087b5760405162461bcd60e51b8152600401610845906132d2565b8961088a6301e133808261344d565b96508b6108e7576301e133806108a362093a808361349f565b6108ad919061344d565b94506108bc62093a80856135e2565b9150426108cc62093a80866135e2565b6108d691906135a3565b6108e0908861349f565b95506108fe565b6108f142856135a3565b6108fb908861349f565b95505b600086600f0b1361090e57600095505b61091885876133bb565b8c99509750899250509397509397509397509397565b600061093942611716565b905090565b600260655414156109615760405162461bcd60e51b815260040161084590613384565b6002606555336000818152609d60209081526040918290208251608081018452815460ff80821615158352610100820416151593820193909352620100009092046001600160801b0316928201839052600101546060820152906109d75760405162461bcd60e51b815260040161084590613309565b8060200151610a205760405162461bcd60e51b8152602060048201526015602482015274139bc818dbdbdb191bdddb881a5b9a5d1a585d1959605a1b6044820152606401610845565b8060600151421015610a685760405162461bcd60e51b81526020600482015260116024820152702637b1b5903737ba1032bc3834b932b21760791b6044820152606401610845565b6040818101516001600160a01b0384166000818152609d6020818152858320865160808082018952825460ff80821615158452610100808304909116151584870152620100008083046001600160801b03908116868e01526001870180546060808901919091528e519687018f528b8752868a018c81529e87018c81529087018c81529c8c529990985293519b51975161ffff199093169b151561ff0019169b909b17961515029590951762010000600160901b0319169481169098029390931790559251909255609880549394929392851691610b4683856135e2565b9091555050604080516080810182526000808252602082018190529181018290526060810191909152610b7c9086908490611eae565b609954610b9c906001600160a01b0316866001600160801b03861661238c565b604080516001600160801b03851681524260208201526001600160a01b038716917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a26098546040805183815260208101929092527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c910160405180910390a150506001606555505050565b60026065541415610c545760405162461bcd60e51b815260040161084590613384565b6002606555336000818152609d60209081526040918290208251608081018452815460ff808216151583526101008204161515938201939093526001600160801b03620100009093048316938101939093526001015460608301528316610cf75760405162461bcd60e51b815260206004820152601760248201527643616e6e6f74206465706f736974203020746f6b656e7360481b6044820152606401610845565b600081604001516001600160801b031611610d245760405162461bcd60e51b815260040161084590613309565b8051610d7c57806020015115610d7c5760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206465706f73697420647572696e6720636f6f6c646f776e00006044820152606401610845565b42816060015111610d9f5760405162461bcd60e51b8152600401610845906132a2565b610db882826000015183602001518660008660026123ef565b5050600160655550565b6001600160a01b0382166000908152609f60205260408120548190815b6080811015610e7057818310610df457610e70565b60006002610e028486613435565b610e0d906001613435565b610e17919061348b565b6001600160a01b0388166000908152609e602090815260408083208484529091529020600301549091508610610e4f57809350610e5d565b610e5a6001826135e2565b92505b5080610e6881613660565b915050610ddf565b506001600160a01b0385166000908152609e602090815260408083208584528252808320815160a0810183528154600f81810b810b810b8352600160801b909104810b810b810b948201949094526001820154840b840b90930b9183019190915260028101546060830152600301546080820152609a549091610ef387836125fa565b6000818152609b60209081526040808320815160a0810183528154600f81810b810b810b8352600160801b909104810b810b810b948201949094526001820154840b840b90930b91830191909152600281015460608301526003015460808201529192508084841015611004576000609b81610f70876001613435565b81526020808201929092526040908101600020815160a0810183528154600f81810b810b810b8352600160801b909104810b810b810b948201949094526001820154840b840b90930b9183019190915260028101546060830152600301546080808301829052860151919250610fe691906135e2565b925083606001518160600151610ffc91906135e2565b915050611028565b6080830151611013908b6135e2565b915082606001514261102591906135e2565b90505b60608301518215611065578284608001518c61104491906135e2565b61104e9084613534565b611058919061348b565b6110629082613435565b90505b606087015161107490826135a3565b8760200151611083919061349f565b87518890611092908390613553565b600f90810b810b90915288516000910b121590506110af57600087525b6040870151875188906110c39083906133bb565b600f90810b810b909152975190970b9c9b505050505050505050505050565b609780546110ef90613625565b80601f016020809104026020016040519081016040528092919081815260200182805461111b90613625565b80156111685780601f1061113d57610100808354040283529160200191611168565b820191906000526020600020905b81548152906001019060200180831161114b57829003601f168201915b505050505081565b60006107d782426106ce565b6033546001600160a01b031633146111d65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610845565b6111e0600061267c565b565b336000818152609d602090815260408083208151608081018352815460ff80821615158352610100820416151594820194909452620100009093046001600160801b0316918301919091526001015460608201529062093a80611245818661348b565b61124f9190613534565b9050600082604001516001600160801b03161161127e5760405162461bcd60e51b815260040161084590613309565b81516112cf578160200151156112cf5760405162461bcd60e51b81526020600482015260166024820152752232b837b9b4ba1034b99034b71031b7b7b63237bbb760511b6044820152606401610845565b428260600151116112f25760405162461bcd60e51b8152600401610845906132a2565b816060015181116113455760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006044820152606401610845565b611353630784ce0042613435565b8111156113725760405162461bcd60e51b8152600401610845906132d2565b61138b83836000015184602001516000858760036123ef565b50505050565b61139f62093a806001613534565b81565b6000438211156113b157600080fd5b609a5460006113c084836125fa565b6000818152609b60209081526040808320815160a0810183528154600f81810b810b810b8352600160801b909104810b810b810b948201949094526001820154840b840b90930b9183019190915260028101546060830152600301546080820152919250838310156114f1576000609b8161143c866001613435565b81526020808201929092526040908101600020815160a0810183528154600f81810b810b810b8352600160801b909104810b810b810b948201949094526001820154840b840b90930b91830191909152600281015460608301526003015460808083018290528501519192506114b291906135e2565b836060015182606001516114c691906135e2565b60808501516114d5908a6135e2565b6114df9190613534565b6114e9919061348b565b915050611540565b4382608001511461154057608082015161150b90436135e2565b606083015161151a90426135e2565b608084015161152990896135e2565b6115339190613534565b61153d919061348b565b90505b611559828284606001516115549190613435565b6126ce565b9695505050505050565b600260655414156115865760405162461bcd60e51b815260040161084590613384565b60026065556001600160a01b0382166000908152609d60209081526040918290208251608081018452815460ff808216151583526101008204161515938201939093526001600160801b036201000090930483169381019390935260010154606083015282166116325760405162461bcd60e51b815260206004820152601760248201527643616e6e6f74206465706f736974203020746f6b656e7360481b6044820152606401610845565b600081604001516001600160801b0316116116825760405162461bcd60e51b815260206004820152601060248201526f4e6f206578697374696e67206c6f636b60801b6044820152606401610845565b80516116da578060200151156116da5760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206465706f73697420647572696e6720636f6f6c646f776e00006044820152606401610845565b428160600151116116fd5760405162461bcd60e51b8152600401610845906132a2565b610db883826000015183602001518560008660006123ef565b600080611722836127f4565b6000818152609b6020908152604091829020825160a0810184528154600f81810b810b810b8352600160801b909104810b810b810b938201939093526001820154830b830b90920b9282019290925260028201546060820152600390910154608082015290915061179381856126ce565b949350505050565b6117a3612883565b50609a5460408051338152602081019290925280517fb2f2e419d90cdd327434f0dcf95856b4393cdeca3bb6506d39d9619e2572a55d9281900390910190a1565b336000818152609d60209081526040918290208251608081018452815460ff80821615158352610100820416151593820193909352620100009092046001600160801b0316928201839052600101546060820152906118555760405162461bcd60e51b815260040161084590613309565b8060200151156118a75760405162461bcd60e51b815260206004820152601a60248201527f436f6f6c646f776e20616c726561647920696e697469617465640000000000006044820152606401610845565b6118b562093a806001613534565b81606001516118c491906135e2565b4210156119135760405162461bcd60e51b815260206004820152601a60248201527f43616e206e6f7420696e69746961746520636f6f6c20646f776e0000000000006044820152606401610845565b600062093a8080611925816001613534565b61192f9042613435565b611939919061348b565b6119439190613534565b905061195b83836000015160016000858760046123ef565b505050565b600260655414156119835760405162461bcd60e51b815260040161084590613384565b600260655533600062093a80611999818661348b565b6119a39190613534565b6001600160a01b0383166000908152609d60209081526040918290208251608081018452815460ff808216151583526101008204161515938201939093526001600160801b0362010000909304831693810193909352600101546060830152919250908616611a4b5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74206c6f636b203020746f6b656e7360601b6044820152606401610845565b60408101516001600160801b031615611aa65760405162461bcd60e51b815260206004820152601960248201527f5769746864726177206f6c6420746f6b656e73206669727374000000000000006044820152606401610845565b428211611aef5760405162461bcd60e51b815260206004820152601760248201527610d85b9b9bdd081b1bd8dac81a5b881d1a19481c185cdd604a1b6044820152606401610845565b611afd630784ce0042613435565b821115611b1c5760405162461bcd60e51b8152600401610845906132d2565b611b2c83858689868660016123ef565b5050600160655550505050565b6033546001600160a01b03163314611b935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610845565b6001600160a01b038116611bf85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610845565b611c018161267c565b50565b600054610100900460ff16611c1f5760005460ff1615611c23565b303b155b611c865760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610845565b600054610100900460ff16158015611ca8576000805461ffff19166101011790555b6001600160a01b038316611cf55760405162461bcd60e51b81526020600482015260146024820152735f535041206973207a65726f206164647265737360601b6044820152606401610845565b611cfd612c35565b611d05612c64565b609980546001600160a01b0319166001600160a01b0385161790558151611d33906097906020850190612f7e565b5060008052609b602052437f10afac9233b4ccc54d6404ffc1cf3b47515a2b8edbf675d15eddce05a027dcc055427f10afac9233b4ccc54d6404ffc1cf3b47515a2b8edbf675d15eddce05a027dcbf55801561195b576000805461ff0019169055505050565b6001600160a01b0381166000908152609f602052604081205480611dc05750600092915050565b6001600160a01b039092166000908152609e602090815260408083209483529390529190912054600160801b9004600f0b919050565b6001600160a01b0382166000908152609f60205260408120548190815b6080811015611ea457818310611e2857611ea4565b60006002611e368486613435565b611e41906001613435565b611e4b919061348b565b6001600160a01b0388166000908152609e602090815260408083208484529091529020600201549091508610611e8357809350611e91565b611e8e6001826135e2565b92505b5080611e9c81613660565b915050611e13565b5090949350505050565b6040805160a0808201835260008083526020808401829052838501829052606080850183905260808086018490528651948501875283855291840183905283860183905283018290528201819052928501519192909181906001600160801b031615611fb65760408601516020870151611f65576301e13380611f3462093a808361349f565b611f3e919061344d565b600f90810b900b604086015260608701805162093a809190611f619083906135e2565b9052505b4287606001511115611fb457611f7f6301e133808261344d565b600f90810b900b60208601526060870151611f9b9042906135a3565b8560200151611faa919061349f565b600f90810b900b85525b505b428560600151118015611fd65750600085604001516001600160801b0316115b1561207d576040850151602086015161202c576301e13380611ffb62093a808361349f565b612005919061344d565b600f90810b900b604085015260608601805162093a8091906120289083906135e2565b9052505b428660600151111561207b576120466301e133808261344d565b600f90810b900b602085015260608601516120629042906135a3565b8460200151612071919061349f565b600f90810b900b84525b505b6060808701516000908152609c602052604090205490860151600f9190910b9250156120bc575060608401516000908152609c6020526040902054600f0b5b60006120c6612883565b9050846020015184602001516120dc9190613553565b816020018181516120ed91906133bb565b600f90810b900b905250845184516121059190613553565b815182906121149083906133bb565b600f90810b900b905250604080860151908501516121329190613553565b8160400181815161214391906133bb565b600f90810b810b90915260208301516000910b1215905061216657600060208201525b60008160000151600f0b121561217b57600081525b609a546000908152609b6020908152604091829020835191840151600f92830b6001600160801b03908116600160801b92850b821692909202919091178255928401516001820180546001600160801b0319169190930b9093169290921790556060808301516002830155608083015160039092019190915587015142101561226257602085015161220d90846133bb565b925086606001518660600151141561223157602084015161222e9084613553565b92505b60608701516000908152609c6020526040902080546001600160801b0319166001600160801b03600f86900b161790555b42866060015111156122c0578660600151866060015111156122c057602084015161228d9083613553565b60608701516000908152609c6020526040902080546001600160801b0319166001600160801b03600f84900b1617905591505b6001600160a01b0388166000908152609f60205260408120546122e4906001613435565b6001600160a01b039099166000818152609f602090815260408083208d90554260608a019081524360808b01908152948452609e83528184209d84529c825291829020885191890151600f90810b6001600160801b03908116600160801b0293820b811693909317825598909201516001830180549190990b9091166001600160801b0319919091161790965598516002860155505095516003909201919091555050505050565b6040516001600160a01b03831660248201526044810182905261195b90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612c93565b6001600160a01b0387166000908152609d602090815260408083208151608081018352815460ff808216151583526101008204161515948201949094526001600160801b036201000090940484169281019290925260010154606082015260988054919391928816916124628385613435565b92505081905550858260400181815161247b919061340a565b6001600160801b03169052508715158252861515602083015284156124a257606082018590525b6001600160a01b0389166000908152609d60209081526040918290208451815492860151938601516001600160801b0316620100000262010000600160901b03199415156101000261ff00199215159290921661ffff19909416939093171792909216178155606083015160019091015561251e898584611eae565b6001600160801b0386161561254e5761254e336099546001600160a01b031690306001600160801b038a16612d65565b8160600151896001600160a01b031684600481111561256f5761256f6136a7565b604080518c151581526001600160801b038b1660208201527f9a7b21c193646897f8def2fc65f28a8f447f652977be32b571ce38ce787529a7910160405180910390a46098546040805183815260208101929092527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c910160405180910390a1505050505050505050565b60008082815b6080811015611ea45781831061261557611ea4565b600060026126238486613435565b61262e906001613435565b612638919061348b565b6000818152609b6020526040902060030154909150871061265b57809350612669565b6126666001826135e2565b92505b508061267481613660565b915050612600565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080839050600062093a808083606001516126ea919061348b565b6126f49190613534565b905060005b60ff8110156127b25761270f62093a8083613435565b915060008583111561272357859250612737565b506000828152609c6020526040902054600f0b5b606084015161274690846135a3565b8460200151612755919061349f565b84518590612764908390613553565b600f90810b900b9052508286141561277c57506127b2565b808460200181815161278e91906133bb565b600f90810b900b9052505060608301829052806127aa81613660565b9150506126f9565b5060008260000151600f0b12156127c857600082525b6040820151825183906127dc9083906133bb565b600f90810b810b909152925190920b95945050505050565b609a546000908190815b608081101561287a578183106128135761287a565b600060026128218486613435565b61282c906001613435565b612836919061348b565b6000818152609b6020526040902060020154909150861061285957809350612867565b6128646001826135e2565b92505b508061287281613660565b9150506127fe565b50909392505050565b6040805160a080820183526000808352602080840182905283850182905260608085018390526080948501839052609a5486518086018852848152808401859052808801859052428184018190524382890181905289519788018a52868852948701869052978601949094529084019590955292820192909252909190811561299e57506000818152609b60208181526040808420815160a080820184528254600f81810b810b810b808552600160801b909204810b810b810b8488018190526001860154820b820b90910b8487018190526002860154606080870182905260039097015460808088018290529b8d905299895287519485018852928452968301529381019490945290830191909152928101919091529092505b60608301516000428210156129ea5760608501516129bc90426135e2565b60808601516129cb90436135e2565b6129dd90670de0b6b3a7640000613534565b6129e7919061348b565b90505b600062093a806129fa818561348b565b612a049190613534565b905060005b60ff811015612c2557612a1f62093a8083613435565b9150600042831115612a3357429250612a47565b506000828152609c6020526040902054600f0b5b612a5185846135a3565b8860200151612a60919061349f565b88518990612a6f908390613553565b600f90810b900b905250602088018051829190612a8d9083906133bb565b600f90810b810b90915289516000910b12159050612aaa57600088525b60008860200151600f0b1215612ac257600060208901525b60608089018490528601519294508492670de0b6b3a764000090612ae690856135e2565b612af09086613534565b612afa919061348b565b8660800151612b099190613435565b6080890152612b19600188613435565b965042831415612ba0575043608088019081526000878152609b60209081526040918290208a51918b0151600f92830b6001600160801b03908116600160801b92850b821692909202919091178255928b01516001820180546001600160801b0319169190930b909316929092179055606089015160028201559051600390910155612c25565b506000868152609b60209081526040918290208951918a0151600f92830b6001600160801b03908116600160801b92850b821692909202919091178255928a01516001820180546001600160801b0319169190930b90931692909217905560608801516002820155608088015160039091015580612c1d81613660565b915050612a09565b505083609a819055505050505090565b600054610100900460ff16612c5c5760405162461bcd60e51b815260040161084590613339565b6111e0612d9d565b600054610100900460ff16612c8b5760405162461bcd60e51b815260040161084590613339565b6111e0612dcd565b6000612ce8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612dfb9092919063ffffffff16565b80519091501561195b5780806020019051810190612d069190613184565b61195b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610845565b6040516001600160a01b038085166024830152831660448201526064810182905261138b9085906323b872dd60e01b906084016123b8565b600054610100900460ff16612dc45760405162461bcd60e51b815260040161084590613339565b6111e03361267c565b600054610100900460ff16612df45760405162461bcd60e51b815260040161084590613339565b6001606555565b6060612e0a8484600085612e14565b90505b9392505050565b606082471015612e755760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610845565b6001600160a01b0385163b612ecc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610845565b600080866001600160a01b03168587604051612ee89190613253565b60006040518083038185875af1925050503d8060008114612f25576040519150601f19603f3d011682016040523d82523d6000602084013e612f2a565b606091505b5091509150612f3a828286612f45565b979650505050505050565b60608315612f54575081612e0d565b825115612f645782518084602001fd5b8160405162461bcd60e51b8152600401610845919061326f565b828054612f8a90613625565b90600052602060002090601f016020900481019282612fac5760008555612ff2565b82601f10612fc557805160ff1916838001178555612ff2565b82800160010185558215612ff2579182015b82811115612ff2578251825591602001919060010190612fd7565b50612ffe929150613002565b5090565b5b80821115612ffe5760008155600101613003565b80356001600160a01b038116811461302e57600080fd5b919050565b80356001600160801b038116811461302e57600080fd5b60006020828403121561305c57600080fd5b612e0d82613017565b6000806040838503121561307857600080fd5b61308183613017565b9150602083013567ffffffffffffffff8082111561309e57600080fd5b818501915085601f8301126130b257600080fd5b8135818111156130c4576130c46136bd565b604051601f8201601f19908116603f011681019083821181831017156130ec576130ec6136bd565b8160405282815288602084870101111561310557600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000806040838503121561313a57600080fd5b61314383613017565b915061315160208401613033565b90509250929050565b6000806040838503121561316d57600080fd5b61317683613017565b946020939093013593505050565b60006020828403121561319657600080fd5b8151612e0d816136d3565b6000806000606084860312156131b657600080fd5b83356131c1816136d3565b92506131cf60208501613033565b9150604084013590509250925092565b6000602082840312156131f157600080fd5b612e0d82613033565b60008060006060848603121561320f57600080fd5b61321884613033565b925060208401359150604084013561322f816136d3565b809150509250925092565b60006020828403121561324c57600080fd5b5035919050565b600082516132658184602087016135f9565b9190910192915050565b602081526000825180602084015261328e8160408501602087016135f9565b601f01601f19169190910160400192915050565b6020808252601690820152754c6f636b20657870697265642e20576974686472617760501b604082015260600190565b6020808252601e908201527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000604082015260600190565b602080825260169082015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600081600f0b83600f0b600082128260016001607f1b03038213811516156133e5576133e561367b565b8260016001607f1b03190382128116156134015761340161367b565b50019392505050565b60006001600160801b0380831681851680830382111561342c5761342c61367b565b01949350505050565b600082198211156134485761344861367b565b500190565b600081600f0b83600f0b8061346457613464613691565b60016001607f1b03198214600019821416156134825761348261367b565b90059392505050565b60008261349a5761349a613691565b500490565b600081600f0b83600f0b60016001607f1b036000821360008413838304851182821616156134cf576134cf61367b565b60016001607f1b031960008512828116878305871216156134f2576134f261367b565b6000871292508582058712848416161561350e5761350e61367b565b858505871281841616156135245761352461367b565b5050509290910295945050505050565b600081600019048311821515161561354e5761354e61367b565b500290565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561357e5761357e61367b565b8160016001607f1b030183138116156135995761359961367b565b5090039392505050565b60008083128015600160ff1b8501841216156135c1576135c161367b565b6001600160ff1b03840183138116156135dc576135dc61367b565b50500390565b6000828210156135f4576135f461367b565b500390565b60005b838110156136145781810151838201526020016135fc565b8381111561138b5750506000910152565b600181811c9082168061363957607f821691505b6020821081141561365a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136745761367461367b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611c0157600080fdfea264697066735822122019385ccc1ebef63e604e938ce163d9255f448afbd305a1894f320bb246a0e05064736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023c5760003560e01c806381fc83bb1161013b578063c2c4c5c1116100b8578063f2fde38b1161007c578063f2fde38b14610668578063f399e22e1461067b578063f3a6d6081461068e578063f4359ce5146106a1578063f52a36f7146106ab57600080fd5b8063c2c4c5c114610601578063cd48098e14610609578063e2c5b4d214610611578063ebc65dbd1461064a578063eda2108d1461065d57600080fd5b8063911dcf5c116100ff578063911dcf5c1461058757806395d89b41146105a4578063981b24d0146105c85780639a3f14f7146105db578063bd85b039146105ee57600080fd5b806381fc83bb146104fe5780638ad4c4471461051e5780638da5cb5b146105655780638ff07b5b14610576578063900cf0cf1461057e57600080fd5b80633ccfd60b116101c9578063538daac41161018d578063538daac41461049d57806354fd4d50146104c857806370a08231146104d0578063715018a6146104e35780637c616fe6146104eb57600080fd5b80633ccfd60b1461043857806344e83ccf146104425780634deafcae1461044b5780634e3430ca146104775780634ee2cd7e1461048a57600080fd5b806306fdde031161021057806306fdde031461034b57806318160ddd14610386578063269499841461038e578063313ce5671461039957806334d901a4146103b357600080fd5b8062fdd58e14610241578063034a2c36146102675780630483a7f6146102c4578063059f8b161461033c575b600080fd5b61025461024f36600461315a565b6106ce565b6040519081526020015b60405180910390f35b61027a6102753660046131a1565b6107dd565b604080519815158952600f97880b60208a015295870b9588019590955292850b6060870152930b608085015260a084019290925260c083019190915260e08201526101000161025e565b61030b6102d236600461304a565b609d602052600090815260409020805460019091015460ff80831692610100810490911691620100009091046001600160801b03169084565b60405161025e9493929190931515845291151560208401526001600160801b03166040830152606082015260800190565b610254670de0b6b3a764000081565b6103796040518060400160405280600f81526020016e566f74652d657363726f772053504160881b81525081565b60405161025e919061326f565b61025461092e565b610254630784ce0081565b6103a1601281565b60405160ff909116815260200161025e565b6104056103c136600461315a565b609e6020908152600092835260408084209091529082529020805460018201546002830154600390930154600f83810b94600160801b909404810b9392900b919085565b60408051600f96870b815294860b60208601529290940b918301919091526060820152608081019190915260a00161025e565b61044061093e565b005b61025460985481565b61025461045936600461304a565b6001600160a01b03166000908152609d602052604090206001015490565b6104406104853660046131df565b610c31565b61025461049836600461315a565b610dc2565b6099546104b0906001600160a01b031681565b6040516001600160a01b03909116815260200161025e565b6103796110e2565b6102546104de36600461304a565b611170565b61044061117c565b6104406104f936600461323a565b6111e2565b61025461050c36600461304a565b609f6020526000908152604090205481565b61040561052c36600461323a565b609b602052600090815260409020805460018201546002830154600390930154600f83810b94600160801b909404810b9392900b919085565b6033546001600160a01b03166104b0565b610254611391565b610254609a5481565b61059162093a8081565b604051600f9190910b815260200161025e565b61037960405180604001604052806005815260200164766553504160d81b81525081565b6102546105d636600461323a565b6113a2565b6104406105e9366004613127565b611563565b6102546105fc36600461323a565b611716565b61044061179b565b6104406117e4565b61025461061f36600461315a565b6001600160a01b03919091166000908152609e60209081526040808320938352929052206002015490565b6104406106583660046131fa565b611960565b6105916301e1338081565b61044061067636600461304a565b611b39565b610440610689366004613065565b611c04565b61059161069c36600461304a565b611d99565b61025462093a8081565b6105916106b936600461323a565b609c60205260009081526040902054600f0b81565b6000806106db8484611df6565b9050806106ec5760009150506107d7565b6001600160a01b0384166000908152609e60209081526040808320848452825291829020825160a0810184528154600f81810b810b810b8352600160801b909104810b810b810b938201939093526001820154830b830b90920b9282019290925260028201546060820181905260039092015460808201529061076f90856135a3565b816020015161077e919061349f565b8151829061078d908390613553565b600f90810b810b90915282516000910b121590506107aa57600081525b6040810151815182906107be9083906133bb565b600f90810b810b909152915190910b92506107d7915050565b92915050565b60008080808080808062093a806107f4818b61348b565b6107fe9190613534565b925042831161084e5760405162461bcd60e51b815260206004820152601760248201527610d85b9b9bdd081b1bd8dac81a5b881d1a19481c185cdd604a1b60448201526064015b60405180910390fd5b61085c630784ce0042613435565b83111561087b5760405162461bcd60e51b8152600401610845906132d2565b8961088a6301e133808261344d565b96508b6108e7576301e133806108a362093a808361349f565b6108ad919061344d565b94506108bc62093a80856135e2565b9150426108cc62093a80866135e2565b6108d691906135a3565b6108e0908861349f565b95506108fe565b6108f142856135a3565b6108fb908861349f565b95505b600086600f0b1361090e57600095505b61091885876133bb565b8c99509750899250509397509397509397509397565b600061093942611716565b905090565b600260655414156109615760405162461bcd60e51b815260040161084590613384565b6002606555336000818152609d60209081526040918290208251608081018452815460ff80821615158352610100820416151593820193909352620100009092046001600160801b0316928201839052600101546060820152906109d75760405162461bcd60e51b815260040161084590613309565b8060200151610a205760405162461bcd60e51b8152602060048201526015602482015274139bc818dbdbdb191bdddb881a5b9a5d1a585d1959605a1b6044820152606401610845565b8060600151421015610a685760405162461bcd60e51b81526020600482015260116024820152702637b1b5903737ba1032bc3834b932b21760791b6044820152606401610845565b6040818101516001600160a01b0384166000818152609d6020818152858320865160808082018952825460ff80821615158452610100808304909116151584870152620100008083046001600160801b03908116868e01526001870180546060808901919091528e519687018f528b8752868a018c81529e87018c81529087018c81529c8c529990985293519b51975161ffff199093169b151561ff0019169b909b17961515029590951762010000600160901b0319169481169098029390931790559251909255609880549394929392851691610b4683856135e2565b9091555050604080516080810182526000808252602082018190529181018290526060810191909152610b7c9086908490611eae565b609954610b9c906001600160a01b0316866001600160801b03861661238c565b604080516001600160801b03851681524260208201526001600160a01b038716917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a26098546040805183815260208101929092527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c910160405180910390a150506001606555505050565b60026065541415610c545760405162461bcd60e51b815260040161084590613384565b6002606555336000818152609d60209081526040918290208251608081018452815460ff808216151583526101008204161515938201939093526001600160801b03620100009093048316938101939093526001015460608301528316610cf75760405162461bcd60e51b815260206004820152601760248201527643616e6e6f74206465706f736974203020746f6b656e7360481b6044820152606401610845565b600081604001516001600160801b031611610d245760405162461bcd60e51b815260040161084590613309565b8051610d7c57806020015115610d7c5760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206465706f73697420647572696e6720636f6f6c646f776e00006044820152606401610845565b42816060015111610d9f5760405162461bcd60e51b8152600401610845906132a2565b610db882826000015183602001518660008660026123ef565b5050600160655550565b6001600160a01b0382166000908152609f60205260408120548190815b6080811015610e7057818310610df457610e70565b60006002610e028486613435565b610e0d906001613435565b610e17919061348b565b6001600160a01b0388166000908152609e602090815260408083208484529091529020600301549091508610610e4f57809350610e5d565b610e5a6001826135e2565b92505b5080610e6881613660565b915050610ddf565b506001600160a01b0385166000908152609e602090815260408083208584528252808320815160a0810183528154600f81810b810b810b8352600160801b909104810b810b810b948201949094526001820154840b840b90930b9183019190915260028101546060830152600301546080820152609a549091610ef387836125fa565b6000818152609b60209081526040808320815160a0810183528154600f81810b810b810b8352600160801b909104810b810b810b948201949094526001820154840b840b90930b91830191909152600281015460608301526003015460808201529192508084841015611004576000609b81610f70876001613435565b81526020808201929092526040908101600020815160a0810183528154600f81810b810b810b8352600160801b909104810b810b810b948201949094526001820154840b840b90930b9183019190915260028101546060830152600301546080808301829052860151919250610fe691906135e2565b925083606001518160600151610ffc91906135e2565b915050611028565b6080830151611013908b6135e2565b915082606001514261102591906135e2565b90505b60608301518215611065578284608001518c61104491906135e2565b61104e9084613534565b611058919061348b565b6110629082613435565b90505b606087015161107490826135a3565b8760200151611083919061349f565b87518890611092908390613553565b600f90810b810b90915288516000910b121590506110af57600087525b6040870151875188906110c39083906133bb565b600f90810b810b909152975190970b9c9b505050505050505050505050565b609780546110ef90613625565b80601f016020809104026020016040519081016040528092919081815260200182805461111b90613625565b80156111685780601f1061113d57610100808354040283529160200191611168565b820191906000526020600020905b81548152906001019060200180831161114b57829003601f168201915b505050505081565b60006107d782426106ce565b6033546001600160a01b031633146111d65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610845565b6111e0600061267c565b565b336000818152609d602090815260408083208151608081018352815460ff80821615158352610100820416151594820194909452620100009093046001600160801b0316918301919091526001015460608201529062093a80611245818661348b565b61124f9190613534565b9050600082604001516001600160801b03161161127e5760405162461bcd60e51b815260040161084590613309565b81516112cf578160200151156112cf5760405162461bcd60e51b81526020600482015260166024820152752232b837b9b4ba1034b99034b71031b7b7b63237bbb760511b6044820152606401610845565b428260600151116112f25760405162461bcd60e51b8152600401610845906132a2565b816060015181116113455760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006044820152606401610845565b611353630784ce0042613435565b8111156113725760405162461bcd60e51b8152600401610845906132d2565b61138b83836000015184602001516000858760036123ef565b50505050565b61139f62093a806001613534565b81565b6000438211156113b157600080fd5b609a5460006113c084836125fa565b6000818152609b60209081526040808320815160a0810183528154600f81810b810b810b8352600160801b909104810b810b810b948201949094526001820154840b840b90930b9183019190915260028101546060830152600301546080820152919250838310156114f1576000609b8161143c866001613435565b81526020808201929092526040908101600020815160a0810183528154600f81810b810b810b8352600160801b909104810b810b810b948201949094526001820154840b840b90930b91830191909152600281015460608301526003015460808083018290528501519192506114b291906135e2565b836060015182606001516114c691906135e2565b60808501516114d5908a6135e2565b6114df9190613534565b6114e9919061348b565b915050611540565b4382608001511461154057608082015161150b90436135e2565b606083015161151a90426135e2565b608084015161152990896135e2565b6115339190613534565b61153d919061348b565b90505b611559828284606001516115549190613435565b6126ce565b9695505050505050565b600260655414156115865760405162461bcd60e51b815260040161084590613384565b60026065556001600160a01b0382166000908152609d60209081526040918290208251608081018452815460ff808216151583526101008204161515938201939093526001600160801b036201000090930483169381019390935260010154606083015282166116325760405162461bcd60e51b815260206004820152601760248201527643616e6e6f74206465706f736974203020746f6b656e7360481b6044820152606401610845565b600081604001516001600160801b0316116116825760405162461bcd60e51b815260206004820152601060248201526f4e6f206578697374696e67206c6f636b60801b6044820152606401610845565b80516116da578060200151156116da5760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206465706f73697420647572696e6720636f6f6c646f776e00006044820152606401610845565b428160600151116116fd5760405162461bcd60e51b8152600401610845906132a2565b610db883826000015183602001518560008660006123ef565b600080611722836127f4565b6000818152609b6020908152604091829020825160a0810184528154600f81810b810b810b8352600160801b909104810b810b810b938201939093526001820154830b830b90920b9282019290925260028201546060820152600390910154608082015290915061179381856126ce565b949350505050565b6117a3612883565b50609a5460408051338152602081019290925280517fb2f2e419d90cdd327434f0dcf95856b4393cdeca3bb6506d39d9619e2572a55d9281900390910190a1565b336000818152609d60209081526040918290208251608081018452815460ff80821615158352610100820416151593820193909352620100009092046001600160801b0316928201839052600101546060820152906118555760405162461bcd60e51b815260040161084590613309565b8060200151156118a75760405162461bcd60e51b815260206004820152601a60248201527f436f6f6c646f776e20616c726561647920696e697469617465640000000000006044820152606401610845565b6118b562093a806001613534565b81606001516118c491906135e2565b4210156119135760405162461bcd60e51b815260206004820152601a60248201527f43616e206e6f7420696e69746961746520636f6f6c20646f776e0000000000006044820152606401610845565b600062093a8080611925816001613534565b61192f9042613435565b611939919061348b565b6119439190613534565b905061195b83836000015160016000858760046123ef565b505050565b600260655414156119835760405162461bcd60e51b815260040161084590613384565b600260655533600062093a80611999818661348b565b6119a39190613534565b6001600160a01b0383166000908152609d60209081526040918290208251608081018452815460ff808216151583526101008204161515938201939093526001600160801b0362010000909304831693810193909352600101546060830152919250908616611a4b5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74206c6f636b203020746f6b656e7360601b6044820152606401610845565b60408101516001600160801b031615611aa65760405162461bcd60e51b815260206004820152601960248201527f5769746864726177206f6c6420746f6b656e73206669727374000000000000006044820152606401610845565b428211611aef5760405162461bcd60e51b815260206004820152601760248201527610d85b9b9bdd081b1bd8dac81a5b881d1a19481c185cdd604a1b6044820152606401610845565b611afd630784ce0042613435565b821115611b1c5760405162461bcd60e51b8152600401610845906132d2565b611b2c83858689868660016123ef565b5050600160655550505050565b6033546001600160a01b03163314611b935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610845565b6001600160a01b038116611bf85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610845565b611c018161267c565b50565b600054610100900460ff16611c1f5760005460ff1615611c23565b303b155b611c865760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610845565b600054610100900460ff16158015611ca8576000805461ffff19166101011790555b6001600160a01b038316611cf55760405162461bcd60e51b81526020600482015260146024820152735f535041206973207a65726f206164647265737360601b6044820152606401610845565b611cfd612c35565b611d05612c64565b609980546001600160a01b0319166001600160a01b0385161790558151611d33906097906020850190612f7e565b5060008052609b602052437f10afac9233b4ccc54d6404ffc1cf3b47515a2b8edbf675d15eddce05a027dcc055427f10afac9233b4ccc54d6404ffc1cf3b47515a2b8edbf675d15eddce05a027dcbf55801561195b576000805461ff0019169055505050565b6001600160a01b0381166000908152609f602052604081205480611dc05750600092915050565b6001600160a01b039092166000908152609e602090815260408083209483529390529190912054600160801b9004600f0b919050565b6001600160a01b0382166000908152609f60205260408120548190815b6080811015611ea457818310611e2857611ea4565b60006002611e368486613435565b611e41906001613435565b611e4b919061348b565b6001600160a01b0388166000908152609e602090815260408083208484529091529020600201549091508610611e8357809350611e91565b611e8e6001826135e2565b92505b5080611e9c81613660565b915050611e13565b5090949350505050565b6040805160a0808201835260008083526020808401829052838501829052606080850183905260808086018490528651948501875283855291840183905283860183905283018290528201819052928501519192909181906001600160801b031615611fb65760408601516020870151611f65576301e13380611f3462093a808361349f565b611f3e919061344d565b600f90810b900b604086015260608701805162093a809190611f619083906135e2565b9052505b4287606001511115611fb457611f7f6301e133808261344d565b600f90810b900b60208601526060870151611f9b9042906135a3565b8560200151611faa919061349f565b600f90810b900b85525b505b428560600151118015611fd65750600085604001516001600160801b0316115b1561207d576040850151602086015161202c576301e13380611ffb62093a808361349f565b612005919061344d565b600f90810b900b604085015260608601805162093a8091906120289083906135e2565b9052505b428660600151111561207b576120466301e133808261344d565b600f90810b900b602085015260608601516120629042906135a3565b8460200151612071919061349f565b600f90810b900b84525b505b6060808701516000908152609c602052604090205490860151600f9190910b9250156120bc575060608401516000908152609c6020526040902054600f0b5b60006120c6612883565b9050846020015184602001516120dc9190613553565b816020018181516120ed91906133bb565b600f90810b900b905250845184516121059190613553565b815182906121149083906133bb565b600f90810b900b905250604080860151908501516121329190613553565b8160400181815161214391906133bb565b600f90810b810b90915260208301516000910b1215905061216657600060208201525b60008160000151600f0b121561217b57600081525b609a546000908152609b6020908152604091829020835191840151600f92830b6001600160801b03908116600160801b92850b821692909202919091178255928401516001820180546001600160801b0319169190930b9093169290921790556060808301516002830155608083015160039092019190915587015142101561226257602085015161220d90846133bb565b925086606001518660600151141561223157602084015161222e9084613553565b92505b60608701516000908152609c6020526040902080546001600160801b0319166001600160801b03600f86900b161790555b42866060015111156122c0578660600151866060015111156122c057602084015161228d9083613553565b60608701516000908152609c6020526040902080546001600160801b0319166001600160801b03600f84900b1617905591505b6001600160a01b0388166000908152609f60205260408120546122e4906001613435565b6001600160a01b039099166000818152609f602090815260408083208d90554260608a019081524360808b01908152948452609e83528184209d84529c825291829020885191890151600f90810b6001600160801b03908116600160801b0293820b811693909317825598909201516001830180549190990b9091166001600160801b0319919091161790965598516002860155505095516003909201919091555050505050565b6040516001600160a01b03831660248201526044810182905261195b90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612c93565b6001600160a01b0387166000908152609d602090815260408083208151608081018352815460ff808216151583526101008204161515948201949094526001600160801b036201000090940484169281019290925260010154606082015260988054919391928816916124628385613435565b92505081905550858260400181815161247b919061340a565b6001600160801b03169052508715158252861515602083015284156124a257606082018590525b6001600160a01b0389166000908152609d60209081526040918290208451815492860151938601516001600160801b0316620100000262010000600160901b03199415156101000261ff00199215159290921661ffff19909416939093171792909216178155606083015160019091015561251e898584611eae565b6001600160801b0386161561254e5761254e336099546001600160a01b031690306001600160801b038a16612d65565b8160600151896001600160a01b031684600481111561256f5761256f6136a7565b604080518c151581526001600160801b038b1660208201527f9a7b21c193646897f8def2fc65f28a8f447f652977be32b571ce38ce787529a7910160405180910390a46098546040805183815260208101929092527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c910160405180910390a1505050505050505050565b60008082815b6080811015611ea45781831061261557611ea4565b600060026126238486613435565b61262e906001613435565b612638919061348b565b6000818152609b6020526040902060030154909150871061265b57809350612669565b6126666001826135e2565b92505b508061267481613660565b915050612600565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080839050600062093a808083606001516126ea919061348b565b6126f49190613534565b905060005b60ff8110156127b25761270f62093a8083613435565b915060008583111561272357859250612737565b506000828152609c6020526040902054600f0b5b606084015161274690846135a3565b8460200151612755919061349f565b84518590612764908390613553565b600f90810b900b9052508286141561277c57506127b2565b808460200181815161278e91906133bb565b600f90810b900b9052505060608301829052806127aa81613660565b9150506126f9565b5060008260000151600f0b12156127c857600082525b6040820151825183906127dc9083906133bb565b600f90810b810b909152925190920b95945050505050565b609a546000908190815b608081101561287a578183106128135761287a565b600060026128218486613435565b61282c906001613435565b612836919061348b565b6000818152609b6020526040902060020154909150861061285957809350612867565b6128646001826135e2565b92505b508061287281613660565b9150506127fe565b50909392505050565b6040805160a080820183526000808352602080840182905283850182905260608085018390526080948501839052609a5486518086018852848152808401859052808801859052428184018190524382890181905289519788018a52868852948701869052978601949094529084019590955292820192909252909190811561299e57506000818152609b60208181526040808420815160a080820184528254600f81810b810b810b808552600160801b909204810b810b810b8488018190526001860154820b820b90910b8487018190526002860154606080870182905260039097015460808088018290529b8d905299895287519485018852928452968301529381019490945290830191909152928101919091529092505b60608301516000428210156129ea5760608501516129bc90426135e2565b60808601516129cb90436135e2565b6129dd90670de0b6b3a7640000613534565b6129e7919061348b565b90505b600062093a806129fa818561348b565b612a049190613534565b905060005b60ff811015612c2557612a1f62093a8083613435565b9150600042831115612a3357429250612a47565b506000828152609c6020526040902054600f0b5b612a5185846135a3565b8860200151612a60919061349f565b88518990612a6f908390613553565b600f90810b900b905250602088018051829190612a8d9083906133bb565b600f90810b810b90915289516000910b12159050612aaa57600088525b60008860200151600f0b1215612ac257600060208901525b60608089018490528601519294508492670de0b6b3a764000090612ae690856135e2565b612af09086613534565b612afa919061348b565b8660800151612b099190613435565b6080890152612b19600188613435565b965042831415612ba0575043608088019081526000878152609b60209081526040918290208a51918b0151600f92830b6001600160801b03908116600160801b92850b821692909202919091178255928b01516001820180546001600160801b0319169190930b909316929092179055606089015160028201559051600390910155612c25565b506000868152609b60209081526040918290208951918a0151600f92830b6001600160801b03908116600160801b92850b821692909202919091178255928a01516001820180546001600160801b0319169190930b90931692909217905560608801516002820155608088015160039091015580612c1d81613660565b915050612a09565b505083609a819055505050505090565b600054610100900460ff16612c5c5760405162461bcd60e51b815260040161084590613339565b6111e0612d9d565b600054610100900460ff16612c8b5760405162461bcd60e51b815260040161084590613339565b6111e0612dcd565b6000612ce8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612dfb9092919063ffffffff16565b80519091501561195b5780806020019051810190612d069190613184565b61195b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610845565b6040516001600160a01b038085166024830152831660448201526064810182905261138b9085906323b872dd60e01b906084016123b8565b600054610100900460ff16612dc45760405162461bcd60e51b815260040161084590613339565b6111e03361267c565b600054610100900460ff16612df45760405162461bcd60e51b815260040161084590613339565b6001606555565b6060612e0a8484600085612e14565b90505b9392505050565b606082471015612e755760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610845565b6001600160a01b0385163b612ecc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610845565b600080866001600160a01b03168587604051612ee89190613253565b60006040518083038185875af1925050503d8060008114612f25576040519150601f19603f3d011682016040523d82523d6000602084013e612f2a565b606091505b5091509150612f3a828286612f45565b979650505050505050565b60608315612f54575081612e0d565b825115612f645782518084602001fd5b8160405162461bcd60e51b8152600401610845919061326f565b828054612f8a90613625565b90600052602060002090601f016020900481019282612fac5760008555612ff2565b82601f10612fc557805160ff1916838001178555612ff2565b82800160010185558215612ff2579182015b82811115612ff2578251825591602001919060010190612fd7565b50612ffe929150613002565b5090565b5b80821115612ffe5760008155600101613003565b80356001600160a01b038116811461302e57600080fd5b919050565b80356001600160801b038116811461302e57600080fd5b60006020828403121561305c57600080fd5b612e0d82613017565b6000806040838503121561307857600080fd5b61308183613017565b9150602083013567ffffffffffffffff8082111561309e57600080fd5b818501915085601f8301126130b257600080fd5b8135818111156130c4576130c46136bd565b604051601f8201601f19908116603f011681019083821181831017156130ec576130ec6136bd565b8160405282815288602084870101111561310557600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000806040838503121561313a57600080fd5b61314383613017565b915061315160208401613033565b90509250929050565b6000806040838503121561316d57600080fd5b61317683613017565b946020939093013593505050565b60006020828403121561319657600080fd5b8151612e0d816136d3565b6000806000606084860312156131b657600080fd5b83356131c1816136d3565b92506131cf60208501613033565b9150604084013590509250925092565b6000602082840312156131f157600080fd5b612e0d82613033565b60008060006060848603121561320f57600080fd5b61321884613033565b925060208401359150604084013561322f816136d3565b809150509250925092565b60006020828403121561324c57600080fd5b5035919050565b600082516132658184602087016135f9565b9190910192915050565b602081526000825180602084015261328e8160408501602087016135f9565b601f01601f19169190910160400192915050565b6020808252601690820152754c6f636b20657870697265642e20576974686472617760501b604082015260600190565b6020808252601e908201527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000604082015260600190565b602080825260169082015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600081600f0b83600f0b600082128260016001607f1b03038213811516156133e5576133e561367b565b8260016001607f1b03190382128116156134015761340161367b565b50019392505050565b60006001600160801b0380831681851680830382111561342c5761342c61367b565b01949350505050565b600082198211156134485761344861367b565b500190565b600081600f0b83600f0b8061346457613464613691565b60016001607f1b03198214600019821416156134825761348261367b565b90059392505050565b60008261349a5761349a613691565b500490565b600081600f0b83600f0b60016001607f1b036000821360008413838304851182821616156134cf576134cf61367b565b60016001607f1b031960008512828116878305871216156134f2576134f261367b565b6000871292508582058712848416161561350e5761350e61367b565b858505871281841616156135245761352461367b565b5050509290910295945050505050565b600081600019048311821515161561354e5761354e61367b565b500290565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561357e5761357e61367b565b8160016001607f1b030183138116156135995761359961367b565b5090039392505050565b60008083128015600160ff1b8501841216156135c1576135c161367b565b6001600160ff1b03840183138116156135dc576135dc61367b565b50500390565b6000828210156135f4576135f461367b565b500390565b60005b838110156136145781810151838201526020016135fc565b8381111561138b5750506000910152565b600181811c9082168061363957607f821691505b6020821081141561365a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136745761367461367b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611c0157600080fdfea264697066735822122019385ccc1ebef63e604e938ce163d9255f448afbd305a1894f320bb246a0e05064736f6c63430008070033
Deployed Bytecode Sourcemap
1480:29195:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24900:644;;;;;;:::i;:::-;;:::i;:::-;;;16463:25:9;;;16451:2;16436:18;24900:644:8;;;;;;;;22877:1729;;;;;;:::i;:::-;;:::i;:::-;;;;5460:14:9;;5453:22;5435:41;;5523:2;5512:22;;;5507:2;5492:18;;5485:50;5571:22;;;5551:18;;;5544:50;;;;5630:22;;;5625:2;5610:18;;5603:50;5690:22;;5684:3;5669:19;;5662:51;5744:3;5729:19;;5722:35;;;;5788:3;5773:19;;5766:35;;;;5832:3;5817:19;;5810:35;5422:3;5407:19;22877:1729:8;5106:745:9;3805:55:8;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3805:55:8;;;;;;;;;;;;;4893:14:9;;4886:22;4868:41;;4952:14;;4945:22;4940:2;4925:18;;4918:50;-1:-1:-1;;;;;5004:47:9;4999:2;4984:18;;4977:75;5083:2;5068:18;;5061:34;4855:3;4840:19;;4649:452;3307:43:8;;3344:6;3307:43;;2987:47;;;;;;;;;;;;;;;-1:-1:-1;;;2987:47:8;;;;;;;;;;;;:::i;29385:114::-;;;:::i;3205:47::-;;3240:12;3205:47;;3085:35;;3118:2;3085:35;;;;;16924:4:9;16912:17;;;16894:36;;16882:2;16867:18;3085:35:8;16752:184:9;3883:69:8;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3883:69:8;;;;;;;;;;;;;;;;;6638:2:9;6627:22;;;6609:41;;6686:22;;;6681:2;6666:18;;6659:50;6745:22;;;;6725:18;;;6718:50;;;;6799:2;6784:18;;6777:34;6842:3;6827:19;;6820:35;;;;6596:3;6581:19;3883:69:8;6356:505:9;19300:1046:8;;;:::i;:::-;;3126:29;;;;;;5469:122;;;;;;:::i;:::-;-1:-1:-1;;;;;5560:20:8;5534:7;5560:20;;;:14;:20;;;;;:24;;;;5469:122;15960:952;;;;;;:::i;:::-;;:::i;26057:1684::-;;;;;;:::i;:::-;;:::i;3482:18::-;;;;;-1:-1:-1;;;;;3482:18:8;;;;;;-1:-1:-1;;;;;3946:32:9;;;3928:51;;3916:2;3901:18;3482::8;3782:203:9;2960:21:8;;;:::i;25701:128::-;;;;;;:::i;:::-;;:::i;1888:101:5:-;;;:::i;17032:1273:8:-;;;;;;:::i;:::-;;:::i;3986:58::-;;;;;;:::i;:::-;;;;;;;;;;;;;;3588:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3588:45:8;;;;;;;;;;;;;1256:85:5;1328:6;;-1:-1:-1;;;;;1328:6:5;1256:85;;3258:43:8;;;:::i;3562:20::-;;;;;;3419:57;;3192:7;3419:57;;;;;6333:2:9;6322:22;;;;6304:41;;6292:2;6277:18;3419:57:8;6160:191:9;3040:39:8;;;;;;;;;;;;;;;-1:-1:-1;;;3040:39:8;;;;;29705:968;;;;;;:::i;:::-;;:::i;13462:932::-;;;;;;:::i;:::-;;:::i;29029:230::-;;;;;;:::i;:::-;;:::i;13023:129::-;;;:::i;18382:810::-;;;:::i;5134:189::-;;;;;;:::i;:::-;-1:-1:-1;;;;;5286:22:8;;;;5256:7;5286:22;;;:16;:22;;;;;;;;:27;;;;;;;:30;;;;5134:189;14914:880;;;;;;:::i;:::-;;:::i;3356:57::-;;3403:8;3356:57;;2138:198:5;;;;;;:::i;:::-;;:::i;4075:409:8:-;;;;;;:::i;:::-;;:::i;4662:282::-;;;;;;:::i;:::-;;:::i;3161:38::-;;3192:7;3161:38;;3666:46;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24900:644;25007:7;25030:14;25047:33;25071:4;25077:2;25047:23;:33::i;:::-;25030:50;-1:-1:-1;25094:11:8;25090:448;;25128:1;25121:8;;;;;25090:448;-1:-1:-1;;;;;25185:22:8;;25160;25185;;;:16;:22;;;;;;;;:30;;;;;;;;;25160:55;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25160:55:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25304:33;;25311:2;25304:33;:::i;:::-;25263:9;:15;;;:75;;;;:::i;:::-;25229:109;;:9;;:109;;;;;:::i;:::-;;;;;;;;;;25356:14;;25373:1;25356:18;;;25352:75;;-1:-1:-1;25352:75:8;;25411:1;25394:18;;25352:75;25458:17;;;;25440:35;;25458:9;;25440:35;;25458:17;;25440:35;:::i;:::-;;;;;;;;;;25511:14;;25504:22;;;;-1:-1:-1;25489:38:8;;-1:-1:-1;;25489:38:8;24900:644;;;;;:::o;22877:1729::-;23052:4;;;;;;;;3192:7;23494:25;3192:7;23494:18;:25;:::i;:::-;23493:34;;;;:::i;:::-;23474:53;;23565:15;23546:16;:34;23538:70;;;;-1:-1:-1;;;23538:70:8;;8161:2:9;23538:70:8;;;8143:21:9;8200:2;8180:18;;;8173:30;-1:-1:-1;;;8219:18:9;;;8212:53;8282:18;;23538:70:8;;;;;;;;;23659:26;3240:12;23659:15;:26;:::i;:::-;23639:16;:46;;23618:123;;;;-1:-1:-1;;;23618:123:8;;;;;;;:::i;:::-;23772:5;23796:12;3403:8;23772:5;23796:12;:::i;:::-;23788:20;;23824:12;23819:439;;3403:8;23863:16;3192:7;23863:3;:16;:::i;:::-;23862:27;;;;:::i;:::-;23852:37;-1:-1:-1;23924:23:8;3192:7;23924:16;:23;:::i;:::-;23903:44;-1:-1:-1;24077:15:8;24043:23;3192:7;24043:16;:23;:::i;:::-;24036:57;;;;:::i;:::-;23984:127;;:5;:127;:::i;:::-;23961:150;;23819:439;;;24196:50;24230:15;24203:16;24196:50;:::i;:::-;24165:82;;:5;:82;:::i;:::-;24142:105;;23819:439;24279:1;24271:4;:9;;;24267:48;;24303:1;24296:8;;24267:48;24346:14;24353:7;24346:4;:14;:::i;:::-;24392:12;;-1:-1:-1;24324:36:8;-1:-1:-1;24539:18:8;;-1:-1:-1;;22877:1729:8;;;;;;;;;;;:::o;29385:114::-;29438:7;29464:28;29476:15;29464:11;:28::i;:::-;29457:35;;29385:114;:::o;19300:1046::-;1802:1:6;2556:7;;:19;;2548:63;;;;-1:-1:-1;;;2548:63:6;;;;;;;:::i;:::-;1802:1;2686:7;:18;916:10:1;19361:15:8::1;19440:23:::0;;;:14:::1;:23;::::0;;;;;;;;19401:62;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;;;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;;;;;19401:62:8::1;::::0;;;;;;;::::1;::::0;;;;;;19473:61:::1;;;;-1:-1:-1::0;;;19473:61:8::1;;;;;;;:::i;:::-;19552:15;:33;;;19544:67;;;::::0;-1:-1:-1;;;19544:67:8;;7456:2:9;19544:67:8::1;::::0;::::1;7438:21:9::0;7495:2;7475:18;;;7468:30;-1:-1:-1;;;7514:18:9;;;7507:51;7575:18;;19544:67:8::1;7254:345:9::0;19544:67:8::1;19648:15;:19;;;19629:15;:38;;19621:68;;;::::0;-1:-1:-1;;;19621:68:8;;11099:2:9;19621:68:8::1;::::0;::::1;11081:21:9::0;11138:2;11118:18;;;11111:30;-1:-1:-1;;;11157:18:9;;;11150:47;11214:18;;19621:68:8::1;10897:341:9::0;19621:68:8::1;19715:22;::::0;;::::1;::::0;-1:-1:-1;;;;;19782:23:8;::::1;19699:13;19782:23:::0;;;:14:::1;:23;::::0;;;;;;19748:57;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;;;::::0;;::::1;::::0;;::::1;::::0;;::::1;;;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;19748:57:8;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;19841:33;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;;;19815:23;;;;;;;:59;;;;;;-1:-1:-1;;19815:59:8;;;;::::1;;-1:-1:-1::0;;19815:59:8;;;;;;::::1;;;::::0;;;::::1;-1:-1:-1::0;;;;;;19815:59:8::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;;;;19905:14:::1;::::0;;19715:22;;19748:57;;19905:14;19929:23;::::1;::::0;::::1;::::0;19905:14;19929:23:::1;:::i;:::-;::::0;;;-1:-1:-1;;20138:33:8::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;20138:33:8;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;20105:67:::1;::::0;20117:7;;20126:10;;20105:11:::1;:67::i;:::-;20201:3;::::0;20183:51:::1;::::0;-1:-1:-1;;;;;20201:3:8::1;20219:7:::0;-1:-1:-1;;;;;20183:51:8;::::1;:35;:51::i;:::-;20249:41;::::0;;-1:-1:-1;;;;;16215:47:9;;16197:66;;20274:15:8::1;16294:2:9::0;16279:18;;16272:34;-1:-1:-1;;;;;20249:41:8;::::1;::::0;::::1;::::0;16170:18:9;20249:41:8::1;;;;;;;20324:14;::::0;20305:34:::1;::::0;;16673:25:9;;;16729:2;16714:18;;16707:34;;;;20305::8::1;::::0;16646:18:9;20305:34:8::1;;;;;;;-1:-1:-1::0;;1759:1:6;2859:7;:22;-1:-1:-1;;;19300:1046:8:o;15960:952::-;1802:1:6;2556:7;;:19;;2548:63;;;;-1:-1:-1;;;2548:63:6;;;;;;;:::i;:::-;1802:1;2686:7;:18;916:10:1;16040:15:8::1;16119:23:::0;;;:14:::1;:23;::::0;;;;;;;;16080:62;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;;;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;16080:62:8;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;;;16161:9;::::1;16153:45;;;::::0;-1:-1:-1;;;16153:45:8;;12211:2:9;16153:45:8::1;::::0;::::1;12193:21:9::0;12250:2;12230:18;;;12223:30;-1:-1:-1;;;12269:18:9;;;12262:53;12332:18;;16153:45:8::1;12009:347:9::0;16153:45:8::1;16241:1;16216:15;:22;;;-1:-1:-1::0;;;;;16216:26:8::1;;16208:61;;;;-1:-1:-1::0;;;16208:61:8::1;;;;;;;:::i;:::-;16285:28:::0;;16280:183:::1;;16355:15;:33;;;16354:34;16329:123;;;::::0;-1:-1:-1;;;16329:123:8;;10740:2:9;16329:123:8::1;::::0;::::1;10722:21:9::0;10779:2;10759:18;;;10752:30;10818:32;10798:18;;;10791:60;10868:18;;16329:123:8::1;10538:354:9::0;16329:123:8::1;16598:15;16576;:19;;;:37;16555:106;;;;-1:-1:-1::0;;;16555:106:8::1;;;;;;;:::i;:::-;16671:234;16696:7;16717:15;:28;;;16759:15;:33;;;16806:5;16825:1;16840:15;16869:26;16671:11;:234::i;:::-;-1:-1:-1::0;;1759:1:6;2859:7;:22;-1:-1:-1;15960:952:8:o;26057:1684::-;-1:-1:-1;;;;;26237:20:8;;26175:7;26237:20;;;:14;:20;;;;;;26175:7;;;26331:318;26355:3;26351:1;:7;26331:318;;;26390:3;26383;:10;26379:54;;26413:5;;26379:54;26446:11;26478:1;26461:9;26467:3;26461;:9;:::i;:::-;:13;;26473:1;26461:13;:::i;:::-;26460:19;;;;:::i;:::-;-1:-1:-1;;;;;26497:22:8;;;;;;:16;:22;;;;;;;;:27;;;;;;;;:31;;;26446:33;;-1:-1:-1;26497:46:8;-1:-1:-1;26493:146:8;;26569:3;26563:9;;26493:146;;;26617:7;26623:1;26617:3;:7;:::i;:::-;26611:13;;26493:146;-1:-1:-1;26360:3:8;;;;:::i;:::-;;;;26331:318;;;-1:-1:-1;;;;;;26741:22:8;;26719:19;26741:22;;;:16;:22;;;;;;;;:27;;;;;;;;26719:49;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26719:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26797:5;;26719:49;;26882:38;26898:11;26797:5;26882:15;:38::i;:::-;26930:19;26952:20;;;:12;:20;;;;;;;;26930:42;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26930:42:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26865:55;;-1:-1:-1;26930:19:8;27039:17;;;27035:290;;;27072:19;27094:12;27072:19;27107:10;:6;27116:1;27107:10;:::i;:::-;27094:24;;;;;;;;;;;;;;-1:-1:-1;27094:24:8;27072:46;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27072:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27154:10;;;27072:46;;-1:-1:-1;27141:23:8;;27154:10;27141:23;:::i;:::-;27132:32;;27195:6;:9;;;27183:6;:9;;;:21;;;;:::i;:::-;27178:26;;27058:157;27035:290;;;27258:10;;;;27244:24;;:11;:24;:::i;:::-;27235:33;;27305:6;:9;;;27287:15;:27;;;;:::i;:::-;27282:32;;27035:290;27355:9;;;;27378:11;;27374:97;;27454:6;27439;:10;;;27425:11;:24;;;;:::i;:::-;27419:31;;:2;:31;:::i;:::-;27418:42;;;;:::i;:::-;27405:55;;;;:::i;:::-;;;27374:97;27569:9;;;;27542:37;;27549:9;27542:37;:::i;:::-;27508:6;:12;;;:72;;;;:::i;:::-;27481:99;;:6;;:99;;;;;:::i;:::-;;;;;;;;;;27594:11;;27608:1;27594:15;;;27590:61;;-1:-1:-1;27590:61:8;;27639:1;27625:15;;27590:61;27675:14;;;;27660:29;;27675:6;;27660:29;;27675:14;;27660:29;:::i;:::-;;;;;;;;;;27721:11;;27714:19;;;;26057:1684;-1:-1:-1;;;;;;;;;;;;26057:1684:8:o;2960:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25701:128::-;25764:7;25790:32;25800:4;25806:15;25790:9;:32::i;1888:101:5:-;1328:6;;-1:-1:-1;;;;;1328:6:5;916:10:1;1468:23:5;1460:68;;;;-1:-1:-1;;;1460:68:5;;12922:2:9;1460:68:5;;;12904:21:9;;;12941:18;;;12934:30;13000:34;12980:18;;;12973:62;13052:18;;1460:68:5;12720:356:9;1460:68:5;1952:30:::1;1979:1;1952:18;:30::i;:::-;1888:101::o:0;17032:1273:8:-;916:10:1;17108:15:8;17187:23;;;:14;:23;;;;;;;;17148:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17148:62:8;;;;;;;;;;;;;;;;3192:7;17249:17;3192:7;17249:10;:17;:::i;:::-;17248:26;;;;:::i;:::-;17220:54;;17355:1;17330:15;:22;;;-1:-1:-1;;;;;17330:26:8;;17322:61;;;;-1:-1:-1;;;17322:61:8;;;;;;;:::i;:::-;17398:28;;17393:175;;17468:15;:33;;;17467:34;17442:115;;;;-1:-1:-1;;;17442:115:8;;15514:2:9;17442:115:8;;;15496:21:9;15553:2;15533:18;;;15526:30;-1:-1:-1;;;15572:18:9;;;15565:52;15634:18;;17442:115:8;15312:346:9;17442:115:8;17714:15;17692;:19;;;:37;17671:106;;;;-1:-1:-1;;;17671:106:8;;;;;;;:::i;:::-;17828:15;:19;;;17808:17;:39;17787:117;;;;-1:-1:-1;;;17787:117:8;;9275:2:9;17787:117:8;;;9257:21:9;9314:2;9294:18;;;9287:30;9353:33;9333:18;;;9326:61;9404:18;;17787:117:8;9073:355:9;17787:117:8;17956:26;3240:12;17956:15;:26;:::i;:::-;17935:17;:47;;17914:124;;;;-1:-1:-1;;;17914:124:8;;;;;;;:::i;:::-;18049:249;18074:7;18095:15;:28;;;18137:15;:33;;;18184:1;18199:17;18230:15;18259:29;18049:11;:249::i;:::-;17098:1207;;;17032:1273;:::o;3258:43::-;3293:8;3192:7;3293:1;:8;:::i;:::-;3258:43;:::o;29705:968::-;29813:7;29859:12;29844:11;:27;;29836:36;;;;;;29899:5;;29882:14;29936:36;29952:11;29899:5;29936:15;:36::i;:::-;29983:19;30005:25;;;:12;:25;;;;;;;;29983:47;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29983:47:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29914:58;;-1:-1:-1;30069:20:8;;;30065:489;;;30105:19;30127:12;30105:19;30140:15;:11;30154:1;30140:15;:::i;:::-;30127:29;;;;;;;;;;;;;;-1:-1:-1;30127:29:8;30105:51;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30105:51:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30278:10;;;30105:51;;-1:-1:-1;30265:23:8;;30278:10;30265:23;:::i;:::-;30234:6;:9;;;30222:6;:9;;;:21;;;;:::i;:::-;30207:10;;;;30193:24;;:11;:24;:::i;:::-;30192:52;;;;:::i;:::-;30191:98;;;;:::i;:::-;30170:119;;30091:209;30065:489;;;30338:12;30324:6;:10;;;:26;30320:224;;30518:10;;;;30503:25;;:12;:25;:::i;:::-;30468:9;;;;30450:27;;:15;:27;:::i;:::-;30411:10;;;;30397:24;;:11;:24;:::i;:::-;30396:82;;;;:::i;:::-;30395:134;;;;:::i;:::-;30370:159;;30320:224;30634:32;30643:6;30663:2;30651:6;:9;;;:14;;;;:::i;:::-;30634:8;:32::i;:::-;30627:39;29705:968;-1:-1:-1;;;;;;29705:968:8:o;13462:932::-;1802:1:6;2556:7;;:19;;2548:63;;;;-1:-1:-1;;;2548:63:6;;;;;;;:::i;:::-;1802:1;2686:7;:18;-1:-1:-1;;;;;13619:20:8;::::1;13580:36;13619:20:::0;;;:14:::1;:20;::::0;;;;;;;;13580:59;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;;;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;13580:59:8;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;;;13657:9;::::1;13649:45;;;::::0;-1:-1:-1;;;13649:45:8;;12211:2:9;13649:45:8::1;::::0;::::1;12193:21:9::0;12250:2;12230:18;;;12223:30;-1:-1:-1;;;12269:18:9;;;12262:53;12332:18;;13649:45:8::1;12009:347:9::0;13649:45:8::1;13737:1;13712:15;:22;;;-1:-1:-1::0;;;;;13712:26:8::1;;13704:55;;;::::0;-1:-1:-1;;;13704:55:8;;14758:2:9;13704:55:8::1;::::0;::::1;14740:21:9::0;14797:2;14777:18;;;14770:30;-1:-1:-1;;;14816:18:9;;;14809:46;14872:18;;13704:55:8::1;14556:340:9::0;13704:55:8::1;13775:28:::0;;13770:183:::1;;13845:15;:33;;;13844:34;13819:123;;;::::0;-1:-1:-1;;;13819:123:8;;10740:2:9;13819:123:8::1;::::0;::::1;10722:21:9::0;10779:2;10759:18;;;10752:30;10818:32;10798:18;;;10791:60;10868:18;;13819:123:8::1;10538:354:9::0;13819:123:8::1;14087:15;14065;:19;;;:37;14044:106;;;;-1:-1:-1::0;;;14044:106:8::1;;;;;;;:::i;:::-;14160:227;14185:4;14203:15;:28;;;14245:15;:33;;;14292:5;14311:1;14326:15;14355:22;14160:11;:227::i;29029:230::-:0;29092:7;29111:14;29128:29;29154:2;29128:25;:29::i;:::-;29167:22;29192:20;;;:12;:20;;;;;;;;;29167:45;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29167:45:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29111:46;;-1:-1:-1;29229:23:8;29167:45;29249:2;29229:8;:23::i;:::-;29222:30;29029:230;-1:-1:-1;;;;29029:230:8:o;13023:129::-;13073:20;:18;:20::i;:::-;-1:-1:-1;13139:5:8;;13108:37;;;916:10:1;4544:51:9;;4626:2;4611:18;;4604:34;;;;13108:37:8;;;;;;;;;;;;13023:129::o;18382:810::-;916:10:1;18438:15:8;18517:23;;;:14;:23;;;;;;;;;18478:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18478:62:8;;;;;;;;;;;;;;;18550:61;;;;-1:-1:-1;;;18550:61:8;;;;;;;:::i;:::-;18643:15;:33;;;18642:34;18621:107;;;;-1:-1:-1;;;18621:107:8;;8920:2:9;18621:107:8;;;8902:21:9;8959:2;8939:18;;;8932:30;8998:28;8978:18;;;8971:56;9044:18;;18621:107:8;8718:350:9;18621:107:8;3293:8;3192:7;3293:1;:8;:::i;:::-;18778:15;:19;;;:30;;;;:::i;:::-;18759:15;:49;;18738:122;;;;-1:-1:-1;;;18738:122:8;;7806:2:9;18738:122:8;;;7788:21:9;7845:2;7825:18;;;7818:30;7884:28;7864:18;;;7857:56;7930:18;;18738:122:8;7604:350:9;18738:122:8;18871:25;3192:7;;3293:8;3192:7;3293:1;:8;:::i;:::-;18901:26;;:15;:26;:::i;:::-;18900:35;;;;:::i;:::-;18899:56;;;;:::i;:::-;18871:84;;18966:219;18991:7;19012:15;:28;;;19054:4;19072:1;19087:17;19118:15;19147:28;18966:11;:219::i;:::-;18428:764;;;18382:810::o;14914:880::-;1802:1:6;2556:7;;:19;;2548:63;;;;-1:-1:-1;;;2548:63:6;;;;;;;:::i;:::-;1802:1;2686:7;:18;916:10:1;15059:15:8::1;3192:7;15128:17;3192:7:::0;15128:10;:17:::1;:::i;:::-;15127:26;;;;:::i;:::-;-1:-1:-1::0;;;;;15202:23:8;::::1;15163:36;15202:23:::0;;;:14:::1;:23;::::0;;;;;;;;15163:62;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;;;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;15163:62:8;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;;;15099:54;;-1:-1:-1;15163:62:8;15244:9;::::1;15236:42;;;::::0;-1:-1:-1;;;15236:42:8;;10391:2:9;15236:42:8::1;::::0;::::1;10373:21:9::0;10430:2;10410:18;;;10403:30;-1:-1:-1;;;10449:18:9;;;10442:50;10509:18;;15236:42:8::1;10189:344:9::0;15236:42:8::1;15296:22;::::0;::::1;::::0;-1:-1:-1;;;;;15296:27:8::1;::::0;15288:65:::1;;;::::0;-1:-1:-1;;;15288:65:8;;13283:2:9;15288:65:8::1;::::0;::::1;13265:21:9::0;13322:2;13302:18;;;13295:30;13361:27;13341:18;;;13334:55;13406:18;;15288:65:8::1;13081:349:9::0;15288:65:8::1;15391:15;15371:17;:35;15363:71;;;::::0;-1:-1:-1;;;15363:71:8;;8161:2:9;15363:71:8::1;::::0;::::1;8143:21:9::0;8200:2;8180:18;;;8173:30;-1:-1:-1;;;8219:18:9;;;8212:53;8282:18;;15363:71:8::1;7959:347:9::0;15363:71:8::1;15486:26;3240:12;15486:15;:26;:::i;:::-;15465:17;:47;;15444:124;;;;-1:-1:-1::0;;;15444:124:8::1;;;;;;;:::i;:::-;15578:209;15603:7;15624:12;15650;15676:5;15695:17;15726:15;15755:22;15578:11;:209::i;:::-;-1:-1:-1::0;;1759:1:6;2859:7;:22;-1:-1:-1;;;;14914:880:8:o;2138:198:5:-;1328:6;;-1:-1:-1;;;;;1328:6:5;916:10:1;1468:23:5;1460:68;;;;-1:-1:-1;;;1460:68:5;;12922:2:9;1460:68:5;;;12904:21:9;;;12941:18;;;12934:30;13000:34;12980:18;;;12973:62;13052:18;;1460:68:5;12720:356:9;1460:68:5;-1:-1:-1;;;;;2226:22:5;::::1;2218:73;;;::::0;-1:-1:-1;;;2218:73:5;;8513:2:9;2218:73:5::1;::::0;::::1;8495:21:9::0;8552:2;8532:18;;;8525:30;8591:34;8571:18;;;8564:62;-1:-1:-1;;;8642:18:9;;;8635:36;8688:19;;2218:73:5::1;8311:402:9::0;2218:73:5::1;2301:28;2320:8;2301:18;:28::i;:::-;2138:198:::0;:::o;4075:409:8:-;2359:13:3;;;;;;;:48;;2395:12;;;;2394:13;2359:48;;;3137:4;1476:19:0;:23;2375:16:3;2351:107;;;;-1:-1:-1;;;2351:107:3;;11445:2:9;2351:107:3;;;11427:21:9;11484:2;11464:18;;;11457:30;11523:34;11503:18;;;11496:62;-1:-1:-1;;;11574:18:9;;;11567:44;11628:19;;2351:107:3;11243:410:9;2351:107:3;2469:19;2492:13;;;;;;2491:14;2515:98;;;;2549:13;:20;;-1:-1:-1;;2583:19:3;;;;;2515:98;-1:-1:-1;;;;;4190:18:8;::::1;4182:51;;;::::0;-1:-1:-1;;;4182:51:8;;10042:2:9;4182:51:8::1;::::0;::::1;10024:21:9::0;10081:2;10061:18;;;10054:30;-1:-1:-1;;;10100:18:9;;;10093:50;10160:18;;4182:51:8::1;9840:344:9::0;4182:51:8::1;4243:35;:33;:35::i;:::-;4288:51;:49;:51::i;:::-;4349:3;:10:::0;;-1:-1:-1;;;;;;4349:10:8::1;-1:-1:-1::0;;;;;4349:10:8;::::1;;::::0;;4369:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;4397:15:8::1;::::0;;:12:::1;:15;::::0;4419:12:::1;4397:19:::0;:34;4462:15:::1;4441:18:::0;:36;2635:66:3;;;;2685:5;2669:21;;-1:-1:-1;;2669:21:3;;;2070:637;4075:409:8;;:::o;4662:282::-;-1:-1:-1;;;;;4805:20:8;;4766:6;4805:20;;;:14;:20;;;;;;4839:11;4835:50;;-1:-1:-1;4873:1:8;;4662:282;-1:-1:-1;;4662:282:8:o;4835:50::-;-1:-1:-1;;;;;4901:22:8;;;;;;;:16;:22;;;;;;;;:30;;;;;;;;;;:36;-1:-1:-1;;;4901:36:8;;;;;4662:282;-1:-1:-1;4662:282:8:o;21375:533::-;-1:-1:-1;;;;;21543:20:8;;21481:7;21543:20;;;:14;:20;;;;;;21481:7;;;21574:308;21598:3;21594:1;:7;21574:308;;;21633:3;21626;:10;21622:54;;21656:5;;21622:54;21689:11;21721:1;21704:9;21710:3;21704;:9;:::i;:::-;:13;;21716:1;21704:13;:::i;:::-;21703:19;;;;:::i;:::-;-1:-1:-1;;;;;21740:22:8;;;;;;:16;:22;;;;;;;;:27;;;;;;;;:30;;;21689:33;;-1:-1:-1;21740:36:8;-1:-1:-1;21736:136:8;;21802:3;21796:9;;21736:136;;;21850:7;21856:1;21850:3;:7;:::i;:::-;21844:13;;21736:136;-1:-1:-1;21603:3:8;;;;:::i;:::-;;;;21574:308;;;-1:-1:-1;21898:3:8;;21375:533;-1:-1:-1;;;;21375:533:8:o;8697:2978::-;8867:20;;;;;;;;;8847:17;8867:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8917;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9012:17;;;;8867:20;;8917;;8847:17;;-1:-1:-1;;;;;9012:21:8;;9008:502;;9069:17;;;;9106:28;;;;9101:150;;3403:8;9170:16;3192:7;9170:3;:16;:::i;:::-;9169:27;;;;:::i;:::-;9154:42;;;;;;:12;;;:42;9214:14;;;:22;;3192:7;;9214:14;:22;;3192:7;;9214:22;:::i;:::-;;;-1:-1:-1;9101:150:8;9285:15;9268:10;:14;;;:32;9264:236;;;9333:12;3403:8;9333:3;:12;:::i;:::-;9320:25;;;;;;:10;;;:25;9443:14;;;;9436:48;;9468:15;;9436:48;:::i;:::-;9396:4;:10;;;:89;;;;:::i;:::-;9364:121;;;;;;;;9264:236;9035:475;9008:502;9541:15;9524:10;:14;;;:32;9523:61;;;;;9582:1;9562:10;:17;;;-1:-1:-1;;;;;9562:21:8;;9523:61;9519:541;;;9620:17;;;;9657:28;;;;9652:150;;3403:8;9721:16;3192:7;9721:3;:16;:::i;:::-;9720:27;;;;:::i;:::-;9705:42;;;;;;:12;;;:42;9765:14;;;:22;;3192:7;;9765:14;:22;;3192:7;;9765:22;:::i;:::-;;;-1:-1:-1;9652:150:8;9836:15;9819:10;:14;;;:32;9815:235;;;9884:12;3403:8;9884:3;:12;:::i;:::-;9871:25;;;;;;:10;;;:25;9993:14;;;;9986:48;;10018:15;;9986:48;:::i;:::-;9946:4;:10;;;:89;;;;:::i;:::-;9914:121;;;;;;;;9815:235;9586:474;9519:541;10095:14;;;;;10082:28;;;;:12;:28;;;;;;10124:14;;;;10082:28;;;;;;-1:-1:-1;10124:19:8;10120:90;;-1:-1:-1;10184:14:8;;;;10171:28;;;;:12;:28;;;;;;;;10120:90;10302:22;10327:20;:18;:20::i;:::-;10302:45;;10473:4;:10;;;10460:4;:10;;;:23;;;;:::i;:::-;10440:9;:15;;:44;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;10525:9:8;;10513;;:21;;10525:9;10513:21;:::i;:::-;10494:41;;:9;;:41;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;10582:12:8;;;;;10567;;;;:27;;10582:12;10567:27;:::i;:::-;10545:9;:17;;:50;;;;;;;:::i;:::-;;;;;;;;;;10609:15;;;;10627:1;10609:19;;;10605:69;;-1:-1:-1;10605:69:8;;10662:1;10644:15;;;:19;10605:69;10704:1;10687:9;:14;;;:18;;;10683:67;;;10738:1;10721:18;;10683:67;10772:5;;10759:19;;;;:12;:19;;;;;;;;;:31;;;;;;;;;;-1:-1:-1;;;;;10759:31:8;;;-1:-1:-1;;;10759:31:8;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10759:31:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10804:14;;;10821:15;-1:-1:-1;10800:322:8;;;10940:10;;;;10927:23;;;;:::i;:::-;;;10986:10;:14;;;10968:10;:14;;;:32;10964:94;;;11033:10;;;;11020:23;;;;:::i;:::-;;;10964:94;11084:14;;;;11071:28;;;;:12;:28;;;;;:40;;-1:-1:-1;;;;;;11071:40:8;-1:-1:-1;;;;;11071:40:8;;;;;;;;10800:322;11153:15;11136:10;:14;;;:32;11132:329;;;11205:10;:14;;;11188:10;:14;;;:31;11184:206;;;11252:10;;;;11239:23;;;;:::i;:::-;11348:14;;;;11335:28;;;;:12;:28;;;;;:40;;-1:-1:-1;;;;;;11335:40:8;-1:-1:-1;;;;;11335:40:8;;;;;;;;;-1:-1:-1;11184:206:8;-1:-1:-1;;;;;11488:20:8;;11470:15;11488:20;;;:14;:20;;;;;;:24;;11511:1;11488:24;:::i;:::-;-1:-1:-1;;;;;11522:20:8;;;;;;;:14;:20;;;;;;;;:30;;;11572:15;11562:7;;;:25;;;11608:12;11597:8;;;:23;;;11630:22;;;:16;:22;;;;;:31;;;;;;;;;;:38;;;;;;;;;;-1:-1:-1;;;;;11630:38:8;;;-1:-1:-1;;;11630:38:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11630:38:8;;;;;;;;;;;;;;-1:-1:-1;;11630:38:8;;;;;;;;;;-1:-1:-1;;;;;8697:2978:8:o;731:216:7:-;881:58;;-1:-1:-1;;;;;4562:32:9;;881:58:7;;;4544:51:9;4611:18;;;4604:34;;;854:86:7;;874:5;;-1:-1:-1;;;904:23:7;4517:18:9;;881:58:7;;;;-1:-1:-1;;881:58:7;;;;;;;;;;;;;;-1:-1:-1;;;;;881:58:7;-1:-1:-1;;;;;;881:58:7;;;;;;;;;;854:19;:86::i;11955:1014:8:-;-1:-1:-1;;;;;12231:20:8;;12197:31;12231:20;;;:14;:20;;;;;;;;12197:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12197:54:8;;;;;;;;;;;;;;;;;;;;12282:14;;;12197:54;;12282:14;;12307:23;;;;;12282:14;12307:23;:::i;:::-;;;;;;;;12361:5;12340:10;:17;;:26;;;;;;;:::i;:::-;-1:-1:-1;;;;;12340:26:8;;;-1:-1:-1;12376:38:8;;;;;12424:45;;;:28;;;:45;12483:15;;12479:73;;12514:14;;;:27;;;12479:73;-1:-1:-1;;;;;12561:20:8;;;;;;:14;:20;;;;;;;;;:33;;;;;;;;;;;;-1:-1:-1;;;;;12561:33:8;;;-1:-1:-1;;;;;;12561:33:8;;;;;-1:-1:-1;;12561:33:8;;;;;;;-1:-1:-1;;12561:33:8;;;;;;;;;;;;;;;;;;;;;;;;12604:41;12576:4;12622:10;12584;12604:11;:41::i;:::-;-1:-1:-1;;;;;12660:10:8;;;12656:178;;12686:137;916:10:1;12704:3:8;;-1:-1:-1;;;;;12704:3:8;;12781:4;-1:-1:-1;;;;;12686:137:8;;:39;:137::i;:::-;12898:10;:14;;;12885:4;-1:-1:-1;;;;;12849:64:8;12864:5;12849:64;;;;;;;;:::i;:::-;;;;6049:14:9;;6042:22;6024:41;;-1:-1:-1;;;;;6101:47:9;;6096:2;6081:18;;6074:75;12849:64:8;;5997:18:9;12849:64:8;;;;;;;12947:14;;12928:34;;;16673:25:9;;;16729:2;16714:18;;16707:34;;;;12928::8;;16646:18:9;12928:34:8;;;;;;;12187:782;;11955:1014;;;;;;;:::o;20843:526::-;20954:7;;21016:8;20954:7;21035:308;21059:3;21055:1;:7;21035:308;;;21094:3;21087;:10;21083:54;;21117:5;;21083:54;21150:11;21182:1;21165:9;21171:3;21165;:9;:::i;:::-;:13;;21177:1;21165:13;:::i;:::-;21164:19;;;;:::i;:::-;21201:17;;;;:12;:17;;;;;:21;;;21150:33;;-1:-1:-1;21201:36:8;-1:-1:-1;21197:136:8;;21263:3;21257:9;;21197:136;;;21311:7;21317:1;21311:3;:7;:::i;:::-;21305:13;;21197:136;-1:-1:-1;21064:3:8;;;;:::i;:::-;;;;21035:308;;2490:187:5;2582:6;;;-1:-1:-1;;;;;2598:17:5;;;-1:-1:-1;;;;;;2598:17:5;;;;;;;2630:40;;2582:6;;;2598:17;2582:6;;2630:40;;2563:16;;2630:40;2553:124;2490:187;:::o;27990:921:8:-;28087:7;28110:22;28135:5;28110:30;;28150:10;3192:7;;28164:9;:12;;;:19;;;;:::i;:::-;28163:28;;;;:::i;:::-;28150:41;;28252:9;28247:488;28271:3;28267:1;:7;28247:488;;;28295:10;3192:7;28295:10;;:::i;:::-;;;28319:13;28359:2;28354;:7;28350:117;;;28386:2;28381:7;;28350:117;;;-1:-1:-1;28436:16:8;;;;:12;:16;;;;;;;;28350:117;28575:12;;;;28555:33;;28562:2;28555:33;:::i;:::-;28514:9;:15;;;:75;;;;:::i;:::-;28480:109;;:9;;:109;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;28607:8:8;;;28603:52;;;28635:5;;;28603:52;28687:6;28668:9;:15;;:25;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;28707:12:8;;;:17;;;28276:3;;;;:::i;:::-;;;;28247:488;;;;28766:1;28749:9;:14;;;:18;;;28745:67;;;28800:1;28783:18;;28745:67;28839:17;;;;28821:35;;28839:9;;28821:35;;28839:17;;28821:35;:::i;:::-;;;;;;;;;;28888:14;;28881:22;;;;27990:921;-1:-1:-1;;;;;27990:921:8:o;21914:496::-;22070:5;;22008:7;;;;;22086:298;22110:3;22106:1;:7;22086:298;;;22145:3;22138;:10;22134:54;;22168:5;;22134:54;22201:11;22233:1;22216:9;22222:3;22216;:9;:::i;:::-;:13;;22228:1;22216:13;:::i;:::-;22215:19;;;;:::i;:::-;22252:17;;;;:12;:17;;;;;:20;;;22201:33;;-1:-1:-1;22252:26:8;-1:-1:-1;22248:126:8;;22304:3;22298:9;;22248:126;;;22352:7;22358:1;22352:3;:7;:::i;:::-;22346:13;;22248:126;-1:-1:-1;22115:3:8;;;;:::i;:::-;;;;22086:298;;;-1:-1:-1;22400:3:8;;21914:496;-1:-1:-1;;;21914:496:8:o;6086:2327::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6184:5:8;;6211:186;;;;;;;;;;;;;;;;;;;;;;6302:15;6211:186;;;;;;6336:12;6211:186;;;;;;6439:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6211:186;;6184:5;6601:10;;6597:126;;-1:-1:-1;6639:20:8;;;;:12;:20;;;;;;;;6627:32;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6627:32:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6692:20;;;;;;;6673:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6627:32;;-1:-1:-1;6597:126:8;6757:12;;;;6732:22;6828:15;:30;-1:-1:-1;6824:186:8;;;6986:12;;;;6968:30;;:15;:30;:::i;:::-;6933:13;;;;6918:28;;:12;:28;:::i;:::-;6904:43;;3344:6;6904:43;:::i;:::-;6903:96;;;;:::i;:::-;6874:125;;6824:186;7033:10;3192:7;7047:21;3192:7;7047:14;:21;:::i;:::-;7046:30;;;;:::i;:::-;7033:43;;7095:9;7090:1256;7114:3;7110:1;:7;7090:1256;;;7142:10;3192:7;7142:10;;:::i;:::-;;;7170:13;7214:15;7209:2;:20;7205:159;;;7258:15;7253:20;;7205:159;;;-1:-1:-1;7329:16:8;;;;:12;:16;;;;;;;;7205:159;7533:35;7553:14;7540:2;7533:35;:::i;:::-;7488:9;:15;;;:81;;;;:::i;:::-;7450:119;;:9;;:119;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;7587:15:8;;;:25;;7606:6;;7587:15;:25;;7606:6;;7587:25;:::i;:::-;;;;;;;;;;7634:14;;7651:1;7634:18;;;7630:83;;-1:-1:-1;7630:83:8;;7693:1;7676:18;;7630:83;7752:1;7734:9;:15;;;:19;;;7730:85;;;7795:1;7777:15;;;:19;7730:85;7870:12;;;;:17;;;8004:19;;;7850:2;;-1:-1:-1;7850:2:8;;3344:6;;7999:24;;7850:2;7999:24;:::i;:::-;7985:39;;:10;:39;:::i;:::-;7984:74;;;;:::i;:::-;7941:16;:20;;;:117;;;;:::i;:::-;7905:13;;;:153;8076:11;8086:1;8076:11;;:::i;:::-;;;8115:15;8109:2;:21;8105:177;;;-1:-1:-1;8170:12:8;8154:13;;;:28;;;8204:20;;;;:12;:20;;;;;;;;;:32;;;;;;;;;;-1:-1:-1;;;;;8204:32:8;;;-1:-1:-1;;;8204:32:8;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8204:32:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8258:5;;8105:177;-1:-1:-1;8299:20:8;;;;:12;:20;;;;;;;;;:32;;;;;;;;;;-1:-1:-1;;;;;8299:32:8;;;-1:-1:-1;;;8299:32:8;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8299:32:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7119:3;;;;:::i;:::-;;;;7090:1256;;;;7019:1337;8374:6;8366:5;:14;;;;8390:16;;;;6086:2327;:::o;968:95:5:-;2942:13:3;;;;;;;2934:69;;;;-1:-1:-1;;;2934:69:3;;;;;;;:::i;:::-;1030:26:5::1;:24;:26::i;1840:111:6:-:0;2942:13:3;;;;;;;2934:69;;;;-1:-1:-1;;;2934:69:3;;;;;;;:::i;:::-;1910:34:6::1;:32;:34::i;3292:717:7:-:0;3722:23;3748:69;3776:4;3748:69;;;;;;;;;;;;;;;;;3756:5;-1:-1:-1;;;;;3748:27:7;;;:69;;;;;:::i;:::-;3831:17;;3722:95;;-1:-1:-1;3831:21:7;3827:176;;3926:10;3915:30;;;;;;;;;;;;:::i;:::-;3907:85;;;;-1:-1:-1;;;3907:85:7;;15103:2:9;3907:85:7;;;15085:21:9;15142:2;15122:18;;;15115:30;15181:34;15161:18;;;15154:62;-1:-1:-1;;;15232:18:9;;;15225:40;15282:19;;3907:85:7;14901:406:9;953:252:7;1129:68;;-1:-1:-1;;;;;4248:15:9;;;1129:68:7;;;4230:34:9;4300:15;;4280:18;;;4273:43;4332:18;;;4325:34;;;1102:96:7;;1122:5;;-1:-1:-1;;;1152:27:7;4165:18:9;;1129:68:7;3990:375:9;1069:111:5;2942:13:3;;;;;;;2934:69;;;;-1:-1:-1;;;2934:69:3;;;;;;;:::i;:::-;1141:32:5::1;916:10:1::0;1141:18:5::1;:32::i;1957:109:6:-:0;2942:13:3;;;;;;;2934:69;;;;-1:-1:-1;;;2934:69:3;;;;;;;:::i;:::-;1759:1:6::1;2037:7;:22:::0;1957:109::o;3872:223:0:-;4005:12;4036:52;4058:6;4066:4;4072:1;4075:12;4036:21;:52::i;:::-;4029:59;;3872:223;;;;;;:::o;4959:499::-;5124:12;5181:5;5156:21;:30;;5148:81;;;;-1:-1:-1;;;5148:81:0;;9635:2:9;5148:81:0;;;9617:21:9;9674:2;9654:18;;;9647:30;9713:34;9693:18;;;9686:62;-1:-1:-1;;;9764:18:9;;;9757:36;9810:19;;5148:81:0;9433:402:9;5148:81:0;-1:-1:-1;;;;;1476:19:0;;;5239:60;;;;-1:-1:-1;;;5239:60:0;;13988:2:9;5239:60:0;;;13970:21:9;14027:2;14007:18;;;14000:30;14066:31;14046:18;;;14039:59;14115:18;;5239:60:0;13786:353:9;5239:60:0;5311:12;5325:23;5352:6;-1:-1:-1;;;;;5352:11:0;5371:5;5378:4;5352:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5310:73;;;;5400:51;5417:7;5426:10;5438:12;5400:16;:51::i;:::-;5393:58;4959:499;-1:-1:-1;;;;;;;4959:499:0:o;6622:692::-;6768:12;6796:7;6792:516;;;-1:-1:-1;6826:10:0;6819:17;;6792:516;6937:17;;:21;6933:365;;7131:10;7125:17;7191:15;7178:10;7174:2;7170:19;7163:44;6933:365;7270:12;7263:20;;-1:-1:-1;;;7263:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:9;82:20;;-1:-1:-1;;;;;131:31:9;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:188::-;260:20;;-1:-1:-1;;;;;309:46:9;;299:57;;289:85;;370:1;367;360:12;385:186;444:6;497:2;485:9;476:7;472:23;468:32;465:52;;;513:1;510;503:12;465:52;536:29;555:9;536:29;:::i;576:996::-;654:6;662;715:2;703:9;694:7;690:23;686:32;683:52;;;731:1;728;721:12;683:52;754:29;773:9;754:29;:::i;:::-;744:39;;834:2;823:9;819:18;806:32;857:18;898:2;890:6;887:14;884:34;;;914:1;911;904:12;884:34;952:6;941:9;937:22;927:32;;997:7;990:4;986:2;982:13;978:27;968:55;;1019:1;1016;1009:12;968:55;1055:2;1042:16;1077:2;1073;1070:10;1067:36;;;1083:18;;:::i;:::-;1158:2;1152:9;1126:2;1212:13;;-1:-1:-1;;1208:22:9;;;1232:2;1204:31;1200:40;1188:53;;;1256:18;;;1276:22;;;1253:46;1250:72;;;1302:18;;:::i;:::-;1342:10;1338:2;1331:22;1377:2;1369:6;1362:18;1417:7;1412:2;1407;1403;1399:11;1395:20;1392:33;1389:53;;;1438:1;1435;1428:12;1389:53;1494:2;1489;1485;1481:11;1476:2;1468:6;1464:15;1451:46;1539:1;1534:2;1529;1521:6;1517:15;1513:24;1506:35;1560:6;1550:16;;;;;;;576:996;;;;;:::o;1577:260::-;1645:6;1653;1706:2;1694:9;1685:7;1681:23;1677:32;1674:52;;;1722:1;1719;1712:12;1674:52;1745:29;1764:9;1745:29;:::i;:::-;1735:39;;1793:38;1827:2;1816:9;1812:18;1793:38;:::i;:::-;1783:48;;1577:260;;;;;:::o;1842:254::-;1910:6;1918;1971:2;1959:9;1950:7;1946:23;1942:32;1939:52;;;1987:1;1984;1977:12;1939:52;2010:29;2029:9;2010:29;:::i;:::-;2000:39;2086:2;2071:18;;;;2058:32;;-1:-1:-1;;;1842:254:9:o;2101:245::-;2168:6;2221:2;2209:9;2200:7;2196:23;2192:32;2189:52;;;2237:1;2234;2227:12;2189:52;2269:9;2263:16;2288:28;2310:5;2288:28;:::i;2351:383::-;2425:6;2433;2441;2494:2;2482:9;2473:7;2469:23;2465:32;2462:52;;;2510:1;2507;2500:12;2462:52;2549:9;2536:23;2568:28;2590:5;2568:28;:::i;:::-;2615:5;-1:-1:-1;2639:38:9;2673:2;2658:18;;2639:38;:::i;:::-;2629:48;;2724:2;2713:9;2709:18;2696:32;2686:42;;2351:383;;;;;:::o;2739:186::-;2798:6;2851:2;2839:9;2830:7;2826:23;2822:32;2819:52;;;2867:1;2864;2857:12;2819:52;2890:29;2909:9;2890:29;:::i;2930:383::-;3004:6;3012;3020;3073:2;3061:9;3052:7;3048:23;3044:32;3041:52;;;3089:1;3086;3079:12;3041:52;3112:29;3131:9;3112:29;:::i;:::-;3102:39;;3188:2;3177:9;3173:18;3160:32;3150:42;;3242:2;3231:9;3227:18;3214:32;3255:28;3277:5;3255:28;:::i;:::-;3302:5;3292:15;;;2930:383;;;;;:::o;3318:180::-;3377:6;3430:2;3418:9;3409:7;3405:23;3401:32;3398:52;;;3446:1;3443;3436:12;3398:52;-1:-1:-1;3469:23:9;;3318:180;-1:-1:-1;3318:180:9:o;3503:274::-;3632:3;3670:6;3664:13;3686:53;3732:6;3727:3;3720:4;3712:6;3708:17;3686:53;:::i;:::-;3755:16;;;;;3503:274;-1:-1:-1;;3503:274:9:o;6866:383::-;7015:2;7004:9;6997:21;6978:4;7047:6;7041:13;7090:6;7085:2;7074:9;7070:18;7063:34;7106:66;7165:6;7160:2;7149:9;7145:18;7140:2;7132:6;7128:15;7106:66;:::i;:::-;7233:2;7212:15;-1:-1:-1;;7208:29:9;7193:45;;;;7240:2;7189:54;;6866:383;-1:-1:-1;;6866:383:9:o;11658:346::-;11860:2;11842:21;;;11899:2;11879:18;;;11872:30;-1:-1:-1;;;11933:2:9;11918:18;;11911:52;11995:2;11980:18;;11658:346::o;12361:354::-;12563:2;12545:21;;;12602:2;12582:18;;;12575:30;12641:32;12636:2;12621:18;;12614:60;12706:2;12691:18;;12361:354::o;13435:346::-;13637:2;13619:21;;;13676:2;13656:18;;;13649:30;-1:-1:-1;;;13710:2:9;13695:18;;13688:52;13772:2;13757:18;;13435:346::o;14144:407::-;14346:2;14328:21;;;14385:2;14365:18;;;14358:30;14424:34;14419:2;14404:18;;14397:62;-1:-1:-1;;;14490:2:9;14475:18;;14468:41;14541:3;14526:19;;14144:407::o;15663:355::-;15865:2;15847:21;;;15904:2;15884:18;;;15877:30;15943:33;15938:2;15923:18;;15916:61;16009:2;15994:18;;15663:355::o;16941:396::-;16980:3;17024:1;17020:2;17009:17;17061:1;17057:2;17046:17;17091:1;17086:3;17082:11;17170:3;-1:-1:-1;;;;;17130:44:9;17125:3;17121:54;17116:2;17109:10;17105:71;17102:97;;;17179:18;;:::i;:::-;17273:3;-1:-1:-1;;;;;17232:39:9;17228:49;17223:3;17219:59;17215:2;17211:68;17208:94;;;17282:18;;:::i;:::-;-1:-1:-1;17318:13:9;;16941:396;-1:-1:-1;;;16941:396:9:o;17342:253::-;17382:3;-1:-1:-1;;;;;17471:2:9;17468:1;17464:10;17501:2;17498:1;17494:10;17532:3;17528:2;17524:12;17519:3;17516:21;17513:47;;;17540:18;;:::i;:::-;17576:13;;17342:253;-1:-1:-1;;;;17342:253:9:o;17600:128::-;17640:3;17671:1;17667:6;17664:1;17661:13;17658:39;;;17677:18;;:::i;:::-;-1:-1:-1;17713:9:9;;17600:128::o;17733:305::-;17772:1;17814;17810:2;17799:17;17851:1;17847:2;17836:17;17872:3;17862:37;;17879:18;;:::i;:::-;-1:-1:-1;;;;;;17915:48:9;;-1:-1:-1;;17965:15:9;;17911:70;17908:96;;;17984:18;;:::i;:::-;18018:14;;;17733:305;-1:-1:-1;;;17733:305:9:o;18043:120::-;18083:1;18109;18099:35;;18114:18;;:::i;:::-;-1:-1:-1;18148:9:9;;18043:120::o;18168:698::-;18207:7;18255:1;18251:2;18240:17;18292:1;18288:2;18277:17;-1:-1:-1;;;;;18375:1:9;18370:3;18366:11;18405:1;18400:3;18396:11;18452:3;18448:2;18444:12;18439:3;18436:21;18431:2;18427;18423:11;18419:39;18416:65;;;18461:18;;:::i;:::-;-1:-1:-1;;;;;;18567:1:9;18558:11;;18585;;;18607:13;;;18598:23;;18581:41;18578:67;;;18625:18;;:::i;:::-;18673:1;18668:3;18664:11;18654:21;;18722:3;18718:2;18713:13;18708:3;18704:23;18699:2;18695;18691:11;18687:41;18684:67;;;18731:18;;:::i;:::-;18798:3;18794:2;18789:13;18784:3;18780:23;18775:2;18771;18767:11;18763:41;18760:67;;;18807:18;;:::i;:::-;-1:-1:-1;;;18847:13:9;;;;;18168:698;-1:-1:-1;;;;;18168:698:9:o;18871:168::-;18911:7;18977:1;18973;18969:6;18965:14;18962:1;18959:21;18954:1;18947:9;18940:17;18936:45;18933:71;;;18984:18;;:::i;:::-;-1:-1:-1;19024:9:9;;18871:168::o;19044:398::-;19083:4;19128:1;19124:2;19113:17;19165:1;19161:2;19150:17;19195:1;19190:3;19186:11;19279:3;-1:-1:-1;;;;;19238:39:9;19234:49;19229:3;19225:59;19220:2;19213:10;19209:76;19206:102;;;19288:18;;:::i;:::-;19377:3;-1:-1:-1;;;;;19337:44:9;19332:3;19328:54;19324:2;19320:63;19317:89;;;19386:18;;:::i;:::-;-1:-1:-1;19423:13:9;;;19044:398;-1:-1:-1;;;19044:398:9:o;19447:267::-;19486:4;19515:9;;;19540:10;;-1:-1:-1;;;19559:19:9;;19552:27;;19536:44;19533:70;;;19583:18;;:::i;:::-;-1:-1:-1;;;;;19630:27:9;;19623:35;;19615:44;;19612:70;;;19662:18;;:::i;:::-;-1:-1:-1;;19699:9:9;;19447:267::o;19719:125::-;19759:4;19787:1;19784;19781:8;19778:34;;;19792:18;;:::i;:::-;-1:-1:-1;19829:9:9;;19719:125::o;19849:258::-;19921:1;19931:113;19945:6;19942:1;19939:13;19931:113;;;20021:11;;;20015:18;20002:11;;;19995:39;19967:2;19960:10;19931:113;;;20062:6;20059:1;20056:13;20053:48;;;-1:-1:-1;;20097:1:9;20079:16;;20072:27;19849:258::o;20112:380::-;20191:1;20187:12;;;;20234;;;20255:61;;20309:4;20301:6;20297:17;20287:27;;20255:61;20362:2;20354:6;20351:14;20331:18;20328:38;20325:161;;;20408:10;20403:3;20399:20;20396:1;20389:31;20443:4;20440:1;20433:15;20471:4;20468:1;20461:15;20325:161;;20112:380;;;:::o;20497:135::-;20536:3;-1:-1:-1;;20557:17:9;;20554:43;;;20577:18;;:::i;:::-;-1:-1:-1;20624:1:9;20613:13;;20497:135::o;20637:127::-;20698:10;20693:3;20689:20;20686:1;20679:31;20729:4;20726:1;20719:15;20753:4;20750:1;20743:15;20769:127;20830:10;20825:3;20821:20;20818:1;20811:31;20861:4;20858:1;20851:15;20885:4;20882:1;20875:15;20901:127;20962:10;20957:3;20953:20;20950:1;20943:31;20993:4;20990:1;20983:15;21017:4;21014:1;21007:15;21033:127;21094:10;21089:3;21085:20;21082:1;21075:31;21125:4;21122:1;21115:15;21149:4;21146:1;21139:15;21165:118;21251:5;21244:13;21237:21;21230:5;21227:32;21217:60;;21273:1;21270;21263:12
Swarm Source
ipfs://19385ccc1ebef63e604e938ce163d9255f448afbd305a1894f320bb246a0e050
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.