BscScan - Sponsored slots available. Book your slot here!
Contract Overview
My Name Tag:
Not Available, login to update
Txn Hash |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|
0x4815dc8c32191c299895697739c75868cc4398165aa0c8953e228c9952897329 | 4518782 | 68 days 6 hrs ago | Autofarm: Deployer | IN | Contract Creation | 0 BNB | 0.10798312 |
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xf67cceaf8bf755d03e9328cdebb38bb40baae43f
Contract Name:
StratVLEV
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at BscScan.com on 2021-02-02 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; // "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol"; abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue) ); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub( subtractedValue, "ERC20: decreased allowance below zero" ) ); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub( amount, "ERC20: transfer amount exceeds balance" ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub( amount, "ERC20: burn amount exceeds balance" ); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/SafeERC20.sol"; library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ 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.3._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } /** * @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' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeERC20: decreased allowance below zero" ); _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall( data, "SafeERC20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } // "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol"; 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() internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol"; 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() internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Pausable.sol"; 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() internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } interface IPancakeRouter01 { // function factory() external pure returns (address); // function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); // function addLiquidityETH( // address token, // uint256 amountTokenDesired, // uint256 amountTokenMin, // uint256 amountETHMin, // address to, // uint256 deadline // ) // external // payable // returns ( // uint256 amountToken, // uint256 amountETH, // uint256 liquidity // ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); // function removeLiquidityETH( // address token, // uint256 liquidity, // uint256 amountTokenMin, // uint256 amountETHMin, // address to, // uint256 deadline // ) external returns (uint256 amountToken, uint256 amountETH); // function removeLiquidityWithPermit( // address tokenA, // address tokenB, // uint256 liquidity, // uint256 amountAMin, // uint256 amountBMin, // address to, // uint256 deadline, // bool approveMax, // uint8 v, // bytes32 r, // bytes32 s // ) external returns (uint256 amountA, uint256 amountB); // function removeLiquidityETHWithPermit( // address token, // uint256 liquidity, // uint256 amountTokenMin, // uint256 amountETHMin, // address to, // uint256 deadline, // bool approveMax, // uint8 v, // bytes32 r, // bytes32 s // ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); // function swapTokensForExactTokens( // uint256 amountOut, // uint256 amountInMax, // address[] calldata path, // address to, // uint256 deadline // ) external returns (uint256[] memory amounts); // function swapExactETHForTokens( // uint256 amountOutMin, // address[] calldata path, // address to, // uint256 deadline // ) external payable returns (uint256[] memory amounts); // function swapTokensForExactETH( // uint256 amountOut, // uint256 amountInMax, // address[] calldata path, // address to, // uint256 deadline // ) external returns (uint256[] memory amounts); // function swapExactTokensForETH( // uint256 amountIn, // uint256 amountOutMin, // address[] calldata path, // address to, // uint256 deadline // ) external returns (uint256[] memory amounts); // function swapETHForExactTokens( // uint256 amountOut, // address[] calldata path, // address to, // uint256 deadline // ) external payable returns (uint256[] memory amounts); // function quote( // uint256 amountA, // uint256 reserveA, // uint256 reserveB // ) external pure returns (uint256 amountB); // function getAmountOut( // uint256 amountIn, // uint256 reserveIn, // uint256 reserveOut // ) external pure returns (uint256 amountOut); // function getAmountIn( // uint256 amountOut, // uint256 reserveIn, // uint256 reserveOut // ) external pure returns (uint256 amountIn); // function getAmountsOut(uint256 amountIn, address[] calldata path) // external // view // returns (uint256[] memory amounts); // function getAmountsIn(uint256 amountOut, address[] calldata path) // external // view // returns (uint256[] memory amounts); } interface IPancakeRouter02 is IPancakeRouter01 { // function removeLiquidityETHSupportingFeeOnTransferTokens( // address token, // uint256 liquidity, // uint256 amountTokenMin, // uint256 amountETHMin, // address to, // uint256 deadline // ) external returns (uint256 amountETH); // function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( // address token, // uint256 liquidity, // uint256 amountTokenMin, // uint256 amountETHMin, // address to, // uint256 deadline, // bool approveMax, // uint8 v, // bytes32 r, // bytes32 s // ) external returns (uint256 amountETH); // function swapExactTokensForTokensSupportingFeeOnTransferTokens( // uint256 amountIn, // uint256 amountOutMin, // address[] calldata path, // address to, // uint256 deadline // ) external; // function swapExactETHForTokensSupportingFeeOnTransferTokens( // uint256 amountOutMin, // address[] calldata path, // address to, // uint256 deadline // ) external payable; // function swapExactTokensForETHSupportingFeeOnTransferTokens( // uint256 amountIn, // uint256 amountOutMin, // address[] calldata path, // address to, // uint256 deadline // ) external; } interface IVenusDistribution { function claimVenus(address holder) external; function enterMarkets(address[] memory _vtokens) external; function exitMarket(address _vtoken) external; function getAssetsIn(address account) external view returns (address[] memory); function getAccountLiquidity(address account) external view returns ( uint256, uint256, uint256 ); } interface IWBNB is IERC20 { function deposit() external payable; function withdraw(uint256 wad) external; } interface IVBNB { function mint() external payable; function redeem(uint256 redeemTokens) external returns (uint256); function redeemUnderlying(uint256 redeemAmount) external returns (uint256); function borrow(uint256 borrowAmount) external returns (uint256); function repayBorrow() external payable; // function getAccountSnapshot(address account) // external // view // returns ( // uint256, // uint256, // uint256, // uint256 // ); function balanceOfUnderlying(address owner) external returns (uint256); function borrowBalanceCurrent(address account) external returns (uint256); } interface IVToken is IERC20 { function underlying() external returns (address); function mint(uint256 mintAmount) external returns (uint256); function redeem(uint256 redeemTokens) external returns (uint256); function redeemUnderlying(uint256 redeemAmount) external returns (uint256); function borrow(uint256 borrowAmount) external returns (uint256); function repayBorrow(uint256 repayAmount) external returns (uint256); function balanceOfUnderlying(address owner) external returns (uint256); function borrowBalanceCurrent(address account) external returns (uint256); } contract StratVLEV is Ownable, ReentrancyGuard, Pausable { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; bool public wantIsWBNB = false; address public wantAddress; address public vTokenAddress; address[] public venusMarkets; address public uniRouterAddress; address public constant wbnbAddress = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c; address public constant venusAddress = 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; address public constant earnedAddress = venusAddress; address public constant venusDistributionAddress = 0xfD36E2c2a6789Db23113685031d7F16329158384; address public autoFarmAddress; address public AUTOAddress; address public govAddress; // timelock contract uint256 public sharesTotal = 0; uint256 public lastEarnBlock = 0; uint256 public controllerFee = 60; uint256 public constant controllerFeeMax = 10000; // 100 = 1% uint256 public constant controllerFeeUL = 300; // 3% upperlimit uint256 public buyBackRate = 150; uint256 public constant buyBackRateMax = 10000; // 100 = 1% uint256 public constant buyBackRateUL = 800; // 8% upperlimit address public constant buyBackAddress = 0x000000000000000000000000000000000000dEaD; uint256 public entranceFeeFactor = 9990; // < 0.1% entrance fee - goes to pool + prevents front-running uint256 public constant entranceFeeFactorMax = 10000; uint256 public constant entranceFeeFactorLL = 9950; // 0.5% is the max entrance fee settable. LL = lowerlimit address[] public venusToWantPath; address[] public earnedToAUTOPath; /** * @dev Variables that can be changed to config profitability and risk: * {borrowRate} - What % of our collateral do we borrow per leverage level. * {borrowDepth} - How many levels of leverage do we take. * {BORROW_RATE_MAX} - A limit on how much we can push borrow risk. * {BORROW_DEPTH_MAX} - A limit on how many steps we can leverage. */ uint256 public borrowRate = 585; uint256 public borrowDepth = 3; uint256 public constant BORROW_RATE_MAX = 595; uint256 public constant BORROW_RATE_MAX_HARD = 599; uint256 public constant BORROW_DEPTH_MAX = 6; bool onlyGov = true; uint256 public supplyBal = 0; // Cached want supplied to venus uint256 public borrowBal = 0; // Cached want borrowed from venus uint256 public supplyBalTargeted = 0; // Cached targetted want supplied to venus to achieve desired leverage uint256 public supplyBalMin = 0; /** * @dev Events that the contract emits */ event StratRebalance(uint256 _borrowRate, uint256 _borrowDepth); constructor( address _govAddress, address _autoFarmAddress, address _AUTOAddress, address _wantAddress, address _vTokenAddress, address _uniRouterAddress ) public { govAddress = _govAddress; autoFarmAddress = _autoFarmAddress; AUTOAddress = _AUTOAddress; wantAddress = _wantAddress; if (wantAddress == wbnbAddress) { wantIsWBNB = true; venusToWantPath = [venusAddress, wbnbAddress]; } else { venusToWantPath = [venusAddress, wbnbAddress, wantAddress]; // if (venusAddress == wantAddress) {} // Then venusToWantPath will never be used. } earnedToAUTOPath = [venusAddress, wbnbAddress, AUTOAddress]; // if (wbnbAddress == venusAddress) {} // Not possible vTokenAddress = _vTokenAddress; venusMarkets = [vTokenAddress]; uniRouterAddress = _uniRouterAddress; transferOwnership(autoFarmAddress); IERC20(venusAddress).safeApprove(uniRouterAddress, uint256(-1)); IERC20(wantAddress).safeApprove(uniRouterAddress, uint256(-1)); if (!wantIsWBNB) { IERC20(wantAddress).safeApprove(vTokenAddress, uint256(-1)); } IVenusDistribution(venusDistributionAddress).enterMarkets(venusMarkets); } function _supply(uint256 _amount) internal { if (wantIsWBNB) { IVBNB(vTokenAddress).mint{value: _amount}(); } else { IVToken(vTokenAddress).mint(_amount); } } function _removeSupply(uint256 _amount) internal { IVToken(vTokenAddress).redeemUnderlying(_amount); } function _borrow(uint256 _amount) internal { IVToken(vTokenAddress).borrow(_amount); } function _repayBorrow(uint256 _amount) internal { if (wantIsWBNB) { IVBNB(vTokenAddress).repayBorrow{value: _amount}(); } else { IVToken(vTokenAddress).repayBorrow(_amount); } } function deposit(address _userAddress, uint256 _wantAmt) public onlyOwner nonReentrant whenNotPaused returns (uint256) { updateBalance(); uint256 sharesAdded = _wantAmt; if (wantLockedTotal() > 0 && sharesTotal > 0) { sharesAdded = _wantAmt .mul(sharesTotal) .mul(entranceFeeFactor) .div(wantLockedTotal()) .div(entranceFeeFactorMax); } sharesTotal = sharesTotal.add(sharesAdded); IERC20(wantAddress).safeTransferFrom( address(msg.sender), address(this), _wantAmt ); _farm(true); return sharesAdded; } function farm(bool _withLev) public nonReentrant { _farm(_withLev); } function _farm(bool _withLev) internal { if (wantIsWBNB) { _unwrapBNB(); // WBNB -> BNB. Venus accepts BNB, not WBNB. _leverage(address(this).balance, _withLev); } else { _leverage(wantLockedInHere(), _withLev); } updateBalance(); deleverageUntilNotOverLevered(); // It is possible to still be over-levered after depositing. } /** * @dev Repeatedly supplies and borrows bnb following the configured {borrowRate} and {borrowDepth} * into the vToken contract. */ function _leverage(uint256 _amount, bool _withLev) internal { if (_withLev) { for (uint256 i = 0; i < borrowDepth; i++) { _supply(_amount); _amount = _amount.mul(borrowRate).div(1000); _borrow(_amount); } } _supply(_amount); // Supply remaining want that was last borrowed. } /** * @dev Redeem to the desired leverage amount, then use it to repay borrow. * If already over leverage, redeem max amt redeemable, then use it to repay borrow. */ function deleverageOnce() public { if (onlyGov) { require(msg.sender == govAddress, "Not authorised"); } _deleverageOnce(); } function _deleverageOnce() internal { updateBalance(); // Updates borrowBal & supplyBal & supplyBalTargeted & supplyBalMin if (supplyBal <= supplyBalTargeted) { _removeSupply(supplyBal.sub(supplyBalMin)); } else { _removeSupply(supplyBal.sub(supplyBalTargeted)); } if (wantIsWBNB) { _unwrapBNB(); // WBNB -> BNB _repayBorrow(address(this).balance); } else { _repayBorrow(wantLockedInHere()); } updateBalance(); // Updates borrowBal & supplyBal & supplyBalTargeted & supplyBalMin } /** * @dev Redeem the max possible, use it to repay borrow */ function deleverageUntilNotOverLevered() public { // updateBalance(); // To be more accurate, call updateBalance() first to cater for changes due to interest rates // If borrowRate slips below targetted borrowRate, withdraw the max amt first. // Further actual deleveraging will take place later on. // (This can happen in when net interest rate < 0, and supplied balance falls below targeted.) while (supplyBal > 0 && supplyBal <= supplyBalTargeted) { _deleverageOnce(); } } /** * @dev Incrementally alternates between paying part of the debt and withdrawing part of the supplied * collateral. Continues to do this untill all want tokens is withdrawn. For partial deleveraging, * this continues until at least _minAmt of want tokens is reached. */ function _deleverage(bool _delevPartial, uint256 _minAmt) internal { updateBalance(); // Updates borrowBal & supplyBal & supplyBalTargeted & supplyBalMin deleverageUntilNotOverLevered(); if (wantIsWBNB) { _wrapBNB(); // WBNB -> BNB } _removeSupply(supplyBal.sub(supplyBalMin)); uint256 wantBal = wantLockedInHere(); // Recursively repay borrowed + remove more from supplied while (wantBal < borrowBal) { // If only partially deleveraging, when sufficiently deleveraged, do not repay anymore if (_delevPartial && wantBal >= _minAmt) { return; } _repayBorrow(wantBal); updateBalance(); // Updates borrowBal & supplyBal & supplyBalTargeted & supplyBalMin _removeSupply(supplyBal.sub(supplyBalMin)); wantBal = wantLockedInHere(); } // If only partially deleveraging, when sufficiently deleveraged, do not repay if (_delevPartial && wantBal >= _minAmt) { return; } // Make a final repayment of borrowed _repayBorrow(borrowBal); // remove all supplied uint256 vTokenBal = IERC20(vTokenAddress).balanceOf(address(this)); IVToken(vTokenAddress).redeem(vTokenBal); } /** * @dev Updates the risk profile and rebalances the vault funds accordingly. * @param _borrowRate percent to borrow on each leverage level. * @param _borrowDepth how many levels to leverage the funds. */ function rebalance(uint256 _borrowRate, uint256 _borrowDepth) external { require(msg.sender == govAddress, "Not authorised"); require(_borrowRate <= BORROW_RATE_MAX, "!rate"); require(_borrowDepth <= BORROW_DEPTH_MAX, "!depth"); _deleverage(false, uint256(-1)); // deleverage all supplied want tokens borrowRate = _borrowRate; borrowDepth = _borrowDepth; _farm(true); } function earn() external whenNotPaused { if (onlyGov) { require(msg.sender == govAddress, "Not authorised"); } IVenusDistribution(venusDistributionAddress).claimVenus(address(this)); uint256 earnedAmt = IERC20(venusAddress).balanceOf(address(this)); earnedAmt = distributeFees(earnedAmt); earnedAmt = buyBack(earnedAmt); if (venusAddress != wantAddress) { IPancakeRouter02(uniRouterAddress).swapExactTokensForTokens( earnedAmt, 0, venusToWantPath, address(this), now.add(600) ); } lastEarnBlock = block.number; _farm(false); // Supply wantToken without leverage, to cater for net -ve interest rates. } function buyBack(uint256 _earnedAmt) internal returns (uint256) { if (buyBackRate <= 0) { return _earnedAmt; } uint256 buyBackAmt = _earnedAmt.mul(buyBackRate).div(buyBackRateMax); IPancakeRouter02(uniRouterAddress).swapExactTokensForTokens( buyBackAmt, 0, earnedToAUTOPath, address(this), now + 600 ); // Burn AUTO tokens uint256 burnAmt = IERC20(AUTOAddress).balanceOf(address(this)); IERC20(AUTOAddress).safeTransfer(buyBackAddress, burnAmt); return _earnedAmt.sub(buyBackAmt); } function distributeFees(uint256 _earnedAmt) internal returns (uint256) { if (_earnedAmt > 0) { if (controllerFee > 0) { uint256 fee = _earnedAmt.mul(controllerFee).div(controllerFeeMax); IERC20(venusAddress).safeTransfer(govAddress, fee); return _earnedAmt.sub(fee); } } return _earnedAmt; } function withdraw(address _userAddress, uint256 _wantAmt) external onlyOwner nonReentrant returns (uint256) { uint256 sharesRemoved = _wantAmt.mul(sharesTotal).div(wantLockedTotal()); if (sharesRemoved > sharesTotal) { sharesRemoved = sharesTotal; } sharesTotal = sharesTotal.sub(sharesRemoved); uint256 wantBal = IERC20(wantAddress).balanceOf(address(this)); if (wantBal < _wantAmt) { _deleverage(true, _wantAmt.sub(wantBal)); if (wantIsWBNB) { _wrapBNB(); // wrap BNB -> WBNB before sending it back to user } wantBal = IERC20(wantAddress).balanceOf(address(this)); } if (wantBal < _wantAmt) { _wantAmt = wantBal; } IERC20(wantAddress).safeTransfer(autoFarmAddress, _wantAmt); _farm(true); return sharesRemoved; } /** * @dev Pauses the strat. */ function pause() public { require(msg.sender == govAddress, "Not authorised"); _pause(); IERC20(venusAddress).safeApprove(uniRouterAddress, 0); IERC20(wantAddress).safeApprove(uniRouterAddress, 0); if (!wantIsWBNB) { IERC20(wantAddress).safeApprove(vTokenAddress, 0); } } /** * @dev Unpauses the strat. */ function unpause() external { require(msg.sender == govAddress, "Not authorised"); _unpause(); IERC20(venusAddress).safeApprove(uniRouterAddress, uint256(-1)); IERC20(wantAddress).safeApprove(uniRouterAddress, uint256(-1)); if (!wantIsWBNB) { IERC20(wantAddress).safeApprove(vTokenAddress, 0); } } /** * @dev Updates want locked in Venus after interest is accrued to this very block. * To be called before sensitive operations. */ function updateBalance() public { supplyBal = IVToken(vTokenAddress).balanceOfUnderlying(address(this)); // a payable function because of acrueInterest() borrowBal = IVToken(vTokenAddress).borrowBalanceCurrent(address(this)); supplyBalTargeted = borrowBal.mul(1000).div(borrowRate); supplyBalMin = borrowBal.mul(1000).div(BORROW_RATE_MAX_HARD); } function wantLockedTotal() public view returns (uint256) { return wantLockedInHere().add(supplyBal).sub(borrowBal); } function wantLockedInHere() public view returns (uint256) { uint256 wantBal = IERC20(wantAddress).balanceOf(address(this)); if (wantIsWBNB) { uint256 bnbBal = address(this).balance; return bnbBal.add(wantBal); } else { return wantBal; } } function setEntranceFeeFactor(uint256 _entranceFeeFactor) public { require(msg.sender == govAddress, "Not authorised"); require(_entranceFeeFactor > entranceFeeFactorLL, "!safe - too low"); require(_entranceFeeFactor <= entranceFeeFactorMax, "!safe - too high"); entranceFeeFactor = _entranceFeeFactor; } function setControllerFee(uint256 _controllerFee) public { require(msg.sender == govAddress, "Not authorised"); require(_controllerFee <= controllerFeeUL, "too high"); controllerFee = _controllerFee; } function setbuyBackRate(uint256 _buyBackRate) public { require(msg.sender == govAddress, "Not authorised"); require(buyBackRate <= buyBackRateUL, "too high"); buyBackRate = _buyBackRate; } function setGov(address _govAddress) public { require(msg.sender == govAddress, "Not authorised"); govAddress = _govAddress; } function setOnlyGov(bool _onlyGov) public { require(msg.sender == govAddress, "Not authorised"); onlyGov = _onlyGov; } function inCaseTokensGetStuck( address _token, uint256 _amount, address _to ) public { require(msg.sender == govAddress, "!gov"); require(_token != earnedAddress, "!safe"); require(_token != wantAddress, "!safe"); require(_token != vTokenAddress, "!safe"); IERC20(_token).safeTransfer(_to, _amount); } function _wrapBNB() internal { // BNB -> WBNB uint256 bnbBal = address(this).balance; if (bnbBal > 0) { IWBNB(wbnbAddress).deposit{value: bnbBal}(); // BNB -> WBNB } } function _unwrapBNB() internal { // WBNB -> BNB uint256 wbnbBal = IERC20(wbnbAddress).balanceOf(address(this)); if (wbnbBal > 0) { IWBNB(wbnbAddress).withdraw(wbnbBal); } } /** * @dev We should not have significant amts of BNB in this contract if any at all. * In case we do (eg. Venus returns all users' BNB to this contract or for any other reason), * We can wrap all BNB, allowing users to withdraw() as per normal. */ function wrapBNB() public { require(msg.sender == govAddress, "Not authorised"); require(wantIsWBNB, "!wantIsWBNB"); _wrapBNB(); } receive() external payable {} }
[{"inputs":[{"internalType":"address","name":"_govAddress","type":"address"},{"internalType":"address","name":"_autoFarmAddress","type":"address"},{"internalType":"address","name":"_AUTOAddress","type":"address"},{"internalType":"address","name":"_wantAddress","type":"address"},{"internalType":"address","name":"_vTokenAddress","type":"address"},{"internalType":"address","name":"_uniRouterAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_borrowRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_borrowDepth","type":"uint256"}],"name":"StratRebalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"AUTOAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BORROW_DEPTH_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BORROW_RATE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BORROW_RATE_MAX_HARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoFarmAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowBal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowDepth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackRateMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackRateUL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerFeeMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerFeeUL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleverageOnce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deleverageUntilNotOverLevered","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earnedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"earnedToAUTOPath","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entranceFeeFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entranceFeeFactorLL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entranceFeeFactorMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_withLev","type":"bool"}],"name":"farm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"govAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastEarnBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_borrowRate","type":"uint256"},{"internalType":"uint256","name":"_borrowDepth","type":"uint256"}],"name":"rebalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controllerFee","type":"uint256"}],"name":"setControllerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_entranceFeeFactor","type":"uint256"}],"name":"setEntranceFeeFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_govAddress","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_onlyGov","type":"bool"}],"name":"setOnlyGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyBackRate","type":"uint256"}],"name":"setbuyBackRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharesTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyBal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyBalMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyBalTargeted","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":"uniRouterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"venusAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"venusDistributionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"venusMarkets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"venusToWantPath","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wantAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wantIsWBNB","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wantLockedInHere","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wantLockedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbnbAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000600260016101000a81548160ff02191690831515021790555060006009556000600a55603c600b556096600c55612706600d5561024960105560036011556001601260006101000a81548160ff02191690831515021790555060006013556000601455600060155560006016553480156200008057600080fd5b506040516200673d3803806200673d833981810160405260c0811015620000a657600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050506000620000fb620009d660201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600180819055506000600260006101000a81548160ff02191690831515021790555085600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826002806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1660028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415620003f0576001600260016101000a81548160ff021916908315150217905550604051806040016040528073cf6bb5389c92bdda8a3747ddb454cb7a64626c6373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250600e906002620003e992919062001186565b50620004eb565b604051806060016040528073cf6bb5389c92bdda8a3747ddb454cb7a64626c6373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250600e906003620004e992919062001215565b505b604051806060016040528073cf6bb5389c92bdda8a3747ddb454cb7a64626c6373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250600f906003620005e692919062001215565b5081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060200160405280600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250600490600162000697929190620012a4565b5080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200070c600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620009de60201b60201c565b62000794600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73cf6bb5389c92bdda8a3747ddb454cb7a64626c6373ffffffffffffffffffffffffffffffffffffffff1662000bf460201b62003878179092919060201c565b62000828600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662000bf460201b62003878179092919060201c565b600260019054906101000a900460ff16620008d257620008d1600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662000bf460201b62003878179092919060201c565b5b73fd36e2c2a6789db23113685031d7f1632915838473ffffffffffffffffffffffffffffffffffffffff1663c299823860046040518263ffffffff1660e01b8152600401808060200182810382528381815481526020019150805480156200099057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000945575b505092505050600060405180830381600087803b158015620009b157600080fd5b505af1158015620009c6573d6000803e3d6000fd5b5050505050505050505062001370565b600033905090565b620009ee620009d660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000aaf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180620066916026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081148062000cc6575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801562000c8757600080fd5b505afa15801562000c9c573d6000803e3d6000fd5b505050506040513d602081101562000cb357600080fd5b8101908080519060200190929190505050145b62000d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180620067076036913960400191505060405180910390fd5b62000dc28363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505062000dc760201b60201c565b505050565b606062000e30826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1662000ec160201b62003a3d179092919060201c565b905060008151111562000ebc5780806020019051602081101562000e5357600080fd5b810190808051906020019092919050505062000ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180620066dd602a913960400191505060405180910390fd5b5b505050565b606062000ed8848460008562000ee160201b60201c565b90509392505050565b60608247101562000f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180620066b76026913960400191505060405180910390fd5b62000f4f85620010a160201b60201c565b62000fc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831062001014578051825260208201915060208101905060208303925062000fef565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811462001078576040519150601f19603f3d011682016040523d82523d6000602084013e6200107d565b606091505b509150915062001095828286620010b460201b60201c565b92505050949350505050565b600080823b905060008111915050919050565b60608315620010c6578290506200117f565b600083511115620010da5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200114357808201518184015260208101905062001126565b50505050905090810190601f168015620011715780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b82805482825590600052602060002090810192821562001202579160200282015b82811115620012015782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620011a7565b5b50905062001211919062001333565b5090565b82805482825590600052602060002090810192821562001291579160200282015b82811115620012905782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062001236565b5b509050620012a0919062001333565b5090565b82805482825590600052602060002090810192821562001320579160200282015b828111156200131f5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620012c5565b5b5090506200132f919062001333565b5090565b5b808211156200136c57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010162001334565b5090565b61531180620013806000396000f3fe6080604052600436106103855760003560e01c80637cd3431a116101d1578063c914b43711610102578063e7198474116100a0578063f2fde38b1161006f578063f2fde38b14610ebf578063f3fef3a314610f10578063f400d31114610f7f578063fa97484114610fba5761038c565b8063e719847414610de7578063e7a0367914610e28578063ee50dc3414610e69578063f151dd7014610e945761038c565b8063cfad57a2116100dc578063cfad57a214610d23578063d389800f14610d74578063d5b0916314610d8b578063df8879b814610da25761038c565b8063c914b43714610c56578063cd8ab2e814610c81578063cf9561bc14610ce65761038c565b8063a43020441161016f578063b3545c0111610149578063b3545c0114610b9a578063b40fa1ce14610bc5578063b4896ecc14610c00578063c302a4d014610c2b5761038c565b8063a430204414610b2d578063a9559dd714610b58578063aced9a8014610b6f5761038c565b80638da5cb5b116101ab5780638da5cb5b14610a6b5780639379011314610aac5780639768431714610ad75780639e6b2ded14610b025761038c565b80637cd3431a146109fc5780638456cb5914610a2957806385f02dd614610a405761038c565b806344a3955e116102b657806362e582e711610254578063706cac3511610223578063706cac3514610928578063715018a61461098d578063783478ad146109a45780637c3f1e8c146109e55761038c565b806362e582e7146107c657806363fe3e3a1461082b57806367206d401461086c578063693a090b146108e75761038c565b80634d9f7bb2116102905780634d9f7bb214610702578063564962621461072d5780635c975abb1461076e578063624e260f1461079b5761038c565b806344a3955e1461062757806346008a071461065257806347e7ef24146106935761038c565b80632717eff3116103235780633e1a8912116102fd5780633e1a8912146105695780633f4ba83a146105a4578063412dfe49146105bb57806342da4eb3146105fc5761038c565b80632717eff3146104bc5780632792bd57146104e7578063366ba246146105285761038c565b80630fa4e01e1161035f5780630fa4e01e146104105780631334903f1461043b57806314b5f8d114610466578063178a8d07146104915761038c565b8063061c7d48146103915780630790b57b146103bc5780630b6bb30b146103d35761038c565b3661038c57005b600080fd5b34801561039d57600080fd5b506103a6610ffb565b6040518082815260200191505060405180910390f35b3480156103c857600080fd5b506103d1611001565b005b3480156103df57600080fd5b5061040e600480360360208110156103f657600080fd5b8101908080351515906020019092919050505061102c565b005b34801561041c57600080fd5b5061042561110c565b6040518082815260200191505060405180910390f35b34801561044757600080fd5b50610450611112565b6040518082815260200191505060405180910390f35b34801561047257600080fd5b5061047b611118565b6040518082815260200191505060405180910390f35b34801561049d57600080fd5b506104a661111e565b6040518082815260200191505060405180910390f35b3480156104c857600080fd5b506104d1611124565b6040518082815260200191505060405180910390f35b3480156104f357600080fd5b506104fc61112a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053457600080fd5b5061053d611150565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561057557600080fd5b506105a26004803603602081101561058c57600080fd5b8101908080359060200190929190505050611176565b005b3480156105b057600080fd5b506105b9611332565b005b3480156105c757600080fd5b506105d0611590565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561060857600080fd5b506106116115a8565b6040518082815260200191505060405180910390f35b34801561063357600080fd5b5061063c6115df565b6040518082815260200191505060405180910390f35b34801561065e57600080fd5b506106676115e5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561069f57600080fd5b506106ec600480360360408110156106b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061160b565b6040518082815260200191505060405180910390f35b34801561070e57600080fd5b506107176118e0565b6040518082815260200191505060405180910390f35b34801561073957600080fd5b506107426118e6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561077a57600080fd5b506107836118fe565b60405180821515815260200191505060405180910390f35b3480156107a757600080fd5b506107b0611915565b6040518082815260200191505060405180910390f35b3480156107d257600080fd5b506107ff600480360360208110156107e957600080fd5b810190808035906020019092919050505061191b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561083757600080fd5b50610840611957565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561087857600080fd5b506108e56004803603606081101561088f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061196f565b005b3480156108f357600080fd5b506108fc611c9e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561093457600080fd5b506109616004803603602081101561094b57600080fd5b8101908080359060200190929190505050611cc4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561099957600080fd5b506109a2611d00565b005b3480156109b057600080fd5b506109b9611e86565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109f157600080fd5b506109fa611e8c565b005b348015610a0857600080fd5b50610a11611f6f565b60405180821515815260200191505060405180910390f35b348015610a3557600080fd5b50610a3e611f82565b005b348015610a4c57600080fd5b50610a556121a2565b6040518082815260200191505060405180910390f35b348015610a7757600080fd5b50610a806121a8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ab857600080fd5b50610ac16121d1565b6040518082815260200191505060405180910390f35b348015610ae357600080fd5b50610aec6122d6565b6040518082815260200191505060405180910390f35b348015610b0e57600080fd5b50610b176122dc565b6040518082815260200191505060405180910390f35b348015610b3957600080fd5b50610b426122e2565b6040518082815260200191505060405180910390f35b348015610b6457600080fd5b50610b6d6122e8565b005b348015610b7b57600080fd5b50610b846124e4565b6040518082815260200191505060405180910390f35b348015610ba657600080fd5b50610baf6124ea565b6040518082815260200191505060405180910390f35b348015610bd157600080fd5b50610bfe60048036036020811015610be857600080fd5b81019080803590602001909291905050506124f0565b005b348015610c0c57600080fd5b50610c15612637565b6040518082815260200191505060405180910390f35b348015610c3757600080fd5b50610c4061263c565b6040518082815260200191505060405180910390f35b348015610c6257600080fd5b50610c6b612642565b6040518082815260200191505060405180910390f35b348015610c8d57600080fd5b50610cba60048036036020811015610ca457600080fd5b8101908080359060200190929190505050612648565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cf257600080fd5b50610d2160048036036020811015610d0957600080fd5b81019080803515159060200190929190505050612684565b005b348015610d2f57600080fd5b50610d7260048036036020811015610d4657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612718565b005b348015610d8057600080fd5b50610d8961281f565b005b348015610d9757600080fd5b50610da0612d67565b005b348015610dae57600080fd5b50610de560048036036040811015610dc557600080fd5b810190808035906020019092919080359060200190929190505050612eb6565b005b348015610df357600080fd5b50610dfc6130af565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e3457600080fd5b50610e3d6130c7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e7557600080fd5b50610e7e6130eb565b6040518082815260200191505060405180910390f35b348015610ea057600080fd5b50610ea96130f1565b6040518082815260200191505060405180910390f35b348015610ecb57600080fd5b50610f0e60048036036020811015610ee257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130f7565b005b348015610f1c57600080fd5b50610f6960048036036040811015610f3357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613302565b6040518082815260200191505060405180910390f35b348015610f8b57600080fd5b50610fb860048036036020811015610fa257600080fd5b810190808035906020019092919050505061370d565b005b348015610fc657600080fd5b50610fcf613852565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61012c81565b5b6000601354118015611018575060155460135411155b1561102a57611025613a55565b611002565b565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b600a5481565b600d5481565b60165481565b600c5481565b61271081565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b6126de81116112b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f2173616665202d20746f6f206c6f77000000000000000000000000000000000081525060200191505060405180910390fd5b612710811115611328576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f2173616665202d20746f6f20686967680000000000000000000000000000000081525060200191505060405180910390fd5b80600d8190555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b6113fd613af2565b61147e600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73cf6bb5389c92bdda8a3747ddb454cb7a64626c6373ffffffffffffffffffffffffffffffffffffffff166138789092919063ffffffff16565b61150b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138789092919063ffffffff16565b600260019054906101000a900460ff1661158e5761158d600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600060028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138789092919063ffffffff16565b5b565b73fd36e2c2a6789db23113685031d7f1632915838481565b60006115da6014546115cc6013546115be6121d1565b613be590919063ffffffff16565b613c6d90919063ffffffff16565b905090565b60095481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611615613cb7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6002600154141561174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550600260009054906101000a900460ff16156117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6117e16122e8565b600082905060006117f06115a8565b1180156117ff57506000600954115b1561185d5761185a61271061184c6118156115a8565b61183e600d546118306009548a613cbf90919063ffffffff16565b613cbf90919063ffffffff16565b613d4590919063ffffffff16565b613d4590919063ffffffff16565b90505b61187281600954613be590919063ffffffff16565b6009819055506118c533308560028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d8f909392919063ffffffff16565b6118cf6001613e50565b809150506001808190555092915050565b61271081565b73cf6bb5389c92bdda8a3747ddb454cb7a64626c6381565b6000600260009054906101000a900460ff16905090565b61025381565b600f818154811061192857fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c81565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a32576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260048152602001807f21676f760000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b73cf6bb5389c92bdda8a3747ddb454cb7a64626c6373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ae8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f217361666500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611baa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f217361666500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c6e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f217361666500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b611c9981838573ffffffffffffffffffffffffffffffffffffffff16613ea19092919063ffffffff16565b505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048181548110611cd157fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d08613cb7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dc8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61dead81565b601260009054906101000a900460ff1615611f6557600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b5b611f6d613a55565b565b600260019054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b61204d613f43565b6120af600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600073cf6bb5389c92bdda8a3747ddb454cb7a64626c6373ffffffffffffffffffffffffffffffffffffffff166138789092919063ffffffff16565b61211d600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600060028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138789092919063ffffffff16565b600260019054906101000a900460ff166121a05761219f600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600060028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138789092919063ffffffff16565b5b565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561225b57600080fd5b505afa15801561226f573d6000803e3d6000fd5b505050506040513d602081101561228557600080fd5b81019080805190602001909291905050509050600260019054906101000a900460ff16156122ce5760004790506122c58282613be590919063ffffffff16565b925050506122d3565b809150505b90565b60115481565b61025781565b60155481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af9e669306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561237357600080fd5b505af1158015612387573d6000803e3d6000fd5b505050506040513d602081101561239d57600080fd5b8101908080519060200190929190505050601381905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317bfdfbc306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561243f57600080fd5b505af1158015612453573d6000803e3d6000fd5b505050506040513d602081101561246957600080fd5b81019080805190602001909291905050506014819055506124ab60105461249d6103e8601454613cbf90919063ffffffff16565b613d4590919063ffffffff16565b6015819055506124dc6102576124ce6103e8601454613cbf90919063ffffffff16565b613d4590919063ffffffff16565b601681905550565b60145481565b61032081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b610320600c54111561262d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260088152602001807f746f6f206869676800000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600c8190555050565b600681565b6126de81565b60105481565b600e818154811061265557fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260015414156126fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b600260018190555061270e81613e50565b6001808190555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146127db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900460ff16156128a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b601260009054906101000a900460ff161561297b57600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461297a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b5b73fd36e2c2a6789db23113685031d7f1632915838473ffffffffffffffffffffffffffffffffffffffff1663adcd5fb9306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156129f857600080fd5b505af1158015612a0c573d6000803e3d6000fd5b50505050600073cf6bb5389c92bdda8a3747ddb454cb7a64626c6373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612a8d57600080fd5b505afa158015612aa1573d6000803e3d6000fd5b505050506040513d6020811015612ab757600080fd5b81019080805190602001909291905050509050612ad381614037565b9050612ade816140ff565b905060028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673cf6bb5389c92bdda8a3747ddb454cb7a64626c6373ffffffffffffffffffffffffffffffffffffffff1614612d5357600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed1739826000600e30612ba061025842613be590919063ffffffff16565b6040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281038252858181548152602001915080548015612c5857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612c0e575b50509650505050505050600060405180830381600087803b158015612c7c57600080fd5b505af1158015612c90573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015612cba57600080fd5b8101908080516040519392919084640100000000821115612cda57600080fd5b83820191506020820185811115612cf057600080fd5b8251866020820283011164010000000082111715612d0d57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612d44578082015181840152602081019050612d29565b50505050905001604052505050505b43600a81905550612d646000613e50565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b600260019054906101000a900460ff16612eac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f2177616e74497357424e4200000000000000000000000000000000000000000081525060200191505060405180910390fd5b612eb461446e565b565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b610253821115612ff1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f217261746500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6006811115613068576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260068152602001807f216465707468000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61309360007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6144f5565b81601081905550806011819055506130ab6001613e50565b5050565b73cf6bb5389c92bdda8a3747ddb454cb7a64626c6381565b60028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61271081565b60135481565b6130ff613cb7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146131bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061520f6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061330c613cb7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146133cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60026001541415613445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550600061347d61345a6115a8565b61346f60095486613cbf90919063ffffffff16565b613d4590919063ffffffff16565b905060095481111561348f5760095490505b6134a481600954613c6d90919063ffffffff16565b600981905550600060028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561353357600080fd5b505afa158015613547573d6000803e3d6000fd5b505050506040513d602081101561355d57600080fd5b81019080805190602001909291905050509050838110156136785761359560016135908387613c6d90919063ffffffff16565b6144f5565b600260019054906101000a900460ff16156135b3576135b261446e565b5b60028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561363a57600080fd5b505afa15801561364e573d6000803e3d6000fd5b505050506040513d602081101561366457600080fd5b810190808051906020019092919050505090505b83811015613684578093505b6136f1600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168560028054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ea19092919063ffffffff16565b6136fb6001613e50565b81925050506001808190555092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146137d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b61012c811115613848576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260088152602001807f746f6f206869676800000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600b8190555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000811480613946575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561390957600080fd5b505afa15801561391d573d6000803e3d6000fd5b505050506040513d602081101561393357600080fd5b8101908080519060200190929190505050145b61399b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806152a66036913960400191505060405180910390fd5b613a388363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614753565b505050565b6060613a4c8484600085614842565b90509392505050565b613a5d6122e8565b60155460135411613a8c57613a87613a82601654601354613c6d90919063ffffffff16565b6149eb565b613aac565b613aab613aa6601554601354613c6d90919063ffffffff16565b6149eb565b5b600260019054906101000a900460ff1615613ad757613ac9614a9f565b613ad247614be5565b613ae8565b613ae7613ae26121d1565b614be5565b5b613af06122e8565b565b600260009054906101000a900460ff16613b74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600260006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613bb8613cb7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600080828401905083811015613c63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613caf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614d37565b905092915050565b600033905090565b600080831415613cd25760009050613d3f565b6000828402905082848281613ce357fe5b0414613d3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061525b6021913960400191505060405180910390fd5b809150505b92915050565b6000613d8783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614df7565b905092915050565b613e4a846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614753565b50505050565b600260019054906101000a900460ff1615613e7c57613e6d614a9f565b613e774782614ebd565b613e8e565b613e8d613e876121d1565b82614ebd565b5b613e966122e8565b613e9e611001565b50565b613f3e8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614753565b505050565b600260009054906101000a900460ff1615613fc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600260006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861400a613cb7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000808211156140f6576000600b5411156140f5576000614077612710614069600b5486613cbf90919063ffffffff16565b613d4590919063ffffffff16565b90506140da600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168273cf6bb5389c92bdda8a3747ddb454cb7a64626c6373ffffffffffffffffffffffffffffffffffffffff16613ea19092919063ffffffff16565b6140ed8184613c6d90919063ffffffff16565b9150506140fa565b5b8190505b919050565b600080600c541161411257819050614469565b600061413d61271061412f600c5486613cbf90919063ffffffff16565b613d4590919063ffffffff16565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed1739826000600f3061025842016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818154815260200191508054801561424057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116141f6575b50509650505050505050600060405180830381600087803b15801561426457600080fd5b505af1158015614278573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156142a257600080fd5b81019080805160405193929190846401000000008211156142c257600080fd5b838201915060208201858111156142d857600080fd5b82518660208202830111640100000000821117156142f557600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561432c578082015181840152602081019050614311565b50505050905001604052505050506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156143c557600080fd5b505afa1580156143d9573d6000803e3d6000fd5b505050506040513d60208110156143ef57600080fd5b8101908080519060200190929190505050905061445161dead82600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ea19092919063ffffffff16565b6144648285613c6d90919063ffffffff16565b925050505b919050565b600047905060008111156144f25773bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156144d857600080fd5b505af11580156144ec573d6000803e3d6000fd5b50505050505b50565b6144fd6122e8565b614505611001565b600260019054906101000a900460ff16156145235761452261446e565b5b61454261453d601654601354613c6d90919063ffffffff16565b6149eb565b600061454c6121d1565b90505b6014548110156145b0578280156145665750818110155b15614571575061474f565b61457a81614be5565b6145826122e8565b6145a161459c601654601354613c6d90919063ffffffff16565b6149eb565b6145a96121d1565b905061454f565b8280156145bd5750818110155b156145c8575061474f565b6145d3601454614be5565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561465e57600080fd5b505afa158015614672573d6000803e3d6000fd5b505050506040513d602081101561468857600080fd5b81019080805190602001909291905050509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561471057600080fd5b505af1158015614724573d6000803e3d6000fd5b505050506040513d602081101561473a57600080fd5b81019080805190602001909291905050505050505b5050565b60606147b5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613a3d9092919063ffffffff16565b905060008151111561483d578080602001905160208110156147d657600080fd5b810190808051906020019092919050505061483c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061527c602a913960400191505060405180910390fd5b5b505050565b60608247101561489d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806152356026913960400191505060405180910390fd5b6148a685614f29565b614918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106149685780518252602082019150602081019050602083039250614945565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146149ca576040519150601f19603f3d011682016040523d82523d6000602084013e6149cf565b606091505b50915091506149df828286614f3c565b92505050949350505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663852a12e3826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015614a6057600080fd5b505af1158015614a74573d6000803e3d6000fd5b505050506040513d6020811015614a8a57600080fd5b81019080805190602001909291905050505050565b600073bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614b1c57600080fd5b505afa158015614b30573d6000803e3d6000fd5b505050506040513d6020811015614b4657600080fd5b810190808051906020019092919050505090506000811115614be25773bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015614bc957600080fd5b505af1158015614bdd573d6000803e3d6000fd5b505050505b50565b600260019054906101000a900460ff1615614c8257600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e4d9fea826040518263ffffffff1660e01b81526004016000604051808303818588803b158015614c6457600080fd5b505af1158015614c78573d6000803e3d6000fd5b5050505050614d34565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e752702826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015614cf757600080fd5b505af1158015614d0b573d6000803e3d6000fd5b505050506040513d6020811015614d2157600080fd5b8101908080519060200190929190505050505b50565b6000838311158290614de4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614da9578082015181840152602081019050614d8e565b50505050905090810190601f168015614dd65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290614ea3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614e68578082015181840152602081019050614e4d565b50505050905090810190601f168015614e955780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614eaf57fe5b049050809150509392505050565b8015614f1c5760005b601154811015614f1a57614ed983615008565b614f026103e8614ef460105486613cbf90919063ffffffff16565b613d4590919063ffffffff16565b9250614f0d8361515a565b8080600101915050614ec6565b505b614f2582615008565b5050565b600080823b905060008111915050919050565b60608315614f4c57829050615001565b600083511115614f5f5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614fc6578082015181840152602081019050614fab565b50505050905090810190601f168015614ff35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b600260019054906101000a900460ff16156150a557600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631249c58b826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561508757600080fd5b505af115801561509b573d6000803e3d6000fd5b5050505050615157565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561511a57600080fd5b505af115801561512e573d6000803e3d6000fd5b505050506040513d602081101561514457600080fd5b8101908080519060200190929190505050505b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c5ebeaec826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156151cf57600080fd5b505af11580156151e3573d6000803e3d6000fd5b505050506040513d60208110156151f957600080fd5b8101908080519060200190929190505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212206fe4d61960b5535511cf93e587d3342296a075d1b054ef6db17f7a89a6e8b39064736f6c634300060c00334f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000000028579eca0a326e53340edd93e18698d379876a040000000000000000000000000895196562c7868c5be92459fae7f877ed450452000000000000000000000000a184088a740c695e156f91f5cc086a06bb78b82700000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000fd5840cd36d94d7229439859c0112a4185bc025500000000000000000000000005ff2b0db69458a0750badebc4f9e13add608c7f
Deployed ByteCode Sourcemap
44733:18015:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45751:45;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52580:549;;;;;;;;;;;;;:::i;:::-;;61263:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45603:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46094:39;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47384:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45822:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45684:48;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44967:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45478:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;60284:345;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58889:371;;;;;;;;;;;;;:::i;:::-;;45330:102;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;59819:131;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45566:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45511:25;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49652:767;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45861:46;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45174:90;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35483:78;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;46944:45;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46418:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45078:89;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;61412:385;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45038:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45002:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32307:148;;;;;;;;;;;;;:::i;:::-;;45993:92;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;51685:172;;;;;;;;;;;;;:::i;:::-;;44897:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;58483:347;;;;;;;;;;;;;:::i;:::-;;45644:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31665:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;59958:318;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46907:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46996:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47270:36;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59424:387;;;;;;;;;;;;;:::i;:::-;;47200:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45926:43;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60878:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47053:44;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46262:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46869:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46379:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50427:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61106:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55507:832;;;;;;;;;;;;;:::i;:::-;;62546:162;;;;;;;;;;;;;:::i;:::-;;55058:441;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45271:52;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44934:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;46203:52;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47132:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32610:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57440:986;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60637:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45441:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45751:45;45793:3;45751:45;:::o;52580:549::-;53022:100;53041:1;53029:9;;:13;:47;;;;;53059:17;;53046:9;;:30;;53029:47;53022:100;;;53093:17;:15;:17::i;:::-;53022:100;;;52580:549::o;61263:141::-;61338:10;;;;;;;;;;;61324:24;;:10;:24;;;61316:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61388:8;61378:7;;:18;;;;;;;;;;;;;;;;;;61263:141;:::o;45603:32::-;;;;:::o;46094:39::-;;;;:::o;47384:31::-;;;;:::o;45822:32::-;;;;:::o;45684:48::-;45727:5;45684:48;:::o;44967:28::-;;;;;;;;;;;;;:::o;45478:26::-;;;;;;;;;;;;;:::o;60284:345::-;60382:10;;;;;;;;;;;60368:24;;:10;:24;;;60360:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46308:4;60430:18;:40;60422:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46250:5;60509:18;:42;;60501:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60603:18;60583:17;:38;;;;60284:345;:::o;58889:371::-;58950:10;;;;;;;;;;;58936:24;;:10;:24;;;58928:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58990:10;:8;:10::i;:::-;59013:63;59046:16;;;;;;;;;;;59072:2;45222:42;59013:32;;;;:63;;;;;:::i;:::-;59087:62;59119:16;;;;;;;;;;;59145:2;59094:11;;;;;;;;;;59087:31;;;;:62;;;;;:::i;:::-;59165:10;;;;;;;;;;;59160:93;;59192:49;59224:13;;;;;;;;;;;59239:1;59199:11;;;;;;;;;;59192:31;;;;:49;;;;;:::i;:::-;59160:93;58889:371::o;45330:102::-;45390:42;45330:102;:::o;59819:131::-;59867:7;59894:48;59932:9;;59894:33;59917:9;;59894:18;:16;:18::i;:::-;:22;;:33;;;;:::i;:::-;:37;;:48;;;;:::i;:::-;59887:55;;59819:131;:::o;45566:30::-;;;;:::o;45511:25::-;;;;;;;;;;;;;:::o;49652:767::-;49807:7;31887:12;:10;:12::i;:::-;31877:22;;:6;;;;;;;;;;:22;;;31869:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33892:1:::1;34497:7;;:19;;34489:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;33892:1;34630:7;:18;;;;35801:7:::2;;;;;;;;;;;35800:8;35792:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;49832:15:::3;:13;:15::i;:::-;49860:19;49882:8;49860:30;;49925:1;49905:17;:15;:17::i;:::-;:21;:40;;;;;49944:1;49930:11;;:15;49905:40;49901:256;;;49976:169;46250:5;49976:125;50083:17;:15;:17::i;:::-;49976:84;50042:17;;49976:43;50007:11;;49976:8;:30;;:43;;;;:::i;:::-;:65;;:84;;;;:::i;:::-;:106;;:125;;;;:::i;:::-;:147;;:169;;;;:::i;:::-;49962:183;;49901:256;50183:28;50199:11;50183;;:15;;:28;;;;:::i;:::-;50169:11;:42;;;;50224:132;50283:10;50317:4;50337:8;50231:11;::::0;::::3;;;;;;;;50224:36;;;;:132;;;;;;:::i;:::-;50369:11;50375:4;50369:5;:11::i;:::-;50400;50393:18;;;33848:1:::1;34809:7:::0;:22:::1;;;;49652:767:::0;;;;:::o;45861:46::-;45902:5;45861:46;:::o;45174:90::-;45222:42;45174:90;:::o;35483:78::-;35522:4;35546:7;;;;;;;;;;;35539:14;;35483:78;:::o;46944:45::-;46986:3;46944:45;:::o;46418:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45078:89::-;45125:42;45078:89;:::o;61412:385::-;61562:10;;;;;;;;;;;61548:24;;:10;:24;;;61540:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45222:42;61600:23;;:6;:23;;;;61592:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61662:11;;;;;;;;;;61652:21;;:6;:21;;;;61644:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61712:13;;;;;;;;;;;61702:23;;:6;:23;;;;61694:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61748;61776:3;61781:7;61755:6;61748:27;;;;:41;;;;;:::i;:::-;61412:385;;;:::o;45038:31::-;;;;;;;;;;;;;:::o;45002:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32307:148::-;31887:12;:10;:12::i;:::-;31877:22;;:6;;;;;;;;;;:22;;;31869:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32414:1:::1;32377:40;;32398:6;::::0;::::1;;;;;;;;32377:40;;;;;;;;;;;;32445:1;32428:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;32307:148::o:0;45993:92::-;46043:42;45993:92;:::o;51685:172::-;51733:7;;;;;;;;;;;51729:91;;;51779:10;;;;;;;;;;;51765:24;;:10;:24;;;51757:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51729:91;51832:17;:15;:17::i;:::-;51685:172::o;44897:30::-;;;;;;;;;;;;;:::o;58483:347::-;58540:10;;;;;;;;;;;58526:24;;:10;:24;;;58518:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58582:8;:6;:8::i;:::-;58603:53;58636:16;;;;;;;;;;;58654:1;45222:42;58603:32;;;;:53;;;;;:::i;:::-;58667:52;58699:16;;;;;;;;;;;58717:1;58674:11;;;;;;;;;;58667:31;;;;:52;;;;;:::i;:::-;58735:10;;;;;;;;;;;58730:93;;58762:49;58794:13;;;;;;;;;;;58809:1;58769:11;;;;;;;;;;58762:31;;;;:49;;;;;:::i;:::-;58730:93;58483:347::o;45644:33::-;;;;:::o;31665:79::-;31703:7;31730:6;;;;;;;;;;;31723:13;;31665:79;:::o;59958:318::-;60007:7;60027:15;60052:11;;;;;;;;;;60045:29;;;60083:4;60045:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60027:62;;60104:10;;;;;;;;;;;60100:169;;;60131:14;60148:21;60131:38;;60191:19;60202:7;60191:6;:10;;:19;;;;:::i;:::-;60184:26;;;;;;60100:169;60250:7;60243:14;;;59958:318;;:::o;46907:30::-;;;;:::o;46996:50::-;47043:3;46996:50;:::o;47270:36::-;;;;:::o;59424:387::-;59487:13;;;;;;;;;;;59479:42;;;59530:4;59479:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59467:9;:69;;;;59616:13;;;;;;;;;;;59608:43;;;59660:4;59608:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59596:9;:70;;;;59697:35;59721:10;;59697:19;59711:4;59697:9;;:13;;:19;;;;:::i;:::-;:23;;:35;;;;:::i;:::-;59677:17;:55;;;;59758:45;47043:3;59758:19;59772:4;59758:9;;:13;;:19;;;;:::i;:::-;:23;;:45;;;;:::i;:::-;59743:12;:60;;;;59424:387::o;47200:28::-;;;;:::o;45926:43::-;45966:3;45926:43;:::o;60878:220::-;60964:10;;;;;;;;;;;60950:24;;:10;:24;;;60942:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45966:3;61012:11;;:28;;61004:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61078:12;61064:11;:26;;;;60878:220;:::o;47053:44::-;47096:1;47053:44;:::o;46262:50::-;46308:4;46262:50;:::o;46869:31::-;;;;:::o;46379:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50427:83::-;33892:1;34497:7;;:19;;34489:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33892:1;34630:7;:18;;;;50487:15:::1;50493:8;50487:5;:15::i;:::-;33848:1:::0;34809:7;:22;;;;50427:83;:::o;61106:149::-;61183:10;;;;;;;;;;;61169:24;;:10;:24;;;61161:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61236:11;61223:10;;:24;;;;;;;;;;;;;;;;;;61106:149;:::o;55507:832::-;35801:7;;;;;;;;;;;35800:8;35792:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55561:7:::1;;;;;;;;;;;55557:91;;;55607:10;;;;;;;;;;;55593:24;;:10;:24;;;55585:51;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;55557:91;45390:42;55660:55;;;55724:4;55660:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55743:17;45222:42;55763:30;;;55802:4;55763:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;55743:65;;55833:25;55848:9;55833:14;:25::i;:::-;55821:37;;55881:18;55889:9;55881:7;:18::i;:::-;55869:30;;55932:11;::::0;::::1;;;;;;;;55916:27;;45222:42;55916:27;;;55912:279;;55977:16;;;;;;;;;;;55960:59;;;56038:9;56066:1;56086:15;56128:4;56152:12;56160:3;56152;:7;;:12;;;;:::i;:::-;55960:219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;55912:279;56219:12;56203:13;:28;;;;56244:12;56250:5;56244;:12::i;:::-;35840:1;55507:832::o:0;62546:162::-;62605:10;;;;;;;;;;;62591:24;;:10;:24;;;62583:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62653:10;;;;;;;;;;;62645:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62690:10;:8;:10::i;:::-;62546:162::o;55058:441::-;55162:10;;;;;;;;;;;55148:24;;:10;:24;;;55140:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46986:3;55212:11;:30;;55204:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47096:1;55271:12;:32;;55263:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55327:31;55339:5;55354:2;55327:11;:31::i;:::-;55421:11;55408:10;:24;;;;55457:12;55443:11;:26;;;;55480:11;55486:4;55480:5;:11::i;:::-;55058:441;;:::o;45271:52::-;45222:42;45271:52;:::o;44934:26::-;;;;;;;;;;;;:::o;46203:52::-;46250:5;46203:52;:::o;47132:28::-;;;;:::o;32610:281::-;31887:12;:10;:12::i;:::-;31877:22;;:6;;;;;;;;;;:22;;;31869:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32733:1:::1;32713:22;;:8;:22;;;;32691:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32846:8;32817:38;;32838:6;::::0;::::1;;;;;;;;32817:38;;;;;;;;;;;;32875:8;32866:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;32610:281:::0;:::o;57440:986::-;57575:7;31887:12;:10;:12::i;:::-;31877:22;;:6;;;;;;;;;;:22;;;31869:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33892:1:::1;34497:7;;:19;;34489:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;33892:1;34630:7;:18;;;;57600:21:::2;57637:48;57667:17;:15;:17::i;:::-;57637:25;57650:11;;57637:8;:12;;:25;;;;:::i;:::-;:29;;:48;;;;:::i;:::-;57600:85;;57716:11;;57700:13;:27;57696:87;;;57760:11;;57744:27;;57696:87;57807:30;57823:13;57807:11;;:15;;:30;;;;:::i;:::-;57793:11;:44;;;;57850:15;57875:11;::::0;::::2;;;;;;;;57868:29;;;57906:4;57868:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;57850:62;;57937:8;57927:7;:18;57923:286;;;57962:40;57974:4;57980:21;57993:7;57980:8;:12;;:21;;;;:::i;:::-;57962:11;:40::i;:::-;58021:10;;;;;;;;;;;58017:112;;;58052:10;:8;:10::i;:::-;58017:112;58160:11;::::0;::::2;;;;;;;;58153:29;;;58191:4;58153:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;58143:54;;57923:286;58235:8;58225:7;:18;58221:69;;;58271:7;58260:18;;58221:69;58302:59;58335:15;;;;;;;;;;;58352:8;58309:11;::::0;::::2;;;;;;;;58302:32;;;;:59;;;;;:::i;:::-;58374:11;58380:4;58374:5;:11::i;:::-;58405:13;58398:20;;;;33848:1:::1;34809:7:::0;:22:::1;;;;57440:986:::0;;;;:::o;60637:233::-;60727:10;;;;;;;;;;;60713:24;;:10;:24;;;60705:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45793:3;60775:14;:33;;60767:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60848:14;60832:13;:30;;;;60637:233;:::o;45441:30::-;;;;;;;;;;;;;:::o;28056:707::-;28483:1;28474:5;:10;28473:62;;;;28533:1;28490:5;:15;;;28514:4;28521:7;28490:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;28473:62;28451:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28628:127;28662:5;28705:22;;;28729:7;28738:5;28682:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28628:19;:127::i;:::-;28056:707;;;:::o;22242:229::-;22379:12;22411:52;22433:6;22441:4;22447:1;22450:12;22411:21;:52::i;:::-;22404:59;;22242:229;;;;;:::o;51865:628::-;51912:15;:13;:15::i;:::-;52025:17;;52012:9;;:30;52008:185;;52059:42;52073:27;52087:12;;52073:9;;:13;;:27;;;;:::i;:::-;52059:13;:42::i;:::-;52008:185;;;52134:47;52148:32;52162:17;;52148:9;;:13;;:32;;;;:::i;:::-;52134:13;:47::i;:::-;52008:185;52209:10;;;;;;;;;;;52205:185;;;52236:12;:10;:12::i;:::-;52278:35;52291:21;52278:12;:35::i;:::-;52205:185;;;52346:32;52359:18;:16;:18::i;:::-;52346:12;:32::i;:::-;52205:185;52402:15;:13;:15::i;:::-;51865:628::o;36532:120::-;36077:7;;;;;;;;;;;36069:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36601:5:::1;36591:7;;:15;;;;;;;;;;;;;;;;;;36622:22;36631:12;:10;:12::i;:::-;36622:22;;;;;;;;;;;;;;;;;;;;36532:120::o:0;819:181::-;877:7;897:9;913:1;909;:5;897:17;;938:1;933;:6;;925:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;991:1;984:8;;;819:181;;;;:::o;1283:136::-;1341:7;1368:43;1372:1;1375;1368:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1361:50;;1283:136;;;;:::o;202:106::-;255:15;290:10;283:17;;202:106;:::o;2207:471::-;2265:7;2515:1;2510;:6;2506:47;;;2540:1;2533:8;;;;2506:47;2565:9;2581:1;2577;:5;2565:17;;2610:1;2605;2601;:5;;;;;;:10;2593:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2669:1;2662:8;;;2207:471;;;;;:::o;3154:132::-;3212:7;3239:39;3243:1;3246;3239:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3232:46;;3154:132;;;;:::o;27502:285::-;27646:133;27680:5;27723:27;;;27752:4;27758:2;27762:5;27700:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27646:19;:133::i;:::-;27502:285;;;;:::o;50518:419::-;50572:10;;;;;;;;;;;50568:229;;;50599:12;:10;:12::i;:::-;50671:42;50681:21;50704:8;50671:9;:42::i;:::-;50568:229;;;50746:39;50756:18;:16;:18::i;:::-;50776:8;50746:9;:39::i;:::-;50568:229;50809:15;:13;:15::i;:::-;50837:31;:29;:31::i;:::-;50518:419;:::o;27246:248::-;27363:123;27397:5;27440:23;;;27465:2;27469:5;27417:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27363:19;:123::i;:::-;27246:248;;;:::o;36273:118::-;35801:7;;;;;;;;;;;35800:8;35792:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36343:4:::1;36333:7;;:14;;;;;;;;;;;;;;;;;;36363:20;36370:12;:10;:12::i;:::-;36363:20;;;;;;;;;;;;;;;;;;;;36273:118::o:0;57009:423::-;57071:7;57108:1;57095:10;:14;57091:304;;;57146:1;57130:13;;:17;57126:258;;;57168:11;57203:51;45727:5;57203:29;57218:13;;57203:10;:14;;:29;;;;:::i;:::-;:33;;:51;;;;:::i;:::-;57168:86;;57273:50;57307:10;;;;;;;;;;;57319:3;45222:42;57273:33;;;;:50;;;;;:::i;:::-;57349:19;57364:3;57349:10;:14;;:19;;;;:::i;:::-;57342:26;;;;;57126:258;57091:304;57414:10;57407:17;;57009:423;;;;:::o;56347:654::-;56402:7;56441:1;56426:11;;:16;56422:66;;56466:10;56459:17;;;;56422:66;56500:18;56521:47;45902:5;56521:27;56536:11;;56521:10;:14;;:27;;;;:::i;:::-;:31;;:47;;;;:::i;:::-;56500:68;;56598:16;;;;;;;;;;;56581:59;;;56655:10;56680:1;56696:16;56735:4;56761:3;56755;:9;56581:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56817:15;56842:11;;;;;;;;;;;56835:29;;;56873:4;56835:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56817:62;;56890:57;46043:42;56939:7;56897:11;;;;;;;;;;;56890:32;;;;:57;;;;;:::i;:::-;56967:26;56982:10;56967;:14;;:26;;;;:::i;:::-;56960:33;;;;56347:654;;;;:::o;61805:221::-;61869:14;61886:21;61869:38;;61931:1;61922:6;:10;61918:101;;;45125:42;61949:26;;;61983:6;61949:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61918:101;61805:221;:::o;53441:1373::-;53519:15;:13;:15::i;:::-;53615:31;:29;:31::i;:::-;53663:10;;;;;;;;;;;53659:68;;;53690:10;:8;:10::i;:::-;53659:68;53739:42;53753:27;53767:12;;53753:9;;:13;;:27;;;;:::i;:::-;53739:13;:42::i;:::-;53794:15;53812:18;:16;:18::i;:::-;53794:36;;53910:478;53927:9;;53917:7;:19;53910:478;;;54057:13;:35;;;;;54085:7;54074;:18;;54057:35;54053:82;;;54113:7;;;54053:82;54151:21;54164:7;54151:12;:21::i;:::-;54189:15;:13;:15::i;:::-;54289:42;54303:27;54317:12;;54303:9;;:13;;:27;;;;:::i;:::-;54289:13;:42::i;:::-;54358:18;:16;:18::i;:::-;54348:28;;53910:478;;;54492:13;:35;;;;;54520:7;54509;:18;;54492:35;54488:74;;;54544:7;;;54488:74;54621:23;54634:9;;54621:12;:23::i;:::-;54689:17;54716:13;;;;;;;;;;;54709:31;;;54749:4;54709:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54689:66;;54774:13;;;;;;;;;;;54766:29;;;54796:9;54766:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53441:1373;;;;;:::o;30136:885::-;30560:23;30599:118;30645:4;30599:118;;;;;;;;;;;;;;;;;30607:5;30599:27;;;;:118;;;;;:::i;:::-;30560:157;;30752:1;30732:10;:17;:21;30728:286;;;30905:10;30894:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30868:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30728:286;30136:885;;;:::o;23458:621::-;23628:12;23700:5;23675:21;:30;;23653:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23790:18;23801:6;23790:10;:18::i;:::-;23782:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23916:12;23930:23;23970:6;:11;;23989:5;23996:4;23970:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23915:86;;;;24019:52;24037:7;24046:10;24058:12;24019:17;:52::i;:::-;24012:59;;;;23458:621;;;;;;:::o;49177:116::-;49245:13;;;;;;;;;;;49237:39;;;49277:7;49237:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49177:116;:::o;62034:226::-;62100:15;45125:42;62118:29;;;62156:4;62118:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62100:62;;62187:1;62177:7;:11;62173:80;;;45125:42;62205:27;;;62233:7;62205:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62173:80;62034:226;:::o;49409:235::-;49472:10;;;;;;;;;;;49468:169;;;49505:13;;;;;;;;;;;49499:32;;;49539:7;49499:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49468:169;;;49590:13;;;;;;;;;;;49582:34;;;49617:7;49582:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49468:169;49409:235;:::o;1722:226::-;1842:7;1875:1;1870;:6;;1878:12;1862:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1902:9;1918:1;1914;:5;1902:17;;1939:1;1932:8;;;1722:226;;;;;:::o;3782:312::-;3902:7;3934:1;3930;:5;3937:12;3922:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3961:9;3977:1;3973;:5;;;;;;3961:17;;4085:1;4078:8;;;3782:312;;;;;:::o;51102:386::-;51177:8;51173:230;;;51207:9;51202:190;51226:11;;51222:1;:15;51202:190;;;51263:16;51271:7;51263;:16::i;:::-;51308:33;51336:4;51308:23;51320:10;;51308:7;:11;;:23;;;;:::i;:::-;:27;;:33;;;;:::i;:::-;51298:43;;51360:16;51368:7;51360;:16::i;:::-;51239:3;;;;;;;51202:190;;;;51173:230;51415:16;51423:7;51415;:16::i;:::-;51102:386;;:::o;19205:444::-;19265:4;19473:12;19597:7;19585:20;19577:28;;19640:1;19633:4;:8;19626:15;;;19205:444;;;:::o;26370:777::-;26520:12;26549:7;26545:595;;;26580:10;26573:17;;;;26545:595;26714:1;26694:10;:17;:21;26690:439;;;26957:10;26951:17;27018:15;27005:10;27001:2;26997:19;26990:44;26905:148;27100:12;27093:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26370:777;;;;;;:::o;48953:216::-;49011:10;;;;;;;;;;;49007:155;;;49044:13;;;;;;;;;;;49038:25;;;49071:7;49038:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49007:155;;;49122:13;;;;;;;;;;;49114:27;;;49142:7;49114:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49007:155;48953:216;:::o;49301:100::-;49363:13;;;;;;;;;;;49355:29;;;49385:7;49355:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49301:100;:::o
Swarm Source
ipfs://6fe4d61960b5535511cf93e587d3342296a075d1b054ef6db17f7a89a6e8b390
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.