Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
Farming
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at basescan.org on 2023-12-31 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @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 Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { 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()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: Farming/Farming.sol pragma solidity ^0.8.0; interface IFarming { function getDepositAmount(address user, uint256 _pid) external view returns (uint256); } /** @title ITokenLocker * @notice */ interface ITokenLocker { function lockToken( address token, address beneficiary, uint256 amount, uint256 unlockTime ) external; } interface IFarmingFactory { function tokenLocker() external view returns (address); } /** @title Farming * * @notice Contract that distribute rewards to multiple pools based on allocation point ratio * */ contract Farming is Ownable, ReentrancyGuard, IFarming, Pausable { using SafeERC20 for IERC20; struct UserInfo { uint256 amount; // amount of tokens deposited by the user uint256 rewardDebt; // amount to be cut off in rewards calculation - updated when deposit, withdraw or claim uint256 pendingRewards; // pending rewards for the user } struct PoolInfo { IERC20 lpToken; uint256 allocPoint; // allocation point for the pool for rewards distribution uint256 accTokenPerShare; // accumulative rewards per deposited token uint256 lockupDuration; } IFarmingFactory public factory; address public token; address public tokenB; uint256 public constant MAX_PERCENT = 1 * (10**18); uint256 public totalDistributed; uint256 public totalReleased; PoolInfo[] public poolInfo; mapping(uint256 => mapping(address => UserInfo)) public userInfo; uint256 public totalAllocPoint = 0; // sum of pools' allocation points uint256 public constant SHARE_MULTIPLIER = 1e12; mapping(address => bool) private isLPPoolAdded; // lp token already added flag event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event RequestWithdraw(address indexed user, uint256 indexed pid, uint256 amount); event Claim(address indexed user, uint256 indexed pid, uint256 amountOne, uint256 amounTwo); event PoolAdded(uint256 pid, uint256 allocPoint, uint256 lockupDuration, address lp); event PoolLockDurationChanged(uint256 pid, uint256 lockupDuration); event Pause(); event Unpause(); modifier validatePoolByPid(uint256 _pid) { require(_pid < poolInfo.length, "Pool does not exist"); _; } constructor(IFarmingFactory _factory) { require(address(_factory) != address(0), "Invalid factory!"); factory = _factory; } function updateTokenA(address _token) public onlyOwner { token = _token; } function updateTokenB(address _token) public onlyOwner { tokenB = _token; } function poolLength() external view returns (uint256) { return poolInfo.length; } // balance of the contract includes already distributed and not distributed amounts function getTotalDistributableRewards() public view returns (uint256) { // (totalDistributed - totalReleased) is the sum of members' pending amounts return IERC20(token).balanceOf(address(this)) + totalReleased - totalDistributed; } // accumulative rewards for deposited amount function accumulativeRewards(uint256 amount, uint256 _accTokenPerShare) internal pure returns (uint256) { return (amount * _accTokenPerShare) / (SHARE_MULTIPLIER); } function pendingToken(uint256 _pid, address _user) external view validatePoolByPid(_pid) returns (uint256) { require(_user != address(0), "Invalid address!"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accTokenPerShare = pool.accTokenPerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply != 0) { uint256 tokenReward = (getTotalDistributableRewards() * (pool.allocPoint)) / (totalAllocPoint); accTokenPerShare += (tokenReward * (SHARE_MULTIPLIER)) / (lpSupply); } // last_accumulated_reward is expressed as rewardDebt // accumulated_rewards - last_accumulated_reward + last_pending_rewards return accumulativeRewards(user.amount, accTokenPerShare) - user.rewardDebt + user.pendingRewards; } // update all pools' accumulative rewards per share function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { _updatePool(pid); } totalDistributed += getTotalDistributableRewards(); } // update pool's accumulative rewards per share by id function _updatePool(uint256 _pid) internal validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0) { return; } uint256 tokenReward = (getTotalDistributableRewards() * pool.allocPoint) / totalAllocPoint; // accTokenPerShare is by definition accumulation of token rewards per staked token pool.accTokenPerShare += (tokenReward * (SHARE_MULTIPLIER)) / (lpSupply); } function _updateUserPendingRewards(uint256 _pid, address addr) internal { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][addr]; if (user.amount == 0) { return; } user.pendingRewards += accumulativeRewards(user.amount, pool.accTokenPerShare) - user.rewardDebt; } function deposit( uint256 _pid, uint256 _amount, bool _withdrawRewards ) public validatePoolByPid(_pid) whenNotPaused nonReentrant { require(_amount > 0, "amount should be positive"); massUpdatePools(); _updateUserPendingRewards(_pid, msg.sender); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; if (_withdrawRewards) { processReward(user, _pid); } pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount += _amount; // last_accumulated_reward is expressed as rewardDebt user.rewardDebt = accumulativeRewards(user.amount, pool.accTokenPerShare); emit Deposit(msg.sender, _pid, _amount); } function requestWithdraw( uint256 _pid, uint256 _amount, bool _withdrawRewards ) public nonReentrant validatePoolByPid(_pid) whenNotPaused { massUpdatePools(); _updateUserPendingRewards(_pid, msg.sender); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: should withdraw less than balance"); require(_amount > 0, "withdraw: amount should be positive"); if (_withdrawRewards) { processReward(user, _pid); } address tokenLocker = factory.tokenLocker(); pool.lpToken.approve(tokenLocker, _amount); ITokenLocker(tokenLocker).lockToken( address(pool.lpToken), msg.sender, _amount, block.timestamp + pool.lockupDuration ); user.amount -= _amount; // last_accumulated_reward is expressed as rewardDebt user.rewardDebt = accumulativeRewards(user.amount, pool.accTokenPerShare); emit RequestWithdraw(msg.sender, _pid, _amount); } function processReward(UserInfo storage user, uint256 _pid) private { (uint256 amountOne, uint256 amountTwo) = safeTokenTransfer(msg.sender, user.pendingRewards); emit Claim(msg.sender, _pid, amountOne, amountTwo); user.pendingRewards = user.pendingRewards - amountOne; totalReleased += amountOne; } function claim(uint256 _pid) public nonReentrant validatePoolByPid(_pid) whenNotPaused { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; massUpdatePools(); _updateUserPendingRewards(_pid, msg.sender); processReward(user, _pid); // last_accumulated_reward is expressed as rewardDebt user.rewardDebt = accumulativeRewards(user.amount, pool.accTokenPerShare); } function safeTokenTransfer(address _to, uint256 _amount) internal returns (uint256, uint256) { uint256 _tokenARewards = 0; uint256 _tokenBRewards = 0; uint256 tokenBal = IERC20(token).balanceOf(address(this)); uint256 tokenBalB = IERC20(tokenB).balanceOf(address(this)); if (_amount > tokenBal) { IERC20(token).safeTransfer(_to, tokenBal); _tokenARewards = tokenBal; } else { IERC20(token).safeTransfer(_to, _amount); _tokenARewards = _amount; } if(tokenBalB > 500000) { uint256 rewards = _amount * MAX_PERCENT; uint256 percent = (rewards * 100) / tokenBal; uint256 tokenBrewards = (tokenBalB * percent) / 100; tokenBrewards = tokenBrewards / MAX_PERCENT; if (tokenBrewards > tokenBalB) { IERC20(tokenB).safeTransfer(_to, tokenBalB); _tokenBRewards = tokenBalB; } else { IERC20(tokenB).safeTransfer(_to, tokenBrewards); _tokenBRewards = tokenBrewards; } } return (_tokenARewards, _tokenBRewards); } function getDepositAmount(address user, uint256 _pid) external view override validatePoolByPid(_pid) returns (uint256) { return userInfo[_pid][user].amount; } function withdrawAnyToken(IERC20 _token, uint256 amount) external onlyOwner { _token.safeTransfer(msg.sender, amount); } function updatePoolDuration(uint256 _pid, uint256 _lockupDuration) external onlyOwner validatePoolByPid(_pid) { poolInfo[_pid].lockupDuration = _lockupDuration; emit PoolLockDurationChanged(_pid, _lockupDuration); } function addPool( uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate ) public onlyOwner { require(!isLPPoolAdded[address(_lpToken)], "There's already a pool with that LP token!"); // Note: it is designed to support when staking token is different from reward token require(address(_lpToken) != token, "Staking token should be different from reward token"); require(address(_lpToken) != address(0), "Invalid lp"); if (_withUpdate) { massUpdatePools(); } totalAllocPoint += _allocPoint; uint256 lockupDuration = 14 days; poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, accTokenPerShare: 0, lockupDuration: lockupDuration }) ); isLPPoolAdded[address(_lpToken)] = true; emit PoolAdded(poolInfo.length - 1, _allocPoint, lockupDuration, address(_lpToken)); } function setPool( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) public onlyOwner validatePoolByPid(_pid) { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint - (poolInfo[_pid].allocPoint) + (_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; } /** * @notice Triggers stopped state * @dev Only possible when contract not paused. */ function pause() external onlyOwner whenNotPaused { _pause(); emit Pause(); } /** * @notice Returns to normal state * @dev Only possible when contract is paused. */ function unpause() external onlyOwner whenPaused { _unpause(); emit Unpause(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IFarmingFactory","name":"_factory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOne","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amounTwo","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockupDuration","type":"uint256"},{"indexed":false,"internalType":"address","name":"lp","type":"address"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockupDuration","type":"uint256"}],"name":"PoolLockDurationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RequestWithdraw","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_withdrawRewards","type":"bool"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IFarmingFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDistributableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"lockupDuration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_withdrawRewards","type":"bool"}],"name":"requestWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenB","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_lockupDuration","type":"uint256"}],"name":"updatePoolDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"updateTokenA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"updateTokenB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"pendingRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAnyToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006009553480156200001657600080fd5b5060405162003a4538038062003a4583398181016040528101906200003c919062000282565b6200005c620000506200013860201b60201c565b6200014060201b60201c565b600180819055506000600260006101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000e79062000315565b60405180910390fd5b80600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000337565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002368262000209565b9050919050565b60006200024a8262000229565b9050919050565b6200025c816200023d565b81146200026857600080fd5b50565b6000815190506200027c8162000251565b92915050565b6000602082840312156200029b576200029a62000204565b5b6000620002ab848285016200026b565b91505092915050565b600082825260208201905092915050565b7f496e76616c696420666163746f72792100000000000000000000000000000000600082015250565b6000620002fd601083620002b4565b91506200030a82620002c5565b602082019050919050565b600060208201905081810360008301526200033081620002ee565b9050919050565b6136fe80620003476000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063715018a611610104578063c45a0155116100a2578063e9c002dc11610071578063e9c002dc146104d8578063efca2eed146104f4578063f2fde38b14610512578063fc0c546a1461052e576101da565b8063c45a015514610450578063d02bf22f1461046e578063e02c499d1461049e578063e33b7de3146104ba576101da565b80638456cb59116100de5780638456cb59146103da57806387a35382146103e45780638da5cb5b1461040057806393f1a40b1461041e576101da565b8063715018a614610398578063795af039146103a25780637abceffd146103be576101da565b806342868c281161017c5780635c975abb1161014b5780635c975abb146103365780635f64b55b14610354578063630b5ba1146103725780636f7ece131461037c576101da565b806342868c28146102b057806343a0d066146102ce57806346ca6bea146102ea57806348e43af414610306576101da565b806317caf6f1116101b857806317caf6f11461024e578063291c3f791461026c578063379607f51461028a5780633f4ba83a146102a6576101da565b8063081e3eda146101df5780631036bbe2146101fd5780631526fe271461021b575b600080fd5b6101e761054c565b6040516101f491906125c2565b60405180910390f35b610205610559565b60405161021291906125c2565b60405180910390f35b6102356004803603810190610230919061260e565b610565565b60405161024594939291906126ba565b60405180910390f35b6102566105c5565b60405161026391906125c2565b60405180910390f35b6102746105cb565b60405161028191906125c2565b60405180910390f35b6102a4600480360381019061029f919061260e565b6105d4565b005b6102ae6106ea565b005b6102b8610730565b6040516102c591906125c2565b60405180910390f35b6102e860048036038101906102e39190612737565b6107ed565b005b61030460048036038101906102ff9190612737565b610a0a565b005b610320600480360381019061031b91906127c8565b610add565b60405161032d91906125c2565b60405180910390f35b61033e610d4f565b60405161034b9190612817565b60405180910390f35b61035c610d66565b6040516103699190612841565b60405180910390f35b61037a610d8c565b005b6103966004803603810190610391919061285c565b610ddf565b005b6103a0610e2b565b005b6103bc60048036038101906103b79190612889565b610e3f565b005b6103d860048036038101906103d39190612907565b610ef7565b005b6103e2611231565b005b6103fe60048036038101906103f9919061295a565b611277565b005b6104086112ae565b6040516104159190612841565b60405180910390f35b610438600480360381019061043391906127c8565b6112d7565b6040516104479392919061299a565b60405180910390f35b61045861130e565b60405161046591906129f2565b60405180910390f35b61048860048036038101906104839190612a0d565b611334565b60405161049591906125c2565b60405180910390f35b6104b860048036038101906104b39190612737565b6113db565b005b6104c26117cb565b6040516104cf91906125c2565b60405180910390f35b6104f260048036038101906104ed919061285c565b6117d1565b005b6104fc61181d565b60405161050991906125c2565b60405180910390f35b61052c6004803603810190610527919061285c565b611823565b005b6105366118a6565b6040516105439190612841565b60405180910390f35b6000600780549050905090565b670de0b6b3a764000081565b6007818154811061057557600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60095481565b64e8d4a5100081565b6105dc6118cc565b806007805490508110610624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061b90612aaa565b60405180910390fd5b61062c61191b565b60006007838154811061064257610641612aca565b5b9060005260206000209060040201905060006008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506106ae610d8c565b6106b88433611965565b6106c28185611a34565b6106d481600001548360020154611ad1565b81600101819055505050506106e7611af7565b50565b6106f2611b00565b6106fa611b7e565b610702611bc7565b7f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600554600654600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107939190612841565b602060405180830381865afa1580156107b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d49190612b0e565b6107de9190612b6a565b6107e89190612b9e565b905090565b826007805490508110610835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082c90612aaa565b60405180910390fd5b61083d61191b565b6108456118cc565b60008311610888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087f90612c1e565b60405180910390fd5b610890610d8c565b61089a8433611965565b6000600785815481106108b0576108af612aca565b5b9060005260206000209060040201905060006008600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508315610925576109248187611a34565b5b6109763330878560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c2a909392919063ffffffff16565b8481600001600082825461098a9190612b6a565b925050819055506109a381600001548360020154611ad1565b8160010181905550853373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15876040516109f291906125c2565b60405180910390a35050610a04611af7565b50505050565b610a12611b00565b826007805490508110610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190612aaa565b60405180910390fd5b8115610a6957610a68610d8c565b5b8260078581548110610a7e57610a7d612aca565b5b906000526020600020906004020160010154600954610a9d9190612b9e565b610aa79190612b6a565b6009819055508260078581548110610ac257610ac1612aca565b5b90600052602060002090600402016001018190555050505050565b6000826007805490508110610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90612aaa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d90612c8a565b60405180910390fd5b600060078581548110610bac57610bab612aca565b5b9060005260206000209060040201905060006008600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260020154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c789190612841565b602060405180830381865afa158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb99190612b0e565b905060008114610d165760006009548560010154610cd5610730565b610cdf9190612caa565b610ce99190612d33565b90508164e8d4a5100082610cfd9190612caa565b610d079190612d33565b83610d129190612b6a565b9250505b82600201548360010154610d2e856000015485611ad1565b610d389190612b9e565b610d429190612b6a565b9550505050505092915050565b6000600260009054906101000a900460ff16905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600780549050905060005b81811015610dbb57610daa81611cb3565b80610db490612d64565b9050610d99565b50610dc4610730565b60056000828254610dd59190612b6a565b9250508190555050565b610de7611b00565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e33611b00565b610e3d6000611e38565b565b610e47611b00565b816007805490508110610e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8690612aaa565b60405180910390fd5b8160078481548110610ea457610ea3612aca565b5b9060005260206000209060040201600301819055507f4bd832da909427f335ae5fa586bb7b1f69cdd865999e5d9b85f4c9a1aafecce38383604051610eea929190612dac565b60405180910390a1505050565b610eff611b00565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8390612e47565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390612ed9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361108b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108290612f45565b60405180910390fd5b801561109a57611099610d8c565b5b82600960008282546110ac9190612b6a565b925050819055506000621275009050600760405180608001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018681526020016000815260200183815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550506001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6b62e2a4361b4ec557bae6ad4ec355efa8c881160803373408ccdb4c918473db60016007805490506112109190612b9e565b8583866040516112239493929190612f65565b60405180910390a150505050565b611239611b00565b61124161191b565b611249611efc565b7f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b61127f611b00565b6112aa33828473ffffffffffffffffffffffffffffffffffffffff16611f5f9092919063ffffffff16565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6008602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081600780549050811061137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137590612aaa565b60405180910390fd5b6008600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015491505092915050565b6113e36118cc565b82600780549050811061142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142290612aaa565b60405180910390fd5b61143361191b565b61143b610d8c565b6114458433611965565b60006007858154811061145b5761145a612aca565b5b9060005260206000209060040201905060006008600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508481600001541015611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd9061301c565b60405180910390fd5b60008511611549576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611540906130ae565b60405180910390fd5b831561155a576115598187611a34565b5b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a80bf3e66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed91906130e3565b90508260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b382886040518363ffffffff1660e01b815260040161164e929190613110565b6020604051808303816000875af115801561166d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611691919061314e565b508073ffffffffffffffffffffffffffffffffffffffff1663e4ddc77c8460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633898760030154426116e59190612b6a565b6040518563ffffffff1660e01b8152600401611704949392919061317b565b600060405180830381600087803b15801561171e57600080fd5b505af1158015611732573d6000803e3d6000fd5b505050508582600001600082825461174a9190612b9e565b9250508190555061176382600001548460020154611ad1565b8260010181905550863373ffffffffffffffffffffffffffffffffffffffff167febeaa8785285a4f7c37a305351997dceebabc3c357dab98023dc37514a1b6ed6886040516117b291906125c2565b60405180910390a3505050506117c6611af7565b505050565b60065481565b6117d9611b00565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60055481565b61182b611b00565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189190613232565b60405180910390fd5b6118a381611e38565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260015403611911576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119089061329e565b60405180910390fd5b6002600181905550565b611923610d4f565b15611963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195a9061330a565b60405180910390fd5b565b60006007838154811061197b5761197a612aca565b5b9060005260206000209060040201905060006008600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154036119f2575050611a30565b8060010154611a0982600001548460020154611ad1565b611a139190612b9e565b816002016000828254611a269190612b6a565b9250508190555050505b5050565b600080611a45338560020154611fe5565b91509150823373ffffffffffffffffffffffffffffffffffffffff167f45c072aa05b9853b5a993de7a28bc332ee01404a628cec1a23ce0f659f842ef18484604051611a92929190612dac565b60405180910390a3818460020154611aaa9190612b9e565b84600201819055508160066000828254611ac49190612b6a565b9250508190555050505050565b600064e8d4a510008284611ae59190612caa565b611aef9190612d33565b905092915050565b60018081905550565b611b0861230d565b73ffffffffffffffffffffffffffffffffffffffff16611b266112ae565b73ffffffffffffffffffffffffffffffffffffffff1614611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7390613376565b60405180910390fd5b565b611b86610d4f565b611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc906133e2565b60405180910390fd5b565b611bcf611b7e565b6000600260006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c1361230d565b604051611c209190612841565b60405180910390a1565b611cad846323b872dd60e01b858585604051602401611c4b93929190613402565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612315565b50505050565b806007805490508110611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf290612aaa565b60405180910390fd5b600060078381548110611d1157611d10612aca565b5b9060005260206000209060040201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d809190612841565b602060405180830381865afa158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc19190612b0e565b905060008103611dd2575050611e34565b60006009548360010154611de4610730565b611dee9190612caa565b611df89190612d33565b90508164e8d4a5100082611e0c9190612caa565b611e169190612d33565b836002016000828254611e299190612b6a565b925050819055505050505b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f0461191b565b6001600260006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f4861230d565b604051611f559190612841565b60405180910390a1565b611fe08363a9059cbb60e01b8484604051602401611f7e929190613110565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612315565b505050565b6000806000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120489190612841565b602060405180830381865afa158015612065573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120899190612b0e565b90506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120e89190612841565b602060405180830381865afa158015612105573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121299190612b0e565b905081871115612188576121808883600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f5f9092919063ffffffff16565b8193506121d9565b6121d58888600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f5f9092919063ffffffff16565b8693505b6207a1208111156122fc576000670de0b6b3a7640000886121fa9190612caa565b905060008360648361220c9190612caa565b6122169190612d33565b90506000606482856122289190612caa565b6122329190612d33565b9050670de0b6b3a7640000816122489190612d33565b9050838111156122a75761229f8b85600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f5f9092919063ffffffff16565b8395506122f8565b6122f48b82600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f5f9092919063ffffffff16565b8095505b5050505b838395509550505050509250929050565b600033905090565b6000612377826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123dc9092919063ffffffff16565b90506000815111156123d75780806020019051810190612397919061314e565b6123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd906134ab565b60405180910390fd5b5b505050565b60606123eb84846000856123f4565b90509392505050565b606082471015612439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124309061353d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161246291906135ce565b60006040518083038185875af1925050503d806000811461249f576040519150601f19603f3d011682016040523d82523d6000602084013e6124a4565b606091505b50915091506124b5878383876124c1565b92505050949350505050565b6060831561252357600083510361251b576124db85612536565b61251a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251190613631565b60405180910390fd5b5b82905061252e565b61252d8383612559565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008251111561256c5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a091906136a6565b60405180910390fd5b6000819050919050565b6125bc816125a9565b82525050565b60006020820190506125d760008301846125b3565b92915050565b600080fd5b6125eb816125a9565b81146125f657600080fd5b50565b600081359050612608816125e2565b92915050565b600060208284031215612624576126236125dd565b5b6000612632848285016125f9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061268061267b6126768461263b565b61265b565b61263b565b9050919050565b600061269282612665565b9050919050565b60006126a482612687565b9050919050565b6126b481612699565b82525050565b60006080820190506126cf60008301876126ab565b6126dc60208301866125b3565b6126e960408301856125b3565b6126f660608301846125b3565b95945050505050565b60008115159050919050565b612714816126ff565b811461271f57600080fd5b50565b6000813590506127318161270b565b92915050565b6000806000606084860312156127505761274f6125dd565b5b600061275e868287016125f9565b935050602061276f868287016125f9565b925050604061278086828701612722565b9150509250925092565b60006127958261263b565b9050919050565b6127a58161278a565b81146127b057600080fd5b50565b6000813590506127c28161279c565b92915050565b600080604083850312156127df576127de6125dd565b5b60006127ed858286016125f9565b92505060206127fe858286016127b3565b9150509250929050565b612811816126ff565b82525050565b600060208201905061282c6000830184612808565b92915050565b61283b8161278a565b82525050565b60006020820190506128566000830184612832565b92915050565b600060208284031215612872576128716125dd565b5b6000612880848285016127b3565b91505092915050565b600080604083850312156128a05761289f6125dd565b5b60006128ae858286016125f9565b92505060206128bf858286016125f9565b9150509250929050565b60006128d48261278a565b9050919050565b6128e4816128c9565b81146128ef57600080fd5b50565b600081359050612901816128db565b92915050565b6000806000606084860312156129205761291f6125dd565b5b600061292e868287016125f9565b935050602061293f868287016128f2565b925050604061295086828701612722565b9150509250925092565b60008060408385031215612971576129706125dd565b5b600061297f858286016128f2565b9250506020612990858286016125f9565b9150509250929050565b60006060820190506129af60008301866125b3565b6129bc60208301856125b3565b6129c960408301846125b3565b949350505050565b60006129dc82612687565b9050919050565b6129ec816129d1565b82525050565b6000602082019050612a0760008301846129e3565b92915050565b60008060408385031215612a2457612a236125dd565b5b6000612a32858286016127b3565b9250506020612a43858286016125f9565b9150509250929050565b600082825260208201905092915050565b7f506f6f6c20646f6573206e6f7420657869737400000000000000000000000000600082015250565b6000612a94601383612a4d565b9150612a9f82612a5e565b602082019050919050565b60006020820190508181036000830152612ac381612a87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612b08816125e2565b92915050565b600060208284031215612b2457612b236125dd565b5b6000612b3284828501612af9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b75826125a9565b9150612b80836125a9565b9250828201905080821115612b9857612b97612b3b565b5b92915050565b6000612ba9826125a9565b9150612bb4836125a9565b9250828203905081811115612bcc57612bcb612b3b565b5b92915050565b7f616d6f756e742073686f756c6420626520706f73697469766500000000000000600082015250565b6000612c08601983612a4d565b9150612c1382612bd2565b602082019050919050565b60006020820190508181036000830152612c3781612bfb565b9050919050565b7f496e76616c696420616464726573732100000000000000000000000000000000600082015250565b6000612c74601083612a4d565b9150612c7f82612c3e565b602082019050919050565b60006020820190508181036000830152612ca381612c67565b9050919050565b6000612cb5826125a9565b9150612cc0836125a9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612cf957612cf8612b3b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612d3e826125a9565b9150612d49836125a9565b925082612d5957612d58612d04565b5b828204905092915050565b6000612d6f826125a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612da157612da0612b3b565b5b600182019050919050565b6000604082019050612dc160008301856125b3565b612dce60208301846125b3565b9392505050565b7f5468657265277320616c7265616479206120706f6f6c2077697468207468617460008201527f204c5020746f6b656e2100000000000000000000000000000000000000000000602082015250565b6000612e31602a83612a4d565b9150612e3c82612dd5565b604082019050919050565b60006020820190508181036000830152612e6081612e24565b9050919050565b7f5374616b696e6720746f6b656e2073686f756c6420626520646966666572656e60008201527f742066726f6d2072657761726420746f6b656e00000000000000000000000000602082015250565b6000612ec3603383612a4d565b9150612ece82612e67565b604082019050919050565b60006020820190508181036000830152612ef281612eb6565b9050919050565b7f496e76616c6964206c7000000000000000000000000000000000000000000000600082015250565b6000612f2f600a83612a4d565b9150612f3a82612ef9565b602082019050919050565b60006020820190508181036000830152612f5e81612f22565b9050919050565b6000608082019050612f7a60008301876125b3565b612f8760208301866125b3565b612f9460408301856125b3565b612fa16060830184612832565b95945050505050565b7f77697468647261773a2073686f756c64207769746864726177206c657373207460008201527f68616e2062616c616e6365000000000000000000000000000000000000000000602082015250565b6000613006602b83612a4d565b915061301182612faa565b604082019050919050565b6000602082019050818103600083015261303581612ff9565b9050919050565b7f77697468647261773a20616d6f756e742073686f756c6420626520706f73697460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000613098602383612a4d565b91506130a38261303c565b604082019050919050565b600060208201905081810360008301526130c78161308b565b9050919050565b6000815190506130dd8161279c565b92915050565b6000602082840312156130f9576130f86125dd565b5b6000613107848285016130ce565b91505092915050565b60006040820190506131256000830185612832565b61313260208301846125b3565b9392505050565b6000815190506131488161270b565b92915050565b600060208284031215613164576131636125dd565b5b600061317284828501613139565b91505092915050565b60006080820190506131906000830187612832565b61319d6020830186612832565b6131aa60408301856125b3565b6131b760608301846125b3565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061321c602683612a4d565b9150613227826131c0565b604082019050919050565b6000602082019050818103600083015261324b8161320f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613288601f83612a4d565b915061329382613252565b602082019050919050565b600060208201905081810360008301526132b78161327b565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006132f4601083612a4d565b91506132ff826132be565b602082019050919050565b60006020820190508181036000830152613323816132e7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613360602083612a4d565b915061336b8261332a565b602082019050919050565b6000602082019050818103600083015261338f81613353565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006133cc601483612a4d565b91506133d782613396565b602082019050919050565b600060208201905081810360008301526133fb816133bf565b9050919050565b60006060820190506134176000830186612832565b6134246020830185612832565b61343160408301846125b3565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613495602a83612a4d565b91506134a082613439565b604082019050919050565b600060208201905081810360008301526134c481613488565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613527602683612a4d565b9150613532826134cb565b604082019050919050565b600060208201905081810360008301526135568161351a565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015613591578082015181840152602081019050613576565b60008484015250505050565b60006135a88261355d565b6135b28185613568565b93506135c2818560208601613573565b80840191505092915050565b60006135da828461359d565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061361b601d83612a4d565b9150613626826135e5565b602082019050919050565b6000602082019050818103600083015261364a8161360e565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b600061367882613651565b6136828185612a4d565b9350613692818560208601613573565b61369b8161365c565b840191505092915050565b600060208201905081810360008301526136c0818461366d565b90509291505056fea2646970667358221220ef5905100027bcbce5ab002d3484a417f982450de7647c9057f37e7d3fb0f3f764736f6c634300081000330000000000000000000000005a2d899704f690e851f8ce2669ee10a909677a75
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063715018a611610104578063c45a0155116100a2578063e9c002dc11610071578063e9c002dc146104d8578063efca2eed146104f4578063f2fde38b14610512578063fc0c546a1461052e576101da565b8063c45a015514610450578063d02bf22f1461046e578063e02c499d1461049e578063e33b7de3146104ba576101da565b80638456cb59116100de5780638456cb59146103da57806387a35382146103e45780638da5cb5b1461040057806393f1a40b1461041e576101da565b8063715018a614610398578063795af039146103a25780637abceffd146103be576101da565b806342868c281161017c5780635c975abb1161014b5780635c975abb146103365780635f64b55b14610354578063630b5ba1146103725780636f7ece131461037c576101da565b806342868c28146102b057806343a0d066146102ce57806346ca6bea146102ea57806348e43af414610306576101da565b806317caf6f1116101b857806317caf6f11461024e578063291c3f791461026c578063379607f51461028a5780633f4ba83a146102a6576101da565b8063081e3eda146101df5780631036bbe2146101fd5780631526fe271461021b575b600080fd5b6101e761054c565b6040516101f491906125c2565b60405180910390f35b610205610559565b60405161021291906125c2565b60405180910390f35b6102356004803603810190610230919061260e565b610565565b60405161024594939291906126ba565b60405180910390f35b6102566105c5565b60405161026391906125c2565b60405180910390f35b6102746105cb565b60405161028191906125c2565b60405180910390f35b6102a4600480360381019061029f919061260e565b6105d4565b005b6102ae6106ea565b005b6102b8610730565b6040516102c591906125c2565b60405180910390f35b6102e860048036038101906102e39190612737565b6107ed565b005b61030460048036038101906102ff9190612737565b610a0a565b005b610320600480360381019061031b91906127c8565b610add565b60405161032d91906125c2565b60405180910390f35b61033e610d4f565b60405161034b9190612817565b60405180910390f35b61035c610d66565b6040516103699190612841565b60405180910390f35b61037a610d8c565b005b6103966004803603810190610391919061285c565b610ddf565b005b6103a0610e2b565b005b6103bc60048036038101906103b79190612889565b610e3f565b005b6103d860048036038101906103d39190612907565b610ef7565b005b6103e2611231565b005b6103fe60048036038101906103f9919061295a565b611277565b005b6104086112ae565b6040516104159190612841565b60405180910390f35b610438600480360381019061043391906127c8565b6112d7565b6040516104479392919061299a565b60405180910390f35b61045861130e565b60405161046591906129f2565b60405180910390f35b61048860048036038101906104839190612a0d565b611334565b60405161049591906125c2565b60405180910390f35b6104b860048036038101906104b39190612737565b6113db565b005b6104c26117cb565b6040516104cf91906125c2565b60405180910390f35b6104f260048036038101906104ed919061285c565b6117d1565b005b6104fc61181d565b60405161050991906125c2565b60405180910390f35b61052c6004803603810190610527919061285c565b611823565b005b6105366118a6565b6040516105439190612841565b60405180910390f35b6000600780549050905090565b670de0b6b3a764000081565b6007818154811061057557600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60095481565b64e8d4a5100081565b6105dc6118cc565b806007805490508110610624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061b90612aaa565b60405180910390fd5b61062c61191b565b60006007838154811061064257610641612aca565b5b9060005260206000209060040201905060006008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506106ae610d8c565b6106b88433611965565b6106c28185611a34565b6106d481600001548360020154611ad1565b81600101819055505050506106e7611af7565b50565b6106f2611b00565b6106fa611b7e565b610702611bc7565b7f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600554600654600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107939190612841565b602060405180830381865afa1580156107b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d49190612b0e565b6107de9190612b6a565b6107e89190612b9e565b905090565b826007805490508110610835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082c90612aaa565b60405180910390fd5b61083d61191b565b6108456118cc565b60008311610888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087f90612c1e565b60405180910390fd5b610890610d8c565b61089a8433611965565b6000600785815481106108b0576108af612aca565b5b9060005260206000209060040201905060006008600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508315610925576109248187611a34565b5b6109763330878560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c2a909392919063ffffffff16565b8481600001600082825461098a9190612b6a565b925050819055506109a381600001548360020154611ad1565b8160010181905550853373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15876040516109f291906125c2565b60405180910390a35050610a04611af7565b50505050565b610a12611b00565b826007805490508110610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190612aaa565b60405180910390fd5b8115610a6957610a68610d8c565b5b8260078581548110610a7e57610a7d612aca565b5b906000526020600020906004020160010154600954610a9d9190612b9e565b610aa79190612b6a565b6009819055508260078581548110610ac257610ac1612aca565b5b90600052602060002090600402016001018190555050505050565b6000826007805490508110610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90612aaa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d90612c8a565b60405180910390fd5b600060078581548110610bac57610bab612aca565b5b9060005260206000209060040201905060006008600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260020154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c789190612841565b602060405180830381865afa158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb99190612b0e565b905060008114610d165760006009548560010154610cd5610730565b610cdf9190612caa565b610ce99190612d33565b90508164e8d4a5100082610cfd9190612caa565b610d079190612d33565b83610d129190612b6a565b9250505b82600201548360010154610d2e856000015485611ad1565b610d389190612b9e565b610d429190612b6a565b9550505050505092915050565b6000600260009054906101000a900460ff16905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600780549050905060005b81811015610dbb57610daa81611cb3565b80610db490612d64565b9050610d99565b50610dc4610730565b60056000828254610dd59190612b6a565b9250508190555050565b610de7611b00565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e33611b00565b610e3d6000611e38565b565b610e47611b00565b816007805490508110610e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8690612aaa565b60405180910390fd5b8160078481548110610ea457610ea3612aca565b5b9060005260206000209060040201600301819055507f4bd832da909427f335ae5fa586bb7b1f69cdd865999e5d9b85f4c9a1aafecce38383604051610eea929190612dac565b60405180910390a1505050565b610eff611b00565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8390612e47565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390612ed9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361108b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108290612f45565b60405180910390fd5b801561109a57611099610d8c565b5b82600960008282546110ac9190612b6a565b925050819055506000621275009050600760405180608001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018681526020016000815260200183815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550506001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6b62e2a4361b4ec557bae6ad4ec355efa8c881160803373408ccdb4c918473db60016007805490506112109190612b9e565b8583866040516112239493929190612f65565b60405180910390a150505050565b611239611b00565b61124161191b565b611249611efc565b7f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b61127f611b00565b6112aa33828473ffffffffffffffffffffffffffffffffffffffff16611f5f9092919063ffffffff16565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6008602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081600780549050811061137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137590612aaa565b60405180910390fd5b6008600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015491505092915050565b6113e36118cc565b82600780549050811061142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142290612aaa565b60405180910390fd5b61143361191b565b61143b610d8c565b6114458433611965565b60006007858154811061145b5761145a612aca565b5b9060005260206000209060040201905060006008600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508481600001541015611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd9061301c565b60405180910390fd5b60008511611549576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611540906130ae565b60405180910390fd5b831561155a576115598187611a34565b5b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a80bf3e66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed91906130e3565b90508260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b382886040518363ffffffff1660e01b815260040161164e929190613110565b6020604051808303816000875af115801561166d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611691919061314e565b508073ffffffffffffffffffffffffffffffffffffffff1663e4ddc77c8460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633898760030154426116e59190612b6a565b6040518563ffffffff1660e01b8152600401611704949392919061317b565b600060405180830381600087803b15801561171e57600080fd5b505af1158015611732573d6000803e3d6000fd5b505050508582600001600082825461174a9190612b9e565b9250508190555061176382600001548460020154611ad1565b8260010181905550863373ffffffffffffffffffffffffffffffffffffffff167febeaa8785285a4f7c37a305351997dceebabc3c357dab98023dc37514a1b6ed6886040516117b291906125c2565b60405180910390a3505050506117c6611af7565b505050565b60065481565b6117d9611b00565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60055481565b61182b611b00565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189190613232565b60405180910390fd5b6118a381611e38565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260015403611911576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119089061329e565b60405180910390fd5b6002600181905550565b611923610d4f565b15611963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195a9061330a565b60405180910390fd5b565b60006007838154811061197b5761197a612aca565b5b9060005260206000209060040201905060006008600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154036119f2575050611a30565b8060010154611a0982600001548460020154611ad1565b611a139190612b9e565b816002016000828254611a269190612b6a565b9250508190555050505b5050565b600080611a45338560020154611fe5565b91509150823373ffffffffffffffffffffffffffffffffffffffff167f45c072aa05b9853b5a993de7a28bc332ee01404a628cec1a23ce0f659f842ef18484604051611a92929190612dac565b60405180910390a3818460020154611aaa9190612b9e565b84600201819055508160066000828254611ac49190612b6a565b9250508190555050505050565b600064e8d4a510008284611ae59190612caa565b611aef9190612d33565b905092915050565b60018081905550565b611b0861230d565b73ffffffffffffffffffffffffffffffffffffffff16611b266112ae565b73ffffffffffffffffffffffffffffffffffffffff1614611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7390613376565b60405180910390fd5b565b611b86610d4f565b611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc906133e2565b60405180910390fd5b565b611bcf611b7e565b6000600260006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c1361230d565b604051611c209190612841565b60405180910390a1565b611cad846323b872dd60e01b858585604051602401611c4b93929190613402565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612315565b50505050565b806007805490508110611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf290612aaa565b60405180910390fd5b600060078381548110611d1157611d10612aca565b5b9060005260206000209060040201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d809190612841565b602060405180830381865afa158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc19190612b0e565b905060008103611dd2575050611e34565b60006009548360010154611de4610730565b611dee9190612caa565b611df89190612d33565b90508164e8d4a5100082611e0c9190612caa565b611e169190612d33565b836002016000828254611e299190612b6a565b925050819055505050505b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f0461191b565b6001600260006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f4861230d565b604051611f559190612841565b60405180910390a1565b611fe08363a9059cbb60e01b8484604051602401611f7e929190613110565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612315565b505050565b6000806000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120489190612841565b602060405180830381865afa158015612065573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120899190612b0e565b90506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120e89190612841565b602060405180830381865afa158015612105573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121299190612b0e565b905081871115612188576121808883600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f5f9092919063ffffffff16565b8193506121d9565b6121d58888600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f5f9092919063ffffffff16565b8693505b6207a1208111156122fc576000670de0b6b3a7640000886121fa9190612caa565b905060008360648361220c9190612caa565b6122169190612d33565b90506000606482856122289190612caa565b6122329190612d33565b9050670de0b6b3a7640000816122489190612d33565b9050838111156122a75761229f8b85600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f5f9092919063ffffffff16565b8395506122f8565b6122f48b82600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f5f9092919063ffffffff16565b8095505b5050505b838395509550505050509250929050565b600033905090565b6000612377826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123dc9092919063ffffffff16565b90506000815111156123d75780806020019051810190612397919061314e565b6123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd906134ab565b60405180910390fd5b5b505050565b60606123eb84846000856123f4565b90509392505050565b606082471015612439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124309061353d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161246291906135ce565b60006040518083038185875af1925050503d806000811461249f576040519150601f19603f3d011682016040523d82523d6000602084013e6124a4565b606091505b50915091506124b5878383876124c1565b92505050949350505050565b6060831561252357600083510361251b576124db85612536565b61251a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251190613631565b60405180910390fd5b5b82905061252e565b61252d8383612559565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008251111561256c5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a091906136a6565b60405180910390fd5b6000819050919050565b6125bc816125a9565b82525050565b60006020820190506125d760008301846125b3565b92915050565b600080fd5b6125eb816125a9565b81146125f657600080fd5b50565b600081359050612608816125e2565b92915050565b600060208284031215612624576126236125dd565b5b6000612632848285016125f9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061268061267b6126768461263b565b61265b565b61263b565b9050919050565b600061269282612665565b9050919050565b60006126a482612687565b9050919050565b6126b481612699565b82525050565b60006080820190506126cf60008301876126ab565b6126dc60208301866125b3565b6126e960408301856125b3565b6126f660608301846125b3565b95945050505050565b60008115159050919050565b612714816126ff565b811461271f57600080fd5b50565b6000813590506127318161270b565b92915050565b6000806000606084860312156127505761274f6125dd565b5b600061275e868287016125f9565b935050602061276f868287016125f9565b925050604061278086828701612722565b9150509250925092565b60006127958261263b565b9050919050565b6127a58161278a565b81146127b057600080fd5b50565b6000813590506127c28161279c565b92915050565b600080604083850312156127df576127de6125dd565b5b60006127ed858286016125f9565b92505060206127fe858286016127b3565b9150509250929050565b612811816126ff565b82525050565b600060208201905061282c6000830184612808565b92915050565b61283b8161278a565b82525050565b60006020820190506128566000830184612832565b92915050565b600060208284031215612872576128716125dd565b5b6000612880848285016127b3565b91505092915050565b600080604083850312156128a05761289f6125dd565b5b60006128ae858286016125f9565b92505060206128bf858286016125f9565b9150509250929050565b60006128d48261278a565b9050919050565b6128e4816128c9565b81146128ef57600080fd5b50565b600081359050612901816128db565b92915050565b6000806000606084860312156129205761291f6125dd565b5b600061292e868287016125f9565b935050602061293f868287016128f2565b925050604061295086828701612722565b9150509250925092565b60008060408385031215612971576129706125dd565b5b600061297f858286016128f2565b9250506020612990858286016125f9565b9150509250929050565b60006060820190506129af60008301866125b3565b6129bc60208301856125b3565b6129c960408301846125b3565b949350505050565b60006129dc82612687565b9050919050565b6129ec816129d1565b82525050565b6000602082019050612a0760008301846129e3565b92915050565b60008060408385031215612a2457612a236125dd565b5b6000612a32858286016127b3565b9250506020612a43858286016125f9565b9150509250929050565b600082825260208201905092915050565b7f506f6f6c20646f6573206e6f7420657869737400000000000000000000000000600082015250565b6000612a94601383612a4d565b9150612a9f82612a5e565b602082019050919050565b60006020820190508181036000830152612ac381612a87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612b08816125e2565b92915050565b600060208284031215612b2457612b236125dd565b5b6000612b3284828501612af9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b75826125a9565b9150612b80836125a9565b9250828201905080821115612b9857612b97612b3b565b5b92915050565b6000612ba9826125a9565b9150612bb4836125a9565b9250828203905081811115612bcc57612bcb612b3b565b5b92915050565b7f616d6f756e742073686f756c6420626520706f73697469766500000000000000600082015250565b6000612c08601983612a4d565b9150612c1382612bd2565b602082019050919050565b60006020820190508181036000830152612c3781612bfb565b9050919050565b7f496e76616c696420616464726573732100000000000000000000000000000000600082015250565b6000612c74601083612a4d565b9150612c7f82612c3e565b602082019050919050565b60006020820190508181036000830152612ca381612c67565b9050919050565b6000612cb5826125a9565b9150612cc0836125a9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612cf957612cf8612b3b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612d3e826125a9565b9150612d49836125a9565b925082612d5957612d58612d04565b5b828204905092915050565b6000612d6f826125a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612da157612da0612b3b565b5b600182019050919050565b6000604082019050612dc160008301856125b3565b612dce60208301846125b3565b9392505050565b7f5468657265277320616c7265616479206120706f6f6c2077697468207468617460008201527f204c5020746f6b656e2100000000000000000000000000000000000000000000602082015250565b6000612e31602a83612a4d565b9150612e3c82612dd5565b604082019050919050565b60006020820190508181036000830152612e6081612e24565b9050919050565b7f5374616b696e6720746f6b656e2073686f756c6420626520646966666572656e60008201527f742066726f6d2072657761726420746f6b656e00000000000000000000000000602082015250565b6000612ec3603383612a4d565b9150612ece82612e67565b604082019050919050565b60006020820190508181036000830152612ef281612eb6565b9050919050565b7f496e76616c6964206c7000000000000000000000000000000000000000000000600082015250565b6000612f2f600a83612a4d565b9150612f3a82612ef9565b602082019050919050565b60006020820190508181036000830152612f5e81612f22565b9050919050565b6000608082019050612f7a60008301876125b3565b612f8760208301866125b3565b612f9460408301856125b3565b612fa16060830184612832565b95945050505050565b7f77697468647261773a2073686f756c64207769746864726177206c657373207460008201527f68616e2062616c616e6365000000000000000000000000000000000000000000602082015250565b6000613006602b83612a4d565b915061301182612faa565b604082019050919050565b6000602082019050818103600083015261303581612ff9565b9050919050565b7f77697468647261773a20616d6f756e742073686f756c6420626520706f73697460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000613098602383612a4d565b91506130a38261303c565b604082019050919050565b600060208201905081810360008301526130c78161308b565b9050919050565b6000815190506130dd8161279c565b92915050565b6000602082840312156130f9576130f86125dd565b5b6000613107848285016130ce565b91505092915050565b60006040820190506131256000830185612832565b61313260208301846125b3565b9392505050565b6000815190506131488161270b565b92915050565b600060208284031215613164576131636125dd565b5b600061317284828501613139565b91505092915050565b60006080820190506131906000830187612832565b61319d6020830186612832565b6131aa60408301856125b3565b6131b760608301846125b3565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061321c602683612a4d565b9150613227826131c0565b604082019050919050565b6000602082019050818103600083015261324b8161320f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613288601f83612a4d565b915061329382613252565b602082019050919050565b600060208201905081810360008301526132b78161327b565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006132f4601083612a4d565b91506132ff826132be565b602082019050919050565b60006020820190508181036000830152613323816132e7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613360602083612a4d565b915061336b8261332a565b602082019050919050565b6000602082019050818103600083015261338f81613353565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006133cc601483612a4d565b91506133d782613396565b602082019050919050565b600060208201905081810360008301526133fb816133bf565b9050919050565b60006060820190506134176000830186612832565b6134246020830185612832565b61343160408301846125b3565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613495602a83612a4d565b91506134a082613439565b604082019050919050565b600060208201905081810360008301526134c481613488565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613527602683612a4d565b9150613532826134cb565b604082019050919050565b600060208201905081810360008301526135568161351a565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015613591578082015181840152602081019050613576565b60008484015250505050565b60006135a88261355d565b6135b28185613568565b93506135c2818560208601613573565b80840191505092915050565b60006135da828461359d565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061361b601d83612a4d565b9150613626826135e5565b602082019050919050565b6000602082019050818103600083015261364a8161360e565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b600061367882613651565b6136828185612a4d565b9350613692818560208601613573565b61369b8161365c565b840191505092915050565b600060208201905081810360008301526136c0818461366d565b90509291505056fea2646970667358221220ef5905100027bcbce5ab002d3484a417f982450de7647c9057f37e7d3fb0f3f764736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005a2d899704f690e851f8ce2669ee10a909677a75
-----Decoded View---------------
Arg [0] : _factory (address): 0x5A2D899704F690E851F8ce2669eE10A909677A75
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005a2d899704f690e851f8ce2669ee10a909677a75
Deployed ByteCode Sourcemap
29050:11559:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31208:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29787:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29921:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;30025:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30103:47;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36427:470;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40503:103;;;:::i;:::-;;31400:255;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34078:826;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39803:364;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31900:893;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5547:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29759:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32858:244;;;:::i;:::-;;31007:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8412:103;;;:::i;:::-;;38513:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38761:1034;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40285:100;;;:::i;:::-;;38371:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7764:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29954:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;29695:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38141:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34912:1155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29884:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31107:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29846:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8670:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29732:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31208:95;31253:7;31280:8;:15;;;;31273:22;;31208:95;:::o;29787:50::-;29825:12;29787:50;:::o;29921:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30025:34::-;;;;:::o;30103:47::-;30146:4;30103:47;:::o;36427:470::-;2380:21;:19;:21::i;:::-;36494:4:::1;30784:8;:15;;;;30777:4;:22;30769:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;5152:19:::2;:17;:19::i;:::-;36525:21:::3;36549:8;36558:4;36549:14;;;;;;;;:::i;:::-;;;;;;;;;;;;36525:38;;36574:21;36598:8;:14;36607:4;36598:14;;;;;;;;;;;:26;36613:10;36598:26;;;;;;;;;;;;;;;36574:50;;36635:17;:15;:17::i;:::-;36663:43;36689:4;36695:10;36663:25;:43::i;:::-;36717:25;36731:4;36737;36717:13;:25::i;:::-;36834:55;36854:4;:11;;;36867:4;:21;;;36834:19;:55::i;:::-;36816:4;:15;;:73;;;;36514:383;;2412:1:::1;2424:20:::0;:18;:20::i;:::-;36427:470;:::o;40503:103::-;7650:13;:11;:13::i;:::-;5411:16:::1;:14;:16::i;:::-;40563:10:::2;:8;:10::i;:::-;40589:9;;;;;;;;;;40503:103::o:0;31400:255::-;31461:7;31631:16;;31615:13;;31581:5;;;;;;;;;;;31574:23;;;31606:4;31574:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;:73;;;;:::i;:::-;31567:80;;31400:255;:::o;34078:826::-;34208:4;30784:8;:15;;;;30777:4;:22;30769:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;5152:19:::1;:17;:19::i;:::-;2380:21:::2;:19;:21::i;:::-;34270:1:::3;34260:7;:11;34252:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;34314:17;:15;:17::i;:::-;34342:43;34368:4;34374:10;34342:25;:43::i;:::-;34398:21;34422:8;34431:4;34422:14;;;;;;;;:::i;:::-;;;;;;;;;;;;34398:38;;34447:21;34471:8;:14;34480:4;34471:14;;;;;;;;;;;:26;34486:10;34471:26;;;;;;;;;;;;;;;34447:50;;34512:16;34508:74;;;34545:25;34559:4;34565;34545:13;:25::i;:::-;34508:74;34592;34630:10;34651:4;34658:7;34592:4;:12;;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;34692:7;34677:4;:11;;;:22;;;;;;;:::i;:::-;;;;;;;;34791:55;34811:4;:11;;;34824:4;:21;;;34791:19;:55::i;:::-;34773:4;:15;;:73;;;;34882:4;34870:10;34862:34;;;34888:7;34862:34;;;;;;:::i;:::-;;;;;;;;34241:663;;2424:20:::2;:18;:20::i;:::-;34078:826:::0;;;;:::o;39803:364::-;7650:13;:11;:13::i;:::-;39942:4:::1;30784:8;:15;;;;30777:4;:22;30769:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;39963:11:::2;39959:61;;;39991:17;:15;:17::i;:::-;39959:61;40097:11;40067:8;40076:4;40067:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;;40048:15;;:45;;;;:::i;:::-;:61;;;;:::i;:::-;40030:15;:79;;;;40148:11;40120:8;40129:4;40120:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;:39;;;;7674:1:::1;39803:364:::0;;;:::o;31900:893::-;31998:7;31983:4;30784:8;:15;;;;30777:4;:22;30769:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;32043:1:::1;32026:19;;:5;:19;;::::0;32018:48:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;32079:21;32103:8;32112:4;32103:14;;;;;;;;:::i;:::-;;;;;;;;;;;;32079:38;;32128:21;32152:8;:14;32161:4;32152:14;;;;;;;;;;;:21;32167:5;32152:21;;;;;;;;;;;;;;;32128:45;;32184:24;32211:4;:21;;;32184:48;;32243:16;32262:4;:12;;;;;;;;;;;;:22;;;32293:4;32262:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32243:56;;32326:1;32314:8;:13;32310:222;;32344:19;32422:15;;32401:4;:15;;;32367:30;:28;:30::i;:::-;:50;;;;:::i;:::-;32366:72;;;;:::i;:::-;32344:94;;32511:8;30146:4;32474:11;:32;;;;:::i;:::-;32473:47;;;;:::i;:::-;32453:67;;;;;:::i;:::-;;;32329:203;32310:222;32766:4;:19;;;32748:4;:15;;;32695:50;32715:4;:11;;;32728:16;32695:19;:50::i;:::-;:68;;;;:::i;:::-;:90;;;;:::i;:::-;32688:97;;;;;;31900:893:::0;;;;;:::o;5547:86::-;5594:4;5618:7;;;;;;;;;;;5611:14;;5547:86;:::o;29759:21::-;;;;;;;;;;;;;:::o;32858:244::-;32903:14;32920:8;:15;;;;32903:32;;32951:11;32946:86;32974:6;32968:3;:12;32946:86;;;33004:16;33016:3;33004:11;:16::i;:::-;32982:5;;;;:::i;:::-;;;32946:86;;;;33064:30;:28;:30::i;:::-;33044:16;;:50;;;;;;;:::i;:::-;;;;;;;;32892:210;32858:244::o;31007:92::-;7650:13;:11;:13::i;:::-;31085:6:::1;31077:5;;:14;;;;;;;;;;;;;;;;;;31007:92:::0;:::o;8412:103::-;7650:13;:11;:13::i;:::-;8477:30:::1;8504:1;8477:18;:30::i;:::-;8412:103::o:0;38513:240::-;7650:13;:11;:13::i;:::-;38617:4:::1;30784:8;:15;;;;30777:4;:22;30769:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;38666:15:::2;38634:8;38643:4;38634:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;:47;;;;38699:46;38723:4;38729:15;38699:46;;;;;;;:::i;:::-;;;;;;;;7674:1:::1;38513:240:::0;;:::o;38761:1034::-;7650:13;:11;:13::i;:::-;38905::::1;:32;38927:8;38905:32;;;;;;;;;;;;;;;;;;;;;;;;;38904:33;38896:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;39118:5;;;;;;;;;;;39097:26;;39105:8;39097:26;;::::0;39089:90:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;39227:1;39198:31;;39206:8;39198:31;;::::0;39190:54:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;39259:11;39255:61;;;39287:17;:15;:17::i;:::-;39255:61;39345:11;39326:15;;:30;;;;;;;:::i;:::-;;;;;;;;39367:22;39392:7;39367:32;;39410:8;39438:190;;;;;;;;39475:8;39438:190;;;;;;39514:11;39438:190;;;;39562:1;39438:190;;;;39598:14;39438:190;;::::0;39410:229:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39687:4;39652:13;:32;39674:8;39652:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;39709:78;39737:1;39719:8;:15;;;;:19;;;;:::i;:::-;39740:11;39753:14;39777:8;39709:78;;;;;;;;;:::i;:::-;;;;;;;;38885:910;38761:1034:::0;;;:::o;40285:100::-;7650:13;:11;:13::i;:::-;5152:19:::1;:17;:19::i;:::-;40346:8:::2;:6;:8::i;:::-;40370:7;;;;;;;;;;40285:100::o:0;38371:134::-;7650:13;:11;:13::i;:::-;38458:39:::1;38478:10;38490:6;38458;:19;;;;:39;;;;;:::i;:::-;38371:134:::0;;:::o;7764:87::-;7810:7;7837:6;;;;;;;;;;;7830:13;;7764:87;:::o;29954:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29695:30::-;;;;;;;;;;;;;:::o;38141:222::-;38296:7;38272:4;30784:8;:15;;;;30777:4;:22;30769:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;38328:8:::1;:14;38337:4;38328:14;;;;;;;;;;;:20;38343:4;38328:20;;;;;;;;;;;;;;;:27;;;38321:34;;38141:222:::0;;;;;:::o;34912:1155::-;2380:21;:19;:21::i;:::-;35063:4:::1;30784:8;:15;;;;30777:4;:22;30769:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;5152:19:::2;:17;:19::i;:::-;35094:17:::3;:15;:17::i;:::-;35122:43;35148:4;35154:10;35122:25;:43::i;:::-;35178:21;35202:8;35211:4;35202:14;;;;;;;;:::i;:::-;;;;;;;;;;;;35178:38;;35227:21;35251:8;:14;35260:4;35251:14;;;;;;;;;;;:26;35266:10;35251:26;;;;;;;;;;;;;;;35227:50;;35311:7;35296:4;:11;;;:22;;35288:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;35395:1;35385:7;:11;35377:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;35451:16;35447:74;;;35484:25;35498:4;35504;35484:13;:25::i;:::-;35447:74;35533:19;35555:7;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35533:43;;35587:4;:12;;;;;;;;;;;;:20;;;35608:11;35621:7;35587:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35653:11;35640:35;;;35698:4;:12;;;;;;;;;;;;35726:10;35751:7;35791:4;:19;;;35773:15;:37;;;;:::i;:::-;35640:181;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;35847:7;35832:4;:11;;;:22;;;;;;;:::i;:::-;;;;;;;;35946:55;35966:4;:11;;;35979:4;:21;;;35946:19;:55::i;:::-;35928:4;:15;;:73;;;;36045:4;36033:10;36017:42;;;36051:7;36017:42;;;;;;:::i;:::-;;;;;;;;35083:984;;;2412:1:::1;2424:20:::0;:18;:20::i;:::-;34912:1155;;;:::o;29884:28::-;;;;:::o;31107:93::-;7650:13;:11;:13::i;:::-;31186:6:::1;31177;;:15;;;;;;;;;;;;;;;;;;31107:93:::0;:::o;29846:31::-;;;;:::o;8670:201::-;7650:13;:11;:13::i;:::-;8779:1:::1;8759:22;;:8;:22;;::::0;8751:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8835:28;8854:8;8835:18;:28::i;:::-;8670:201:::0;:::o;29732:20::-;;;;;;;;;;;;;:::o;2460:293::-;1862:1;2594:7;;:19;2586:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1862:1;2727:7;:18;;;;2460:293::o;5706:108::-;5777:8;:6;:8::i;:::-;5776:9;5768:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;5706:108::o;33712:358::-;33795:21;33819:8;33828:4;33819:14;;;;;;;;:::i;:::-;;;;;;;;;;;;33795:38;;33844:21;33868:8;:14;33877:4;33868:14;;;;;;;;;;;:20;33883:4;33868:20;;;;;;;;;;;;;;;33844:44;;33918:1;33903:4;:11;;;:16;33899:55;;33936:7;;;;33899:55;34047:4;:15;;;33989:55;34009:4;:11;;;34022:4;:21;;;33989:19;:55::i;:::-;:73;;;;:::i;:::-;33966:4;:19;;;:96;;;;;;;:::i;:::-;;;;;;;;33784:286;;33712:358;;;:::o;36075:344::-;36155:17;36174;36195:50;36213:10;36225:4;:19;;;36195:17;:50::i;:::-;36154:91;;;;36281:4;36269:10;36263:45;;;36287:9;36298;36263:45;;;;;;;:::i;:::-;;;;;;;;36363:9;36341:4;:19;;;:31;;;;:::i;:::-;36319:4;:19;;:53;;;;36402:9;36385:13;;:26;;;;;;;:::i;:::-;;;;;;;;36143:276;;36075:344;;:::o;31713:179::-;31808:7;30146:4;31845:17;31836:6;:26;;;;:::i;:::-;31835:49;;;;:::i;:::-;31828:56;;31713:179;;;;:::o;2761:213::-;1818:1;2944:7;:22;;;;2761:213::o;7929:132::-;8004:12;:10;:12::i;:::-;7993:23;;:7;:5;:7::i;:::-;:23;;;7985:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7929:132::o;5891:108::-;5958:8;:6;:8::i;:::-;5950:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;5891:108::o;6402:120::-;5411:16;:14;:16::i;:::-;6471:5:::1;6461:7;;:15;;;;;;;;;;;;;;;;;;6492:22;6501:12;:10;:12::i;:::-;6492:22;;;;;;:::i;:::-;;;;;;;;6402:120::o:0;24834:248::-;24978:96;24998:5;25028:27;;;25057:4;25063:2;25067:5;25005:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24978:19;:96::i;:::-;24834:248;;;;:::o;33169:535::-;33231:4;30784:8;:15;;;;30777:4;:22;30769:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;33248:21:::1;33272:8;33281:4;33272:14;;;;;;;;:::i;:::-;;;;;;;;;;;;33248:38;;33299:16;33318:4;:12;;;;;;;;;;;;:22;;;33349:4;33318:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33299:56;;33382:1;33370:8;:13:::0;33366:52:::1;;33400:7;;;;33366:52;33430:19;33505:15;;33486:4;:15;;;33453:30;:28;:30::i;:::-;:48;;;;:::i;:::-;33452:68;;;;:::i;:::-;33430:90;;33687:8;30146:4;33650:11;:32;;;;:::i;:::-;33649:47;;;;:::i;:::-;33624:4;:21;;;:72;;;;;;;:::i;:::-;;;;;;;;33237:467;;;30834:1;33169:535:::0;;:::o;9031:191::-;9105:16;9124:6;;;;;;;;;;;9105:25;;9150:8;9141:6;;:17;;;;;;;;;;;;;;;;;;9205:8;9174:40;;9195:8;9174:40;;;;;;;;;;;;9094:128;9031:191;:::o;6143:118::-;5152:19;:17;:19::i;:::-;6213:4:::1;6203:7;;:14;;;;;;;;;;;;;;;;;;6233:20;6240:12;:10;:12::i;:::-;6233:20;;;;;;:::i;:::-;;;;;;;;6143:118::o:0;24615:211::-;24732:86;24752:5;24782:23;;;24807:2;24811:5;24759:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24732:19;:86::i;:::-;24615:211;;;:::o;36905:1228::-;36980:7;36989;37009:22;37046;37083:16;37109:5;;;;;;;;;;;37102:23;;;37134:4;37102:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37083:57;;37151:17;37178:6;;;;;;;;;;;37171:24;;;37204:4;37171:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37151:59;;37235:8;37225:7;:18;37221:244;;;37260:41;37287:3;37292:8;37267:5;;;;;;;;;;;37260:26;;;;:41;;;;;:::i;:::-;37333:8;37316:25;;37221:244;;;37374:40;37401:3;37406:7;37381:5;;;;;;;;;;;37374:26;;;;:40;;;;;:::i;:::-;37446:7;37429:24;;37221:244;37492:6;37480:9;:18;37477:593;;;37524:15;29825:12;37542:7;:21;;;;:::i;:::-;37524:39;;37580:15;37616:8;37609:3;37599:7;:13;;;;:::i;:::-;37598:26;;;;:::i;:::-;37580:44;;37639:21;37687:3;37676:7;37664:9;:19;;;;:::i;:::-;37663:27;;;;:::i;:::-;37639:51;;29825:12;37721:13;:27;;;;:::i;:::-;37705:43;;37788:9;37772:13;:25;37768:291;;;37818:43;37846:3;37851:9;37825:6;;;;;;;;;;;37818:27;;;;:43;;;;;:::i;:::-;37897:9;37880:26;;37768:291;;;37947:47;37975:3;37980:13;37954:6;;;;;;;;;;;37947:27;;;;:47;;;;;:::i;:::-;38030:13;38013:30;;37768:291;37509:561;;;37477:593;38090:14;38106;38082:39;;;;;;;;36905:1228;;;;;:::o;3660:98::-;3713:7;3740:10;3733:17;;3660:98;:::o;27682:716::-;28106:23;28132:69;28160:4;28132:69;;;;;;;;;;;;;;;;;28140:5;28132:27;;;;:69;;;;;:::i;:::-;28106:95;;28236:1;28216:10;:17;:21;28212:179;;;28313:10;28302:30;;;;;;;;;;;;:::i;:::-;28294:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;28212:179;27752:646;27682:716;;:::o;13219:229::-;13356:12;13388:52;13410:6;13418:4;13424:1;13427:12;13388:21;:52::i;:::-;13381:59;;13219:229;;;;;:::o;14339:455::-;14509:12;14567:5;14542:21;:30;;14534:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;14627:12;14641:23;14668:6;:11;;14687:5;14694:4;14668:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14626:73;;;;14717:69;14744:6;14752:7;14761:10;14773:12;14717:26;:69::i;:::-;14710:76;;;;14339:455;;;;;;:::o;16912:644::-;17097:12;17126:7;17122:427;;;17175:1;17154:10;:17;:22;17150:290;;17372:18;17383:6;17372:10;:18::i;:::-;17364:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;17150:290;17461:10;17454:17;;;;17122:427;17504:33;17512:10;17524:12;17504:7;:33::i;:::-;16912:644;;;;;;;:::o;10462:326::-;10522:4;10779:1;10757:7;:19;;;:23;10750:30;;10462:326;;;:::o;18098:552::-;18279:1;18259:10;:17;:21;18255:388;;;18491:10;18485:17;18548:15;18535:10;18531:2;18527:19;18520:44;18255:388;18618:12;18611:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:77:1;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;769:122;842:24;860:5;842:24;:::i;:::-;835:5;832:35;822:63;;881:1;878;871:12;822:63;769:122;:::o;897:139::-;943:5;981:6;968:20;959:29;;997:33;1024:5;997:33;:::i;:::-;897:139;;;;:::o;1042:329::-;1101:6;1150:2;1138:9;1129:7;1125:23;1121:32;1118:119;;;1156:79;;:::i;:::-;1118:119;1276:1;1301:53;1346:7;1337:6;1326:9;1322:22;1301:53;:::i;:::-;1291:63;;1247:117;1042:329;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:60::-;1537:3;1558:5;1551:12;;1509:60;;;:::o;1575:142::-;1625:9;1658:53;1676:34;1685:24;1703:5;1685:24;:::i;:::-;1676:34;:::i;:::-;1658:53;:::i;:::-;1645:66;;1575:142;;;:::o;1723:126::-;1773:9;1806:37;1837:5;1806:37;:::i;:::-;1793:50;;1723:126;;;:::o;1855:140::-;1919:9;1952:37;1983:5;1952:37;:::i;:::-;1939:50;;1855:140;;;:::o;2001:159::-;2102:51;2147:5;2102:51;:::i;:::-;2097:3;2090:64;2001:159;;:::o;2166:581::-;2357:4;2395:3;2384:9;2380:19;2372:27;;2409:85;2491:1;2480:9;2476:17;2467:6;2409:85;:::i;:::-;2504:72;2572:2;2561:9;2557:18;2548:6;2504:72;:::i;:::-;2586;2654:2;2643:9;2639:18;2630:6;2586:72;:::i;:::-;2668;2736:2;2725:9;2721:18;2712:6;2668:72;:::i;:::-;2166:581;;;;;;;:::o;2753:90::-;2787:7;2830:5;2823:13;2816:21;2805:32;;2753:90;;;:::o;2849:116::-;2919:21;2934:5;2919:21;:::i;:::-;2912:5;2909:32;2899:60;;2955:1;2952;2945:12;2899:60;2849:116;:::o;2971:133::-;3014:5;3052:6;3039:20;3030:29;;3068:30;3092:5;3068:30;:::i;:::-;2971:133;;;;:::o;3110:613::-;3184:6;3192;3200;3249:2;3237:9;3228:7;3224:23;3220:32;3217:119;;;3255:79;;:::i;:::-;3217:119;3375:1;3400:53;3445:7;3436:6;3425:9;3421:22;3400:53;:::i;:::-;3390:63;;3346:117;3502:2;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3473:118;3630:2;3656:50;3698:7;3689:6;3678:9;3674:22;3656:50;:::i;:::-;3646:60;;3601:115;3110:613;;;;;:::o;3729:96::-;3766:7;3795:24;3813:5;3795:24;:::i;:::-;3784:35;;3729:96;;;:::o;3831:122::-;3904:24;3922:5;3904:24;:::i;:::-;3897:5;3894:35;3884:63;;3943:1;3940;3933:12;3884:63;3831:122;:::o;3959:139::-;4005:5;4043:6;4030:20;4021:29;;4059:33;4086:5;4059:33;:::i;:::-;3959:139;;;;:::o;4104:474::-;4172:6;4180;4229:2;4217:9;4208:7;4204:23;4200:32;4197:119;;;4235:79;;:::i;:::-;4197:119;4355:1;4380:53;4425:7;4416:6;4405:9;4401:22;4380:53;:::i;:::-;4370:63;;4326:117;4482:2;4508:53;4553:7;4544:6;4533:9;4529:22;4508:53;:::i;:::-;4498:63;;4453:118;4104:474;;;;;:::o;4584:109::-;4665:21;4680:5;4665:21;:::i;:::-;4660:3;4653:34;4584:109;;:::o;4699:210::-;4786:4;4824:2;4813:9;4809:18;4801:26;;4837:65;4899:1;4888:9;4884:17;4875:6;4837:65;:::i;:::-;4699:210;;;;:::o;4915:118::-;5002:24;5020:5;5002:24;:::i;:::-;4997:3;4990:37;4915:118;;:::o;5039:222::-;5132:4;5170:2;5159:9;5155:18;5147:26;;5183:71;5251:1;5240:9;5236:17;5227:6;5183:71;:::i;:::-;5039:222;;;;:::o;5267:329::-;5326:6;5375:2;5363:9;5354:7;5350:23;5346:32;5343:119;;;5381:79;;:::i;:::-;5343:119;5501:1;5526:53;5571:7;5562:6;5551:9;5547:22;5526:53;:::i;:::-;5516:63;;5472:117;5267:329;;;;:::o;5602:474::-;5670:6;5678;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:53;5923:7;5914:6;5903:9;5899:22;5878:53;:::i;:::-;5868:63;;5824:117;5980:2;6006:53;6051:7;6042:6;6031:9;6027:22;6006:53;:::i;:::-;5996:63;;5951:118;5602:474;;;;;:::o;6082:110::-;6133:7;6162:24;6180:5;6162:24;:::i;:::-;6151:35;;6082:110;;;:::o;6198:150::-;6285:38;6317:5;6285:38;:::i;:::-;6278:5;6275:49;6265:77;;6338:1;6335;6328:12;6265:77;6198:150;:::o;6354:167::-;6414:5;6452:6;6439:20;6430:29;;6468:47;6509:5;6468:47;:::i;:::-;6354:167;;;;:::o;6527:641::-;6615:6;6623;6631;6680:2;6668:9;6659:7;6655:23;6651:32;6648:119;;;6686:79;;:::i;:::-;6648:119;6806:1;6831:53;6876:7;6867:6;6856:9;6852:22;6831:53;:::i;:::-;6821:63;;6777:117;6933:2;6959:67;7018:7;7009:6;6998:9;6994:22;6959:67;:::i;:::-;6949:77;;6904:132;7075:2;7101:50;7143:7;7134:6;7123:9;7119:22;7101:50;:::i;:::-;7091:60;;7046:115;6527:641;;;;;:::o;7174:502::-;7256:6;7264;7313:2;7301:9;7292:7;7288:23;7284:32;7281:119;;;7319:79;;:::i;:::-;7281:119;7439:1;7464:67;7523:7;7514:6;7503:9;7499:22;7464:67;:::i;:::-;7454:77;;7410:131;7580:2;7606:53;7651:7;7642:6;7631:9;7627:22;7606:53;:::i;:::-;7596:63;;7551:118;7174:502;;;;;:::o;7682:442::-;7831:4;7869:2;7858:9;7854:18;7846:26;;7882:71;7950:1;7939:9;7935:17;7926:6;7882:71;:::i;:::-;7963:72;8031:2;8020:9;8016:18;8007:6;7963:72;:::i;:::-;8045;8113:2;8102:9;8098:18;8089:6;8045:72;:::i;:::-;7682:442;;;;;;:::o;8130:150::-;8204:9;8237:37;8268:5;8237:37;:::i;:::-;8224:50;;8130:150;;;:::o;8286:179::-;8397:61;8452:5;8397:61;:::i;:::-;8392:3;8385:74;8286:179;;:::o;8471:270::-;8588:4;8626:2;8615:9;8611:18;8603:26;;8639:95;8731:1;8720:9;8716:17;8707:6;8639:95;:::i;:::-;8471:270;;;;:::o;8747:474::-;8815:6;8823;8872:2;8860:9;8851:7;8847:23;8843:32;8840:119;;;8878:79;;:::i;:::-;8840:119;8998:1;9023:53;9068:7;9059:6;9048:9;9044:22;9023:53;:::i;:::-;9013:63;;8969:117;9125:2;9151:53;9196:7;9187:6;9176:9;9172:22;9151:53;:::i;:::-;9141:63;;9096:118;8747:474;;;;;:::o;9227:169::-;9311:11;9345:6;9340:3;9333:19;9385:4;9380:3;9376:14;9361:29;;9227:169;;;;:::o;9402:::-;9542:21;9538:1;9530:6;9526:14;9519:45;9402:169;:::o;9577:366::-;9719:3;9740:67;9804:2;9799:3;9740:67;:::i;:::-;9733:74;;9816:93;9905:3;9816:93;:::i;:::-;9934:2;9929:3;9925:12;9918:19;;9577:366;;;:::o;9949:419::-;10115:4;10153:2;10142:9;10138:18;10130:26;;10202:9;10196:4;10192:20;10188:1;10177:9;10173:17;10166:47;10230:131;10356:4;10230:131;:::i;:::-;10222:139;;9949:419;;;:::o;10374:180::-;10422:77;10419:1;10412:88;10519:4;10516:1;10509:15;10543:4;10540:1;10533:15;10560:143;10617:5;10648:6;10642:13;10633:22;;10664:33;10691:5;10664:33;:::i;:::-;10560:143;;;;:::o;10709:351::-;10779:6;10828:2;10816:9;10807:7;10803:23;10799:32;10796:119;;;10834:79;;:::i;:::-;10796:119;10954:1;10979:64;11035:7;11026:6;11015:9;11011:22;10979:64;:::i;:::-;10969:74;;10925:128;10709:351;;;;:::o;11066:180::-;11114:77;11111:1;11104:88;11211:4;11208:1;11201:15;11235:4;11232:1;11225:15;11252:191;11292:3;11311:20;11329:1;11311:20;:::i;:::-;11306:25;;11345:20;11363:1;11345:20;:::i;:::-;11340:25;;11388:1;11385;11381:9;11374:16;;11409:3;11406:1;11403:10;11400:36;;;11416:18;;:::i;:::-;11400:36;11252:191;;;;:::o;11449:194::-;11489:4;11509:20;11527:1;11509:20;:::i;:::-;11504:25;;11543:20;11561:1;11543:20;:::i;:::-;11538:25;;11587:1;11584;11580:9;11572:17;;11611:1;11605:4;11602:11;11599:37;;;11616:18;;:::i;:::-;11599:37;11449:194;;;;:::o;11649:175::-;11789:27;11785:1;11777:6;11773:14;11766:51;11649:175;:::o;11830:366::-;11972:3;11993:67;12057:2;12052:3;11993:67;:::i;:::-;11986:74;;12069:93;12158:3;12069:93;:::i;:::-;12187:2;12182:3;12178:12;12171:19;;11830:366;;;:::o;12202:419::-;12368:4;12406:2;12395:9;12391:18;12383:26;;12455:9;12449:4;12445:20;12441:1;12430:9;12426:17;12419:47;12483:131;12609:4;12483:131;:::i;:::-;12475:139;;12202:419;;;:::o;12627:166::-;12767:18;12763:1;12755:6;12751:14;12744:42;12627:166;:::o;12799:366::-;12941:3;12962:67;13026:2;13021:3;12962:67;:::i;:::-;12955:74;;13038:93;13127:3;13038:93;:::i;:::-;13156:2;13151:3;13147:12;13140:19;;12799:366;;;:::o;13171:419::-;13337:4;13375:2;13364:9;13360:18;13352:26;;13424:9;13418:4;13414:20;13410:1;13399:9;13395:17;13388:47;13452:131;13578:4;13452:131;:::i;:::-;13444:139;;13171:419;;;:::o;13596:348::-;13636:7;13659:20;13677:1;13659:20;:::i;:::-;13654:25;;13693:20;13711:1;13693:20;:::i;:::-;13688:25;;13881:1;13813:66;13809:74;13806:1;13803:81;13798:1;13791:9;13784:17;13780:105;13777:131;;;13888:18;;:::i;:::-;13777:131;13936:1;13933;13929:9;13918:20;;13596:348;;;;:::o;13950:180::-;13998:77;13995:1;13988:88;14095:4;14092:1;14085:15;14119:4;14116:1;14109:15;14136:185;14176:1;14193:20;14211:1;14193:20;:::i;:::-;14188:25;;14227:20;14245:1;14227:20;:::i;:::-;14222:25;;14266:1;14256:35;;14271:18;;:::i;:::-;14256:35;14313:1;14310;14306:9;14301:14;;14136:185;;;;:::o;14327:233::-;14366:3;14389:24;14407:5;14389:24;:::i;:::-;14380:33;;14435:66;14428:5;14425:77;14422:103;;14505:18;;:::i;:::-;14422:103;14552:1;14545:5;14541:13;14534:20;;14327:233;;;:::o;14566:332::-;14687:4;14725:2;14714:9;14710:18;14702:26;;14738:71;14806:1;14795:9;14791:17;14782:6;14738:71;:::i;:::-;14819:72;14887:2;14876:9;14872:18;14863:6;14819:72;:::i;:::-;14566:332;;;;;:::o;14904:229::-;15044:34;15040:1;15032:6;15028:14;15021:58;15113:12;15108:2;15100:6;15096:15;15089:37;14904:229;:::o;15139:366::-;15281:3;15302:67;15366:2;15361:3;15302:67;:::i;:::-;15295:74;;15378:93;15467:3;15378:93;:::i;:::-;15496:2;15491:3;15487:12;15480:19;;15139:366;;;:::o;15511:419::-;15677:4;15715:2;15704:9;15700:18;15692:26;;15764:9;15758:4;15754:20;15750:1;15739:9;15735:17;15728:47;15792:131;15918:4;15792:131;:::i;:::-;15784:139;;15511:419;;;:::o;15936:238::-;16076:34;16072:1;16064:6;16060:14;16053:58;16145:21;16140:2;16132:6;16128:15;16121:46;15936:238;:::o;16180:366::-;16322:3;16343:67;16407:2;16402:3;16343:67;:::i;:::-;16336:74;;16419:93;16508:3;16419:93;:::i;:::-;16537:2;16532:3;16528:12;16521:19;;16180:366;;;:::o;16552:419::-;16718:4;16756:2;16745:9;16741:18;16733:26;;16805:9;16799:4;16795:20;16791:1;16780:9;16776:17;16769:47;16833:131;16959:4;16833:131;:::i;:::-;16825:139;;16552:419;;;:::o;16977:160::-;17117:12;17113:1;17105:6;17101:14;17094:36;16977:160;:::o;17143:366::-;17285:3;17306:67;17370:2;17365:3;17306:67;:::i;:::-;17299:74;;17382:93;17471:3;17382:93;:::i;:::-;17500:2;17495:3;17491:12;17484:19;;17143:366;;;:::o;17515:419::-;17681:4;17719:2;17708:9;17704:18;17696:26;;17768:9;17762:4;17758:20;17754:1;17743:9;17739:17;17732:47;17796:131;17922:4;17796:131;:::i;:::-;17788:139;;17515:419;;;:::o;17940:553::-;18117:4;18155:3;18144:9;18140:19;18132:27;;18169:71;18237:1;18226:9;18222:17;18213:6;18169:71;:::i;:::-;18250:72;18318:2;18307:9;18303:18;18294:6;18250:72;:::i;:::-;18332;18400:2;18389:9;18385:18;18376:6;18332:72;:::i;:::-;18414;18482:2;18471:9;18467:18;18458:6;18414:72;:::i;:::-;17940:553;;;;;;;:::o;18499:230::-;18639:34;18635:1;18627:6;18623:14;18616:58;18708:13;18703:2;18695:6;18691:15;18684:38;18499:230;:::o;18735:366::-;18877:3;18898:67;18962:2;18957:3;18898:67;:::i;:::-;18891:74;;18974:93;19063:3;18974:93;:::i;:::-;19092:2;19087:3;19083:12;19076:19;;18735:366;;;:::o;19107:419::-;19273:4;19311:2;19300:9;19296:18;19288:26;;19360:9;19354:4;19350:20;19346:1;19335:9;19331:17;19324:47;19388:131;19514:4;19388:131;:::i;:::-;19380:139;;19107:419;;;:::o;19532:222::-;19672:34;19668:1;19660:6;19656:14;19649:58;19741:5;19736:2;19728:6;19724:15;19717:30;19532:222;:::o;19760:366::-;19902:3;19923:67;19987:2;19982:3;19923:67;:::i;:::-;19916:74;;19999:93;20088:3;19999:93;:::i;:::-;20117:2;20112:3;20108:12;20101:19;;19760:366;;;:::o;20132:419::-;20298:4;20336:2;20325:9;20321:18;20313:26;;20385:9;20379:4;20375:20;20371:1;20360:9;20356:17;20349:47;20413:131;20539:4;20413:131;:::i;:::-;20405:139;;20132:419;;;:::o;20557:143::-;20614:5;20645:6;20639:13;20630:22;;20661:33;20688:5;20661:33;:::i;:::-;20557:143;;;;:::o;20706:351::-;20776:6;20825:2;20813:9;20804:7;20800:23;20796:32;20793:119;;;20831:79;;:::i;:::-;20793:119;20951:1;20976:64;21032:7;21023:6;21012:9;21008:22;20976:64;:::i;:::-;20966:74;;20922:128;20706:351;;;;:::o;21063:332::-;21184:4;21222:2;21211:9;21207:18;21199:26;;21235:71;21303:1;21292:9;21288:17;21279:6;21235:71;:::i;:::-;21316:72;21384:2;21373:9;21369:18;21360:6;21316:72;:::i;:::-;21063:332;;;;;:::o;21401:137::-;21455:5;21486:6;21480:13;21471:22;;21502:30;21526:5;21502:30;:::i;:::-;21401:137;;;;:::o;21544:345::-;21611:6;21660:2;21648:9;21639:7;21635:23;21631:32;21628:119;;;21666:79;;:::i;:::-;21628:119;21786:1;21811:61;21864:7;21855:6;21844:9;21840:22;21811:61;:::i;:::-;21801:71;;21757:125;21544:345;;;;:::o;21895:553::-;22072:4;22110:3;22099:9;22095:19;22087:27;;22124:71;22192:1;22181:9;22177:17;22168:6;22124:71;:::i;:::-;22205:72;22273:2;22262:9;22258:18;22249:6;22205:72;:::i;:::-;22287;22355:2;22344:9;22340:18;22331:6;22287:72;:::i;:::-;22369;22437:2;22426:9;22422:18;22413:6;22369:72;:::i;:::-;21895:553;;;;;;;:::o;22454:225::-;22594:34;22590:1;22582:6;22578:14;22571:58;22663:8;22658:2;22650:6;22646:15;22639:33;22454:225;:::o;22685:366::-;22827:3;22848:67;22912:2;22907:3;22848:67;:::i;:::-;22841:74;;22924:93;23013:3;22924:93;:::i;:::-;23042:2;23037:3;23033:12;23026:19;;22685:366;;;:::o;23057:419::-;23223:4;23261:2;23250:9;23246:18;23238:26;;23310:9;23304:4;23300:20;23296:1;23285:9;23281:17;23274:47;23338:131;23464:4;23338:131;:::i;:::-;23330:139;;23057:419;;;:::o;23482:181::-;23622:33;23618:1;23610:6;23606:14;23599:57;23482:181;:::o;23669:366::-;23811:3;23832:67;23896:2;23891:3;23832:67;:::i;:::-;23825:74;;23908:93;23997:3;23908:93;:::i;:::-;24026:2;24021:3;24017:12;24010:19;;23669:366;;;:::o;24041:419::-;24207:4;24245:2;24234:9;24230:18;24222:26;;24294:9;24288:4;24284:20;24280:1;24269:9;24265:17;24258:47;24322:131;24448:4;24322:131;:::i;:::-;24314:139;;24041:419;;;:::o;24466:166::-;24606:18;24602:1;24594:6;24590:14;24583:42;24466:166;:::o;24638:366::-;24780:3;24801:67;24865:2;24860:3;24801:67;:::i;:::-;24794:74;;24877:93;24966:3;24877:93;:::i;:::-;24995:2;24990:3;24986:12;24979:19;;24638:366;;;:::o;25010:419::-;25176:4;25214:2;25203:9;25199:18;25191:26;;25263:9;25257:4;25253:20;25249:1;25238:9;25234:17;25227:47;25291:131;25417:4;25291:131;:::i;:::-;25283:139;;25010:419;;;:::o;25435:182::-;25575:34;25571:1;25563:6;25559:14;25552:58;25435:182;:::o;25623:366::-;25765:3;25786:67;25850:2;25845:3;25786:67;:::i;:::-;25779:74;;25862:93;25951:3;25862:93;:::i;:::-;25980:2;25975:3;25971:12;25964:19;;25623:366;;;:::o;25995:419::-;26161:4;26199:2;26188:9;26184:18;26176:26;;26248:9;26242:4;26238:20;26234:1;26223:9;26219:17;26212:47;26276:131;26402:4;26276:131;:::i;:::-;26268:139;;25995:419;;;:::o;26420:170::-;26560:22;26556:1;26548:6;26544:14;26537:46;26420:170;:::o;26596:366::-;26738:3;26759:67;26823:2;26818:3;26759:67;:::i;:::-;26752:74;;26835:93;26924:3;26835:93;:::i;:::-;26953:2;26948:3;26944:12;26937:19;;26596:366;;;:::o;26968:419::-;27134:4;27172:2;27161:9;27157:18;27149:26;;27221:9;27215:4;27211:20;27207:1;27196:9;27192:17;27185:47;27249:131;27375:4;27249:131;:::i;:::-;27241:139;;26968:419;;;:::o;27393:442::-;27542:4;27580:2;27569:9;27565:18;27557:26;;27593:71;27661:1;27650:9;27646:17;27637:6;27593:71;:::i;:::-;27674:72;27742:2;27731:9;27727:18;27718:6;27674:72;:::i;:::-;27756;27824:2;27813:9;27809:18;27800:6;27756:72;:::i;:::-;27393:442;;;;;;:::o;27841:229::-;27981:34;27977:1;27969:6;27965:14;27958:58;28050:12;28045:2;28037:6;28033:15;28026:37;27841:229;:::o;28076:366::-;28218:3;28239:67;28303:2;28298:3;28239:67;:::i;:::-;28232:74;;28315:93;28404:3;28315:93;:::i;:::-;28433:2;28428:3;28424:12;28417:19;;28076:366;;;:::o;28448:419::-;28614:4;28652:2;28641:9;28637:18;28629:26;;28701:9;28695:4;28691:20;28687:1;28676:9;28672:17;28665:47;28729:131;28855:4;28729:131;:::i;:::-;28721:139;;28448:419;;;:::o;28873:225::-;29013:34;29009:1;29001:6;28997:14;28990:58;29082:8;29077:2;29069:6;29065:15;29058:33;28873:225;:::o;29104:366::-;29246:3;29267:67;29331:2;29326:3;29267:67;:::i;:::-;29260:74;;29343:93;29432:3;29343:93;:::i;:::-;29461:2;29456:3;29452:12;29445:19;;29104:366;;;:::o;29476:419::-;29642:4;29680:2;29669:9;29665:18;29657:26;;29729:9;29723:4;29719:20;29715:1;29704:9;29700:17;29693:47;29757:131;29883:4;29757:131;:::i;:::-;29749:139;;29476:419;;;:::o;29901:98::-;29952:6;29986:5;29980:12;29970:22;;29901:98;;;:::o;30005:147::-;30106:11;30143:3;30128:18;;30005:147;;;;:::o;30158:246::-;30239:1;30249:113;30263:6;30260:1;30257:13;30249:113;;;30348:1;30343:3;30339:11;30333:18;30329:1;30324:3;30320:11;30313:39;30285:2;30282:1;30278:10;30273:15;;30249:113;;;30396:1;30387:6;30382:3;30378:16;30371:27;30220:184;30158:246;;;:::o;30410:386::-;30514:3;30542:38;30574:5;30542:38;:::i;:::-;30596:88;30677:6;30672:3;30596:88;:::i;:::-;30589:95;;30693:65;30751:6;30746:3;30739:4;30732:5;30728:16;30693:65;:::i;:::-;30783:6;30778:3;30774:16;30767:23;;30518:278;30410:386;;;;:::o;30802:271::-;30932:3;30954:93;31043:3;31034:6;30954:93;:::i;:::-;30947:100;;31064:3;31057:10;;30802:271;;;;:::o;31079:179::-;31219:31;31215:1;31207:6;31203:14;31196:55;31079:179;:::o;31264:366::-;31406:3;31427:67;31491:2;31486:3;31427:67;:::i;:::-;31420:74;;31503:93;31592:3;31503:93;:::i;:::-;31621:2;31616:3;31612:12;31605:19;;31264:366;;;:::o;31636:419::-;31802:4;31840:2;31829:9;31825:18;31817:26;;31889:9;31883:4;31879:20;31875:1;31864:9;31860:17;31853:47;31917:131;32043:4;31917:131;:::i;:::-;31909:139;;31636:419;;;:::o;32061:99::-;32113:6;32147:5;32141:12;32131:22;;32061:99;;;:::o;32166:102::-;32207:6;32258:2;32254:7;32249:2;32242:5;32238:14;32234:28;32224:38;;32166:102;;;:::o;32274:377::-;32362:3;32390:39;32423:5;32390:39;:::i;:::-;32445:71;32509:6;32504:3;32445:71;:::i;:::-;32438:78;;32525:65;32583:6;32578:3;32571:4;32564:5;32560:16;32525:65;:::i;:::-;32615:29;32637:6;32615:29;:::i;:::-;32610:3;32606:39;32599:46;;32366:285;32274:377;;;;:::o;32657:313::-;32770:4;32808:2;32797:9;32793:18;32785:26;;32857:9;32851:4;32847:20;32843:1;32832:9;32828:17;32821:47;32885:78;32958:4;32949:6;32885:78;:::i;:::-;32877:86;;32657:313;;;;:::o
Swarm Source
ipfs://ef5905100027bcbce5ab002d3484a417f982450de7647c9057f37e7d3fb0f3f7
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.