Polygon Sponsored slots available. Book your slot here!
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x8f0effefcb2fc37ba06232dcce701d37aa0922dd
Contract Name:
StakingRewardsMulti
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "./Math.sol"; import "./SafeMath.sol"; import "./IERC20Metadata.sol"; import "./SafeERC20.sol"; import "./ReentrancyGuard.sol"; import "./Pausable.sol"; import "./Ownable.sol"; // Inheritance import "./IStakingRewards.sol"; // https://docs.synthetix.io/contracts/source/contracts/stakingrewards contract StakingRewardsMulti is ReentrancyGuard, Pausable, Ownable { using SafeMath for uint256; using SafeERC20 for IERC20Metadata; /* ========== STATE VARIABLES ========== */ IERC20Metadata[] public rewardsTokens; IERC20Metadata public stakingToken; uint256 public periodFinish = 0; uint256[] public rewardRates; uint256 public rewardsDuration = 4 weeks; uint256 public lastUpdateTime; uint256[] public rewardsPerTokenStored; mapping(address => mapping (uint256 => uint256)) public userRewardPerTokenPaid; mapping(address => mapping (uint256 => uint256)) public rewards; uint256 private _totalSupply; mapping(address => uint256) private _balances; /* ========== CONSTRUCTOR ========== */ constructor( IERC20Metadata[] memory _rewardsTokens, IERC20Metadata _stakingToken ) Ownable() { rewardsTokens = _rewardsTokens; stakingToken = IERC20Metadata(_stakingToken); rewardRates = new uint256[](_rewardsTokens.length); rewardsPerTokenStored = new uint256[](_rewardsTokens.length); } /* ========== VIEWS ========== */ function totalSupply() external view returns (uint256) { return _totalSupply; } function balanceOf(address account) external view returns (uint256) { return _balances[account]; } function lastTimeRewardApplicable() public view returns (uint256) { return Math.min(block.timestamp, periodFinish); } function rewardsPerToken() public view returns (uint256[] memory) { if (_totalSupply == 0) { return rewardsPerTokenStored; } uint256[] memory r = new uint256[](rewardsTokens.length); for (uint256 i = 0; i < r.length; i++) { r[i] = rewardsPerTokenStored[i].add( lastTimeRewardApplicable().sub(lastUpdateTime).mul(rewardRates[i]).mul(1e18).div(_totalSupply) ); } return r; } function earned(address account) public view returns (uint256[] memory) { uint256[] memory r = rewardsPerToken(); for (uint256 i = 0; i < r.length; i++) { r[i] = _balances[account].mul(r[i].sub(userRewardPerTokenPaid[account][i])).div(1e18).add(rewards[account][i]); } return r; } function getRewardForDuration() external view returns (uint256[] memory) { uint256[] memory r = new uint256[](rewardsTokens.length); for (uint256 i = 0; i < r.length; i++) { r[i] = rewardRates[i].mul(rewardsDuration); } return r; } /* ========== MUTATIVE FUNCTIONS ========== */ function stake(uint256 amount) external nonReentrant whenNotPaused updateReward(msg.sender) { require(amount > 0, "Cannot stake 0"); _totalSupply = _totalSupply.add(amount); _balances[msg.sender] = _balances[msg.sender].add(amount); stakingToken.safeTransferFrom(msg.sender, address(this), amount); emit Staked(msg.sender, amount); } function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) { require(amount > 0, "Cannot withdraw 0"); _totalSupply = _totalSupply.sub(amount); _balances[msg.sender] = _balances[msg.sender].sub(amount); stakingToken.safeTransfer(msg.sender, amount); emit Withdrawn(msg.sender, amount); } function getReward() public nonReentrant updateReward(msg.sender) { uint256 reward; for (uint256 i = 0; i < rewardsTokens.length; i++) { reward = rewards[msg.sender][i]; if (rewardsTokens[i].decimals() < 18) { uint256 normalization = 10**(uint256(18).sub(uint256(rewardsTokens[i].decimals()))); reward = reward.div(normalization); } if (reward > 0) { rewards[msg.sender][i] = 0; rewardsTokens[i].safeTransfer(msg.sender, reward); emit RewardPaid(address(rewardsTokens[i]), msg.sender, reward); } } } function exit() external { withdraw(_balances[msg.sender]); getReward(); } /* ========== RESTRICTED FUNCTIONS ========== */ function notifyRewardAmount(uint256[] calldata _rewards) external onlyOwner updateReward(address(0)) { assert(_rewards.length == rewardsTokens.length); uint256 normalization; uint256[] memory reward = _rewards; for (uint256 i = 0; i < rewardsTokens.length; i++) { uint256 balance = rewardsTokens[i].balanceOf(address(this)); if (rewardsTokens[i].decimals() < 18) { normalization = 10**(uint256(18).sub(uint256(rewardsTokens[i].decimals()))); reward[i] = _rewards[i].mul(normalization); balance = balance.mul(normalization); } // Ensure the provided reward amount is not more than the balance in the contract. // This keeps the reward rate in the right range, preventing overflows due to // very high values of rewardRate in the earned and rewardsPerToken functions; // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow. require(rewardRates[i] <= balance.div(rewardsDuration), "Provided reward too high"); } if (block.timestamp >= periodFinish) { for (uint256 i = 0; i < rewardsTokens.length; i++) { rewardRates[i] = reward[i].div(rewardsDuration); } } else { uint256 remaining = periodFinish.sub(block.timestamp); uint256 leftover; for (uint256 i = 0; i < rewardsTokens.length; i++) { leftover = remaining.mul(rewardRates[i]); rewardRates[i] = reward[i].add(leftover).div(rewardsDuration); } } lastUpdateTime = block.timestamp; periodFinish = block.timestamp.add(rewardsDuration); emit RewardAdded(reward); } // 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 the staking token"); IERC20Metadata(tokenAddress).safeTransfer(owner(), tokenAmount); emit Recovered(tokenAddress, tokenAmount); } function setRewardsDuration(uint256 _rewardsDuration) external onlyOwner { require( block.timestamp > periodFinish, "Previous rewards period must be complete before changing the duration for the new period" ); rewardsDuration = _rewardsDuration; emit RewardsDurationUpdated(rewardsDuration); } /* ========== MODIFIERS ========== */ modifier updateReward(address account) { rewardsPerTokenStored = rewardsPerToken(); lastUpdateTime = lastTimeRewardApplicable(); if (account != address(0)) { uint256[] memory accountEarned = earned(account); for (uint256 i = 0; i < rewardsTokens.length; i++) { rewards[account][i] = accountEarned[i]; userRewardPerTokenPaid[account][i] = rewardsPerTokenStored[i]; } } _; } /* ========== EVENTS ========== */ event RewardAdded(uint256[] reward); event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed token, address indexed user, uint256 reward); event RewardsDurationUpdated(uint256 newDuration); event Recovered(address token, uint256 amount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library 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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev 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); } } } }
// 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.24; // https://docs.synthetix.io/contracts/source/interfaces/istakingrewards interface IStakingRewards { // Views function lastTimeRewardApplicable() external view returns (uint256); function rewardPerToken() external view returns (uint256); function earned(address account) external view returns (uint256); function getRewardForDuration() external view returns (uint256); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); // Mutative function stake(uint256 amount) external; function withdraw(uint256 amount) external; function getReward() external; function exit() external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? 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. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library 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"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20Metadata[]","name":"_rewardsTokens","type":"address[]"},{"internalType":"contract IERC20Metadata","name":"_stakingToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"reward","type":"uint256[]"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_rewards","type":"uint256[]"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsPerToken","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardsPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardsTokens","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006004556224ea006006553480156200001d57600080fd5b5060405162003df338038062003df3833981810160405281019062000043919062000581565b60016000819055506000600160006101000a81548160ff021916908315150217905550620000866200007a620001b460201b60201c565b620001bc60201b60201c565b81600290805190602001906200009e9291906200027f565b5080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550815167ffffffffffffffff811115620000fe57620000fd620003a9565b5b6040519080825280602002602001820160405280156200012d5781602001602082028036833780820191505090505b5060059080519060200190620001459291906200030e565b50815167ffffffffffffffff811115620001645762000163620003a9565b5b604051908082528060200260200182016040528015620001935781602001602082028036833780820191505090505b5060089080519060200190620001ab9291906200030e565b505050620005e7565b600033905090565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054828255906000526020600020908101928215620002fb579160200282015b82811115620002fa5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620002a0565b5b5090506200030a919062000360565b5090565b8280548282559060005260206000209081019282156200034d579160200282015b828111156200034c5782518255916020019190600101906200032f565b5b5090506200035c919062000360565b5090565b5b808211156200037b57600081600090555060010162000361565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003e38262000398565b810181811067ffffffffffffffff82111715620004055762000404620003a9565b5b80604052505050565b60006200041a6200037f565b9050620004288282620003d8565b919050565b600067ffffffffffffffff8211156200044b576200044a620003a9565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200048e8262000461565b9050919050565b6000620004a28262000481565b9050919050565b620004b48162000495565b8114620004c057600080fd5b50565b600081519050620004d481620004a9565b92915050565b6000620004f1620004eb846200042d565b6200040e565b905080838252602082019050602084028301858111156200051757620005166200045c565b5b835b818110156200054457806200052f8882620004c3565b84526020840193505060208101905062000519565b5050509392505050565b600082601f83011262000566576200056562000393565b5b815162000578848260208601620004da565b91505092915050565b600080604083850312156200059b576200059a62000389565b5b600083015167ffffffffffffffff811115620005bc57620005bb6200038e565b5b620005ca858286016200054e565b9250506020620005dd85828601620004c3565b9150509250929050565b6137fc80620005f76000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806380faa57d116100de578063c8f33c9111610097578063e9fad8ee11610071578063e9fad8ee14610460578063ebe2b12b1461046a578063f2caeb1e14610488578063f2fde38b146104b85761018d565b8063c8f33c911461040a578063cc1a378f14610428578063e71e7f78146104445761018d565b806380faa57d146103365780638980f11f146103545780638da5cb5b14610370578063a694fc3a1461038e578063b6d0dcd8146103aa578063b933ceac146103da5761018d565b80635c975abb1161014b57806370641a361161012557806370641a36146102c057806370a08231146102de578063715018a61461030e57806372f702f3146103185761018d565b80635c975abb1461024257806364373aa8146102605780636bc9b561146102905761018d565b80628cc2621461019257806318160ddd146101c25780631c1f78eb146101e05780632e1a7d4d146101fe578063386a95251461021a5780633d18b91214610238575b600080fd5b6101ac60048036038101906101a7919061282c565b6104d4565b6040516101b99190612921565b60405180910390f35b6101ca610674565b6040516101d79190612952565b60405180910390f35b6101e861067e565b6040516101f59190612921565b60405180910390f35b61021860048036038101906102139190612999565b61074b565b005b610222610aa8565b60405161022f9190612952565b60405180910390f35b610240610aae565b005b61024a611007565b60405161025791906129e1565b60405180910390f35b61027a60048036038101906102759190612999565b61101e565b6040516102879190612952565b60405180910390f35b6102aa60048036038101906102a591906129fc565b611042565b6040516102b79190612952565b60405180910390f35b6102c8611067565b6040516102d59190612921565b60405180910390f35b6102f860048036038101906102f3919061282c565b61120e565b6040516103059190612952565b60405180910390f35b610316611257565b005b6103206112df565b60405161032d9190612a9b565b60405180910390f35b61033e611305565b60405161034b9190612952565b60405180910390f35b61036e600480360381019061036991906129fc565b611318565b005b610378611493565b6040516103859190612ac5565b60405180910390f35b6103a860048036038101906103a39190612999565b6114bb565b005b6103c460048036038101906103bf9190612999565b611862565b6040516103d19190612a9b565b60405180910390f35b6103f460048036038101906103ef91906129fc565b6118a1565b6040516104019190612952565b60405180910390f35b6104126118c6565b60405161041f9190612952565b60405180910390f35b610442600480360381019061043d9190612999565b6118cc565b005b61045e60048036038101906104599190612b45565b6119cf565b005b61046861211f565b005b610472612171565b60405161047f9190612952565b60405180910390f35b6104a2600480360381019061049d9190612999565b612177565b6040516104af9190612952565b60405180910390f35b6104d260048036038101906104cd919061282c565b61219b565b005b606060006104e0611067565b905060005b815181101561066a57610638600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205461062a670de0b6b3a764000061061c6105ce600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020548888815181106105b8576105b7612b92565b5b602002602001015161229290919063ffffffff16565b600c60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122a890919063ffffffff16565b6122be90919063ffffffff16565b6122d490919063ffffffff16565b82828151811061064b5761064a612b92565b5b602002602001018181525050808061066290612bf0565b9150506104e5565b5080915050919050565b6000600b54905090565b6060600060028054905067ffffffffffffffff8111156106a1576106a0612c38565b5b6040519080825280602002602001820160405280156106cf5781602001602082028036833780820191505090505b50905060005b815181101561074357610711600654600583815481106106f8576106f7612b92565b5b90600052602060002001546122a890919063ffffffff16565b82828151811061072457610723612b92565b5b602002602001018181525050808061073b90612bf0565b9150506106d5565b508091505090565b600260005403610790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078790612cc4565b60405180910390fd5b6002600081905550336107a1611067565b600890805190602001906107b692919061275a565b506107bf611305565b600781905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461090e576000610804826104d4565b905060005b60028054905081101561090b5781818151811061082957610828612b92565b5b6020026020010151600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506008818154811061089957610898612b92565b5b9060005260206000200154600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550808061090390612bf0565b915050610809565b50505b60008211610951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094890612d30565b60405180910390fd5b61096682600b5461229290919063ffffffff16565b600b819055506109be82600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461229290919063ffffffff16565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a4e3383600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166122ea9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d583604051610a949190612952565b60405180910390a250600160008190555050565b60065481565b600260005403610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea90612cc4565b60405180910390fd5b600260008190555033610b04611067565b60089080519060200190610b1992919061275a565b50610b22611305565b600781905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c71576000610b67826104d4565b905060005b600280549050811015610c6e57818181518110610b8c57610b8b612b92565b5b6020026020010151600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555060088181548110610bfc57610bfb612b92565b5b9060005260206000200154600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055508080610c6690612bf0565b915050610b6c565b50505b600080600090505b600280549050811015610ffa57600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828152602001908152602001600020549150601260028281548110610cef57610cee612b92565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d889190612d89565b60ff161015610e7b576000610e5660028381548110610daa57610da9612b92565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e439190612d89565b60ff16601261229290919063ffffffff16565b600a610e629190612ee9565b9050610e7781846122be90919063ffffffff16565b9250505b6000821115610fe7576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550610f43338360028481548110610ef357610ef2612b92565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166122ea9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff1660028281548110610f6e57610f6d612b92565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e84604051610fde9190612952565b60405180910390a35b8080610ff290612bf0565b915050610c79565b5050506001600081905550565b6000600160009054906101000a900460ff16905090565b6008818154811061102e57600080fd5b906000526020600020016000915090505481565b6009602052816000526040600020602052806000526040600020600091509150505481565b60606000600b54036110cb5760088054806020026020016040519081016040528092919081815260200182805480156110bf57602002820191906000526020600020905b8154815260200190600101908083116110ab575b5050505050905061120b565b600060028054905067ffffffffffffffff8111156110ec576110eb612c38565b5b60405190808252806020026020018201604052801561111a5781602001602082028036833780820191505090505b50905060005b8151811015611205576111d36111a6600b54611198670de0b6b3a764000061118a6005878154811061115557611154612b92565b5b906000526020600020015461117c60075461116e611305565b61229290919063ffffffff16565b6122a890919063ffffffff16565b6122a890919063ffffffff16565b6122be90919063ffffffff16565b600883815481106111ba576111b9612b92565b5b90600052602060002001546122d490919063ffffffff16565b8282815181106111e6576111e5612b92565b5b60200260200101818152505080806111fd90612bf0565b915050611120565b50809150505b90565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61125f612370565b73ffffffffffffffffffffffffffffffffffffffff1661127d611493565b73ffffffffffffffffffffffffffffffffffffffff16146112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90612f80565b60405180910390fd5b6112dd6000612378565b565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006113134260045461243b565b905090565b611320612370565b73ffffffffffffffffffffffffffffffffffffffff1661133e611493565b73ffffffffffffffffffffffffffffffffffffffff1614611394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138b90612f80565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90613012565b60405180910390fd5b61145661142f611493565b828473ffffffffffffffffffffffffffffffffffffffff166122ea9092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051611487929190613032565b60405180910390a15050565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260005403611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790612cc4565b60405180910390fd5b6002600081905550611510611007565b15611550576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611547906130a7565b60405180910390fd5b33611559611067565b6008908051906020019061156e92919061275a565b50611577611305565b600781905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116c65760006115bc826104d4565b905060005b6002805490508110156116c3578181815181106115e1576115e0612b92565b5b6020026020010151600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506008818154811061165157611650612b92565b5b9060005260206000200154600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080806116bb90612bf0565b9150506115c1565b50505b60008211611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090613113565b60405180910390fd5b61171e82600b546122d490919063ffffffff16565b600b8190555061177682600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122d490919063ffffffff16565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611808333084600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612454909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d8360405161184e9190612952565b60405180910390a250600160008190555050565b6002818154811061187257600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a602052816000526040600020602052806000526040600020600091509150505481565b60075481565b6118d4612370565b73ffffffffffffffffffffffffffffffffffffffff166118f2611493565b73ffffffffffffffffffffffffffffffffffffffff1614611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90612f80565b60405180910390fd5b600454421161198c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611983906131cb565b60405180910390fd5b806006819055507ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d36006546040516119c49190612952565b60405180910390a150565b6119d7612370565b73ffffffffffffffffffffffffffffffffffffffff166119f5611493565b73ffffffffffffffffffffffffffffffffffffffff1614611a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4290612f80565b60405180910390fd5b6000611a55611067565b60089080519060200190611a6a92919061275a565b50611a73611305565b600781905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bc2576000611ab8826104d4565b905060005b600280549050811015611bbf57818181518110611add57611adc612b92565b5b6020026020010151600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555060088181548110611b4d57611b4c612b92565b5b9060005260206000200154600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055508080611bb790612bf0565b915050611abd565b50505b6002805490508383905014611bda57611bd96131eb565b5b600080848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050905060005b600280549050811015611f6057600060028281548110611c4757611c46612b92565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611caa9190612ac5565b602060405180830381865afa158015611cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ceb919061322f565b9050601260028381548110611d0357611d02612b92565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9c9190612d89565b60ff161015611ed757611e6860028381548110611dbc57611dbb612b92565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e559190612d89565b60ff16601261229290919063ffffffff16565b600a611e749190612ee9565b9350611ea284888885818110611e8d57611e8c612b92565b5b905060200201356122a890919063ffffffff16565b838381518110611eb557611eb4612b92565b5b602002602001018181525050611ed484826122a890919063ffffffff16565b90505b611eec600654826122be90919063ffffffff16565b60058381548110611f0057611eff612b92565b5b90600052602060002001541115611f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f43906132a8565b60405180910390fd5b508080611f5890612bf0565b915050611c24565b506004544210611fe45760005b600280549050811015611fde57611fa9600654838381518110611f9357611f92612b92565b5b60200260200101516122be90919063ffffffff16565b60058281548110611fbd57611fbc612b92565b5b90600052602060002001819055508080611fd690612bf0565b915050611f6d565b506120bf565b6000611ffb4260045461229290919063ffffffff16565b9050600080600090505b6002805490508110156120bb576120436005828154811061202957612028612b92565b5b9060005260206000200154846122a890919063ffffffff16565b91506120866006546120788487858151811061206257612061612b92565b5b60200260200101516122d490919063ffffffff16565b6122be90919063ffffffff16565b6005828154811061209a57612099612b92565b5b906000526020600020018190555080806120b390612bf0565b915050612005565b5050505b426007819055506120db600654426122d490919063ffffffff16565b6004819055507f56e044f46d9f4cfbd2e35f9c3be90fdd82133d7ac461f5b91eeff83cd4035ff1816040516121109190612921565b60405180910390a15050505050565b612167600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461074b565b61216f610aae565b565b60045481565b6005818154811061218757600080fd5b906000526020600020016000915090505481565b6121a3612370565b73ffffffffffffffffffffffffffffffffffffffff166121c1611493565b73ffffffffffffffffffffffffffffffffffffffff1614612217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220e90612f80565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d9061333a565b60405180910390fd5b61228f81612378565b50565b600081836122a0919061335a565b905092915050565b600081836122b6919061338e565b905092915050565b600081836122cc9190613417565b905092915050565b600081836122e29190613448565b905092915050565b61236b8363a9059cbb60e01b8484604051602401612309929190613032565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506124dd565b505050565b600033905090565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081831061244a578161244c565b825b905092915050565b6124d7846323b872dd60e01b8585856040516024016124759392919061349e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506124dd565b50505050565b600061253f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125a49092919063ffffffff16565b905060008151111561259f578080602001905181019061255f9190613501565b61259e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612595906135a0565b60405180910390fd5b5b505050565b60606125b384846000856125bc565b90509392505050565b606082471015612601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f890613632565b60405180910390fd5b61260a856126d0565b612649576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126409061369e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516126729190613738565b60006040518083038185875af1925050503d80600081146126af576040519150601f19603f3d011682016040523d82523d6000602084013e6126b4565b606091505b50915091506126c48282866126f3565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561270357829050612753565b6000835111156127165782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274a91906137a4565b60405180910390fd5b9392505050565b828054828255906000526020600020908101928215612796579160200282015b8281111561279557825182559160200191906001019061277a565b5b5090506127a391906127a7565b5090565b5b808211156127c05760008160009055506001016127a8565b5090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127f9826127ce565b9050919050565b612809816127ee565b811461281457600080fd5b50565b60008135905061282681612800565b92915050565b600060208284031215612842576128416127c4565b5b600061285084828501612817565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61289881612885565b82525050565b60006128aa838361288f565b60208301905092915050565b6000602082019050919050565b60006128ce82612859565b6128d88185612864565b93506128e383612875565b8060005b838110156129145781516128fb888261289e565b9750612906836128b6565b9250506001810190506128e7565b5085935050505092915050565b6000602082019050818103600083015261293b81846128c3565b905092915050565b61294c81612885565b82525050565b60006020820190506129676000830184612943565b92915050565b61297681612885565b811461298157600080fd5b50565b6000813590506129938161296d565b92915050565b6000602082840312156129af576129ae6127c4565b5b60006129bd84828501612984565b91505092915050565b60008115159050919050565b6129db816129c6565b82525050565b60006020820190506129f660008301846129d2565b92915050565b60008060408385031215612a1357612a126127c4565b5b6000612a2185828601612817565b9250506020612a3285828601612984565b9150509250929050565b6000819050919050565b6000612a61612a5c612a57846127ce565b612a3c565b6127ce565b9050919050565b6000612a7382612a46565b9050919050565b6000612a8582612a68565b9050919050565b612a9581612a7a565b82525050565b6000602082019050612ab06000830184612a8c565b92915050565b612abf816127ee565b82525050565b6000602082019050612ada6000830184612ab6565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612b0557612b04612ae0565b5b8235905067ffffffffffffffff811115612b2257612b21612ae5565b5b602083019150836020820283011115612b3e57612b3d612aea565b5b9250929050565b60008060208385031215612b5c57612b5b6127c4565b5b600083013567ffffffffffffffff811115612b7a57612b796127c9565b5b612b8685828601612aef565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612bfb82612885565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612c2d57612c2c612bc1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612cae601f83612c67565b9150612cb982612c78565b602082019050919050565b60006020820190508181036000830152612cdd81612ca1565b9050919050565b7f43616e6e6f742077697468647261772030000000000000000000000000000000600082015250565b6000612d1a601183612c67565b9150612d2582612ce4565b602082019050919050565b60006020820190508181036000830152612d4981612d0d565b9050919050565b600060ff82169050919050565b612d6681612d50565b8114612d7157600080fd5b50565b600081519050612d8381612d5d565b92915050565b600060208284031215612d9f57612d9e6127c4565b5b6000612dad84828501612d74565b91505092915050565b60008160011c9050919050565b6000808291508390505b6001851115612e0d57808604811115612de957612de8612bc1565b5b6001851615612df85780820291505b8081029050612e0685612db6565b9450612dcd565b94509492505050565b600082612e265760019050612ee2565b81612e345760009050612ee2565b8160018114612e4a5760028114612e5457612e83565b6001915050612ee2565b60ff841115612e6657612e65612bc1565b5b8360020a915084821115612e7d57612e7c612bc1565b5b50612ee2565b5060208310610133831016604e8410600b8410161715612eb85782820a905083811115612eb357612eb2612bc1565b5b612ee2565b612ec58484846001612dc3565b92509050818404811115612edc57612edb612bc1565b5b81810290505b9392505050565b6000612ef482612885565b9150612eff83612885565b9250612f2c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612e16565b905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612f6a602083612c67565b9150612f7582612f34565b602082019050919050565b60006020820190508181036000830152612f9981612f5d565b9050919050565b7f43616e6e6f7420776974686472617720746865207374616b696e6720746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ffc602183612c67565b915061300782612fa0565b604082019050919050565b6000602082019050818103600083015261302b81612fef565b9050919050565b60006040820190506130476000830185612ab6565b6130546020830184612943565b9392505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613091601083612c67565b915061309c8261305b565b602082019050919050565b600060208201905081810360008301526130c081613084565b9050919050565b7f43616e6e6f74207374616b652030000000000000000000000000000000000000600082015250565b60006130fd600e83612c67565b9150613108826130c7565b602082019050919050565b6000602082019050818103600083015261312c816130f0565b9050919050565b7f50726576696f7573207265776172647320706572696f64206d7573742062652060008201527f636f6d706c657465206265666f7265206368616e67696e67207468652064757260208201527f6174696f6e20666f7220746865206e657720706572696f640000000000000000604082015250565b60006131b5605883612c67565b91506131c082613133565b606082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000815190506132298161296d565b92915050565b600060208284031215613245576132446127c4565b5b60006132538482850161321a565b91505092915050565b7f50726f76696465642072657761726420746f6f20686967680000000000000000600082015250565b6000613292601883612c67565b915061329d8261325c565b602082019050919050565b600060208201905081810360008301526132c181613285565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613324602683612c67565b915061332f826132c8565b604082019050919050565b6000602082019050818103600083015261335381613317565b9050919050565b600061336582612885565b915061337083612885565b92508282101561338357613382612bc1565b5b828203905092915050565b600061339982612885565b91506133a483612885565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133dd576133dc612bc1565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061342282612885565b915061342d83612885565b92508261343d5761343c6133e8565b5b828204905092915050565b600061345382612885565b915061345e83612885565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561349357613492612bc1565b5b828201905092915050565b60006060820190506134b36000830186612ab6565b6134c06020830185612ab6565b6134cd6040830184612943565b949350505050565b6134de816129c6565b81146134e957600080fd5b50565b6000815190506134fb816134d5565b92915050565b600060208284031215613517576135166127c4565b5b6000613525848285016134ec565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061358a602a83612c67565b91506135958261352e565b604082019050919050565b600060208201905081810360008301526135b98161357d565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061361c602683612c67565b9150613627826135c0565b604082019050919050565b6000602082019050818103600083015261364b8161360f565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613688601d83612c67565b915061369382613652565b602082019050919050565b600060208201905081810360008301526136b78161367b565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156136f25780820151818401526020810190506136d7565b83811115613701576000848401525b50505050565b6000613712826136be565b61371c81856136c9565b935061372c8185602086016136d4565b80840191505092915050565b60006137448284613707565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b60006137768261374f565b6137808185612c67565b93506137908185602086016136d4565b6137998161375a565b840191505092915050565b600060208201905081810360008301526137be818461376b565b90509291505056fea2646970667358221220aecca3600b30c80e923d44d3a3b13623e7619c7f5f09122ac261df821de99a6964736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000288ab1b113c666abb097bb2ba51b8f3759d7729e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000e7804d91dfcde7f776c90043e03eaa6df87e6395000000000000000000000000df7837de1f2fa4631d716cf2502f8b230f1dcc32
Deployed ByteCode Sourcemap
362:7722:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2345:330;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1513:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2681:281;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3403:351;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;711:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3760:668;;;:::i;:::-;;1091:84:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;792:38:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;837:78;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1861:478;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1610:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:6;;;:::i;:::-;;600:34:11;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1726:129;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6495:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1029:85:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3020:377:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;557:37;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;921:63;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;757:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6809:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4588:1795;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4434:94;;;:::i;:::-;;640:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;677:28;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2345:330:11;2399:16;2427:18;2448:17;:15;:17::i;:::-;2427:38;;2481:9;2476:174;2500:1;:8;2496:1;:12;2476:174;;;2536:103;2619:7;:16;2627:7;2619:16;;;;;;;;;;;;;;;:19;2636:1;2619:19;;;;;;;;;;;;2536:78;2609:4;2536:68;2559:44;2568:22;:31;2591:7;2568:31;;;;;;;;;;;;;;;:34;2600:1;2568:34;;;;;;;;;;;;2559:1;2561;2559:4;;;;;;;;:::i;:::-;;;;;;;;:8;;:44;;;;:::i;:::-;2536:9;:18;2546:7;2536:18;;;;;;;;;;;;;;;;:22;;:68;;;;:::i;:::-;:72;;:78;;;;:::i;:::-;:82;;:103;;;;:::i;:::-;2529:1;2531;2529:4;;;;;;;;:::i;:::-;;;;;;;:110;;;;;2510:3;;;;;:::i;:::-;;;;2476:174;;;;2667:1;2660:8;;;2345:330;;;:::o;1513:91::-;1559:7;1585:12;;1578:19;;1513:91;:::o;2681:281::-;2736:16;2764:18;2799:13;:20;;;;2785:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2764:56;;2836:9;2831:106;2855:1;:8;2851:1;:12;2831:106;;;2891:35;2910:15;;2891:11;2903:1;2891:14;;;;;;;;:::i;:::-;;;;;;;;;;:18;;:35;;;;:::i;:::-;2884:1;2886;2884:4;;;;;;;;:::i;:::-;;;;;;;:42;;;;;2865:3;;;;;:::i;:::-;;;;2831:106;;;;2954:1;2947:8;;;2681:281;:::o;3403:351::-;1744:1:8;2325:7;;:19;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;3470:10:11::1;7284:17;:15;:17::i;:::-;7260:21;:41;;;;;;;;;;;;:::i;:::-;;7328:26;:24;:26::i;:::-;7311:14;:43;;;;7387:1;7368:21;;:7;:21;;;7364:314;;7405:30;7438:15;7445:7;7438:6;:15::i;:::-;7405:48;;7472:9;7467:201;7491:13;:20;;;;7487:1;:24;7467:201;;;7558:13;7572:1;7558:16;;;;;;;;:::i;:::-;;;;;;;;7536:7;:16;7544:7;7536:16;;;;;;;;;;;;;;;:19;7553:1;7536:19;;;;;;;;;;;:38;;;;7629:21;7651:1;7629:24;;;;;;;;:::i;:::-;;;;;;;;;;7592:22;:31;7615:7;7592:31;;;;;;;;;;;;;;;:34;7624:1;7592:34;;;;;;;;;;;:61;;;;7513:3;;;;;:::i;:::-;;;;7467:201;;;;7391:287;7364:314;3509:1:::2;3500:6;:10;3492:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;3557:24;3574:6;3557:12;;:16;;:24;;;;:::i;:::-;3542:12;:39;;;;3615:33;3641:6;3615:9;:21;3625:10;3615:21;;;;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;3591:9;:21;3601:10;3591:21;;;;;;;;;;;;;;;:57;;;;3658:45;3684:10;3696:6;3658:12;;;;;;;;;;;:25;;;;:45;;;;;:::i;:::-;3728:10;3718:29;;;3740:6;3718:29;;;;;;:::i;:::-;;;;;;;;2484:1:8::1;1701::::0;2628:7;:22;;;;3403:351:11;:::o;711:40::-;;;;:::o;3760:668::-;1744:1:8;2325:7;;:19;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;3814:10:11::1;7284:17;:15;:17::i;:::-;7260:21;:41;;;;;;;;;;;;:::i;:::-;;7328:26;:24;:26::i;:::-;7311:14;:43;;;;7387:1;7368:21;;:7;:21;;;7364:314;;7405:30;7438:15;7445:7;7438:6;:15::i;:::-;7405:48;;7472:9;7467:201;7491:13;:20;;;;7487:1;:24;7467:201;;;7558:13;7572:1;7558:16;;;;;;;;:::i;:::-;;;;;;;;7536:7;:16;7544:7;7536:16;;;;;;;;;;;;;;;:19;7553:1;7536:19;;;;;;;;;;;:38;;;;7629:21;7651:1;7629:24;;;;;;;;:::i;:::-;;;;;;;;;;7592:22;:31;7615:7;7592:31;;;;;;;;;;;;;;;:34;7624:1;7592:34;;;;;;;;;;;:61;;;;7513:3;;;;;:::i;:::-;;;;7467:201;;;;7391:287;7364:314;3836:14:::2;3866:9:::0;3878:1:::2;3866:13;;3861:561;3885:13;:20;;;;3881:1;:24;3861:561;;;3935:7;:19;3943:10;3935:19;;;;;;;;;;;;;;;:22;3955:1;3935:22;;;;;;;;;;;;3926:31;;4005:2;3975:13;3989:1;3975:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;;;3971:206;;;4027:21;4056:53;4080:13;4094:1;4080:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4072:36;;4064:2;4056:15;;:53;;;;:::i;:::-;4051:2;:59;;;;:::i;:::-;4027:83;;4137:25;4148:13;4137:6;:10;;:25;;;;:::i;:::-;4128:34;;4009:168;3971:206;4203:1;4194:6;:10;4190:222;;;4249:1;4224:7;:19;4232:10;4224:19;;;;;;;;;;;;;;;:22;4244:1;4224:22;;;;;;;;;;;:26;;;;4268:49;4298:10;4310:6;4268:13;4282:1;4268:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;;;:49;;;;;:::i;:::-;4378:10;4340:57;;4359:13;4373:1;4359:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4340:57;;;4390:6;4340:57;;;;;;:::i;:::-;;;;;;;;4190:222;3907:3;;;;;:::i;:::-;;;;3861:561;;;;3826:602;2484:1:8::1;1701::::0;2628:7;:22;;;;3760:668:11:o;1091:84:7:-;1138:4;1161:7;;;;;;;;;;;1154:14;;1091:84;:::o;792:38:11:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;837:78::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1861:478::-;1909:16;1957:1;1941:12;;:17;1937:76;;1981:21;1974:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1937:76;2023:18;2058:13;:20;;;;2044:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2023:56;;2094:9;2089:225;2113:1;:8;2109:1;:12;2089:225;;;2149:154;2195:94;2276:12;;2195:76;2266:4;2195:66;2246:11;2258:1;2246:14;;;;;;;;:::i;:::-;;;;;;;;;;2195:46;2226:14;;2195:26;:24;:26::i;:::-;:30;;:46;;;;:::i;:::-;:50;;:66;;;;:::i;:::-;:70;;:76;;;;:::i;:::-;:80;;:94;;;;:::i;:::-;2149:21;2171:1;2149:24;;;;;;;;:::i;:::-;;;;;;;;;;:28;;:154;;;;:::i;:::-;2142:1;2144;2142:4;;;;;;;;:::i;:::-;;;;;;;:161;;;;;2123:3;;;;;:::i;:::-;;;;2089:225;;;;2331:1;2324:8;;;1861:478;;:::o;1610:110::-;1669:7;1695:9;:18;1705:7;1695:18;;;;;;;;;;;;;;;;1688:25;;1610:110;;;:::o;1661:101:6:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;600:34:11:-;;;;;;;;;;;;;:::o;1726:129::-;1783:7;1809:39;1818:15;1835:12;;1809:8;:39::i;:::-;1802:46;;1726:129;:::o;6495:308::-;1252:12:6;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6621:12:11::1;;;;;;;;;;;6597:37;;:12;:37;;::::0;6589:83:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;6682:63;6724:7;:5;:7::i;:::-;6733:11;6697:12;6682:41;;;;:63;;;;;:::i;:::-;6760:36;6770:12;6784:11;6760:36;;;;;;;:::i;:::-;;;;;;;;6495:308:::0;;:::o;1029:85:6:-;1075:7;1101:6;;;;;;;;;;1094:13;;1029:85;:::o;3020:377:11:-;1744:1:8;2325:7;;:19;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1405:8:7::1;:6;:8::i;:::-;1404:9;1396:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;3100:10:11::2;7284:17;:15;:17::i;:::-;7260:21;:41;;;;;;;;;;;;:::i;:::-;;7328:26;:24;:26::i;:::-;7311:14;:43;;;;7387:1;7368:21;;:7;:21;;;7364:314;;7405:30;7438:15;7445:7;7438:6;:15::i;:::-;7405:48;;7472:9;7467:201;7491:13;:20;;;;7487:1;:24;7467:201;;;7558:13;7572:1;7558:16;;;;;;;;:::i;:::-;;;;;;;;7536:7;:16;7544:7;7536:16;;;;;;;;;;;;;;;:19;7553:1;7536:19;;;;;;;;;;;:38;;;;7629:21;7651:1;7629:24;;;;;;;;:::i;:::-;;;;;;;;;;7592:22;:31;7615:7;7592:31;;;;;;;;;;;;;;;:34;7624:1;7592:34;;;;;;;;;;;:61;;;;7513:3;;;;;:::i;:::-;;;;7467:201;;;;7391:287;7364:314;3139:1:::3;3130:6;:10;3122:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;3184:24;3201:6;3184:12;;:16;;:24;;;;:::i;:::-;3169:12;:39;;;;3242:33;3268:6;3242:9;:21;3252:10;3242:21;;;;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;3218:9;:21;3228:10;3218:21;;;;;;;;;;;;;;;:57;;;;3285:64;3315:10;3335:4;3342:6;3285:12;;;;;;;;;;;:29;;;;:64;;;;;;:::i;:::-;3371:10;3364:26;;;3383:6;3364:26;;;;;;:::i;:::-;;;;;;;;1444:1:7::2;1701::8::0;2628:7;:22;;;;3020:377:11;:::o;557:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;921:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;757:29::-;;;;:::o;6809:353::-;1252:12:6;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6931:12:11::1;;6913:15;:30;6892:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;7085:16;7067:15;:34;;;;7116:39;7139:15;;7116:39;;;;;;:::i;:::-;;;;;;;;6809:353:::0;:::o;4588:1795::-;1252:12:6;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4685:1:11::1;7284:17;:15;:17::i;:::-;7260:21;:41;;;;;;;;;;;;:::i;:::-;;7328:26;:24;:26::i;:::-;7311:14;:43;;;;7387:1;7368:21;;:7;:21;;;7364:314;;7405:30;7438:15;7445:7;7438:6;:15::i;:::-;7405:48;;7472:9;7467:201;7491:13;:20;;;;7487:1;:24;7467:201;;;7558:13;7572:1;7558:16;;;;;;;;:::i;:::-;;;;;;;;7536:7;:16;7544:7;7536:16;;;;;;;;;;;;;;;:19;7553:1;7536:19;;;;;;;;;;;:38;;;;7629:21;7651:1;7629:24;;;;;;;;:::i;:::-;;;;;;;;;;7592:22;:31;7615:7;7592:31;;;;;;;;;;;;;;;:34;7624:1;7592:34;;;;;;;;;;;:61;;;;7513:3;;;;;:::i;:::-;;;;7467:201;;;;7391:287;7364:314;4725:13:::2;:20;;;;4706:8;;:15;;:39;4699:47;;;;:::i;:::-;;4757:21;4788:23:::0;4814:8:::2;;4788:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4837:9;4832:865;4856:13;:20;;;;4852:1;:24;4832:865;;;4897:15;4915:13;4929:1;4915:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:26;;;4950:4;4915:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4897:59;;5004:2;4974:13;4988:1;4974:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;;;4970:260;;;5047:53;5071:13;5085:1;5071:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5063:36;;5055:2;5047:15;;:53;;;;:::i;:::-;5042:2;:59;;;;:::i;:::-;5026:75;;5131:30;5147:13;5131:8;;5140:1;5131:11;;;;;;;:::i;:::-;;;;;;;;:15;;:30;;;;:::i;:::-;5119:6;5126:1;5119:9;;;;;;;;:::i;:::-;;;;;;;:42;;;::::0;::::2;5189:26;5201:13;5189:7;:11;;:26;;;;:::i;:::-;5179:36;;4970:260;5629:28;5641:15;;5629:7;:11;;:28;;;;:::i;:::-;5611:11;5623:1;5611:14;;;;;;;;:::i;:::-;;;;;;;;;;:46;;5603:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;4883:814;4878:3;;;;;:::i;:::-;;;;4832:865;;;;5739:12;;5720:15;:31;5716:523;;5772:9;5767:131;5791:13;:20;;;;5787:1;:24;5767:131;;;5853:30;5867:15;;5853:6;5860:1;5853:9;;;;;;;;:::i;:::-;;;;;;;;:13;;:30;;;;:::i;:::-;5836:11;5848:1;5836:14;;;;;;;;:::i;:::-;;;;;;;;;:47;;;;5813:3;;;;;:::i;:::-;;;;5767:131;;;;5716:523;;;5928:17;5948:33;5965:15;5948:12;;:16;;:33;;;;:::i;:::-;5928:53;;5996:16;6031:9:::0;6043:1:::2;6031:13;;6026:203;6050:13;:20;;;;6046:1;:24;6026:203;;;6106:29;6120:11;6132:1;6120:14;;;;;;;;:::i;:::-;;;;;;;;;;6106:9;:13;;:29;;;;:::i;:::-;6095:40;;6170:44;6198:15;;6170:23;6184:8;6170:6;6177:1;6170:9;;;;;;;;:::i;:::-;;;;;;;;:13;;:23;;;;:::i;:::-;:27;;:44;;;;:::i;:::-;6153:11;6165:1;6153:14;;;;;;;;:::i;:::-;;;;;;;;;:61;;;;6072:3;;;;;:::i;:::-;;;;6026:203;;;;5914:325;;5716:523;6266:15;6249:14;:32;;;;6306:36;6326:15;;6306;:19;;:36;;;;:::i;:::-;6291:12;:51;;;;6357:19;6369:6;6357:19;;;;;;:::i;:::-;;;;;;;;4689:1694;;1311:1:6::1;4588:1795:11::0;;:::o;4434:94::-;4469:31;4478:9;:21;4488:10;4478:21;;;;;;;;;;;;;;;;4469:8;:31::i;:::-;4510:11;:9;:11::i;:::-;4434:94::o;640:31::-;;;;:::o;677:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1911:198:6:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;::::0;1991:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;3108:96:10:-;3166:7;3196:1;3192;:5;;;;:::i;:::-;3185:12;;3108:96;;;;:::o;3451:::-;3509:7;3539:1;3535;:5;;;;:::i;:::-;3528:12;;3451:96;;;;:::o;3836:::-;3894:7;3924:1;3920;:5;;;;:::i;:::-;3913:12;;3836:96;;;;:::o;2741:::-;2799:7;2829:1;2825;:5;;;;:::i;:::-;2818:12;;2741:96;;;;:::o;687:205:9:-;799:86;819:5;849:23;;;874:2;878:5;826:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;799:19;:86::i;:::-;687:205;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;2263:187:6:-;2336:16;2355:6;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;461:104:5:-;519:7;549:1;545;:5;:13;;557:1;545:13;;;553:1;545:13;538:20;;461:104;;;;:::o;898:241:9:-;1036:96;1056:5;1086:27;;;1115:4;1121:2;1125:5;1063:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1036:19;:96::i;:::-;898:241;;;;:::o;3193:706::-;3612:23;3638:69;3666:4;3638:69;;;;;;;;;;;;;;;;;3646:5;3638:27;;;;:69;;;;;:::i;:::-;3612:95;;3741:1;3721:10;:17;:21;3717:176;;;3816:10;3805:30;;;;;;;;;;;;:::i;:::-;3797:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;3717:176;3263:636;3193:706;;:::o;3861:223:0:-;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;;3861:223;;;;;:::o;4948:499::-;5113:12;5170:5;5145:21;:30;;5137:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5236:18;5247:6;5236:10;:18::i;:::-;5228:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5300:12;5314:23;5341:6;:11;;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;;;;4948:499;;;;;;:::o;1175:320::-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;7561:692::-;7707:12;7735:7;7731:516;;;7765:10;7758:17;;;;7731:516;7896:1;7876:10;:17;:21;7872:365;;;8070:10;8064:17;8130:15;8117:10;8113:2;8109:19;8102:44;7872:365;8209:12;8202:20;;;;;;;;;;;:::i;:::-;;;;;;;;7561:692;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;88:117:12:-;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:114::-;1243:6;1277:5;1271:12;1261:22;;1176:114;;;:::o;1296:184::-;1395:11;1429:6;1424:3;1417:19;1469:4;1464:3;1460:14;1445:29;;1296:184;;;;:::o;1486:132::-;1553:4;1576:3;1568:11;;1606:4;1601:3;1597:14;1589:22;;1486:132;;;:::o;1624:77::-;1661:7;1690:5;1679:16;;1624:77;;;:::o;1707:108::-;1784:24;1802:5;1784:24;:::i;:::-;1779:3;1772:37;1707:108;;:::o;1821:179::-;1890:10;1911:46;1953:3;1945:6;1911:46;:::i;:::-;1989:4;1984:3;1980:14;1966:28;;1821:179;;;;:::o;2006:113::-;2076:4;2108;2103:3;2099:14;2091:22;;2006:113;;;:::o;2155:732::-;2274:3;2303:54;2351:5;2303:54;:::i;:::-;2373:86;2452:6;2447:3;2373:86;:::i;:::-;2366:93;;2483:56;2533:5;2483:56;:::i;:::-;2562:7;2593:1;2578:284;2603:6;2600:1;2597:13;2578:284;;;2679:6;2673:13;2706:63;2765:3;2750:13;2706:63;:::i;:::-;2699:70;;2792:60;2845:6;2792:60;:::i;:::-;2782:70;;2638:224;2625:1;2622;2618:9;2613:14;;2578:284;;;2582:14;2878:3;2871:10;;2279:608;;;2155:732;;;;:::o;2893:373::-;3036:4;3074:2;3063:9;3059:18;3051:26;;3123:9;3117:4;3113:20;3109:1;3098:9;3094:17;3087:47;3151:108;3254:4;3245:6;3151:108;:::i;:::-;3143:116;;2893:373;;;;:::o;3272:118::-;3359:24;3377:5;3359:24;:::i;:::-;3354:3;3347:37;3272:118;;:::o;3396:222::-;3489:4;3527:2;3516:9;3512:18;3504:26;;3540:71;3608:1;3597:9;3593:17;3584:6;3540:71;:::i;:::-;3396:222;;;;:::o;3624:122::-;3697:24;3715:5;3697:24;:::i;:::-;3690:5;3687:35;3677:63;;3736:1;3733;3726:12;3677:63;3624:122;:::o;3752:139::-;3798:5;3836:6;3823:20;3814:29;;3852:33;3879:5;3852:33;:::i;:::-;3752:139;;;;:::o;3897:329::-;3956:6;4005:2;3993:9;3984:7;3980:23;3976:32;3973:119;;;4011:79;;:::i;:::-;3973:119;4131:1;4156:53;4201:7;4192:6;4181:9;4177:22;4156:53;:::i;:::-;4146:63;;4102:117;3897:329;;;;:::o;4232:90::-;4266:7;4309:5;4302:13;4295:21;4284:32;;4232:90;;;:::o;4328:109::-;4409:21;4424:5;4409:21;:::i;:::-;4404:3;4397:34;4328:109;;:::o;4443:210::-;4530:4;4568:2;4557:9;4553:18;4545:26;;4581:65;4643:1;4632:9;4628:17;4619:6;4581:65;:::i;:::-;4443:210;;;;:::o;4659:474::-;4727:6;4735;4784:2;4772:9;4763:7;4759:23;4755:32;4752:119;;;4790:79;;:::i;:::-;4752:119;4910:1;4935:53;4980:7;4971:6;4960:9;4956:22;4935:53;:::i;:::-;4925:63;;4881:117;5037:2;5063:53;5108:7;5099:6;5088:9;5084:22;5063:53;:::i;:::-;5053:63;;5008:118;4659:474;;;;;:::o;5139:60::-;5167:3;5188:5;5181:12;;5139:60;;;:::o;5205:142::-;5255:9;5288:53;5306:34;5315:24;5333:5;5315:24;:::i;:::-;5306:34;:::i;:::-;5288:53;:::i;:::-;5275:66;;5205:142;;;:::o;5353:126::-;5403:9;5436:37;5467:5;5436:37;:::i;:::-;5423:50;;5353:126;;;:::o;5485:148::-;5557:9;5590:37;5621:5;5590:37;:::i;:::-;5577:50;;5485:148;;;:::o;5639:175::-;5748:59;5801:5;5748:59;:::i;:::-;5743:3;5736:72;5639:175;;:::o;5820:266::-;5935:4;5973:2;5962:9;5958:18;5950:26;;5986:93;6076:1;6065:9;6061:17;6052:6;5986:93;:::i;:::-;5820:266;;;;:::o;6092:118::-;6179:24;6197:5;6179:24;:::i;:::-;6174:3;6167:37;6092:118;;:::o;6216:222::-;6309:4;6347:2;6336:9;6332:18;6324:26;;6360:71;6428:1;6417:9;6413:17;6404:6;6360:71;:::i;:::-;6216:222;;;;:::o;6444:117::-;6553:1;6550;6543:12;6567:117;6676:1;6673;6666:12;6690:117;6799:1;6796;6789:12;6830:568;6903:8;6913:6;6963:3;6956:4;6948:6;6944:17;6940:27;6930:122;;6971:79;;:::i;:::-;6930:122;7084:6;7071:20;7061:30;;7114:18;7106:6;7103:30;7100:117;;;7136:79;;:::i;:::-;7100:117;7250:4;7242:6;7238:17;7226:29;;7304:3;7296:4;7288:6;7284:17;7274:8;7270:32;7267:41;7264:128;;;7311:79;;:::i;:::-;7264:128;6830:568;;;;;:::o;7404:559::-;7490:6;7498;7547:2;7535:9;7526:7;7522:23;7518:32;7515:119;;;7553:79;;:::i;:::-;7515:119;7701:1;7690:9;7686:17;7673:31;7731:18;7723:6;7720:30;7717:117;;;7753:79;;:::i;:::-;7717:117;7866:80;7938:7;7929:6;7918:9;7914:22;7866:80;:::i;:::-;7848:98;;;;7644:312;7404:559;;;;;:::o;7969:180::-;8017:77;8014:1;8007:88;8114:4;8111:1;8104:15;8138:4;8135:1;8128:15;8155:180;8203:77;8200:1;8193:88;8300:4;8297:1;8290:15;8324:4;8321:1;8314:15;8341:233;8380:3;8403:24;8421:5;8403:24;:::i;:::-;8394:33;;8449:66;8442:5;8439:77;8436:103;;8519:18;;:::i;:::-;8436:103;8566:1;8559:5;8555:13;8548:20;;8341:233;;;:::o;8580:180::-;8628:77;8625:1;8618:88;8725:4;8722:1;8715:15;8749:4;8746:1;8739:15;8766:169;8850:11;8884:6;8879:3;8872:19;8924:4;8919:3;8915:14;8900:29;;8766:169;;;;:::o;8941:181::-;9081:33;9077:1;9069:6;9065:14;9058:57;8941:181;:::o;9128:366::-;9270:3;9291:67;9355:2;9350:3;9291:67;:::i;:::-;9284:74;;9367:93;9456:3;9367:93;:::i;:::-;9485:2;9480:3;9476:12;9469:19;;9128:366;;;:::o;9500:419::-;9666:4;9704:2;9693:9;9689:18;9681:26;;9753:9;9747:4;9743:20;9739:1;9728:9;9724:17;9717:47;9781:131;9907:4;9781:131;:::i;:::-;9773:139;;9500:419;;;:::o;9925:167::-;10065:19;10061:1;10053:6;10049:14;10042:43;9925:167;:::o;10098:366::-;10240:3;10261:67;10325:2;10320:3;10261:67;:::i;:::-;10254:74;;10337:93;10426:3;10337:93;:::i;:::-;10455:2;10450:3;10446:12;10439:19;;10098:366;;;:::o;10470:419::-;10636:4;10674:2;10663:9;10659:18;10651:26;;10723:9;10717:4;10713:20;10709:1;10698:9;10694:17;10687:47;10751:131;10877:4;10751:131;:::i;:::-;10743:139;;10470:419;;;:::o;10895:86::-;10930:7;10970:4;10963:5;10959:16;10948:27;;10895:86;;;:::o;10987:118::-;11058:22;11074:5;11058:22;:::i;:::-;11051:5;11048:33;11038:61;;11095:1;11092;11085:12;11038:61;10987:118;:::o;11111:139::-;11166:5;11197:6;11191:13;11182:22;;11213:31;11238:5;11213:31;:::i;:::-;11111:139;;;;:::o;11256:347::-;11324:6;11373:2;11361:9;11352:7;11348:23;11344:32;11341:119;;;11379:79;;:::i;:::-;11341:119;11499:1;11524:62;11578:7;11569:6;11558:9;11554:22;11524:62;:::i;:::-;11514:72;;11470:126;11256:347;;;;:::o;11609:102::-;11651:8;11698:5;11695:1;11691:13;11670:34;;11609:102;;;:::o;11717:848::-;11778:5;11785:4;11809:6;11800:15;;11833:5;11824:14;;11847:712;11868:1;11858:8;11855:15;11847:712;;;11963:4;11958:3;11954:14;11948:4;11945:24;11942:50;;;11972:18;;:::i;:::-;11942:50;12022:1;12012:8;12008:16;12005:451;;;12437:4;12430:5;12426:16;12417:25;;12005:451;12487:4;12481;12477:15;12469:23;;12517:32;12540:8;12517:32;:::i;:::-;12505:44;;11847:712;;;11717:848;;;;;;;:::o;12571:1073::-;12625:5;12816:8;12806:40;;12837:1;12828:10;;12839:5;;12806:40;12865:4;12855:36;;12882:1;12873:10;;12884:5;;12855:36;12951:4;12999:1;12994:27;;;;13035:1;13030:191;;;;12944:277;;12994:27;13012:1;13003:10;;13014:5;;;13030:191;13075:3;13065:8;13062:17;13059:43;;;13082:18;;:::i;:::-;13059:43;13131:8;13128:1;13124:16;13115:25;;13166:3;13159:5;13156:14;13153:40;;;13173:18;;:::i;:::-;13153:40;13206:5;;;12944:277;;13330:2;13320:8;13317:16;13311:3;13305:4;13302:13;13298:36;13280:2;13270:8;13267:16;13262:2;13256:4;13253:12;13249:35;13233:111;13230:246;;;13386:8;13380:4;13376:19;13367:28;;13421:3;13414:5;13411:14;13408:40;;;13428:18;;:::i;:::-;13408:40;13461:5;;13230:246;13501:42;13539:3;13529:8;13523:4;13520:1;13501:42;:::i;:::-;13486:57;;;;13575:4;13570:3;13566:14;13559:5;13556:25;13553:51;;;13584:18;;:::i;:::-;13553:51;13633:4;13626:5;13622:16;13613:25;;12571:1073;;;;;;:::o;13650:285::-;13710:5;13734:23;13752:4;13734:23;:::i;:::-;13726:31;;13778:27;13796:8;13778:27;:::i;:::-;13766:39;;13824:104;13861:66;13851:8;13845:4;13824:104;:::i;:::-;13815:113;;13650:285;;;;:::o;13941:182::-;14081:34;14077:1;14069:6;14065:14;14058:58;13941:182;:::o;14129:366::-;14271:3;14292:67;14356:2;14351:3;14292:67;:::i;:::-;14285:74;;14368:93;14457:3;14368:93;:::i;:::-;14486:2;14481:3;14477:12;14470:19;;14129:366;;;:::o;14501:419::-;14667:4;14705:2;14694:9;14690:18;14682:26;;14754:9;14748:4;14744:20;14740:1;14729:9;14725:17;14718:47;14782:131;14908:4;14782:131;:::i;:::-;14774:139;;14501:419;;;:::o;14926:220::-;15066:34;15062:1;15054:6;15050:14;15043:58;15135:3;15130:2;15122:6;15118:15;15111:28;14926:220;:::o;15152:366::-;15294:3;15315:67;15379:2;15374:3;15315:67;:::i;:::-;15308:74;;15391:93;15480:3;15391:93;:::i;:::-;15509:2;15504:3;15500:12;15493:19;;15152:366;;;:::o;15524:419::-;15690:4;15728:2;15717:9;15713:18;15705:26;;15777:9;15771:4;15767:20;15763:1;15752:9;15748:17;15741:47;15805:131;15931:4;15805:131;:::i;:::-;15797:139;;15524:419;;;:::o;15949:332::-;16070:4;16108:2;16097:9;16093:18;16085:26;;16121:71;16189:1;16178:9;16174:17;16165:6;16121:71;:::i;:::-;16202:72;16270:2;16259:9;16255:18;16246:6;16202:72;:::i;:::-;15949:332;;;;;:::o;16287:166::-;16427:18;16423:1;16415:6;16411:14;16404:42;16287:166;:::o;16459:366::-;16601:3;16622:67;16686:2;16681:3;16622:67;:::i;:::-;16615:74;;16698:93;16787:3;16698:93;:::i;:::-;16816:2;16811:3;16807:12;16800:19;;16459:366;;;:::o;16831:419::-;16997:4;17035:2;17024:9;17020:18;17012:26;;17084:9;17078:4;17074:20;17070:1;17059:9;17055:17;17048:47;17112:131;17238:4;17112:131;:::i;:::-;17104:139;;16831:419;;;:::o;17256:164::-;17396:16;17392:1;17384:6;17380:14;17373:40;17256:164;:::o;17426:366::-;17568:3;17589:67;17653:2;17648:3;17589:67;:::i;:::-;17582:74;;17665:93;17754:3;17665:93;:::i;:::-;17783:2;17778:3;17774:12;17767:19;;17426:366;;;:::o;17798:419::-;17964:4;18002:2;17991:9;17987:18;17979:26;;18051:9;18045:4;18041:20;18037:1;18026:9;18022:17;18015:47;18079:131;18205:4;18079:131;:::i;:::-;18071:139;;17798:419;;;:::o;18223:312::-;18363:34;18359:1;18351:6;18347:14;18340:58;18432:34;18427:2;18419:6;18415:15;18408:59;18501:26;18496:2;18488:6;18484:15;18477:51;18223:312;:::o;18541:366::-;18683:3;18704:67;18768:2;18763:3;18704:67;:::i;:::-;18697:74;;18780:93;18869:3;18780:93;:::i;:::-;18898:2;18893:3;18889:12;18882:19;;18541:366;;;:::o;18913:419::-;19079:4;19117:2;19106:9;19102:18;19094:26;;19166:9;19160:4;19156:20;19152:1;19141:9;19137:17;19130:47;19194:131;19320:4;19194:131;:::i;:::-;19186:139;;18913:419;;;:::o;19338:180::-;19386:77;19383:1;19376:88;19483:4;19480:1;19473:15;19507:4;19504:1;19497:15;19524:143;19581:5;19612:6;19606:13;19597:22;;19628:33;19655:5;19628:33;:::i;:::-;19524:143;;;;:::o;19673:351::-;19743:6;19792:2;19780:9;19771:7;19767:23;19763:32;19760:119;;;19798:79;;:::i;:::-;19760:119;19918:1;19943:64;19999:7;19990:6;19979:9;19975:22;19943:64;:::i;:::-;19933:74;;19889:128;19673:351;;;;:::o;20030:174::-;20170:26;20166:1;20158:6;20154:14;20147:50;20030:174;:::o;20210:366::-;20352:3;20373:67;20437:2;20432:3;20373:67;:::i;:::-;20366:74;;20449:93;20538:3;20449:93;:::i;:::-;20567:2;20562:3;20558:12;20551:19;;20210:366;;;:::o;20582:419::-;20748:4;20786:2;20775:9;20771:18;20763:26;;20835:9;20829:4;20825:20;20821:1;20810:9;20806:17;20799:47;20863:131;20989:4;20863:131;:::i;:::-;20855:139;;20582:419;;;:::o;21007:225::-;21147:34;21143:1;21135:6;21131:14;21124:58;21216:8;21211:2;21203:6;21199:15;21192:33;21007:225;:::o;21238:366::-;21380:3;21401:67;21465:2;21460:3;21401:67;:::i;:::-;21394:74;;21477:93;21566:3;21477:93;:::i;:::-;21595:2;21590:3;21586:12;21579:19;;21238:366;;;:::o;21610:419::-;21776:4;21814:2;21803:9;21799:18;21791:26;;21863:9;21857:4;21853:20;21849:1;21838:9;21834:17;21827:47;21891:131;22017:4;21891:131;:::i;:::-;21883:139;;21610:419;;;:::o;22035:191::-;22075:4;22095:20;22113:1;22095:20;:::i;:::-;22090:25;;22129:20;22147:1;22129:20;:::i;:::-;22124:25;;22168:1;22165;22162:8;22159:34;;;22173:18;;:::i;:::-;22159:34;22218:1;22215;22211:9;22203:17;;22035:191;;;;:::o;22232:348::-;22272:7;22295:20;22313:1;22295:20;:::i;:::-;22290:25;;22329:20;22347:1;22329:20;:::i;:::-;22324:25;;22517:1;22449:66;22445:74;22442:1;22439:81;22434:1;22427:9;22420:17;22416:105;22413:131;;;22524:18;;:::i;:::-;22413:131;22572:1;22569;22565:9;22554:20;;22232:348;;;;:::o;22586:180::-;22634:77;22631:1;22624:88;22731:4;22728:1;22721:15;22755:4;22752:1;22745:15;22772:185;22812:1;22829:20;22847:1;22829:20;:::i;:::-;22824:25;;22863:20;22881:1;22863:20;:::i;:::-;22858:25;;22902:1;22892:35;;22907:18;;:::i;:::-;22892:35;22949:1;22946;22942:9;22937:14;;22772:185;;;;:::o;22963:305::-;23003:3;23022:20;23040:1;23022:20;:::i;:::-;23017:25;;23056:20;23074:1;23056:20;:::i;:::-;23051:25;;23210:1;23142:66;23138:74;23135:1;23132:81;23129:107;;;23216:18;;:::i;:::-;23129:107;23260:1;23257;23253:9;23246:16;;22963:305;;;;:::o;23274:442::-;23423:4;23461:2;23450:9;23446:18;23438:26;;23474:71;23542:1;23531:9;23527:17;23518:6;23474:71;:::i;:::-;23555:72;23623:2;23612:9;23608:18;23599:6;23555:72;:::i;:::-;23637;23705:2;23694:9;23690:18;23681:6;23637:72;:::i;:::-;23274:442;;;;;;:::o;23722:116::-;23792:21;23807:5;23792:21;:::i;:::-;23785:5;23782:32;23772:60;;23828:1;23825;23818:12;23772:60;23722:116;:::o;23844:137::-;23898:5;23929:6;23923:13;23914:22;;23945:30;23969:5;23945:30;:::i;:::-;23844:137;;;;:::o;23987:345::-;24054:6;24103:2;24091:9;24082:7;24078:23;24074:32;24071:119;;;24109:79;;:::i;:::-;24071:119;24229:1;24254:61;24307:7;24298:6;24287:9;24283:22;24254:61;:::i;:::-;24244:71;;24200:125;23987:345;;;;:::o;24338:229::-;24478:34;24474:1;24466:6;24462:14;24455:58;24547:12;24542:2;24534:6;24530:15;24523:37;24338:229;:::o;24573:366::-;24715:3;24736:67;24800:2;24795:3;24736:67;:::i;:::-;24729:74;;24812:93;24901:3;24812:93;:::i;:::-;24930:2;24925:3;24921:12;24914:19;;24573:366;;;:::o;24945:419::-;25111:4;25149:2;25138:9;25134:18;25126:26;;25198:9;25192:4;25188:20;25184:1;25173:9;25169:17;25162:47;25226:131;25352:4;25226:131;:::i;:::-;25218:139;;24945:419;;;:::o;25370:225::-;25510:34;25506:1;25498:6;25494:14;25487:58;25579:8;25574:2;25566:6;25562:15;25555:33;25370:225;:::o;25601:366::-;25743:3;25764:67;25828:2;25823:3;25764:67;:::i;:::-;25757:74;;25840:93;25929:3;25840:93;:::i;:::-;25958:2;25953:3;25949:12;25942:19;;25601:366;;;:::o;25973:419::-;26139:4;26177:2;26166:9;26162:18;26154:26;;26226:9;26220:4;26216:20;26212:1;26201:9;26197:17;26190:47;26254:131;26380:4;26254:131;:::i;:::-;26246:139;;25973:419;;;:::o;26398:179::-;26538:31;26534:1;26526:6;26522:14;26515:55;26398:179;:::o;26583:366::-;26725:3;26746:67;26810:2;26805:3;26746:67;:::i;:::-;26739:74;;26822:93;26911:3;26822:93;:::i;:::-;26940:2;26935:3;26931:12;26924:19;;26583:366;;;:::o;26955:419::-;27121:4;27159:2;27148:9;27144:18;27136:26;;27208:9;27202:4;27198:20;27194:1;27183:9;27179:17;27172:47;27236:131;27362:4;27236:131;:::i;:::-;27228:139;;26955:419;;;:::o;27380:98::-;27431:6;27465:5;27459:12;27449:22;;27380:98;;;:::o;27484:147::-;27585:11;27622:3;27607:18;;27484:147;;;;:::o;27637:307::-;27705:1;27715:113;27729:6;27726:1;27723:13;27715:113;;;27814:1;27809:3;27805:11;27799:18;27795:1;27790:3;27786:11;27779:39;27751:2;27748:1;27744:10;27739:15;;27715:113;;;27846:6;27843:1;27840:13;27837:101;;;27926:1;27917:6;27912:3;27908:16;27901:27;27837:101;27686:258;27637:307;;;:::o;27950:373::-;28054:3;28082:38;28114:5;28082:38;:::i;:::-;28136:88;28217:6;28212:3;28136:88;:::i;:::-;28129:95;;28233:52;28278:6;28273:3;28266:4;28259:5;28255:16;28233:52;:::i;:::-;28310:6;28305:3;28301:16;28294:23;;28058:265;27950:373;;;;:::o;28329:271::-;28459:3;28481:93;28570:3;28561:6;28481:93;:::i;:::-;28474:100;;28591:3;28584:10;;28329:271;;;;:::o;28606:99::-;28658:6;28692:5;28686:12;28676:22;;28606:99;;;:::o;28711:102::-;28752:6;28803:2;28799:7;28794:2;28787:5;28783:14;28779:28;28769:38;;28711:102;;;:::o;28819:364::-;28907:3;28935:39;28968:5;28935:39;:::i;:::-;28990:71;29054:6;29049:3;28990:71;:::i;:::-;28983:78;;29070:52;29115:6;29110:3;29103:4;29096:5;29092:16;29070:52;:::i;:::-;29147:29;29169:6;29147:29;:::i;:::-;29142:3;29138:39;29131:46;;28911:272;28819:364;;;;:::o;29189:313::-;29302:4;29340:2;29329:9;29325:18;29317:26;;29389:9;29383:4;29379:20;29375:1;29364:9;29360:17;29353:47;29417:78;29490:4;29481:6;29417:78;:::i;:::-;29409:86;;29189:313;;;;:::o
Swarm Source
ipfs://aecca3600b30c80e923d44d3a3b13623e7619c7f5f09122ac261df821de99a69
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.