Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
arNXMVault
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-28 */ // Sources flattened with hardhat v2.6.1 https://hardhat.org // File contracts/general/Ownable.sol pragma solidity ^0.6.6; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". * * @dev We've added a second owner to share control of the timelocked owner contract. */ contract Ownable { address private _owner; address private _pendingOwner; // Second allows a DAO to share control. address private _secondOwner; address private _pendingSecond; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event SecondOwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function initializeOwnable() internal { require(_owner == address(0), "already initialized"); _owner = msg.sender; _secondOwner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); emit SecondOwnershipTransferred(address(0), msg.sender); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @return the address of the owner. */ function secondOwner() public view returns (address) { return _secondOwner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "msg.sender is not owner"); _; } modifier onlyFirstOwner() { require(msg.sender == _owner, "msg.sender is not owner"); _; } modifier onlySecondOwner() { require(msg.sender == _secondOwner, "msg.sender is not owner"); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner || msg.sender == _secondOwner; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyFirstOwner { _pendingOwner = newOwner; } function receiveOwnership() public { require(msg.sender == _pendingOwner, "only pending owner can call this function"); _transferOwnership(_pendingOwner); _pendingOwner = address(0); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferSecondOwnership(address newOwner) public onlySecondOwner { _pendingSecond = newOwner; } function receiveSecondOwnership() public { require(msg.sender == _pendingSecond, "only pending owner can call this function"); _transferSecondOwnership(_pendingSecond); _pendingSecond = address(0); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferSecondOwnership(address newOwner) internal { require(newOwner != address(0)); emit SecondOwnershipTransferred(_secondOwner, newOwner); _secondOwner = newOwner; } uint256[50] private __gap; } // File contracts/libraries/Address.sol pragma solidity ^0.6.6; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * IMPORTANT: It is unsafe to assume that an address for which this * function returns false is an externally-owned account (EOA) and not a * contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File contracts/libraries/SafeMath.sol pragma solidity ^0.6.6; /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error * * @dev Default OpenZeppelin */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } // File contracts/interfaces/IERC20.sol pragma solidity ^0.6.6; /** * @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); function mint(address to, uint256 amount) external returns (bool); function burn(address from, 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); } // File contracts/libraries/SafeERC20.sol pragma solidity ^0.6.6; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/interfaces/IWNXM.sol pragma solidity ^0.6.6; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IWNXM { /** * @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); function mint(address to, uint256 amount) external returns (bool); function burn(address from, uint256 amount) external returns (bool); function wrap(uint256 amount) external; function unwrap(uint256 amount) external; /** * @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); } // File contracts/interfaces/INexusMutual.sol pragma solidity ^0.6.6; /** * @dev Quick interface for the Nexus Mutual contract to work with the Armor Contracts. **/ // to get nexus mutual contract address interface INxmMaster { function tokenAddress() external view returns(address); function owner() external view returns(address); function pauseTime() external view returns(uint); function masterInitialized() external view returns(bool); function isPause() external view returns(bool check); function isMember(address _add) external view returns(bool); function getLatestAddress(bytes2 _contractName) external view returns(address payable contractAddress); } interface IPooledStaking { function unstakeRequests(uint256 id) external view returns(uint256 amount, uint256 unstakeAt, address contractAddress, address stakerAddress, uint256 next); function processPendingActions(uint256 iterations) external returns(bool success); function MAX_EXPOSURE() external view returns(uint256); function lastUnstakeRequestId() external view returns(uint256); function stakerDeposit(address user) external view returns (uint256); function stakerMaxWithdrawable(address user) external view returns (uint256); function withdrawReward(address user) external; function requestUnstake(address[] calldata protocols, uint256[] calldata amounts, uint256 insertAfter) external; function depositAndStake(uint256 deposit, address[] calldata protocols, uint256[] calldata amounts) external; function stakerContractCount(address staker) external view returns(uint256); function stakerContractAtIndex(address staker, uint contractIndex) external view returns (address); function stakerContractStake(address staker, address protocol) external view returns (uint256); function stakerContractsArray(address staker) external view returns (address[] memory); function stakerContractPendingUnstakeTotal(address staker, address protocol) external view returns(uint256); function withdraw(uint256 amount) external; function stakerReward(address staker) external view returns (uint256); } interface IClaimsData { function getClaimStatusNumber(uint256 claimId) external view returns (uint256, uint256); function getClaimDateUpd(uint256 claimId) external view returns (uint256); } interface INXMPool { function buyNXM(uint minTokensOut) external payable; } interface IGovernance { function submitVote(uint256 _proposalId, uint256 _solution) external; } interface IQuotation { function getWithdrawableCoverNoteCoverIds(address owner) external view returns(uint256[] memory, bytes32[] memory); } // File contracts/interfaces/IRewardDistributionRecipient.sol pragma solidity ^0.6.6; interface IRewardDistributionRecipient { function notifyRewardAmount(uint256 reward) payable external; } // File contracts/interfaces/IRewardManager.sol pragma solidity ^0.6.6; interface IRewardManager is IRewardDistributionRecipient { function initialize(address _rewardToken, address _stakeController) external; function stake(address _user, address _referral, uint256 _coverPrice) external; function withdraw(address _user, address _referral, uint256 _coverPrice) external; function getReward(address payable _user) external; } // File contracts/interfaces/IShieldMining.sol pragma solidity ^0.6.0; interface IShieldMining { function claimRewards( address[] calldata stakedContracts, address[] calldata sponsors, address[] calldata tokenAddresses ) external returns (uint[] memory tokensRewarded); } // File contracts/core/arNXMVault.sol pragma solidity ^0.6.6; /** * @title arNXM Vault * @dev Vault to stake wNXM or NXM in Nexus Mutual while maintaining your liquidity. * This is V2 which replaces V1 behind a proxy. Updated variables at the bottom. * @author Armor.fi -- Robert M.C. Forster, Taek Lee * SPDX-License-Identifier: (c) Armor.Fi DAO, 2021 **/ contract arNXMVault is Ownable { using SafeMath for uint; using SafeERC20 for IERC20; uint256 constant private DENOMINATOR = 1000; // Amount of time between uint256 private ____deprecated____0; // Amount of time that rewards are distributed over. uint256 public rewardDuration; // This used to be unstake percent but has now been deprecated in favor of individual unstakes. // Paranoia results in this not being replaced but rather deprecated and new variables placed at the bottom. uint256 private ____deprecated____1; // Amount of wNXM (in token Wei) to reserve each period. // Overwrites reservePercent in update. uint256 public reserveAmount; // Withdrawals may be paused if a hack has recently happened. Timestamp of when the pause happened. uint256 public withdrawalsPaused; // Amount of time withdrawals may be paused after a hack. uint256 public pauseDuration; // Address that will receive administration funds from the contract. address public beneficiary; // Percent of funds to be distributed for administration of the contract. 10 == 1%; 1000 == 100%. uint256 public adminPercent; // Percent of staking rewards that referrers get. uint256 public referPercent; // Timestamp of when the last restake took place--7 days between each. uint256 public lastRestake; // The amount of the last reward. uint256 public lastReward; // Uniswap, Maker, Compound, Aave, Curve, Synthetix, Yearn, RenVM, Balancer, dForce. address[] public protocols; // Amount to unstake each time. uint256[] private amounts; // Protocols being actively used in staking or unstaking. address[] private activeProtocols; struct WithdrawalRequest { uint48 requestTime; uint104 nAmount; uint104 arAmount; } // Nxm tokens. IERC20 public wNxm; IERC20 public nxm; IERC20 public arNxm; // Nxm Master address. INxmMaster public nxmMaster; // Reward manager for referrers. IRewardManager public rewardManager; // Referral => referrer mapping (address => address) public referrers; event Deposit(address indexed user, uint256 nAmount, uint256 arAmount, uint256 timestamp); event WithdrawRequested(address indexed user, uint256 arAmount, uint256 nAmount, uint256 requestTime, uint256 withdrawTime); event Withdrawal(address indexed user, uint256 nAmount, uint256 arAmount, uint256 timestamp); event Restake(uint256 withdrawn, uint256 unstaked, uint256 staked, uint256 totalAum, uint256 timestamp); event NxmReward(uint256 reward, uint256 timestamp, uint256 totalAum); // Avoid composability issues for liquidation. modifier notContract { require(msg.sender == tx.origin, "Sender must be an EOA."); _; } // Functions as re-entrancy protection and more. // Mapping down below with other update variables. modifier oncePerTx { require(block.timestamp > lastCall[tx.origin], "May only call this contract once per transaction."); lastCall[tx.origin] = block.timestamp; _; } /** * @param _wNxm Address of the wNxm contract. * @param _arNxm Address of the arNxm contract. * @param _nxmMaster Address of Nexus' master address (to fetch others). * @param _rewardManager Address of the ReferralRewards smart contract. **/ function initialize( address _wNxm, address _arNxm, address _nxm, address _nxmMaster, address _rewardManager ) public { require(address(arNxm) == address(0), "Contract has already been initialized."); Ownable.initializeOwnable(); wNxm = IERC20(_wNxm); nxm = IERC20(_nxm); arNxm = IERC20(_arNxm); nxmMaster = INxmMaster(_nxmMaster); rewardManager = IRewardManager(_rewardManager); // unstakePercent = 100; adminPercent = 0; referPercent = 25; reserveAmount = 30 ether; pauseDuration = 10 days; beneficiary = msg.sender; // restakePeriod = 3 days; rewardDuration = 9 days; // Approve to wrap and send funds to reward manager. arNxm.approve( _rewardManager, uint256(-1) ); } /** * @dev Deposit wNxm or NXM to get arNxm in return. * @param _nAmount The amount of NXM to stake. * @param _referrer The address that referred this user. * @param _isNxm True if the token is NXM, false if the token is wNXM. **/ function deposit(uint256 _nAmount, address _referrer, bool _isNxm) external oncePerTx { if ( referrers[msg.sender] == address(0) ) { referrers[msg.sender] = _referrer != address(0) ? _referrer : beneficiary; address refToSet = _referrer != address(0) ? _referrer : beneficiary; referrers[msg.sender] = refToSet; // A wallet with a previous arNXM balance would be able to subtract referral weight that it never added. uint256 prevBal = arNxm.balanceOf(msg.sender); if (prevBal > 0) rewardManager.stake(refToSet, msg.sender, prevBal); } // This amount must be determined before arNxm mint. uint256 arAmount = arNxmValue(_nAmount); if (_isNxm) { nxm.safeTransferFrom(msg.sender, address(this), _nAmount); } else { wNxm.safeTransferFrom(msg.sender, address(this), _nAmount); _unwrapWnxm(_nAmount); } // Mint also increases sender's referral balance through alertTransfer. arNxm.mint(msg.sender, arAmount); emit Deposit(msg.sender, _nAmount, arAmount, block.timestamp); } /** * @dev Withdraw an amount of wNxm or NXM by burning arNxm. * @param _arAmount The amount of arNxm to burn for the wNxm withdraw. * @param _payFee Flag to pay fee to withdraw without delay. **/ function withdraw(uint256 _arAmount, bool _payFee) external oncePerTx { require(block.timestamp.sub(withdrawalsPaused) > pauseDuration, "Withdrawals are temporarily paused."); // This amount must be determined before arNxm burn. uint256 nAmount = nxmValue(_arAmount); require(totalPending.add(nAmount) <= nxm.balanceOf(address(this)), "Not enough NXM available for witthdrawal."); if (_payFee) { uint256 fee = nAmount.mul(withdrawFee).div(1000); uint256 disbursement = nAmount.sub(fee); // Burn also decreases sender's referral balance through alertTransfer. arNxm.burn(msg.sender, _arAmount); _wrapNxm(disbursement); wNxm.safeTransfer(msg.sender, disbursement); emit Withdrawal(msg.sender, nAmount, _arAmount, block.timestamp); } else { totalPending = totalPending.add(nAmount); arNxm.safeTransferFrom(msg.sender, address(this), _arAmount); WithdrawalRequest memory prevWithdrawal = withdrawals[msg.sender]; withdrawals[msg.sender] = WithdrawalRequest( uint48(block.timestamp), prevWithdrawal.nAmount + uint104(nAmount), prevWithdrawal.arAmount + uint104(_arAmount) ); emit WithdrawRequested(msg.sender, _arAmount, nAmount, block.timestamp, block.timestamp.add(withdrawDelay)); } } /** * @dev Withdraw from request **/ function withdrawFinalize() external oncePerTx { WithdrawalRequest memory withdrawal = withdrawals[msg.sender]; uint256 nAmount = uint256(withdrawal.nAmount); uint256 arAmount = uint256(withdrawal.arAmount); uint256 requestTime = uint256(withdrawal.requestTime); require(block.timestamp.sub(withdrawalsPaused) > pauseDuration, "Withdrawals are temporarily paused."); require(requestTime.add(withdrawDelay) <= block.timestamp, "Not ready to withdraw"); require(nAmount > 0, "No pending amount to withdraw"); // Burn also decreases sender's referral balance through alertTransfer. arNxm.burn(address(this), arAmount); _wrapNxm(nAmount); wNxm.safeTransfer(msg.sender, nAmount); delete withdrawals[msg.sender]; totalPending = totalPending.sub(nAmount); emit Withdrawal(msg.sender, nAmount, arAmount, block.timestamp); } /** * @dev Split off from restake() function to enable reward fetching at any time. **/ function getRewardNxm() external notContract { uint256 prevAum = aum(); uint256 rewards = _getRewardsNxm(); if (rewards > 0) { lastRewardTimestamp = block.timestamp; emit NxmReward(rewards, block.timestamp, prevAum); } else if(lastRewardTimestamp == 0) { lastRewardTimestamp = block.timestamp; } } /** * @dev claim rewards from shield mining * @param _shieldMining shield mining contract address * @param _protocols Protocol funding the rewards. * @param _sponsors sponsor address who funded the shield mining * @param _tokens token address that sponsor is distributing **/ function getShieldMiningRewards(address _shieldMining, address[] calldata _protocols, address[] calldata _sponsors, address[] calldata _tokens) external notContract { IShieldMining(_shieldMining).claimRewards(_protocols, _sponsors, _tokens); } /** * @dev Find the arNxm value of a certain amount of wNxm. * @param _nAmount The amount of NXM to check arNxm value of. * @return arAmount The amount of arNxm the input amount of wNxm is worth. **/ function arNxmValue(uint256 _nAmount) public view returns (uint256 arAmount) { // Get reward allowed to be distributed. uint256 reward = _currentReward(); // aum() holds full reward so we sub lastReward (which needs to be distributed over time) // and add reward that has been distributed uint256 totalN = aum().add(reward).sub(lastReward); uint256 totalAr = arNxm.totalSupply(); // Find exchange amount of one token, then find exchange amount for full value. if (totalN == 0) { arAmount = _nAmount; } else { uint256 oneAmount = ( totalAr.mul(1e18) ).div(totalN); arAmount = _nAmount.mul(oneAmount).div(1e18); } } /** * @dev Find the wNxm value of a certain amount of arNxm. * @param _arAmount The amount of arNxm to check wNxm value of. * @return nAmount The amount of wNxm the input amount of arNxm is worth. **/ function nxmValue(uint256 _arAmount) public view returns (uint256 nAmount) { // Get reward allowed to be distributed. uint256 reward = _currentReward(); // aum() holds full reward so we sub lastReward (which needs to be distributed over time) // and add reward that has been distributed uint256 totalN = aum().add(reward).sub(lastReward); uint256 totalAr = arNxm.totalSupply(); // Find exchange amount of one token, then find exchange amount for full value. uint256 oneAmount = ( totalN.mul(1e18) ).div(totalAr); nAmount = _arAmount.mul(oneAmount).div(1e18); } /** * @dev Used to determine total Assets Under Management. * @return aumTotal Full amount of assets under management (wNXM balance + stake deposit). **/ function aum() public view returns (uint256 aumTotal) { IPooledStaking pool = IPooledStaking( _getPool() ); uint256 balance = nxm.balanceOf( address(this) ); uint256 stakeDeposit = pool.stakerDeposit( address(this) ); aumTotal = balance.add(stakeDeposit); } /** * @dev Used to determine staked nxm amount in pooled staking contract. * @return staked Staked nxm amount. **/ function stakedNxm() public view returns (uint256 staked) { IPooledStaking pool = IPooledStaking( _getPool() ); staked = pool.stakerDeposit( address(this) ); } /** * @dev Used to determine distributed reward amount * @return reward distributed reward amount **/ function currentReward() external view returns (uint256 reward) { reward = _currentReward(); } /** * @dev Anyone may call this function to pause withdrawals for a certain amount of time. * We check Nexus contracts for a recent accepted claim, then can pause to avoid further withdrawals. * @param _claimId The ID of the cover that has been accepted for a confirmed hack. **/ function pauseWithdrawals(uint256 _claimId) external { IClaimsData claimsData = IClaimsData( _getClaimsData() ); (/*coverId*/, uint256 status) = claimsData.getClaimStatusNumber(_claimId); uint256 dateUpdate = claimsData.getClaimDateUpd(_claimId); // Status must be 14 and date update must be within the past 7 days. if (status == 14 && block.timestamp.sub(dateUpdate) <= 7 days) { withdrawalsPaused = block.timestamp; } } /** * @dev When arNXM tokens are transferred, the referrer stakes must be adjusted on RewardManager. * This is taken care of by a "_beforeTokenTransfer" function on the arNXM ERC20. * @param _from The user that tokens are being transferred from. * @param _to The user that tokens are being transferred to. * @param _amount The amount of tokens that are being transferred. **/ function alertTransfer(address _from, address _to, uint256 _amount) external { require(msg.sender == address(arNxm), "Sender must be the token contract."); // address(0) means the contract or EOA has not interacted directly with arNXM Vault. if ( referrers[_from] != address(0) ) rewardManager.withdraw(referrers[_from], _from, _amount); if ( referrers[_to] != address(0) ) rewardManager.stake(referrers[_to], _to, _amount); } /** * @dev Withdraw any available rewards from Nexus. * @return finalReward The amount of rewards to be given to users (full reward - admin reward - referral reward). **/ function _getRewardsNxm() internal returns (uint256 finalReward) { IPooledStaking pool = IPooledStaking( _getPool() ); // Find current reward, find user reward (transfers reward to admin within this). uint256 fullReward = pool.stakerReward( address(this) ); finalReward = _feeRewardsNxm(fullReward); pool.withdrawReward( address(this) ); lastReward = finalReward; } /** * @dev Find and distribute administrator rewards. * @param reward Full reward given from this week. * @return userReward Reward amount given to users (full reward - admin reward). **/ function _feeRewardsNxm(uint256 reward) internal returns (uint256 userReward) { // Find both rewards before minting any. uint256 adminReward = arNxmValue( reward.mul(adminPercent).div(DENOMINATOR) ); uint256 referReward = arNxmValue( reward.mul(referPercent).div(DENOMINATOR) ); // Mint to beneficary then this address (to then transfer to rewardManager). if (adminReward > 0) { arNxm.mint(beneficiary, adminReward); } if (referReward > 0) { arNxm.mint(address(this), referReward); rewardManager.notifyRewardAmount(referReward); } userReward = reward.sub(adminReward).sub(referReward); } /** * @dev Used to withdraw nxm from staking pool **/ function withdrawNxm() external onlyOwner { _withdrawNxm(); } /** * @dev Used to unwrap wnxm tokens to nxm **/ function unwrapWnxm() external { uint256 balance = wNxm.balanceOf(address(this)); _unwrapWnxm(balance); } /** * @dev Used to stake nxm tokens to stake pool. it is determined manually **/ function stakeNxm(address[] calldata _protocols, uint256[] calldata _stakeAmounts) external onlyOwner{ _stakeNxm(_protocols, _stakeAmounts); } /** * @dev Used to unstake nxm tokens from stake pool. it is determined manually **/ function unstakeNxm(uint256 _lastId, address[] calldata _protocols, uint256[] calldata _unstakeAmounts) external onlyOwner{ _unstakeNxm(_lastId, _protocols, _unstakeAmounts); } /** * @dev Withdraw any Nxm we can from the staking pool. * @return amount The amount of funds that are being withdrawn. **/ function _withdrawNxm() internal returns (uint256 amount) { IPooledStaking pool = IPooledStaking( _getPool() ); amount = pool.stakerMaxWithdrawable( address(this) ); pool.withdraw(amount); } /** * @dev Stake any wNxm over the amount we need to keep in reserve (bufferPercent% more than withdrawals last week). * @param _protocols List of protocols to stake in (NOT list of all protocols). * @param _stakeAmounts List of amounts to stake in each relevant protocol--this is only ADDITIONAL stake rather than full stake. * @return toStake Amount of token that we will be staking. **/ function _stakeNxm(address[] memory _protocols, uint256[] memory _stakeAmounts) internal returns (uint256 toStake) { IPooledStaking pool = IPooledStaking( _getPool() ); uint256 balance = nxm.balanceOf( address(this) ); // If we do need to restake funds... // toStake == additional stake on top of old ones if (reserveAmount.add(totalPending) > balance) { toStake = 0; } else { toStake = balance.sub(reserveAmount.add(totalPending)); _approveNxm(_getTokenController(), toStake); } // get current data from pooled staking address[] memory currentProtocols = pool.stakerContractsArray(address(this)); // this will be used to calculate the remaining exposure for (uint256 i = 0; i < currentProtocols.length; i++) { amounts.push(pool.stakerContractStake(address(this), currentProtocols[i])); activeProtocols.push(currentProtocols[i]); } // push additional stake data for(uint256 i = 0; i < _protocols.length; i++) { address protocol = _protocols[i]; uint256 curIndex = _addressArrayFind(currentProtocols, protocol); if(curIndex == type(uint256).max) { activeProtocols.push(protocol); amounts.push(_stakeAmounts[i]); } else { amounts[curIndex] += _stakeAmounts[i]; } } // now calculate the new staking protocols pool.depositAndStake(toStake, activeProtocols, amounts); delete activeProtocols; delete amounts; } /** * @dev Unstake an amount from each protocol on Nxm (takes 30 days to unstake). * @param _lastId The ID of the last unstake request on Nexus Mutual (needed for unstaking). **/ function _unstakeNxm(uint256 _lastId, address[] memory _protocols, uint256[] memory _amounts) internal { IPooledStaking pool = IPooledStaking( _getPool() ); pool.requestUnstake(_protocols, _amounts, _lastId); } /** * @dev Returns the amount we can unstake (if we can't unstake the full amount desired). * @param _protocol The address of the protocol we're checking. * @param _unstakeAmount Amount we want to unstake. * @return The amount of funds that can be unstaked from this protocol if not the full amount desired. **/ function _protocolUnstakeable(address _protocol, uint256 _unstakeAmount) internal view returns (uint256) { IPooledStaking pool = IPooledStaking( _getPool() ); uint256 stake = pool.stakerContractStake(address(this), _protocol); uint256 requested = pool.stakerContractPendingUnstakeTotal(address(this), _protocol); // Scenario in which all staked has already been requested to be unstaked. if (requested >= stake) { return 0; } uint256 available = stake - requested; return _unstakeAmount <= available ? _unstakeAmount : available; } /** * @dev Calculate what the current reward is. We stream this to arNxm value to avoid dumps. * @return reward Amount of reward currently calculated into arNxm value. **/ function _currentReward() internal view returns (uint256 reward) { uint256 duration = rewardDuration; uint256 timeElapsed = block.timestamp.sub(lastRewardTimestamp); if(timeElapsed == 0){ return 0; } // Full reward is added to the balance if it's been more than the disbursement duration. if (timeElapsed >= duration) { reward = lastReward; // Otherwise, disburse amounts linearly over duration. } else { // 1e18 just for a buffer. uint256 portion = ( duration.mul(1e18) ).div(timeElapsed); reward = ( lastReward.mul(1e18) ).div(portion); } } /** * @dev Wrap Nxm tokens to be able to be withdrawn as wNxm. **/ function _wrapNxm(uint256 _amount) internal { _approveNxm(address(wNxm), _amount); IWNXM(address(wNxm)).wrap(_amount); } /** * @dev Unwrap wNxm tokens to be able to be used within the Nexus Mutual system. * @param _amount Amount of wNxm tokens to be unwrapped. **/ function _unwrapWnxm(uint256 _amount) internal { IWNXM(address(wNxm)).unwrap(_amount); } /** * @dev Approve wNxm contract to be able to transferFrom Nxm from this contract. **/ function _approveNxm(address _to, uint256 _amount) internal { nxm.approve( _to, _amount ); } /** * @dev Get current address of the Nexus staking pool. * @return pool Address of the Nexus staking pool contract. **/ function _getPool() internal view returns (address pool) { pool = nxmMaster.getLatestAddress("PS"); } /** * @dev Get the current NXM token controller (for NXM actions) from Nexus Mutual. * @return controller Address of the token controller. **/ function _getTokenController() internal view returns(address controller) { controller = nxmMaster.getLatestAddress("TC"); } /** * @dev Get current address of the Nexus Claims Data contract. * @return claimsData Address of the Nexus Claims Data contract. **/ function _getClaimsData() internal view returns (address claimsData) { claimsData = nxmMaster.getLatestAddress("CD"); } function _addressArrayFind(address[] memory arr, address elem) internal pure returns(uint256 index) { for(uint256 i = 0; i<arr.length; i++) { if(arr[i] == elem) { return i; } } return type(uint256).max; } /*---- Ownable functions ----*/ /** * @dev pull nxm from arNFT and wrap it to wnxm **/ function pullNXM(address _from, uint256 _amount, address _to) external onlyOwner { nxm.transferFrom(_from, address(this), _amount); _wrapNxm(_amount); wNxm.transfer(_to, _amount); } /** * @dev Buy NXM direct from Nexus Mutual. Used by ExchangeManager. * @param _minNxm Minimum amount of NXM tokens to receive in return for the Ether. **/ function buyNxmWithEther(uint256 _minNxm) external payable { require(msg.sender == 0x1337DEF157EfdeF167a81B3baB95385Ce5A14477, "Sender must be ExchangeManager."); INXMPool pool = INXMPool(nxmMaster.getLatestAddress("P1")); pool.buyNXM{value:address(this).balance}(_minNxm); } /** * @dev Vote on Nexus Mutual governance proposals using tokens. * @param _proposalId ID of the proposal to vote on. * @param _solutionChosen Side of the proposal we're voting for (0 for no, 1 for yes). **/ function submitVote(uint256 _proposalId, uint256 _solutionChosen) external onlyOwner { address gov = nxmMaster.getLatestAddress("GV"); IGovernance(gov).submitVote(_proposalId, _solutionChosen); } /** * @dev rescue tokens locked in contract * @param token address of token to withdraw */ function rescueToken(address token) external onlyOwner { require(token != address(nxm) && token != address(wNxm) && token != address(arNxm), "Cannot rescue NXM-based tokens"); uint256 balance = IERC20(token).balanceOf(address(this)); IERC20(token).safeTransfer(msg.sender, balance); } /*---- Admin functions ----*/ /** * @dev Owner may change how much of the AUM should be saved in reserve each period. * @param _reserveAmount The amount of wNXM (in token Wei) to reserve each period. **/ function changeReserveAmount(uint256 _reserveAmount) external onlyOwner { reserveAmount = _reserveAmount; } /** * @dev Owner may change the percent of insurance fees referrers receive. * @param _referPercent The percent of fees referrers receive. 50 == 5%. **/ function changeReferPercent(uint256 _referPercent) external onlyOwner { require(_referPercent <= 500, "Cannot give referrer more than 50% of rewards."); referPercent = _referPercent; } /** * @dev Owner may change the withdraw fee. * @param _withdrawFee The fee of withdraw. **/ function changeWithdrawFee(uint256 _withdrawFee) external onlyOwner { require(_withdrawFee <= DENOMINATOR, "Cannot take more than 100% of withdraw"); withdrawFee = _withdrawFee; } /** * @dev Owner may change the withdraw delay. * @param _withdrawDelay Withdraw delay. **/ function changeWithdrawDelay(uint256 _withdrawDelay) external onlyOwner { withdrawDelay = _withdrawDelay; } /** * @dev Change the percent of rewards that are given for administration of the contract. * @param _adminPercent The percent of rewards to be given for administration (10 == 1%, 1000 == 100%) **/ function changeAdminPercent(uint256 _adminPercent) external onlyOwner { require(_adminPercent <= 500, "Cannot give admin more than 50% of rewards."); adminPercent = _adminPercent; } /** * @dev Owner may change the amount of time it takes to distribute rewards from Nexus. * @param _rewardDuration The amount of time it takes to fully distribute rewards. **/ function changeRewardDuration(uint256 _rewardDuration) external onlyOwner { require(_rewardDuration <= 30 days, "Reward duration cannot be more than 30 days."); rewardDuration = _rewardDuration; } /** * @dev Owner may change the amount of time that withdrawals are paused after a hack is confirmed. * @param _pauseDuration The new amount of time that withdrawals will be paused. **/ function changePauseDuration(uint256 _pauseDuration) external onlyOwner { require(_pauseDuration <= 30 days, "Pause duration cannot be more than 30 days."); pauseDuration = _pauseDuration; } /** * @dev Change beneficiary of the administration funds. * @param _newBeneficiary Address of the new beneficiary to receive funds. **/ function changeBeneficiary(address _newBeneficiary) external onlyOwner { beneficiary = _newBeneficiary; } //// Update addition. Proxy paranoia brought it down here. //// uint256 public lastRewardTimestamp; //// Second update additions. //// // Protocol that the next restaking will begin on. uint256 private ____deprecated____2; // Checkpoint in case we want to cut off certain buckets (where we begin the rotations). // To bar protocols from being staked/unstaked, move them to before checkpointProtocol. uint256 private ____deprecated____3; // Number of protocols to stake each time. uint256 private ____deprecated____4; // Individual percent to unstake. uint256[] private ____deprecated____5; // Last time an EOA has called this contract. mapping (address => uint256) public lastCall; ///// Third update additions. ///// // Withdraw fee to withdraw immediately. uint256 public withdrawFee; // Delay to withdraw uint256 public withdrawDelay; // Total amount of withdrawals pending. uint256 public totalPending; mapping (address => WithdrawalRequest) public withdrawals; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"nAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"arAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalAum","type":"uint256"}],"name":"NxmReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"staked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalAum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Restake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"SecondOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"arAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"name":"WithdrawRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"nAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"arAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"adminPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"alertTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"arNxm","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nAmount","type":"uint256"}],"name":"arNxmValue","outputs":[{"internalType":"uint256","name":"arAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aum","outputs":[{"internalType":"uint256","name":"aumTotal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minNxm","type":"uint256"}],"name":"buyNxmWithEther","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_adminPercent","type":"uint256"}],"name":"changeAdminPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newBeneficiary","type":"address"}],"name":"changeBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pauseDuration","type":"uint256"}],"name":"changePauseDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_referPercent","type":"uint256"}],"name":"changeReferPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"changeReserveAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardDuration","type":"uint256"}],"name":"changeRewardDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawDelay","type":"uint256"}],"name":"changeWithdrawDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawFee","type":"uint256"}],"name":"changeWithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nAmount","type":"uint256"},{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"bool","name":"_isNxm","type":"bool"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardNxm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_shieldMining","type":"address"},{"internalType":"address[]","name":"_protocols","type":"address[]"},{"internalType":"address[]","name":"_sponsors","type":"address[]"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"getShieldMiningRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wNxm","type":"address"},{"internalType":"address","name":"_arNxm","type":"address"},{"internalType":"address","name":"_nxm","type":"address"},{"internalType":"address","name":"_nxmMaster","type":"address"},{"internalType":"address","name":"_rewardManager","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastCall","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRestake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nxm","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nxmMaster","outputs":[{"internalType":"contract INxmMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_arAmount","type":"uint256"}],"name":"nxmValue","outputs":[{"internalType":"uint256","name":"nAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimId","type":"uint256"}],"name":"pauseWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"protocols","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"pullNXM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"receiveOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"receiveSecondOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"referPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardManager","outputs":[{"internalType":"contract IRewardManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_protocols","type":"address[]"},{"internalType":"uint256[]","name":"_stakeAmounts","type":"uint256[]"}],"name":"stakeNxm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedNxm","outputs":[{"internalType":"uint256","name":"staked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"uint256","name":"_solutionChosen","type":"uint256"}],"name":"submitVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferSecondOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastId","type":"uint256"},{"internalType":"address[]","name":"_protocols","type":"address[]"},{"internalType":"uint256[]","name":"_unstakeAmounts","type":"uint256[]"}],"name":"unstakeNxm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unwrapWnxm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wNxm","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_arAmount","type":"uint256"},{"internalType":"bool","name":"_payFee","type":"bool"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFinalize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawNxm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawals","outputs":[{"internalType":"uint48","name":"requestTime","type":"uint48"},{"internalType":"uint104","name":"nAmount","type":"uint104"},{"internalType":"uint104","name":"arAmount","type":"uint104"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalsPaused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506145a5806100206000396000f3fe6080604052600436106103815760003560e01c8063857355c9116101d1578063c71859b811610102578063e941fa78116100a0578063f2fde38b1161006f578063f2fde38b14610d95578063f520e7e514610dc8578063f8077fae14610ddd578063fec5363414610df257610381565b8063e941fa7814610d2c578063e9f2838e14610d41578063f181c86714610d56578063f1e7250e14610d8057610381565b8063d7f469da116100dc578063d7f469da14610aee578063daf7b3b414610b03578063dc07065714610c2e578063e90d933114610c6157610381565b8063c71859b814610a9a578063c9b1714914610ac4578063d123738514610ad957610381565b806393a348a61161016f578063a893c9be11610149578063a893c9be14610a1c578063b8a758d614610a46578063c07e587a14610a5b578063c0dab51614610a8557610381565b806393a348a61461099e578063994818db146109c85780639d37b8db146109f257610381565b80638da5cb5b116101ab5780638da5cb5b146109085780638f1ea86a1461091d5780638f32d59b146109325780638fab0db31461095b57610381565b8063857355c91461089657806388d00d26146108ab5780638c396220146108de57610381565b80633f90916a116102b65780635da5bc5511610254578063750c281c11610223578063750c281c146107025780637a9262a21461071f5780637b86935e1461078357806383df67471461085557610381565b80635da5bc55146106935780635fc987c1146106a857806368a9f31c146106bd5780636f93bfb7146106d257610381565b806343a08b781161029057806343a08b78146105e55780634460d3cf146106185780634a3b68cc1461064b5780634b09b72a1461067e57610381565b80633f90916a146105915780633fe3376f146105a65780634100b5aa146105bb57610381565b80631c74a301116103235780632dbc3228116102fd5780632dbc3228146104f257806330e45f051461053557806338af3eed1461054a57806338d074361461055f57610381565b80631c74a30114610489578063202a36cd1461049e57806320eba239146104c857610381565b80630ab51bac1161035f5780630ab51bac146103d75780630f4ef8a6146103ec5780631459457a1461041d5780631c01e6fc1461047457610381565b80630288a39c146103865780630526679c146103ad57806307621eca146103c2575b600080fd5b34801561039257600080fd5b5061039b610e07565b60408051918252519081900360200190f35b3480156103b957600080fd5b5061039b610e0d565b3480156103ce57600080fd5b5061039b610e13565b3480156103e357600080fd5b5061039b610e22565b3480156103f857600080fd5b50610401610f36565b604080516001600160a01b039092168252519081900360200190f35b34801561042957600080fd5b50610472600480360360a081101561044057600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160809091013516610f45565b005b34801561048057600080fd5b5061039b61109a565b34801561049557600080fd5b506104726110a0565b3480156104aa57600080fd5b50610472600480360360208110156104c157600080fd5b5035611110565b3480156104d457600080fd5b50610472600480360360208110156104eb57600080fd5b5035611236565b3480156104fe57600080fd5b506104726004803603606081101561051557600080fd5b506001600160a01b03813581169160208101359160409091013516611282565b34801561054157600080fd5b506104016113e1565b34801561055657600080fd5b506104016113f0565b34801561056b57600080fd5b506104726004803603604081101561058257600080fd5b508035906020013515156113ff565b34801561059d57600080fd5b5061039b6118e9565b3480156105b257600080fd5b506104016118ef565b3480156105c757600080fd5b50610472600480360360208110156105de57600080fd5b50356118fe565b3480156105f157600080fd5b506104726004803603602081101561060857600080fd5b50356001600160a01b031661194a565b34801561062457600080fd5b506104726004803603602081101561063b57600080fd5b50356001600160a01b03166119b9565b34801561065757600080fd5b506104016004803603602081101561066e57600080fd5b50356001600160a01b0316611b2c565b34801561068a57600080fd5b5061039b611b47565b34801561069f57600080fd5b50610401611b4d565b3480156106b457600080fd5b50610401611b5c565b3480156106c957600080fd5b50610401611b6b565b3480156106de57600080fd5b50610472600480360360408110156106f557600080fd5b5080359060200135611b7b565b6104726004803603602081101561071857600080fd5b5035611ca4565b34801561072b57600080fd5b506107526004803603602081101561074257600080fd5b50356001600160a01b0316611dd4565b6040805165ffffffffffff90941684526001600160681b039283166020850152911682820152519081900360600190f35b34801561078f57600080fd5b50610472600480360360608110156107a657600080fd5b81359190810190604081016020820135600160201b8111156107c757600080fd5b8201836020820111156107d957600080fd5b803590602001918460208302840111600160201b831117156107fa57600080fd5b919390929091602081019035600160201b81111561081757600080fd5b82018360208201111561082957600080fd5b803590602001918460208302840111600160201b8311171561084a57600080fd5b509092509050611e0d565b34801561086157600080fd5b506104726004803603606081101561087857600080fd5b508035906001600160a01b0360208201351690604001351515611ec2565b3480156108a257600080fd5b506104726121d6565b3480156108b757600080fd5b5061039b600480360360208110156108ce57600080fd5b50356001600160a01b0316612246565b3480156108ea57600080fd5b506104016004803603602081101561090157600080fd5b5035612258565b34801561091457600080fd5b5061040161227f565b34801561092957600080fd5b5061047261228e565b34801561093e57600080fd5b50610947612353565b604080519115158252519081900360200190f35b34801561096757600080fd5b506104726004803603606081101561097e57600080fd5b506001600160a01b0381358116916020810135909116906040013561237a565b3480156109aa57600080fd5b50610472600480360360208110156109c157600080fd5b50356124ec565b3480156109d457600080fd5b50610472600480360360208110156109eb57600080fd5b503561257a565b3480156109fe57600080fd5b5061047260048036036020811015610a1557600080fd5b5035612607565b348015610a2857600080fd5b5061047260048036036020811015610a3f57600080fd5b5035612695565b348015610a5257600080fd5b50610472612722565b348015610a6757600080fd5b5061039b60048036036020811015610a7e57600080fd5b50356127a7565b348015610a9157600080fd5b5061039b61289d565b348015610aa657600080fd5b5061047260048036036020811015610abd57600080fd5b50356128a3565b348015610ad057600080fd5b5061039b612930565b348015610ae557600080fd5b5061039b612936565b348015610afa57600080fd5b506104726129c2565b348015610b0f57600080fd5b5061047260048036036080811015610b2657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610b5057600080fd5b820183602082011115610b6257600080fd5b803590602001918460208302840111600160201b83111715610b8357600080fd5b919390929091602081019035600160201b811115610ba057600080fd5b820183602082011115610bb257600080fd5b803590602001918460208302840111600160201b83111715610bd357600080fd5b919390929091602081019035600160201b811115610bf057600080fd5b820183602082011115610c0257600080fd5b803590602001918460208302840111600160201b83111715610c2357600080fd5b509092509050612c8d565b348015610c3a57600080fd5b5061047260048036036020811015610c5157600080fd5b50356001600160a01b0316612e80565b348015610c6d57600080fd5b5061047260048036036040811015610c8457600080fd5b810190602081018135600160201b811115610c9e57600080fd5b820183602082011115610cb057600080fd5b803590602001918460208302840111600160201b83111715610cd157600080fd5b919390929091602081019035600160201b811115610cee57600080fd5b820183602082011115610d0057600080fd5b803590602001918460208302840111600160201b83111715610d2157600080fd5b509092509050612ee9565b348015610d3857600080fd5b5061039b612f9d565b348015610d4d57600080fd5b5061039b612fa3565b348015610d6257600080fd5b5061039b60048036036020811015610d7957600080fd5b5035612fa9565b348015610d8c57600080fd5b5061039b613062565b348015610da157600080fd5b5061047260048036036020811015610db857600080fd5b50356001600160a01b0316613068565b348015610dd457600080fd5b5061039b6130d7565b348015610de957600080fd5b5061039b6130dd565b348015610dfe57600080fd5b506104726130e3565b60515481565b603b5481565b6000610e1d613132565b905090565b600080610e2d6131ac565b604554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610e7e57600080fd5b505afa158015610e92573d6000803e3d6000fd5b505050506040513d6020811015610ea857600080fd5b5051604080516339ac5eb960e01b815230600482015290519192506000916001600160a01b038516916339ac5eb9916024808301926020929190829003018186803b158015610ef657600080fd5b505afa158015610f0a573d6000803e3d6000fd5b505050506040513d6020811015610f2057600080fd5b50519050610f2e828261322c565b935050505090565b6048546001600160a01b031681565b6046546001600160a01b031615610f8d5760405162461bcd60e51b81526004018080602001828103825260268152602001806144326026913960400191505060405180910390fd5b610f95613247565b604480546001600160a01b038088166001600160a01b031992831617835560458054878316908416179055604680548883169084161790819055604780548784169085161790556048805486841690851681179091556000603d8190556019603e556801a055690d9db80000603955620d2f00603b55603c80549095163317909455620bdd806037556040805163095ea7b360e01b81526004810192909252600019602483015251919092169363095ea7b3938382019360209392908390030190829087803b15801561106757600080fd5b505af115801561107b573d6000803e3d6000fd5b505050506040513d602081101561109157600080fd5b50505050505050565b603f5481565b6001546001600160a01b031633146110e95760405162461bcd60e51b81526004018080602001828103825260298152602001806143626029913960400191505060405180910390fd5b6001546110fe906001600160a01b0316613316565b600180546001600160a01b0319169055565b600061111a613384565b90506000816001600160a01b0316630325ea37846040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801561116157600080fd5b505afa158015611175573d6000803e3d6000fd5b505050506040513d604081101561118b57600080fd5b5060209081015160408051630a9a1f1b60e31b81526004810187905290519193506000926001600160a01b038616926354d0f8d8926024808201939291829003018186803b1580156111dc57600080fd5b505afa1580156111f0573d6000803e3d6000fd5b505050506040513d602081101561120657600080fd5b50519050600e82148015611226575062093a8061122342836133d3565b11155b156112305742603a555b50505050565b61123e612353565b61127d576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b605155565b61128a612353565b6112c9576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b604554604080516323b872dd60e01b81526001600160a01b03868116600483015230602483015260448201869052915191909216916323b872dd9160648083019260209291908290030181600087803b15801561132557600080fd5b505af1158015611339573d6000803e3d6000fd5b505050506040513d602081101561134f57600080fd5b5061135b9050826133e8565b604480546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018790529151919092169263a9059cbb928082019260209290918290030181600087803b1580156113b057600080fd5b505af11580156113c4573d6000803e3d6000fd5b505050506040513d60208110156113da57600080fd5b5050505050565b6045546001600160a01b031681565b603c546001600160a01b031681565b326000908152604f6020526040902054421161144c5760405162461bcd60e51b81526004018080602001828103825260318152602001806143b16031913960400191505060405180910390fd5b326000908152604f602052604090204290819055603b54603a549091611471916133d3565b116114ad5760405162461bcd60e51b81526004018080602001828103825260238152602001806144d96023913960400191505060405180910390fd5b60006114b883612fa9565b604554604080516370a0823160e01b815230600482015290519293506001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561150657600080fd5b505afa15801561151a573d6000803e3d6000fd5b505050506040513d602081101561153057600080fd5b505160525461153f908361322c565b111561157c5760405162461bcd60e51b81526004018080602001828103825260298152602001806144fc6029913960400191505060405180910390fd5b81156116a05760006115a56103e861159f6050548561345f90919063ffffffff16565b90613486565b905060006115b383836133d3565b60465460408051632770a7eb60e21b81523360048201526024810189905290519293506001600160a01b0390911691639dc29fac916044808201926020929091908290030181600087803b15801561160a57600080fd5b505af115801561161e573d6000803e3d6000fd5b505050506040513d602081101561163457600080fd5b506116409050816133e8565b604454611657906001600160a01b031633836134a8565b60408051848152602081018790524281830152905133917f650fdf669e93aa6c8ff3defe2da9c12b64f1548e5e1e54e803f4c1beb6466c8e919081900360600190a250506118e4565b6052546116ad908261322c565b6052556046546116c8906001600160a01b03163330866134fa565b6116d061430f565b60536000336001600160a01b03166001600160a01b031681526020019081526020016000206040518060600160405290816000820160009054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160069054906101000a90046001600160681b03166001600160681b03166001600160681b031681526020016000820160139054906101000a90046001600160681b03166001600160681b03166001600160681b031681525050905060405180606001604052804265ffffffffffff168152602001838360200151016001600160681b03168152602001858360400151016001600160681b031681525060536000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a8154816001600160681b0302191690836001600160681b0316021790555060408201518160000160136101000a8154816001600160681b0302191690836001600160681b03160217905550905050336001600160a01b03167f1f0d204a59639d21245dbaa239dfc9a6227aa86cb614bdda19843c52d155fcfa8584426118bd6051544261322c90919063ffffffff16565b604080519485526020850193909352838301919091526060830152519081900360800190a2505b505050565b60525481565b6046546001600160a01b031681565b611906612353565b611945576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b603955565b6002546001600160a01b03163314611997576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6119c1612353565b611a00576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6045546001600160a01b03828116911614801590611a2c57506044546001600160a01b03828116911614155b8015611a4657506046546001600160a01b03828116911614155b611a97576040805162461bcd60e51b815260206004820152601e60248201527f43616e6e6f7420726573637565204e584d2d626173656420746f6b656e730000604482015290519081900360640190fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ae657600080fd5b505afa158015611afa573d6000803e3d6000fd5b505050506040513d6020811015611b1057600080fd5b50519050611b286001600160a01b03831633836134a8565b5050565b6049602052600090815260409020546001600160a01b031681565b60395481565b6044546001600160a01b031681565b6047546001600160a01b031681565b6002546001600160a01b03165b90565b611b83612353565b611bc2576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b604754604080516227050b60e31b81526123ab60f11b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b158015611c1157600080fd5b505afa158015611c25573d6000803e3d6000fd5b505050506040513d6020811015611c3b57600080fd5b505160408051636f93bfb760e01b8152600481018690526024810185905290519192506001600160a01b03831691636f93bfb79160448082019260009290919082900301818387803b158015611c9057600080fd5b505af1158015611091573d6000803e3d6000fd5b731337def157efdef167a81b3bab95385ce5a144773314611d0c576040805162461bcd60e51b815260206004820152601f60248201527f53656e646572206d7573742062652045786368616e67654d616e616765722e00604482015290519081900360640190fd5b604754604080516227050b60e31b815261503160f01b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b158015611d5b57600080fd5b505afa158015611d6f573d6000803e3d6000fd5b505050506040513d6020811015611d8557600080fd5b5051604080516304b1dde360e51b81526004810185905290519192506001600160a01b0383169163963bbc60914791602480830192600092919082900301818588803b158015611c9057600080fd5b60536020526000908152604090205465ffffffffffff8116906001600160681b0366010000000000008204811691600160981b90041683565b611e15612353565b611e54576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6113da858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525061355492505050565b326000908152604f60205260409020544211611f0f5760405162461bcd60e51b81526004018080602001828103825260318152602001806143b16031913960400191505060405180910390fd5b326000908152604f6020908152604080832042905533835260499091529020546001600160a01b03166120bd576001600160a01b038216611f5b57603c546001600160a01b0316611f5d565b815b33600090815260496020526040812080546001600160a01b0319166001600160a01b03938416179055908316611f9e57603c546001600160a01b0316611fa0565b825b33600081815260496020908152604080832080546001600160a01b0319166001600160a01b038781169190911790915560465482516370a0823160e01b81526004810196909652915195965092949216926370a082319260248083019392829003018186803b15801561201257600080fd5b505afa158015612026573d6000803e3d6000fd5b505050506040513d602081101561203c57600080fd5b5051905080156120ba576048546040805163bf6eac2f60e01b81526001600160a01b038581166004830152336024830152604482018590529151919092169163bf6eac2f91606480830192600092919082900301818387803b1580156120a157600080fd5b505af11580156120b5573d6000803e3d6000fd5b505050505b50505b60006120c8846127a7565b905081156120ed576045546120e8906001600160a01b03163330876134fa565b61210e565b604454612105906001600160a01b03163330876134fa565b61210e84613650565b604654604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b15801561216257600080fd5b505af1158015612176573d6000803e3d6000fd5b505050506040513d602081101561218c57600080fd5b505060408051858152602081018390524281830152905133917f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e919081900360600190a250505050565b6003546001600160a01b0316331461221f5760405162461bcd60e51b81526004018080602001828103825260298152602001806143626029913960400191505060405180910390fd5b600354612234906001600160a01b031661369d565b600380546001600160a01b0319169055565b604f6020526000908152604090205481565b6041818154811061226557fe5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031690565b3332146122db576040805162461bcd60e51b815260206004820152601660248201527529b2b73232b91036bab9ba1031329030b71022a7a09760511b604482015290519081900360640190fd5b60006122e5610e22565b905060006122f161370c565b905080156123445742604a819055604080518381526020810192909252818101849052517f1574d0bf0b356a89be9bcfedeed722e6c9b5ba2f0d3aa4be6ef11888b1d1f7f79181900360600190a1611b28565b604a54611b285742604a555050565b600080546001600160a01b0316331480610e1d5750506002546001600160a01b0316331490565b6046546001600160a01b031633146123c35760405162461bcd60e51b81526004018080602001828103825260228152602001806143e26022913960400191505060405180910390fd5b6001600160a01b038381166000908152604960205260409020541615612464576048546001600160a01b03848116600081815260496020526040808220548151636ce5768960e11b8152908516600482015260248101939093526044830186905251929093169263d9caed129260648084019382900301818387803b15801561244b57600080fd5b505af115801561245f573d6000803e3d6000fd5b505050505b6001600160a01b0382811660009081526049602052604090205416156118e4576048546001600160a01b0383811660008181526049602052604080822054815163bf6eac2f60e01b8152908516600482015260248101939093526044830186905251929093169263bf6eac2f9260648084019382900301818387803b158015611c9057600080fd5b6124f4612353565b612533576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b62278d008111156125755760405162461bcd60e51b815260040180806020018281038252602c815260200180614483602c913960400191505060405180910390fd5b603755565b612582612353565b6125c1576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6101f48111156126025760405162461bcd60e51b815260040180806020018281038252602e815260200180614404602e913960400191505060405180910390fd5b603e55565b61260f612353565b61264e576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b62278d008111156126905760405162461bcd60e51b815260040180806020018281038252602b815260200180614458602b913960400191505060405180910390fd5b603b55565b61269d612353565b6126dc576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6103e881111561271d5760405162461bcd60e51b815260040180806020018281038252602681526020018061438b6026913960400191505060405180910390fd5b605055565b604454604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561276d57600080fd5b505afa158015612781573d6000803e3d6000fd5b505050506040513d602081101561279757600080fd5b505190506127a481613650565b50565b6000806127b2613132565b905060006127d46040546127ce846127c8610e22565b9061322c565b906133d3565b90506000604660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561282657600080fd5b505afa15801561283a573d6000803e3d6000fd5b505050506040513d602081101561285057600080fd5b505190508161286157849350612895565b60006128798361159f84670de0b6b3a764000061345f565b9050612891670de0b6b3a764000061159f888461345f565b9450505b505050919050565b603d5481565b6128ab612353565b6128ea576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6101f481111561292b5760405162461bcd60e51b815260040180806020018281038252602b815260200180614545602b913960400191505060405180910390fd5b603d55565b60405481565b6000806129416131ac565b9050806001600160a01b03166339ac5eb9306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561299057600080fd5b505afa1580156129a4573d6000803e3d6000fd5b505050506040513d60208110156129ba57600080fd5b505192915050565b326000908152604f60205260409020544211612a0f5760405162461bcd60e51b81526004018080602001828103825260318152602001806143b16031913960400191505060405180910390fd5b326000908152604f60205260409020429055612a2961430f565b50336000908152605360209081526040918290208251606081018452905465ffffffffffff81168083526001600160681b03660100000000000083048116948401859052600160981b909204909116938201849052603b54603a54929492612a929042906133d3565b11612ace5760405162461bcd60e51b81526004018080602001828103825260238152602001806144d96023913960400191505060405180910390fd5b42612ae46051548361322c90919063ffffffff16565b1115612b2f576040805162461bcd60e51b81526020600482015260156024820152744e6f7420726561647920746f20776974686472617760581b604482015290519081900360640190fd5b60008311612b84576040805162461bcd60e51b815260206004820152601d60248201527f4e6f2070656e64696e6720616d6f756e7420746f207769746864726177000000604482015290519081900360640190fd5b60465460408051632770a7eb60e21b81523060048201526024810185905290516001600160a01b0390921691639dc29fac916044808201926020929091908290030181600087803b158015612bd857600080fd5b505af1158015612bec573d6000803e3d6000fd5b505050506040513d6020811015612c0257600080fd5b50612c0e9050836133e8565b604454612c25906001600160a01b031633856134a8565b33600090815260536020526040812055605254612c4290846133d3565b60525560408051848152602081018490524281830152905133917f650fdf669e93aa6c8ff3defe2da9c12b64f1548e5e1e54e803f4c1beb6466c8e919081900360600190a250505050565b333214612cda576040805162461bcd60e51b815260206004820152601660248201527529b2b73232b91036bab9ba1031329030b71022a7a09760511b604482015290519081900360640190fd5b866001600160a01b031663a82e84e98787878787876040518763ffffffff1660e01b81526004018080602001806020018060200184810384528a8a82818152602001925060200280828437600083820152601f01601f19169091018581038452888152602090810191508990890280828437600083820152601f01601f19169091018581038352868152602090810191508790870280828437600081840152601f19601f8201169050808301925050509950505050505050505050600060405180830381600087803b158015612daf57600080fd5b505af1158015612dc3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612dec57600080fd5b8101908080516040519392919084600160201b821115612e0b57600080fd5b908301906020820185811115612e2057600080fd5b82518660208202830111600160201b82111715612e3c57600080fd5b82525081516020918201928201910280838360005b83811015612e69578181015183820152602001612e51565b505050509050016040525050505050505050505050565b612e88612353565b612ec7576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b603c80546001600160a01b0319166001600160a01b0392909216919091179055565b612ef1612353565b612f30576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6113da8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061381492505050565b60505481565b603a5481565b600080612fb4613132565b90506000612fca6040546127ce846127c8610e22565b90506000604660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561301c57600080fd5b505afa158015613030573d6000803e3d6000fd5b505050506040513d602081101561304657600080fd5b5051905060006128798261159f85670de0b6b3a764000061345f565b603e5481565b6000546001600160a01b031633146130b5576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60375481565b604a5481565b6130eb612353565b61312a576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6127a4613d37565b603754604a546000919082906131499042906133d3565b90508061315b57600092505050611b78565b81811061316c5760405492506131a7565b60006131848261159f85670de0b6b3a764000061345f565b9050610f2e8161159f670de0b6b3a764000060405461345f90919063ffffffff16565b505090565b604754604080516227050b60e31b815261505360f01b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b1580156131fb57600080fd5b505afa15801561320f573d6000803e3d6000fd5b505050506040513d602081101561322557600080fd5b5051919050565b60008282018381101561323e57600080fd5b90505b92915050565b6000546001600160a01b03161561329b576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60008054336001600160a01b0319918216811783556002805490921681179091556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360405133906000907f056a46fd3a2b20fb8bde8639e8a4b1bd407af5f7c1169369575e29e97d41a6ca908290a3565b6001600160a01b03811661332957600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b604754604080516227050b60e31b81526110d160f21b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b1580156131fb57600080fd5b6000828211156133e257600080fd5b50900390565b6044546133fe906001600160a01b031682613e25565b60445460408051630ea598cb60e41b81526004810184905290516001600160a01b039092169163ea598cb09160248082019260009290919082900301818387803b15801561344b57600080fd5b505af11580156113da573d6000803e3d6000fd5b60008261346e57506000613241565b8282028284828161347b57fe5b041461323e57600080fd5b600080821161349457600080fd5b600082848161349f57fe5b04949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526118e4908490613ea5565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611230908590613ea5565b600061355e6131ac565b9050806001600160a01b0316638e91e6bd8484876040518463ffffffff1660e01b8152600401808060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b838110156135cb5781810151838201526020016135b3565b50505050905001838103825285818151815260200191508051906020019060200280838360005b8381101561360a5781810151838201526020016135f2565b5050505090500195505050505050600060405180830381600087803b15801561363257600080fd5b505af1158015613646573d6000803e3d6000fd5b5050505050505050565b60445460408051636f074d1f60e11b81526004810184905290516001600160a01b039092169163de0e9a3e9160248082019260009290919082900301818387803b15801561344b57600080fd5b6001600160a01b0381166136b057600080fd5b6002546040516001600160a01b038084169216907f056a46fd3a2b20fb8bde8639e8a4b1bd407af5f7c1169369575e29e97d41a6ca90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000806137176131ac565b90506000816001600160a01b0316630ea474c7306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561376857600080fd5b505afa15801561377c573d6000803e3d6000fd5b505050506040513d602081101561379257600080fd5b5051905061379f8161405d565b9250816001600160a01b031663b86e321c306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156137f057600080fd5b505af1158015613804573d6000803e3d6000fd5b5050505082604081905550505090565b60008061381f6131ac565b604554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561387057600080fd5b505afa158015613884573d6000803e3d6000fd5b505050506040513d602081101561389a57600080fd5b505160525460395491925082916138b09161322c565b11156138bf57600092506138f3565b6138e06138d960525460395461322c90919063ffffffff16565b82906133d3565b92506138f36138ed614235565b84613e25565b6060826001600160a01b0316635840ee44306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060006040518083038186803b15801561394257600080fd5b505afa158015613956573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561397f57600080fd5b8101908080516040519392919084600160201b82111561399e57600080fd5b9083019060208201858111156139b357600080fd5b82518660208202830111600160201b821117156139cf57600080fd5b82525081516020918201928201910280838360005b838110156139fc5781810151838201526020016139e4565b50505050905001604052505050905060005b8151811015613b22576042846001600160a01b031663eae0171830858581518110613a3557fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613a8a57600080fd5b505afa158015613a9e573d6000803e3d6000fd5b505050506040513d6020811015613ab457600080fd5b5051815460018101835560009283526020909220909101558151604390839083908110613add57fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b039093169290921790915501613a0e565b5060005b8651811015613c1d576000878281518110613b3d57fe5b602002602001015190506000613b538483614284565b9050600019811415613bdf57604380546001810182556000919091527f9690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c6951027930180546001600160a01b0319166001600160a01b0384161790558751604290899085908110613bbb57fe5b60209081029190910181015182546001810184556000938452919092200155613c13565b878381518110613beb57fe5b602002602001015160428281548110613c0057fe5b6000918252602090912001805490910190555b5050600101613b26565b50826001600160a01b031663c001472e85604360426040518463ffffffff1660e01b81526004018084815260200180602001806020018381038352858181548152602001915080548015613c9a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613c7c575b50508381038252848181548152602001915080548015613cd957602002820191906000526020600020905b815481526020019060010190808311613cc5575b505095505050505050600060405180830381600087803b158015613cfc57600080fd5b505af1158015613d10573d6000803e3d6000fd5b5050505060436000613d22919061432f565b613d2e6042600061432f565b50505092915050565b600080613d426131ac565b9050806001600160a01b031663afd369fd306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613d9157600080fd5b505afa158015613da5573d6000803e3d6000fd5b505050506040513d6020811015613dbb57600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519193506001600160a01b03831691632e1a7d4d9160248082019260009290919082900301818387803b158015613e0957600080fd5b505af1158015613e1d573d6000803e3d6000fd5b505050505090565b6045546040805163095ea7b360e01b81526001600160a01b038581166004830152602482018590529151919092169163095ea7b39160448083019260209291908290030181600087803b158015613e7b57600080fd5b505af1158015613e8f573d6000803e3d6000fd5b505050506040513d602081101561123057600080fd5b613eb7826001600160a01b03166142d8565b613f08576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613f465780518252601f199092019160209182019101613f27565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613fa8576040519150601f19603f3d011682016040523d82523d6000602084013e613fad565b606091505b509150915081614004576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156112305780806020019051602081101561402057600080fd5b50516112305760405162461bcd60e51b815260040180806020018281038252602a8152602001806144af602a913960400191505060405180910390fd5b60008061408361407e6103e861159f603d548761345f90919063ffffffff16565b6127a7565b905060006140a561407e6103e861159f603e548861345f90919063ffffffff16565b9050811561413357604654603c54604080516340c10f1960e01b81526001600160a01b03928316600482015260248101869052905191909216916340c10f199160448083019260209291908290030181600087803b15801561410657600080fd5b505af115801561411a573d6000803e3d6000fd5b505050506040513d602081101561413057600080fd5b50505b801561421f57604654604080516340c10f1960e01b81523060048201526024810184905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b15801561418d57600080fd5b505af11580156141a1573d6000803e3d6000fd5b505050506040513d60208110156141b757600080fd5b505060485460408051633c6b16ab60e01b81526004810184905290516001600160a01b0390921691633c6b16ab9160248082019260009290919082900301818387803b15801561420657600080fd5b505af115801561421a573d6000803e3d6000fd5b505050505b61422d816127ce86856133d3565b949350505050565b604754604080516227050b60e31b815261544360f01b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b1580156131fb57600080fd5b6000805b83518110156142cd57826001600160a01b03168482815181106142a757fe5b60200260200101516001600160a01b031614156142c5579050613241565b600101614288565b506000199392505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159061422d5750141592915050565b604080516060810182526000808252602082018190529181019190915290565b50805460008255906000526020600020908101906127a491905b8082111561435d5760008155600101614349565b509056fe6f6e6c792070656e64696e67206f776e65722063616e2063616c6c20746869732066756e6374696f6e43616e6e6f742074616b65206d6f7265207468616e2031303025206f662077697468647261774d6179206f6e6c792063616c6c207468697320636f6e7472616374206f6e636520706572207472616e73616374696f6e2e53656e646572206d7573742062652074686520746f6b656e20636f6e74726163742e43616e6e6f742067697665207265666572726572206d6f7265207468616e20353025206f6620726577617264732e436f6e74726163742068617320616c7265616479206265656e20696e697469616c697a65642e5061757365206475726174696f6e2063616e6e6f74206265206d6f7265207468616e20333020646179732e526577617264206475726174696f6e2063616e6e6f74206265206d6f7265207468616e20333020646179732e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645769746864726177616c73206172652074656d706f726172696c79207061757365642e4e6f7420656e6f756768204e584d20617661696c61626c6520666f7220776974746864726177616c2e6d73672e73656e646572206973206e6f74206f776e657200000000000000000043616e6e6f7420676976652061646d696e206d6f7265207468616e20353025206f6620726577617264732ea26469706673582212208e65c3639603491a3b4afbb278ada5488fad05a461c4283f7fcc5263045bc34f64736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106103815760003560e01c8063857355c9116101d1578063c71859b811610102578063e941fa78116100a0578063f2fde38b1161006f578063f2fde38b14610d95578063f520e7e514610dc8578063f8077fae14610ddd578063fec5363414610df257610381565b8063e941fa7814610d2c578063e9f2838e14610d41578063f181c86714610d56578063f1e7250e14610d8057610381565b8063d7f469da116100dc578063d7f469da14610aee578063daf7b3b414610b03578063dc07065714610c2e578063e90d933114610c6157610381565b8063c71859b814610a9a578063c9b1714914610ac4578063d123738514610ad957610381565b806393a348a61161016f578063a893c9be11610149578063a893c9be14610a1c578063b8a758d614610a46578063c07e587a14610a5b578063c0dab51614610a8557610381565b806393a348a61461099e578063994818db146109c85780639d37b8db146109f257610381565b80638da5cb5b116101ab5780638da5cb5b146109085780638f1ea86a1461091d5780638f32d59b146109325780638fab0db31461095b57610381565b8063857355c91461089657806388d00d26146108ab5780638c396220146108de57610381565b80633f90916a116102b65780635da5bc5511610254578063750c281c11610223578063750c281c146107025780637a9262a21461071f5780637b86935e1461078357806383df67471461085557610381565b80635da5bc55146106935780635fc987c1146106a857806368a9f31c146106bd5780636f93bfb7146106d257610381565b806343a08b781161029057806343a08b78146105e55780634460d3cf146106185780634a3b68cc1461064b5780634b09b72a1461067e57610381565b80633f90916a146105915780633fe3376f146105a65780634100b5aa146105bb57610381565b80631c74a301116103235780632dbc3228116102fd5780632dbc3228146104f257806330e45f051461053557806338af3eed1461054a57806338d074361461055f57610381565b80631c74a30114610489578063202a36cd1461049e57806320eba239146104c857610381565b80630ab51bac1161035f5780630ab51bac146103d75780630f4ef8a6146103ec5780631459457a1461041d5780631c01e6fc1461047457610381565b80630288a39c146103865780630526679c146103ad57806307621eca146103c2575b600080fd5b34801561039257600080fd5b5061039b610e07565b60408051918252519081900360200190f35b3480156103b957600080fd5b5061039b610e0d565b3480156103ce57600080fd5b5061039b610e13565b3480156103e357600080fd5b5061039b610e22565b3480156103f857600080fd5b50610401610f36565b604080516001600160a01b039092168252519081900360200190f35b34801561042957600080fd5b50610472600480360360a081101561044057600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160809091013516610f45565b005b34801561048057600080fd5b5061039b61109a565b34801561049557600080fd5b506104726110a0565b3480156104aa57600080fd5b50610472600480360360208110156104c157600080fd5b5035611110565b3480156104d457600080fd5b50610472600480360360208110156104eb57600080fd5b5035611236565b3480156104fe57600080fd5b506104726004803603606081101561051557600080fd5b506001600160a01b03813581169160208101359160409091013516611282565b34801561054157600080fd5b506104016113e1565b34801561055657600080fd5b506104016113f0565b34801561056b57600080fd5b506104726004803603604081101561058257600080fd5b508035906020013515156113ff565b34801561059d57600080fd5b5061039b6118e9565b3480156105b257600080fd5b506104016118ef565b3480156105c757600080fd5b50610472600480360360208110156105de57600080fd5b50356118fe565b3480156105f157600080fd5b506104726004803603602081101561060857600080fd5b50356001600160a01b031661194a565b34801561062457600080fd5b506104726004803603602081101561063b57600080fd5b50356001600160a01b03166119b9565b34801561065757600080fd5b506104016004803603602081101561066e57600080fd5b50356001600160a01b0316611b2c565b34801561068a57600080fd5b5061039b611b47565b34801561069f57600080fd5b50610401611b4d565b3480156106b457600080fd5b50610401611b5c565b3480156106c957600080fd5b50610401611b6b565b3480156106de57600080fd5b50610472600480360360408110156106f557600080fd5b5080359060200135611b7b565b6104726004803603602081101561071857600080fd5b5035611ca4565b34801561072b57600080fd5b506107526004803603602081101561074257600080fd5b50356001600160a01b0316611dd4565b6040805165ffffffffffff90941684526001600160681b039283166020850152911682820152519081900360600190f35b34801561078f57600080fd5b50610472600480360360608110156107a657600080fd5b81359190810190604081016020820135600160201b8111156107c757600080fd5b8201836020820111156107d957600080fd5b803590602001918460208302840111600160201b831117156107fa57600080fd5b919390929091602081019035600160201b81111561081757600080fd5b82018360208201111561082957600080fd5b803590602001918460208302840111600160201b8311171561084a57600080fd5b509092509050611e0d565b34801561086157600080fd5b506104726004803603606081101561087857600080fd5b508035906001600160a01b0360208201351690604001351515611ec2565b3480156108a257600080fd5b506104726121d6565b3480156108b757600080fd5b5061039b600480360360208110156108ce57600080fd5b50356001600160a01b0316612246565b3480156108ea57600080fd5b506104016004803603602081101561090157600080fd5b5035612258565b34801561091457600080fd5b5061040161227f565b34801561092957600080fd5b5061047261228e565b34801561093e57600080fd5b50610947612353565b604080519115158252519081900360200190f35b34801561096757600080fd5b506104726004803603606081101561097e57600080fd5b506001600160a01b0381358116916020810135909116906040013561237a565b3480156109aa57600080fd5b50610472600480360360208110156109c157600080fd5b50356124ec565b3480156109d457600080fd5b50610472600480360360208110156109eb57600080fd5b503561257a565b3480156109fe57600080fd5b5061047260048036036020811015610a1557600080fd5b5035612607565b348015610a2857600080fd5b5061047260048036036020811015610a3f57600080fd5b5035612695565b348015610a5257600080fd5b50610472612722565b348015610a6757600080fd5b5061039b60048036036020811015610a7e57600080fd5b50356127a7565b348015610a9157600080fd5b5061039b61289d565b348015610aa657600080fd5b5061047260048036036020811015610abd57600080fd5b50356128a3565b348015610ad057600080fd5b5061039b612930565b348015610ae557600080fd5b5061039b612936565b348015610afa57600080fd5b506104726129c2565b348015610b0f57600080fd5b5061047260048036036080811015610b2657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610b5057600080fd5b820183602082011115610b6257600080fd5b803590602001918460208302840111600160201b83111715610b8357600080fd5b919390929091602081019035600160201b811115610ba057600080fd5b820183602082011115610bb257600080fd5b803590602001918460208302840111600160201b83111715610bd357600080fd5b919390929091602081019035600160201b811115610bf057600080fd5b820183602082011115610c0257600080fd5b803590602001918460208302840111600160201b83111715610c2357600080fd5b509092509050612c8d565b348015610c3a57600080fd5b5061047260048036036020811015610c5157600080fd5b50356001600160a01b0316612e80565b348015610c6d57600080fd5b5061047260048036036040811015610c8457600080fd5b810190602081018135600160201b811115610c9e57600080fd5b820183602082011115610cb057600080fd5b803590602001918460208302840111600160201b83111715610cd157600080fd5b919390929091602081019035600160201b811115610cee57600080fd5b820183602082011115610d0057600080fd5b803590602001918460208302840111600160201b83111715610d2157600080fd5b509092509050612ee9565b348015610d3857600080fd5b5061039b612f9d565b348015610d4d57600080fd5b5061039b612fa3565b348015610d6257600080fd5b5061039b60048036036020811015610d7957600080fd5b5035612fa9565b348015610d8c57600080fd5b5061039b613062565b348015610da157600080fd5b5061047260048036036020811015610db857600080fd5b50356001600160a01b0316613068565b348015610dd457600080fd5b5061039b6130d7565b348015610de957600080fd5b5061039b6130dd565b348015610dfe57600080fd5b506104726130e3565b60515481565b603b5481565b6000610e1d613132565b905090565b600080610e2d6131ac565b604554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610e7e57600080fd5b505afa158015610e92573d6000803e3d6000fd5b505050506040513d6020811015610ea857600080fd5b5051604080516339ac5eb960e01b815230600482015290519192506000916001600160a01b038516916339ac5eb9916024808301926020929190829003018186803b158015610ef657600080fd5b505afa158015610f0a573d6000803e3d6000fd5b505050506040513d6020811015610f2057600080fd5b50519050610f2e828261322c565b935050505090565b6048546001600160a01b031681565b6046546001600160a01b031615610f8d5760405162461bcd60e51b81526004018080602001828103825260268152602001806144326026913960400191505060405180910390fd5b610f95613247565b604480546001600160a01b038088166001600160a01b031992831617835560458054878316908416179055604680548883169084161790819055604780548784169085161790556048805486841690851681179091556000603d8190556019603e556801a055690d9db80000603955620d2f00603b55603c80549095163317909455620bdd806037556040805163095ea7b360e01b81526004810192909252600019602483015251919092169363095ea7b3938382019360209392908390030190829087803b15801561106757600080fd5b505af115801561107b573d6000803e3d6000fd5b505050506040513d602081101561109157600080fd5b50505050505050565b603f5481565b6001546001600160a01b031633146110e95760405162461bcd60e51b81526004018080602001828103825260298152602001806143626029913960400191505060405180910390fd5b6001546110fe906001600160a01b0316613316565b600180546001600160a01b0319169055565b600061111a613384565b90506000816001600160a01b0316630325ea37846040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801561116157600080fd5b505afa158015611175573d6000803e3d6000fd5b505050506040513d604081101561118b57600080fd5b5060209081015160408051630a9a1f1b60e31b81526004810187905290519193506000926001600160a01b038616926354d0f8d8926024808201939291829003018186803b1580156111dc57600080fd5b505afa1580156111f0573d6000803e3d6000fd5b505050506040513d602081101561120657600080fd5b50519050600e82148015611226575062093a8061122342836133d3565b11155b156112305742603a555b50505050565b61123e612353565b61127d576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b605155565b61128a612353565b6112c9576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b604554604080516323b872dd60e01b81526001600160a01b03868116600483015230602483015260448201869052915191909216916323b872dd9160648083019260209291908290030181600087803b15801561132557600080fd5b505af1158015611339573d6000803e3d6000fd5b505050506040513d602081101561134f57600080fd5b5061135b9050826133e8565b604480546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018790529151919092169263a9059cbb928082019260209290918290030181600087803b1580156113b057600080fd5b505af11580156113c4573d6000803e3d6000fd5b505050506040513d60208110156113da57600080fd5b5050505050565b6045546001600160a01b031681565b603c546001600160a01b031681565b326000908152604f6020526040902054421161144c5760405162461bcd60e51b81526004018080602001828103825260318152602001806143b16031913960400191505060405180910390fd5b326000908152604f602052604090204290819055603b54603a549091611471916133d3565b116114ad5760405162461bcd60e51b81526004018080602001828103825260238152602001806144d96023913960400191505060405180910390fd5b60006114b883612fa9565b604554604080516370a0823160e01b815230600482015290519293506001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561150657600080fd5b505afa15801561151a573d6000803e3d6000fd5b505050506040513d602081101561153057600080fd5b505160525461153f908361322c565b111561157c5760405162461bcd60e51b81526004018080602001828103825260298152602001806144fc6029913960400191505060405180910390fd5b81156116a05760006115a56103e861159f6050548561345f90919063ffffffff16565b90613486565b905060006115b383836133d3565b60465460408051632770a7eb60e21b81523360048201526024810189905290519293506001600160a01b0390911691639dc29fac916044808201926020929091908290030181600087803b15801561160a57600080fd5b505af115801561161e573d6000803e3d6000fd5b505050506040513d602081101561163457600080fd5b506116409050816133e8565b604454611657906001600160a01b031633836134a8565b60408051848152602081018790524281830152905133917f650fdf669e93aa6c8ff3defe2da9c12b64f1548e5e1e54e803f4c1beb6466c8e919081900360600190a250506118e4565b6052546116ad908261322c565b6052556046546116c8906001600160a01b03163330866134fa565b6116d061430f565b60536000336001600160a01b03166001600160a01b031681526020019081526020016000206040518060600160405290816000820160009054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160069054906101000a90046001600160681b03166001600160681b03166001600160681b031681526020016000820160139054906101000a90046001600160681b03166001600160681b03166001600160681b031681525050905060405180606001604052804265ffffffffffff168152602001838360200151016001600160681b03168152602001858360400151016001600160681b031681525060536000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a8154816001600160681b0302191690836001600160681b0316021790555060408201518160000160136101000a8154816001600160681b0302191690836001600160681b03160217905550905050336001600160a01b03167f1f0d204a59639d21245dbaa239dfc9a6227aa86cb614bdda19843c52d155fcfa8584426118bd6051544261322c90919063ffffffff16565b604080519485526020850193909352838301919091526060830152519081900360800190a2505b505050565b60525481565b6046546001600160a01b031681565b611906612353565b611945576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b603955565b6002546001600160a01b03163314611997576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6119c1612353565b611a00576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6045546001600160a01b03828116911614801590611a2c57506044546001600160a01b03828116911614155b8015611a4657506046546001600160a01b03828116911614155b611a97576040805162461bcd60e51b815260206004820152601e60248201527f43616e6e6f7420726573637565204e584d2d626173656420746f6b656e730000604482015290519081900360640190fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ae657600080fd5b505afa158015611afa573d6000803e3d6000fd5b505050506040513d6020811015611b1057600080fd5b50519050611b286001600160a01b03831633836134a8565b5050565b6049602052600090815260409020546001600160a01b031681565b60395481565b6044546001600160a01b031681565b6047546001600160a01b031681565b6002546001600160a01b03165b90565b611b83612353565b611bc2576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b604754604080516227050b60e31b81526123ab60f11b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b158015611c1157600080fd5b505afa158015611c25573d6000803e3d6000fd5b505050506040513d6020811015611c3b57600080fd5b505160408051636f93bfb760e01b8152600481018690526024810185905290519192506001600160a01b03831691636f93bfb79160448082019260009290919082900301818387803b158015611c9057600080fd5b505af1158015611091573d6000803e3d6000fd5b731337def157efdef167a81b3bab95385ce5a144773314611d0c576040805162461bcd60e51b815260206004820152601f60248201527f53656e646572206d7573742062652045786368616e67654d616e616765722e00604482015290519081900360640190fd5b604754604080516227050b60e31b815261503160f01b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b158015611d5b57600080fd5b505afa158015611d6f573d6000803e3d6000fd5b505050506040513d6020811015611d8557600080fd5b5051604080516304b1dde360e51b81526004810185905290519192506001600160a01b0383169163963bbc60914791602480830192600092919082900301818588803b158015611c9057600080fd5b60536020526000908152604090205465ffffffffffff8116906001600160681b0366010000000000008204811691600160981b90041683565b611e15612353565b611e54576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6113da858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525061355492505050565b326000908152604f60205260409020544211611f0f5760405162461bcd60e51b81526004018080602001828103825260318152602001806143b16031913960400191505060405180910390fd5b326000908152604f6020908152604080832042905533835260499091529020546001600160a01b03166120bd576001600160a01b038216611f5b57603c546001600160a01b0316611f5d565b815b33600090815260496020526040812080546001600160a01b0319166001600160a01b03938416179055908316611f9e57603c546001600160a01b0316611fa0565b825b33600081815260496020908152604080832080546001600160a01b0319166001600160a01b038781169190911790915560465482516370a0823160e01b81526004810196909652915195965092949216926370a082319260248083019392829003018186803b15801561201257600080fd5b505afa158015612026573d6000803e3d6000fd5b505050506040513d602081101561203c57600080fd5b5051905080156120ba576048546040805163bf6eac2f60e01b81526001600160a01b038581166004830152336024830152604482018590529151919092169163bf6eac2f91606480830192600092919082900301818387803b1580156120a157600080fd5b505af11580156120b5573d6000803e3d6000fd5b505050505b50505b60006120c8846127a7565b905081156120ed576045546120e8906001600160a01b03163330876134fa565b61210e565b604454612105906001600160a01b03163330876134fa565b61210e84613650565b604654604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b15801561216257600080fd5b505af1158015612176573d6000803e3d6000fd5b505050506040513d602081101561218c57600080fd5b505060408051858152602081018390524281830152905133917f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e919081900360600190a250505050565b6003546001600160a01b0316331461221f5760405162461bcd60e51b81526004018080602001828103825260298152602001806143626029913960400191505060405180910390fd5b600354612234906001600160a01b031661369d565b600380546001600160a01b0319169055565b604f6020526000908152604090205481565b6041818154811061226557fe5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031690565b3332146122db576040805162461bcd60e51b815260206004820152601660248201527529b2b73232b91036bab9ba1031329030b71022a7a09760511b604482015290519081900360640190fd5b60006122e5610e22565b905060006122f161370c565b905080156123445742604a819055604080518381526020810192909252818101849052517f1574d0bf0b356a89be9bcfedeed722e6c9b5ba2f0d3aa4be6ef11888b1d1f7f79181900360600190a1611b28565b604a54611b285742604a555050565b600080546001600160a01b0316331480610e1d5750506002546001600160a01b0316331490565b6046546001600160a01b031633146123c35760405162461bcd60e51b81526004018080602001828103825260228152602001806143e26022913960400191505060405180910390fd5b6001600160a01b038381166000908152604960205260409020541615612464576048546001600160a01b03848116600081815260496020526040808220548151636ce5768960e11b8152908516600482015260248101939093526044830186905251929093169263d9caed129260648084019382900301818387803b15801561244b57600080fd5b505af115801561245f573d6000803e3d6000fd5b505050505b6001600160a01b0382811660009081526049602052604090205416156118e4576048546001600160a01b0383811660008181526049602052604080822054815163bf6eac2f60e01b8152908516600482015260248101939093526044830186905251929093169263bf6eac2f9260648084019382900301818387803b158015611c9057600080fd5b6124f4612353565b612533576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b62278d008111156125755760405162461bcd60e51b815260040180806020018281038252602c815260200180614483602c913960400191505060405180910390fd5b603755565b612582612353565b6125c1576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6101f48111156126025760405162461bcd60e51b815260040180806020018281038252602e815260200180614404602e913960400191505060405180910390fd5b603e55565b61260f612353565b61264e576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b62278d008111156126905760405162461bcd60e51b815260040180806020018281038252602b815260200180614458602b913960400191505060405180910390fd5b603b55565b61269d612353565b6126dc576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6103e881111561271d5760405162461bcd60e51b815260040180806020018281038252602681526020018061438b6026913960400191505060405180910390fd5b605055565b604454604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561276d57600080fd5b505afa158015612781573d6000803e3d6000fd5b505050506040513d602081101561279757600080fd5b505190506127a481613650565b50565b6000806127b2613132565b905060006127d46040546127ce846127c8610e22565b9061322c565b906133d3565b90506000604660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561282657600080fd5b505afa15801561283a573d6000803e3d6000fd5b505050506040513d602081101561285057600080fd5b505190508161286157849350612895565b60006128798361159f84670de0b6b3a764000061345f565b9050612891670de0b6b3a764000061159f888461345f565b9450505b505050919050565b603d5481565b6128ab612353565b6128ea576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6101f481111561292b5760405162461bcd60e51b815260040180806020018281038252602b815260200180614545602b913960400191505060405180910390fd5b603d55565b60405481565b6000806129416131ac565b9050806001600160a01b03166339ac5eb9306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561299057600080fd5b505afa1580156129a4573d6000803e3d6000fd5b505050506040513d60208110156129ba57600080fd5b505192915050565b326000908152604f60205260409020544211612a0f5760405162461bcd60e51b81526004018080602001828103825260318152602001806143b16031913960400191505060405180910390fd5b326000908152604f60205260409020429055612a2961430f565b50336000908152605360209081526040918290208251606081018452905465ffffffffffff81168083526001600160681b03660100000000000083048116948401859052600160981b909204909116938201849052603b54603a54929492612a929042906133d3565b11612ace5760405162461bcd60e51b81526004018080602001828103825260238152602001806144d96023913960400191505060405180910390fd5b42612ae46051548361322c90919063ffffffff16565b1115612b2f576040805162461bcd60e51b81526020600482015260156024820152744e6f7420726561647920746f20776974686472617760581b604482015290519081900360640190fd5b60008311612b84576040805162461bcd60e51b815260206004820152601d60248201527f4e6f2070656e64696e6720616d6f756e7420746f207769746864726177000000604482015290519081900360640190fd5b60465460408051632770a7eb60e21b81523060048201526024810185905290516001600160a01b0390921691639dc29fac916044808201926020929091908290030181600087803b158015612bd857600080fd5b505af1158015612bec573d6000803e3d6000fd5b505050506040513d6020811015612c0257600080fd5b50612c0e9050836133e8565b604454612c25906001600160a01b031633856134a8565b33600090815260536020526040812055605254612c4290846133d3565b60525560408051848152602081018490524281830152905133917f650fdf669e93aa6c8ff3defe2da9c12b64f1548e5e1e54e803f4c1beb6466c8e919081900360600190a250505050565b333214612cda576040805162461bcd60e51b815260206004820152601660248201527529b2b73232b91036bab9ba1031329030b71022a7a09760511b604482015290519081900360640190fd5b866001600160a01b031663a82e84e98787878787876040518763ffffffff1660e01b81526004018080602001806020018060200184810384528a8a82818152602001925060200280828437600083820152601f01601f19169091018581038452888152602090810191508990890280828437600083820152601f01601f19169091018581038352868152602090810191508790870280828437600081840152601f19601f8201169050808301925050509950505050505050505050600060405180830381600087803b158015612daf57600080fd5b505af1158015612dc3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612dec57600080fd5b8101908080516040519392919084600160201b821115612e0b57600080fd5b908301906020820185811115612e2057600080fd5b82518660208202830111600160201b82111715612e3c57600080fd5b82525081516020918201928201910280838360005b83811015612e69578181015183820152602001612e51565b505050509050016040525050505050505050505050565b612e88612353565b612ec7576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b603c80546001600160a01b0319166001600160a01b0392909216919091179055565b612ef1612353565b612f30576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6113da8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061381492505050565b60505481565b603a5481565b600080612fb4613132565b90506000612fca6040546127ce846127c8610e22565b90506000604660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561301c57600080fd5b505afa158015613030573d6000803e3d6000fd5b505050506040513d602081101561304657600080fd5b5051905060006128798261159f85670de0b6b3a764000061345f565b603e5481565b6000546001600160a01b031633146130b5576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60375481565b604a5481565b6130eb612353565b61312a576040805162461bcd60e51b81526020600482015260176024820152600080516020614525833981519152604482015290519081900360640190fd5b6127a4613d37565b603754604a546000919082906131499042906133d3565b90508061315b57600092505050611b78565b81811061316c5760405492506131a7565b60006131848261159f85670de0b6b3a764000061345f565b9050610f2e8161159f670de0b6b3a764000060405461345f90919063ffffffff16565b505090565b604754604080516227050b60e31b815261505360f01b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b1580156131fb57600080fd5b505afa15801561320f573d6000803e3d6000fd5b505050506040513d602081101561322557600080fd5b5051919050565b60008282018381101561323e57600080fd5b90505b92915050565b6000546001600160a01b03161561329b576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60008054336001600160a01b0319918216811783556002805490921681179091556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360405133906000907f056a46fd3a2b20fb8bde8639e8a4b1bd407af5f7c1169369575e29e97d41a6ca908290a3565b6001600160a01b03811661332957600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b604754604080516227050b60e31b81526110d160f21b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b1580156131fb57600080fd5b6000828211156133e257600080fd5b50900390565b6044546133fe906001600160a01b031682613e25565b60445460408051630ea598cb60e41b81526004810184905290516001600160a01b039092169163ea598cb09160248082019260009290919082900301818387803b15801561344b57600080fd5b505af11580156113da573d6000803e3d6000fd5b60008261346e57506000613241565b8282028284828161347b57fe5b041461323e57600080fd5b600080821161349457600080fd5b600082848161349f57fe5b04949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526118e4908490613ea5565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611230908590613ea5565b600061355e6131ac565b9050806001600160a01b0316638e91e6bd8484876040518463ffffffff1660e01b8152600401808060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b838110156135cb5781810151838201526020016135b3565b50505050905001838103825285818151815260200191508051906020019060200280838360005b8381101561360a5781810151838201526020016135f2565b5050505090500195505050505050600060405180830381600087803b15801561363257600080fd5b505af1158015613646573d6000803e3d6000fd5b5050505050505050565b60445460408051636f074d1f60e11b81526004810184905290516001600160a01b039092169163de0e9a3e9160248082019260009290919082900301818387803b15801561344b57600080fd5b6001600160a01b0381166136b057600080fd5b6002546040516001600160a01b038084169216907f056a46fd3a2b20fb8bde8639e8a4b1bd407af5f7c1169369575e29e97d41a6ca90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000806137176131ac565b90506000816001600160a01b0316630ea474c7306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561376857600080fd5b505afa15801561377c573d6000803e3d6000fd5b505050506040513d602081101561379257600080fd5b5051905061379f8161405d565b9250816001600160a01b031663b86e321c306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156137f057600080fd5b505af1158015613804573d6000803e3d6000fd5b5050505082604081905550505090565b60008061381f6131ac565b604554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561387057600080fd5b505afa158015613884573d6000803e3d6000fd5b505050506040513d602081101561389a57600080fd5b505160525460395491925082916138b09161322c565b11156138bf57600092506138f3565b6138e06138d960525460395461322c90919063ffffffff16565b82906133d3565b92506138f36138ed614235565b84613e25565b6060826001600160a01b0316635840ee44306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060006040518083038186803b15801561394257600080fd5b505afa158015613956573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561397f57600080fd5b8101908080516040519392919084600160201b82111561399e57600080fd5b9083019060208201858111156139b357600080fd5b82518660208202830111600160201b821117156139cf57600080fd5b82525081516020918201928201910280838360005b838110156139fc5781810151838201526020016139e4565b50505050905001604052505050905060005b8151811015613b22576042846001600160a01b031663eae0171830858581518110613a3557fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613a8a57600080fd5b505afa158015613a9e573d6000803e3d6000fd5b505050506040513d6020811015613ab457600080fd5b5051815460018101835560009283526020909220909101558151604390839083908110613add57fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b039093169290921790915501613a0e565b5060005b8651811015613c1d576000878281518110613b3d57fe5b602002602001015190506000613b538483614284565b9050600019811415613bdf57604380546001810182556000919091527f9690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c6951027930180546001600160a01b0319166001600160a01b0384161790558751604290899085908110613bbb57fe5b60209081029190910181015182546001810184556000938452919092200155613c13565b878381518110613beb57fe5b602002602001015160428281548110613c0057fe5b6000918252602090912001805490910190555b5050600101613b26565b50826001600160a01b031663c001472e85604360426040518463ffffffff1660e01b81526004018084815260200180602001806020018381038352858181548152602001915080548015613c9a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613c7c575b50508381038252848181548152602001915080548015613cd957602002820191906000526020600020905b815481526020019060010190808311613cc5575b505095505050505050600060405180830381600087803b158015613cfc57600080fd5b505af1158015613d10573d6000803e3d6000fd5b5050505060436000613d22919061432f565b613d2e6042600061432f565b50505092915050565b600080613d426131ac565b9050806001600160a01b031663afd369fd306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613d9157600080fd5b505afa158015613da5573d6000803e3d6000fd5b505050506040513d6020811015613dbb57600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519193506001600160a01b03831691632e1a7d4d9160248082019260009290919082900301818387803b158015613e0957600080fd5b505af1158015613e1d573d6000803e3d6000fd5b505050505090565b6045546040805163095ea7b360e01b81526001600160a01b038581166004830152602482018590529151919092169163095ea7b39160448083019260209291908290030181600087803b158015613e7b57600080fd5b505af1158015613e8f573d6000803e3d6000fd5b505050506040513d602081101561123057600080fd5b613eb7826001600160a01b03166142d8565b613f08576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613f465780518252601f199092019160209182019101613f27565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613fa8576040519150601f19603f3d011682016040523d82523d6000602084013e613fad565b606091505b509150915081614004576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156112305780806020019051602081101561402057600080fd5b50516112305760405162461bcd60e51b815260040180806020018281038252602a8152602001806144af602a913960400191505060405180910390fd5b60008061408361407e6103e861159f603d548761345f90919063ffffffff16565b6127a7565b905060006140a561407e6103e861159f603e548861345f90919063ffffffff16565b9050811561413357604654603c54604080516340c10f1960e01b81526001600160a01b03928316600482015260248101869052905191909216916340c10f199160448083019260209291908290030181600087803b15801561410657600080fd5b505af115801561411a573d6000803e3d6000fd5b505050506040513d602081101561413057600080fd5b50505b801561421f57604654604080516340c10f1960e01b81523060048201526024810184905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b15801561418d57600080fd5b505af11580156141a1573d6000803e3d6000fd5b505050506040513d60208110156141b757600080fd5b505060485460408051633c6b16ab60e01b81526004810184905290516001600160a01b0390921691633c6b16ab9160248082019260009290919082900301818387803b15801561420657600080fd5b505af115801561421a573d6000803e3d6000fd5b505050505b61422d816127ce86856133d3565b949350505050565b604754604080516227050b60e31b815261544360f01b600482015290516000926001600160a01b0316916301382858916024808301926020929190829003018186803b1580156131fb57600080fd5b6000805b83518110156142cd57826001600160a01b03168482815181106142a757fe5b60200260200101516001600160a01b031614156142c5579050613241565b600101614288565b506000199392505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159061422d5750141592915050565b604080516060810182526000808252602082018190529181019190915290565b50805460008255906000526020600020908101906127a491905b8082111561435d5760008155600101614349565b509056fe6f6e6c792070656e64696e67206f776e65722063616e2063616c6c20746869732066756e6374696f6e43616e6e6f742074616b65206d6f7265207468616e2031303025206f662077697468647261774d6179206f6e6c792063616c6c207468697320636f6e7472616374206f6e636520706572207472616e73616374696f6e2e53656e646572206d7573742062652074686520746f6b656e20636f6e74726163742e43616e6e6f742067697665207265666572726572206d6f7265207468616e20353025206f6620726577617264732e436f6e74726163742068617320616c7265616479206265656e20696e697469616c697a65642e5061757365206475726174696f6e2063616e6e6f74206265206d6f7265207468616e20333020646179732e526577617264206475726174696f6e2063616e6e6f74206265206d6f7265207468616e20333020646179732e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645769746864726177616c73206172652074656d706f726172696c79207061757365642e4e6f7420656e6f756768204e584d20617661696c61626c6520666f7220776974746864726177616c2e6d73672e73656e646572206973206e6f74206f776e657200000000000000000043616e6e6f7420676976652061646d696e206d6f7265207468616e20353025206f6620726577617264732ea26469706673582212208e65c3639603491a3b4afbb278ada5488fad05a461c4283f7fcc5263045bc34f64736f6c634300060c0033
Deployed Bytecode Sourcemap
22939:29955:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52713:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23879;;;;;;;;;;;;;:::i;35632:132::-;;;;;;;;;;;;;:::i;34827:322::-;;;;;;;;;;;;;:::i;25062:35::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;25062:35:0;;;;;;;;;;;;;;26463:895;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26463:895:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24331:26;;;;;;;;;;;;;:::i;2516:216::-;;;;;;;;;;;;;:::i;36085:509::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36085:509:0;;:::i;49999:140::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49999:140:0;;:::i;47060:232::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47060:232:0;;;;;;;;;;;;;;;;;:::i;24908:17::-;;;;;;;;;;;;;:::i;23990:26::-;;;;;;;;;;;;;:::i;29071:1499::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29071:1499:0;;;;;;;;;:::i;52795:27::-;;;;;;;;;;;;;:::i;24932:19::-;;;;;;;;;;;;;:::i;48984:140::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48984:140:0;;:::i;3246:118::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3246:118:0;-1:-1:-1;;;;;3246:118:0;;:::i;48408:335::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48408:335:0;-1:-1:-1;;;;;48408:335:0;;:::i;25135:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25135:45:0;-1:-1:-1;;;;;25135:45:0;;:::i;23633:28::-;;;;;;;;;;;;;:::i;24883:18::-;;;;;;;;;;;;;:::i;24988:27::-;;;;;;;;;;;;;:::i;1466:91::-;;;;;;;;;;;;;:::i;48049:237::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48049:237:0;;;;;;;:::i;47478:326::-;;;;;;;;;;;;;;;;-1:-1:-1;47478:326:0;;:::i;52831:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52831:57:0;-1:-1:-1;;;;;52831:57:0;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;52831:57:0;;;;;;;;;;;;;;;;;;;;;;39864:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39864:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39864:190:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39864:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39864:190:0;;;;;;;;;;-1:-1:-1;39864:190:0;;-1:-1:-1;39864:190:0;-1:-1:-1;39864:190:0;:::i;27631:1207::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27631:1207:0;;;-1:-1:-1;;;;;27631:1207:0;;;;;;;;;;;;:::i;3372:231::-;;;;;;;;;;;;;:::i;52510:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52510:44:0;-1:-1:-1;;;;;52510:44:0;;:::i;24529:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24529:26:0;;:::i;1319:79::-;;;;;;;;;;;;;:::i;31714:407::-;;;;;;;;;;;;;:::i;2097:124::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;37023:481;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37023:481:0;;;;;;;;;;;;;;;;;:::i;50796:238::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50796:238:0;;:::i;49307:226::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49307:226:0;;:::i;51250:232::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51250:232:0;;:::i;49656:221::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49656:221:0;;:::i;39354:140::-;;;;;;;;;;;;;:::i;32957:775::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32957:775:0;;:::i;24128:27::-;;;;;;;;;;;;;:::i;50367:223::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50367:223:0;;:::i;24405:25::-;;;;;;;;;;;;;:::i;35294:206::-;;;;;;;;;;;;;:::i;30631:971::-;;;;;;;;;;;;;:::i;32445:276::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32445:276:0;;;;;;;;;;;;;;;-1:-1:-1;;;32445:276:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32445:276:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32445:276:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32445:276:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32445:276:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32445:276:0;;;;;;;;;;-1:-1:-1;32445:276:0;;-1:-1:-1;32445:276:0;-1:-1:-1;32445:276:0;:::i;51649:138::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51649:138:0;-1:-1:-1;;;;;51649:138:0;;:::i;39599:156::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39599:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39599:156:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39599:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39599:156:0;;;;;;;;;;-1:-1:-1;39599:156:0;;-1:-1:-1;39599:156:0;-1:-1:-1;39599:156:0;:::i;52652:26::-;;;;;;;;;;;;;:::i;23775:32::-;;;;;;;;;;;;;:::i;33969:674::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33969:674:0;;:::i;24219:27::-;;;;;;;;;;;;;:::i;2398:110::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2398:110:0;-1:-1:-1;;;;;2398:110:0;;:::i;23229:29::-;;;;;;;;;;;;;:::i;51866:34::-;;;;;;;;;;;;;:::i;39187:94::-;;;;;;;;;;;;;:::i;52713:28::-;;;;:::o;23879:::-;;;;:::o;35632:132::-;35699:14;35740:16;:14;:16::i;:::-;35731:25;;35632:132;:::o;34827:322::-;34882:16;34916:19;34954:10;:8;:10::i;:::-;34995:3;;:30;;;-1:-1:-1;;;34995:30:0;;35018:4;34995:30;;;;;;34916:50;;-1:-1:-1;34977:15:0;;-1:-1:-1;;;;;34995:3:0;;;;:13;;:30;;;;;;;;;;;;;;;:3;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34995:30:0;35059:35;;;-1:-1:-1;;;35059:35:0;;35087:4;35059:35;;;;;;34995:30;;-1:-1:-1;35036:20:0;;-1:-1:-1;;;;;35059:18:0;;;;;:35;;;;;34995:30;;35059:35;;;;;;;:18;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35059:35:0;;-1:-1:-1;35116:25:0;:7;35059:35;35116:11;:25::i;:::-;35105:36;;34827:322;;;;:::o;25062:35::-;;;-1:-1:-1;;;;;25062:35:0;;:::o;26463:895::-;26670:5;;-1:-1:-1;;;;;26670:5:0;26662:28;26654:79;;;;-1:-1:-1;;;26654:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26746:27;:25;:27::i;:::-;26784:4;:20;;-1:-1:-1;;;;;26784:20:0;;;-1:-1:-1;;;;;;26784:20:0;;;;;;26815:3;:18;;;;;;;;;;;26844:5;:22;;;;;;;;;;;;;26877:9;:34;;;;;;;;;;;26922:13;:46;;;;;;;;;;;;;26784:4;27013:12;:16;;;27055:2;27040:12;:17;27084:8;27068:13;:24;27119:7;27103:13;:23;27137:11;:24;;;;;27151:10;27137:24;;;;27225:6;27208:14;:23;27306:44;;;-1:-1:-1;;;27306:44:0;;-1:-1:-1;27306:44:0;;;;;;-1:-1:-1;;27306:44:0;;;;;:5;;;;;:13;;:44;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;26463:895:0:o;24331:26::-;;;;:::o;2516:216::-;2584:13;;-1:-1:-1;;;;;2584:13:0;2570:10;:27;2562:81;;;;-1:-1:-1;;;2562:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2673:13;;2654:33;;-1:-1:-1;;;;;2673:13:0;2654:18;:33::i;:::-;2698:13;:26;;-1:-1:-1;;;;;;2698:26:0;;;2516:216::o;36085:509::-;36161:22;36199:16;:14;:16::i;:::-;36161:56;;36244:14;36262:10;-1:-1:-1;;;;;36262:31:0;;36294:8;36262:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36262:41:0;;;;;;36335:36;;-1:-1:-1;;;36335:36:0;;;;;;;;;;36262:41;;-1:-1:-1;36314:18:0;;-1:-1:-1;;;;;36335:26:0;;;;;:36;;;;;36262:41;36335:36;;;;;;:26;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36335:36:0;;-1:-1:-1;36476:2:0;36466:12;;:57;;;;-1:-1:-1;36517:6:0;36482:31;:15;36502:10;36482:19;:31::i;:::-;:41;;36466:57;36462:125;;;36560:15;36540:17;:35;36462:125;36085:509;;;;:::o;49999:140::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;50101:13:::1;:30:::0;49999:140::o;47060:232::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;47171:3:::1;::::0;:47:::1;::::0;;-1:-1:-1;;;47171:47:0;;-1:-1:-1;;;;;47171:47:0;;::::1;;::::0;::::1;::::0;47203:4:::1;47171:47:::0;;;;;;;;;;;;:3;;;::::1;::::0;:16:::1;::::0;:47;;;;;::::1;::::0;;;;;;;;:3:::1;::::0;:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47229:17:0::1;::::0;-1:-1:-1;47238:7:0;47229:8:::1;:17::i;:::-;47257:4;::::0;;:27:::1;::::0;;-1:-1:-1;;;47257:27:0;;-1:-1:-1;;;;;47257:27:0;;::::1;;::::0;::::1;::::0;;;;;;;;;:4;;;::::1;::::0;:13:::1;::::0;:27;;;;::::1;::::0;;;;;;;;:4:::1;::::0;:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;47060:232:0:o;24908:17::-;;;-1:-1:-1;;;;;24908:17:0;;:::o;23990:26::-;;;-1:-1:-1;;;;;23990:26:0;;:::o;29071:1499::-;26046:9;26037:19;;;;:8;:19;;;;;;26019:15;:37;26011:99;;;;-1:-1:-1;;;26011:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26130:9;26121:19;;;;:8;:19;;;;;26143:15;26121:37;;;;29220:13:::1;::::0;29199:17:::1;::::0;29220:13;;29179:38:::1;::::0;:19:::1;:38::i;:::-;:54;29171:102;;;;-1:-1:-1::0;;;29171:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29348:15;29366:19;29375:9;29366:8;:19::i;:::-;29433:3;::::0;:28:::1;::::0;;-1:-1:-1;;;29433:28:0;;29455:4:::1;29433:28;::::0;::::1;::::0;;;29348:37;;-1:-1:-1;;;;;;29433:3:0;;::::1;::::0;:13:::1;::::0;:28;;;;;::::1;::::0;;;;;;;;;:3;:28;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29433:28:0;29404:12:::1;::::0;:25:::1;::::0;29421:7;29404:16:::1;:25::i;:::-;:57;;29396:111;;;;-1:-1:-1::0;;;29396:111:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29524:7;29520:1043;;;29548:11;29562:34;29591:4;29562:24;29574:11;;29562:7;:11;;:24;;;;:::i;:::-;:28:::0;::::1;:34::i;:::-;29548:48:::0;-1:-1:-1;29611:20:0::1;29634:16;:7:::0;29548:48;29634:11:::1;:16::i;:::-;29752:5;::::0;:33:::1;::::0;;-1:-1:-1;;;29752:33:0;;29763:10:::1;29752:33;::::0;::::1;::::0;;;;;;;;;29611:39;;-1:-1:-1;;;;;;29752:5:0;;::::1;::::0;:10:::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29800:22:0::1;::::0;-1:-1:-1;29809:12:0;29800:8:::1;:22::i;:::-;29837:4;::::0;:43:::1;::::0;-1:-1:-1;;;;;29837:4:0::1;29855:10;29867:12:::0;29837:17:::1;:43::i;:::-;29902:59;::::0;;;;;::::1;::::0;::::1;::::0;;;29945:15:::1;29902:59:::0;;;;;;29913:10:::1;::::0;29902:59:::1;::::0;;;;;;;;::::1;29520:1043;;;;;30009:12;::::0;:25:::1;::::0;30026:7;30009:16:::1;:25::i;:::-;29994:12;:40:::0;30049:5:::1;::::0;:60:::1;::::0;-1:-1:-1;;;;;30049:5:0::1;30072:10;30092:4;30099:9:::0;30049:22:::1;:60::i;:::-;30124:39;;:::i;:::-;30166:11;:23;30178:10;-1:-1:-1::0;;;;;30166:23:0::1;-1:-1:-1::0;;;;;30166:23:0::1;;;;;;;;;;;;30124:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30124:65:0::1;-1:-1:-1::0;;;;;30124:65:0::1;-1:-1:-1::0;;;;;30124:65:0::1;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30124:65:0::1;-1:-1:-1::0;;;;;30124:65:0::1;-1:-1:-1::0;;;;;30124:65:0::1;;;::::0;::::1;;;30230:197;;;;;;;;30273:15;30230:197;;;;;;30341:7;30308:14;:22;;;:41;-1:-1:-1::0;;;;;30230:197:0::1;;;;;30402:9;30368:14;:23;;;:44;-1:-1:-1::0;;;;;30230:197:0::1;;;::::0;30204:11:::1;:23;30216:10;-1:-1:-1::0;;;;;30204:23:0::1;-1:-1:-1::0;;;;;30204:23:0::1;;;;;;;;;;;;:223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30204:223:0::1;;;;;-1:-1:-1::0;;;;;30204:223:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30204:223:0::1;;;;;-1:-1:-1::0;;;;;30204:223:0::1;;;;;;;;;30467:10;-1:-1:-1::0;;;;;30449:102:0::1;;30479:9;30490:7;30499:15;30516:34;30536:13;;30516:15;:19;;:34;;;;:::i;:::-;30449:102;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;::::1;29520:1043;;26169:1;29071:1499:::0;;:::o;52795:27::-;;;;:::o;24932:19::-;;;-1:-1:-1;;;;;24932:19:0;;:::o;48984:140::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;49086:13:::1;:30:::0;48984:140::o;3246:118::-;1944:12;;-1:-1:-1;;;;;1944:12:0;1930:10;:26;1922:62;;;;;-1:-1:-1;;;1922:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1922:62:0;;;;;;;;;;;;;;;3331:14:::1;:25:::0;;-1:-1:-1;;;;;;3331:25:0::1;-1:-1:-1::0;;;;;3331:25:0;;;::::1;::::0;;;::::1;::::0;;3246:118::o;48408:335::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;48518:3:::1;::::0;-1:-1:-1;;;;;48501:21:0;;::::1;48518:3:::0;::::1;48501:21;::::0;::::1;::::0;:47:::1;;-1:-1:-1::0;48543:4:0::1;::::0;-1:-1:-1;;;;;48526:22:0;;::::1;48543:4:::0;::::1;48526:22;;48501:47;:74;;;;-1:-1:-1::0;48569:5:0::1;::::0;-1:-1:-1;;;;;48552:23:0;;::::1;48569:5:::0;::::1;48552:23;;48501:74;48493:117;;;::::0;;-1:-1:-1;;;48493:117:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;48621:15;48646:5;-1:-1:-1::0;;;;;48639:23:0::1;;48671:4;48639:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;48639:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48639:38:0;;-1:-1:-1;48688:47:0::1;-1:-1:-1::0;;;;;48688:26:0;::::1;48715:10;48639:38:::0;48688:26:::1;:47::i;:::-;1738:1;48408:335:::0;:::o;25135:45::-;;;;;;;;;;;;-1:-1:-1;;;;;25135:45:0;;:::o;23633:28::-;;;;:::o;24883:18::-;;;-1:-1:-1;;;;;24883:18:0;;:::o;24988:27::-;;;-1:-1:-1;;;;;24988:27:0;;:::o;1466:91::-;1537:12;;-1:-1:-1;;;;;1537:12:0;1466:91;;:::o;48049:237::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;48178:9:::1;::::0;:32:::1;::::0;;-1:-1:-1;;;48178:32:0;;-1:-1:-1;;;48178:32:0::1;::::0;::::1;::::0;;;48164:11:::1;::::0;-1:-1:-1;;;;;48178:9:0::1;::::0;:26:::1;::::0;:32;;;;;::::1;::::0;;;;;;;;:9;:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48178:32:0;48221:57:::1;::::0;;-1:-1:-1;;;48221:57:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;48178:32;;-1:-1:-1;;;;;;48221:27:0;::::1;::::0;::::1;::::0;:57;;;;;-1:-1:-1;;48221:57:0;;;;;;;;-1:-1:-1;48221:27:0;:57;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;47478:326:::0;47589:42;47575:10;:56;47567:100;;;;;-1:-1:-1;;;47567:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47703:9;;:32;;;-1:-1:-1;;;47703:32:0;;-1:-1:-1;;;47703:32:0;;;;;;47678:13;;-1:-1:-1;;;;;47703:9:0;;:26;;:32;;;;;;;;;;;;;;:9;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47703:32:0;47747:49;;;-1:-1:-1;;;47747:49:0;;;;;;;;;;47703:32;;-1:-1:-1;;;;;;47747:11:0;;;;;47765:21;;47747:49;;;;;-1:-1:-1;;47747:49:0;;;;;;;47765:21;47747:11;:49;;;;;;;;;;52831:57;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52831:57:0;;;;;;-1:-1:-1;;;52831:57:0;;;;:::o;39864:190::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;39997:49:::1;40009:7;40018:10;;39997:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;39997:49:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;40030:15:0;;-1:-1:-1;40030:15:0;;;;39997:49;::::1;::::0;40030:15;;39997:49;40030:15;39997:49;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;39997:11:0::1;::::0;-1:-1:-1;;;39997:49:0:i:1;27631:1207::-:0;26046:9;26037:19;;;;:8;:19;;;;;;26019:15;:37;26011:99;;;;-1:-1:-1;;;26011:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26130:9;26121:19;;;;:8;:19;;;;;;;;26143:15;26121:37;;27762:10:::1;27752:21:::0;;:9:::1;:21:::0;;;;;;-1:-1:-1;;;;;27752:21:0::1;27747:535;;-1:-1:-1::0;;;;;27829:23:0;::::1;:49;;27867:11;::::0;-1:-1:-1;;;;;27867:11:0::1;27829:49;;;27855:9;27829:49;27815:10;27805:21;::::0;;;:9:::1;:21;::::0;;;;:73;;-1:-1:-1;;;;;;27805:73:0::1;-1:-1:-1::0;;;;;27805:73:0;;::::1;;::::0;;:21;27912:23;::::1;:49;;27950:11;::::0;-1:-1:-1;;;;;27950:11:0::1;27912:49;;;27938:9;27912:49;27986:10;27976:21;::::0;;;:9:::1;:21;::::0;;;;;;;:32;;-1:-1:-1;;;;;;27976:32:0::1;-1:-1:-1::0;;;;;27976:32:0;;::::1;::::0;;;::::1;::::0;;;28161:5:::1;::::0;:27;;-1:-1:-1;;;28161:27:0;;::::1;::::0;::::1;::::0;;;;;;27976:32;;-1:-1:-1;27976:21:0;;28161:5;::::1;::::0;:15:::1;::::0;:27;;;;;27976:21;28161:27;;;;;:5;:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28161:27:0;;-1:-1:-1;28207:11:0;;28203:67:::1;;28220:13;::::0;:50:::1;::::0;;-1:-1:-1;;;28220:50:0;;-1:-1:-1;;;;;28220:50:0;;::::1;;::::0;::::1;::::0;28250:10:::1;28220:50:::0;;;;;;;;;;;;:13;;;::::1;::::0;:19:::1;::::0;:50;;;;;:13:::1;::::0;:50;;;;;;;:13;;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28203:67;27747:535;;;28356:16;28375:20;28386:8;28375:10;:20::i;:::-;28356:39;;28412:6;28408:223;;;28435:3;::::0;:57:::1;::::0;-1:-1:-1;;;;;28435:3:0::1;28456:10;28476:4;28483:8:::0;28435:20:::1;:57::i;:::-;28408:223;;;28525:4;::::0;:58:::1;::::0;-1:-1:-1;;;;;28525:4:0::1;28547:10;28567:4;28574:8:::0;28525:21:::1;:58::i;:::-;28598:21;28610:8;28598:11;:21::i;:::-;28724:5;::::0;:32:::1;::::0;;-1:-1:-1;;;28724:32:0;;28735:10:::1;28724:32;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;28724:5:0;;::::1;::::0;:10:::1;::::0;:32;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;28774:56:0::1;::::0;;;;;28724:32:::1;28774:56:::0;::::1;::::0;;;28814:15:::1;28774:56:::0;;;;;;28782:10:::1;::::0;28774:56:::1;::::0;;;;;;;;::::1;26169:1;27631:1207:::0;;;:::o;3372:231::-;3446:14;;-1:-1:-1;;;;;3446:14:0;3432:10;:28;3424:82;;;;-1:-1:-1;;;3424:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3542:14;;3517:40;;-1:-1:-1;;;;;3542:14:0;3517:24;:40::i;:::-;3568:14;:27;;-1:-1:-1;;;;;;3568:27:0;;;3372:231::o;52510:44::-;;;;;;;;;;;;;:::o;24529:26::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24529:26:0;;-1:-1:-1;24529:26:0;:::o;1319:79::-;1357:7;1384:6;-1:-1:-1;;;;;1384:6:0;1319:79;:::o;31714:407::-;25793:10;25807:9;25793:23;25785:58;;;;;-1:-1:-1;;;25785:58:0;;;;;;;;;;;;-1:-1:-1;;;25785:58:0;;;;;;;;;;;;;;;31789:15:::1;31807:5;:3;:5::i;:::-;31789:23;;31823:15;31841:16;:14;:16::i;:::-;31823:34:::0;-1:-1:-1;31874:11:0;;31870:244:::1;;31924:15;31902:19;:37:::0;;;31959:44:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;31870:244;;;32024:19;::::0;32021:93:::1;;32087:15;32065:19;:37:::0;25854:1:::1;;31714:407::o:0;2097:124::-;2137:4;2175:6;;-1:-1:-1;;;;;2175:6:0;2161:10;:20;;:50;;-1:-1:-1;;2199:12:0;;-1:-1:-1;;;;;2199:12:0;2185:10;:26;;2097:124::o;37023:481::-;37153:5;;-1:-1:-1;;;;;37153:5:0;37131:10;:28;37123:75;;;;-1:-1:-1;;;37123:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37311:16:0;;;37339:1;37311:16;;;:9;:16;;;;;;;:30;37306:94;;37344:13;;-1:-1:-1;;;;;37367:16:0;;;37344:13;37367:16;;;:9;:16;;;;;;;37344:56;;-1:-1:-1;;;37344:56:0;;37367:16;;;37344:56;;;;;;;;;;;;;;;;;;:13;;;;;:22;;:56;;;;;;;;;;:13;;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37306:94;-1:-1:-1;;;;;37416:14:0;;;37442:1;37416:14;;;:9;:14;;;;;;;:28;37411:85;;37447:13;;-1:-1:-1;;;;;37467:14:0;;;37447:13;37467:14;;;:9;:14;;;;;;;37447:49;;-1:-1:-1;;;37447:49:0;;37467:14;;;37447:49;;;;;;;;;;;;;;;;;;:13;;;;;:19;;:49;;;;;;;;;;:13;;:49;;;;;;;;;;50796:238;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;50927:7:::1;50908:15;:26;;50900:83;;;;-1:-1:-1::0;;;50900:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50994:14;:32:::0;50796:238::o;49307:226::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;49432:3:::1;49415:13;:20;;49407:79;;;;-1:-1:-1::0;;;49407:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49497:12;:28:::0;49307:226::o;51250:232::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;51378:7:::1;51360:14;:25;;51352:81;;;;-1:-1:-1::0;;;51352:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51444:13;:30:::0;51250:232::o;49656:221::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;23083:4:::1;49762:12;:27;;49754:78;;;;-1:-1:-1::0;;;49754:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49843:11;:26:::0;49656:221::o;39354:140::-;39426:4;;:29;;;-1:-1:-1;;;39426:29:0;;39449:4;39426:29;;;;;;39408:15;;-1:-1:-1;;;;;39426:4:0;;:14;;:29;;;;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39426:29:0;;-1:-1:-1;39466:20:0;39426:29;39466:11;:20::i;:::-;39354:140;:::o;32957:775::-;33035:16;33119:14;33136:16;:14;:16::i;:::-;33119:33;;33317:14;33334:33;33356:10;;33334:17;33344:6;33334:5;:3;:5::i;:::-;:9;;:17::i;:::-;:21;;:33::i;:::-;33317:50;;33378:15;33396:5;;;;;;;;;-1:-1:-1;;;;;33396:5:0;-1:-1:-1;;;;;33396:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33396:19:0;;-1:-1:-1;33521:11:0;33517:208;;33560:8;33549:19;;33517:208;;;33601:17;33621:33;33647:6;33623:17;:7;33635:4;33623:11;:17::i;33621:33::-;33601:53;-1:-1:-1;33680:33:0;33708:4;33680:23;:8;33601:53;33680:12;:23::i;:33::-;33669:44;;33517:208;;32957:775;;;;;;:::o;24128:27::-;;;;:::o;50367:223::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;50492:3:::1;50475:13;:20;;50467:76;;;;-1:-1:-1::0;;;50467:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50554:12;:28:::0;50367:223::o;24405:25::-;;;;:::o;35294:206::-;35355:14;35387:19;35425:10;:8;:10::i;:::-;35387:50;;35457:4;-1:-1:-1;;;;;35457:18:0;;35485:4;35457:35;;;;;;;;;;;;;-1:-1:-1;;;;;35457:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35457:35:0;;35294:206;-1:-1:-1;;35294:206:0:o;30631:971::-;26046:9;26037:19;;;;:8;:19;;;;;;26019:15;:37;26011:99;;;;-1:-1:-1;;;26011:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26130:9;26121:19;;;;:8;:19;;;;;26143:15;26121:37;;30708:35:::1;;:::i;:::-;-1:-1:-1::0;30758:10:0::1;30746:23;::::0;;;:11:::1;:23;::::0;;;;;;;;30708:61;;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;30708:61:0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;30708:61:0;;::::1;::::0;;::::1;::::0;;;;;;31009:13:::1;::::0;30988:17:::1;::::0;30708:61;;;30968:38:::1;::::0;:15:::1;::::0;:19:::1;:38::i;:::-;:54;30960:102;;;;-1:-1:-1::0;;;30960:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31115:15;31081:30;31097:13;;31081:11;:15;;:30;;;;:::i;:::-;:49;;31073:83;;;::::0;;-1:-1:-1;;;31073:83:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31073:83:0;;;;;;;;;;;;;::::1;;31185:1;31175:7;:11;31167:53;;;::::0;;-1:-1:-1;;;31167:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31314:5;::::0;:35:::1;::::0;;-1:-1:-1;;;31314:35:0;;31333:4:::1;31314:35;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;31314:5:0;;::::1;::::0;:10:::1;::::0;:35;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31360:17:0::1;::::0;-1:-1:-1;31369:7:0;31360:8:::1;:17::i;:::-;31388:4;::::0;:38:::1;::::0;-1:-1:-1;;;;;31388:4:0::1;31406:10;31418:7:::0;31388:17:::1;:38::i;:::-;31456:10;31444:23;::::0;;;:11:::1;:23;::::0;;;;31437:30;31493:12:::1;::::0;:25:::1;::::0;31510:7;31493:16:::1;:25::i;:::-;31478:12;:40:::0;31536:58:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;31578:15:::1;31536:58:::0;;;;;;31547:10:::1;::::0;31536:58:::1;::::0;;;;;;;;::::1;26169:1;;;;30631:971::o:0;32445:276::-;25793:10;25807:9;25793:23;25785:58;;;;;-1:-1:-1;;;25785:58:0;;;;;;;;;;;;-1:-1:-1;;;25785:58:0;;;;;;;;;;;;;;;32654:13:::1;-1:-1:-1::0;;;;;32640:41:0::1;;32682:10;;32694:9;;32705:7;;32640:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;32640:73:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;32640:73:0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;32640:73:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;32640:73:0;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;32640:73:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;32640:73:0::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;32640:73:0::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;32640:73:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;;32445:276:::0;;;;;;;:::o;51649:138::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;51750:11:::1;:29:::0;;-1:-1:-1;;;;;;51750:29:0::1;-1:-1:-1::0;;;;;51750:29:0;;;::::1;::::0;;;::::1;::::0;;51649:138::o;39599:156::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;39711:36:::1;39721:10;;39711:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;39711:36:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;39733:13:0;;-1:-1:-1;39733:13:0;;;;39711:36;::::1;::::0;39733:13;;39711:36;39733:13;39711:36;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;39711:9:0::1;::::0;-1:-1:-1;;;39711:36:0:i:1;52652:26::-:0;;;;:::o;23775:32::-;;;;:::o;33969:674::-;34046:15;34129:14;34146:16;:14;:16::i;:::-;34129:33;;34327:14;34344:33;34366:10;;34344:17;34354:6;34344:5;:3;:5::i;:33::-;34327:50;;34388:15;34406:5;;;;;;;;;-1:-1:-1;;;;;34406:5:0;-1:-1:-1;;;;;34406:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34406:19:0;;-1:-1:-1;34527:17:0;34547:33;34406:19;34549:16;:6;34560:4;34549:10;:16::i;24219:27::-;;;;:::o;2398:110::-;1818:6;;-1:-1:-1;;;;;1818:6:0;1804:10;:20;1796:56;;;;;-1:-1:-1;;;1796:56:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1796:56:0;;;;;;;;;;;;;;;2476:13:::1;:24:::0;;-1:-1:-1;;;;;;2476:24:0::1;-1:-1:-1::0;;;;;2476:24:0;;;::::1;::::0;;;::::1;::::0;;2398:110::o;23229:29::-;;;;:::o;51866:34::-;;;;:::o;39187:94::-;1690:9;:7;:9::i;:::-;1682:45;;;;;-1:-1:-1;;;1682:45:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1682:45:0;;;;;;;;;;;;;;;39259:14:::1;:12;:14::i;44227:719::-:0;44346:14;;44413:19;;44295:14;;44346;44295;;44393:40;;:15;;:19;:40::i;:::-;44371:62;-1:-1:-1;44447:16:0;44444:55;;44486:1;44479:8;;;;;;44444:55;44628:8;44613:11;:23;44609:330;;44662:10;;44653:19;;44609:330;;;44809:15;44827:39;44854:11;44829:18;:8;44842:4;44829:12;:18::i;44827:39::-;44809:57;;44890:37;44919:7;44892:20;44907:4;44892:10;;:14;;:20;;;;:::i;44609:330::-;44227:719;;;:::o;45861:139::-;45960:9;;:32;;;-1:-1:-1;;;45960:32:0;;-1:-1:-1;;;45960:32:0;;;;;;45923:12;;-1:-1:-1;;;;;45960:9:0;;:26;;:32;;;;;;;;;;;;;;:9;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45960:32:0;;45861:139;-1:-1:-1;45861:139:0:o;8703:150::-;8761:7;8793:5;;;8817:6;;;;8809:15;;;;;;8844:1;-1:-1:-1;8703:150:0;;;;;:::o;948:301::-;1023:1;1005:6;-1:-1:-1;;;;;1005:6:0;:20;997:52;;;;;-1:-1:-1;;;997:52:0;;;;;;;;;;;;-1:-1:-1;;;997:52:0;;;;;;;;;;;;;;;1060:6;:19;;1069:10;-1:-1:-1;;;;;;1060:19:0;;;;;;;1090:12;:25;;;;;;;;;;1131:44;;1069:10;;1060:6;1131:44;;1060:6;;1131:44;1191:50;;1230:10;;1226:1;;1191:50;;1226:1;;1191:50;948:301::o;2882:187::-;-1:-1:-1;;;;;2956:22:0;;2948:31;;;;;;3016:6;;;2995:38;;-1:-1:-1;;;;;2995:38:0;;;;3016:6;;;2995:38;;;3044:6;:17;;-1:-1:-1;;;;;;3044:17:0;-1:-1:-1;;;;;3044:17:0;;;;;;;;;;2882:187::o;46498:157::-;46615:9;;:32;;;-1:-1:-1;;;46615:32:0;;-1:-1:-1;;;46615:32:0;;;;;;46566:18;;-1:-1:-1;;;;;46615:9:0;;:26;;:32;;;;;;;;;;;;;;:9;:32;;;;;;;;;;8465:150;8523:7;8556:1;8551;:6;;8543:15;;;;;;-1:-1:-1;8581:5:0;;;8465:150::o;45037:155::-;45124:4;;45104:35;;-1:-1:-1;;;;;45124:4:0;45131:7;45104:11;:35::i;:::-;45164:4;;45150:34;;;-1:-1:-1;;;45150:34:0;;;;;;;;;;-1:-1:-1;;;;;45164:4:0;;;;45150:25;;:34;;;;;45164:4;;45150:34;;;;;;;;45164:4;;45150:34;;;;;;;;;;;;;;;;;;;;;;;;;;7456:433;7514:7;7758:6;7754:47;;-1:-1:-1;7788:1:0;7781:8;;7754:47;7825:5;;;7829:1;7825;:5;:1;7849:5;;;;;:10;7841:19;;;;;8024:303;8082:7;8181:1;8177;:5;8169:14;;;;;;8194:9;8210:1;8206;:5;;;;;;;8024:303;-1:-1:-1;;;;8024:303:0:o;12714:176::-;12823:58;;;-1:-1:-1;;;;;12823:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12823:58:0;-1:-1:-1;;;12823:58:0;;;12797:85;;12816:5;;12797:18;:85::i;12898:204::-;13025:68;;;-1:-1:-1;;;;;13025:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13025:68:0;-1:-1:-1;;;13025:68:0;;;12999:95;;13018:5;;12999:18;:95::i;42780:245::-;42906:19;42944:10;:8;:10::i;:::-;42906:50;;42967:4;-1:-1:-1;;;;;42967:19:0;;42987:10;42999:8;43009:7;42967:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42780:245;;;;:::o;45366:114::-;45450:4;;45436:36;;;-1:-1:-1;;;45436:36:0;;;;;;;;;;-1:-1:-1;;;;;45450:4:0;;;;45436:27;;:36;;;;;45450:4;;45436:36;;;;;;;;45450:4;;45436:36;;;;;;;;;;3753:211;-1:-1:-1;;;;;3833:22:0;;3825:31;;;;;;3899:12;;3872:50;;-1:-1:-1;;;;;3872:50:0;;;;3899:12;;3872:50;;3899:12;;3872:50;3933:12;:23;;-1:-1:-1;;;;;;3933:23:0;-1:-1:-1;;;;;3933:23:0;;;;;;;;;;3753:211::o;37705:447::-;37763:19;37800;37838:10;:8;:10::i;:::-;37800:50;;37954:18;37975:4;-1:-1:-1;;;;;37975:17:0;;38002:4;37975:34;;;;;;;;;;;;;-1:-1:-1;;;;;37975:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37975:34:0;;-1:-1:-1;38034:26:0;37975:34;38034:14;:26::i;:::-;38020:40;;38073:4;-1:-1:-1;;;;;38073:19:0;;38102:4;38073:36;;;;;;;;;;;;;-1:-1:-1;;;;;38073:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38133:11;38120:10;:24;;;;37705:447;;;:::o;40887:1684::-;40999:15;41032:19;41070:10;:8;:10::i;:::-;41111:3;;:30;;;-1:-1:-1;;;41111:30:0;;41134:4;41111:30;;;;;;41032:50;;-1:-1:-1;41093:15:0;;-1:-1:-1;;;;;41111:3:0;;;;:13;;:30;;;;;;;;;;;;;;;:3;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41111:30:0;41279:12;;41261:13;;41111:30;;-1:-1:-1;41111:30:0;;41261:31;;:17;:31::i;:::-;:41;41257:230;;;41329:1;41319:11;;41257:230;;;41373:44;41385:31;41403:12;;41385:13;;:17;;:31;;;;:::i;:::-;41373:7;;:11;:44::i;:::-;41363:54;;41432:43;41444:21;:19;:21::i;:::-;41467:7;41432:11;:43::i;:::-;41548:33;41584:4;-1:-1:-1;;;;;41584:25:0;;41618:4;41584:40;;;;;;;;;;;;;-1:-1:-1;;;;;41584:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41584:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41584:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41584:40:0;;;;;;;;;;;;-1:-1:-1;41584:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41548:76;;41706:9;41701:211;41725:16;:23;41721:1;:27;41701:211;;;41770:7;41783:4;-1:-1:-1;;;;;41783:24:0;;41816:4;41823:16;41840:1;41823:19;;;;;;;;;;;;;;41783:60;;;;;;;;;;;;;-1:-1:-1;;;;;41783:60:0;;;;;;-1:-1:-1;;;;;41783:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41783:60:0;41770:74;;;;;;;-1:-1:-1;41770:74:0;;;41783:60;41770:74;;;;;;;41880:19;;41859:15;;41880:16;;41897:1;;41880:19;;;;;;;;;;;;;;;;;41859:41;;;;;;;;-1:-1:-1;41859:41:0;;;;;;;;;;;;-1:-1:-1;;;;;;41859:41:0;-1:-1:-1;;;;;41859:41:0;;;;;;;;;;41750:3;41701:211;;;;41967:9;41963:425;41986:10;:17;41982:1;:21;41963:425;;;42025:16;42044:10;42055:1;42044:13;;;;;;;;;;;;;;42025:32;;42072:16;42091:45;42109:16;42127:8;42091:17;:45::i;:::-;42072:64;;-1:-1:-1;;42154:8:0;:29;42151:226;;;42204:15;:30;;;;;;;-1:-1:-1;42204:30:0;;;;;;;;-1:-1:-1;;;;;;42204:30:0;-1:-1:-1;;;;;42204:30:0;;;;;42266:16;;42253:7;;42266:16;;42280:1;;42266:16;;;;;;;;;;;;;;;;;42253:30;;;;;;;-1:-1:-1;42253:30:0;;;;;;;;;42151:226;;;42345:13;42359:1;42345:16;;;;;;;;;;;;;;42324:7;42332:8;42324:17;;;;;;;;;;;;;;;;;:37;;;;;;;42151:226;-1:-1:-1;;42005:3:0;;41963:425;;;;42450:4;-1:-1:-1;;;;;42450:20:0;;42471:7;42480:15;42497:7;42450:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42450:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42523:15;;42516:22;;;;:::i;:::-;42549:14;42556:7;;42549:14;:::i;:::-;40887:1684;;;;;;;:::o;40213:241::-;40269:14;40301:19;40339:10;:8;:10::i;:::-;40301:50;;40371:4;-1:-1:-1;;;;;40371:26:0;;40407:4;40371:43;;;;;;;;;;;;;-1:-1:-1;;;;;40371:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40371:43:0;40425:21;;;-1:-1:-1;;;40425:21:0;;;;;;;;;;40371:43;;-1:-1:-1;;;;;;40425:13:0;;;;;:21;;;;;-1:-1:-1;;40425:21:0;;;;;;;;-1:-1:-1;40425:13:0;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40213:241;;:::o;45592:118::-;45675:3;;:27;;;-1:-1:-1;;;45675:27:0;;-1:-1:-1;;;;;45675:27:0;;;;;;;;;;;;;;;:3;;;;;:11;;:27;;;;;;;;;;;;;;:3;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14708:1114;15312:27;15320:5;-1:-1:-1;;;;;15312:25:0;;:27::i;:::-;15304:71;;;;;-1:-1:-1;;;15304:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15449:12;15463:23;15498:5;-1:-1:-1;;;;;15490:19:0;15510:4;15490:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15490:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15448:67;;;;15534:7;15526:52;;;;;-1:-1:-1;;;15526:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15595:17;;:21;15591:224;;15737:10;15726:30;;;;;;;;;;;;;;;-1:-1:-1;15726:30:0;15718:85;;;;-1:-1:-1;;;15718:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38376:733;38446:18;38532:19;38554:55;38566:41;23083:4;38566:24;38577:12;;38566:6;:10;;:24;;;;:::i;:41::-;38554:10;:55::i;:::-;38532:77;;38620:19;38642:55;38654:41;23083:4;38654:24;38665:12;;38654:6;:10;;:24;;;;:::i;38642:55::-;38620:77;-1:-1:-1;38800:15:0;;38796:84;;38832:5;;38843:11;;38832:36;;;-1:-1:-1;;;38832:36:0;;-1:-1:-1;;;;;38843:11:0;;;38832:36;;;;;;;;;;;;:5;;;;;:10;;:36;;;;;;;;;;;;;;:5;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38796:84:0;38894:15;;38890:146;;38926:5;;:38;;;-1:-1:-1;;;38926:38:0;;38945:4;38926:38;;;;;;;;;;;;-1:-1:-1;;;;;38926:5:0;;;;:10;;:38;;;;;;;;;;;;;;;:5;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38979:13:0;;:45;;;-1:-1:-1;;;38979:45:0;;;;;;;;;;-1:-1:-1;;;;;38979:13:0;;;;:32;;:45;;;;;:13;;:45;;;;;;;;:13;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38890:146;39061:40;39089:11;39061:23;:6;39072:11;39061:10;:23::i;:40::-;39048:53;38376:733;-1:-1:-1;;;;38376:733:0:o;46173:161::-;46294:9;;:32;;;-1:-1:-1;;;46294:32:0;;-1:-1:-1;;;46294:32:0;;;;;;46245:18;;-1:-1:-1;;;;;46294:9:0;;:26;;:32;;;;;;;;;;;;;;:9;:32;;;;;;;;;;46663:279;46748:13;;46774:126;46795:3;:10;46793:1;:12;46774:126;;;46840:4;-1:-1:-1;;;;;46830:14:0;:3;46834:1;46830:6;;;;;;;;;;;;;;-1:-1:-1;;;;;46830:14:0;;46827:62;;;46872:1;-1:-1:-1;46865:8:0;;46827:62;46807:3;;46774:126;;;-1:-1:-1;;;46917:17:0;46663:279;-1:-1:-1;;;46663:279:0:o;4624:810::-;4684:4;5343:20;;5186:66;5383:15;;;;;:42;;-1:-1:-1;5402:23:0;;;4624:810;-1:-1:-1;;4624:810:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://8e65c3639603491a3b4afbb278ada5488fad05a461c4283f7fcc5263045bc34f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.