Polygon Sponsored slots available. Book your slot here!
Overview
POL Balance
0 POL
POL Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
AuraViewHelpersLite
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-07-18 */ // Sources flattened with hardhat v2.14.0 https://hardhat.org // File @openzeppelin/contracts-0.8/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts-0.8/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts-0.8/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts-0.8/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-0.8/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( 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' 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(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. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts-0.8/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/interfaces/IAuraLocker.sol pragma solidity 0.8.11; interface IAuraLocker { function isShutdown() external view returns (bool); function lock(address _account, uint256 _amount) external; function checkpointEpoch() external; function epochCount() external view returns (uint256); function balanceAtEpochOf(uint256 _epoch, address _user) external view returns (uint256 amount); function totalSupplyAtEpoch(uint256 _epoch) external view returns (uint256 supply); function queueNewRewards(address _rewardsToken, uint256 reward) external; function getReward(address _account, bool _stake) external; function getReward(address _account) external; } // File contracts/interfaces/IRewardStaking.sol pragma solidity 0.8.11; interface IRewardStaking { function getReward(address _account, bool _claimExtras) external; function getReward(address _account) external; function getReward(address _account, address _token) external; function stakeFor(address, uint256) external; function processIdleRewards() external; } // File contracts/utils/AuraMath.sol pragma solidity 0.8.11; /// @notice A library for performing overflow-/underflow-safe math, /// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math). library AuraMath { /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; } function sub(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a - b; } function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a * b; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute. return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2); } function to224(uint256 a) internal pure returns (uint224 c) { require(a <= type(uint224).max, "AuraMath: uint224 Overflow"); c = uint224(a); } function to128(uint256 a) internal pure returns (uint128 c) { require(a <= type(uint128).max, "AuraMath: uint128 Overflow"); c = uint128(a); } function to112(uint256 a) internal pure returns (uint112 c) { require(a <= type(uint112).max, "AuraMath: uint112 Overflow"); c = uint112(a); } function to96(uint256 a) internal pure returns (uint96 c) { require(a <= type(uint96).max, "AuraMath: uint96 Overflow"); c = uint96(a); } function to32(uint256 a) internal pure returns (uint32 c) { require(a <= type(uint32).max, "AuraMath: uint32 Overflow"); c = uint32(a); } } /// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32. library AuraMath32 { function sub(uint32 a, uint32 b) internal pure returns (uint32 c) { c = a - b; } } /// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint112. library AuraMath112 { function add(uint112 a, uint112 b) internal pure returns (uint112 c) { c = a + b; } function sub(uint112 a, uint112 b) internal pure returns (uint112 c) { c = a - b; } } /// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint224. library AuraMath224 { function add(uint224 a, uint224 b) internal pure returns (uint224 c) { c = a + b; } } // File contracts/core/AuraLocker.sol pragma solidity 0.8.11; /** * @title AuraLocker * @author ConvexFinance * @notice Effectively allows for rolling 16 week lockups of CVX, and provides balances available * at each epoch (1 week). Also receives cvxCrv from `CvxStakingProxy` and redistributes * to depositors. * @dev Individual and delegatee vote power lookups both use independent accounting mechanisms. */ contract AuraLocker is ReentrancyGuard, Ownable, IAuraLocker { using AuraMath for uint256; using AuraMath224 for uint224; using AuraMath112 for uint112; using AuraMath32 for uint32; using SafeERC20 for IERC20; /* ========== STRUCTS ========== */ struct RewardData { /// Timestamp for current period finish uint32 periodFinish; /// Last time any user took action uint32 lastUpdateTime; /// RewardRate for the rest of the period uint96 rewardRate; /// Ever increasing rewardPerToken rate, based on % of total supply uint96 rewardPerTokenStored; } struct UserData { uint128 rewardPerTokenPaid; uint128 rewards; } struct EarnedData { address token; uint256 amount; } struct Balances { uint112 locked; uint32 nextUnlockIndex; } struct LockedBalance { uint112 amount; uint32 unlockTime; } struct Epoch { uint224 supply; uint32 date; //epoch start date } struct DelegateeCheckpoint { uint224 votes; uint32 epochStart; } /* ========== STATE VARIABLES ========== */ // Rewards address[] public rewardTokens; mapping(address => uint256) public queuedRewards; uint256 public constant newRewardRatio = 830; // Core reward data mapping(address => RewardData) public rewardData; // Reward token -> distributor -> is approved to add rewards mapping(address => mapping(address => bool)) public rewardDistributors; // User -> reward token -> amount mapping(address => mapping(address => UserData)) public userData; // Duration that rewards are streamed over uint256 public constant rewardsDuration = 86400 * 7; // Duration of lock/earned penalty period uint256 public constant lockDuration = rewardsDuration * 17; // Balances // Supplies and historic supply uint256 public lockedSupply; // Epochs contains only the tokens that were locked at that epoch, not a cumulative supply Epoch[] public epochs; // Mappings for balance data mapping(address => Balances) public balances; mapping(address => LockedBalance[]) public userLocks; // Voting // Stored delegations mapping(address => address) private _delegates; // Checkpointed votes mapping(address => DelegateeCheckpoint[]) private _checkpointedVotes; // Delegatee balances (user -> unlock timestamp -> amount) mapping(address => mapping(uint256 => uint256)) public delegateeUnlocks; // Config // Blacklisted smart contract interactions mapping(address => bool) public blacklist; // Tokens IERC20 public immutable stakingToken; address public immutable cvxCrv; // Denom for calcs uint256 public constant denominator = 10000; // Staking cvxCrv address public immutable cvxcrvStaking; // Incentives uint256 public kickRewardPerEpoch = 100; uint256 public kickRewardEpochDelay = 3; // Shutdown bool public isShutdown = false; // Basic token data string private _name; string private _symbol; uint8 private immutable _decimals; /* ========== EVENTS ========== */ event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); event DelegateCheckpointed(address indexed delegate); event Recovered(address _token, uint256 _amount); event RewardPaid(address indexed _user, address indexed _rewardsToken, uint256 _reward); event Staked(address indexed _user, uint256 _paidAmount, uint256 _lockedAmount); event Withdrawn(address indexed _user, uint256 _amount, bool _relocked); event KickReward(address indexed _user, address indexed _kicked, uint256 _reward); event RewardAdded(address indexed _token, uint256 _reward); event BlacklistModified(address account, bool blacklisted); event KickIncentiveSet(uint256 rate, uint256 delay); event Shutdown(); /*************************************** CONSTRUCTOR ****************************************/ /** * @param _nameArg Token name, simples * @param _symbolArg Token symbol * @param _stakingToken CVX (0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B) * @param _cvxCrv cvxCRV (0x62B9c7356A2Dc64a1969e19C23e4f579F9810Aa7) * @param _cvxCrvStaking cvxCRV rewards (0x3Fe65692bfCD0e6CF84cB1E7d24108E434A7587e) */ constructor( string memory _nameArg, string memory _symbolArg, address _stakingToken, address _cvxCrv, address _cvxCrvStaking ) Ownable() { _name = _nameArg; _symbol = _symbolArg; _decimals = 18; stakingToken = IERC20(_stakingToken); cvxCrv = _cvxCrv; cvxcrvStaking = _cvxCrvStaking; uint256 currentEpoch = block.timestamp.div(rewardsDuration).mul(rewardsDuration); epochs.push(Epoch({ supply: 0, date: uint32(currentEpoch) })); } /*************************************** MODIFIER ****************************************/ modifier updateReward(address _account) { { Balances storage userBalance = balances[_account]; uint256 rewardTokensLength = rewardTokens.length; for (uint256 i = 0; i < rewardTokensLength; i++) { address token = rewardTokens[i]; uint256 newRewardPerToken = _rewardPerToken(token); rewardData[token].rewardPerTokenStored = newRewardPerToken.to96(); rewardData[token].lastUpdateTime = _lastTimeRewardApplicable(rewardData[token].periodFinish).to32(); if (_account != address(0)) { userData[_account][token] = UserData({ rewardPerTokenPaid: newRewardPerToken.to128(), rewards: _earned(_account, token, userBalance.locked).to128() }); } } } _; } modifier notBlacklisted(address _sender, address _receiver) { require(!blacklist[_sender], "blacklisted"); if (_sender != _receiver) { require(!blacklist[_receiver], "blacklisted"); } _; } /*************************************** ADMIN ****************************************/ function modifyBlacklist(address _account, bool _blacklisted) external onlyOwner { uint256 cs; // solhint-disable-next-line no-inline-assembly assembly { cs := extcodesize(_account) } require(cs != 0, "Must be contract"); blacklist[_account] = _blacklisted; emit BlacklistModified(_account, _blacklisted); } // Add a new reward token to be distributed to stakers function addReward(address _rewardsToken, address _distributor) external onlyOwner { require(rewardData[_rewardsToken].lastUpdateTime == 0, "Reward already exists"); require(_rewardsToken != address(stakingToken), "Cannot add StakingToken as reward"); require(rewardTokens.length < 5, "Max rewards length"); rewardTokens.push(_rewardsToken); rewardData[_rewardsToken].lastUpdateTime = uint32(block.timestamp); rewardData[_rewardsToken].periodFinish = uint32(block.timestamp); rewardDistributors[_rewardsToken][_distributor] = true; } // Modify approval for an address to call notifyRewardAmount function approveRewardDistributor( address _rewardsToken, address _distributor, bool _approved ) external onlyOwner { require(rewardData[_rewardsToken].lastUpdateTime > 0, "Reward does not exist"); rewardDistributors[_rewardsToken][_distributor] = _approved; } //set kick incentive function setKickIncentive(uint256 _rate, uint256 _delay) external onlyOwner { require(_rate <= 500, "over max rate"); //max 5% per epoch require(_delay >= 2, "min delay"); //minimum 2 epochs of grace kickRewardPerEpoch = _rate; kickRewardEpochDelay = _delay; emit KickIncentiveSet(_rate, _delay); } //shutdown the contract. unstake all tokens. release all locks function shutdown() external onlyOwner { isShutdown = true; emit Shutdown(); } // Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders function recoverERC20(address _tokenAddress, uint256 _tokenAmount) external onlyOwner { require(_tokenAddress != address(stakingToken), "Cannot withdraw staking token"); require(rewardData[_tokenAddress].lastUpdateTime == 0, "Cannot withdraw reward token"); IERC20(_tokenAddress).safeTransfer(owner(), _tokenAmount); emit Recovered(_tokenAddress, _tokenAmount); } // Set approvals for staking cvx and cvxcrv function setApprovals() external { IERC20(cvxCrv).safeApprove(cvxcrvStaking, 0); IERC20(cvxCrv).safeApprove(cvxcrvStaking, type(uint256).max); } /*************************************** ACTIONS ****************************************/ // Locked tokens cannot be withdrawn for lockDuration and are eligible to receive stakingReward rewards function lock(address _account, uint256 _amount) external nonReentrant updateReward(_account) { //pull tokens stakingToken.safeTransferFrom(msg.sender, address(this), _amount); //lock _lock(_account, _amount); } //lock tokens function _lock(address _account, uint256 _amount) internal notBlacklisted(msg.sender, _account) { require(_amount > 0, "Cannot stake 0"); require(!isShutdown, "shutdown"); Balances storage bal = balances[_account]; //must try check pointing epoch first _checkpointEpoch(); //add user balances uint112 lockAmount = _amount.to112(); bal.locked = bal.locked.add(lockAmount); //add to total supplies lockedSupply = lockedSupply.add(_amount); //add user lock records or add to current uint256 currentEpoch = block.timestamp.div(rewardsDuration).mul(rewardsDuration); uint256 unlockTime = currentEpoch.add(lockDuration); uint256 idx = userLocks[_account].length; if (idx == 0 || userLocks[_account][idx - 1].unlockTime < unlockTime) { userLocks[_account].push(LockedBalance({ amount: lockAmount, unlockTime: uint32(unlockTime) })); } else { LockedBalance storage userL = userLocks[_account][idx - 1]; userL.amount = userL.amount.add(lockAmount); } address delegatee = delegates(_account); if (delegatee != address(0)) { delegateeUnlocks[delegatee][unlockTime] += lockAmount; _checkpointDelegate(delegatee, lockAmount, 0); } //update epoch supply, epoch checkpointed above so safe to add to latest Epoch storage e = epochs[epochs.length - 1]; e.supply = e.supply.add(lockAmount); emit Staked(_account, lockAmount, lockAmount); } // claim all pending rewards function getReward(address _account) external { getReward(_account, false); } // Claim all pending rewards function getReward(address _account, bool _stake) public nonReentrant updateReward(_account) { uint256 rewardTokensLength = rewardTokens.length; for (uint256 i; i < rewardTokensLength; i++) { address _rewardsToken = rewardTokens[i]; uint256 reward = userData[_account][_rewardsToken].rewards; if (reward > 0) { userData[_account][_rewardsToken].rewards = 0; if (_rewardsToken == cvxCrv && _stake && _account == msg.sender) { IRewardStaking(cvxcrvStaking).stakeFor(_account, reward); } else { IERC20(_rewardsToken).safeTransfer(_account, reward); } emit RewardPaid(_account, _rewardsToken, reward); } } } function getReward(address _account, bool[] calldata _skipIdx) external nonReentrant updateReward(_account) { uint256 rewardTokensLength = rewardTokens.length; require(_skipIdx.length == rewardTokensLength, "!arr"); for (uint256 i; i < rewardTokensLength; i++) { if (_skipIdx[i]) continue; address _rewardsToken = rewardTokens[i]; uint256 reward = userData[_account][_rewardsToken].rewards; if (reward > 0) { userData[_account][_rewardsToken].rewards = 0; IERC20(_rewardsToken).safeTransfer(_account, reward); emit RewardPaid(_account, _rewardsToken, reward); } } } function checkpointEpoch() external { _checkpointEpoch(); } //insert a new epoch if needed. fill in any gaps function _checkpointEpoch() internal { uint256 currentEpoch = block.timestamp.div(rewardsDuration).mul(rewardsDuration); //first epoch add in constructor, no need to check 0 length //check to add uint256 nextEpochDate = uint256(epochs[epochs.length - 1].date); if (nextEpochDate < currentEpoch) { while (nextEpochDate != currentEpoch) { nextEpochDate = nextEpochDate.add(rewardsDuration); epochs.push(Epoch({ supply: 0, date: uint32(nextEpochDate) })); } } } // Withdraw/relock all currently locked tokens where the unlock time has passed function processExpiredLocks(bool _relock) external nonReentrant { _processExpiredLocks(msg.sender, _relock, msg.sender, 0); } function kickExpiredLocks(address _account) external nonReentrant { //allow kick after grace period of 'kickRewardEpochDelay' _processExpiredLocks(_account, false, msg.sender, rewardsDuration.mul(kickRewardEpochDelay)); } // Withdraw without checkpointing or accruing any rewards, providing system is shutdown function emergencyWithdraw() external nonReentrant { require(isShutdown, "Must be shutdown"); LockedBalance[] memory locks = userLocks[msg.sender]; Balances storage userBalance = balances[msg.sender]; uint256 amt = userBalance.locked; require(amt > 0, "Nothing locked"); userBalance.locked = 0; userBalance.nextUnlockIndex = locks.length.to32(); lockedSupply -= amt; emit Withdrawn(msg.sender, amt, false); stakingToken.safeTransfer(msg.sender, amt); } // Withdraw all currently locked tokens where the unlock time has passed function _processExpiredLocks( address _account, bool _relock, address _rewardAddress, uint256 _checkDelay ) internal updateReward(_account) { LockedBalance[] storage locks = userLocks[_account]; Balances storage userBalance = balances[_account]; uint112 locked; uint256 length = locks.length; uint256 reward = 0; uint256 expiryTime = _checkDelay == 0 && _relock ? block.timestamp.add(rewardsDuration) : block.timestamp.sub(_checkDelay); require(length > 0, "no locks"); // e.g. now = 16 // if contract is shutdown OR latest lock unlock time (e.g. 17) <= now - (1) // e.g. 17 <= (16 + 1) if (isShutdown || locks[length - 1].unlockTime <= expiryTime) { //if time is beyond last lock, can just bundle everything together locked = userBalance.locked; //dont delete, just set next index userBalance.nextUnlockIndex = length.to32(); //check for kick reward //this wont have the exact reward rate that you would get if looped through //but this section is supposed to be for quick and easy low gas processing of all locks //we'll assume that if the reward was good enough someone would have processed at an earlier epoch if (_checkDelay > 0) { uint256 currentEpoch = block.timestamp.sub(_checkDelay).div(rewardsDuration).mul(rewardsDuration); uint256 epochsover = currentEpoch.sub(uint256(locks[length - 1].unlockTime)).div(rewardsDuration); uint256 rRate = AuraMath.min(kickRewardPerEpoch.mul(epochsover + 1), denominator); reward = uint256(locked).mul(rRate).div(denominator); } } else { //use a processed index(nextUnlockIndex) to not loop as much //deleting does not change array length uint32 nextUnlockIndex = userBalance.nextUnlockIndex; for (uint256 i = nextUnlockIndex; i < length; i++) { //unlock time must be less or equal to time if (locks[i].unlockTime > expiryTime) break; //add to cumulative amounts locked = locked.add(locks[i].amount); //check for kick reward //each epoch over due increases reward if (_checkDelay > 0) { uint256 currentEpoch = block.timestamp.sub(_checkDelay).div(rewardsDuration).mul(rewardsDuration); uint256 epochsover = currentEpoch.sub(uint256(locks[i].unlockTime)).div(rewardsDuration); uint256 rRate = AuraMath.min(kickRewardPerEpoch.mul(epochsover + 1), denominator); reward = reward.add(uint256(locks[i].amount).mul(rRate).div(denominator)); } //set next unlock index nextUnlockIndex++; } //update next unlock index userBalance.nextUnlockIndex = nextUnlockIndex; } require(locked > 0, "no exp locks"); //update user balances and total supplies userBalance.locked = userBalance.locked.sub(locked); lockedSupply = lockedSupply.sub(locked); //checkpoint the delegatee _checkpointDelegate(delegates(_account), 0, 0); emit Withdrawn(_account, locked, _relock); //send process incentive if (reward > 0) { //reduce return amount by the kick reward locked = locked.sub(reward.to112()); //transfer reward stakingToken.safeTransfer(_rewardAddress, reward); emit KickReward(_rewardAddress, _account, reward); } //relock or return to user if (_relock) { _lock(_account, locked); } else { stakingToken.safeTransfer(_account, locked); } } /*************************************** DELEGATION & VOTE BALANCE ****************************************/ /** * @dev Delegate votes from the sender to `newDelegatee`. */ function delegate(address newDelegatee) external virtual nonReentrant { // Step 1: Get lock data LockedBalance[] storage locks = userLocks[msg.sender]; uint256 len = locks.length; require(len > 0, "Nothing to delegate"); require(newDelegatee != address(0), "Must delegate to someone"); // Step 2: Update delegatee storage address oldDelegatee = delegates(msg.sender); require(newDelegatee != oldDelegatee, "Must choose new delegatee"); _delegates[msg.sender] = newDelegatee; emit DelegateChanged(msg.sender, oldDelegatee, newDelegatee); // Step 3: Move balances around // Delegate for the upcoming epoch uint256 upcomingEpoch = block.timestamp.add(rewardsDuration).div(rewardsDuration).mul(rewardsDuration); uint256 i = len - 1; uint256 futureUnlocksSum = 0; LockedBalance memory currentLock = locks[i]; // Step 3.1: Add future unlocks and sum balances while (currentLock.unlockTime > upcomingEpoch) { futureUnlocksSum += currentLock.amount; if (oldDelegatee != address(0)) { delegateeUnlocks[oldDelegatee][currentLock.unlockTime] -= currentLock.amount; } delegateeUnlocks[newDelegatee][currentLock.unlockTime] += currentLock.amount; if (i > 0) { i--; currentLock = locks[i]; } else { break; } } // Step 3.2: Checkpoint old delegatee _checkpointDelegate(oldDelegatee, 0, futureUnlocksSum); // Step 3.3: Checkpoint new delegatee _checkpointDelegate(newDelegatee, futureUnlocksSum, 0); } function _checkpointDelegate( address _account, uint256 _upcomingAddition, uint256 _upcomingDeduction ) internal { // This would only skip on first checkpointing if (_account != address(0)) { uint256 upcomingEpoch = block.timestamp.add(rewardsDuration).div(rewardsDuration).mul(rewardsDuration); DelegateeCheckpoint[] storage ckpts = _checkpointedVotes[_account]; if (ckpts.length > 0) { DelegateeCheckpoint memory prevCkpt = ckpts[ckpts.length - 1]; // If there has already been a record for the upcoming epoch, no need to deduct the unlocks if (prevCkpt.epochStart == upcomingEpoch) { ckpts[ckpts.length - 1] = DelegateeCheckpoint({ votes: (prevCkpt.votes + _upcomingAddition - _upcomingDeduction).to224(), epochStart: upcomingEpoch.to32() }); } // else if it has been over 16 weeks since the previous checkpoint, all locks have since expired // e.g. week 1 + 17 <= 18 else if (prevCkpt.epochStart + lockDuration <= upcomingEpoch) { ckpts.push( DelegateeCheckpoint({ votes: (_upcomingAddition - _upcomingDeduction).to224(), epochStart: upcomingEpoch.to32() }) ); } else { uint256 nextEpoch = upcomingEpoch; uint256 unlocksSinceLatestCkpt = 0; // Should be maximum 18 iterations while (nextEpoch > prevCkpt.epochStart) { unlocksSinceLatestCkpt += delegateeUnlocks[_account][nextEpoch]; nextEpoch -= rewardsDuration; } ckpts.push( DelegateeCheckpoint({ votes: (prevCkpt.votes - unlocksSinceLatestCkpt + _upcomingAddition - _upcomingDeduction) .to224(), epochStart: upcomingEpoch.to32() }) ); } } else { ckpts.push( DelegateeCheckpoint({ votes: (_upcomingAddition - _upcomingDeduction).to224(), epochStart: upcomingEpoch.to32() }) ); } emit DelegateCheckpointed(_account); } } /** * @dev Get the address `account` is currently delegating to. */ function delegates(address account) public view virtual returns (address) { return _delegates[account]; } /** * @dev Gets the current votes balance for `account` */ function getVotes(address account) external view returns (uint256) { return getPastVotes(account, block.timestamp); } /** * @dev Get the `pos`-th checkpoint for `account`. */ function checkpoints(address account, uint32 pos) external view virtual returns (DelegateeCheckpoint memory) { return _checkpointedVotes[account][pos]; } /** * @dev Get number of checkpoints for `account`. */ function numCheckpoints(address account) external view virtual returns (uint32) { return _checkpointedVotes[account].length.to32(); } /** * @dev Retrieve the number of votes for `account` at the end of `blockNumber`. */ function getPastVotes(address account, uint256 timestamp) public view returns (uint256 votes) { require(timestamp <= block.timestamp, "ERC20Votes: block not yet mined"); uint256 epoch = timestamp.div(rewardsDuration).mul(rewardsDuration); DelegateeCheckpoint memory ckpt = _checkpointsLookup(_checkpointedVotes[account], epoch); votes = ckpt.votes; if (votes == 0 || ckpt.epochStart + lockDuration <= epoch) { return 0; } while (epoch > ckpt.epochStart) { votes -= delegateeUnlocks[account][epoch]; epoch -= rewardsDuration; } } /** * @dev Retrieve the `totalSupply` at the end of `timestamp`. Note, this value is the sum of all balances. * It is but NOT the sum of all the delegated votes! */ function getPastTotalSupply(uint256 timestamp) external view returns (uint256) { require(timestamp < block.timestamp, "ERC20Votes: block not yet mined"); return totalSupplyAtEpoch(findEpochId(timestamp)); } /** * @dev Lookup a value in a list of (sorted) checkpoints. * Copied from oz/ERC20Votes.sol */ function _checkpointsLookup(DelegateeCheckpoint[] storage ckpts, uint256 epochStart) private view returns (DelegateeCheckpoint memory) { uint256 high = ckpts.length; uint256 low = 0; while (low < high) { uint256 mid = AuraMath.average(low, high); if (ckpts[mid].epochStart > epochStart) { high = mid; } else { low = mid + 1; } } return high == 0 ? DelegateeCheckpoint(0, 0) : ckpts[high - 1]; } /*************************************** VIEWS - BALANCES ****************************************/ // Balance of an account which only includes properly locked tokens as of the most recent eligible epoch function balanceOf(address _user) external view returns (uint256 amount) { return balanceAtEpochOf(findEpochId(block.timestamp), _user); } // Balance of an account which only includes properly locked tokens at the given epoch function balanceAtEpochOf(uint256 _epoch, address _user) public view returns (uint256 amount) { uint256 epochStart = uint256(epochs[0].date).add(uint256(_epoch).mul(rewardsDuration)); require(epochStart < block.timestamp, "Epoch is in the future"); uint256 cutoffEpoch = epochStart.sub(lockDuration); LockedBalance[] storage locks = userLocks[_user]; //need to add up since the range could be in the middle somewhere //traverse inversely to make more current queries more gas efficient uint256 locksLength = locks.length; for (uint256 i = locksLength; i > 0; i--) { uint256 lockEpoch = uint256(locks[i - 1].unlockTime).sub(lockDuration); //lock epoch must be less or equal to the epoch we're basing from. //also not include the current epoch if (lockEpoch < epochStart) { if (lockEpoch > cutoffEpoch) { amount = amount.add(locks[i - 1].amount); } else { //stop now as no futher checks matter break; } } } return amount; } // Information on a user's locked balances function lockedBalances(address _user) external view returns ( uint256 total, uint256 unlockable, uint256 locked, LockedBalance[] memory lockData ) { LockedBalance[] storage locks = userLocks[_user]; Balances storage userBalance = balances[_user]; uint256 nextUnlockIndex = userBalance.nextUnlockIndex; uint256 idx; for (uint256 i = nextUnlockIndex; i < locks.length; i++) { if (locks[i].unlockTime > block.timestamp) { if (idx == 0) { lockData = new LockedBalance[](locks.length - i); } lockData[idx] = locks[i]; idx++; locked = locked.add(locks[i].amount); } else { unlockable = unlockable.add(locks[i].amount); } } return (userBalance.locked, unlockable, locked, lockData); } // Supply of all properly locked balances at most recent eligible epoch function totalSupply() external view returns (uint256 supply) { return totalSupplyAtEpoch(findEpochId(block.timestamp)); } // Supply of all properly locked balances at the given epoch function totalSupplyAtEpoch(uint256 _epoch) public view returns (uint256 supply) { uint256 epochStart = uint256(epochs[0].date).add(uint256(_epoch).mul(rewardsDuration)); require(epochStart < block.timestamp, "Epoch is in the future"); uint256 cutoffEpoch = epochStart.sub(lockDuration); uint256 lastIndex = epochs.length - 1; uint256 epochIndex = _epoch > lastIndex ? lastIndex : _epoch; for (uint256 i = epochIndex + 1; i > 0; i--) { Epoch memory e = epochs[i - 1]; if (e.date == epochStart) { continue; } else if (e.date <= cutoffEpoch) { break; } else { supply += e.supply; } } } // Get an epoch index based on timestamp function findEpochId(uint256 _time) public view returns (uint256 epoch) { return _time.sub(epochs[0].date).div(rewardsDuration); } /*************************************** VIEWS - GENERAL ****************************************/ // Number of epochs function epochCount() external view returns (uint256) { return epochs.length; } function decimals() external view returns (uint8) { return _decimals; } function name() external view returns (string memory) { return _name; } function symbol() external view returns (string memory) { return _symbol; } /*************************************** VIEWS - REWARDS ****************************************/ // Address and claimable amount of all reward tokens for the given account function claimableRewards(address _account) external view returns (EarnedData[] memory userRewards) { userRewards = new EarnedData[](rewardTokens.length); Balances storage userBalance = balances[_account]; uint256 userRewardsLength = userRewards.length; for (uint256 i = 0; i < userRewardsLength; i++) { address token = rewardTokens[i]; userRewards[i].token = token; userRewards[i].amount = _earned(_account, token, userBalance.locked); } return userRewards; } function lastTimeRewardApplicable(address _rewardsToken) external view returns (uint256) { return _lastTimeRewardApplicable(rewardData[_rewardsToken].periodFinish); } function rewardPerToken(address _rewardsToken) external view returns (uint256) { return _rewardPerToken(_rewardsToken); } function _earned( address _user, address _rewardsToken, uint256 _balance ) internal view returns (uint256) { UserData memory data = userData[_user][_rewardsToken]; return _balance.mul(_rewardPerToken(_rewardsToken).sub(data.rewardPerTokenPaid)).div(1e18).add(data.rewards); } function _lastTimeRewardApplicable(uint256 _finishTime) internal view returns (uint256) { return AuraMath.min(block.timestamp, _finishTime); } function _rewardPerToken(address _rewardsToken) internal view returns (uint256) { if (lockedSupply == 0) { return rewardData[_rewardsToken].rewardPerTokenStored; } return uint256(rewardData[_rewardsToken].rewardPerTokenStored).add( _lastTimeRewardApplicable(rewardData[_rewardsToken].periodFinish) .sub(rewardData[_rewardsToken].lastUpdateTime) .mul(rewardData[_rewardsToken].rewardRate) .mul(1e18) .div(lockedSupply) ); } /*************************************** REWARD FUNDING ****************************************/ function queueNewRewards(address _rewardsToken, uint256 _rewards) external nonReentrant { require(rewardDistributors[_rewardsToken][msg.sender], "!authorized"); require(_rewards > 0, "No reward"); RewardData storage rdata = rewardData[_rewardsToken]; IERC20(_rewardsToken).safeTransferFrom(msg.sender, address(this), _rewards); _rewards = _rewards.add(queuedRewards[_rewardsToken]); require(_rewards < 1e25, "!rewards"); if (block.timestamp >= rdata.periodFinish) { _notifyReward(_rewardsToken, _rewards); queuedRewards[_rewardsToken] = 0; return; } //et = now - (finish-duration) uint256 elapsedTime = block.timestamp.sub(rdata.periodFinish.sub(rewardsDuration.to32())); //current at now: rewardRate * elapsedTime uint256 currentAtNow = rdata.rewardRate * elapsedTime; uint256 queuedRatio = currentAtNow.mul(1000).div(_rewards); if (queuedRatio < newRewardRatio) { _notifyReward(_rewardsToken, _rewards); queuedRewards[_rewardsToken] = 0; } else { queuedRewards[_rewardsToken] = _rewards; } } function _notifyReward(address _rewardsToken, uint256 _reward) internal updateReward(address(0)) { RewardData storage rdata = rewardData[_rewardsToken]; if (block.timestamp >= rdata.periodFinish) { rdata.rewardRate = _reward.div(rewardsDuration).to96(); } else { uint256 remaining = uint256(rdata.periodFinish).sub(block.timestamp); uint256 leftover = remaining.mul(rdata.rewardRate); rdata.rewardRate = _reward.add(leftover).div(rewardsDuration).to96(); } // Equivalent to 10 million tokens over a weeks duration require(rdata.rewardRate < 1e20, "!rewardRate"); require(lockedSupply >= 1e20, "!balance"); rdata.lastUpdateTime = block.timestamp.to32(); rdata.periodFinish = block.timestamp.add(rewardsDuration).to32(); emit RewardAdded(_rewardsToken, _reward); } } // File contracts/interfaces/balancer/IBalancerCore.sol pragma solidity 0.8.11; interface IPriceOracle { struct OracleAverageQuery { Variable variable; uint256 secs; uint256 ago; } enum Variable { PAIR_PRICE, BPT_PRICE, INVARIANT } function getTimeWeightedAverage(OracleAverageQuery[] memory queries) external view returns (uint256[] memory results); } interface IBalancerVault { enum PoolSpecialization { GENERAL, MINIMAL_SWAP_INFO, TWO_TOKEN } enum JoinKind { INIT, EXACT_TOKENS_IN_FOR_BPT_OUT, TOKEN_IN_FOR_EXACT_BPT_OUT, ALL_TOKENS_IN_FOR_EXACT_BPT_OUT } enum SwapKind { GIVEN_IN, GIVEN_OUT } struct BatchSwapStep { bytes32 poolId; uint256 assetInIndex; uint256 assetOutIndex; uint256 amount; bytes userData; } function batchSwap( SwapKind kind, BatchSwapStep[] memory swaps, IAsset[] memory assets, FundManagement memory funds, int256[] memory limits, uint256 deadline ) external payable returns (int256[] memory); struct SingleSwap { bytes32 poolId; SwapKind kind; IAsset assetIn; IAsset assetOut; uint256 amount; bytes userData; } struct FundManagement { address sender; bool fromInternalBalance; address payable recipient; bool toInternalBalance; } struct JoinPoolRequest { IAsset[] assets; uint256[] maxAmountsIn; bytes userData; bool fromInternalBalance; } function getPool(bytes32 poolId) external view returns (address, PoolSpecialization); function getPoolTokens(bytes32 poolId) external view returns ( address[] memory tokens, uint256[] memory balances, uint256 lastChangeBlock ); function joinPool( bytes32 poolId, address sender, address recipient, JoinPoolRequest memory request ) external payable; function swap( SingleSwap memory singleSwap, FundManagement memory funds, uint256 limit, uint256 deadline ) external returns (uint256 amountCalculated); function exitPool( bytes32 poolId, address sender, address payable recipient, ExitPoolRequest memory request ) external; function getInternalBalance(address user, address[] memory tokens) external view returns (uint256[] memory); function queryBatchSwap( SwapKind kind, BatchSwapStep[] memory swaps, IAsset[] memory assets, FundManagement memory funds ) external returns (int256[] memory assetDeltas); struct ExitPoolRequest { IAsset[] assets; uint256[] minAmountsOut; bytes userData; bool toInternalBalance; } enum ExitKind { EXACT_BPT_IN_FOR_ONE_TOKEN_OUT, EXACT_BPT_IN_FOR_TOKENS_OUT, BPT_IN_FOR_EXACT_TOKENS_OUT, MANAGEMENT_FEE_TOKENS_OUT // for ManagedPool } } interface IAsset { // solhint-disable-previous-line no-empty-blocks } interface IBalancerPool { function getPoolId() external view returns (bytes32); function getNormalizedWeights() external view returns (uint256[] memory); function getSwapEnabled() external view returns (bool); function getOwner() external view returns (address); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); } interface ILBPFactory { function create( string memory name, string memory symbol, IERC20[] memory tokens, uint256[] memory weights, uint256 swapFeePercentage, address owner, bool swapEnabledOnStart ) external returns (address); } interface ILBP { function setSwapEnabled(bool swapEnabled) external; function updateWeightsGradually( uint256 startTime, uint256 endTime, uint256[] memory endWeights ) external; function getGradualWeightUpdateParams() external view returns ( uint256 startTime, uint256 endTime, uint256[] memory endWeights ); } interface IStablePoolFactory { function create( string memory name, string memory symbol, IERC20[] memory tokens, uint256 amplificationParameter, uint256 swapFeePercentage, address owner ) external returns (address); } interface IWeightedPool2TokensFactory { function create( string memory name, string memory symbol, IERC20[] memory tokens, uint256[] memory weights, uint256 swapFeePercentage, bool oracleEnabled, address owner ) external returns (address); } interface IRateProvider { function getRate() external view returns (uint256); } interface IWeightedPoolFactory { /** * @dev Deploys a new `WeightedPool`. */ function create( string memory name, string memory symbol, IERC20[] memory tokens, uint256[] memory normalizedWeights, IRateProvider[] memory rateProviders, uint256 swapFeePercentage, address owner ) external returns (address); } interface IWeightedPoolFactoryV2 { /** * @dev Deploys a new `WeightedPool`. */ function create( string memory name, string memory symbol, IERC20[] memory tokens, uint256[] memory normalizedWeights, uint256 swapFeePercentage, address owner ) external returns (address); } // File contracts/interfaces/IAuraBalVault.sol pragma solidity 0.8.11; interface IAuraBalVault { function underlying() external view returns (address); function withdrawalPenalty() external view returns (uint256); function extraRewards(uint256 index) external view returns (address); function extraRewardsLength() external view returns (uint256); function totalUnderlying() external view returns (uint256); function balanceOf(address user) external view returns (uint256); function balanceOfUnderlying(address user) external view returns (uint256); function totalSupply() external view returns (uint256); } // File contracts/interfaces/IBoosterLite.sol pragma solidity 0.8.11; interface IBoosterLite { struct PoolInfo { address lptoken; address token; address gauge; address crvRewards; address stash; bool shutdown; } function earmarkRewards(uint256 _pid, address _zroPaymentAddress) external payable returns (bool); function poolLength() external view returns (uint256); function poolInfo(uint256 _pid) external view returns (PoolInfo memory poolInfo); function lockIncentive() external view returns (uint256); function stakerIncentive() external view returns (uint256); function earmarkIncentive() external view returns (uint256); function platformFee() external view returns (uint256); function FEE_DENOMINATOR() external view returns (uint256); } // File contracts/peripheral/AuraViewHelpersLite.sol pragma solidity 0.8.11; /** * @title AuraViewHelpersLite * @author AuraFinance * @notice View-only contract to combine calls for sidechain deployments * @dev IMPORTANT: These functions are extremely gas-intensive and should not be called from within a transaction. */ contract AuraViewHelpersLite { IBalancerVault public immutable balancerVault = IBalancerVault(0xBA12222222228d8Ba445958a75a0704d566BF2C8); struct Token { address addr; uint8 decimals; string symbol; string name; } struct Pool { uint256 pid; address lptoken; address token; address gauge; address crvRewards; address stash; bool shutdown; address rewardToken; bytes32 poolId; uint256[] normalizedWeights; address[] poolTokens; uint256[] underlying; uint256 totalSupply; uint256 bptTotalSupply; RewardsData rewardsData; ExtraRewards[] extraRewards; } struct Vault { address addr; address underlying; uint256 totalUnderlying; uint256 totalSupply; uint256 withdrawalPenalty; ExtraRewards[] extraRewards; } struct VaultAccount { address addr; uint256 balance; uint256 balanceOfUnderlying; uint256[] extraRewardsEarned; } struct RewardsData { uint256 periodFinish; uint256 lastUpdateTime; uint256 rewardRate; uint256 rewardPerTokenStored; uint256 queuedRewards; } struct ExtraRewards { address addr; address rewardsToken; RewardsData rewardsData; } struct PoolBalances { uint256 pid; uint256 earned; uint256[] extraRewardsEarned; uint256 staked; } function getVault(address _vault) external view returns (Vault memory vault) { IAuraBalVault auraBalVault = IAuraBalVault(_vault); address underlying = auraBalVault.underlying(); uint256 totalUnderlying = auraBalVault.totalUnderlying(); uint256 totalSupply = auraBalVault.totalSupply(); uint256 withdrawPenalty = auraBalVault.withdrawalPenalty(); ExtraRewards[] memory extraRewards = getExtraRewards(_vault); vault = Vault({ addr: _vault, underlying: underlying, totalUnderlying: totalUnderlying, totalSupply: totalSupply, withdrawalPenalty: withdrawPenalty, extraRewards: extraRewards }); } function getVaultAccount(address _vault, address _account) external view returns (VaultAccount memory vaultAccount) { IAuraBalVault auraBalVault = IAuraBalVault(_vault); uint256 balance = auraBalVault.balanceOf(_account); uint256 balanceOfUnderlying = auraBalVault.balanceOfUnderlying(_account); uint256 extraRewardsLength = auraBalVault.extraRewardsLength(); uint256[] memory extraRewardsEarned = new uint256[](extraRewardsLength); for (uint256 i = 0; i < extraRewardsLength; i++) { IBaseRewardPool extraRewardsPool = IBaseRewardPool(auraBalVault.extraRewards(i)); extraRewardsEarned[i] = extraRewardsPool.earned(_account); } vaultAccount = VaultAccount({ addr: _account, balance: balance, balanceOfUnderlying: balanceOfUnderlying, extraRewardsEarned: extraRewardsEarned }); } function getPools(address _booster) external view returns (Pool[] memory) { IBoosterLite booster = IBoosterLite(_booster); uint256 poolLength = booster.poolLength(); Pool[] memory pools = new Pool[](poolLength); for (uint256 i = 0; i < poolLength; i++) { IBoosterLite.PoolInfo memory poolInfo = booster.poolInfo(i); pools[i] = getPool(poolInfo, i); } return pools; } function getCvxCrvRewards(address _cvxCrvRewards) public view returns (Pool memory) { IBaseRewardPool pool = IBaseRewardPool(_cvxCrvRewards); address cvxCrv = pool.stakingToken(); uint256[] memory normalizedWeights = new uint256[](1); normalizedWeights[0] = 1; address[] memory poolTokens = new address[](1); poolTokens[0] = cvxCrv; uint256[] memory underlying = new uint256[](1); underlying[0] = IERC20Detailed(cvxCrv).balanceOf(_cvxCrvRewards); RewardsData memory rewardsData = RewardsData({ rewardRate: pool.rewardRate(), periodFinish: pool.periodFinish(), lastUpdateTime: pool.lastUpdateTime(), rewardPerTokenStored: pool.rewardPerTokenStored(), queuedRewards: pool.queuedRewards() }); ExtraRewards[] memory extraRewards = getExtraRewards(_cvxCrvRewards); return Pool({ pid: uint256(0), lptoken: cvxCrv, token: cvxCrv, gauge: address(0), crvRewards: _cvxCrvRewards, stash: address(0), shutdown: false, rewardToken: pool.rewardToken(), poolId: bytes32(0), normalizedWeights: normalizedWeights, poolTokens: poolTokens, underlying: underlying, rewardsData: rewardsData, extraRewards: extraRewards, totalSupply: pool.totalSupply(), bptTotalSupply: 0 }); } function getExtraRewards(address _baseRewardPool) internal view returns (ExtraRewards[] memory) { IBaseRewardPool baseRewardPool = IBaseRewardPool(_baseRewardPool); uint256 extraRewardsLength = baseRewardPool.extraRewardsLength(); ExtraRewards[] memory extraRewards = new ExtraRewards[](extraRewardsLength); for (uint256 i = 0; i < extraRewardsLength; i++) { address addr = baseRewardPool.extraRewards(i); IBaseRewardPool extraRewardsPool = IBaseRewardPool(addr); RewardsData memory data = RewardsData({ rewardRate: extraRewardsPool.rewardRate(), periodFinish: extraRewardsPool.periodFinish(), lastUpdateTime: extraRewardsPool.lastUpdateTime(), rewardPerTokenStored: extraRewardsPool.rewardPerTokenStored(), queuedRewards: extraRewardsPool.queuedRewards() }); extraRewards[i] = ExtraRewards({ addr: addr, rewardsData: data, rewardsToken: extraRewardsPool.rewardToken() }); } return extraRewards; } function getPool(IBoosterLite.PoolInfo memory poolInfo, uint256 _pid) public view returns (Pool memory) { IBaseRewardPool rewardPool = IBaseRewardPool(poolInfo.crvRewards); IBalancerPool balancerPool = IBalancerPool(poolInfo.lptoken); // Some pools were added to the Booster without valid LP tokens; // we need to try/catch all of these calls as a result. bytes32 poolId; uint256[] memory normalizedWeights; address[] memory poolTokens; uint256[] memory underlying; try balancerPool.getPoolId() returns (bytes32 fetchedPoolId) { poolId = fetchedPoolId; (poolTokens, underlying, ) = balancerVault.getPoolTokens(poolId); try balancerPool.getNormalizedWeights() returns (uint256[] memory weights) { normalizedWeights = weights; } catch { normalizedWeights = new uint256[](0); } } catch { poolId = bytes32(0); poolTokens = new address[](0); underlying = new uint256[](0); normalizedWeights = new uint256[](0); } ExtraRewards[] memory extraRewards = getExtraRewards(poolInfo.crvRewards); RewardsData memory rewardsData = RewardsData({ rewardRate: rewardPool.rewardRate(), periodFinish: rewardPool.periodFinish(), lastUpdateTime: rewardPool.lastUpdateTime(), rewardPerTokenStored: rewardPool.rewardPerTokenStored(), queuedRewards: rewardPool.queuedRewards() }); return Pool({ pid: _pid, lptoken: poolInfo.lptoken, token: poolInfo.token, gauge: poolInfo.gauge, crvRewards: poolInfo.crvRewards, stash: poolInfo.stash, shutdown: poolInfo.shutdown, rewardToken: rewardPool.rewardToken(), poolId: poolId, normalizedWeights: normalizedWeights, poolTokens: poolTokens, underlying: underlying, rewardsData: rewardsData, extraRewards: extraRewards, totalSupply: rewardPool.totalSupply(), bptTotalSupply: balancerPool.totalSupply() }); } function getPoolsBalances(address _booster, address _account) external view returns (PoolBalances[] memory) { uint256 poolLength = IBoosterLite(_booster).poolLength(); PoolBalances[] memory balances = new PoolBalances[](poolLength); for (uint256 i = 0; i < poolLength; i++) { IBoosterLite.PoolInfo memory poolInfo = IBoosterLite(_booster).poolInfo(i); balances[i] = getPoolBalances(poolInfo.crvRewards, i, _account); } return balances; } function getPoolBalances( address _rewardPool, uint256 _pid, address _account ) public view returns (PoolBalances memory) { IBaseRewardPool pool = IBaseRewardPool(_rewardPool); uint256 staked = pool.balanceOf(_account); uint256 earned = pool.earned(_account); uint256 extraRewardsLength = pool.extraRewardsLength(); uint256[] memory extraRewardsEarned = new uint256[](extraRewardsLength); for (uint256 i = 0; i < extraRewardsLength; i++) { IBaseRewardPool extraRewardsPool = IBaseRewardPool(pool.extraRewards(i)); extraRewardsEarned[i] = extraRewardsPool.earned(_account); } return PoolBalances({ pid: _pid, staked: staked, earned: earned, extraRewardsEarned: extraRewardsEarned }); } function getTokens(address[] memory _addresses) public view returns (Token[] memory) { uint256 length = _addresses.length; Token[] memory tokens = new Token[](length); for (uint256 i = 0; i < length; i++) { address addr = _addresses[i]; IERC20Detailed token = IERC20Detailed(addr); uint8 decimals; try token.decimals() { decimals = token.decimals(); } catch { decimals = 0; } tokens[i] = Token({ addr: addr, decimals: decimals, symbol: token.symbol(), name: token.name() }); } return tokens; } function getEarmarkingReward( uint256 pool, address booster, address token ) public returns (uint256 pending) { uint256 start = IERC20Detailed(token).balanceOf(address(this)); IBoosterLite(booster).earmarkRewards(pool, address(0)); pending = IERC20Detailed(token).balanceOf(address(this)) - start; } function getMultipleEarmarkingRewards( uint256[] memory pools, address booster, address token ) external returns (uint256[] memory pendings) { pendings = new uint256[](pools.length); for (uint256 i = 0; i < pools.length; i++) { pendings[i] = getEarmarkingReward(pools[i], booster, token); } } } interface IBaseRewardPool { function extraRewards(uint256 index) external view returns (address rewards); function extraRewardsLength() external view returns (uint256); function lastUpdateTime() external view returns (uint256); function periodFinish() external view returns (uint256); function pid() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function earned(address owner) external view returns (uint256); function queuedRewards() external view returns (uint256); function rewardPerTokenStored() external view returns (uint256); function rewardRate() external view returns (uint256); function totalSupply() external view returns (uint256); function rewardToken() external view returns (address); function stakingToken() external view returns (address); } interface IERC20Detailed { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"balancerVault","outputs":[{"internalType":"contract IBalancerVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_cvxCrvRewards","type":"address"}],"name":"getCvxCrvRewards","outputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"lptoken","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"gauge","type":"address"},{"internalType":"address","name":"crvRewards","type":"address"},{"internalType":"address","name":"stash","type":"address"},{"internalType":"bool","name":"shutdown","type":"bool"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"uint256[]","name":"normalizedWeights","type":"uint256[]"},{"internalType":"address[]","name":"poolTokens","type":"address[]"},{"internalType":"uint256[]","name":"underlying","type":"uint256[]"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"bptTotalSupply","type":"uint256"},{"components":[{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"},{"internalType":"uint256","name":"queuedRewards","type":"uint256"}],"internalType":"struct AuraViewHelpersLite.RewardsData","name":"rewardsData","type":"tuple"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"address","name":"rewardsToken","type":"address"},{"components":[{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"},{"internalType":"uint256","name":"queuedRewards","type":"uint256"}],"internalType":"struct AuraViewHelpersLite.RewardsData","name":"rewardsData","type":"tuple"}],"internalType":"struct AuraViewHelpersLite.ExtraRewards[]","name":"extraRewards","type":"tuple[]"}],"internalType":"struct AuraViewHelpersLite.Pool","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pool","type":"uint256"},{"internalType":"address","name":"booster","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getEarmarkingReward","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pools","type":"uint256[]"},{"internalType":"address","name":"booster","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getMultipleEarmarkingRewards","outputs":[{"internalType":"uint256[]","name":"pendings","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"lptoken","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"gauge","type":"address"},{"internalType":"address","name":"crvRewards","type":"address"},{"internalType":"address","name":"stash","type":"address"},{"internalType":"bool","name":"shutdown","type":"bool"}],"internalType":"struct IBoosterLite.PoolInfo","name":"poolInfo","type":"tuple"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPool","outputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"lptoken","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"gauge","type":"address"},{"internalType":"address","name":"crvRewards","type":"address"},{"internalType":"address","name":"stash","type":"address"},{"internalType":"bool","name":"shutdown","type":"bool"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"uint256[]","name":"normalizedWeights","type":"uint256[]"},{"internalType":"address[]","name":"poolTokens","type":"address[]"},{"internalType":"uint256[]","name":"underlying","type":"uint256[]"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"bptTotalSupply","type":"uint256"},{"components":[{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"},{"internalType":"uint256","name":"queuedRewards","type":"uint256"}],"internalType":"struct AuraViewHelpersLite.RewardsData","name":"rewardsData","type":"tuple"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"address","name":"rewardsToken","type":"address"},{"components":[{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"},{"internalType":"uint256","name":"queuedRewards","type":"uint256"}],"internalType":"struct AuraViewHelpersLite.RewardsData","name":"rewardsData","type":"tuple"}],"internalType":"struct AuraViewHelpersLite.ExtraRewards[]","name":"extraRewards","type":"tuple[]"}],"internalType":"struct AuraViewHelpersLite.Pool","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardPool","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"getPoolBalances","outputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"earned","type":"uint256"},{"internalType":"uint256[]","name":"extraRewardsEarned","type":"uint256[]"},{"internalType":"uint256","name":"staked","type":"uint256"}],"internalType":"struct AuraViewHelpersLite.PoolBalances","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_booster","type":"address"}],"name":"getPools","outputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"lptoken","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"gauge","type":"address"},{"internalType":"address","name":"crvRewards","type":"address"},{"internalType":"address","name":"stash","type":"address"},{"internalType":"bool","name":"shutdown","type":"bool"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"uint256[]","name":"normalizedWeights","type":"uint256[]"},{"internalType":"address[]","name":"poolTokens","type":"address[]"},{"internalType":"uint256[]","name":"underlying","type":"uint256[]"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"bptTotalSupply","type":"uint256"},{"components":[{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"},{"internalType":"uint256","name":"queuedRewards","type":"uint256"}],"internalType":"struct AuraViewHelpersLite.RewardsData","name":"rewardsData","type":"tuple"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"address","name":"rewardsToken","type":"address"},{"components":[{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"},{"internalType":"uint256","name":"queuedRewards","type":"uint256"}],"internalType":"struct AuraViewHelpersLite.RewardsData","name":"rewardsData","type":"tuple"}],"internalType":"struct AuraViewHelpersLite.ExtraRewards[]","name":"extraRewards","type":"tuple[]"}],"internalType":"struct AuraViewHelpersLite.Pool[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_booster","type":"address"},{"internalType":"address","name":"_account","type":"address"}],"name":"getPoolsBalances","outputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"earned","type":"uint256"},{"internalType":"uint256[]","name":"extraRewardsEarned","type":"uint256[]"},{"internalType":"uint256","name":"staked","type":"uint256"}],"internalType":"struct AuraViewHelpersLite.PoolBalances[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"getTokens","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"}],"internalType":"struct AuraViewHelpersLite.Token[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"getVault","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"totalUnderlying","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"withdrawalPenalty","type":"uint256"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"address","name":"rewardsToken","type":"address"},{"components":[{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"},{"internalType":"uint256","name":"queuedRewards","type":"uint256"}],"internalType":"struct AuraViewHelpersLite.RewardsData","name":"rewardsData","type":"tuple"}],"internalType":"struct AuraViewHelpersLite.ExtraRewards[]","name":"extraRewards","type":"tuple[]"}],"internalType":"struct AuraViewHelpersLite.Vault","name":"vault","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_account","type":"address"}],"name":"getVaultAccount","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"balanceOfUnderlying","type":"uint256"},{"internalType":"uint256[]","name":"extraRewardsEarned","type":"uint256[]"}],"internalType":"struct AuraViewHelpersLite.VaultAccount","name":"vaultAccount","type":"tuple"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405273ba12222222228d8ba445958a75a0704d566bf2c873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801561005757600080fd5b5060805161430761007a600039600081816104fa015261108c01526143076000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80634cf4c36a116100715780634cf4c36a1461018c5780635c39f467146101bc5780637f5f53d1146101ec5780639b9e09551461021c578063c025d1a51461024c578063eda242901461027c576100a9565b80630eb9af38146100ae578063158274a5146100de5780631fbf73ac146100fc578063273a94aa1461012c5780633e3dcce81461015c575b600080fd5b6100c860048036038101906100c39190612a09565b6102ac565b6040516100d59190612c40565b60405180910390f35b6100e66104f8565b6040516100f39190612cc1565b60405180910390f35b61011660048036038101906101119190612d08565b61051c565b6040516101239190612d6a565b60405180910390f35b61014660048036038101906101419190612ede565b6106aa565b60405161015391906130f7565b60405180910390f35b61017660048036038101906101719190613119565b610982565b604051610183919061327e565b60405180910390f35b6101a660048036038101906101a19190613363565b610caf565b6040516101b39190613441565b60405180910390f35b6101d660048036038101906101d19190612a09565b610d68565b6040516101e39190613775565b60405180910390f35b61020660048036038101906102019190613868565b610f0b565b6040516102139190613a15565b60405180910390f35b61023660048036038101906102319190613a37565b6116bf565b6040516102439190613b9c565b60405180910390f35b61026660048036038101906102619190613a37565b611862565b6040516102739190613c21565b60405180910390f35b61029660048036038101906102919190612a09565b611ba5565b6040516102a39190613a15565b60405180910390f35b6102b4612700565b600082905060008173ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610306573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032a9190613c58565b905060008273ffffffffffffffffffffffffffffffffffffffff1663c70920bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039d9190613c9a565b905060008373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104109190613c9a565b905060008473ffffffffffffffffffffffffffffffffffffffff1663a2468c196040518163ffffffff1660e01b8152600401602060405180830381865afa15801561045f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104839190613c9a565b905060006104908861225a565b90506040518060c001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001838152602001828152509650505050505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000808273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105589190613cd6565b602060405180830381865afa158015610575573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105999190613c9a565b90508373ffffffffffffffffffffffffffffffffffffffff16637979426b8660006040518363ffffffff1660e01b81526004016105d7929190613cf1565b6020604051808303816000875af11580156105f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061a9190613d2f565b50808373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106559190613cd6565b602060405180830381865afa158015610672573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106969190613c9a565b6106a09190613d8b565b9150509392505050565b606060008251905060008167ffffffffffffffff8111156106ce576106cd612d9b565b5b60405190808252806020026020018201604052801561070757816020015b6106f4612762565b8152602001906001900390816106ec5790505b50905060005b8281101561097757600085828151811061072a57610729613dbf565b5b60200260200101519050600081905060008173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156107a357506040513d601f19601f820116820180604052508101906107a09190613e1a565b60015b6107b05760009050610823565b508173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108209190613e1a565b90505b60405180608001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1681526020018373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801561089e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108c79190613eed565b81526020018373ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610917573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109409190613eed565b81525085858151811061095657610955613dbf565b5b6020026020010181905250505050808061096f90613f36565b91505061070d565b508092505050919050565b61098a6127a3565b600084905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016109ca9190613cd6565b602060405180830381865afa1580156109e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0b9190613c9a565b905060008273ffffffffffffffffffffffffffffffffffffffff16628cc262866040518263ffffffff1660e01b8152600401610a479190613cd6565b602060405180830381865afa158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190613c9a565b905060008373ffffffffffffffffffffffffffffffffffffffff1663d55a23f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afb9190613c9a565b905060008167ffffffffffffffff811115610b1957610b18612d9b565b5b604051908082528060200260200182016040528015610b475781602001602082028036833780820191505090505b50905060005b82811015610c7f5760008673ffffffffffffffffffffffffffffffffffffffff166340c35446836040518263ffffffff1660e01b8152600401610b909190612d6a565b602060405180830381865afa158015610bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd19190613c58565b90508073ffffffffffffffffffffffffffffffffffffffff16628cc2628a6040518263ffffffff1660e01b8152600401610c0b9190613cd6565b602060405180830381865afa158015610c28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4c9190613c9a565b838381518110610c5f57610c5e613dbf565b5b602002602001018181525050508080610c7790613f36565b915050610b4d565b50604051806080016040528089815260200184815260200182815260200185815250955050505050509392505050565b6060835167ffffffffffffffff811115610ccc57610ccb612d9b565b5b604051908082528060200260200182016040528015610cfa5781602001602082028036833780820191505090505b50905060005b8451811015610d6057610d2e858281518110610d1f57610d1e613dbf565b5b6020026020010151858561051c565b828281518110610d4157610d40613dbf565b5b6020026020010181815250508080610d5890613f36565b915050610d00565b509392505050565b6060600082905060008173ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de09190613c9a565b905060008167ffffffffffffffff811115610dfe57610dfd612d9b565b5b604051908082528060200260200182016040528015610e3757816020015b610e246127cb565b815260200190600190039081610e1c5790505b50905060005b82811015610eff5760008473ffffffffffffffffffffffffffffffffffffffff16631526fe27836040518263ffffffff1660e01b8152600401610e809190612d6a565b60c060405180830381865afa158015610e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec1919061401f565b9050610ecd8183610f0b565b838381518110610ee057610edf613dbf565b5b6020026020010181905250508080610ef790613f36565b915050610e3d565b50809350505050919050565b610f136127cb565b600083606001519050600084600001519050600060608060608473ffffffffffffffffffffffffffffffffffffffff166338fff2d06040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f9457506040513d601f19601f82011682018060405250810190610f919190614078565b60015b611087576000801b9350600067ffffffffffffffff811115610fb957610fb8612d9b565b5b604051908082528060200260200182016040528015610fe75781602001602082028036833780820191505090505b509150600067ffffffffffffffff81111561100557611004612d9b565b5b6040519080825280602002602001820160405280156110335781602001602082028036833780820191505090505b509050600067ffffffffffffffff81111561105157611050612d9b565b5b60405190808252806020026020018201604052801561107f5781602001602082028036833780820191505090505b5092506111fb565b8094507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f94d4668866040518263ffffffff1660e01b81526004016110e391906140b4565b600060405180830381865afa158015611100573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061112991906141fd565b5080935081945050508573ffffffffffffffffffffffffffffffffffffffff1663f89f27ed6040518163ffffffff1660e01b8152600401600060405180830381865afa92505050801561119f57506040513d6000823e3d601f19601f8201168201806040525081019061119c9190614288565b60015b6111f457600067ffffffffffffffff8111156111be576111bd612d9b565b5b6040519080825280602002602001820160405280156111ec5781602001602082028036833780820191505090505b5093506111f9565b809450505b505b600061120a8a6060015161225a565b905060006040518060a001604052808973ffffffffffffffffffffffffffffffffffffffff1663ebe2b12b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112889190613c9a565b81526020018973ffffffffffffffffffffffffffffffffffffffff1663c8f33c916040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112fc9190613c9a565b81526020018973ffffffffffffffffffffffffffffffffffffffff16637b0a47ee6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561134c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113709190613c9a565b81526020018973ffffffffffffffffffffffffffffffffffffffff1663df136d656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e49190613c9a565b81526020018973ffffffffffffffffffffffffffffffffffffffff166363d38c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611434573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114589190613c9a565b81525090506040518061020001604052808b81526020018c6000015173ffffffffffffffffffffffffffffffffffffffff1681526020018c6020015173ffffffffffffffffffffffffffffffffffffffff1681526020018c6040015173ffffffffffffffffffffffffffffffffffffffff1681526020018c6060015173ffffffffffffffffffffffffffffffffffffffff1681526020018c6080015173ffffffffffffffffffffffffffffffffffffffff1681526020018c60a00151151581526020018973ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158a9190613c58565b73ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190613c9a565b81526020018873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561167c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a09190613c9a565b8152602001828152602001838152509850505050505050505092915050565b606060008373ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561170e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117329190613c9a565b905060008167ffffffffffffffff8111156117505761174f612d9b565b5b60405190808252806020026020018201604052801561178957816020015b6117766127a3565b81526020019060019003908161176e5790505b50905060005b828110156118565760008673ffffffffffffffffffffffffffffffffffffffff16631526fe27836040518263ffffffff1660e01b81526004016117d29190612d6a565b60c060405180830381865afa1580156117ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611813919061401f565b905061182481606001518388610982565b83838151811061183757611836613dbf565b5b602002602001018190525050808061184e90613f36565b91505061178f565b50809250505092915050565b61186a6128d7565b600083905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016118aa9190613cd6565b602060405180830381865afa1580156118c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118eb9190613c9a565b905060008273ffffffffffffffffffffffffffffffffffffffff16633af9e669866040518263ffffffff1660e01b81526004016119289190613cd6565b602060405180830381865afa158015611945573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119699190613c9a565b905060008373ffffffffffffffffffffffffffffffffffffffff1663d55a23f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119dc9190613c9a565b905060008167ffffffffffffffff8111156119fa576119f9612d9b565b5b604051908082528060200260200182016040528015611a285781602001602082028036833780820191505090505b50905060005b82811015611b605760008673ffffffffffffffffffffffffffffffffffffffff166340c35446836040518263ffffffff1660e01b8152600401611a719190612d6a565b602060405180830381865afa158015611a8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab29190613c58565b90508073ffffffffffffffffffffffffffffffffffffffff16628cc2628a6040518263ffffffff1660e01b8152600401611aec9190613cd6565b602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d9190613c9a565b838381518110611b4057611b3f613dbf565b5b602002602001018181525050508080611b5890613f36565b915050611a2e565b5060405180608001604052808873ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001828152509550505050505092915050565b611bad6127cb565b600082905060008173ffffffffffffffffffffffffffffffffffffffff166372f702f36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c239190613c58565b90506000600167ffffffffffffffff811115611c4257611c41612d9b565b5b604051908082528060200260200182016040528015611c705781602001602082028036833780820191505090505b509050600181600081518110611c8957611c88613dbf565b5b6020026020010181815250506000600167ffffffffffffffff811115611cb257611cb1612d9b565b5b604051908082528060200260200182016040528015611ce05781602001602082028036833780820191505090505b5090508281600081518110611cf857611cf7613dbf565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff811115611d4f57611d4e612d9b565b5b604051908082528060200260200182016040528015611d7d5781602001602082028036833780820191505090505b5090508373ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401611db99190613cd6565b602060405180830381865afa158015611dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfa9190613c9a565b81600081518110611e0e57611e0d613dbf565b5b60200260200101818152505060006040518060a001604052808773ffffffffffffffffffffffffffffffffffffffff1663ebe2b12b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e969190613c9a565b81526020018773ffffffffffffffffffffffffffffffffffffffff1663c8f33c916040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0a9190613c9a565b81526020018773ffffffffffffffffffffffffffffffffffffffff16637b0a47ee6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7e9190613c9a565b81526020018773ffffffffffffffffffffffffffffffffffffffff1663df136d656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff29190613c9a565b81526020018773ffffffffffffffffffffffffffffffffffffffff166363d38c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612042573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120669190613c9a565b815250905060006120768961225a565b9050604051806102000160405280600081526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581526020018873ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561216d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121919190613c58565b73ffffffffffffffffffffffffffffffffffffffff1681526020016000801b81526020018681526020018581526020018481526020018873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612212573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122369190613c9a565b81526020016000815260200183815260200182815250975050505050505050919050565b6060600082905060008173ffffffffffffffffffffffffffffffffffffffff1663d55a23f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d29190613c9a565b905060008167ffffffffffffffff8111156122f0576122ef612d9b565b5b60405190808252806020026020018201604052801561232957816020015b612316612915565b81526020019060019003908161230e5790505b50905060005b828110156126f45760008473ffffffffffffffffffffffffffffffffffffffff166340c35446836040518263ffffffff1660e01b81526004016123729190612d6a565b602060405180830381865afa15801561238f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b39190613c58565b9050600081905060006040518060a001604052808373ffffffffffffffffffffffffffffffffffffffff1663ebe2b12b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612412573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124369190613c9a565b81526020018373ffffffffffffffffffffffffffffffffffffffff1663c8f33c916040518163ffffffff1660e01b8152600401602060405180830381865afa158015612486573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124aa9190613c9a565b81526020018373ffffffffffffffffffffffffffffffffffffffff16637b0a47ee6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251e9190613c9a565b81526020018373ffffffffffffffffffffffffffffffffffffffff1663df136d656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561256e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125929190613c9a565b81526020018373ffffffffffffffffffffffffffffffffffffffff166363d38c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126069190613c9a565b815250905060405180606001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561267d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a19190613c58565b73ffffffffffffffffffffffffffffffffffffffff168152602001828152508585815181106126d3576126d2613dbf565b5b602002602001018190525050505080806126ec90613f36565b91505061232f565b50809350505050919050565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001606081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff16815260200160608152602001606081525090565b6040518060800160405280600081526020016000815260200160608152602001600081525090565b60405180610200016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160608152602001606081526020016060815260200160008152602001600081526020016128ca612968565b8152602001606081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001612962612968565b81525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129d6826129ab565b9050919050565b6129e6816129cb565b81146129f157600080fd5b50565b600081359050612a03816129dd565b92915050565b600060208284031215612a1f57612a1e6129a1565b5b6000612a2d848285016129f4565b91505092915050565b612a3f816129cb565b82525050565b6000819050919050565b612a5881612a45565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a082016000820151612aa06000850182612a4f565b506020820151612ab36020850182612a4f565b506040820151612ac66040850182612a4f565b506060820151612ad96060850182612a4f565b506080820151612aec6080850182612a4f565b50505050565b60e082016000820151612b086000850182612a36565b506020820151612b1b6020850182612a36565b506040820151612b2e6040850182612a8a565b50505050565b6000612b408383612af2565b60e08301905092915050565b6000602082019050919050565b6000612b6482612a5e565b612b6e8185612a69565b9350612b7983612a7a565b8060005b83811015612baa578151612b918882612b34565b9750612b9c83612b4c565b925050600181019050612b7d565b5085935050505092915050565b600060c083016000830151612bcf6000860182612a36565b506020830151612be26020860182612a36565b506040830151612bf56040860182612a4f565b506060830151612c086060860182612a4f565b506080830151612c1b6080860182612a4f565b5060a083015184820360a0860152612c338282612b59565b9150508091505092915050565b60006020820190508181036000830152612c5a8184612bb7565b905092915050565b6000819050919050565b6000612c87612c82612c7d846129ab565b612c62565b6129ab565b9050919050565b6000612c9982612c6c565b9050919050565b6000612cab82612c8e565b9050919050565b612cbb81612ca0565b82525050565b6000602082019050612cd66000830184612cb2565b92915050565b612ce581612a45565b8114612cf057600080fd5b50565b600081359050612d0281612cdc565b92915050565b600080600060608486031215612d2157612d206129a1565b5b6000612d2f86828701612cf3565b9350506020612d40868287016129f4565b9250506040612d51868287016129f4565b9150509250925092565b612d6481612a45565b82525050565b6000602082019050612d7f6000830184612d5b565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612dd382612d8a565b810181811067ffffffffffffffff82111715612df257612df1612d9b565b5b80604052505050565b6000612e05612997565b9050612e118282612dca565b919050565b600067ffffffffffffffff821115612e3157612e30612d9b565b5b602082029050602081019050919050565b600080fd5b6000612e5a612e5584612e16565b612dfb565b90508083825260208201905060208402830185811115612e7d57612e7c612e42565b5b835b81811015612ea65780612e9288826129f4565b845260208401935050602081019050612e7f565b5050509392505050565b600082601f830112612ec557612ec4612d85565b5b8135612ed5848260208601612e47565b91505092915050565b600060208284031215612ef457612ef36129a1565b5b600082013567ffffffffffffffff811115612f1257612f116129a6565b5b612f1e84828501612eb0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060ff82169050919050565b612f6981612f53565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa9578082015181840152602081019050612f8e565b83811115612fb8576000848401525b50505050565b6000612fc982612f6f565b612fd38185612f7a565b9350612fe3818560208601612f8b565b612fec81612d8a565b840191505092915050565b600060808301600083015161300f6000860182612a36565b5060208301516130226020860182612f60565b506040830151848203604086015261303a8282612fbe565b915050606083015184820360608601526130548282612fbe565b9150508091505092915050565b600061306d8383612ff7565b905092915050565b6000602082019050919050565b600061308d82612f27565b6130978185612f32565b9350836020820285016130a985612f43565b8060005b858110156130e557848403895281516130c68582613061565b94506130d183613075565b925060208a019950506001810190506130ad565b50829750879550505050505092915050565b600060208201905081810360008301526131118184613082565b905092915050565b600080600060608486031215613132576131316129a1565b5b6000613140868287016129f4565b935050602061315186828701612cf3565b9250506040613162868287016129f4565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006131a48383612a4f565b60208301905092915050565b6000602082019050919050565b60006131c88261316c565b6131d28185613177565b93506131dd83613188565b8060005b8381101561320e5781516131f58882613198565b9750613200836131b0565b9250506001810190506131e1565b5085935050505092915050565b60006080830160008301516132336000860182612a4f565b5060208301516132466020860182612a4f565b506040830151848203604086015261325e82826131bd565b91505060608301516132736060860182612a4f565b508091505092915050565b60006020820190508181036000830152613298818461321b565b905092915050565b600067ffffffffffffffff8211156132bb576132ba612d9b565b5b602082029050602081019050919050565b60006132df6132da846132a0565b612dfb565b9050808382526020820190506020840283018581111561330257613301612e42565b5b835b8181101561332b57806133178882612cf3565b845260208401935050602081019050613304565b5050509392505050565b600082601f83011261334a57613349612d85565b5b813561335a8482602086016132cc565b91505092915050565b60008060006060848603121561337c5761337b6129a1565b5b600084013567ffffffffffffffff81111561339a576133996129a6565b5b6133a686828701613335565b93505060206133b7868287016129f4565b92505060406133c8868287016129f4565b9150509250925092565b600082825260208201905092915050565b60006133ee8261316c565b6133f881856133d2565b935061340383613188565b8060005b8381101561343457815161341b8882613198565b9750613426836131b0565b925050600181019050613407565b5085935050505092915050565b6000602082019050818103600083015261345b81846133e3565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60008115159050919050565b6134a48161348f565b82525050565b6000819050919050565b6134bd816134aa565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006134fb8383612a36565b60208301905092915050565b6000602082019050919050565b600061351f826134c3565b61352981856134ce565b9350613534836134df565b8060005b8381101561356557815161354c88826134ef565b975061355783613507565b925050600181019050613538565b5085935050505092915050565b60006102808301600083015161358b6000860182612a4f565b50602083015161359e6020860182612a36565b5060408301516135b16040860182612a36565b5060608301516135c46060860182612a36565b5060808301516135d76080860182612a36565b5060a08301516135ea60a0860182612a36565b5060c08301516135fd60c086018261349b565b5060e083015161361060e0860182612a36565b506101008301516136256101008601826134b4565b5061012083015184820361012086015261363f82826131bd565b91505061014083015184820361014086015261365b8282613514565b91505061016083015184820361016086015261367782826131bd565b91505061018083015161368e610180860182612a4f565b506101a08301516136a36101a0860182612a4f565b506101c08301516136b86101c0860182612a8a565b506101e08301518482036102608601526136d28282612b59565b9150508091505092915050565b60006136eb8383613572565b905092915050565b6000602082019050919050565b600061370b82613463565b613715818561346e565b9350836020820285016137278561347f565b8060005b85811015613763578484038952815161374485826136df565b945061374f836136f3565b925060208a0199505060018101905061372b565b50829750879550505050505092915050565b6000602082019050818103600083015261378f8184613700565b905092915050565b600080fd5b6137a58161348f565b81146137b057600080fd5b50565b6000813590506137c28161379c565b92915050565b600060c082840312156137de576137dd613797565b5b6137e860c0612dfb565b905060006137f8848285016129f4565b600083015250602061380c848285016129f4565b6020830152506040613820848285016129f4565b6040830152506060613834848285016129f4565b6060830152506080613848848285016129f4565b60808301525060a061385c848285016137b3565b60a08301525092915050565b60008060e0838503121561387f5761387e6129a1565b5b600061388d858286016137c8565b92505060c061389e85828601612cf3565b9150509250929050565b6000610280830160008301516138c16000860182612a4f565b5060208301516138d46020860182612a36565b5060408301516138e76040860182612a36565b5060608301516138fa6060860182612a36565b50608083015161390d6080860182612a36565b5060a083015161392060a0860182612a36565b5060c083015161393360c086018261349b565b5060e083015161394660e0860182612a36565b5061010083015161395b6101008601826134b4565b5061012083015184820361012086015261397582826131bd565b9150506101408301518482036101408601526139918282613514565b9150506101608301518482036101608601526139ad82826131bd565b9150506101808301516139c4610180860182612a4f565b506101a08301516139d96101a0860182612a4f565b506101c08301516139ee6101c0860182612a8a565b506101e0830151848203610260860152613a088282612b59565b9150508091505092915050565b60006020820190508181036000830152613a2f81846138a8565b905092915050565b60008060408385031215613a4e57613a4d6129a1565b5b6000613a5c858286016129f4565b9250506020613a6d858286016129f4565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000608083016000830151613abb6000860182612a4f565b506020830151613ace6020860182612a4f565b5060408301518482036040860152613ae682826131bd565b9150506060830151613afb6060860182612a4f565b508091505092915050565b6000613b128383613aa3565b905092915050565b6000602082019050919050565b6000613b3282613a77565b613b3c8185613a82565b935083602082028501613b4e85613a93565b8060005b85811015613b8a5784840389528151613b6b8582613b06565b9450613b7683613b1a565b925060208a01995050600181019050613b52565b50829750879550505050505092915050565b60006020820190508181036000830152613bb68184613b27565b905092915050565b6000608083016000830151613bd66000860182612a36565b506020830151613be96020860182612a4f565b506040830151613bfc6040860182612a4f565b5060608301518482036060860152613c1482826131bd565b9150508091505092915050565b60006020820190508181036000830152613c3b8184613bbe565b905092915050565b600081519050613c52816129dd565b92915050565b600060208284031215613c6e57613c6d6129a1565b5b6000613c7c84828501613c43565b91505092915050565b600081519050613c9481612cdc565b92915050565b600060208284031215613cb057613caf6129a1565b5b6000613cbe84828501613c85565b91505092915050565b613cd0816129cb565b82525050565b6000602082019050613ceb6000830184613cc7565b92915050565b6000604082019050613d066000830185612d5b565b613d136020830184613cc7565b9392505050565b600081519050613d298161379c565b92915050565b600060208284031215613d4557613d446129a1565b5b6000613d5384828501613d1a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d9682612a45565b9150613da183612a45565b925082821015613db457613db3613d5c565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b613df781612f53565b8114613e0257600080fd5b50565b600081519050613e1481613dee565b92915050565b600060208284031215613e3057613e2f6129a1565b5b6000613e3e84828501613e05565b91505092915050565b600080fd5b600067ffffffffffffffff821115613e6757613e66612d9b565b5b613e7082612d8a565b9050602081019050919050565b6000613e90613e8b84613e4c565b612dfb565b905082815260208101848484011115613eac57613eab613e47565b5b613eb7848285612f8b565b509392505050565b600082601f830112613ed457613ed3612d85565b5b8151613ee4848260208601613e7d565b91505092915050565b600060208284031215613f0357613f026129a1565b5b600082015167ffffffffffffffff811115613f2157613f206129a6565b5b613f2d84828501613ebf565b91505092915050565b6000613f4182612a45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f7457613f73613d5c565b5b600182019050919050565b600060c08284031215613f9557613f94613797565b5b613f9f60c0612dfb565b90506000613faf84828501613c43565b6000830152506020613fc384828501613c43565b6020830152506040613fd784828501613c43565b6040830152506060613feb84828501613c43565b6060830152506080613fff84828501613c43565b60808301525060a061401384828501613d1a565b60a08301525092915050565b600060c08284031215614035576140346129a1565b5b600061404384828501613f7f565b91505092915050565b614055816134aa565b811461406057600080fd5b50565b6000815190506140728161404c565b92915050565b60006020828403121561408e5761408d6129a1565b5b600061409c84828501614063565b91505092915050565b6140ae816134aa565b82525050565b60006020820190506140c960008301846140a5565b92915050565b60006140e26140dd84612e16565b612dfb565b9050808382526020820190506020840283018581111561410557614104612e42565b5b835b8181101561412e578061411a8882613c43565b845260208401935050602081019050614107565b5050509392505050565b600082601f83011261414d5761414c612d85565b5b815161415d8482602086016140cf565b91505092915050565b6000614179614174846132a0565b612dfb565b9050808382526020820190506020840283018581111561419c5761419b612e42565b5b835b818110156141c557806141b18882613c85565b84526020840193505060208101905061419e565b5050509392505050565b600082601f8301126141e4576141e3612d85565b5b81516141f4848260208601614166565b91505092915050565b600080600060608486031215614216576142156129a1565b5b600084015167ffffffffffffffff811115614234576142336129a6565b5b61424086828701614138565b935050602084015167ffffffffffffffff811115614261576142606129a6565b5b61426d868287016141cf565b925050604061427e86828701613c85565b9150509250925092565b60006020828403121561429e5761429d6129a1565b5b600082015167ffffffffffffffff8111156142bc576142bb6129a6565b5b6142c8848285016141cf565b9150509291505056fea2646970667358221220975f5dc32466a02fef634738388e970292b65e9f08e268cbbcc68c06c3ffc5d964736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80634cf4c36a116100715780634cf4c36a1461018c5780635c39f467146101bc5780637f5f53d1146101ec5780639b9e09551461021c578063c025d1a51461024c578063eda242901461027c576100a9565b80630eb9af38146100ae578063158274a5146100de5780631fbf73ac146100fc578063273a94aa1461012c5780633e3dcce81461015c575b600080fd5b6100c860048036038101906100c39190612a09565b6102ac565b6040516100d59190612c40565b60405180910390f35b6100e66104f8565b6040516100f39190612cc1565b60405180910390f35b61011660048036038101906101119190612d08565b61051c565b6040516101239190612d6a565b60405180910390f35b61014660048036038101906101419190612ede565b6106aa565b60405161015391906130f7565b60405180910390f35b61017660048036038101906101719190613119565b610982565b604051610183919061327e565b60405180910390f35b6101a660048036038101906101a19190613363565b610caf565b6040516101b39190613441565b60405180910390f35b6101d660048036038101906101d19190612a09565b610d68565b6040516101e39190613775565b60405180910390f35b61020660048036038101906102019190613868565b610f0b565b6040516102139190613a15565b60405180910390f35b61023660048036038101906102319190613a37565b6116bf565b6040516102439190613b9c565b60405180910390f35b61026660048036038101906102619190613a37565b611862565b6040516102739190613c21565b60405180910390f35b61029660048036038101906102919190612a09565b611ba5565b6040516102a39190613a15565b60405180910390f35b6102b4612700565b600082905060008173ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610306573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032a9190613c58565b905060008273ffffffffffffffffffffffffffffffffffffffff1663c70920bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039d9190613c9a565b905060008373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104109190613c9a565b905060008473ffffffffffffffffffffffffffffffffffffffff1663a2468c196040518163ffffffff1660e01b8152600401602060405180830381865afa15801561045f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104839190613c9a565b905060006104908861225a565b90506040518060c001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001838152602001828152509650505050505050919050565b7f000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c881565b6000808273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105589190613cd6565b602060405180830381865afa158015610575573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105999190613c9a565b90508373ffffffffffffffffffffffffffffffffffffffff16637979426b8660006040518363ffffffff1660e01b81526004016105d7929190613cf1565b6020604051808303816000875af11580156105f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061a9190613d2f565b50808373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106559190613cd6565b602060405180830381865afa158015610672573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106969190613c9a565b6106a09190613d8b565b9150509392505050565b606060008251905060008167ffffffffffffffff8111156106ce576106cd612d9b565b5b60405190808252806020026020018201604052801561070757816020015b6106f4612762565b8152602001906001900390816106ec5790505b50905060005b8281101561097757600085828151811061072a57610729613dbf565b5b60200260200101519050600081905060008173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156107a357506040513d601f19601f820116820180604052508101906107a09190613e1a565b60015b6107b05760009050610823565b508173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108209190613e1a565b90505b60405180608001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1681526020018373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801561089e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108c79190613eed565b81526020018373ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610917573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109409190613eed565b81525085858151811061095657610955613dbf565b5b6020026020010181905250505050808061096f90613f36565b91505061070d565b508092505050919050565b61098a6127a3565b600084905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016109ca9190613cd6565b602060405180830381865afa1580156109e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0b9190613c9a565b905060008273ffffffffffffffffffffffffffffffffffffffff16628cc262866040518263ffffffff1660e01b8152600401610a479190613cd6565b602060405180830381865afa158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190613c9a565b905060008373ffffffffffffffffffffffffffffffffffffffff1663d55a23f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afb9190613c9a565b905060008167ffffffffffffffff811115610b1957610b18612d9b565b5b604051908082528060200260200182016040528015610b475781602001602082028036833780820191505090505b50905060005b82811015610c7f5760008673ffffffffffffffffffffffffffffffffffffffff166340c35446836040518263ffffffff1660e01b8152600401610b909190612d6a565b602060405180830381865afa158015610bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd19190613c58565b90508073ffffffffffffffffffffffffffffffffffffffff16628cc2628a6040518263ffffffff1660e01b8152600401610c0b9190613cd6565b602060405180830381865afa158015610c28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4c9190613c9a565b838381518110610c5f57610c5e613dbf565b5b602002602001018181525050508080610c7790613f36565b915050610b4d565b50604051806080016040528089815260200184815260200182815260200185815250955050505050509392505050565b6060835167ffffffffffffffff811115610ccc57610ccb612d9b565b5b604051908082528060200260200182016040528015610cfa5781602001602082028036833780820191505090505b50905060005b8451811015610d6057610d2e858281518110610d1f57610d1e613dbf565b5b6020026020010151858561051c565b828281518110610d4157610d40613dbf565b5b6020026020010181815250508080610d5890613f36565b915050610d00565b509392505050565b6060600082905060008173ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de09190613c9a565b905060008167ffffffffffffffff811115610dfe57610dfd612d9b565b5b604051908082528060200260200182016040528015610e3757816020015b610e246127cb565b815260200190600190039081610e1c5790505b50905060005b82811015610eff5760008473ffffffffffffffffffffffffffffffffffffffff16631526fe27836040518263ffffffff1660e01b8152600401610e809190612d6a565b60c060405180830381865afa158015610e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec1919061401f565b9050610ecd8183610f0b565b838381518110610ee057610edf613dbf565b5b6020026020010181905250508080610ef790613f36565b915050610e3d565b50809350505050919050565b610f136127cb565b600083606001519050600084600001519050600060608060608473ffffffffffffffffffffffffffffffffffffffff166338fff2d06040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f9457506040513d601f19601f82011682018060405250810190610f919190614078565b60015b611087576000801b9350600067ffffffffffffffff811115610fb957610fb8612d9b565b5b604051908082528060200260200182016040528015610fe75781602001602082028036833780820191505090505b509150600067ffffffffffffffff81111561100557611004612d9b565b5b6040519080825280602002602001820160405280156110335781602001602082028036833780820191505090505b509050600067ffffffffffffffff81111561105157611050612d9b565b5b60405190808252806020026020018201604052801561107f5781602001602082028036833780820191505090505b5092506111fb565b8094507f000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c873ffffffffffffffffffffffffffffffffffffffff1663f94d4668866040518263ffffffff1660e01b81526004016110e391906140b4565b600060405180830381865afa158015611100573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061112991906141fd565b5080935081945050508573ffffffffffffffffffffffffffffffffffffffff1663f89f27ed6040518163ffffffff1660e01b8152600401600060405180830381865afa92505050801561119f57506040513d6000823e3d601f19601f8201168201806040525081019061119c9190614288565b60015b6111f457600067ffffffffffffffff8111156111be576111bd612d9b565b5b6040519080825280602002602001820160405280156111ec5781602001602082028036833780820191505090505b5093506111f9565b809450505b505b600061120a8a6060015161225a565b905060006040518060a001604052808973ffffffffffffffffffffffffffffffffffffffff1663ebe2b12b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112889190613c9a565b81526020018973ffffffffffffffffffffffffffffffffffffffff1663c8f33c916040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112fc9190613c9a565b81526020018973ffffffffffffffffffffffffffffffffffffffff16637b0a47ee6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561134c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113709190613c9a565b81526020018973ffffffffffffffffffffffffffffffffffffffff1663df136d656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e49190613c9a565b81526020018973ffffffffffffffffffffffffffffffffffffffff166363d38c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611434573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114589190613c9a565b81525090506040518061020001604052808b81526020018c6000015173ffffffffffffffffffffffffffffffffffffffff1681526020018c6020015173ffffffffffffffffffffffffffffffffffffffff1681526020018c6040015173ffffffffffffffffffffffffffffffffffffffff1681526020018c6060015173ffffffffffffffffffffffffffffffffffffffff1681526020018c6080015173ffffffffffffffffffffffffffffffffffffffff1681526020018c60a00151151581526020018973ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158a9190613c58565b73ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190613c9a565b81526020018873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561167c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a09190613c9a565b8152602001828152602001838152509850505050505050505092915050565b606060008373ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561170e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117329190613c9a565b905060008167ffffffffffffffff8111156117505761174f612d9b565b5b60405190808252806020026020018201604052801561178957816020015b6117766127a3565b81526020019060019003908161176e5790505b50905060005b828110156118565760008673ffffffffffffffffffffffffffffffffffffffff16631526fe27836040518263ffffffff1660e01b81526004016117d29190612d6a565b60c060405180830381865afa1580156117ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611813919061401f565b905061182481606001518388610982565b83838151811061183757611836613dbf565b5b602002602001018190525050808061184e90613f36565b91505061178f565b50809250505092915050565b61186a6128d7565b600083905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016118aa9190613cd6565b602060405180830381865afa1580156118c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118eb9190613c9a565b905060008273ffffffffffffffffffffffffffffffffffffffff16633af9e669866040518263ffffffff1660e01b81526004016119289190613cd6565b602060405180830381865afa158015611945573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119699190613c9a565b905060008373ffffffffffffffffffffffffffffffffffffffff1663d55a23f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119dc9190613c9a565b905060008167ffffffffffffffff8111156119fa576119f9612d9b565b5b604051908082528060200260200182016040528015611a285781602001602082028036833780820191505090505b50905060005b82811015611b605760008673ffffffffffffffffffffffffffffffffffffffff166340c35446836040518263ffffffff1660e01b8152600401611a719190612d6a565b602060405180830381865afa158015611a8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab29190613c58565b90508073ffffffffffffffffffffffffffffffffffffffff16628cc2628a6040518263ffffffff1660e01b8152600401611aec9190613cd6565b602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d9190613c9a565b838381518110611b4057611b3f613dbf565b5b602002602001018181525050508080611b5890613f36565b915050611a2e565b5060405180608001604052808873ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001828152509550505050505092915050565b611bad6127cb565b600082905060008173ffffffffffffffffffffffffffffffffffffffff166372f702f36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c239190613c58565b90506000600167ffffffffffffffff811115611c4257611c41612d9b565b5b604051908082528060200260200182016040528015611c705781602001602082028036833780820191505090505b509050600181600081518110611c8957611c88613dbf565b5b6020026020010181815250506000600167ffffffffffffffff811115611cb257611cb1612d9b565b5b604051908082528060200260200182016040528015611ce05781602001602082028036833780820191505090505b5090508281600081518110611cf857611cf7613dbf565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff811115611d4f57611d4e612d9b565b5b604051908082528060200260200182016040528015611d7d5781602001602082028036833780820191505090505b5090508373ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401611db99190613cd6565b602060405180830381865afa158015611dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfa9190613c9a565b81600081518110611e0e57611e0d613dbf565b5b60200260200101818152505060006040518060a001604052808773ffffffffffffffffffffffffffffffffffffffff1663ebe2b12b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e969190613c9a565b81526020018773ffffffffffffffffffffffffffffffffffffffff1663c8f33c916040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0a9190613c9a565b81526020018773ffffffffffffffffffffffffffffffffffffffff16637b0a47ee6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7e9190613c9a565b81526020018773ffffffffffffffffffffffffffffffffffffffff1663df136d656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff29190613c9a565b81526020018773ffffffffffffffffffffffffffffffffffffffff166363d38c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612042573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120669190613c9a565b815250905060006120768961225a565b9050604051806102000160405280600081526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581526020018873ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561216d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121919190613c58565b73ffffffffffffffffffffffffffffffffffffffff1681526020016000801b81526020018681526020018581526020018481526020018873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612212573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122369190613c9a565b81526020016000815260200183815260200182815250975050505050505050919050565b6060600082905060008173ffffffffffffffffffffffffffffffffffffffff1663d55a23f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d29190613c9a565b905060008167ffffffffffffffff8111156122f0576122ef612d9b565b5b60405190808252806020026020018201604052801561232957816020015b612316612915565b81526020019060019003908161230e5790505b50905060005b828110156126f45760008473ffffffffffffffffffffffffffffffffffffffff166340c35446836040518263ffffffff1660e01b81526004016123729190612d6a565b602060405180830381865afa15801561238f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b39190613c58565b9050600081905060006040518060a001604052808373ffffffffffffffffffffffffffffffffffffffff1663ebe2b12b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612412573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124369190613c9a565b81526020018373ffffffffffffffffffffffffffffffffffffffff1663c8f33c916040518163ffffffff1660e01b8152600401602060405180830381865afa158015612486573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124aa9190613c9a565b81526020018373ffffffffffffffffffffffffffffffffffffffff16637b0a47ee6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251e9190613c9a565b81526020018373ffffffffffffffffffffffffffffffffffffffff1663df136d656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561256e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125929190613c9a565b81526020018373ffffffffffffffffffffffffffffffffffffffff166363d38c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126069190613c9a565b815250905060405180606001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1663f7c618c16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561267d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a19190613c58565b73ffffffffffffffffffffffffffffffffffffffff168152602001828152508585815181106126d3576126d2613dbf565b5b602002602001018190525050505080806126ec90613f36565b91505061232f565b50809350505050919050565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001606081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff16815260200160608152602001606081525090565b6040518060800160405280600081526020016000815260200160608152602001600081525090565b60405180610200016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160608152602001606081526020016060815260200160008152602001600081526020016128ca612968565b8152602001606081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001612962612968565b81525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129d6826129ab565b9050919050565b6129e6816129cb565b81146129f157600080fd5b50565b600081359050612a03816129dd565b92915050565b600060208284031215612a1f57612a1e6129a1565b5b6000612a2d848285016129f4565b91505092915050565b612a3f816129cb565b82525050565b6000819050919050565b612a5881612a45565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60a082016000820151612aa06000850182612a4f565b506020820151612ab36020850182612a4f565b506040820151612ac66040850182612a4f565b506060820151612ad96060850182612a4f565b506080820151612aec6080850182612a4f565b50505050565b60e082016000820151612b086000850182612a36565b506020820151612b1b6020850182612a36565b506040820151612b2e6040850182612a8a565b50505050565b6000612b408383612af2565b60e08301905092915050565b6000602082019050919050565b6000612b6482612a5e565b612b6e8185612a69565b9350612b7983612a7a565b8060005b83811015612baa578151612b918882612b34565b9750612b9c83612b4c565b925050600181019050612b7d565b5085935050505092915050565b600060c083016000830151612bcf6000860182612a36565b506020830151612be26020860182612a36565b506040830151612bf56040860182612a4f565b506060830151612c086060860182612a4f565b506080830151612c1b6080860182612a4f565b5060a083015184820360a0860152612c338282612b59565b9150508091505092915050565b60006020820190508181036000830152612c5a8184612bb7565b905092915050565b6000819050919050565b6000612c87612c82612c7d846129ab565b612c62565b6129ab565b9050919050565b6000612c9982612c6c565b9050919050565b6000612cab82612c8e565b9050919050565b612cbb81612ca0565b82525050565b6000602082019050612cd66000830184612cb2565b92915050565b612ce581612a45565b8114612cf057600080fd5b50565b600081359050612d0281612cdc565b92915050565b600080600060608486031215612d2157612d206129a1565b5b6000612d2f86828701612cf3565b9350506020612d40868287016129f4565b9250506040612d51868287016129f4565b9150509250925092565b612d6481612a45565b82525050565b6000602082019050612d7f6000830184612d5b565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612dd382612d8a565b810181811067ffffffffffffffff82111715612df257612df1612d9b565b5b80604052505050565b6000612e05612997565b9050612e118282612dca565b919050565b600067ffffffffffffffff821115612e3157612e30612d9b565b5b602082029050602081019050919050565b600080fd5b6000612e5a612e5584612e16565b612dfb565b90508083825260208201905060208402830185811115612e7d57612e7c612e42565b5b835b81811015612ea65780612e9288826129f4565b845260208401935050602081019050612e7f565b5050509392505050565b600082601f830112612ec557612ec4612d85565b5b8135612ed5848260208601612e47565b91505092915050565b600060208284031215612ef457612ef36129a1565b5b600082013567ffffffffffffffff811115612f1257612f116129a6565b5b612f1e84828501612eb0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060ff82169050919050565b612f6981612f53565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa9578082015181840152602081019050612f8e565b83811115612fb8576000848401525b50505050565b6000612fc982612f6f565b612fd38185612f7a565b9350612fe3818560208601612f8b565b612fec81612d8a565b840191505092915050565b600060808301600083015161300f6000860182612a36565b5060208301516130226020860182612f60565b506040830151848203604086015261303a8282612fbe565b915050606083015184820360608601526130548282612fbe565b9150508091505092915050565b600061306d8383612ff7565b905092915050565b6000602082019050919050565b600061308d82612f27565b6130978185612f32565b9350836020820285016130a985612f43565b8060005b858110156130e557848403895281516130c68582613061565b94506130d183613075565b925060208a019950506001810190506130ad565b50829750879550505050505092915050565b600060208201905081810360008301526131118184613082565b905092915050565b600080600060608486031215613132576131316129a1565b5b6000613140868287016129f4565b935050602061315186828701612cf3565b9250506040613162868287016129f4565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006131a48383612a4f565b60208301905092915050565b6000602082019050919050565b60006131c88261316c565b6131d28185613177565b93506131dd83613188565b8060005b8381101561320e5781516131f58882613198565b9750613200836131b0565b9250506001810190506131e1565b5085935050505092915050565b60006080830160008301516132336000860182612a4f565b5060208301516132466020860182612a4f565b506040830151848203604086015261325e82826131bd565b91505060608301516132736060860182612a4f565b508091505092915050565b60006020820190508181036000830152613298818461321b565b905092915050565b600067ffffffffffffffff8211156132bb576132ba612d9b565b5b602082029050602081019050919050565b60006132df6132da846132a0565b612dfb565b9050808382526020820190506020840283018581111561330257613301612e42565b5b835b8181101561332b57806133178882612cf3565b845260208401935050602081019050613304565b5050509392505050565b600082601f83011261334a57613349612d85565b5b813561335a8482602086016132cc565b91505092915050565b60008060006060848603121561337c5761337b6129a1565b5b600084013567ffffffffffffffff81111561339a576133996129a6565b5b6133a686828701613335565b93505060206133b7868287016129f4565b92505060406133c8868287016129f4565b9150509250925092565b600082825260208201905092915050565b60006133ee8261316c565b6133f881856133d2565b935061340383613188565b8060005b8381101561343457815161341b8882613198565b9750613426836131b0565b925050600181019050613407565b5085935050505092915050565b6000602082019050818103600083015261345b81846133e3565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60008115159050919050565b6134a48161348f565b82525050565b6000819050919050565b6134bd816134aa565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006134fb8383612a36565b60208301905092915050565b6000602082019050919050565b600061351f826134c3565b61352981856134ce565b9350613534836134df565b8060005b8381101561356557815161354c88826134ef565b975061355783613507565b925050600181019050613538565b5085935050505092915050565b60006102808301600083015161358b6000860182612a4f565b50602083015161359e6020860182612a36565b5060408301516135b16040860182612a36565b5060608301516135c46060860182612a36565b5060808301516135d76080860182612a36565b5060a08301516135ea60a0860182612a36565b5060c08301516135fd60c086018261349b565b5060e083015161361060e0860182612a36565b506101008301516136256101008601826134b4565b5061012083015184820361012086015261363f82826131bd565b91505061014083015184820361014086015261365b8282613514565b91505061016083015184820361016086015261367782826131bd565b91505061018083015161368e610180860182612a4f565b506101a08301516136a36101a0860182612a4f565b506101c08301516136b86101c0860182612a8a565b506101e08301518482036102608601526136d28282612b59565b9150508091505092915050565b60006136eb8383613572565b905092915050565b6000602082019050919050565b600061370b82613463565b613715818561346e565b9350836020820285016137278561347f565b8060005b85811015613763578484038952815161374485826136df565b945061374f836136f3565b925060208a0199505060018101905061372b565b50829750879550505050505092915050565b6000602082019050818103600083015261378f8184613700565b905092915050565b600080fd5b6137a58161348f565b81146137b057600080fd5b50565b6000813590506137c28161379c565b92915050565b600060c082840312156137de576137dd613797565b5b6137e860c0612dfb565b905060006137f8848285016129f4565b600083015250602061380c848285016129f4565b6020830152506040613820848285016129f4565b6040830152506060613834848285016129f4565b6060830152506080613848848285016129f4565b60808301525060a061385c848285016137b3565b60a08301525092915050565b60008060e0838503121561387f5761387e6129a1565b5b600061388d858286016137c8565b92505060c061389e85828601612cf3565b9150509250929050565b6000610280830160008301516138c16000860182612a4f565b5060208301516138d46020860182612a36565b5060408301516138e76040860182612a36565b5060608301516138fa6060860182612a36565b50608083015161390d6080860182612a36565b5060a083015161392060a0860182612a36565b5060c083015161393360c086018261349b565b5060e083015161394660e0860182612a36565b5061010083015161395b6101008601826134b4565b5061012083015184820361012086015261397582826131bd565b9150506101408301518482036101408601526139918282613514565b9150506101608301518482036101608601526139ad82826131bd565b9150506101808301516139c4610180860182612a4f565b506101a08301516139d96101a0860182612a4f565b506101c08301516139ee6101c0860182612a8a565b506101e0830151848203610260860152613a088282612b59565b9150508091505092915050565b60006020820190508181036000830152613a2f81846138a8565b905092915050565b60008060408385031215613a4e57613a4d6129a1565b5b6000613a5c858286016129f4565b9250506020613a6d858286016129f4565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000608083016000830151613abb6000860182612a4f565b506020830151613ace6020860182612a4f565b5060408301518482036040860152613ae682826131bd565b9150506060830151613afb6060860182612a4f565b508091505092915050565b6000613b128383613aa3565b905092915050565b6000602082019050919050565b6000613b3282613a77565b613b3c8185613a82565b935083602082028501613b4e85613a93565b8060005b85811015613b8a5784840389528151613b6b8582613b06565b9450613b7683613b1a565b925060208a01995050600181019050613b52565b50829750879550505050505092915050565b60006020820190508181036000830152613bb68184613b27565b905092915050565b6000608083016000830151613bd66000860182612a36565b506020830151613be96020860182612a4f565b506040830151613bfc6040860182612a4f565b5060608301518482036060860152613c1482826131bd565b9150508091505092915050565b60006020820190508181036000830152613c3b8184613bbe565b905092915050565b600081519050613c52816129dd565b92915050565b600060208284031215613c6e57613c6d6129a1565b5b6000613c7c84828501613c43565b91505092915050565b600081519050613c9481612cdc565b92915050565b600060208284031215613cb057613caf6129a1565b5b6000613cbe84828501613c85565b91505092915050565b613cd0816129cb565b82525050565b6000602082019050613ceb6000830184613cc7565b92915050565b6000604082019050613d066000830185612d5b565b613d136020830184613cc7565b9392505050565b600081519050613d298161379c565b92915050565b600060208284031215613d4557613d446129a1565b5b6000613d5384828501613d1a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d9682612a45565b9150613da183612a45565b925082821015613db457613db3613d5c565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b613df781612f53565b8114613e0257600080fd5b50565b600081519050613e1481613dee565b92915050565b600060208284031215613e3057613e2f6129a1565b5b6000613e3e84828501613e05565b91505092915050565b600080fd5b600067ffffffffffffffff821115613e6757613e66612d9b565b5b613e7082612d8a565b9050602081019050919050565b6000613e90613e8b84613e4c565b612dfb565b905082815260208101848484011115613eac57613eab613e47565b5b613eb7848285612f8b565b509392505050565b600082601f830112613ed457613ed3612d85565b5b8151613ee4848260208601613e7d565b91505092915050565b600060208284031215613f0357613f026129a1565b5b600082015167ffffffffffffffff811115613f2157613f206129a6565b5b613f2d84828501613ebf565b91505092915050565b6000613f4182612a45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f7457613f73613d5c565b5b600182019050919050565b600060c08284031215613f9557613f94613797565b5b613f9f60c0612dfb565b90506000613faf84828501613c43565b6000830152506020613fc384828501613c43565b6020830152506040613fd784828501613c43565b6040830152506060613feb84828501613c43565b6060830152506080613fff84828501613c43565b60808301525060a061401384828501613d1a565b60a08301525092915050565b600060c08284031215614035576140346129a1565b5b600061404384828501613f7f565b91505092915050565b614055816134aa565b811461406057600080fd5b50565b6000815190506140728161404c565b92915050565b60006020828403121561408e5761408d6129a1565b5b600061409c84828501614063565b91505092915050565b6140ae816134aa565b82525050565b60006020820190506140c960008301846140a5565b92915050565b60006140e26140dd84612e16565b612dfb565b9050808382526020820190506020840283018581111561410557614104612e42565b5b835b8181101561412e578061411a8882613c43565b845260208401935050602081019050614107565b5050509392505050565b600082601f83011261414d5761414c612d85565b5b815161415d8482602086016140cf565b91505092915050565b6000614179614174846132a0565b612dfb565b9050808382526020820190506020840283018581111561419c5761419b612e42565b5b835b818110156141c557806141b18882613c85565b84526020840193505060208101905061419e565b5050509392505050565b600082601f8301126141e4576141e3612d85565b5b81516141f4848260208601614166565b91505092915050565b600080600060608486031215614216576142156129a1565b5b600084015167ffffffffffffffff811115614234576142336129a6565b5b61424086828701614138565b935050602084015167ffffffffffffffff811115614261576142606129a6565b5b61426d868287016141cf565b925050604061427e86828701613c85565b9150509250925092565b60006020828403121561429e5761429d6129a1565b5b600082015167ffffffffffffffff8111156142bc576142bb6129a6565b5b6142c8848285016141cf565b9150509291505056fea2646970667358221220975f5dc32466a02fef634738388e970292b65e9f08e268cbbcc68c06c3ffc5d964736f6c634300080b0033
Deployed Bytecode Sourcemap
69642:11833:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71258:752;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69678:106;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80732:363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80048:676;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79217:823;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81103:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73005:457;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76301:2387;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78696:513;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72018:979;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73470:1639;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71258:752;71315:18;;:::i;:::-;71346:26;71389:6;71346:50;;71409:18;71430:12;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71409:46;;71466:23;71492:12;:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71466:56;;71533:19;71555:12;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71533:48;;71592:23;71618:12;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71592:58;;71663:34;71700:23;71716:6;71700:15;:23::i;:::-;71663:60;;71744:258;;;;;;;;71771:6;71744:258;;;;;;71804:10;71744:258;;;;;;71846:15;71744:258;;;;71889:11;71744:258;;;;71934:15;71744:258;;;;71978:12;71744:258;;;71736:266;;71335:675;;;;;;71258:752;;;:::o;69678:106::-;;;:::o;80732:363::-;80857:15;80885:13;80916:5;80901:31;;;80941:4;80901:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80885:62;;80971:7;80958:36;;;80995:4;81009:1;80958:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81082:5;81048;81033:31;;;81073:4;81033:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;81023:64;;80874:221;80732:363;;;;;:::o;80048:676::-;80117:14;80144;80161:10;:17;80144:34;;80189:21;80225:6;80213:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;80189:43;;80250:9;80245:446;80269:6;80265:1;:10;80245:446;;;80297:12;80312:10;80323:1;80312:13;;;;;;;;:::i;:::-;;;;;;;;80297:28;;80340:20;80378:4;80340:43;;80400:14;80433:5;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;80429:137;;80549:1;80538:12;;80429:137;;;;80480:5;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80469:27;;80429:137;80594:85;;;;;;;;80608:4;80594:85;;;;;;80624:8;80594:85;;;;;;80642:5;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80594:85;;;;80664:5;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80594:85;;;80582:6;80589:1;80582:9;;;;;;;;:::i;:::-;;;;;;;:97;;;;80282:409;;;80277:3;;;;;:::i;:::-;;;;80245:446;;;;80710:6;80703:13;;;;80048:676;;;:::o;79217:823::-;79350:19;;:::i;:::-;79382:20;79421:11;79382:51;;79444:14;79461:4;:14;;;79476:8;79461:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79444:41;;79496:14;79513:4;:11;;;79525:8;79513:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79496:38;;79547:26;79576:4;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79547:54;;79612:35;79664:18;79650:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79612:71;;79699:9;79694:220;79718:18;79714:1;:22;79694:220;;;79758:32;79809:4;:17;;;79827:1;79809:20;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79758:72;;79869:16;:23;;;79893:8;79869:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79845:18;79864:1;79845:21;;;;;;;;:::i;:::-;;;;;;;:57;;;;;79743:171;79738:3;;;;;:::i;:::-;;;;79694:220;;;;79933:99;;;;;;;;79953:4;79933:99;;;;79983:6;79933:99;;;;80011:18;79933:99;;;;79967:6;79933:99;;;79926:106;;;;;;;79217:823;;;;;:::o;81103:369::-;81249:25;81312:5;:12;81298:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81287:38;;81341:9;81336:129;81360:5;:12;81356:1;:16;81336:129;;;81408:45;81428:5;81434:1;81428:8;;;;;;;;:::i;:::-;;;;;;;;81438:7;81447:5;81408:19;:45::i;:::-;81394:8;81403:1;81394:11;;;;;;;;:::i;:::-;;;;;;;:59;;;;;81374:3;;;;;:::i;:::-;;;;81336:129;;;;81103:369;;;;;:::o;73005:457::-;73064:13;73090:20;73126:8;73090:45;;73148:18;73169:7;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73148:41;;73200:19;73233:10;73222:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;73200:44;;73262:9;73257:173;73281:10;73277:1;:14;73257:173;;;73313:37;73353:7;:16;;;73370:1;73353:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73313:59;;73398:20;73406:8;73416:1;73398:7;:20::i;:::-;73387:5;73393:1;73387:8;;;;;;;;:::i;:::-;;;;;;;:31;;;;73298:132;73293:3;;;;;:::i;:::-;;;;73257:173;;;;73449:5;73442:12;;;;;73005:457;;;:::o;76301:2387::-;76392:11;;:::i;:::-;76416:26;76461:8;:19;;;76416:65;;76492:26;76535:8;:16;;;76492:60;;76704:14;76729:34;76774:27;76812;76856:12;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;76852:612;;77311:1;77303:10;;77294:19;;77355:1;77341:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77328:29;;77399:1;77385:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77372:29;;77450:1;77436:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77416:36;;76852:612;;;76937:13;76928:22;;76994:13;:27;;;77022:6;76994:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76965:64;;;;;;;;;77050:12;:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;77046:215;;77243:1;77229:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77209:36;;77046:215;;;77160:7;77140:27;;77086:97;77046:215;76881:391;76852:612;77476:34;77513:36;77529:8;:19;;;77513:15;:36::i;:::-;77476:73;;77562:30;77595:312;;;;;;;;77686:10;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77595:312;;;;77742:10;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77595:312;;;;77634:10;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77595:312;;;;77806:10;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77595:312;;;;77869:10;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77595:312;;;77562:345;;77940:740;;;;;;;;77969:4;77940:740;;;;78001:8;:16;;;77940:740;;;;;;78043:8;:14;;;77940:740;;;;;;78083:8;:14;;;77940:740;;;;;;78128:8;:19;;;77940:740;;;;;;78173:8;:14;;;77940:740;;;;;;78216:8;:17;;;77940:740;;;;;;78265:10;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77940:740;;;;;;78316:6;77940:740;;;;78360:17;77940:740;;;;78408:10;77940:740;;;;78449:10;77940:740;;;;78579:10;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77940:740;;;;78638:12;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77940:740;;;;78491:11;77940:740;;;;78535:12;77940:740;;;77920:760;;;;;;;;;;76301:2387;;;;:::o;78696:513::-;78781:21;78815:18;78849:8;78836:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78815:56;;78882:30;78934:10;78915:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;78882:63;;78961:9;78956:220;78980:10;78976:1;:14;78956:220;;;79012:37;79065:8;79052:31;;;79084:1;79052:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79012:74;;79115:49;79131:8;:19;;;79152:1;79155:8;79115:15;:49::i;:::-;79101:8;79110:1;79101:11;;;;;;;;:::i;:::-;;;;;;;:63;;;;78997:179;78992:3;;;;;:::i;:::-;;;;78956:220;;;;79193:8;79186:15;;;;78696:513;;;;:::o;72018:979::-;72127:32;;:::i;:::-;72177:26;72220:6;72177:50;;72240:15;72258:12;:22;;;72281:8;72258:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72240:50;;72301:27;72331:12;:32;;;72364:8;72331:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72301:72;;72386:26;72415:12;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72386:62;;72459:35;72511:18;72497:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72459:71;;72546:9;72541:228;72565:18;72561:1;:22;72541:228;;;72605:32;72656:12;:25;;;72682:1;72656:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72605:80;;72724:16;:23;;;72748:8;72724:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72700:18;72719:1;72700:21;;;;;;;;:::i;:::-;;;;;;;:57;;;;;72590:179;72585:3;;;;;:::i;:::-;;;;72541:228;;;;72796:193;;;;;;;;72830:8;72796:193;;;;;;72862:7;72796:193;;;;72905:19;72796:193;;;;72959:18;72796:193;;;72781:208;;72166:831;;;;;72018:979;;;;:::o;73470:1639::-;73541:11;;:::i;:::-;73565:20;73604:14;73565:54;;73630:14;73647:4;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73630:36;;73679:34;73730:1;73716:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73679:53;;73766:1;73743:17;73761:1;73743:20;;;;;;;;:::i;:::-;;;;;;;:24;;;;;73778:27;73822:1;73808:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73778:46;;73851:6;73835:10;73846:1;73835:13;;;;;;;;:::i;:::-;;;;;;;:22;;;;;;;;;;;73868:27;73912:1;73898:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73868:46;;73956:6;73941:32;;;73974:14;73941:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73925:10;73936:1;73925:13;;;;;;;;:::i;:::-;;;;;;;:64;;;;;74002:30;74035:282;;;;;;;;74120:4;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74035:282;;;;74170:4;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74035:282;;;;74074:4;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74035:282;;;;74228:4;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74035:282;;;;74285:4;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74035:282;;;74002:315;;74330:34;74367:31;74383:14;74367:15;:31::i;:::-;74330:68;;74431:670;;;;;;;;74468:1;74431:670;;;;74498:6;74431:670;;;;;;74530:6;74431:670;;;;;;74570:1;74431:670;;;;;;74603:14;74431:670;;;;;;74651:1;74431:670;;;;;;74682:5;74431:670;;;;;;74719:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74431:670;;;;;;74772:1;74764:10;;74431:670;;;;74812:17;74431:670;;;;74860:10;74431:670;;;;74901:10;74431:670;;;;75031:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74431:670;;;;75084:1;74431:670;;;;74943:11;74431:670;;;;74987:12;74431:670;;;74411:690;;;;;;;;;73470:1639;;;:::o;75117:1176::-;75190:21;75224:30;75273:15;75224:65;;75302:26;75331:14;:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75302:64;;75377:34;75433:18;75414:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;75377:75;;75470:9;75465:789;75489:18;75485:1;:22;75465:789;;;75529:12;75544:14;:27;;;75572:1;75544:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75529:45;;75589:32;75640:4;75589:56;;75660:23;75686:366;;;;;;;;75791:16;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75686:366;;;;75857:16;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75686:366;;;;75729:16;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75686:366;;;;75931:16;:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75686:366;;;;76004:16;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75686:366;;;75660:392;;76085:157;;;;;;;;76123:4;76085:157;;;;;;76196:16;:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76085:157;;;;;;76159:4;76085:157;;;76067:12;76080:1;76067:15;;;;;;;;:::i;:::-;;;;;;;:175;;;;75514:740;;;75509:3;;;;;:::i;:::-;;;;75465:789;;;;76273:12;76266:19;;;;;75117:1176;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:108::-;1253:24;1271:5;1253:24;:::i;:::-;1248:3;1241:37;1176:108;;:::o;1290:77::-;1327:7;1356:5;1345:16;;1290:77;;;:::o;1373:108::-;1450:24;1468:5;1450:24;:::i;:::-;1445:3;1438:37;1373:108;;:::o;1487:144::-;1584:6;1618:5;1612:12;1602:22;;1487:144;;;:::o;1637:204::-;1756:11;1790:6;1785:3;1778:19;1830:4;1825:3;1821:14;1806:29;;1637:204;;;;:::o;1847:162::-;1944:4;1967:3;1959:11;;1997:4;1992:3;1988:14;1980:22;;1847:162;;;:::o;2103:1076::-;2248:4;2243:3;2239:14;2343:4;2336:5;2332:16;2326:23;2362:63;2419:4;2414:3;2410:14;2396:12;2362:63;:::i;:::-;2263:172;2527:4;2520:5;2516:16;2510:23;2546:63;2603:4;2598:3;2594:14;2580:12;2546:63;:::i;:::-;2445:174;2707:4;2700:5;2696:16;2690:23;2726:63;2783:4;2778:3;2774:14;2760:12;2726:63;:::i;:::-;2629:170;2897:4;2890:5;2886:16;2880:23;2916:63;2973:4;2968:3;2964:14;2950:12;2916:63;:::i;:::-;2809:180;3080:4;3073:5;3069:16;3063:23;3099:63;3156:4;3151:3;3147:14;3133:12;3099:63;:::i;:::-;2999:173;2217:962;2103:1076;;:::o;3275:754::-;3422:4;3417:3;3413:14;3509:4;3502:5;3498:16;3492:23;3528:63;3585:4;3580:3;3576:14;3562:12;3528:63;:::i;:::-;3437:164;3691:4;3684:5;3680:16;3674:23;3710:63;3767:4;3762:3;3758:14;3744:12;3710:63;:::i;:::-;3611:172;3872:4;3865:5;3861:16;3855:23;3891:121;4006:4;4001:3;3997:14;3983:12;3891:121;:::i;:::-;3793:229;3391:638;3275:754;;:::o;4035:299::-;4164:10;4185:106;4287:3;4279:6;4185:106;:::i;:::-;4323:4;4318:3;4314:14;4300:28;;4035:299;;;;:::o;4340:143::-;4440:4;4472;4467:3;4463:14;4455:22;;4340:143;;;:::o;4583:952::-;4752:3;4781:84;4859:5;4781:84;:::i;:::-;4881:106;4980:6;4975:3;4881:106;:::i;:::-;4874:113;;5011:86;5091:5;5011:86;:::i;:::-;5120:7;5151:1;5136:374;5161:6;5158:1;5155:13;5136:374;;;5237:6;5231:13;5264:123;5383:3;5368:13;5264:123;:::i;:::-;5257:130;;5410:90;5493:6;5410:90;:::i;:::-;5400:100;;5196:314;5183:1;5180;5176:9;5171:14;;5136:374;;;5140:14;5526:3;5519:10;;4757:778;;;4583:952;;;;:::o;5617:1433::-;5732:3;5768:4;5763:3;5759:14;5855:4;5848:5;5844:16;5838:23;5874:63;5931:4;5926:3;5922:14;5908:12;5874:63;:::i;:::-;5783:164;6035:4;6028:5;6024:16;6018:23;6054:63;6111:4;6106:3;6102:14;6088:12;6054:63;:::i;:::-;5957:170;6220:4;6213:5;6209:16;6203:23;6239:63;6296:4;6291:3;6287:14;6273:12;6239:63;:::i;:::-;6137:175;6401:4;6394:5;6390:16;6384:23;6420:63;6477:4;6472:3;6468:14;6454:12;6420:63;:::i;:::-;6322:171;6588:4;6581:5;6577:16;6571:23;6607:63;6664:4;6659:3;6655:14;6641:12;6607:63;:::i;:::-;6503:177;6770:4;6763:5;6759:16;6753:23;6823:3;6817:4;6813:14;6806:4;6801:3;6797:14;6790:38;6849:163;7007:4;6993:12;6849:163;:::i;:::-;6841:171;;6690:333;7040:4;7033:11;;5737:1313;5617:1433;;;;:::o;7056:365::-;7195:4;7233:2;7222:9;7218:18;7210:26;;7282:9;7276:4;7272:20;7268:1;7257:9;7253:17;7246:47;7310:104;7409:4;7400:6;7310:104;:::i;:::-;7302:112;;7056:365;;;;:::o;7427:60::-;7455:3;7476:5;7469:12;;7427:60;;;:::o;7493:142::-;7543:9;7576:53;7594:34;7603:24;7621:5;7603:24;:::i;:::-;7594:34;:::i;:::-;7576:53;:::i;:::-;7563:66;;7493:142;;;:::o;7641:126::-;7691:9;7724:37;7755:5;7724:37;:::i;:::-;7711:50;;7641:126;;;:::o;7773:149::-;7846:9;7879:37;7910:5;7879:37;:::i;:::-;7866:50;;7773:149;;;:::o;7928:177::-;8038:60;8092:5;8038:60;:::i;:::-;8033:3;8026:73;7928:177;;:::o;8111:268::-;8227:4;8265:2;8254:9;8250:18;8242:26;;8278:94;8369:1;8358:9;8354:17;8345:6;8278:94;:::i;:::-;8111:268;;;;:::o;8385:122::-;8458:24;8476:5;8458:24;:::i;:::-;8451:5;8448:35;8438:63;;8497:1;8494;8487:12;8438:63;8385:122;:::o;8513:139::-;8559:5;8597:6;8584:20;8575:29;;8613:33;8640:5;8613:33;:::i;:::-;8513:139;;;;:::o;8658:619::-;8735:6;8743;8751;8800:2;8788:9;8779:7;8775:23;8771:32;8768:119;;;8806:79;;:::i;:::-;8768:119;8926:1;8951:53;8996:7;8987:6;8976:9;8972:22;8951:53;:::i;:::-;8941:63;;8897:117;9053:2;9079:53;9124:7;9115:6;9104:9;9100:22;9079:53;:::i;:::-;9069:63;;9024:118;9181:2;9207:53;9252:7;9243:6;9232:9;9228:22;9207:53;:::i;:::-;9197:63;;9152:118;8658:619;;;;;:::o;9283:118::-;9370:24;9388:5;9370:24;:::i;:::-;9365:3;9358:37;9283:118;;:::o;9407:222::-;9500:4;9538:2;9527:9;9523:18;9515:26;;9551:71;9619:1;9608:9;9604:17;9595:6;9551:71;:::i;:::-;9407:222;;;;:::o;9635:117::-;9744:1;9741;9734:12;9758:102;9799:6;9850:2;9846:7;9841:2;9834:5;9830:14;9826:28;9816:38;;9758:102;;;:::o;9866:180::-;9914:77;9911:1;9904:88;10011:4;10008:1;10001:15;10035:4;10032:1;10025:15;10052:281;10135:27;10157:4;10135:27;:::i;:::-;10127:6;10123:40;10265:6;10253:10;10250:22;10229:18;10217:10;10214:34;10211:62;10208:88;;;10276:18;;:::i;:::-;10208:88;10316:10;10312:2;10305:22;10095:238;10052:281;;:::o;10339:129::-;10373:6;10400:20;;:::i;:::-;10390:30;;10429:33;10457:4;10449:6;10429:33;:::i;:::-;10339:129;;;:::o;10474:311::-;10551:4;10641:18;10633:6;10630:30;10627:56;;;10663:18;;:::i;:::-;10627:56;10713:4;10705:6;10701:17;10693:25;;10773:4;10767;10763:15;10755:23;;10474:311;;;:::o;10791:117::-;10900:1;10897;10890:12;10931:710;11027:5;11052:81;11068:64;11125:6;11068:64;:::i;:::-;11052:81;:::i;:::-;11043:90;;11153:5;11182:6;11175:5;11168:21;11216:4;11209:5;11205:16;11198:23;;11269:4;11261:6;11257:17;11249:6;11245:30;11298:3;11290:6;11287:15;11284:122;;;11317:79;;:::i;:::-;11284:122;11432:6;11415:220;11449:6;11444:3;11441:15;11415:220;;;11524:3;11553:37;11586:3;11574:10;11553:37;:::i;:::-;11548:3;11541:50;11620:4;11615:3;11611:14;11604:21;;11491:144;11475:4;11470:3;11466:14;11459:21;;11415:220;;;11419:21;11033:608;;10931:710;;;;;:::o;11664:370::-;11735:5;11784:3;11777:4;11769:6;11765:17;11761:27;11751:122;;11792:79;;:::i;:::-;11751:122;11909:6;11896:20;11934:94;12024:3;12016:6;12009:4;12001:6;11997:17;11934:94;:::i;:::-;11925:103;;11741:293;11664:370;;;;:::o;12040:539::-;12124:6;12173:2;12161:9;12152:7;12148:23;12144:32;12141:119;;;12179:79;;:::i;:::-;12141:119;12327:1;12316:9;12312:17;12299:31;12357:18;12349:6;12346:30;12343:117;;;12379:79;;:::i;:::-;12343:117;12484:78;12554:7;12545:6;12534:9;12530:22;12484:78;:::i;:::-;12474:88;;12270:302;12040:539;;;;:::o;12585:137::-;12675:6;12709:5;12703:12;12693:22;;12585:137;;;:::o;12728:207::-;12850:11;12884:6;12879:3;12872:19;12924:4;12919:3;12915:14;12900:29;;12728:207;;;;:::o;12941:155::-;13031:4;13054:3;13046:11;;13084:4;13079:3;13075:14;13067:22;;12941:155;;;:::o;13102:86::-;13137:7;13177:4;13170:5;13166:16;13155:27;;13102:86;;;:::o;13194:102::-;13267:22;13283:5;13267:22;:::i;:::-;13262:3;13255:35;13194:102;;:::o;13302:99::-;13354:6;13388:5;13382:12;13372:22;;13302:99;;;:::o;13407:159::-;13481:11;13515:6;13510:3;13503:19;13555:4;13550:3;13546:14;13531:29;;13407:159;;;;:::o;13572:307::-;13640:1;13650:113;13664:6;13661:1;13658:13;13650:113;;;13749:1;13744:3;13740:11;13734:18;13730:1;13725:3;13721:11;13714:39;13686:2;13683:1;13679:10;13674:15;;13650:113;;;13781:6;13778:1;13775:13;13772:101;;;13861:1;13852:6;13847:3;13843:16;13836:27;13772:101;13621:258;13572:307;;;:::o;13885:344::-;13963:3;13991:39;14024:5;13991:39;:::i;:::-;14046:61;14100:6;14095:3;14046:61;:::i;:::-;14039:68;;14116:52;14161:6;14156:3;14149:4;14142:5;14138:16;14116:52;:::i;:::-;14193:29;14215:6;14193:29;:::i;:::-;14188:3;14184:39;14177:46;;13967:262;13885:344;;;;:::o;14311:1013::-;14416:3;14452:4;14447:3;14443:14;14539:4;14532:5;14528:16;14522:23;14558:63;14615:4;14610:3;14606:14;14592:12;14558:63;:::i;:::-;14467:164;14717:4;14710:5;14706:16;14700:23;14736:59;14789:4;14784:3;14780:14;14766:12;14736:59;:::i;:::-;14641:164;14889:4;14882:5;14878:16;14872:23;14942:3;14936:4;14932:14;14925:4;14920:3;14916:14;14909:38;14968:73;15036:4;15022:12;14968:73;:::i;:::-;14960:81;;14815:237;15134:4;15127:5;15123:16;15117:23;15187:3;15181:4;15177:14;15170:4;15165:3;15161:14;15154:38;15213:73;15281:4;15267:12;15213:73;:::i;:::-;15205:81;;15062:235;15314:4;15307:11;;14421:903;14311:1013;;;;:::o;15330:248::-;15445:10;15480:92;15568:3;15560:6;15480:92;:::i;:::-;15466:106;;15330:248;;;;:::o;15584:136::-;15677:4;15709;15704:3;15700:14;15692:22;;15584:136;;;:::o;15806:1095::-;15971:3;16000:77;16071:5;16000:77;:::i;:::-;16093:109;16195:6;16190:3;16093:109;:::i;:::-;16086:116;;16228:3;16273:4;16265:6;16261:17;16256:3;16252:27;16303:79;16376:5;16303:79;:::i;:::-;16405:7;16436:1;16421:435;16446:6;16443:1;16440:13;16421:435;;;16517:9;16511:4;16507:20;16502:3;16495:33;16568:6;16562:13;16596:110;16701:4;16686:13;16596:110;:::i;:::-;16588:118;;16729:83;16805:6;16729:83;:::i;:::-;16719:93;;16841:4;16836:3;16832:14;16825:21;;16481:375;16468:1;16465;16461:9;16456:14;;16421:435;;;16425:14;16872:4;16865:11;;16892:3;16885:10;;15976:925;;;;;15806:1095;;;;:::o;16907:465::-;17096:4;17134:2;17123:9;17119:18;17111:26;;17183:9;17177:4;17173:20;17169:1;17158:9;17154:17;17147:47;17211:154;17360:4;17351:6;17211:154;:::i;:::-;17203:162;;16907:465;;;;:::o;17378:619::-;17455:6;17463;17471;17520:2;17508:9;17499:7;17495:23;17491:32;17488:119;;;17526:79;;:::i;:::-;17488:119;17646:1;17671:53;17716:7;17707:6;17696:9;17692:22;17671:53;:::i;:::-;17661:63;;17617:117;17773:2;17799:53;17844:7;17835:6;17824:9;17820:22;17799:53;:::i;:::-;17789:63;;17744:118;17901:2;17927:53;17972:7;17963:6;17952:9;17948:22;17927:53;:::i;:::-;17917:63;;17872:118;17378:619;;;;;:::o;18003:114::-;18070:6;18104:5;18098:12;18088:22;;18003:114;;;:::o;18123:174::-;18212:11;18246:6;18241:3;18234:19;18286:4;18281:3;18277:14;18262:29;;18123:174;;;;:::o;18303:132::-;18370:4;18393:3;18385:11;;18423:4;18418:3;18414:14;18406:22;;18303:132;;;:::o;18441:179::-;18510:10;18531:46;18573:3;18565:6;18531:46;:::i;:::-;18609:4;18604:3;18600:14;18586:28;;18441:179;;;;:::o;18626:113::-;18696:4;18728;18723:3;18719:14;18711:22;;18626:113;;;:::o;18775:712::-;18884:3;18913:54;18961:5;18913:54;:::i;:::-;18983:76;19052:6;19047:3;18983:76;:::i;:::-;18976:83;;19083:56;19133:5;19083:56;:::i;:::-;19162:7;19193:1;19178:284;19203:6;19200:1;19197:13;19178:284;;;19279:6;19273:13;19306:63;19365:3;19350:13;19306:63;:::i;:::-;19299:70;;19392:60;19445:6;19392:60;:::i;:::-;19382:70;;19238:224;19225:1;19222;19218:9;19213:14;;19178:284;;;19182:14;19478:3;19471:10;;18889:598;;;18775:712;;;;:::o;19583:1011::-;19712:3;19748:4;19743:3;19739:14;19834:4;19827:5;19823:16;19817:23;19853:63;19910:4;19905:3;19901:14;19887:12;19853:63;:::i;:::-;19763:163;20010:4;20003:5;19999:16;19993:23;20029:63;20086:4;20081:3;20077:14;20063:12;20029:63;:::i;:::-;19936:166;20198:4;20191:5;20187:16;20181:23;20251:3;20245:4;20241:14;20234:4;20229:3;20225:14;20218:38;20277:103;20375:4;20361:12;20277:103;:::i;:::-;20269:111;;20112:279;20475:4;20468:5;20464:16;20458:23;20494:63;20551:4;20546:3;20542:14;20528:12;20494:63;:::i;:::-;20401:166;20584:4;20577:11;;19717:877;19583:1011;;;;:::o;20600:393::-;20753:4;20791:2;20780:9;20776:18;20768:26;;20840:9;20834:4;20830:20;20826:1;20815:9;20811:17;20804:47;20868:118;20981:4;20972:6;20868:118;:::i;:::-;20860:126;;20600:393;;;;:::o;20999:311::-;21076:4;21166:18;21158:6;21155:30;21152:56;;;21188:18;;:::i;:::-;21152:56;21238:4;21230:6;21226:17;21218:25;;21298:4;21292;21288:15;21280:23;;20999:311;;;:::o;21333:710::-;21429:5;21454:81;21470:64;21527:6;21470:64;:::i;:::-;21454:81;:::i;:::-;21445:90;;21555:5;21584:6;21577:5;21570:21;21618:4;21611:5;21607:16;21600:23;;21671:4;21663:6;21659:17;21651:6;21647:30;21700:3;21692:6;21689:15;21686:122;;;21719:79;;:::i;:::-;21686:122;21834:6;21817:220;21851:6;21846:3;21843:15;21817:220;;;21926:3;21955:37;21988:3;21976:10;21955:37;:::i;:::-;21950:3;21943:50;22022:4;22017:3;22013:14;22006:21;;21893:144;21877:4;21872:3;21868:14;21861:21;;21817:220;;;21821:21;21435:608;;21333:710;;;;;:::o;22066:370::-;22137:5;22186:3;22179:4;22171:6;22167:17;22163:27;22153:122;;22194:79;;:::i;:::-;22153:122;22311:6;22298:20;22336:94;22426:3;22418:6;22411:4;22403:6;22399:17;22336:94;:::i;:::-;22327:103;;22143:293;22066:370;;;;:::o;22442:829::-;22544:6;22552;22560;22609:2;22597:9;22588:7;22584:23;22580:32;22577:119;;;22615:79;;:::i;:::-;22577:119;22763:1;22752:9;22748:17;22735:31;22793:18;22785:6;22782:30;22779:117;;;22815:79;;:::i;:::-;22779:117;22920:78;22990:7;22981:6;22970:9;22966:22;22920:78;:::i;:::-;22910:88;;22706:302;23047:2;23073:53;23118:7;23109:6;23098:9;23094:22;23073:53;:::i;:::-;23063:63;;23018:118;23175:2;23201:53;23246:7;23237:6;23226:9;23222:22;23201:53;:::i;:::-;23191:63;;23146:118;22442:829;;;;;:::o;23277:184::-;23376:11;23410:6;23405:3;23398:19;23450:4;23445:3;23441:14;23426:29;;23277:184;;;;:::o;23497:732::-;23616:3;23645:54;23693:5;23645:54;:::i;:::-;23715:86;23794:6;23789:3;23715:86;:::i;:::-;23708:93;;23825:56;23875:5;23825:56;:::i;:::-;23904:7;23935:1;23920:284;23945:6;23942:1;23939:13;23920:284;;;24021:6;24015:13;24048:63;24107:3;24092:13;24048:63;:::i;:::-;24041:70;;24134:60;24187:6;24134:60;:::i;:::-;24124:70;;23980:224;23967:1;23964;23960:9;23955:14;;23920:284;;;23924:14;24220:3;24213:10;;23621:608;;;23497:732;;;;:::o;24235:373::-;24378:4;24416:2;24405:9;24401:18;24393:26;;24465:9;24459:4;24455:20;24451:1;24440:9;24436:17;24429:47;24493:108;24596:4;24587:6;24493:108;:::i;:::-;24485:116;;24235:373;;;;:::o;24614:136::-;24703:6;24737:5;24731:12;24721:22;;24614:136;;;:::o;24756:206::-;24877:11;24911:6;24906:3;24899:19;24951:4;24946:3;24942:14;24927:29;;24756:206;;;;:::o;24968:154::-;25057:4;25080:3;25072:11;;25110:4;25105:3;25101:14;25093:22;;24968:154;;;:::o;25128:90::-;25162:7;25205:5;25198:13;25191:21;25180:32;;25128:90;;;:::o;25224:99::-;25295:21;25310:5;25295:21;:::i;:::-;25290:3;25283:34;25224:99;;:::o;25329:77::-;25366:7;25395:5;25384:16;;25329:77;;;:::o;25412:108::-;25489:24;25507:5;25489:24;:::i;:::-;25484:3;25477:37;25412:108;;:::o;25526:114::-;25593:6;25627:5;25621:12;25611:22;;25526:114;;;:::o;25646:174::-;25735:11;25769:6;25764:3;25757:19;25809:4;25804:3;25800:14;25785:29;;25646:174;;;;:::o;25826:132::-;25893:4;25916:3;25908:11;;25946:4;25941:3;25937:14;25929:22;;25826:132;;;:::o;25964:179::-;26033:10;26054:46;26096:3;26088:6;26054:46;:::i;:::-;26132:4;26127:3;26123:14;26109:28;;25964:179;;;;:::o;26149:113::-;26219:4;26251;26246:3;26242:14;26234:22;;26149:113;;;:::o;26298:712::-;26407:3;26436:54;26484:5;26436:54;:::i;:::-;26506:76;26575:6;26570:3;26506:76;:::i;:::-;26499:83;;26606:56;26656:5;26606:56;:::i;:::-;26685:7;26716:1;26701:284;26726:6;26723:1;26720:13;26701:284;;;26802:6;26796:13;26829:63;26888:3;26873:13;26829:63;:::i;:::-;26822:70;;26915:60;26968:6;26915:60;:::i;:::-;26905:70;;26761:224;26748:1;26745;26741:9;26736:14;;26701:284;;;26705:14;27001:3;26994:10;;26412:598;;;26298:712;;;;:::o;27090:3586::-;27193:3;27229:6;27224:3;27220:16;27317:4;27310:5;27306:16;27300:23;27336:63;27393:4;27388:3;27384:14;27370:12;27336:63;:::i;:::-;27246:163;27494:4;27487:5;27483:16;27477:23;27513:63;27570:4;27565:3;27561:14;27547:12;27513:63;:::i;:::-;27419:167;27669:4;27662:5;27658:16;27652:23;27688:63;27745:4;27740:3;27736:14;27722:12;27688:63;:::i;:::-;27596:165;27844:4;27837:5;27833:16;27827:23;27863:63;27920:4;27915:3;27911:14;27897:12;27863:63;:::i;:::-;27771:165;28024:4;28017:5;28013:16;28007:23;28043:63;28100:4;28095:3;28091:14;28077:12;28043:63;:::i;:::-;27946:170;28199:4;28192:5;28188:16;28182:23;28218:63;28275:4;28270:3;28266:14;28252:12;28218:63;:::i;:::-;28126:165;28377:4;28370:5;28366:16;28360:23;28396:57;28447:4;28442:3;28438:14;28424:12;28396:57;:::i;:::-;28301:162;28552:4;28545:5;28541:16;28535:23;28571:63;28628:4;28623:3;28619:14;28605:12;28571:63;:::i;:::-;28473:171;28728:6;28721:5;28717:18;28711:25;28749:65;28806:6;28801:3;28797:16;28783:12;28749:65;:::i;:::-;28654:170;28919:6;28912:5;28908:18;28902:25;28976:3;28970:4;28966:14;28957:6;28952:3;28948:16;28941:40;29002:103;29100:4;29086:12;29002:103;:::i;:::-;28994:111;;28834:282;29204:6;29197:5;29193:18;29187:25;29261:3;29255:4;29251:14;29242:6;29237:3;29233:16;29226:40;29287:103;29385:4;29371:12;29287:103;:::i;:::-;29279:111;;29126:275;29489:6;29482:5;29478:18;29472:25;29546:3;29540:4;29536:14;29527:6;29522:3;29518:16;29511:40;29572:103;29670:4;29656:12;29572:103;:::i;:::-;29564:111;;29411:275;29775:6;29768:5;29764:18;29758:25;29796:65;29853:6;29848:3;29844:16;29830:12;29796:65;:::i;:::-;29696:175;29963:6;29956:5;29952:18;29946:25;29984:65;30041:6;30036:3;30032:16;30018:12;29984:65;:::i;:::-;29881:178;30148:6;30141:5;30137:18;30131:25;30169:123;30284:6;30279:3;30275:16;30261:12;30169:123;:::i;:::-;30069:233;30392:6;30385:5;30381:18;30375:25;30449:3;30443:4;30439:14;30430:6;30425:3;30421:16;30414:40;30475:163;30633:4;30619:12;30475:163;:::i;:::-;30467:171;;30312:337;30666:4;30659:11;;27198:3478;27090:3586;;;;:::o;30682:244::-;30795:10;30830:90;30916:3;30908:6;30830:90;:::i;:::-;30816:104;;30682:244;;;;:::o;30932:135::-;31024:4;31056;31051:3;31047:14;31039:22;;30932:135;;;:::o;31151:1087::-;31314:3;31343:76;31413:5;31343:76;:::i;:::-;31435:108;31536:6;31531:3;31435:108;:::i;:::-;31428:115;;31569:3;31614:4;31606:6;31602:17;31597:3;31593:27;31644:78;31716:5;31644:78;:::i;:::-;31745:7;31776:1;31761:432;31786:6;31783:1;31780:13;31761:432;;;31857:9;31851:4;31847:20;31842:3;31835:33;31908:6;31902:13;31936:108;32039:4;32024:13;31936:108;:::i;:::-;31928:116;;32067:82;32142:6;32067:82;:::i;:::-;32057:92;;32178:4;32173:3;32169:14;32162:21;;31821:372;31808:1;31805;31801:9;31796:14;;31761:432;;;31765:14;32209:4;32202:11;;32229:3;32222:10;;31319:919;;;;;31151:1087;;;;:::o;32244:461::-;32431:4;32469:2;32458:9;32454:18;32446:26;;32518:9;32512:4;32508:20;32504:1;32493:9;32489:17;32482:47;32546:152;32693:4;32684:6;32546:152;:::i;:::-;32538:160;;32244:461;;;;:::o;32711:117::-;32820:1;32817;32810:12;32957:116;33027:21;33042:5;33027:21;:::i;:::-;33020:5;33017:32;33007:60;;33063:1;33060;33053:12;33007:60;32957:116;:::o;33079:133::-;33122:5;33160:6;33147:20;33138:29;;33176:30;33200:5;33176:30;:::i;:::-;33079:133;;;;:::o;33254:1234::-;33329:5;33373:4;33361:9;33356:3;33352:19;33348:30;33345:117;;;33381:79;;:::i;:::-;33345:117;33480:21;33496:4;33480:21;:::i;:::-;33471:30;;33563:1;33603:49;33648:3;33639:6;33628:9;33624:22;33603:49;:::i;:::-;33596:4;33589:5;33585:16;33578:75;33511:153;33724:2;33765:49;33810:3;33801:6;33790:9;33786:22;33765:49;:::i;:::-;33758:4;33751:5;33747:16;33740:75;33674:152;33886:2;33927:49;33972:3;33963:6;33952:9;33948:22;33927:49;:::i;:::-;33920:4;33913:5;33909:16;33902:75;33836:152;34053:2;34094:49;34139:3;34130:6;34119:9;34115:22;34094:49;:::i;:::-;34087:4;34080:5;34076:16;34069:75;33998:157;34215:3;34257:49;34302:3;34293:6;34282:9;34278:22;34257:49;:::i;:::-;34250:4;34243:5;34239:16;34232:75;34165:153;34381:3;34423:46;34465:3;34456:6;34445:9;34441:22;34423:46;:::i;:::-;34416:4;34409:5;34405:16;34398:72;34328:153;33254:1234;;;;:::o;34494:528::-;34588:6;34596;34645:3;34633:9;34624:7;34620:23;34616:33;34613:120;;;34652:79;;:::i;:::-;34613:120;34772:1;34797:79;34868:7;34859:6;34848:9;34844:22;34797:79;:::i;:::-;34787:89;;34743:143;34925:3;34952:53;34997:7;34988:6;34977:9;34973:22;34952:53;:::i;:::-;34942:63;;34896:119;34494:528;;;;;:::o;35102:3596::-;35215:3;35251:6;35246:3;35242:16;35339:4;35332:5;35328:16;35322:23;35358:63;35415:4;35410:3;35406:14;35392:12;35358:63;:::i;:::-;35268:163;35516:4;35509:5;35505:16;35499:23;35535:63;35592:4;35587:3;35583:14;35569:12;35535:63;:::i;:::-;35441:167;35691:4;35684:5;35680:16;35674:23;35710:63;35767:4;35762:3;35758:14;35744:12;35710:63;:::i;:::-;35618:165;35866:4;35859:5;35855:16;35849:23;35885:63;35942:4;35937:3;35933:14;35919:12;35885:63;:::i;:::-;35793:165;36046:4;36039:5;36035:16;36029:23;36065:63;36122:4;36117:3;36113:14;36099:12;36065:63;:::i;:::-;35968:170;36221:4;36214:5;36210:16;36204:23;36240:63;36297:4;36292:3;36288:14;36274:12;36240:63;:::i;:::-;36148:165;36399:4;36392:5;36388:16;36382:23;36418:57;36469:4;36464:3;36460:14;36446:12;36418:57;:::i;:::-;36323:162;36574:4;36567:5;36563:16;36557:23;36593:63;36650:4;36645:3;36641:14;36627:12;36593:63;:::i;:::-;36495:171;36750:6;36743:5;36739:18;36733:25;36771:65;36828:6;36823:3;36819:16;36805:12;36771:65;:::i;:::-;36676:170;36941:6;36934:5;36930:18;36924:25;36998:3;36992:4;36988:14;36979:6;36974:3;36970:16;36963:40;37024:103;37122:4;37108:12;37024:103;:::i;:::-;37016:111;;36856:282;37226:6;37219:5;37215:18;37209:25;37283:3;37277:4;37273:14;37264:6;37259:3;37255:16;37248:40;37309:103;37407:4;37393:12;37309:103;:::i;:::-;37301:111;;37148:275;37511:6;37504:5;37500:18;37494:25;37568:3;37562:4;37558:14;37549:6;37544:3;37540:16;37533:40;37594:103;37692:4;37678:12;37594:103;:::i;:::-;37586:111;;37433:275;37797:6;37790:5;37786:18;37780:25;37818:65;37875:6;37870:3;37866:16;37852:12;37818:65;:::i;:::-;37718:175;37985:6;37978:5;37974:18;37968:25;38006:65;38063:6;38058:3;38054:16;38040:12;38006:65;:::i;:::-;37903:178;38170:6;38163:5;38159:18;38153:25;38191:123;38306:6;38301:3;38297:16;38283:12;38191:123;:::i;:::-;38091:233;38414:6;38407:5;38403:18;38397:25;38471:3;38465:4;38461:14;38452:6;38447:3;38443:16;38436:40;38497:163;38655:4;38641:12;38497:163;:::i;:::-;38489:171;;38334:337;38688:4;38681:11;;35220:3478;35102:3596;;;;:::o;38704:361::-;38841:4;38879:2;38868:9;38864:18;38856:26;;38928:9;38922:4;38918:20;38914:1;38903:9;38899:17;38892:47;38956:102;39053:4;39044:6;38956:102;:::i;:::-;38948:110;;38704:361;;;;:::o;39071:474::-;39139:6;39147;39196:2;39184:9;39175:7;39171:23;39167:32;39164:119;;;39202:79;;:::i;:::-;39164:119;39322:1;39347:53;39392:7;39383:6;39372:9;39368:22;39347:53;:::i;:::-;39337:63;;39293:117;39449:2;39475:53;39520:7;39511:6;39500:9;39496:22;39475:53;:::i;:::-;39465:63;;39420:118;39071:474;;;;;:::o;39551:144::-;39648:6;39682:5;39676:12;39666:22;;39551:144;;;:::o;39701:214::-;39830:11;39864:6;39859:3;39852:19;39904:4;39899:3;39895:14;39880:29;;39701:214;;;;:::o;39921:162::-;40018:4;40041:3;40033:11;;40071:4;40066:3;40062:14;40054:22;;39921:162;;;:::o;40179:1001::-;40298:3;40334:4;40329:3;40325:14;40420:4;40413:5;40409:16;40403:23;40439:63;40496:4;40491:3;40487:14;40473:12;40439:63;:::i;:::-;40349:163;40596:4;40589:5;40585:16;40579:23;40615:63;40672:4;40667:3;40663:14;40649:12;40615:63;:::i;:::-;40522:166;40784:4;40777:5;40773:16;40767:23;40837:3;40831:4;40827:14;40820:4;40815:3;40811:14;40804:38;40863:103;40961:4;40947:12;40863:103;:::i;:::-;40855:111;;40698:279;41061:4;41054:5;41050:16;41044:23;41080:63;41137:4;41132:3;41128:14;41114:12;41080:63;:::i;:::-;40987:166;41170:4;41163:11;;40303:877;40179:1001;;;;:::o;41186:276::-;41315:10;41350:106;41452:3;41444:6;41350:106;:::i;:::-;41336:120;;41186:276;;;;:::o;41468:143::-;41568:4;41600;41595:3;41591:14;41583:22;;41468:143;;;:::o;41711:1151::-;41890:3;41919:84;41997:5;41919:84;:::i;:::-;42019:116;42128:6;42123:3;42019:116;:::i;:::-;42012:123;;42161:3;42206:4;42198:6;42194:17;42189:3;42185:27;42236:86;42316:5;42236:86;:::i;:::-;42345:7;42376:1;42361:456;42386:6;42383:1;42380:13;42361:456;;;42457:9;42451:4;42447:20;42442:3;42435:33;42508:6;42502:13;42536:124;42655:4;42640:13;42536:124;:::i;:::-;42528:132;;42683:90;42766:6;42683:90;:::i;:::-;42673:100;;42802:4;42797:3;42793:14;42786:21;;42421:396;42408:1;42405;42401:9;42396:14;;42361:456;;;42365:14;42833:4;42826:11;;42853:3;42846:10;;41895:967;;;;;41711:1151;;;;:::o;42868:493::-;43071:4;43109:2;43098:9;43094:18;43086:26;;43158:9;43152:4;43148:20;43144:1;43133:9;43129:17;43122:47;43186:168;43349:4;43340:6;43186:168;:::i;:::-;43178:176;;42868:493;;;;:::o;43457:1026::-;43586:3;43622:4;43617:3;43613:14;43709:4;43702:5;43698:16;43692:23;43728:63;43785:4;43780:3;43776:14;43762:12;43728:63;:::i;:::-;43637:164;43886:4;43879:5;43875:16;43869:23;43905:63;43962:4;43957:3;43953:14;43939:12;43905:63;:::i;:::-;43811:167;44075:4;44068:5;44064:16;44058:23;44094:63;44151:4;44146:3;44142:14;44128:12;44094:63;:::i;:::-;43988:179;44263:4;44256:5;44252:16;44246:23;44316:3;44310:4;44306:14;44299:4;44294:3;44290:14;44283:38;44342:103;44440:4;44426:12;44342:103;:::i;:::-;44334:111;;44177:279;44473:4;44466:11;;43591:892;43457:1026;;;;:::o;44489:393::-;44642:4;44680:2;44669:9;44665:18;44657:26;;44729:9;44723:4;44719:20;44715:1;44704:9;44700:17;44693:47;44757:118;44870:4;44861:6;44757:118;:::i;:::-;44749:126;;44489:393;;;;:::o;44888:143::-;44945:5;44976:6;44970:13;44961:22;;44992:33;45019:5;44992:33;:::i;:::-;44888:143;;;;:::o;45037:351::-;45107:6;45156:2;45144:9;45135:7;45131:23;45127:32;45124:119;;;45162:79;;:::i;:::-;45124:119;45282:1;45307:64;45363:7;45354:6;45343:9;45339:22;45307:64;:::i;:::-;45297:74;;45253:128;45037:351;;;;:::o;45394:143::-;45451:5;45482:6;45476:13;45467:22;;45498:33;45525:5;45498:33;:::i;:::-;45394:143;;;;:::o;45543:351::-;45613:6;45662:2;45650:9;45641:7;45637:23;45633:32;45630:119;;;45668:79;;:::i;:::-;45630:119;45788:1;45813:64;45869:7;45860:6;45849:9;45845:22;45813:64;:::i;:::-;45803:74;;45759:128;45543:351;;;;:::o;45900:118::-;45987:24;46005:5;45987:24;:::i;:::-;45982:3;45975:37;45900:118;;:::o;46024:222::-;46117:4;46155:2;46144:9;46140:18;46132:26;;46168:71;46236:1;46225:9;46221:17;46212:6;46168:71;:::i;:::-;46024:222;;;;:::o;46252:332::-;46373:4;46411:2;46400:9;46396:18;46388:26;;46424:71;46492:1;46481:9;46477:17;46468:6;46424:71;:::i;:::-;46505:72;46573:2;46562:9;46558:18;46549:6;46505:72;:::i;:::-;46252:332;;;;;:::o;46590:137::-;46644:5;46675:6;46669:13;46660:22;;46691:30;46715:5;46691:30;:::i;:::-;46590:137;;;;:::o;46733:345::-;46800:6;46849:2;46837:9;46828:7;46824:23;46820:32;46817:119;;;46855:79;;:::i;:::-;46817:119;46975:1;47000:61;47053:7;47044:6;47033:9;47029:22;47000:61;:::i;:::-;46990:71;;46946:125;46733:345;;;;:::o;47084:180::-;47132:77;47129:1;47122:88;47229:4;47226:1;47219:15;47253:4;47250:1;47243:15;47270:191;47310:4;47330:20;47348:1;47330:20;:::i;:::-;47325:25;;47364:20;47382:1;47364:20;:::i;:::-;47359:25;;47403:1;47400;47397:8;47394:34;;;47408:18;;:::i;:::-;47394:34;47453:1;47450;47446:9;47438:17;;47270:191;;;;:::o;47467:180::-;47515:77;47512:1;47505:88;47612:4;47609:1;47602:15;47636:4;47633:1;47626:15;47653:118;47724:22;47740:5;47724:22;:::i;:::-;47717:5;47714:33;47704:61;;47761:1;47758;47751:12;47704:61;47653:118;:::o;47777:139::-;47832:5;47863:6;47857:13;47848:22;;47879:31;47904:5;47879:31;:::i;:::-;47777:139;;;;:::o;47922:347::-;47990:6;48039:2;48027:9;48018:7;48014:23;48010:32;48007:119;;;48045:79;;:::i;:::-;48007:119;48165:1;48190:62;48244:7;48235:6;48224:9;48220:22;48190:62;:::i;:::-;48180:72;;48136:126;47922:347;;;;:::o;48275:117::-;48384:1;48381;48374:12;48398:308;48460:4;48550:18;48542:6;48539:30;48536:56;;;48572:18;;:::i;:::-;48536:56;48610:29;48632:6;48610:29;:::i;:::-;48602:37;;48694:4;48688;48684:15;48676:23;;48398:308;;;:::o;48712:421::-;48801:5;48826:66;48842:49;48884:6;48842:49;:::i;:::-;48826:66;:::i;:::-;48817:75;;48915:6;48908:5;48901:21;48953:4;48946:5;48942:16;48991:3;48982:6;48977:3;48973:16;48970:25;48967:112;;;48998:79;;:::i;:::-;48967:112;49088:39;49120:6;49115:3;49110;49088:39;:::i;:::-;48807:326;48712:421;;;;;:::o;49153:355::-;49220:5;49269:3;49262:4;49254:6;49250:17;49246:27;49236:122;;49277:79;;:::i;:::-;49236:122;49387:6;49381:13;49412:90;49498:3;49490:6;49483:4;49475:6;49471:17;49412:90;:::i;:::-;49403:99;;49226:282;49153:355;;;;:::o;49514:524::-;49594:6;49643:2;49631:9;49622:7;49618:23;49614:32;49611:119;;;49649:79;;:::i;:::-;49611:119;49790:1;49779:9;49775:17;49769:24;49820:18;49812:6;49809:30;49806:117;;;49842:79;;:::i;:::-;49806:117;49947:74;50013:7;50004:6;49993:9;49989:22;49947:74;:::i;:::-;49937:84;;49740:291;49514:524;;;;:::o;50044:233::-;50083:3;50106:24;50124:5;50106:24;:::i;:::-;50097:33;;50152:66;50145:5;50142:77;50139:103;;;50222:18;;:::i;:::-;50139:103;50269:1;50262:5;50258:13;50251:20;;50044:233;;;:::o;50319:1311::-;50405:5;50449:4;50437:9;50432:3;50428:19;50424:30;50421:117;;;50457:79;;:::i;:::-;50421:117;50556:21;50572:4;50556:21;:::i;:::-;50547:30;;50639:1;50679:60;50735:3;50726:6;50715:9;50711:22;50679:60;:::i;:::-;50672:4;50665:5;50661:16;50654:86;50587:164;50811:2;50852:60;50908:3;50899:6;50888:9;50884:22;50852:60;:::i;:::-;50845:4;50838:5;50834:16;50827:86;50761:163;50984:2;51025:60;51081:3;51072:6;51061:9;51057:22;51025:60;:::i;:::-;51018:4;51011:5;51007:16;51000:86;50934:163;51162:2;51203:60;51259:3;51250:6;51239:9;51235:22;51203:60;:::i;:::-;51196:4;51189:5;51185:16;51178:86;51107:168;51335:3;51377:60;51433:3;51424:6;51413:9;51409:22;51377:60;:::i;:::-;51370:4;51363:5;51359:16;51352:86;51285:164;51512:3;51554:57;51607:3;51598:6;51587:9;51583:22;51554:57;:::i;:::-;51547:4;51540:5;51536:16;51529:83;51459:164;50319:1311;;;;:::o;51636:404::-;51732:6;51781:3;51769:9;51760:7;51756:23;51752:33;51749:120;;;51788:79;;:::i;:::-;51749:120;51908:1;51933:90;52015:7;52006:6;51995:9;51991:22;51933:90;:::i;:::-;51923:100;;51879:154;51636:404;;;;:::o;52046:122::-;52119:24;52137:5;52119:24;:::i;:::-;52112:5;52109:35;52099:63;;52158:1;52155;52148:12;52099:63;52046:122;:::o;52174:143::-;52231:5;52262:6;52256:13;52247:22;;52278:33;52305:5;52278:33;:::i;:::-;52174:143;;;;:::o;52323:351::-;52393:6;52442:2;52430:9;52421:7;52417:23;52413:32;52410:119;;;52448:79;;:::i;:::-;52410:119;52568:1;52593:64;52649:7;52640:6;52629:9;52625:22;52593:64;:::i;:::-;52583:74;;52539:128;52323:351;;;;:::o;52680:118::-;52767:24;52785:5;52767:24;:::i;:::-;52762:3;52755:37;52680:118;;:::o;52804:222::-;52897:4;52935:2;52924:9;52920:18;52912:26;;52948:71;53016:1;53005:9;53001:17;52992:6;52948:71;:::i;:::-;52804:222;;;;:::o;53049:732::-;53156:5;53181:81;53197:64;53254:6;53197:64;:::i;:::-;53181:81;:::i;:::-;53172:90;;53282:5;53311:6;53304:5;53297:21;53345:4;53338:5;53334:16;53327:23;;53398:4;53390:6;53386:17;53378:6;53374:30;53427:3;53419:6;53416:15;53413:122;;;53446:79;;:::i;:::-;53413:122;53561:6;53544:231;53578:6;53573:3;53570:15;53544:231;;;53653:3;53682:48;53726:3;53714:10;53682:48;:::i;:::-;53677:3;53670:61;53760:4;53755:3;53751:14;53744:21;;53620:155;53604:4;53599:3;53595:14;53588:21;;53544:231;;;53548:21;53162:619;;53049:732;;;;;:::o;53804:385::-;53886:5;53935:3;53928:4;53920:6;53916:17;53912:27;53902:122;;53943:79;;:::i;:::-;53902:122;54053:6;54047:13;54078:105;54179:3;54171:6;54164:4;54156:6;54152:17;54078:105;:::i;:::-;54069:114;;53892:297;53804:385;;;;:::o;54212:732::-;54319:5;54344:81;54360:64;54417:6;54360:64;:::i;:::-;54344:81;:::i;:::-;54335:90;;54445:5;54474:6;54467:5;54460:21;54508:4;54501:5;54497:16;54490:23;;54561:4;54553:6;54549:17;54541:6;54537:30;54590:3;54582:6;54579:15;54576:122;;;54609:79;;:::i;:::-;54576:122;54724:6;54707:231;54741:6;54736:3;54733:15;54707:231;;;54816:3;54845:48;54889:3;54877:10;54845:48;:::i;:::-;54840:3;54833:61;54923:4;54918:3;54914:14;54907:21;;54783:155;54767:4;54762:3;54758:14;54751:21;;54707:231;;;54711:21;54325:619;;54212:732;;;;;:::o;54967:385::-;55049:5;55098:3;55091:4;55083:6;55079:17;55075:27;55065:122;;55106:79;;:::i;:::-;55065:122;55216:6;55210:13;55241:105;55342:3;55334:6;55327:4;55319:6;55315:17;55241:105;:::i;:::-;55232:114;;55055:297;54967:385;;;;:::o;55358:1069::-;55496:6;55504;55512;55561:2;55549:9;55540:7;55536:23;55532:32;55529:119;;;55567:79;;:::i;:::-;55529:119;55708:1;55697:9;55693:17;55687:24;55738:18;55730:6;55727:30;55724:117;;;55760:79;;:::i;:::-;55724:117;55865:89;55946:7;55937:6;55926:9;55922:22;55865:89;:::i;:::-;55855:99;;55658:306;56024:2;56013:9;56009:18;56003:25;56055:18;56047:6;56044:30;56041:117;;;56077:79;;:::i;:::-;56041:117;56182:89;56263:7;56254:6;56243:9;56239:22;56182:89;:::i;:::-;56172:99;;55974:307;56320:2;56346:64;56402:7;56393:6;56382:9;56378:22;56346:64;:::i;:::-;56336:74;;56291:129;55358:1069;;;;;:::o;56433:554::-;56528:6;56577:2;56565:9;56556:7;56552:23;56548:32;56545:119;;;56583:79;;:::i;:::-;56545:119;56724:1;56713:9;56709:17;56703:24;56754:18;56746:6;56743:30;56740:117;;;56776:79;;:::i;:::-;56740:117;56881:89;56962:7;56953:6;56942:9;56938:22;56881:89;:::i;:::-;56871:99;;56674:306;56433:554;;;;:::o
Swarm Source
ipfs://975f5dc32466a02fef634738388e970292b65e9f08e268cbbcc68c06c3ffc5d9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.