More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 139 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 58383606 | 46 days ago | IN | 0 AVAX | 0.00029489 | ||||
0x13ef2b1b | 58383308 | 46 days ago | IN | 0 AVAX | 0.00092852 | ||||
0x13ef2b1b | 58376908 | 46 days ago | IN | 0 AVAX | 0.00098175 | ||||
0x13ef2b1b | 58328385 | 47 days ago | IN | 0 AVAX | 0.00097008 | ||||
0x13ef2b1b | 58326839 | 47 days ago | IN | 0 AVAX | 0.00092908 | ||||
0x13ef2b1b | 58326089 | 47 days ago | IN | 0 AVAX | 0.00092858 | ||||
0x13ef2b1b | 58325792 | 47 days ago | IN | 0 AVAX | 0.00092855 | ||||
0x13ef2b1b | 58322051 | 47 days ago | IN | 0 AVAX | 0.00202207 | ||||
Increment Lock | 55953906 | 95 days ago | IN | 0 AVAX | 0.00078552 | ||||
Increment Lock | 55897951 | 96 days ago | IN | 0 AVAX | 0.00078302 | ||||
Increment Lock | 55897890 | 96 days ago | IN | 0 AVAX | 0.0007833 | ||||
0x13ef2b1b | 55897019 | 96 days ago | IN | 0 AVAX | 0.00166296 | ||||
0x13ef2b1b | 55896939 | 96 days ago | IN | 0 AVAX | 0.00166268 | ||||
0x13ef2b1b | 55896870 | 96 days ago | IN | 0 AVAX | 0.0016613 | ||||
0x13ef2b1b | 55896416 | 96 days ago | IN | 0 AVAX | 0.00166161 | ||||
Set Fees | 55149846 | 112 days ago | IN | 0 AVAX | 0.00010494 | ||||
0x13ef2b1b | 54253336 | 132 days ago | IN | 0 AVAX | 0.01216821 | ||||
0x13ef2b1b | 53970104 | 138 days ago | IN | 0 AVAX | 0.01275328 | ||||
Withdraw | 53886192 | 140 days ago | IN | 0 AVAX | 0.00284962 | ||||
Withdraw | 52472354 | 174 days ago | IN | 0 AVAX | 0.00243648 | ||||
Withdraw | 51228388 | 204 days ago | IN | 0 AVAX | 0.00239615 | ||||
Withdraw | 48847043 | 261 days ago | IN | 0 AVAX | 0.00292846 | ||||
Withdraw | 48597306 | 267 days ago | IN | 0 AVAX | 0.00289351 | ||||
0x13ef2b1b | 47495737 | 294 days ago | IN | 0 AVAX | 0.00718863 | ||||
Increment Lock | 47495275 | 294 days ago | IN | 0 AVAX | 0.0033519 |
Loading...
Loading
Contract Name:
TokenVesting
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: UNLICENSED // ALL RIGHTS RESERVED // Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts. // This contract locks ERC20 tokens. This can be used for: // - Token developers to prove they have locked tokens // - Presale projects or investors to lock a portion of tokens for a vesting period // - Farming platforms to lock a percentage of the farmed rewards for a period of time // - To lock tokens until a specific unlock date. // - To send tokens to someone under a time lock. // This contract is for ERC20 tokens, and supports high deflationary and rebasing tokens by using a pooling and share issuing mechanism. // This is NOT for AMM LP tokens (such as UNIV2), Please use our liquidity lockers for this. // Locking LP tokens in this contract will not show in the Unicrypt browser. // *** LOCK TYPES *** // Lock Type 1: when startEmission == 0 the lock is considered lockType 1. This is a normal lock // whereby tokens can be withdrawn on the due date (endEmission). // Lock Type 2: when startEmission != 0. Lock tokens over a period, with an amount withdrawable every block. // This scales linearly over time from startEmission -> endEmission. // e.g. If the lock period is 100 seconds, 50 seconds after the startEmission you can withdraw 50% of the lock. // Instead of making 10 locks for 10 months to withdraw tokens at the end of each month, you can now make 1 linear scaling lock with a period // of 10 months and withdraw the relative share every block. // *** CUSTOM PREMATURE UNLOCKING CONDITIONS *** // All locks support premature unlocking conditions. A premature unlock condition can be anything that implements the IUnlockCondition interface // If IUnlockCondition(address).unlockTokens() returns true, the lock withdraw date is overriden and the entire lock value can be withdrawn. // The key here is this is for premature unlocks, locks always fall back to the endEmission date // even if unlockTokens() returns false, and are therefore always withdrawble in full by the unlockDate. // Example use cases, Imagine a presale is 1 week long. Marketers tokens are locked for 1 week to prevent them initiating // markets and setting initial prices on an AMM. The presale concludes within 5 minuites. Marketers now need to wait 1 week, // to access their tokens. With conditional unlocks a condition can be set to return true once a presale has concluded // and override the 1 week lock making their tokens instantly withdrawble post presale. // Another use case could be to allow token developers or investors to prematurely unlock their tokens // if the price reaches a specified target, or for governance to vote for developers to unlock tokens prematurely // for development purposes met or raodmap goals met. // Get creative! // Please be aware if you are locking tokens to prove to your community you have locked tokens for long term you should not use a premature unlocking condition // as these types of locks will be shown differently in the browser to a normal lock with no unlocking condition. // Unlocking conditions can always be revoked by the lock owner to give more credibility to the lock. pragma solidity ^0.8.0; import "./TransferHelper.sol"; import './VestingMathLibrary.sol'; import './FullMath.sol'; import "./EnumerableSet.sol"; import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./IERC20.sol"; interface IMigrator { function migrate(address token, uint256 sharesDeposited, uint256 sharesWithdrawn, uint256 startEmission, uint256 endEmission, uint256 lockID, address owner, address condition, uint256 amountInTokens, uint256 option) external returns (bool); } interface IUnicryptAdmin { function userIsAdmin(address _user) external view returns (bool); } interface ITokenBlacklist { function checkToken(address _token) external view; } contract TokenVesting is Ownable, ReentrancyGuard { using EnumerableSet for EnumerableSet.AddressSet; struct UserInfo { EnumerableSet.AddressSet lockedTokens; // records all token addresses the user has locked mapping(address => uint256[]) locksForToken; // map erc20 address to lockId for that token } struct TokenLock { address tokenAddress; // The token address uint256 sharesDeposited; // the total amount of shares deposited uint256 sharesWithdrawn; // amount of shares withdrawn uint256 startEmission; // date token emission begins uint256 endEmission; // the date the tokens can be withdrawn uint256 lockID; // lock id per token lock address owner; // the owner who can edit or withdraw the lock address condition; // address(0) = no condition, otherwise the condition contract must implement IUnlockCondition } struct LockParams { address payable owner; // the user who can withdraw tokens once the lock expires. uint256 amount; // amount of tokens to lock uint256 startEmission; // 0 if lock type 1, else a unix timestamp uint256 endEmission; // the unlock date as a unix timestamp (in seconds) address condition; // address(0) = no condition, otherwise the condition must implement IUnlockCondition } EnumerableSet.AddressSet private TOKENS; // list of all unique tokens that have a lock mapping(uint256 => TokenLock) public LOCKS; // map lockID nonce to the lock uint256 public NONCE = 0; // incremental lock nonce counter, this is the unique ID for the next lock uint256 public MINIMUM_DEPOSIT = 100; // minimum divisibility per lock at time of locking mapping(address => uint256[]) private TOKEN_LOCKS; // map token address to array of lockIDs for that token mapping(address => UserInfo) private USERS; mapping(address => uint) public SHARES; // map token to number of shares per token, shares allow rebasing and deflationary tokens to compute correctly EnumerableSet.AddressSet private ZERO_FEE_WHITELIST; // Tokens that have been whitelisted to bypass all fees EnumerableSet.AddressSet private TOKEN_WHITELISTERS; // whitelisting contracts and users who can enable no fee for tokens. struct FeeStruct { uint256 tokenFee; uint256 freeLockingFee; address payable feeAddress; address freeLockingToken; // if this is address(0) then it is the gas token of the network (e.g ETH, BNB, Matic) } FeeStruct public FEES; IUnicryptAdmin UNCX_ADMINS; IMigrator public MIGRATOR; ITokenBlacklist public BLACKLIST; // prevent AMM tokens with a blacklisting contract event onLock(uint256 lockID, address token, address owner, uint256 amountInTokens, uint256 startEmission, uint256 endEmission); event onWithdraw(address lpToken, uint256 amountInTokens); event onRelock(uint256 lockID, uint256 unlockDate); event onTransferLock(uint256 lockIDFrom, uint256 lockIDto, address oldOwner, address newOwner); event onSplitLock(uint256 fromLockID, uint256 toLockID, uint256 amountInTokens); event onMigrate(uint256 lockID, uint256 amountInTokens); constructor (IUnicryptAdmin _uncxAdmins) { UNCX_ADMINS = _uncxAdmins; FEES.tokenFee = 35; FEES.feeAddress = payable(0xAA3d85aD9D128DFECb55424085754F6dFa643eb1); FEES.freeLockingFee = 10e18; } /** * @notice set the migrator contract which allows the lock to be migrated */ function setMigrator(IMigrator _migrator) external onlyOwner { MIGRATOR = _migrator; } function setBlacklistContract(ITokenBlacklist _contract) external onlyOwner { BLACKLIST = _contract; } function setFees(uint256 _tokenFee, uint256 _freeLockingFee, address payable _feeAddress, address _freeLockingToken) external onlyOwner { FEES.tokenFee = _tokenFee; FEES.freeLockingFee = _freeLockingFee; FEES.feeAddress = _feeAddress; FEES.freeLockingToken = _freeLockingToken; } /** * @notice whitelisted accounts and contracts who can call the editZeroFeeWhitelist function */ function adminSetWhitelister(address _user, bool _add) external onlyOwner { if (_add) { TOKEN_WHITELISTERS.add(_user); } else { TOKEN_WHITELISTERS.remove(_user); } } // Pay a once off fee to have free use of the lockers for the token function payForFreeTokenLocks (address _token) external payable { require(!ZERO_FEE_WHITELIST.contains(_token), 'PAID'); // charge Fee if (FEES.freeLockingToken == address(0)) { require(msg.value == FEES.freeLockingFee, 'FEE NOT MET'); FEES.feeAddress.transfer(FEES.freeLockingFee); } else { TransferHelper.safeTransferFrom(address(FEES.freeLockingToken), address(msg.sender), FEES.feeAddress, FEES.freeLockingFee); } ZERO_FEE_WHITELIST.add(_token); } // Callable by UNCX_ADMINS or whitelisted contracts (such as presale contracts) function editZeroFeeWhitelist (address _token, bool _add) external { require(UNCX_ADMINS.userIsAdmin(msg.sender) || TOKEN_WHITELISTERS.contains(msg.sender), 'ADMIN'); if (_add) { ZERO_FEE_WHITELIST.add(_token); } else { ZERO_FEE_WHITELIST.remove(_token); } } /** * @notice Creates one or multiple locks for the specified token * @param _token the erc20 token address * @param _lock_params an array of locks with format: [LockParams[owner, amount, startEmission, endEmission, condition]] * owner: user or contract who can withdraw the tokens * amount: must be >= 100 units * startEmission = 0 : LockType 1 * startEmission != 0 : LockType 2 (linear scaling lock) * use address(0) for no premature unlocking condition * Fails if startEmission is not less than EndEmission * Fails is amount < 100 */ function lock (address _token, LockParams[] calldata _lock_params) external nonReentrant { require(_lock_params.length > 0, 'NO PARAMS'); if (address(BLACKLIST) != address(0)) { BLACKLIST.checkToken(_token); } uint256 totalAmount = 0; for (uint256 i = 0; i < _lock_params.length; i++) { totalAmount += _lock_params[i].amount; } uint256 balanceBefore = IERC20(_token).balanceOf(address(this)); TransferHelper.safeTransferFrom(_token, address(msg.sender), address(this), totalAmount); uint256 amountIn = IERC20(_token).balanceOf(address(this)) - balanceBefore; // Fees if (!ZERO_FEE_WHITELIST.contains(_token)) { uint256 lockFee = FullMath.mulDiv(amountIn, FEES.tokenFee, 10000); TransferHelper.safeTransfer(_token, FEES.feeAddress, lockFee); amountIn -= lockFee; } uint256 shares = 0; for (uint256 i = 0; i < _lock_params.length; i++) { LockParams memory lock_param = _lock_params[i]; require(lock_param.startEmission < lock_param.endEmission, 'PERIOD'); require(lock_param.endEmission < 1e10, 'TIMESTAMP INVALID'); // prevents errors when timestamp entered in milliseconds require(lock_param.amount >= MINIMUM_DEPOSIT, 'MIN DEPOSIT'); uint256 amountInTokens = FullMath.mulDiv(lock_param.amount, amountIn, totalAmount); if (SHARES[_token] == 0) { shares = amountInTokens; } else { shares = FullMath.mulDiv(amountInTokens, SHARES[_token], balanceBefore == 0 ? 1 : balanceBefore); } require(shares > 0, 'SHARES'); SHARES[_token] += shares; balanceBefore += amountInTokens; TokenLock memory token_lock; token_lock.tokenAddress = _token; token_lock.sharesDeposited = shares; token_lock.startEmission = lock_param.startEmission; token_lock.endEmission = lock_param.endEmission; token_lock.lockID = NONCE; token_lock.owner = lock_param.owner; if (lock_param.condition != address(0)) { // if the condition contract does not implement the interface and return a bool // the below line will fail and revert the tx as the conditional contract is invalid IUnlockCondition(lock_param.condition).unlockTokens(); token_lock.condition = lock_param.condition; } // record the lock globally LOCKS[NONCE] = token_lock; TOKENS.add(_token); TOKEN_LOCKS[_token].push(NONCE); // record the lock for the user UserInfo storage user = USERS[lock_param.owner]; user.lockedTokens.add(_token); user.locksForToken[_token].push(NONCE); NONCE ++; emit onLock(token_lock.lockID, _token, token_lock.owner, amountInTokens, token_lock.startEmission, token_lock.endEmission); } } /** * @notice withdraw a specified amount from a lock. _amount is the ideal amount to be withdrawn. * however, this amount might be slightly different in rebasing tokens due to the conversion to shares, * then back into an amount * @param _lockID the lockID of the lock to be withdrawn * @param _amount amount of tokens to withdraw */ function withdraw (uint256 _lockID, uint256 _amount) external nonReentrant { TokenLock storage userLock = LOCKS[_lockID]; require(userLock.owner == msg.sender, 'OWNER'); // convert _amount to its representation in shares uint256 balance = IERC20(userLock.tokenAddress).balanceOf(address(this)); uint256 shareDebit = FullMath.mulDiv(SHARES[userLock.tokenAddress], _amount, balance); // round _amount up to the nearest whole share if the amount of tokens specified does not translate to // at least 1 share. if (shareDebit == 0 && _amount > 0) { shareDebit ++; } require(shareDebit > 0, 'ZERO WITHDRAWL'); uint256 withdrawableShares = getWithdrawableShares(userLock.lockID); // dust clearance block, as mulDiv rounds down leaving one share stuck, clear all shares for dust amounts if (shareDebit + 1 == withdrawableShares) { if (FullMath.mulDiv(SHARES[userLock.tokenAddress], balance / SHARES[userLock.tokenAddress], balance) == 0){ shareDebit++; } } require(withdrawableShares >= shareDebit, 'AMOUNT'); userLock.sharesWithdrawn += shareDebit; // now convert shares to the actual _amount it represents, this may differ slightly from the // _amount supplied in this methods arguments. uint256 amountInTokens = FullMath.mulDiv(shareDebit, balance, SHARES[userLock.tokenAddress]); SHARES[userLock.tokenAddress] -= shareDebit; TransferHelper.safeTransfer(userLock.tokenAddress, msg.sender, amountInTokens); emit onWithdraw(userLock.tokenAddress, amountInTokens); } /** * @notice extend a lock with a new unlock date, if lock is Type 2 it extends the emission end date */ function relock (uint256 _lockID, uint256 _unlock_date) external nonReentrant { require(_unlock_date < 1e10, 'TIME'); // prevents errors when timestamp entered in milliseconds TokenLock storage userLock = LOCKS[_lockID]; require(userLock.owner == msg.sender, 'OWNER'); require(userLock.endEmission < _unlock_date, 'END'); // percent fee if (!ZERO_FEE_WHITELIST.contains(userLock.tokenAddress)) { uint256 remainingShares = userLock.sharesDeposited - userLock.sharesWithdrawn; uint256 feeInShares = FullMath.mulDiv(remainingShares, FEES.tokenFee, 10000); uint256 balance = IERC20(userLock.tokenAddress).balanceOf(address(this)); uint256 feeInTokens = FullMath.mulDiv(feeInShares, balance, SHARES[userLock.tokenAddress] == 0 ? 1 : SHARES[userLock.tokenAddress]); TransferHelper.safeTransfer(userLock.tokenAddress, FEES.feeAddress, feeInTokens); userLock.sharesWithdrawn += feeInShares; SHARES[userLock.tokenAddress] -= feeInShares; } userLock.endEmission = _unlock_date; emit onRelock(_lockID, _unlock_date); } /** * @notice increase the amount of tokens per a specific lock, this is preferable to creating a new lock * Its possible to increase someone elses lock here it does not need to be your own, useful for contracts */ function incrementLock (uint256 _lockID, uint256 _amount) external nonReentrant { TokenLock storage userLock = LOCKS[_lockID]; require(_amount >= MINIMUM_DEPOSIT, 'MIN DEPOSIT'); uint256 balanceBefore = IERC20(userLock.tokenAddress).balanceOf(address(this)); TransferHelper.safeTransferFrom(userLock.tokenAddress, address(msg.sender), address(this), _amount); uint256 amountInTokens = IERC20(userLock.tokenAddress).balanceOf(address(this)) - balanceBefore; // percent fee if (!ZERO_FEE_WHITELIST.contains(userLock.tokenAddress)) { uint256 lockFee = FullMath.mulDiv(amountInTokens, FEES.tokenFee, 10000); TransferHelper.safeTransfer(userLock.tokenAddress, FEES.feeAddress, lockFee); amountInTokens -= lockFee; } uint256 shares; if (SHARES[userLock.tokenAddress] == 0) { shares = amountInTokens; } else { shares = FullMath.mulDiv(amountInTokens, SHARES[userLock.tokenAddress], balanceBefore); } require(shares > 0, 'SHARES'); SHARES[userLock.tokenAddress] += shares; userLock.sharesDeposited += shares; emit onLock(userLock.lockID, userLock.tokenAddress, userLock.owner, amountInTokens, userLock.startEmission, userLock.endEmission); } /** * @notice transfer a lock to a new owner, e.g. presale project -> project owner * Please be aware this generates a new lock, and nulls the old lock, so a new ID is assigned to the new lock. */ function transferLockOwnership (uint256 _lockID, address payable _newOwner) external nonReentrant { require(msg.sender != _newOwner, 'SELF'); TokenLock storage transferredLock = LOCKS[_lockID]; require(transferredLock.owner == msg.sender, 'OWNER'); TokenLock memory token_lock; token_lock.tokenAddress = transferredLock.tokenAddress; token_lock.sharesDeposited = transferredLock.sharesDeposited; token_lock.sharesWithdrawn = transferredLock.sharesWithdrawn; token_lock.startEmission = transferredLock.startEmission; token_lock.endEmission = transferredLock.endEmission; token_lock.lockID = NONCE; token_lock.owner = _newOwner; token_lock.condition = transferredLock.condition; // record the lock globally LOCKS[NONCE] = token_lock; TOKEN_LOCKS[transferredLock.tokenAddress].push(NONCE); // record the lock for the new owner UserInfo storage newOwner = USERS[_newOwner]; newOwner.lockedTokens.add(transferredLock.tokenAddress); newOwner.locksForToken[transferredLock.tokenAddress].push(token_lock.lockID); NONCE ++; // zero the lock from the old owner transferredLock.sharesWithdrawn = transferredLock.sharesDeposited; emit onTransferLock(_lockID, token_lock.lockID, msg.sender, _newOwner); } /** * @notice split a lock into two seperate locks, useful when a lock is about to expire and youd like to relock a portion * and withdraw a smaller portion * Only works on lock type 1, this feature does not work with lock type 2 * @param _amount the amount in tokens */ function splitLock (uint256 _lockID, uint256 _amount) external nonReentrant { require(_amount > 0, 'ZERO AMOUNT'); TokenLock storage userLock = LOCKS[_lockID]; require(userLock.owner == msg.sender, 'OWNER'); require(userLock.startEmission == 0, 'LOCK TYPE 2'); // convert _amount to its representation in shares uint256 balance = IERC20(userLock.tokenAddress).balanceOf(address(this)); uint256 amountInShares = FullMath.mulDiv(SHARES[userLock.tokenAddress], _amount, balance); require(userLock.sharesWithdrawn + amountInShares <= userLock.sharesDeposited); TokenLock memory token_lock; token_lock.tokenAddress = userLock.tokenAddress; token_lock.sharesDeposited = amountInShares; token_lock.endEmission = userLock.endEmission; token_lock.lockID = NONCE; token_lock.owner = msg.sender; token_lock.condition = userLock.condition; // debit previous lock userLock.sharesWithdrawn += amountInShares; // record the new lock globally LOCKS[NONCE] = token_lock; TOKEN_LOCKS[userLock.tokenAddress].push(NONCE); // record the new lock for the owner USERS[msg.sender].locksForToken[userLock.tokenAddress].push(token_lock.lockID); NONCE ++; emit onSplitLock(_lockID, token_lock.lockID, _amount); } /** * @notice migrates to the next locker version, only callable by lock owners */ function migrate (uint256 _lockID, uint256 _option) external nonReentrant { require(address(MIGRATOR) != address(0), "NOT SET"); TokenLock storage userLock = LOCKS[_lockID]; require(userLock.owner == msg.sender, 'OWNER'); uint256 sharesAvailable = userLock.sharesDeposited - userLock.sharesWithdrawn; require(sharesAvailable > 0, 'AMOUNT'); uint256 balance = IERC20(userLock.tokenAddress).balanceOf(address(this)); uint256 amountInTokens = FullMath.mulDiv(sharesAvailable, balance, SHARES[userLock.tokenAddress]); TransferHelper.safeApprove(userLock.tokenAddress, address(MIGRATOR), amountInTokens); MIGRATOR.migrate(userLock.tokenAddress, userLock.sharesDeposited, userLock.sharesWithdrawn, userLock.startEmission, userLock.endEmission, userLock.lockID, userLock.owner, userLock.condition, amountInTokens, _option); userLock.sharesWithdrawn = userLock.sharesDeposited; SHARES[userLock.tokenAddress] -= sharesAvailable; emit onMigrate(_lockID, amountInTokens); } /** * @notice premature unlock conditions can be malicous (prevent withdrawls by failing to evalaute or return non bools) * or not give community enough insurance tokens will remain locked until the end date, in such a case, it can be revoked */ function revokeCondition (uint256 _lockID) external nonReentrant { TokenLock storage userLock = LOCKS[_lockID]; require(userLock.owner == msg.sender, 'OWNER'); require(userLock.condition != address(0)); // already set to address(0) userLock.condition = address(0); } // test a condition on front end, added here for convenience in UI, returns unlockTokens() bool, or fails function testCondition (address condition) external view returns (bool) { return (IUnlockCondition(condition).unlockTokens()); } // returns withdrawable share amount from the lock, taking into consideration start and end emission function getWithdrawableShares (uint256 _lockID) public view returns (uint256) { TokenLock storage userLock = LOCKS[_lockID]; uint8 lockType = userLock.startEmission == 0 ? 1 : 2; uint256 amount = lockType == 1 ? userLock.sharesDeposited - userLock.sharesWithdrawn : userLock.sharesDeposited; uint256 withdrawable; withdrawable = VestingMathLibrary.getWithdrawableAmount ( userLock.startEmission, userLock.endEmission, amount, block.timestamp, userLock.condition ); if (lockType == 2) { withdrawable -= userLock.sharesWithdrawn; } return withdrawable; } // convenience function for UI, converts shares to the current amount in tokens function getWithdrawableTokens (uint256 _lockID) external view returns (uint256) { TokenLock storage userLock = LOCKS[_lockID]; uint256 withdrawableShares = getWithdrawableShares(userLock.lockID); uint256 balance = IERC20(userLock.tokenAddress).balanceOf(address(this)); uint256 amountTokens = FullMath.mulDiv(withdrawableShares, balance, SHARES[userLock.tokenAddress] == 0 ? 1 : SHARES[userLock.tokenAddress]); return amountTokens; } // For UI use function convertSharesToTokens (address _token, uint256 _shares) external view returns (uint256) { uint256 balance = IERC20(_token).balanceOf(address(this)); return FullMath.mulDiv(_shares, balance, SHARES[_token]); } function convertTokensToShares (address _token, uint256 _tokens) external view returns (uint256) { uint256 balance = IERC20(_token).balanceOf(address(this)); return FullMath.mulDiv(SHARES[_token], _tokens, balance); } // For use in UI, returns more useful lock Data than just querying LOCKS, // such as the real-time token amount representation of a locks shares function getLock (uint256 _lockID) external view returns (uint256, address, uint256, uint256, uint256, uint256, uint256, uint256, address, address) { TokenLock memory tokenLock = LOCKS[_lockID]; uint256 balance = IERC20(tokenLock.tokenAddress).balanceOf(address(this)); uint256 totalSharesOr1 = SHARES[tokenLock.tokenAddress] == 0 ? 1 : SHARES[tokenLock.tokenAddress]; // tokens deposited and tokens withdrawn is provided for convenience in UI, with rebasing these amounts will change uint256 tokensDeposited = FullMath.mulDiv(tokenLock.sharesDeposited, balance, totalSharesOr1); uint256 tokensWithdrawn = FullMath.mulDiv(tokenLock.sharesWithdrawn, balance, totalSharesOr1); return (tokenLock.lockID, tokenLock.tokenAddress, tokensDeposited, tokensWithdrawn, tokenLock.sharesDeposited, tokenLock.sharesWithdrawn, tokenLock.startEmission, tokenLock.endEmission, tokenLock.owner, tokenLock.condition); } function getNumLockedTokens () external view returns (uint256) { return TOKENS.length(); } function getTokenAtIndex (uint256 _index) external view returns (address) { return TOKENS.at(_index); } function getTokenLocksLength (address _token) external view returns (uint256) { return TOKEN_LOCKS[_token].length; } function getTokenLockIDAtIndex (address _token, uint256 _index) external view returns (uint256) { return TOKEN_LOCKS[_token][_index]; } // user functions function getUserLockedTokensLength (address _user) external view returns (uint256) { return USERS[_user].lockedTokens.length(); } function getUserLockedTokenAtIndex (address _user, uint256 _index) external view returns (address) { return USERS[_user].lockedTokens.at(_index); } function getUserLocksForTokenLength (address _user, address _token) external view returns (uint256) { return USERS[_user].locksForToken[_token].length; } function getUserLockIDForTokenAtIndex (address _user, address _token, uint256 _index) external view returns (uint256) { return USERS[_user].locksForToken[_token][_index]; } // no Fee Tokens function getZeroFeeTokensLength () external view returns (uint256) { return ZERO_FEE_WHITELIST.length(); } function getZeroFeeTokenAtIndex (uint256 _index) external view returns (address) { return ZERO_FEE_WHITELIST.at(_index); } function tokenOnZeroFeeWhitelist (address _token) external view returns (bool) { return ZERO_FEE_WHITELIST.contains(_token); } // whitelist function getTokenWhitelisterLength () external view returns (uint256) { return TOKEN_WHITELISTERS.length(); } function getTokenWhitelisterAtIndex (uint256 _index) external view returns (address) { return TOKEN_WHITELISTERS.at(_index); } function getTokenWhitelisterStatus (address _user) external view returns (bool) { return TOKEN_WHITELISTERS.contains(_user); } }
// SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/structs/[email protected] pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // Sourced from https://gist.github.com/paulrberg/439ebe860cd2f9893852e2cab5655b65, credits to Paulrberg for porting to solidity v0.8 /// @title Contains 512-bit math functions /// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision /// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits library FullMath { /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 /// @param a The multiplicand /// @param b The multiplier /// @param denominator The divisor /// @return result The 256-bit result /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv function mulDiv( uint256 a, uint256 b, uint256 denominator ) internal pure returns (uint256 result) { // 512-bit multiply [prod1 prod0] = a * b // Compute the product mod 2**256 and mod 2**256 - 1 // then use the Chinese Remainder Theorem to reconstruct // the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2**256 + prod0 uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(a, b, not(0)) prod0 := mul(a, b) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division if (prod1 == 0) { require(denominator > 0); assembly { result := div(prod0, denominator) } return result; } // Make sure the result is less than 2**256. // Also prevents denominator == 0 require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0] // Compute remainder using mulmod uint256 remainder; assembly { remainder := mulmod(a, b, denominator) } // Subtract 256 bit number from 512 bit number assembly { prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator // Compute largest power of two divisor of denominator. // Always >= 1. unchecked { uint256 twos = (type(uint256).max - denominator + 1) & denominator; // Divide denominator by power of two assembly { denominator := div(denominator, twos) } // Divide [prod1 prod0] by the factors of two assembly { prod0 := div(prod0, twos) } // Shift in bits from prod1 into prod0. For this we need // to flip `twos` such that it is 2**256 / twos. // If twos is zero, then it becomes one assembly { twos := add(div(sub(0, twos), twos), 1) } prod0 |= prod1 * twos; // Invert denominator mod 2**256 // Now that denominator is an odd number, it has an inverse // modulo 2**256 such that denominator * inv = 1 mod 2**256. // Compute the inverse by starting with a seed that is correct // correct for four bits. That is, denominator * inv = 1 mod 2**4 uint256 inv = (3 * denominator) ^ 2; // Now use Newton-Raphson iteration to improve the precision. // Thanks to Hensel's lifting lemma, this also works in modular // arithmetic, doubling the correct bits in each step. inv *= 2 - denominator * inv; // inverse mod 2**8 inv *= 2 - denominator * inv; // inverse mod 2**16 inv *= 2 - denominator * inv; // inverse mod 2**32 inv *= 2 - denominator * inv; // inverse mod 2**64 inv *= 2 - denominator * inv; // inverse mod 2**128 inv *= 2 - denominator * inv; // inverse mod 2**256 // Because the division is now exact we can divide by multiplying // with the modular inverse of denominator. This will give us the // correct result modulo 2**256. Since the precoditions guarantee // that the outcome is less than 2**256, this is the final result. // We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inv; return result; } } }
// SPDX-License-Identifier: MIT // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT // File @openzeppelin/contracts/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./EnumerableSet.sol"; import "./Ownable.sol"; interface IUnicryptAdmin { function userIsAdmin(address _user) external view returns (bool); } contract UnicryptAdmin is Ownable { using EnumerableSet for EnumerableSet.AddressSet; EnumerableSet.AddressSet private ADMINS; function ownerEditAdmin (address _user, bool _add) public onlyOwner { if (_add) { ADMINS.add(_user); } else { ADMINS.remove(_user); } } // Admin getters function getAdminsLength () external view returns (uint256) { return ADMINS.length(); } function getAdminAtIndex (uint256 _index) external view returns (address) { return ADMINS.at(_index); } function userIsAdmin (address _user) external view returns (bool) { return ADMINS.contains(_user); } }
// SPDX-License-Identifier: UNLICENSED // ALL RIGHTS RESERVED // Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts. pragma solidity ^0.8.0; import './FullMath.sol'; // Allows a seperate contract with a unlockTokens() function to be used to override unlock dates interface IUnlockCondition { function unlockTokens() external view returns (bool); } library VestingMathLibrary { // gets the withdrawable amount from a lock function getWithdrawableAmount (uint256 startEmission, uint256 endEmission, uint256 amount, uint256 timeStamp, address condition) internal view returns (uint256) { // It is possible in some cases IUnlockCondition(condition).unlockTokens() will fail (func changes state or does not return a bool) // for this reason we implemented revokeCondition per lock so funds are never stuck in the contract. // Prematurely release the lock if the condition is met if (condition != address(0) && IUnlockCondition(condition).unlockTokens()) { return amount; } // Lock type 1 logic block (Normal Unlock on due date) if (startEmission == 0 || startEmission == endEmission) { return endEmission < timeStamp ? amount : 0; } // Lock type 2 logic block (Linear scaling lock) uint256 timeClamp = timeStamp; if (timeClamp > endEmission) { timeClamp = endEmission; } if (timeClamp < startEmission) { timeClamp = startEmission; } uint256 elapsed = timeClamp - startEmission; uint256 fullPeriod = endEmission - startEmission; return FullMath.mulDiv(amount, elapsed, fullPeriod); // fullPeriod cannot equal zero due to earlier checks and restraints when locking tokens (startEmission < endEmission) } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IUnicryptAdmin","name":"_uncxAdmins","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"lockID","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountInTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startEmission","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endEmission","type":"uint256"}],"name":"onLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountInTokens","type":"uint256"}],"name":"onMigrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockDate","type":"uint256"}],"name":"onRelock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fromLockID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toLockID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountInTokens","type":"uint256"}],"name":"onSplitLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockIDFrom","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockIDto","type":"uint256"},{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"onTransferLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountInTokens","type":"uint256"}],"name":"onWithdraw","type":"event"},{"inputs":[],"name":"BLACKLIST","outputs":[{"internalType":"contract ITokenBlacklist","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEES","outputs":[{"internalType":"uint256","name":"tokenFee","type":"uint256"},{"internalType":"uint256","name":"freeLockingFee","type":"uint256"},{"internalType":"address payable","name":"feeAddress","type":"address"},{"internalType":"address","name":"freeLockingToken","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"LOCKS","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"sharesDeposited","type":"uint256"},{"internalType":"uint256","name":"sharesWithdrawn","type":"uint256"},{"internalType":"uint256","name":"startEmission","type":"uint256"},{"internalType":"uint256","name":"endEmission","type":"uint256"},{"internalType":"uint256","name":"lockID","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"condition","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIGRATOR","outputs":[{"internalType":"contract IMigrator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_DEPOSIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NONCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"SHARES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_add","type":"bool"}],"name":"adminSetWhitelister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"convertSharesToTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"convertTokensToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_add","type":"bool"}],"name":"editZeroFeeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"}],"name":"getLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumLockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTokenAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTokenLockIDAtIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getTokenLocksLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTokenWhitelisterAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenWhitelisterLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getTokenWhitelisterStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getUserLockIDForTokenAtIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getUserLockedTokenAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserLockedTokensLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"getUserLocksForTokenLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"}],"name":"getWithdrawableShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"}],"name":"getWithdrawableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getZeroFeeTokenAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getZeroFeeTokensLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"incrementLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"components":[{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startEmission","type":"uint256"},{"internalType":"uint256","name":"endEmission","type":"uint256"},{"internalType":"address","name":"condition","type":"address"}],"internalType":"struct TokenVesting.LockParams[]","name":"_lock_params","type":"tuple[]"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_option","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"payForFreeTokenLocks","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_unlock_date","type":"uint256"}],"name":"relock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"}],"name":"revokeCondition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITokenBlacklist","name":"_contract","type":"address"}],"name":"setBlacklistContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenFee","type":"uint256"},{"internalType":"uint256","name":"_freeLockingFee","type":"uint256"},{"internalType":"address payable","name":"_feeAddress","type":"address"},{"internalType":"address","name":"_freeLockingToken","type":"address"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigrator","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"splitLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"condition","type":"address"}],"name":"testCondition","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"tokenOnZeroFeeWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"address payable","name":"_newOwner","type":"address"}],"name":"transferLockOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600060055560646006553480156200001b57600080fd5b5060405162003bed38038062003bed8339810160408190526200003e91620000d7565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055601280546001600160a01b039092166001600160a01b03199283161790556023600e556010805490911673aa3d85ad9d128dfecb55424085754f6dfa643eb1179055678ac7230489e80000600f5562000109565b600060208284031215620000ea57600080fd5b81516001600160a01b03811681146200010257600080fd5b9392505050565b613ad480620001196000396000f3fe6080604052600436106102665760003560e01c806397988dce11610144578063cf0d5af3116100b6578063e04ab1391161007a578063e04ab139146108a4578063e091dd1a146108c4578063e52c4b7a146108da578063f19451d8146108fa578063f2fde38b14610910578063fc0633d01461093057600080fd5b8063cf0d5af3146106fe578063cf6dde4a146107b7578063d060e175146107d7578063d323cdbf1461080d578063d68f4dd11461082d57600080fd5b8063b2fb30cb11610108578063b2fb30cb14610607578063b4540fa714610627578063bb5ee00114610647578063c368803a14610691578063c8b0cf68146106be578063ca5cc0c2146106de57600080fd5b806397988dce146105745780639ecd747214610594578063a34df14f146105b4578063a6dcb8de146105c7578063b1d7655c146105e757600080fd5b80635a5b8d9e116101dd578063783451e8116101a1578063783451e81461046f57806386de2fcb146104845780638b7b23ee146104a45780638ba74f17146105025780638da5cb5b14610522578063903df8061461055457600080fd5b80635a5b8d9e146103da5780636588fc03146103fa578063675187a31461041a578063715018a61461043a578063741af17e1461044f57600080fd5b80631d7065db1161022f5780631d7065db1461030a57806323cf31181461033a5780633717dee71461035a5780633e54bacb1461037a578063441a3e701461039a5780635a04fb69146103ba57600080fd5b8062623ae31461026b57806303e1cdf4146102935780630cdebc9e146102a857806313ef2b1b146102c85780631c30ffb1146102ea575b600080fd5b34801561027757600080fd5b50610280610950565b6040519081526020015b60405180910390f35b34801561029f57600080fd5b50610280610961565b3480156102b457600080fd5b506102806102c336600461376b565b61096d565b3480156102d457600080fd5b506102e86102e33660046136b5565b610a1c565b005b3480156102f657600080fd5b50610280610305366004613674565b611135565b34801561031657600080fd5b5061032a61032536600461361e565b611187565b604051901515815260200161028a565b34801561034657600080fd5b506102e861035536600461361e565b611194565b34801561036657600080fd5b506102e8610375366004613898565b6111e0565b34801561038657600080fd5b506102e8610395366004613898565b611529565b3480156103a657600080fd5b506102e86103b5366004613898565b61183e565b3480156103c657600080fd5b506102e86103d5366004613873565b611b1f565b3480156103e657600080fd5b506102e86103f5366004613841565b611ed2565b34801561040657600080fd5b506102e8610415366004613898565b611f63565b34801561042657600080fd5b5061032a61043536600461361e565b612299565b34801561044657600080fd5b506102e861230c565b34801561045b57600080fd5b506102e861046a36600461361e565b612380565b34801561047b57600080fd5b506102806123cc565b34801561049057600080fd5b506102e861049f36600461373d565b6123d8565b3480156104b057600080fd5b50600e54600f546010546011546104d39392916001600160a01b03908116911684565b6040805194855260208501939093526001600160a01b039182169284019290925216606082015260800161028a565b34801561050e57600080fd5b5061028061051d36600461376b565b612427565b34801561052e57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161028a565b34801561056057600080fd5b5061053c61056f36600461376b565b612464565b34801561058057600080fd5b5061053c61058f366004613841565b612486565b3480156105a057600080fd5b5060135461053c906001600160a01b031681565b6102e86105c236600461361e565b612493565b3480156105d357600080fd5b506102806105e236600461361e565b612593565b3480156105f357600080fd5b5061053c610602366004613841565b6125b4565b34801561061357600080fd5b506102e8610622366004613898565b6125c1565b34801561063357600080fd5b506102e861064236600461373d565b61285e565b34801561065357600080fd5b5061028061066236600461363b565b6001600160a01b0391821660009081526008602090815260408083209390941682526002909201909152205490565b34801561069d57600080fd5b506102806106ac36600461361e565b60096020526000908152604090205481565b3480156106ca57600080fd5b5060145461053c906001600160a01b031681565b3480156106ea57600080fd5b506102806106f936600461376b565b61293a565b34801561070a57600080fd5b5061076b610719366004613841565b6004602081905260009182526040909120805460018201546002830154600384015494840154600585015460068601546007909601546001600160a01b03958616979496939592939192918216911688565b604080516001600160a01b03998a16815260208101989098528701959095526060860193909352608085019190915260a0840152831660c083015290911660e08201526101000161028a565b3480156107c357600080fd5b5061032a6107d236600461361e565b6129dd565b3480156107e357600080fd5b506102806107f236600461361e565b6001600160a01b031660009081526007602052604090205490565b34801561081957600080fd5b50610280610828366004613841565b6129ea565b34801561083957600080fd5b5061084d610848366004613841565b612adc565b604080519a8b526001600160a01b03998a1660208c01528a01979097526060890195909552608088019390935260a087019190915260c086015260e08501528216610100840152166101208201526101400161028a565b3480156108b057600080fd5b506102806108bf366004613841565b612c92565b3480156108d057600080fd5b5061028060055481565b3480156108e657600080fd5b5061053c6108f5366004613841565b612d39565b34801561090657600080fd5b5061028060065481565b34801561091c57600080fd5b506102e861092b36600461361e565b612d46565b34801561093c57600080fd5b506102e861094b3660046138ba565b612e30565b600061095c600c612e94565b905090565b600061095c600a612e94565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b1580156109b157600080fd5b505afa1580156109c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e9919061385a565b6001600160a01b038516600090815260096020526040902054909150610a129084908390612e9e565b9150505b92915050565b60026001541415610a485760405162461bcd60e51b8152600401610a3f90613993565b60405180910390fd5b600260015580610a865760405162461bcd60e51b81526020600482015260096024820152684e4f20504152414d5360b81b6044820152606401610a3f565b6014546001600160a01b031615610af557601454604051633c6202c960e21b81526001600160a01b0385811660048301529091169063f1880b249060240160006040518083038186803b158015610adc57600080fd5b505afa158015610af0573d6000803e3d6000fd5b505050505b6000805b82811015610b3c57838382818110610b1357610b13613a62565b905060a002016020013582610b2891906139ca565b915080610b3481613a1b565b915050610af9565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb7919061385a565b9050610bc585333085612f4d565b6040516370a0823160e01b815230600482015260009082906001600160a01b038816906370a082319060240160206040518083038186803b158015610c0957600080fd5b505afa158015610c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c41919061385a565b610c4b9190613a04565b9050610c58600a8761307d565b610c99576000610c7082600e60000154612710612e9e565b601054909150610c8b9088906001600160a01b03168361309f565b610c958183613a04565b9150505b6000805b85811015611127576000878783818110610cb957610cb9613a62565b905060a00201803603810190610ccf91906137b4565b90508060600151816040015110610d115760405162461bcd60e51b81526020600482015260066024820152651411549253d160d21b6044820152606401610a3f565b6402540be400816060015110610d5d5760405162461bcd60e51b81526020600482015260116024820152701512535154d51053540812539590531251607a1b6044820152606401610a3f565b60065481602001511015610da15760405162461bcd60e51b815260206004820152600b60248201526a1352538811115413d4d25560aa1b6044820152606401610a3f565b6000610db282602001518689612e9e565b6001600160a01b038b16600090815260096020526040902054909150610dda57809350610e0f565b6001600160a01b038a16600090815260096020526040902054610e0c9082908815610e055788612e9e565b6001612e9e565b93505b60008411610e485760405162461bcd60e51b815260206004820152600660248201526553484152455360d01b6044820152606401610a3f565b6001600160a01b038a1660009081526009602052604081208054869290610e709084906139ca565b90915550610e80905081876139ca565b9550610e8a6135be565b6001600160a01b03808c16825260208201869052604084015160608084019190915284015160808084019190915260055460a08401528451821660c08401528401511615610f5c5782608001516001600160a01b031663f968f4936040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0f57600080fd5b505afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f479190613797565b5060808301516001600160a01b031660e08201525b60058054600090815260046020818152604092839020855181546001600160a01b039182166001600160a01b0319918216178355928701516001830155938601516002808301919091556060870151600383015560808701519382019390935560a08601519481019490945560c085015160068501805491851691831691909117905560e085015160079094018054949093169316929092179055611001908c6131ba565b506001600160a01b03808c166000908152600760209081526040808320600554815460018101835591855283852090910155865190931682526008905220611049818d6131ba565b506001600160a01b038c166000908152600282016020908152604082206005805482546001810184559285529284209091019190915580549161108b83613a1b565b91905055507f4d0f9887048089b093c92bec885ab529000723bce1a79f4e81a5990619910b968260a001518d8460c001518686606001518760800151604051611108969594939291909586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60405180910390a150505050808061111f90613a1b565b915050610c9d565b505060018055505050505050565b6001600160a01b03808416600090815260086020908152604080832093861683526002909301905290812080548390811061117257611172613a62565b906000526020600020015490505b9392505050565b6000610a16600a8361307d565b6000546001600160a01b031633146111be5760405162461bcd60e51b8152600401610a3f9061395e565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600260015414156112035760405162461bcd60e51b8152600401610a3f90613993565b600260015560008281526004602052604090206006548210156112565760405162461bcd60e51b815260206004820152600b60248201526a1352538811115413d4d25560aa1b6044820152606401610a3f565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561129957600080fd5b505afa1580156112ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d1919061385a565b82549091506112eb906001600160a01b0316333086612f4d565b81546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a082319060240160206040518083038186803b15801561133257600080fd5b505afa158015611346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136a919061385a565b6113749190613a04565b835490915061138e90600a906001600160a01b031661307d565b6113d35760006113a682600e60000154612710612e9e565b84546010549192506113c5916001600160a01b0391821691168361309f565b6113cf8183613a04565b9150505b82546001600160a01b03166000908152600960205260408120546113f8575080611421565b83546001600160a01b031660009081526009602052604090205461141e90839085612e9e565b90505b6000811161145a5760405162461bcd60e51b815260206004820152600660248201526553484152455360d01b6044820152606401610a3f565b83546001600160a01b0316600090815260096020526040812080548392906114839084906139ca565b925050819055508084600101600082825461149e91906139ca565b909155505060058401548454600686015460038701546004880154604080519586526001600160a01b039485166020870152939092169284019290925260608301859052608083019190915260a08201527f4d0f9887048089b093c92bec885ab529000723bce1a79f4e81a5990619910b969060c0015b60405180910390a150506001805550505050565b6002600154141561154c5760405162461bcd60e51b8152600401610a3f90613993565b60026001556013546001600160a01b03166115935760405162461bcd60e51b81526020600482015260076024820152661393d50814d15560ca1b6044820152606401610a3f565b600082815260046020526040902060068101546001600160a01b031633146115cd5760405162461bcd60e51b8152600401610a3f9061393f565b6000816002015482600101546115e39190613a04565b90506000811161161e5760405162461bcd60e51b8152602060048201526006602482015265105353d5539560d21b6044820152606401610a3f565b81546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561166157600080fd5b505afa158015611675573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611699919061385a565b83546001600160a01b0316600090815260096020526040812054919250906116c49084908490612e9e565b84546013549192506116e3916001600160a01b039182169116836131cf565b60135484546001860154600287015460038801546004808a015460058b015460068c015460078d01546040516308a8f46960e21b81526001600160a01b03998a1695810195909552602485019790975260448401959095526064830193909352608482015260a481019190915290831660c482015290821660e4820152610104810184905261012481018890529116906322a3d1a49061014401602060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf9190613797565b506001840154600285015583546001600160a01b031660009081526009602052604081208054859290611803908490613a04565b909155505060408051878152602081018390527f8b1497abd425402b9139208bcb7f83d61a7545712a632d73a1ae68039cd593ab9101611515565b600260015414156118615760405162461bcd60e51b8152600401610a3f90613993565b6002600155600082815260046020526040902060068101546001600160a01b031633146118a05760405162461bcd60e51b8152600401610a3f9061393f565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156118e357600080fd5b505afa1580156118f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191b919061385a565b82546001600160a01b031660009081526009602052604081205491925090611944908584612e9e565b9050801580156119545750600084115b15611967578061196381613a1b565b9150505b600081116119a85760405162461bcd60e51b815260206004820152600e60248201526d16915493c815d2551211149055d360921b6044820152606401610a3f565b60006119b78460050154612c92565b9050806119c58360016139ca565b1415611a0b5783546001600160a01b03166000908152600960205260409020546119f9906119f381866139e2565b85612e9e565b611a0b5781611a0781613a1b565b9250505b81811015611a445760405162461bcd60e51b8152602060048201526006602482015265105353d5539560d21b6044820152606401610a3f565b81846002016000828254611a5891906139ca565b909155505083546001600160a01b0316600090815260096020526040812054611a849084908690612e9e565b85546001600160a01b0316600090815260096020526040812080549293508592909190611ab2908490613a04565b90915550508454611acd906001600160a01b0316338361309f565b8454604080516001600160a01b039092168252602082018390527fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc910160405180910390a15050600180555050505050565b60026001541415611b425760405162461bcd60e51b8152600401610a3f90613993565b6002600155336001600160a01b0382161415611b895760405162461bcd60e51b8152600401610a3f9060208082526004908201526329a2a62360e11b604082015260600190565b600082815260046020526040902060068101546001600160a01b03163314611bc35760405162461bcd60e51b8152600401610a3f9061393f565b611bcb6135be565b8160000160009054906101000a90046001600160a01b031681600001906001600160a01b031690816001600160a01b03168152505081600101548160200181815250508160020154816040018181525050816003015481606001818152505081600401548160800181815250506005548160a0018181525050828160c001906001600160a01b031690816001600160a01b0316815250508160070160009054906101000a90046001600160a01b03168160e001906001600160a01b031690816001600160a01b0316815250508060046000600554815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160070160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050600760008360000160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000206005549080600181540180825580915050600190039060005260206000200160009091909190915055600060086000856001600160a01b03166001600160a01b031681526020019081526020016000209050611e248360000160009054906101000a90046001600160a01b0316826000016131ba90919063ffffffff16565b5082546001600160a01b031660009081526002820160209081526040822060a0850151815460018101835591845291832001556005805491611e6583613a1b565b90915550506001830154600284015560a082015160408051878152602081019290925233828201526001600160a01b0386166060830152517fc1329eea12893a6eff780df43cf4ec708fdc6ce7fbacf84ee8cf9355a9af1dd89181900360800190a1505060018055505050565b60026001541415611ef55760405162461bcd60e51b8152600401610a3f90613993565b6002600155600081815260046020526040902060068101546001600160a01b03163314611f345760405162461bcd60e51b8152600401610a3f9061393f565b60078101546001600160a01b0316611f4b57600080fd5b60070180546001600160a01b03191690555060018055565b60026001541415611f865760405162461bcd60e51b8152600401610a3f90613993565b600260015580611fc65760405162461bcd60e51b815260206004820152600b60248201526a16915493c8105353d5539560aa1b6044820152606401610a3f565b600082815260046020526040902060068101546001600160a01b031633146120005760405162461bcd60e51b8152600401610a3f9061393f565b6003810154156120405760405162461bcd60e51b815260206004820152600b60248201526a2627a1a5902a2ca822901960a91b6044820152606401610a3f565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561208357600080fd5b505afa158015612097573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120bb919061385a565b82546001600160a01b0316600090815260096020526040812054919250906120e4908584612e9e565b905082600101548184600201546120fb91906139ca565b111561210657600080fd5b61210e6135be565b83546001600160a01b039081168252602082018390526004850154608083015260055460a08301523360c083015260078501541660e082015260028401805483919060009061215e9084906139ca565b9091555050600580546000908152600460208181526040808420865181546001600160a01b03199081166001600160a01b03928316178355888501516001808501919091558985015160028086019190915560608b0151600386015560808b01519785019790975560a08a018051858b015560c08b0151600686018054851691861691909117905560e08b015160079586018054909416908516179092558c548316885292855283872088548154808601835591895286892090910155338752600885528387208c5490921687529401835290842092518354918201845592845290832001558154919061225183613a1b565b909155505060a081015160408051888152602081019290925281018690527fbfc02f4250f5e54a31a72371b1932061a0245db2afb5124b547306f6ebffd8ad90606001611515565b6000816001600160a01b031663f968f4936040518163ffffffff1660e01b815260040160206040518083038186803b1580156122d457600080fd5b505afa1580156122e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a169190613797565b6000546001600160a01b031633146123365760405162461bcd60e51b8152600401610a3f9061395e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146123aa5760405162461bcd60e51b8152600401610a3f9061395e565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b600061095c6002612e94565b6000546001600160a01b031633146124025760405162461bcd60e51b8152600401610a3f9061395e565b801561241857612413600c836131ba565b505050565b612413600c836132e3565b5050565b6001600160a01b038216600090815260076020526040812080548390811061245157612451613a62565b9060005260206000200154905092915050565b6001600160a01b038216600090815260086020526040812061118090836132f8565b6000610a166002836132f8565b61249e600a8261307d565b156124d45760405162461bcd60e51b8152600401610a3f906020808252600490820152631410525160e21b604082015260600190565b6011546001600160a01b031661256557600f5434146125235760405162461bcd60e51b815260206004820152600b60248201526a119151481393d50813515560aa1b6044820152606401610a3f565b601054600f546040516001600160a01b039092169181156108fc0291906000818181858888f1935050505015801561255f573d6000803e3d6000fd5b50612588565b601154601054600f54612588926001600160a01b03908116923392911690612f4d565b612423600a826131ba565b6001600160a01b0381166000908152600860205260408120610a1690612e94565b6000610a16600a836132f8565b600260015414156125e45760405162461bcd60e51b8152600401610a3f90613993565b60026001556402540be40081106126265760405162461bcd60e51b8152600401610a3f9060208082526004908201526354494d4560e01b604082015260600190565b600082815260046020526040902060068101546001600160a01b031633146126605760405162461bcd60e51b8152600401610a3f9061393f565b818160040154106126995760405162461bcd60e51b815260206004820152600360248201526211539160ea1b6044820152606401610a3f565b80546126b090600a906001600160a01b031661307d565b612815576000816002015482600101546126ca9190613a04565b905060006126e082600e60000154612710612e9e565b83546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561272857600080fd5b505afa15801561273c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612760919061385a565b84546001600160a01b0316600090815260096020526040812054919250906127aa908490849015610e055787546001600160a01b0316600090815260096020526040902054612e9e565b85546010549192506127c9916001600160a01b0391821691168361309f565b828560020160008282546127dd91906139ca565b909155505084546001600160a01b03166000908152600960205260408120805485929061280b908490613a04565b9091555050505050505b6004810182905560408051848152602081018490527fefaff1b90138281d215452c67f793017f52e456f65c28ac63f5309a89a059b47910160405180910390a150506001805550565b601254604051632a35efd360e21b81523360048201526001600160a01b039091169063a8d7bf4c9060240160206040518083038186803b1580156128a157600080fd5b505afa1580156128b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d99190613797565b806128ea57506128ea600c3361307d565b61291e5760405162461bcd60e51b815260206004820152600560248201526420a226a4a760d91b6044820152606401610a3f565b801561292f57612413600a836131ba565b612413600a836132e3565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b15801561297e57600080fd5b505afa158015612992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b6919061385a565b6001600160a01b038516600090815260096020526040902054909150610a12908483612e9e565b6000610a16600c8361307d565b600081815260046020526040812060058101548290612a0890612c92565b82546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015612a5057600080fd5b505afa158015612a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a88919061385a565b83546001600160a01b031660009081526009602052604081205491925090612ad2908490849015610e055786546001600160a01b0316600090815260096020526040902054612e9e565b9695505050505050565b600081815260046020818152604080842081516101008101835281546001600160a01b0390811680835260018401549583019590955260028301548285015260038301546060830152828601546080830152600583015460a08301526006830154811660c083015260079092015490911660e082015290516370a0823160e01b81523093810193909352839283928392839283928392839283928392918391906370a082319060240160206040518083038186803b158015612b9d57600080fd5b505afa158015612bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd5919061385a565b82516001600160a01b03166000908152600960205260408120549192509015612c175782516001600160a01b0316600090815260096020526040902054612c1a565b60015b90506000612c2d84602001518484612e9e565b90506000612c4085604001518585612e9e565b90508460a0015185600001518383886020015189604001518a606001518b608001518c60c001518d60e001519e509e509e509e509e509e509e509e509e509e5050505050509193959799509193959799565b60008181526004602052604081206003810154829015612cb3576002612cb6565b60015b905060008160ff16600114612ccf578260010154612ce3565b82600201548360010154612ce39190613a04565b90506000612d138460030154856004015484428860070160009054906101000a90046001600160a01b0316613304565b90508260ff1660021415612d30576002840154612ad29082613a04565b95945050505050565b6000610a16600c836132f8565b6000546001600160a01b03163314612d705760405162461bcd60e51b8152600401610a3f9061395e565b6001600160a01b038116612dd55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612e5a5760405162461bcd60e51b8152600401610a3f9061395e565b600e93909355600f91909155601080546001600160a01b039283166001600160a01b03199182161790915560118054929093169116179055565b6000610a16825490565b600080806000198587098587029250828110838203039150508060001415612ed85760008411612ecd57600080fd5b508290049050611180565b808411612ee457600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612fb19190613904565b6000604051808303816000865af19150503d8060008114612fee576040519150601f19603f3d011682016040523d82523d6000602084013e612ff3565b606091505b509150915081801561301d57508051158061301d57508080602001905181019061301d9190613797565b6130755760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610a3f565b505050505050565b6001600160a01b03811660009081526001830160205260408120541515611180565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916130fb9190613904565b6000604051808303816000865af19150503d8060008114613138576040519150601f19603f3d011682016040523d82523d6000602084013e61313d565b606091505b50915091508180156131675750805115806131675750808060200190518101906131679190613797565b6131b35760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610a3f565b5050505050565b6000611180836001600160a01b038416613409565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b179052915160009283929087169161322b9190613904565b6000604051808303816000865af19150503d8060008114613268576040519150601f19603f3d011682016040523d82523d6000602084013e61326d565b606091505b50915091508180156132975750805115806132975750808060200190518101906132979190613797565b6131b35760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c454400006044820152606401610a3f565b6000611180836001600160a01b038416613458565b6000611180838361354b565b60006001600160a01b0382161580159061338a5750816001600160a01b031663f968f4936040518163ffffffff1660e01b815260040160206040518083038186803b15801561335257600080fd5b505afa158015613366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338a9190613797565b15613396575082612d30565b8515806133a257508486145b156133be578285106133b55760006133b7565b835b9050612d30565b82858111156133ca5750845b868110156133d55750855b60006133e18883613a04565b905060006133ef8989613a04565b90506133fc878383612e9e565b9998505050505050505050565b600081815260018301602052604081205461345057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a16565b506000610a16565b6000818152600183016020526040812054801561354157600061347c600183613a04565b855490915060009061349090600190613a04565b905060008660000182815481106134a9576134a9613a62565b90600052602060002001549050808760000184815481106134cc576134cc613a62565b6000918252602090912001556134e38360016139ca565b6000828152600189016020526040902055865487908061350557613505613a4c565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610a16565b6000915050610a16565b815460009082106135a95760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610a3f565b82600001828154811061245157612451613a62565b60405180610100016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b60006020828403121561363057600080fd5b813561118081613a78565b6000806040838503121561364e57600080fd5b823561365981613a78565b9150602083013561366981613a78565b809150509250929050565b60008060006060848603121561368957600080fd5b833561369481613a78565b925060208401356136a481613a78565b929592945050506040919091013590565b6000806000604084860312156136ca57600080fd5b83356136d581613a78565b9250602084013567ffffffffffffffff808211156136f257600080fd5b818601915086601f83011261370657600080fd5b81358181111561371557600080fd5b87602060a08302850101111561372a57600080fd5b6020830194508093505050509250925092565b6000806040838503121561375057600080fd5b823561375b81613a78565b9150602083013561366981613a90565b6000806040838503121561377e57600080fd5b823561378981613a78565b946020939093013593505050565b6000602082840312156137a957600080fd5b815161118081613a90565b600060a082840312156137c657600080fd5b60405160a0810181811067ffffffffffffffff821117156137f757634e487b7160e01b600052604160045260246000fd5b604052823561380581613a78565b80825250602083013560208201526040830135604082015260608301356060820152608083013561383581613a78565b60808201529392505050565b60006020828403121561385357600080fd5b5035919050565b60006020828403121561386c57600080fd5b5051919050565b6000806040838503121561388657600080fd5b82359150602083013561366981613a78565b600080604083850312156138ab57600080fd5b50508035926020909101359150565b600080600080608085870312156138d057600080fd5b843593506020850135925060408501356138e981613a78565b915060608501356138f981613a78565b939692955090935050565b6000825160005b81811015613925576020818601810151858301520161390b565b81811115613934576000828501525b509190910192915050565b60208082526005908201526427aba722a960d91b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156139dd576139dd613a36565b500190565b6000826139ff57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015613a1657613a16613a36565b500390565b6000600019821415613a2f57613a2f613a36565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114613a8d57600080fd5b50565b8015158114613a8d57600080fdfea2646970667358221220ab61d8cb2cf53ab318184de984944641a595ad15cf316dd923e90d830ae95cc364736f6c6343000807003300000000000000000000000068e9a39800db0e2e0a7fdcfc21fa601251973ccf
Deployed Bytecode
0x6080604052600436106102665760003560e01c806397988dce11610144578063cf0d5af3116100b6578063e04ab1391161007a578063e04ab139146108a4578063e091dd1a146108c4578063e52c4b7a146108da578063f19451d8146108fa578063f2fde38b14610910578063fc0633d01461093057600080fd5b8063cf0d5af3146106fe578063cf6dde4a146107b7578063d060e175146107d7578063d323cdbf1461080d578063d68f4dd11461082d57600080fd5b8063b2fb30cb11610108578063b2fb30cb14610607578063b4540fa714610627578063bb5ee00114610647578063c368803a14610691578063c8b0cf68146106be578063ca5cc0c2146106de57600080fd5b806397988dce146105745780639ecd747214610594578063a34df14f146105b4578063a6dcb8de146105c7578063b1d7655c146105e757600080fd5b80635a5b8d9e116101dd578063783451e8116101a1578063783451e81461046f57806386de2fcb146104845780638b7b23ee146104a45780638ba74f17146105025780638da5cb5b14610522578063903df8061461055457600080fd5b80635a5b8d9e146103da5780636588fc03146103fa578063675187a31461041a578063715018a61461043a578063741af17e1461044f57600080fd5b80631d7065db1161022f5780631d7065db1461030a57806323cf31181461033a5780633717dee71461035a5780633e54bacb1461037a578063441a3e701461039a5780635a04fb69146103ba57600080fd5b8062623ae31461026b57806303e1cdf4146102935780630cdebc9e146102a857806313ef2b1b146102c85780631c30ffb1146102ea575b600080fd5b34801561027757600080fd5b50610280610950565b6040519081526020015b60405180910390f35b34801561029f57600080fd5b50610280610961565b3480156102b457600080fd5b506102806102c336600461376b565b61096d565b3480156102d457600080fd5b506102e86102e33660046136b5565b610a1c565b005b3480156102f657600080fd5b50610280610305366004613674565b611135565b34801561031657600080fd5b5061032a61032536600461361e565b611187565b604051901515815260200161028a565b34801561034657600080fd5b506102e861035536600461361e565b611194565b34801561036657600080fd5b506102e8610375366004613898565b6111e0565b34801561038657600080fd5b506102e8610395366004613898565b611529565b3480156103a657600080fd5b506102e86103b5366004613898565b61183e565b3480156103c657600080fd5b506102e86103d5366004613873565b611b1f565b3480156103e657600080fd5b506102e86103f5366004613841565b611ed2565b34801561040657600080fd5b506102e8610415366004613898565b611f63565b34801561042657600080fd5b5061032a61043536600461361e565b612299565b34801561044657600080fd5b506102e861230c565b34801561045b57600080fd5b506102e861046a36600461361e565b612380565b34801561047b57600080fd5b506102806123cc565b34801561049057600080fd5b506102e861049f36600461373d565b6123d8565b3480156104b057600080fd5b50600e54600f546010546011546104d39392916001600160a01b03908116911684565b6040805194855260208501939093526001600160a01b039182169284019290925216606082015260800161028a565b34801561050e57600080fd5b5061028061051d36600461376b565b612427565b34801561052e57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161028a565b34801561056057600080fd5b5061053c61056f36600461376b565b612464565b34801561058057600080fd5b5061053c61058f366004613841565b612486565b3480156105a057600080fd5b5060135461053c906001600160a01b031681565b6102e86105c236600461361e565b612493565b3480156105d357600080fd5b506102806105e236600461361e565b612593565b3480156105f357600080fd5b5061053c610602366004613841565b6125b4565b34801561061357600080fd5b506102e8610622366004613898565b6125c1565b34801561063357600080fd5b506102e861064236600461373d565b61285e565b34801561065357600080fd5b5061028061066236600461363b565b6001600160a01b0391821660009081526008602090815260408083209390941682526002909201909152205490565b34801561069d57600080fd5b506102806106ac36600461361e565b60096020526000908152604090205481565b3480156106ca57600080fd5b5060145461053c906001600160a01b031681565b3480156106ea57600080fd5b506102806106f936600461376b565b61293a565b34801561070a57600080fd5b5061076b610719366004613841565b6004602081905260009182526040909120805460018201546002830154600384015494840154600585015460068601546007909601546001600160a01b03958616979496939592939192918216911688565b604080516001600160a01b03998a16815260208101989098528701959095526060860193909352608085019190915260a0840152831660c083015290911660e08201526101000161028a565b3480156107c357600080fd5b5061032a6107d236600461361e565b6129dd565b3480156107e357600080fd5b506102806107f236600461361e565b6001600160a01b031660009081526007602052604090205490565b34801561081957600080fd5b50610280610828366004613841565b6129ea565b34801561083957600080fd5b5061084d610848366004613841565b612adc565b604080519a8b526001600160a01b03998a1660208c01528a01979097526060890195909552608088019390935260a087019190915260c086015260e08501528216610100840152166101208201526101400161028a565b3480156108b057600080fd5b506102806108bf366004613841565b612c92565b3480156108d057600080fd5b5061028060055481565b3480156108e657600080fd5b5061053c6108f5366004613841565b612d39565b34801561090657600080fd5b5061028060065481565b34801561091c57600080fd5b506102e861092b36600461361e565b612d46565b34801561093c57600080fd5b506102e861094b3660046138ba565b612e30565b600061095c600c612e94565b905090565b600061095c600a612e94565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b1580156109b157600080fd5b505afa1580156109c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e9919061385a565b6001600160a01b038516600090815260096020526040902054909150610a129084908390612e9e565b9150505b92915050565b60026001541415610a485760405162461bcd60e51b8152600401610a3f90613993565b60405180910390fd5b600260015580610a865760405162461bcd60e51b81526020600482015260096024820152684e4f20504152414d5360b81b6044820152606401610a3f565b6014546001600160a01b031615610af557601454604051633c6202c960e21b81526001600160a01b0385811660048301529091169063f1880b249060240160006040518083038186803b158015610adc57600080fd5b505afa158015610af0573d6000803e3d6000fd5b505050505b6000805b82811015610b3c57838382818110610b1357610b13613a62565b905060a002016020013582610b2891906139ca565b915080610b3481613a1b565b915050610af9565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb7919061385a565b9050610bc585333085612f4d565b6040516370a0823160e01b815230600482015260009082906001600160a01b038816906370a082319060240160206040518083038186803b158015610c0957600080fd5b505afa158015610c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c41919061385a565b610c4b9190613a04565b9050610c58600a8761307d565b610c99576000610c7082600e60000154612710612e9e565b601054909150610c8b9088906001600160a01b03168361309f565b610c958183613a04565b9150505b6000805b85811015611127576000878783818110610cb957610cb9613a62565b905060a00201803603810190610ccf91906137b4565b90508060600151816040015110610d115760405162461bcd60e51b81526020600482015260066024820152651411549253d160d21b6044820152606401610a3f565b6402540be400816060015110610d5d5760405162461bcd60e51b81526020600482015260116024820152701512535154d51053540812539590531251607a1b6044820152606401610a3f565b60065481602001511015610da15760405162461bcd60e51b815260206004820152600b60248201526a1352538811115413d4d25560aa1b6044820152606401610a3f565b6000610db282602001518689612e9e565b6001600160a01b038b16600090815260096020526040902054909150610dda57809350610e0f565b6001600160a01b038a16600090815260096020526040902054610e0c9082908815610e055788612e9e565b6001612e9e565b93505b60008411610e485760405162461bcd60e51b815260206004820152600660248201526553484152455360d01b6044820152606401610a3f565b6001600160a01b038a1660009081526009602052604081208054869290610e709084906139ca565b90915550610e80905081876139ca565b9550610e8a6135be565b6001600160a01b03808c16825260208201869052604084015160608084019190915284015160808084019190915260055460a08401528451821660c08401528401511615610f5c5782608001516001600160a01b031663f968f4936040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0f57600080fd5b505afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f479190613797565b5060808301516001600160a01b031660e08201525b60058054600090815260046020818152604092839020855181546001600160a01b039182166001600160a01b0319918216178355928701516001830155938601516002808301919091556060870151600383015560808701519382019390935560a08601519481019490945560c085015160068501805491851691831691909117905560e085015160079094018054949093169316929092179055611001908c6131ba565b506001600160a01b03808c166000908152600760209081526040808320600554815460018101835591855283852090910155865190931682526008905220611049818d6131ba565b506001600160a01b038c166000908152600282016020908152604082206005805482546001810184559285529284209091019190915580549161108b83613a1b565b91905055507f4d0f9887048089b093c92bec885ab529000723bce1a79f4e81a5990619910b968260a001518d8460c001518686606001518760800151604051611108969594939291909586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60405180910390a150505050808061111f90613a1b565b915050610c9d565b505060018055505050505050565b6001600160a01b03808416600090815260086020908152604080832093861683526002909301905290812080548390811061117257611172613a62565b906000526020600020015490505b9392505050565b6000610a16600a8361307d565b6000546001600160a01b031633146111be5760405162461bcd60e51b8152600401610a3f9061395e565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600260015414156112035760405162461bcd60e51b8152600401610a3f90613993565b600260015560008281526004602052604090206006548210156112565760405162461bcd60e51b815260206004820152600b60248201526a1352538811115413d4d25560aa1b6044820152606401610a3f565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561129957600080fd5b505afa1580156112ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d1919061385a565b82549091506112eb906001600160a01b0316333086612f4d565b81546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a082319060240160206040518083038186803b15801561133257600080fd5b505afa158015611346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136a919061385a565b6113749190613a04565b835490915061138e90600a906001600160a01b031661307d565b6113d35760006113a682600e60000154612710612e9e565b84546010549192506113c5916001600160a01b0391821691168361309f565b6113cf8183613a04565b9150505b82546001600160a01b03166000908152600960205260408120546113f8575080611421565b83546001600160a01b031660009081526009602052604090205461141e90839085612e9e565b90505b6000811161145a5760405162461bcd60e51b815260206004820152600660248201526553484152455360d01b6044820152606401610a3f565b83546001600160a01b0316600090815260096020526040812080548392906114839084906139ca565b925050819055508084600101600082825461149e91906139ca565b909155505060058401548454600686015460038701546004880154604080519586526001600160a01b039485166020870152939092169284019290925260608301859052608083019190915260a08201527f4d0f9887048089b093c92bec885ab529000723bce1a79f4e81a5990619910b969060c0015b60405180910390a150506001805550505050565b6002600154141561154c5760405162461bcd60e51b8152600401610a3f90613993565b60026001556013546001600160a01b03166115935760405162461bcd60e51b81526020600482015260076024820152661393d50814d15560ca1b6044820152606401610a3f565b600082815260046020526040902060068101546001600160a01b031633146115cd5760405162461bcd60e51b8152600401610a3f9061393f565b6000816002015482600101546115e39190613a04565b90506000811161161e5760405162461bcd60e51b8152602060048201526006602482015265105353d5539560d21b6044820152606401610a3f565b81546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561166157600080fd5b505afa158015611675573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611699919061385a565b83546001600160a01b0316600090815260096020526040812054919250906116c49084908490612e9e565b84546013549192506116e3916001600160a01b039182169116836131cf565b60135484546001860154600287015460038801546004808a015460058b015460068c015460078d01546040516308a8f46960e21b81526001600160a01b03998a1695810195909552602485019790975260448401959095526064830193909352608482015260a481019190915290831660c482015290821660e4820152610104810184905261012481018890529116906322a3d1a49061014401602060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf9190613797565b506001840154600285015583546001600160a01b031660009081526009602052604081208054859290611803908490613a04565b909155505060408051878152602081018390527f8b1497abd425402b9139208bcb7f83d61a7545712a632d73a1ae68039cd593ab9101611515565b600260015414156118615760405162461bcd60e51b8152600401610a3f90613993565b6002600155600082815260046020526040902060068101546001600160a01b031633146118a05760405162461bcd60e51b8152600401610a3f9061393f565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156118e357600080fd5b505afa1580156118f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191b919061385a565b82546001600160a01b031660009081526009602052604081205491925090611944908584612e9e565b9050801580156119545750600084115b15611967578061196381613a1b565b9150505b600081116119a85760405162461bcd60e51b815260206004820152600e60248201526d16915493c815d2551211149055d360921b6044820152606401610a3f565b60006119b78460050154612c92565b9050806119c58360016139ca565b1415611a0b5783546001600160a01b03166000908152600960205260409020546119f9906119f381866139e2565b85612e9e565b611a0b5781611a0781613a1b565b9250505b81811015611a445760405162461bcd60e51b8152602060048201526006602482015265105353d5539560d21b6044820152606401610a3f565b81846002016000828254611a5891906139ca565b909155505083546001600160a01b0316600090815260096020526040812054611a849084908690612e9e565b85546001600160a01b0316600090815260096020526040812080549293508592909190611ab2908490613a04565b90915550508454611acd906001600160a01b0316338361309f565b8454604080516001600160a01b039092168252602082018390527fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc910160405180910390a15050600180555050505050565b60026001541415611b425760405162461bcd60e51b8152600401610a3f90613993565b6002600155336001600160a01b0382161415611b895760405162461bcd60e51b8152600401610a3f9060208082526004908201526329a2a62360e11b604082015260600190565b600082815260046020526040902060068101546001600160a01b03163314611bc35760405162461bcd60e51b8152600401610a3f9061393f565b611bcb6135be565b8160000160009054906101000a90046001600160a01b031681600001906001600160a01b031690816001600160a01b03168152505081600101548160200181815250508160020154816040018181525050816003015481606001818152505081600401548160800181815250506005548160a0018181525050828160c001906001600160a01b031690816001600160a01b0316815250508160070160009054906101000a90046001600160a01b03168160e001906001600160a01b031690816001600160a01b0316815250508060046000600554815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160070160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050600760008360000160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000206005549080600181540180825580915050600190039060005260206000200160009091909190915055600060086000856001600160a01b03166001600160a01b031681526020019081526020016000209050611e248360000160009054906101000a90046001600160a01b0316826000016131ba90919063ffffffff16565b5082546001600160a01b031660009081526002820160209081526040822060a0850151815460018101835591845291832001556005805491611e6583613a1b565b90915550506001830154600284015560a082015160408051878152602081019290925233828201526001600160a01b0386166060830152517fc1329eea12893a6eff780df43cf4ec708fdc6ce7fbacf84ee8cf9355a9af1dd89181900360800190a1505060018055505050565b60026001541415611ef55760405162461bcd60e51b8152600401610a3f90613993565b6002600155600081815260046020526040902060068101546001600160a01b03163314611f345760405162461bcd60e51b8152600401610a3f9061393f565b60078101546001600160a01b0316611f4b57600080fd5b60070180546001600160a01b03191690555060018055565b60026001541415611f865760405162461bcd60e51b8152600401610a3f90613993565b600260015580611fc65760405162461bcd60e51b815260206004820152600b60248201526a16915493c8105353d5539560aa1b6044820152606401610a3f565b600082815260046020526040902060068101546001600160a01b031633146120005760405162461bcd60e51b8152600401610a3f9061393f565b6003810154156120405760405162461bcd60e51b815260206004820152600b60248201526a2627a1a5902a2ca822901960a91b6044820152606401610a3f565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561208357600080fd5b505afa158015612097573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120bb919061385a565b82546001600160a01b0316600090815260096020526040812054919250906120e4908584612e9e565b905082600101548184600201546120fb91906139ca565b111561210657600080fd5b61210e6135be565b83546001600160a01b039081168252602082018390526004850154608083015260055460a08301523360c083015260078501541660e082015260028401805483919060009061215e9084906139ca565b9091555050600580546000908152600460208181526040808420865181546001600160a01b03199081166001600160a01b03928316178355888501516001808501919091558985015160028086019190915560608b0151600386015560808b01519785019790975560a08a018051858b015560c08b0151600686018054851691861691909117905560e08b015160079586018054909416908516179092558c548316885292855283872088548154808601835591895286892090910155338752600885528387208c5490921687529401835290842092518354918201845592845290832001558154919061225183613a1b565b909155505060a081015160408051888152602081019290925281018690527fbfc02f4250f5e54a31a72371b1932061a0245db2afb5124b547306f6ebffd8ad90606001611515565b6000816001600160a01b031663f968f4936040518163ffffffff1660e01b815260040160206040518083038186803b1580156122d457600080fd5b505afa1580156122e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a169190613797565b6000546001600160a01b031633146123365760405162461bcd60e51b8152600401610a3f9061395e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146123aa5760405162461bcd60e51b8152600401610a3f9061395e565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b600061095c6002612e94565b6000546001600160a01b031633146124025760405162461bcd60e51b8152600401610a3f9061395e565b801561241857612413600c836131ba565b505050565b612413600c836132e3565b5050565b6001600160a01b038216600090815260076020526040812080548390811061245157612451613a62565b9060005260206000200154905092915050565b6001600160a01b038216600090815260086020526040812061118090836132f8565b6000610a166002836132f8565b61249e600a8261307d565b156124d45760405162461bcd60e51b8152600401610a3f906020808252600490820152631410525160e21b604082015260600190565b6011546001600160a01b031661256557600f5434146125235760405162461bcd60e51b815260206004820152600b60248201526a119151481393d50813515560aa1b6044820152606401610a3f565b601054600f546040516001600160a01b039092169181156108fc0291906000818181858888f1935050505015801561255f573d6000803e3d6000fd5b50612588565b601154601054600f54612588926001600160a01b03908116923392911690612f4d565b612423600a826131ba565b6001600160a01b0381166000908152600860205260408120610a1690612e94565b6000610a16600a836132f8565b600260015414156125e45760405162461bcd60e51b8152600401610a3f90613993565b60026001556402540be40081106126265760405162461bcd60e51b8152600401610a3f9060208082526004908201526354494d4560e01b604082015260600190565b600082815260046020526040902060068101546001600160a01b031633146126605760405162461bcd60e51b8152600401610a3f9061393f565b818160040154106126995760405162461bcd60e51b815260206004820152600360248201526211539160ea1b6044820152606401610a3f565b80546126b090600a906001600160a01b031661307d565b612815576000816002015482600101546126ca9190613a04565b905060006126e082600e60000154612710612e9e565b83546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561272857600080fd5b505afa15801561273c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612760919061385a565b84546001600160a01b0316600090815260096020526040812054919250906127aa908490849015610e055787546001600160a01b0316600090815260096020526040902054612e9e565b85546010549192506127c9916001600160a01b0391821691168361309f565b828560020160008282546127dd91906139ca565b909155505084546001600160a01b03166000908152600960205260408120805485929061280b908490613a04565b9091555050505050505b6004810182905560408051848152602081018490527fefaff1b90138281d215452c67f793017f52e456f65c28ac63f5309a89a059b47910160405180910390a150506001805550565b601254604051632a35efd360e21b81523360048201526001600160a01b039091169063a8d7bf4c9060240160206040518083038186803b1580156128a157600080fd5b505afa1580156128b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d99190613797565b806128ea57506128ea600c3361307d565b61291e5760405162461bcd60e51b815260206004820152600560248201526420a226a4a760d91b6044820152606401610a3f565b801561292f57612413600a836131ba565b612413600a836132e3565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b15801561297e57600080fd5b505afa158015612992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b6919061385a565b6001600160a01b038516600090815260096020526040902054909150610a12908483612e9e565b6000610a16600c8361307d565b600081815260046020526040812060058101548290612a0890612c92565b82546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015612a5057600080fd5b505afa158015612a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a88919061385a565b83546001600160a01b031660009081526009602052604081205491925090612ad2908490849015610e055786546001600160a01b0316600090815260096020526040902054612e9e565b9695505050505050565b600081815260046020818152604080842081516101008101835281546001600160a01b0390811680835260018401549583019590955260028301548285015260038301546060830152828601546080830152600583015460a08301526006830154811660c083015260079092015490911660e082015290516370a0823160e01b81523093810193909352839283928392839283928392839283928392918391906370a082319060240160206040518083038186803b158015612b9d57600080fd5b505afa158015612bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd5919061385a565b82516001600160a01b03166000908152600960205260408120549192509015612c175782516001600160a01b0316600090815260096020526040902054612c1a565b60015b90506000612c2d84602001518484612e9e565b90506000612c4085604001518585612e9e565b90508460a0015185600001518383886020015189604001518a606001518b608001518c60c001518d60e001519e509e509e509e509e509e509e509e509e509e5050505050509193959799509193959799565b60008181526004602052604081206003810154829015612cb3576002612cb6565b60015b905060008160ff16600114612ccf578260010154612ce3565b82600201548360010154612ce39190613a04565b90506000612d138460030154856004015484428860070160009054906101000a90046001600160a01b0316613304565b90508260ff1660021415612d30576002840154612ad29082613a04565b95945050505050565b6000610a16600c836132f8565b6000546001600160a01b03163314612d705760405162461bcd60e51b8152600401610a3f9061395e565b6001600160a01b038116612dd55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612e5a5760405162461bcd60e51b8152600401610a3f9061395e565b600e93909355600f91909155601080546001600160a01b039283166001600160a01b03199182161790915560118054929093169116179055565b6000610a16825490565b600080806000198587098587029250828110838203039150508060001415612ed85760008411612ecd57600080fd5b508290049050611180565b808411612ee457600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612fb19190613904565b6000604051808303816000865af19150503d8060008114612fee576040519150601f19603f3d011682016040523d82523d6000602084013e612ff3565b606091505b509150915081801561301d57508051158061301d57508080602001905181019061301d9190613797565b6130755760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610a3f565b505050505050565b6001600160a01b03811660009081526001830160205260408120541515611180565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916130fb9190613904565b6000604051808303816000865af19150503d8060008114613138576040519150601f19603f3d011682016040523d82523d6000602084013e61313d565b606091505b50915091508180156131675750805115806131675750808060200190518101906131679190613797565b6131b35760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610a3f565b5050505050565b6000611180836001600160a01b038416613409565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b179052915160009283929087169161322b9190613904565b6000604051808303816000865af19150503d8060008114613268576040519150601f19603f3d011682016040523d82523d6000602084013e61326d565b606091505b50915091508180156132975750805115806132975750808060200190518101906132979190613797565b6131b35760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c454400006044820152606401610a3f565b6000611180836001600160a01b038416613458565b6000611180838361354b565b60006001600160a01b0382161580159061338a5750816001600160a01b031663f968f4936040518163ffffffff1660e01b815260040160206040518083038186803b15801561335257600080fd5b505afa158015613366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338a9190613797565b15613396575082612d30565b8515806133a257508486145b156133be578285106133b55760006133b7565b835b9050612d30565b82858111156133ca5750845b868110156133d55750855b60006133e18883613a04565b905060006133ef8989613a04565b90506133fc878383612e9e565b9998505050505050505050565b600081815260018301602052604081205461345057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a16565b506000610a16565b6000818152600183016020526040812054801561354157600061347c600183613a04565b855490915060009061349090600190613a04565b905060008660000182815481106134a9576134a9613a62565b90600052602060002001549050808760000184815481106134cc576134cc613a62565b6000918252602090912001556134e38360016139ca565b6000828152600189016020526040902055865487908061350557613505613a4c565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610a16565b6000915050610a16565b815460009082106135a95760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610a3f565b82600001828154811061245157612451613a62565b60405180610100016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b60006020828403121561363057600080fd5b813561118081613a78565b6000806040838503121561364e57600080fd5b823561365981613a78565b9150602083013561366981613a78565b809150509250929050565b60008060006060848603121561368957600080fd5b833561369481613a78565b925060208401356136a481613a78565b929592945050506040919091013590565b6000806000604084860312156136ca57600080fd5b83356136d581613a78565b9250602084013567ffffffffffffffff808211156136f257600080fd5b818601915086601f83011261370657600080fd5b81358181111561371557600080fd5b87602060a08302850101111561372a57600080fd5b6020830194508093505050509250925092565b6000806040838503121561375057600080fd5b823561375b81613a78565b9150602083013561366981613a90565b6000806040838503121561377e57600080fd5b823561378981613a78565b946020939093013593505050565b6000602082840312156137a957600080fd5b815161118081613a90565b600060a082840312156137c657600080fd5b60405160a0810181811067ffffffffffffffff821117156137f757634e487b7160e01b600052604160045260246000fd5b604052823561380581613a78565b80825250602083013560208201526040830135604082015260608301356060820152608083013561383581613a78565b60808201529392505050565b60006020828403121561385357600080fd5b5035919050565b60006020828403121561386c57600080fd5b5051919050565b6000806040838503121561388657600080fd5b82359150602083013561366981613a78565b600080604083850312156138ab57600080fd5b50508035926020909101359150565b600080600080608085870312156138d057600080fd5b843593506020850135925060408501356138e981613a78565b915060608501356138f981613a78565b939692955090935050565b6000825160005b81811015613925576020818601810151858301520161390b565b81811115613934576000828501525b509190910192915050565b60208082526005908201526427aba722a960d91b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156139dd576139dd613a36565b500190565b6000826139ff57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015613a1657613a16613a36565b500390565b6000600019821415613a2f57613a2f613a36565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114613a8d57600080fd5b50565b8015158114613a8d57600080fdfea2646970667358221220ab61d8cb2cf53ab318184de984944641a595ad15cf316dd923e90d830ae95cc364736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000068e9a39800db0e2e0a7fdcfc21fa601251973ccf
-----Decoded View---------------
Arg [0] : _uncxAdmins (address): 0x68e9A39800dB0e2e0a7FdCFc21fA601251973Ccf
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000068e9a39800db0e2e0a7fdcfc21fa601251973ccf
Deployed Bytecode Sourcemap
3940:23676:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27212:117;;;;;;;;;;;;;:::i;:::-;;;17956:25:10;;;17944:2;17929:18;27212:117:6;;;;;;;;26794:114;;;;;;;;;;;;;:::i;23984:230::-;;;;;;;;;;-1:-1:-1;23984:230:6;;;;;:::i;:::-;;:::i;9831:2939::-;;;;;;;;;;-1:-1:-1;9831:2939:6;;;;;:::i;:::-;;:::i;:::-;;26586:180;;;;;;;;;;-1:-1:-1;26586:180:6;;;;;:::i;:::-;;:::i;27054:134::-;;;;;;;;;;-1:-1:-1;27054:134:6;;;;;:::i;:::-;;:::i;:::-;;;8956:14:10;;8949:22;8931:41;;8919:2;8904:18;27054:134:6;8791:187:10;7410:94:6;;;;;;;;;;-1:-1:-1;7410:94:6;;;;;:::i;:::-;;:::i;16232:1265::-;;;;;;;;;;-1:-1:-1;16232:1265:6;;;;;:::i;:::-;;:::i;20792:1044::-;;;;;;;;;;-1:-1:-1;20792:1044:6;;;;;:::i;:::-;;:::i;13141:1610::-;;;;;;;;;;-1:-1:-1;13141:1610:6;;;;;:::i;:::-;;:::i;17717:1334::-;;;;;;;;;;-1:-1:-1;17717:1334:6;;;;;:::i;:::-;;:::i;22105:289::-;;;;;;;;;;-1:-1:-1;22105:289:6;;;;;:::i;:::-;;:::i;19353:1337::-;;;;;;;;;;-1:-1:-1;19353:1337:6;;;;;:::i;:::-;;:::i;22511:138::-;;;;;;;;;;-1:-1:-1;22511:138:6;;;;;:::i;:::-;;:::i;1752:145:4:-;;;;;;;;;;;;;:::i;7512:110:6:-;;;;;;;;;;-1:-1:-1;7512:110:6;;;;;:::i;:::-;;:::i;25580:98::-;;;;;;;;;;;;;:::i;8050:197::-;;;;;;;;;;-1:-1:-1;8050:197:6;;;;;:::i;:::-;;:::i;6423:21::-;;;;;;;;;;-1:-1:-1;6423:21:6;;;;;;;;;;;;-1:-1:-1;;;;;6423:21:6;;;;;;;;;;;19981:25:10;;;20037:2;20022:18;;20015:34;;;;-1:-1:-1;;;;;20123:15:10;;;20103:18;;;20096:43;;;;20175:15;20170:2;20155:18;;20148:43;19968:3;19953:19;6423:21:6;19734:463:10;25937:143:6;;;;;;;;;;-1:-1:-1;25937:143:6;;;;;:::i;:::-;;:::i;1120:85:4:-;;;;;;;;;;-1:-1:-1;1166:7:4;1192:6;-1:-1:-1;;;;;1192:6:4;1120:85;;;-1:-1:-1;;;;;6446:32:10;;;6428:51;;6416:2;6401:18;1120:85:4;6282:203:10;26254:155:6;;;;;;;;;;-1:-1:-1;26254:155:6;;;;;:::i;:::-;;:::i;25686:111::-;;;;;;;;;;-1:-1:-1;25686:111:6;;;;;:::i;:::-;;:::i;6484:25::-;;;;;;;;;;-1:-1:-1;6484:25:6;;;;-1:-1:-1;;;;;6484:25:6;;;8326:529;;;;;;:::i;:::-;;:::i;26109:137::-;;;;;;;;;;-1:-1:-1;26109:137:6;;;;;:::i;:::-;;:::i;26916:130::-;;;;;;;;;;-1:-1:-1;26916:130:6;;;;;:::i;:::-;;:::i;14876:1118::-;;;;;;;;;;-1:-1:-1;14876:1118:6;;;;;:::i;:::-;;:::i;8946:295::-;;;;;;;;;;-1:-1:-1;8946:295:6;;;;;:::i;:::-;;:::i;26417:161::-;;;;;;;;;;-1:-1:-1;26417:161:6;;;;;:::i;:::-;-1:-1:-1;;;;;26531:12:6;;;26508:7;26531:12;;;:5;:12;;;;;;;;:34;;;;;;:26;;;;:34;;;;:41;;26417:161;5789:38;;;;;;;;;;-1:-1:-1;5789:38:6;;;;;:::i;:::-;;;;;;;;;;;;;;6514:32;;;;;;;;;;-1:-1:-1;6514:32:6;;;;-1:-1:-1;;;;;6514:32:6;;;24220:230;;;;;;;;;;-1:-1:-1;24220:230:6;;;;;:::i;:::-;;:::i;5350:42::-;;;;;;;;;;-1:-1:-1;5350:42:6;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5350:42:6;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7548:15:10;;;7530:34;;7595:2;7580:18;;7573:34;;;;7623:18;;7616:34;;;;7681:2;7666:18;;7659:34;;;;7724:3;7709:19;;7702:35;;;;7510:3;7753:19;;7746:35;7818:15;;7812:3;7797:19;;7790:44;7871:15;;;7865:3;7850:19;;7843:44;7479:3;7464:19;5350:42:6;7149:744:10;27479:134:6;;;;;;;;;;-1:-1:-1;27479:134:6;;;;;:::i;:::-;;:::i;25805:124::-;;;;;;;;;;-1:-1:-1;25805:124:6;;;;;:::i;:::-;-1:-1:-1;;;;;25897:19:6;25874:7;25897:19;;;:11;:19;;;;;:26;;25805:124;23499:462;;;;;;;;;;-1:-1:-1;23499:462:6;;;;;:::i;:::-;;:::i;24609:963::-;;;;;;;;;;-1:-1:-1;24609:963:6;;;;;:::i;:::-;;:::i;:::-;;;;18987:25:10;;;-1:-1:-1;;;;;19086:15:10;;;19081:2;19066:18;;19059:43;19118:18;;19111:34;;;;19176:2;19161:18;;19154:34;;;;19219:3;19204:19;;19197:35;;;;19039:3;19248:19;;19241:35;;;;19307:3;19292:19;;19285:35;19351:3;19336:19;;19329:35;19401:15;;19395:3;19380:19;;19373:44;19454:15;19448:3;19433:19;;19426:44;18974:3;18959:19;24609:963:6;18588:888:10;22761:647:6;;;;;;;;;;-1:-1:-1;22761:647:6;;;;;:::i;:::-;;:::i;5429:24::-;;;;;;;;;;;;;;;;27337:134;;;;;;;;;;-1:-1:-1;27337:134:6;;;;;:::i;:::-;;:::i;5533:36::-;;;;;;;;;;;;;;;;2046:240:4;;;;;;;;;;-1:-1:-1;2046:240:4;;;;;:::i;:::-;;:::i;7630:302:6:-;;;;;;;;;;-1:-1:-1;7630:302:6;;;;;:::i;:::-;;:::i;27212:117::-;27273:7;27296:27;:18;:25;:27::i;:::-;27289:34;;27212:117;:::o;26794:114::-;26852:7;26875:27;:18;:25;:27::i;23984:230::-;24106:39;;-1:-1:-1;;;24106:39:6;;24139:4;24106:39;;;6428:51:10;24072:7:6;;;;-1:-1:-1;;;;;24106:24:6;;;;;6401:18:10;;24106:39:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24193:14:6;;;;;;:6;:14;;;;;;24088:57;;-1:-1:-1;24159:49:6;;24175:7;;24088:57;;24159:15;:49::i;:::-;24152:56;;;23984:230;;;;;:::o;9831:2939::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;;;;;;;;;1749:1;2459:7;:18;9935:23:6;9927:45:::1;;;::::0;-1:-1:-1;;;9927:45:6;;14217:2:10;9927:45:6::1;::::0;::::1;14199:21:10::0;14256:1;14236:18;;;14229:29;-1:-1:-1;;;14274:18:10;;;14267:39;14323:18;;9927:45:6::1;14015:332:10::0;9927:45:6::1;9991:9;::::0;-1:-1:-1;;;;;9991:9:6::1;9983:32:::0;9979:85:::1;;10028:9;::::0;:28:::1;::::0;-1:-1:-1;;;10028:28:6;;-1:-1:-1;;;;;6446:32:10;;;10028:28:6::1;::::0;::::1;6428:51:10::0;10028:9:6;;::::1;::::0;:20:::1;::::0;6401:18:10;;10028:28:6::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;9979:85;10070:19;10105:9:::0;10100:106:::1;10120:23:::0;;::::1;10100:106;;;10176:12;;10189:1;10176:15;;;;;;;:::i;:::-;;;;;;:22;;;10161:37;;;;;:::i;:::-;::::0;-1:-1:-1;10145:3:6;::::1;::::0;::::1;:::i;:::-;;;;10100:106;;;-1:-1:-1::0;10238:39:6::1;::::0;-1:-1:-1;;;10238:39:6;;10271:4:::1;10238:39;::::0;::::1;6428:51:10::0;10214:21:6::1;::::0;-1:-1:-1;;;;;10238:24:6;::::1;::::0;::::1;::::0;6401:18:10;;10238:39:6::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10214:63;;10284:88;10316:6;10332:10;10353:4;10360:11;10284:31;:88::i;:::-;10398:39;::::0;-1:-1:-1;;;10398:39:6;;10431:4:::1;10398:39;::::0;::::1;6428:51:10::0;10379:16:6::1;::::0;10440:13;;-1:-1:-1;;;;;10398:24:6;::::1;::::0;::::1;::::0;6401:18:10;;10398:39:6::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;;:::i;:::-;10379:74:::0;-1:-1:-1;10480:35:6::1;:18;10508:6:::0;10480:27:::1;:35::i;:::-;10475:222;;10526:15;10544:47;10560:8;10570:4;:13;;;10585:5;10544:15;:47::i;:::-;10636:15:::0;;10526:65;;-1:-1:-1;10600:61:6::1;::::0;10628:6;;-1:-1:-1;;;;;10636:15:6::1;10526:65:::0;10600:27:::1;:61::i;:::-;10670:19;10682:7:::0;10670:19;::::1;:::i;:::-;;;10517:180;10475:222;10709:14;10739:9:::0;10734:2031:::1;10754:23:::0;;::::1;10734:2031;;;10795:28;10826:12;;10839:1;10826:15;;;;;;;:::i;:::-;;;;;;10795:46;;;;;;;;;;:::i;:::-;;;10887:10;:22;;;10860:10;:24;;;:49;10852:68;;;::::0;-1:-1:-1;;;10852:68:6;;13883:2:10;10852:68:6::1;::::0;::::1;13865:21:10::0;13922:1;13902:18;;;13895:29;-1:-1:-1;;;13940:18:10;;;13933:36;13986:18;;10852:68:6::1;13681:329:10::0;10852:68:6::1;10964:4;10939:10;:22;;;:29;10931:59;;;::::0;-1:-1:-1;;;10931:59:6;;10044:2:10;10931:59:6::1;::::0;::::1;10026:21:10::0;10083:2;10063:18;;;10056:30;-1:-1:-1;;;10102:18:10;;;10095:47;10159:18;;10931:59:6::1;9842:341:10::0;10931:59:6::1;11088:15;;11067:10;:17;;;:36;;11059:60;;;::::0;-1:-1:-1;;;11059:60:6;;13182:2:10;11059:60:6::1;::::0;::::1;13164:21:10::0;13221:2;13201:18;;;13194:30;-1:-1:-1;;;13240:18:10;;;13233:41;13291:18;;11059:60:6::1;12980:335:10::0;11059:60:6::1;11130:22;11155:57;11171:10;:17;;;11190:8;11200:11;11155:15;:57::i;:::-;-1:-1:-1::0;;;;;11229:14:6;::::1;;::::0;;;:6:::1;:14;::::0;;;;;11130:82;;-1:-1:-1;11225:200:6::1;;11272:14;11263:23;;11225:200;;;-1:-1:-1::0;;;;;11358:14:6;::::1;;::::0;;;:6:::1;:14;::::0;;;;;11326:87:::1;::::0;11342:14;;11374:18;;:38:::1;;11399:13;11326:15;:87::i;11374:38::-;11395:1;11326:15;:87::i;:::-;11317:96;;11225:200;11452:1;11443:6;:10;11435:29;;;::::0;-1:-1:-1;;;11435:29:6;;16237:2:10;11435:29:6::1;::::0;::::1;16219:21:10::0;16276:1;16256:18;;;16249:29;-1:-1:-1;;;16294:18:10;;;16287:36;16340:18;;11435:29:6::1;16035:329:10::0;11435:29:6::1;-1:-1:-1::0;;;;;11475:14:6;::::1;;::::0;;;:6:::1;:14;::::0;;;;:24;;11493:6;;11475:14;:24:::1;::::0;11493:6;;11475:24:::1;:::i;:::-;::::0;;;-1:-1:-1;11510:31:6::1;::::0;-1:-1:-1;11527:14:6;11510:31;::::1;:::i;:::-;;;11554:27;;:::i;:::-;-1:-1:-1::0;;;;;11592:32:6;;::::1;::::0;;11635:26:::1;::::0;::::1;:35:::0;;;11708:24:::1;::::0;::::1;::::0;11681::::1;::::0;;::::1;:51:::0;;;;11768:22;::::1;::::0;11743::::1;::::0;;::::1;:47:::0;;;;11821:5:::1;::::0;11801:17:::1;::::0;::::1;:25:::0;11856:16;;11837:35;::::1;:16;::::0;::::1;:35:::0;11887:20;::::1;::::0;:34:::1;::::0;11883:369:::1;;12146:10;:20;;;-1:-1:-1::0;;;;;12129:51:6::1;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;12220:20:6::1;::::0;::::1;::::0;-1:-1:-1;;;;;12197:43:6::1;:20;::::0;::::1;:43:::0;11883:369:::1;12311:5;::::0;;12305:12:::1;::::0;;;:5:::1;:12;::::0;;;;;;;;:25;;;;-1:-1:-1;;;;;12305:25:6;;::::1;-1:-1:-1::0;;;;;;12305:25:6;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;12341:18:::1;::::0;12352:6;12341:10:::1;:18::i;:::-;-1:-1:-1::0;;;;;;12370:19:6;;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;12395:5:::1;::::0;12370:31;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;12489:16;;12483:23;;::::1;::::0;;:5:::1;:23:::0;;;12517:29:::1;12483:23:::0;12382:6;12517:21:::1;:29::i;:::-;-1:-1:-1::0;;;;;;12557:26:6;::::1;;::::0;;;:18:::1;::::0;::::1;:26;::::0;;;;;;12589:5:::1;::::0;;12557:38;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;;;;12616:8;;;::::1;::::0;::::1;:::i;:::-;;;;;;12640:117;12647:10;:17;;;12666:6;12674:10;:16;;;12692:14;12708:10;:24;;;12734:10;:22;;;12640:117;;;;;;;;;;18279:25:10::0;;;-1:-1:-1;;;;;18378:15:10;;;18373:2;18358:18;;18351:43;18430:15;;;;18425:2;18410:18;;18403:43;18477:2;18462:18;;18455:34;18520:3;18505:19;;18498:35;;;;18331:3;18549:19;;18542:35;18266:3;18251:19;;17992:591;12640:117:6::1;;;;;;;;10784:1981;;;;10779:3;;;;;:::i;:::-;;;;10734:2031;;;-1:-1:-1::0;;1706:1:5;2632:22;;-1:-1:-1;;;;;;9831:2939:6:o;26586:180::-;-1:-1:-1;;;;;26718:12:6;;;26695:7;26718:12;;;:5;:12;;;;;;;;:34;;;;;:26;;;;:34;;;;;:42;;26753:6;;26718:42;;;;;;:::i;:::-;;;;;;;;;26711:49;;26586:180;;;;;;:::o;27054:134::-;27127:4;27147:35;:18;27175:6;27147:27;:35::i;7410:94::-;1166:7:4;1192:6;-1:-1:-1;;;;;1192:6:4;723:10:0;1332:23:4;1324:68;;;;-1:-1:-1;;;1324:68:4;;;;;;;:::i;:::-;7478:8:6::1;:20:::0;;-1:-1:-1;;;;;;7478:20:6::1;-1:-1:-1::0;;;;;7478:20:6;;;::::1;::::0;;;::::1;::::0;;7410:94::o;16232:1265::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;16319:26:6::1;16348:14:::0;;;:5:::1;:14;::::0;;;;16388:15:::1;::::0;16377:26;::::1;;16369:50;;;::::0;-1:-1:-1;;;16369:50:6;;13182:2:10;16369:50:6::1;::::0;::::1;13164:21:10::0;13221:2;13201:18;;;13194:30;-1:-1:-1;;;13240:18:10;;;13233:41;13291:18;;16369:50:6::1;12980:335:10::0;16369:50:6::1;16463:21:::0;;16456:54:::1;::::0;-1:-1:-1;;;16456:54:6;;16504:4:::1;16456:54;::::0;::::1;6428:51:10::0;16432:21:6::1;::::0;-1:-1:-1;;;;;16463:21:6::1;::::0;16456:39:::1;::::0;6401:18:10;;16456:54:6::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16549:21:::0;;16432:78;;-1:-1:-1;16517:99:6::1;::::0;-1:-1:-1;;;;;16549:21:6::1;16580:10;16601:4;16608:7:::0;16517:31:::1;:99::i;:::-;16655:21:::0;;16648:54:::1;::::0;-1:-1:-1;;;16648:54:6;;16696:4:::1;16648:54;::::0;::::1;6428:51:10::0;16623:22:6::1;::::0;16705:13;;-1:-1:-1;;;;;16655:21:6;;::::1;::::0;16648:39:::1;::::0;6401:18:10;;16648:54:6::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:70;;;;:::i;:::-;16780:21:::0;;16623:95;;-1:-1:-1;16752:50:6::1;::::0;:18:::1;::::0;-1:-1:-1;;;;;16780:21:6::1;16752:27;:50::i;:::-;16747:270;;16815:15;16833:53;16849:14;16865:4;:13;;;16880:5;16833:15;:53::i;:::-;16925:21:::0;;16948:15;;16815:71;;-1:-1:-1;16897:76:6::1;::::0;-1:-1:-1;;;;;16925:21:6;;::::1;::::0;16948:15:::1;16815:71:::0;16897:27:::1;:76::i;:::-;16984:25;17002:7:::0;16984:25;::::1;:::i;:::-;;;16804:213;16747:270;17055:21:::0;;-1:-1:-1;;;;;17055:21:6::1;17023:14;17048:29:::0;;;:6:::1;:29;::::0;;;;;17044:189:::1;;-1:-1:-1::0;17102:14:6;17044:189:::1;;;17187:21:::0;;-1:-1:-1;;;;;17187:21:6::1;17180:29;::::0;;;:6:::1;:29;::::0;;;;;17148:77:::1;::::0;17164:14;;17211:13;17148:15:::1;:77::i;:::-;17139:86;;17044:189;17256:1;17247:6;:10;17239:29;;;::::0;-1:-1:-1;;;17239:29:6;;16237:2:10;17239:29:6::1;::::0;::::1;16219:21:10::0;16276:1;16256:18;;;16249:29;-1:-1:-1;;;16294:18:10;;;16287:36;16340:18;;17239:29:6::1;16035:329:10::0;17239:29:6::1;17282:21:::0;;-1:-1:-1;;;;;17282:21:6::1;17275:29;::::0;;;:6:::1;:29;::::0;;;;:39;;17308:6;;17275:29;:39:::1;::::0;17308:6;;17275:39:::1;:::i;:::-;;;;;;;;17349:6;17321:8;:24;;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;17374:15:6::1;::::0;::::1;::::0;17391:21;;17414:14:::1;::::0;::::1;::::0;17446:22:::1;::::0;::::1;::::0;17470:20:::1;::::0;::::1;::::0;17367:124:::1;::::0;;18279:25:10;;;-1:-1:-1;;;;;17391:21:6;;::::1;18373:2:10::0;18358:18;;18351:43;17414:14:6;;;::::1;18410:18:10::0;;;18403:43;;;;18477:2;18462:18;;18455:34;;;18520:3;18505:19;;18498:35;;;;18331:3;18549:19;;18542:35;17367:124:6::1;::::0;18266:3:10;18251:19;17367:124:6::1;;;;;;;;-1:-1:-1::0;;1706:1:5;2632:22;;-1:-1:-1;;;;16232:1265:6:o;20792:1044::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;20889:8:6::1;::::0;-1:-1:-1;;;;;20889:8:6::1;20873:51;;;::::0;-1:-1:-1;;;20873:51:6;;12182:2:10;20873:51:6::1;::::0;::::1;12164:21:10::0;12221:1;12201:18;;;12194:29;-1:-1:-1;;;12239:18:10;;;12232:37;12286:18;;20873:51:6::1;11980:330:10::0;20873:51:6::1;20931:26;20960:14:::0;;;:5:::1;:14;::::0;;;;20989::::1;::::0;::::1;::::0;-1:-1:-1;;;;;20989:14:6::1;21007:10;20989:28;20981:46;;;;-1:-1:-1::0;;;20981:46:6::1;;;;;;;:::i;:::-;21034:23;21087:8;:24;;;21060:8;:24;;;:51;;;;:::i;:::-;21034:77;;21144:1;21126:15;:19;21118:38;;;::::0;-1:-1:-1;;;21118:38:6;;10750:2:10;21118:38:6::1;::::0;::::1;10732:21:10::0;10789:1;10769:18;;;10762:29;-1:-1:-1;;;10807:18:10;;;10800:36;10853:18;;21118:38:6::1;10548:329:10::0;21118:38:6::1;21190:21:::0;;21183:54:::1;::::0;-1:-1:-1;;;21183:54:6;;21231:4:::1;21183:54;::::0;::::1;6428:51:10::0;21165:15:6::1;::::0;-1:-1:-1;;;;;21190:21:6::1;::::0;21183:39:::1;::::0;6401:18:10;;21183:54:6::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21318:21:::0;;-1:-1:-1;;;;;21318:21:6::1;21244:22;21311:29:::0;;;:6:::1;:29;::::0;;;;;21165:72;;-1:-1:-1;21244:22:6;21269:72:::1;::::0;21285:15;;21165:72;;21269:15:::1;:72::i;:::-;21381:21:::0;;21412:8:::1;::::0;21244:97;;-1:-1:-1;21354:84:6::1;::::0;-1:-1:-1;;;;;21381:21:6;;::::1;::::0;21412:8:::1;21244:97:::0;21354:26:::1;:84::i;:::-;21445:8;::::0;21462:21;;21445:8;21485:24;::::1;::::0;21511::::1;::::0;::::1;::::0;21537:22:::1;::::0;::::1;::::0;21566:20:::1;::::0;;::::1;::::0;21588:15:::1;::::0;::::1;::::0;21605:14:::1;::::0;::::1;::::0;21621:18:::1;::::0;::::1;::::0;21445:220:::1;::::0;-1:-1:-1;;;21445:220:6;;-1:-1:-1;;;;;21462:21:6;;::::1;21445:220:::0;;::::1;8335:34:10::0;;;;8385:18;;;8378:34;;;;8428:18;;;8421:34;;;;8471:18;;;8464:34;;;;8514:19;;;8507:35;8558:19;;;8551:35;;;;21605:14:6;;::::1;8602:19:10::0;;;8595:44;21621:18:6;;::::1;8655:19:10::0;;;8648:44;8708:19;;;8701:35;;;8752:19;;;8745:35;;;21445:8:6;::::1;::::0;:16:::1;::::0;8269:19:10;;21445:220:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;21705:24:6::1;::::0;::::1;::::0;21678::::1;::::0;::::1;:51:::0;21743:21;;-1:-1:-1;;;;;21743:21:6::1;-1:-1:-1::0;21736:29:6;;;:6:::1;:29;::::0;;;;:48;;21769:15;;-1:-1:-1;21736:48:6::1;::::0;21769:15;;21736:48:::1;:::i;:::-;::::0;;;-1:-1:-1;;21796:34:6::1;::::0;;19655:25:10;;;19711:2;19696:18;;19689:34;;;21796::6::1;::::0;19628:18:10;21796:34:6::1;19481:248:10::0;13141:1610:6;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;13223:26:6::1;13252:14:::0;;;:5:::1;:14;::::0;;;;13281::::1;::::0;::::1;::::0;-1:-1:-1;;;;;13281:14:6::1;13299:10;13281:28;13273:46;;;;-1:-1:-1::0;;;13273:46:6::1;;;;;;;:::i;:::-;13407:21:::0;;13400:54:::1;::::0;-1:-1:-1;;;13400:54:6;;13448:4:::1;13400:54;::::0;::::1;6428:51:10::0;13382:15:6::1;::::0;-1:-1:-1;;;;;13407:21:6::1;::::0;13400:39:::1;::::0;6401:18:10;;13400:54:6::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13505:21:::0;;-1:-1:-1;;;;;13505:21:6::1;13461:18;13498:29:::0;;;:6:::1;:29;::::0;;;;;13382:72;;-1:-1:-1;13461:18:6;13482:64:::1;::::0;13529:7;13382:72;13482:15:::1;:64::i;:::-;13461:85:::0;-1:-1:-1;13691:15:6;;:30;::::1;;;;13720:1;13710:7;:11;13691:30;13687:66;;;13732:13:::0;::::1;::::0;::::1;:::i;:::-;;;;13687:66;13780:1;13767:10;:14;13759:41;;;::::0;-1:-1:-1;;;13759:41:6;;16571:2:10;13759:41:6::1;::::0;::::1;16553:21:10::0;16610:2;16590:18;;;16583:30;-1:-1:-1;;;16629:18:10;;;16622:44;16683:18;;13759:41:6::1;16369:338:10::0;13759:41:6::1;13807:26;13836:38;13858:8;:15;;;13836:21;:38::i;:::-;13807:67:::0;-1:-1:-1;13807:67:6;13996:14:::1;:10:::0;14009:1:::1;13996:14;:::i;:::-;:36;13992:197;;;14070:21:::0;;-1:-1:-1;;;;;14070:21:6::1;14063:29;::::0;;;:6:::1;:29;::::0;;;;;14047:96:::1;::::0;14094:39:::1;14063:29:::0;14094:7;:39:::1;:::i;:::-;14135:7;14047:15;:96::i;:::-;14043:139;;14160:12:::0;::::1;::::0;::::1;:::i;:::-;;;;14043:139;14225:10;14203:18;:32;;14195:51;;;::::0;-1:-1:-1;;;14195:51:6;;10750:2:10;14195:51:6::1;::::0;::::1;10732:21:10::0;10789:1;10769:18;;;10762:29;-1:-1:-1;;;10807:18:10;;;10800:36;10853:18;;14195:51:6::1;10548:329:10::0;14195:51:6::1;14281:10;14253:8;:24;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;14520:21:6;;-1:-1:-1;;;;;14520:21:6::1;14451:22;14513:29:::0;;;:6:::1;:29;::::0;;;;;14476:67:::1;::::0;14492:10;;14504:7;;14476:15:::1;:67::i;:::-;14557:21:::0;;-1:-1:-1;;;;;14557:21:6::1;14550:29;::::0;;;:6:::1;:29;::::0;;;;:43;;14451:92;;-1:-1:-1;14583:10:6;;14550:29;;;:43:::1;::::0;14583:10;;14550:43:::1;:::i;:::-;::::0;;;-1:-1:-1;;14634:21:6;;14606:78:::1;::::0;-1:-1:-1;;;;;14634:21:6::1;14657:10;14669:14:::0;14606:27:::1;:78::i;:::-;14707:21:::0;;14696:49:::1;::::0;;-1:-1:-1;;;;;14707:21:6;;::::1;7044:51:10::0;;7126:2;7111:18;;7104:34;;;14696:49:6::1;::::0;7017:18:10;14696:49:6::1;;;;;;;-1:-1:-1::0;;1706:1:5;2632:22;;-1:-1:-1;;;;;13141:1610:6:o;17717:1334::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;17830:10:6::1;-1:-1:-1::0;;;;;17830:23:6;::::1;;;17822:40;;;;-1:-1:-1::0;;;17822:40:6::1;;;;;;15565:2:10::0;15547:21;;;15604:1;15584:18;;;15577:29;-1:-1:-1;;;15637:2:10;15622:18;;15615:34;15681:2;15666:18;;15363:327;17822:40:6::1;17869:33;17905:14:::0;;;:5:::1;:14;::::0;;;;17934:21:::1;::::0;::::1;::::0;-1:-1:-1;;;;;17934:21:6::1;17959:10;17934:35;17926:53;;;;-1:-1:-1::0;;;17926:53:6::1;;;;;;;:::i;:::-;17992:27;;:::i;:::-;18052:15;:28;;;;;;;;;;-1:-1:-1::0;;;;;18052:28:6::1;18026:10;:23;;:54;-1:-1:-1::0;;;;;18026:54:6::1;;;-1:-1:-1::0;;;;;18026:54:6::1;;;::::0;::::1;18116:15;:31;;;18087:10;:26;;:60;;;::::0;::::1;18183:15;:31;;;18154:10;:26;;:60;;;::::0;::::1;18248:15;:29;;;18221:10;:24;;:56;;;::::0;::::1;18309:15;:27;;;18284:10;:22;;:52;;;::::0;::::1;18363:5;;18343:10;:17;;:25;;;::::0;::::1;18394:9;18375:10;:16;;:28;-1:-1:-1::0;;;;;18375:28:6::1;;;-1:-1:-1::0;;;;;18375:28:6::1;;;::::0;::::1;18433:15;:25;;;;;;;;;;-1:-1:-1::0;;;;;18433:25:6::1;18410:10;:20;;:48;-1:-1:-1::0;;;;;18410:48:6::1;;;-1:-1:-1::0;;;;;18410:48:6::1;;;::::0;::::1;18519:10;18504:5;:12;18510:5;;18504:12;;;;;;;;;;;:25;;;;;;;;;;;;;-1:-1:-1::0;;;;;18504:25:6::1;;;;;-1:-1:-1::0;;;;;18504:25:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;18504:25:6::1;;;;;-1:-1:-1::0;;;;;18504:25:6::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;18504:25:6::1;;;;;-1:-1:-1::0;;;;;18504:25:6::1;;;;;;;;;18536:11;:41;18548:15;:28;;;;;;;;;;-1:-1:-1::0;;;;;18548:28:6::1;-1:-1:-1::0;;;;;18536:41:6::1;-1:-1:-1::0;;;;;18536:41:6::1;;;;;;;;;;;;18583:5;;18536:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18645:25;18673:5;:16;18679:9;-1:-1:-1::0;;;;;18673:16:6::1;-1:-1:-1::0;;;;;18673:16:6::1;;;;;;;;;;;;18645:44;;18696:55;18722:15;:28;;;;;;;;;;-1:-1:-1::0;;;;;18722:28:6::1;18696:8;:21;;:25;;:55;;;;:::i;:::-;-1:-1:-1::0;18781:28:6;;-1:-1:-1;;;;;18781:28:6::1;18758:52;::::0;;;:22:::1;::::0;::::1;:52;::::0;;;;;;18816:17:::1;::::0;::::1;::::0;18758:76;;18781:28;18758:76;::::1;::::0;;;;;;;;::::1;::::0;18841:5:::1;:8:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;18937:31:6::1;::::0;::::1;::::0;18903::::1;::::0;::::1;:65:::0;19004:17:::1;::::0;::::1;::::0;18980:65:::1;::::0;;19981:25:10;;;20037:2;20022:18;;20015:34;;;;19023:10:6::1;20103:18:10::0;;;20096:43;-1:-1:-1;;;;;20175:15:10;;20170:2;20155:18;;20148:43;18980:65:6;::::1;::::0;;;;19968:3:10;18980:65:6;;::::1;-1:-1:-1::0;;1706:1:5;2632:22;;-1:-1:-1;;;17717:1334:6:o;22105:289::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;22177:26:6::1;22206:14:::0;;;:5:::1;:14;::::0;;;;22235::::1;::::0;::::1;::::0;-1:-1:-1;;;;;22235:14:6::1;22253:10;22235:28;22227:46;;;;-1:-1:-1::0;;;22227:46:6::1;;;;;;;:::i;:::-;22288:18;::::0;::::1;::::0;-1:-1:-1;;;;;22288:18:6::1;22280:41;;;::::0;::::1;;22357:18;;:31:::0;;-1:-1:-1;;;;;;22357:31:6::1;::::0;;-1:-1:-1;22357:31:6;2632:22:5;;22105:289:6:o;19353:1337::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;19444:11:6;19436:35:::1;;;::::0;-1:-1:-1;;;19436:35:6;;15897:2:10;19436:35:6::1;::::0;::::1;15879:21:10::0;15936:2;15916:18;;;15909:30;-1:-1:-1;;;15955:18:10;;;15948:41;16006:18;;19436:35:6::1;15695:335:10::0;19436:35:6::1;19478:26;19507:14:::0;;;:5:::1;:14;::::0;;;;19536::::1;::::0;::::1;::::0;-1:-1:-1;;;;;19536:14:6::1;19554:10;19536:28;19528:46;;;;-1:-1:-1::0;;;19528:46:6::1;;;;;;;:::i;:::-;19589:22;::::0;::::1;::::0;:27;19581:51:::1;;;::::0;-1:-1:-1;;;19581:51:6;;14885:2:10;19581:51:6::1;::::0;::::1;14867:21:10::0;14924:2;14904:18;;;14897:30;-1:-1:-1;;;14943:18:10;;;14936:41;14994:18;;19581:51:6::1;14683:335:10::0;19581:51:6::1;19722:21:::0;;19715:54:::1;::::0;-1:-1:-1;;;19715:54:6;;19763:4:::1;19715:54;::::0;::::1;6428:51:10::0;19697:15:6::1;::::0;-1:-1:-1;;;;;19722:21:6::1;::::0;19715:39:::1;::::0;6401:18:10;;19715:54:6::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19824:21:::0;;-1:-1:-1;;;;;19824:21:6::1;19776:22;19817:29:::0;;;:6:::1;:29;::::0;;;;;19697:72;;-1:-1:-1;19776:22:6;19801:64:::1;::::0;19848:7;19697:72;19801:15:::1;:64::i;:::-;19776:89;;19927:8;:24;;;19909:14;19882:8;:24;;;:41;;;;:::i;:::-;:69;;19874:78;;;::::0;::::1;;19965:27;;:::i;:::-;20025:21:::0;;-1:-1:-1;;;;;20025:21:6;;::::1;19999:47:::0;;20053:26:::1;::::0;::::1;:43:::0;;;20128:20:::1;::::0;::::1;::::0;20103:22:::1;::::0;::::1;:45:::0;20175:5:::1;::::0;20155:17:::1;::::0;::::1;:25:::0;20206:10:::1;20187:16;::::0;::::1;:29:::0;20246:18:::1;::::0;::::1;::::0;::::1;20223:20;::::0;::::1;:41:::0;20305:24:::1;::::0;::::1;:42:::0;;20082:14;;20305:24;20025:21:::1;::::0;20305:42:::1;::::0;20082:14;;20305:42:::1;:::i;:::-;::::0;;;-1:-1:-1;;20403:5:6::1;::::0;;20397:12:::1;::::0;;;:5:::1;:12;::::0;;;;;;;:25;;;;-1:-1:-1;;;;;;20397:25:6;;::::1;-1:-1:-1::0;;;;;20397:25:6;;::::1;;::::0;;;;::::1;::::0;-1:-1:-1;20397:25:6;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;;::::0;;;20441:21;;;::::1;20429:34:::0;;;;;;;;20469:5;;20429:46;;;;::::1;::::0;;;;;;;;;;::::1;::::0;20537:10:::1;20531:17:::0;;:5:::1;:17:::0;;;;;20563:21;;;;::::1;20531:54:::0;;:31;::::1;:54:::0;;;;;20591:17;;20531:78;;;;::::1;::::0;;;;;;;;::::1;::::0;20616:8;;;20403:5;20616:8:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;20657:17:6::1;::::0;::::1;::::0;20636:48:::1;::::0;;20864:25:10;;;20920:2;20905:18;;20898:34;;;;20948:18;;20941:34;;;20636:48:6::1;::::0;20852:2:10;20837:18;20636:48:6::1;20662:319:10::0;22511:138:6;22577:4;22617:9;-1:-1:-1;;;;;22600:40:6;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1752:145:4:-;1166:7;1192:6;-1:-1:-1;;;;;1192:6:4;723:10:0;1332:23:4;1324:68;;;;-1:-1:-1;;;1324:68:4;;;;;;;:::i;:::-;1858:1:::1;1842:6:::0;;1821:40:::1;::::0;-1:-1:-1;;;;;1842:6:4;;::::1;::::0;1821:40:::1;::::0;1858:1;;1821:40:::1;1888:1;1871:19:::0;;-1:-1:-1;;;;;;1871:19:4::1;::::0;;1752:145::o;7512:110:6:-;1166:7:4;1192:6;-1:-1:-1;;;;;1192:6:4;723:10:0;1332:23:4;1324:68;;;;-1:-1:-1;;;1324:68:4;;;;;;;:::i;:::-;7595:9:6::1;:21:::0;;-1:-1:-1;;;;;;7595:21:6::1;-1:-1:-1::0;;;;;7595:21:6;;;::::1;::::0;;;::::1;::::0;;7512:110::o;25580:98::-;25634:7;25657:15;:6;:13;:15::i;8050:197::-;1166:7:4;1192:6;-1:-1:-1;;;;;1192:6:4;723:10:0;1332:23:4;1324:68;;;;-1:-1:-1;;;1324:68:4;;;;;;;:::i;:::-;8135:4:6::1;8131:111;;;8150:29;:18;8173:5:::0;8150:22:::1;:29::i;:::-;;8050:197:::0;;:::o;8131:111::-:1;8202:32;:18;8228:5:::0;8202:25:::1;:32::i;8131:111::-;8050:197:::0;;:::o;25937:143::-;-1:-1:-1;;;;;26047:19:6;;26024:7;26047:19;;;:11;:19;;;;;:27;;26067:6;;26047:27;;;;;;:::i;:::-;;;;;;;;;26040:34;;25937:143;;;;:::o;26254:155::-;-1:-1:-1;;;;;26367:12:6;;26344:7;26367:12;;;:5;:12;;;;;:36;;26396:6;26367:28;:36::i;25686:111::-;25751:7;25774:17;:6;25784;25774:9;:17::i;8326:529::-;8408:35;:18;8436:6;8408:27;:35::i;:::-;8407:36;8399:53;;;;-1:-1:-1;;;8399:53:6;;;;;;12850:2:10;12832:21;;;12889:1;12869:18;;;12862:29;-1:-1:-1;;;12922:2:10;12907:18;;12900:34;12966:2;12951:18;;12648:327;8399:53:6;8486:21;;-1:-1:-1;;;;;8486:21:6;8482:329;;8557:19;;8544:9;:32;8536:56;;;;-1:-1:-1;;;8536:56:6;;15225:2:10;8536:56:6;;;15207:21:10;15264:2;15244:18;;;15237:30;-1:-1:-1;;;15283:18:10;;;15276:41;15334:18;;8536:56:6;15023:335:10;8536:56:6;8605:15;;8630:19;;8605:45;;-1:-1:-1;;;;;8605:15:6;;;;:45;;;;;8630:19;8605:15;:45;:15;:45;8630:19;8605:15;:45;;;;;;;;;;;;;;;;;;;;;8482:329;;;8719:21;;8764:15;;8781:19;;8679:122;;-1:-1:-1;;;;;8719:21:6;;;;8751:10;;8764:15;;;8679:31;:122::i;:::-;8819:30;:18;8842:6;8819:22;:30::i;26109:137::-;-1:-1:-1;;;;;26206:12:6;;26183:7;26206:12;;;:5;:12;;;;;:34;;:32;:34::i;26916:130::-;26988:7;27011:29;:18;27033:6;27011:21;:29::i;14876:1118::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;14984:4:6::1;14969:19:::0;::::1;14961:36;;;;-1:-1:-1::0;;;14961:36:6::1;;;;;;11491:2:10::0;11473:21;;;11530:1;11510:18;;;11503:29;-1:-1:-1;;;11563:2:10;11548:18;;11541:34;11607:2;11592:18;;11289:327;14961:36:6::1;15062:26;15091:14:::0;;;:5:::1;:14;::::0;;;;15120::::1;::::0;::::1;::::0;-1:-1:-1;;;;;15120:14:6::1;15138:10;15120:28;15112:46;;;;-1:-1:-1::0;;;15112:46:6::1;;;;;;;:::i;:::-;15196:12;15173:8;:20;;;:35;15165:51;;;::::0;-1:-1:-1;;;15165:51:6;;14554:2:10;15165:51:6::1;::::0;::::1;14536:21:10::0;14593:1;14573:18;;;14566:29;-1:-1:-1;;;14611:18:10;;;14604:33;14654:18;;15165:51:6::1;14352:326:10::0;15165:51:6::1;15276:21:::0;;15248:50:::1;::::0;:18:::1;::::0;-1:-1:-1;;;;;15276:21:6::1;15248:27;:50::i;:::-;15243:661;;15311:23;15364:8;:24;;;15337:8;:24;;;:51;;;;:::i;:::-;15311:77;;15399:19;15421:54;15437:15;15454:4;:13;;;15469:5;15421:15;:54::i;:::-;15511:21:::0;;15504:54:::1;::::0;-1:-1:-1;;;15504:54:6;;15552:4:::1;15504:54;::::0;::::1;6428:51:10::0;15399:76:6;;-1:-1:-1;15486:15:6::1;::::0;-1:-1:-1;;;;;15511:21:6;;::::1;::::0;15504:39:::1;::::0;6401:18:10;;15504:54:6::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15636:21:::0;;-1:-1:-1;;;;;15636:21:6::1;15569:19;15629:29:::0;;;:6:::1;:29;::::0;;;;;15486:72;;-1:-1:-1;15569:19:6;15591:109:::1;::::0;15607:11;;15486:72;;15629:34;:70:::1;;15677:21:::0;;-1:-1:-1;;;;;15677:21:6::1;15670:29;::::0;;;:6:::1;:29;::::0;;;;;11326:15:::1;:87::i;15591:109::-;15739:21:::0;;15762:15;;15569:131;;-1:-1:-1;15711:80:6::1;::::0;-1:-1:-1;;;;;15739:21:6;;::::1;::::0;15762:15:::1;15569:131:::0;15711:27:::1;:80::i;:::-;15830:11;15802:8;:24;;;:39;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;15859:21:6;;-1:-1:-1;;;;;15859:21:6::1;15852:29;::::0;;;:6:::1;:29;::::0;;;;:44;;15885:11;;15852:29;:44:::1;::::0;15885:11;;15852:44:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;15243:661:6::1;15910:20;::::0;::::1;:35:::0;;;15957:31:::1;::::0;;19655:25:10;;;19711:2;19696:18;;19689:34;;;15957:31:6::1;::::0;19628:18:10;15957:31:6::1;;;;;;;-1:-1:-1::0;;1706:1:5;2632:22;;-1:-1:-1;14876:1118:6:o;8946:295::-;9028:11;;:35;;-1:-1:-1;;;9028:35:6;;9052:10;9028:35;;;6428:51:10;-1:-1:-1;;;;;9028:11:6;;;;:23;;6401:18:10;;9028:35:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:78;;;-1:-1:-1;9067:39:6;:18;9095:10;9067:27;:39::i;:::-;9020:96;;;;-1:-1:-1;;;9020:96:6;;16914:2:10;9020:96:6;;;16896:21:10;16953:1;16933:18;;;16926:29;-1:-1:-1;;;16971:18:10;;;16964:35;17016:18;;9020:96:6;16712:328:10;9020:96:6;9127:4;9123:113;;;9142:30;:18;9165:6;9142:22;:30::i;9123:113::-;9195:33;:18;9221:6;9195:25;:33::i;24220:230::-;24342:39;;-1:-1:-1;;;24342:39:6;;24375:4;24342:39;;;6428:51:10;24308:7:6;;;;-1:-1:-1;;;;;24342:24:6;;;;;6401:18:10;;24342:39:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24411:14:6;;;;;;:6;:14;;;;;;24324:57;;-1:-1:-1;24395:49:6;;24427:7;24324:57;24395:15;:49::i;27479:134::-;27553:4;27573:34;:18;27601:5;27573:27;:34::i;23499:462::-;23571:7;23616:14;;;:5;:14;;;;;23688:15;;;;23571:7;;23666:38;;:21;:38::i;:::-;23736:21;;23729:54;;-1:-1:-1;;;23729:54:6;;23777:4;23729:54;;;6428:51:10;23637:67:6;;-1:-1:-1;23711:15:6;;-1:-1:-1;;;;;23736:21:6;;;;23729:39;;6401:18:10;;23729:54:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23865:21;;-1:-1:-1;;;;;23865:21:6;23790:20;23858:29;;;:6;:29;;;;;;23711:72;;-1:-1:-1;23790:20:6;23813:116;;23829:18;;23711:72;;23858:34;:70;;23906:21;;-1:-1:-1;;;;;23906:21:6;23899:29;;;;:6;:29;;;;;;11326:15:::1;:87::i;23813:116::-:0;23790:139;23499:462;-1:-1:-1;;;;;;23499:462:6:o;24609:963::-;24667:7;24795:14;;;:5;:14;;;;;;;;24766:43;;;;;;;;;-1:-1:-1;;;;;24766:43:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24838:55;;-1:-1:-1;;;24838:55:6;;24887:4;24838:55;;;6428:51:10;;;;24667:7:6;;;;;;;;;;;;;;;;;;24766:43;24667:7;;24766:43;24838:40;;6401:18:10;;24838:55:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24934:22;;-1:-1:-1;;;;;24927:30:6;24902:22;24927:30;;;:6;:30;;;;;;24820:73;;-1:-1:-1;24902:22:6;24927:35;:72;;24976:22;;-1:-1:-1;;;;;24969:30:6;;;;;:6;:30;;;;;;24927:72;;;24965:1;24927:72;24902:97;;25131:23;25157:67;25173:9;:25;;;25200:7;25209:14;25157:15;:67::i;:::-;25131:93;;25233:23;25259:67;25275:9;:25;;;25302:7;25311:14;25259:15;:67::i;:::-;25233:93;;25343:9;:16;;;25361:9;:22;;;25385:15;25402;25419:9;:25;;;25446:9;:25;;;25473:9;:23;;;25498:9;:21;;;25529:9;:15;;;25546:9;:19;;;25335:231;;;;;;;;;;;;;;;;;;;;;;;;;24609:963;;;;;;;;;;;:::o;22761:647::-;22831:7;22876:14;;;:5;:14;;;;;22914:22;;;;22831:7;;22914:27;:35;;22948:1;22914:35;;;22944:1;22914:35;22897:52;;22956:14;22973:8;:13;;22985:1;22973:13;:94;;23043:8;:24;;;22973:94;;;23016:8;:24;;;22989:8;:24;;;:51;;;;:::i;:::-;22956:111;;23074:20;23116:178;23166:8;:22;;;23198:8;:20;;;23228:6;23244:15;23269:8;:18;;;;;;;;;;-1:-1:-1;;;;;23269:18:6;23116:40;:178::i;:::-;23101:193;;23305:8;:13;;23317:1;23305:13;23301:76;;;23345:24;;;;23329:40;;;;:::i;23301:76::-;23390:12;22761:647;-1:-1:-1;;;;;22761:647:6:o;27337:134::-;27413:7;27436:29;:18;27458:6;27436:21;:29::i;2046:240:4:-;1166:7;1192:6;-1:-1:-1;;;;;1192:6:4;723:10:0;1332:23:4;1324:68;;;;-1:-1:-1;;;1324:68:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;2134:22:4;::::1;2126:73;;;::::0;-1:-1:-1;;;2126:73:4;;11084:2:10;2126:73:4::1;::::0;::::1;11066:21:10::0;11123:2;11103:18;;;11096:30;11162:34;11142:18;;;11135:62;-1:-1:-1;;;11213:18:10;;;11206:36;11259:19;;2126:73:4::1;10882:402:10::0;2126:73:4::1;2235:6;::::0;;2214:38:::1;::::0;-1:-1:-1;;;;;2214:38:4;;::::1;::::0;2235:6;::::1;::::0;2214:38:::1;::::0;::::1;2262:6;:17:::0;;-1:-1:-1;;;;;;2262:17:4::1;-1:-1:-1::0;;;;;2262:17:4;;;::::1;::::0;;;::::1;::::0;;2046:240::o;7630:302:6:-;1166:7:4;1192:6;-1:-1:-1;;;;;1192:6:4;723:10:0;1332:23:4;1324:68;;;;-1:-1:-1;;;1324:68:4;;;;;;;:::i;:::-;7773:4:6::1;:25:::0;;;;7805:19;:37;;;;7849:15;:29;;-1:-1:-1;;;;;7849:29:6;;::::1;-1:-1:-1::0;;;;;;7849:29:6;;::::1;;::::0;;;7885:21;:41;;;;;::::1;::::0;::::1;;::::0;;7630:302::o;7294:115:1:-;7357:7;7383:19;7391:3;4159:18;;4077:107;889:4081:2;1005:14;;;-1:-1:-1;;1521:1:2;1518;1511:20;1561:1;1558;1554:9;1545:18;;1613:5;1609:2;1606:13;1598:5;1594:2;1590:14;1586:34;1577:43;;;1706:5;1715:1;1706:10;1702:185;;;1755:1;1741:11;:15;1733:24;;;;;;-1:-1:-1;1810:23:2;;;;-1:-1:-1;1862:13:2;;1702:185;2018:5;2004:11;:19;1996:28;;;;;;2309:17;2387:11;2384:1;2381;2374:25;3845:1;2825;2791:31;;:35;;2790:51;;2950:22;;;;3826:1;:15;;3825:21;;4092:17;;;4088:21;;4081:28;4155:17;;;4151:21;;4144:28;4219:17;;;4215:21;;4208:28;4283:17;;;4279:21;;4272:28;4347:17;;;4343:21;;4336:28;4412:17;;;4408:21;;;4401:28;;;2775:12;3373;;;3369:23;;;3365:31;;;2520:20;;;2509:32;;;3434:12;;;;2564:21;;3099:16;;;;3425:21;;;;4912:11;;;-1:-1:-1;;;;889:4081:2:o;802:323:7:-;948:51;;;-1:-1:-1;;;;;6748:15:10;;;948:51:7;;;6730:34:10;6800:15;;;6780:18;;;6773:43;6832:18;;;;6825:34;;;948:51:7;;;;;;;;;;6665:18:10;;;;948:51:7;;;;;;;-1:-1:-1;;;;;948:51:7;-1:-1:-1;;;948:51:7;;;937:63;;-1:-1:-1;;;;937:10:7;;;;:63;;948:51;937:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;901:99;;;;1019:7;:57;;;;-1:-1:-1;1031:11:7;;:16;;:44;;;1062:4;1051:24;;;;;;;;;;;;:::i;:::-;1011:106;;;;-1:-1:-1;;;1011:106:7;;17247:2:10;1011:106:7;;;17229:21:10;17286:2;17266:18;;;17259:30;17325:34;17305:18;;;17298:62;-1:-1:-1;;;17376:18:10;;;17369:34;17420:19;;1011:106:7;17045:400:10;1011:106:7;890:235;;802:323;;;;:::o;7048:165:1:-;-1:-1:-1;;;;;7181:23:1;;7128:4;3965:19;;;:12;;;:19;;;;;;:24;;7151:55;3869:127;500:294:7;628:45;;;-1:-1:-1;;;;;7062:32:10;;;628:45:7;;;7044:51:10;7111:18;;;;7104:34;;;628:45:7;;;;;;;;;;7017:18:10;;;;628:45:7;;;;;;;-1:-1:-1;;;;;628:45:7;-1:-1:-1;;;628:45:7;;;617:57;;-1:-1:-1;;;;617:10:7;;;;:57;;628:45;617:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;581:93;;;;693:7;:57;;;;-1:-1:-1;705:11:7;;:16;;:44;;;736:4;725:24;;;;;;;;;;;;:::i;:::-;685:101;;;;-1:-1:-1;;;685:101:7;;10390:2:10;685:101:7;;;10372:21:10;10429:2;10409:18;;;10402:30;10468:33;10448:18;;;10441:61;10519:18;;685:101:7;10188:355:10;685:101:7;570:224;;500:294;;;:::o;6493:150:1:-;6563:4;6586:50;6591:3;-1:-1:-1;;;;;6611:23:1;;6586:4;:50::i;200:292:7:-;327:45;;;-1:-1:-1;;;;;7062:32:10;;;327:45:7;;;7044:51:10;7111:18;;;;7104:34;;;327:45:7;;;;;;;;;;7017:18:10;;;;327:45:7;;;;;;;-1:-1:-1;;;;;327:45:7;-1:-1:-1;;;327:45:7;;;316:57;;-1:-1:-1;;;;316:10:7;;;;:57;;327:45;316:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;280:93;;;;392:7;:57;;;;-1:-1:-1;404:11:7;;:16;;:44;;;435:4;424:24;;;;;;;;;;;;:::i;:::-;384:100;;;;-1:-1:-1;;;384:100:7;;11823:2:10;384:100:7;;;11805:21:10;11862:2;11842:18;;;11835:30;11901:32;11881:18;;;11874:60;11951:18;;384:100:7;11621:354:10;6811:156:1;6884:4;6907:53;6915:3;-1:-1:-1;;;;;6935:23:1;;6907:7;:53::i;7741:156::-;7815:7;7865:22;7869:3;7881:5;7865:3;:22::i;486:1303:9:-;639:7;-1:-1:-1;;;;;969:23:9;;;;;;:69;;;1013:9;-1:-1:-1;;;;;996:40:9;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;965:105;;;-1:-1:-1;1056:6:9;1049:13;;965:105;1140:18;;;:50;;;1179:11;1162:13;:28;1140:50;1136:118;;;1224:9;1210:11;:23;:36;;1245:1;1210:36;;;1236:6;1210:36;1203:43;;;;1136:118;1334:9;1354:23;;;1350:71;;;-1:-1:-1;1402:11:9;1350:71;1443:13;1431:9;:25;1427:75;;;-1:-1:-1;1481:13:9;1427:75;1508:15;1526:25;1538:13;1526:9;:25;:::i;:::-;1508:43;-1:-1:-1;1558:18:9;1579:27;1593:13;1579:11;:27;:::i;:::-;1558:48;;1620:44;1636:6;1644:7;1653:10;1620:15;:44::i;:::-;1613:51;486:1303;-1:-1:-1;;;;;;;;;486:1303:9:o;1704:404:1:-;1767:4;3965:19;;;:12;;;:19;;;;;;1783:319;;-1:-1:-1;1825:23:1;;;;;;;;:11;:23;;;;;;;;;;;;;2005:18;;1983:19;;;:12;;;:19;;;;;;:40;;;;2037:11;;1783:319;-1:-1:-1;2086:5:1;2079:12;;2276:1512;2342:4;2479:19;;;:12;;;:19;;;;;;2513:15;;2509:1273;;2870:21;2894:14;2907:1;2894:10;:14;:::i;:::-;2942:18;;2870:38;;-1:-1:-1;2922:17:1;;2942:22;;2963:1;;2942:22;:::i;:::-;2922:42;;3204:17;3224:3;:11;;3236:9;3224:22;;;;;;;;:::i;:::-;;;;;;;;;3204:42;;3367:9;3338:3;:11;;3350:13;3338:26;;;;;;;;:::i;:::-;;;;;;;;;;:38;3468:17;:13;3484:1;3468:17;:::i;:::-;3442:23;;;;:12;;;:23;;;;;:43;3591:17;;3442:3;;3591:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3683:3;:12;;:19;3696:5;3683:19;;;;;;;;;;;3676:26;;;3724:4;3717:11;;;;;;;;2509:1273;3766:5;3759:12;;;;;4516:201;4610:18;;4583:7;;4610:26;-1:-1:-1;4602:73:1;;;;-1:-1:-1;;;4602:73:1;;9641:2:10;4602:73:1;;;9623:21:10;9680:2;9660:18;;;9653:30;9719:34;9699:18;;;9692:62;-1:-1:-1;;;9770:18:10;;;9763:32;9812:19;;4602:73:1;9439:398:10;4602:73:1;4692:3;:11;;4704:5;4692:18;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:247:10:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:388::-;334:6;342;395:2;383:9;374:7;370:23;366:32;363:52;;;411:1;408;401:12;363:52;450:9;437:23;469:31;494:5;469:31;:::i;:::-;519:5;-1:-1:-1;576:2:10;561:18;;548:32;589:33;548:32;589:33;:::i;:::-;641:7;631:17;;;266:388;;;;;:::o;659:456::-;736:6;744;752;805:2;793:9;784:7;780:23;776:32;773:52;;;821:1;818;811:12;773:52;860:9;847:23;879:31;904:5;879:31;:::i;:::-;929:5;-1:-1:-1;986:2:10;971:18;;958:32;999:33;958:32;999:33;:::i;:::-;659:456;;1051:7;;-1:-1:-1;;;1105:2:10;1090:18;;;;1077:32;;659:456::o;1120:782::-;1244:6;1252;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1368:9;1355:23;1387:31;1412:5;1387:31;:::i;:::-;1437:5;-1:-1:-1;1493:2:10;1478:18;;1465:32;1516:18;1546:14;;;1543:34;;;1573:1;1570;1563:12;1543:34;1611:6;1600:9;1596:22;1586:32;;1656:7;1649:4;1645:2;1641:13;1637:27;1627:55;;1678:1;1675;1668:12;1627:55;1718:2;1705:16;1744:2;1736:6;1733:14;1730:34;;;1760:1;1757;1750:12;1730:34;1816:7;1811:2;1803:4;1795:6;1791:17;1787:2;1783:26;1779:35;1776:48;1773:68;;;1837:1;1834;1827:12;1773:68;1868:2;1864;1860:11;1850:21;;1890:6;1880:16;;;;;1120:782;;;;;:::o;1907:382::-;1972:6;1980;2033:2;2021:9;2012:7;2008:23;2004:32;2001:52;;;2049:1;2046;2039:12;2001:52;2088:9;2075:23;2107:31;2132:5;2107:31;:::i;:::-;2157:5;-1:-1:-1;2214:2:10;2199:18;;2186:32;2227:30;2186:32;2227:30;:::i;2294:315::-;2362:6;2370;2423:2;2411:9;2402:7;2398:23;2394:32;2391:52;;;2439:1;2436;2429:12;2391:52;2478:9;2465:23;2497:31;2522:5;2497:31;:::i;:::-;2547:5;2599:2;2584:18;;;;2571:32;;-1:-1:-1;;;2294:315:10:o;2614:245::-;2681:6;2734:2;2722:9;2713:7;2709:23;2705:32;2702:52;;;2750:1;2747;2740:12;2702:52;2782:9;2776:16;2801:28;2823:5;2801:28;:::i;3408:945::-;3494:6;3547:3;3535:9;3526:7;3522:23;3518:33;3515:53;;;3564:1;3561;3554:12;3515:53;3597:2;3591:9;3639:3;3631:6;3627:16;3709:6;3697:10;3694:22;3673:18;3661:10;3658:34;3655:62;3652:185;;;3759:10;3754:3;3750:20;3747:1;3740:31;3794:4;3791:1;3784:15;3822:4;3819:1;3812:15;3652:185;3853:2;3846:22;3890:23;;3922:31;3890:23;3922:31;:::i;:::-;3977:5;3969:6;3962:21;;4044:2;4033:9;4029:18;4016:32;4011:2;4003:6;3999:15;3992:57;4110:2;4099:9;4095:18;4082:32;4077:2;4069:6;4065:15;4058:57;4176:2;4165:9;4161:18;4148:32;4143:2;4135:6;4131:15;4124:57;4233:3;4222:9;4218:19;4205:33;4247;4272:7;4247:33;:::i;:::-;4308:3;4296:16;;4289:33;4300:6;3408:945;-1:-1:-1;;;3408:945:10:o;4358:180::-;4417:6;4470:2;4458:9;4449:7;4445:23;4441:32;4438:52;;;4486:1;4483;4476:12;4438:52;-1:-1:-1;4509:23:10;;4358:180;-1:-1:-1;4358:180:10:o;4543:184::-;4613:6;4666:2;4654:9;4645:7;4641:23;4637:32;4634:52;;;4682:1;4679;4672:12;4634:52;-1:-1:-1;4705:16:10;;4543:184;-1:-1:-1;4543:184:10:o;4732:323::-;4808:6;4816;4869:2;4857:9;4848:7;4844:23;4840:32;4837:52;;;4885:1;4882;4875:12;4837:52;4921:9;4908:23;4898:33;;4981:2;4970:9;4966:18;4953:32;4994:31;5019:5;4994:31;:::i;5060:248::-;5128:6;5136;5189:2;5177:9;5168:7;5164:23;5160:32;5157:52;;;5205:1;5202;5195:12;5157:52;-1:-1:-1;;5228:23:10;;;5298:2;5283:18;;;5270:32;;-1:-1:-1;5060:248:10:o;5313:533::-;5407:6;5415;5423;5431;5484:3;5472:9;5463:7;5459:23;5455:33;5452:53;;;5501:1;5498;5491:12;5452:53;5537:9;5524:23;5514:33;;5594:2;5583:9;5579:18;5566:32;5556:42;;5648:2;5637:9;5633:18;5620:32;5661:31;5686:5;5661:31;:::i;:::-;5711:5;-1:-1:-1;5768:2:10;5753:18;;5740:32;5781:33;5740:32;5781:33;:::i;:::-;5313:533;;;;-1:-1:-1;5313:533:10;;-1:-1:-1;;5313:533:10:o;5851:426::-;5980:3;6018:6;6012:13;6043:1;6053:129;6067:6;6064:1;6061:13;6053:129;;;6165:4;6149:14;;;6145:25;;6139:32;6126:11;;;6119:53;6082:12;6053:129;;;6200:6;6197:1;6194:13;6191:48;;;6235:1;6226:6;6221:3;6217:16;6210:27;6191:48;-1:-1:-1;6255:16:10;;;;;5851:426;-1:-1:-1;;5851:426:10:o;12315:328::-;12517:2;12499:21;;;12556:1;12536:18;;;12529:29;-1:-1:-1;;;12589:2:10;12574:18;;12567:35;12634:2;12619:18;;12315:328::o;13320:356::-;13522:2;13504:21;;;13541:18;;;13534:30;13600:34;13595:2;13580:18;;13573:62;13667:2;13652:18;;13320:356::o;17450:355::-;17652:2;17634:21;;;17691:2;17671:18;;;17664:30;17730:33;17725:2;17710:18;;17703:61;17796:2;17781:18;;17450:355::o;20986:128::-;21026:3;21057:1;21053:6;21050:1;21047:13;21044:39;;;21063:18;;:::i;:::-;-1:-1:-1;21099:9:10;;20986:128::o;21119:217::-;21159:1;21185;21175:132;;21229:10;21224:3;21220:20;21217:1;21210:31;21264:4;21261:1;21254:15;21292:4;21289:1;21282:15;21175:132;-1:-1:-1;21321:9:10;;21119:217::o;21341:125::-;21381:4;21409:1;21406;21403:8;21400:34;;;21414:18;;:::i;:::-;-1:-1:-1;21451:9:10;;21341:125::o;21471:135::-;21510:3;-1:-1:-1;;21531:17:10;;21528:43;;;21551:18;;:::i;:::-;-1:-1:-1;21598:1:10;21587:13;;21471:135::o;21611:127::-;21672:10;21667:3;21663:20;21660:1;21653:31;21703:4;21700:1;21693:15;21727:4;21724:1;21717:15;21743:127;21804:10;21799:3;21795:20;21792:1;21785:31;21835:4;21832:1;21825:15;21859:4;21856:1;21849:15;21875:127;21936:10;21931:3;21927:20;21924:1;21917:31;21967:4;21964:1;21957:15;21991:4;21988:1;21981:15;22007:131;-1:-1:-1;;;;;22082:31:10;;22072:42;;22062:70;;22128:1;22125;22118:12;22062:70;22007:131;:::o;22143:118::-;22229:5;22222:13;22215:21;22208:5;22205:32;22195:60;;22251:1;22248;22241:12
Swarm Source
ipfs://ab61d8cb2cf53ab318184de984944641a595ad15cf316dd923e90d830ae95cc3
Loading...
Loading
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.