PSA: API Key will be required starting from April 15th, 2021. Learn More
Contract Overview
My Name Tag:
Not Available, login to update
[ 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 0x1113feb76fd1373b59afc43c081ec8e33e272df6
Contract Name:
StratX
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; // import "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 {} } // import "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" ); } } } // import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/EnumerableSet.sol"; library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require( set._values.length > index, "EnumerableSet: index out of bounds" ); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // import "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; } } interface IPancakeswapFarm { function poolLength() external view returns (uint256); function userInfo() external view returns (uint256); // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) external view returns (uint256); // View function to see pending CAKEs on frontend. function pendingCake(uint256 _pid, address _user) external view returns (uint256); // Deposit LP tokens to MasterChef for CAKE allocation. function deposit(uint256 _pid, uint256 _amount) external; // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) external; // Stake CAKE tokens to MasterChef function enterStaking(uint256 _amount) external; // Withdraw CAKE tokens from STAKING. function leaveStaking(uint256 _amount) external; // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) external; } 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; } // "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()); } } contract StratX is Ownable, ReentrancyGuard, Pausable { // Maximises yields in pancakeswap using SafeMath for uint256; using SafeERC20 for IERC20; bool public isCAKEStaking; // only for staking CAKE using pancakeswap's native CAKE staking contract. bool public isAutoComp; // this vault is purely for staking. eg. WBNB-AUTO staking vault. address public farmContractAddress; // address of farm, eg, PCS, Thugs etc. uint256 public pid; // pid of pool in farmContractAddress address public wantAddress; address public token0Address; address public token1Address; address public earnedAddress; address public uniRouterAddress; // uniswap, pancakeswap etc address public constant wbnbAddress = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c; address public autoFarmAddress; address public AUTOAddress; address public govAddress; // timelock contract bool public onlyGov = true; uint256 public lastEarnBlock = 0; uint256 public wantLockedTotal = 0; uint256 public sharesTotal = 0; uint256 public controllerFee = 20; uint256 public constant controllerFeeMax = 10000; // 100 = 1% uint256 public constant controllerFeeUL = 300; uint256 public buyBackRate = 150; uint256 public constant buyBackRateMax = 10000; // 100 = 1% uint256 public constant buyBackRateUL = 800; 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 earnedToAUTOPath; address[] public earnedToToken0Path; address[] public earnedToToken1Path; address[] public token0ToEarnedPath; address[] public token1ToEarnedPath; constructor( address _govAddress, address _autoFarmAddress, address _AUTOAddress, bool _isCAKEStaking, bool _isAutoComp, address _farmContractAddress, uint256 _pid, address _wantAddress, address _token0Address, address _token1Address, address _earnedAddress, address _uniRouterAddress ) public { govAddress = _govAddress; autoFarmAddress = _autoFarmAddress; AUTOAddress = _AUTOAddress; isCAKEStaking = _isCAKEStaking; isAutoComp = _isAutoComp; wantAddress = _wantAddress; if (isAutoComp) { if (!isCAKEStaking) { token0Address = _token0Address; token1Address = _token1Address; } farmContractAddress = _farmContractAddress; pid = _pid; earnedAddress = _earnedAddress; uniRouterAddress = _uniRouterAddress; earnedToAUTOPath = [earnedAddress, wbnbAddress, AUTOAddress]; if (wbnbAddress == earnedAddress) { earnedToAUTOPath = [wbnbAddress, AUTOAddress]; } earnedToToken0Path = [earnedAddress, wbnbAddress, token0Address]; if (wbnbAddress == token0Address) { earnedToToken0Path = [earnedAddress, wbnbAddress]; } earnedToToken1Path = [earnedAddress, wbnbAddress, token1Address]; if (wbnbAddress == token1Address) { earnedToToken1Path = [earnedAddress, wbnbAddress]; } token0ToEarnedPath = [token0Address, wbnbAddress, earnedAddress]; if (wbnbAddress == token0Address) { token0ToEarnedPath = [wbnbAddress, earnedAddress]; } token1ToEarnedPath = [token1Address, wbnbAddress, earnedAddress]; if (wbnbAddress == token1Address) { token1ToEarnedPath = [wbnbAddress, earnedAddress]; } } transferOwnership(autoFarmAddress); } // Receives new deposits from user function deposit(address _userAddress, uint256 _wantAmt) public onlyOwner whenNotPaused returns (uint256) { IERC20(wantAddress).safeTransferFrom( address(msg.sender), address(this), _wantAmt ); uint256 sharesAdded = _wantAmt; if (wantLockedTotal > 0) { sharesAdded = _wantAmt .mul(sharesTotal) .mul(entranceFeeFactor) .div(wantLockedTotal) .div(entranceFeeFactorMax); } sharesTotal = sharesTotal.add(sharesAdded); if (isAutoComp) { _farm(); } else { wantLockedTotal = wantLockedTotal.add(_wantAmt); } return sharesAdded; } function farm() public nonReentrant { _farm(); } function _farm() internal { uint256 wantAmt = IERC20(wantAddress).balanceOf(address(this)); wantLockedTotal = wantLockedTotal.add(wantAmt); IERC20(wantAddress).safeIncreaseAllowance(farmContractAddress, wantAmt); if (isCAKEStaking) { IPancakeswapFarm(farmContractAddress).enterStaking(wantAmt); // Just for CAKE staking, we dont use deposit() } else { IPancakeswapFarm(farmContractAddress).deposit(pid, wantAmt); } } function withdraw(address _userAddress, uint256 _wantAmt) public onlyOwner nonReentrant returns (uint256) { require(_wantAmt > 0, "_wantAmt <= 0"); if (isAutoComp) { if (isCAKEStaking) { IPancakeswapFarm(farmContractAddress).leaveStaking(_wantAmt); // Just for CAKE staking, we dont use withdraw() } else { IPancakeswapFarm(farmContractAddress).withdraw(pid, _wantAmt); } } uint256 wantAmt = IERC20(wantAddress).balanceOf(address(this)); if (_wantAmt > wantAmt) { _wantAmt = wantAmt; } if (wantLockedTotal < _wantAmt) { _wantAmt = wantLockedTotal; } uint256 sharesRemoved = _wantAmt.mul(sharesTotal).div(wantLockedTotal); if (sharesRemoved > sharesTotal) { sharesRemoved = sharesTotal; } sharesTotal = sharesTotal.sub(sharesRemoved); wantLockedTotal = wantLockedTotal.sub(_wantAmt); IERC20(wantAddress).safeTransfer(autoFarmAddress, _wantAmt); return sharesRemoved; } // 1. Harvest farm tokens // 2. Converts farm tokens into want tokens // 3. Deposits want tokens function earn() public whenNotPaused { require(isAutoComp, "!isAutoComp"); if (onlyGov) { require(msg.sender == govAddress, "Not authorised"); } // Harvest farm tokens if (isCAKEStaking) { IPancakeswapFarm(farmContractAddress).leaveStaking(0); // Just for CAKE staking, we dont use withdraw() } else { IPancakeswapFarm(farmContractAddress).withdraw(pid, 0); } // Converts farm tokens into want tokens uint256 earnedAmt = IERC20(earnedAddress).balanceOf(address(this)); earnedAmt = distributeFees(earnedAmt); earnedAmt = buyBack(earnedAmt); if (isCAKEStaking) { lastEarnBlock = block.number; _farm(); return; } IERC20(earnedAddress).safeIncreaseAllowance( uniRouterAddress, earnedAmt ); if (earnedAddress != token0Address) { // Swap half earned to token0 IPancakeRouter02(uniRouterAddress) .swapExactTokensForTokensSupportingFeeOnTransferTokens( earnedAmt.div(2), 0, earnedToToken0Path, address(this), now + 60 ); } if (earnedAddress != token1Address) { // Swap half earned to token1 IPancakeRouter02(uniRouterAddress) .swapExactTokensForTokensSupportingFeeOnTransferTokens( earnedAmt.div(2), 0, earnedToToken1Path, address(this), now + 60 ); } // Get want tokens, ie. add liquidity uint256 token0Amt = IERC20(token0Address).balanceOf(address(this)); uint256 token1Amt = IERC20(token1Address).balanceOf(address(this)); if (token0Amt > 0 && token1Amt > 0) { IERC20(token0Address).safeIncreaseAllowance( uniRouterAddress, token0Amt ); IERC20(token1Address).safeIncreaseAllowance( uniRouterAddress, token1Amt ); IPancakeRouter02(uniRouterAddress).addLiquidity( token0Address, token1Address, token0Amt, token1Amt, 0, 0, address(this), now + 60 ); } lastEarnBlock = block.number; _farm(); } function buyBack(uint256 _earnedAmt) internal returns (uint256) { if (buyBackRate <= 0) { return _earnedAmt; } uint256 buyBackAmt = _earnedAmt.mul(buyBackRate).div(buyBackRateMax); IERC20(earnedAddress).safeIncreaseAllowance( uniRouterAddress, buyBackAmt ); IPancakeRouter02(uniRouterAddress) .swapExactTokensForTokensSupportingFeeOnTransferTokens( buyBackAmt, 0, earnedToAUTOPath, buyBackAddress, now + 60 ); return _earnedAmt.sub(buyBackAmt); } function distributeFees(uint256 _earnedAmt) internal returns (uint256) { if (_earnedAmt > 0) { // Performance fee if (controllerFee > 0) { uint256 fee = _earnedAmt.mul(controllerFee).div(controllerFeeMax); IERC20(earnedAddress).safeTransfer(govAddress, fee); _earnedAmt = _earnedAmt.sub(fee); } } return _earnedAmt; } function convertDustToEarned() public whenNotPaused { require(isAutoComp, "!isAutoComp"); require(!isCAKEStaking, "isCAKEStaking"); // Converts dust tokens into earned tokens, which will be reinvested on the next earn(). // Converts token0 dust (if any) to earned tokens uint256 token0Amt = IERC20(token0Address).balanceOf(address(this)); if (token0Address != earnedAddress && token0Amt > 0) { IERC20(token0Address).safeIncreaseAllowance( uniRouterAddress, token0Amt ); // Swap all dust tokens to earned tokens IPancakeRouter02(uniRouterAddress) .swapExactTokensForTokensSupportingFeeOnTransferTokens( token0Amt, 0, token0ToEarnedPath, address(this), now + 60 ); } // Converts token1 dust (if any) to earned tokens uint256 token1Amt = IERC20(token1Address).balanceOf(address(this)); if (token1Address != earnedAddress && token1Amt > 0) { IERC20(token1Address).safeIncreaseAllowance( uniRouterAddress, token1Amt ); // Swap all dust tokens to earned tokens IPancakeRouter02(uniRouterAddress) .swapExactTokensForTokensSupportingFeeOnTransferTokens( token1Amt, 0, token1ToEarnedPath, address(this), now + 60 ); } } function pause() public { require(msg.sender == govAddress, "Not authorised"); _pause(); } function unpause() external { require(msg.sender == govAddress, "Not authorised"); _unpause(); } 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, "!gov"); govAddress = _govAddress; } function setOnlyGov(bool _onlyGov) public { require(msg.sender == govAddress, "!gov"); onlyGov = _onlyGov; } function inCaseTokensGetStuck( address _token, uint256 _amount, address _to ) public { require(msg.sender == govAddress, "!gov"); require(_token != earnedAddress, "!safe"); require(_token != wantAddress, "!safe"); IERC20(_token).safeTransfer(_to, _amount); } }
[{"inputs":[{"internalType":"address","name":"_govAddress","type":"address"},{"internalType":"address","name":"_autoFarmAddress","type":"address"},{"internalType":"address","name":"_AUTOAddress","type":"address"},{"internalType":"bool","name":"_isCAKEStaking","type":"bool"},{"internalType":"bool","name":"_isAutoComp","type":"bool"},{"internalType":"address","name":"_farmContractAddress","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_wantAddress","type":"address"},{"internalType":"address","name":"_token0Address","type":"address"},{"internalType":"address","name":"_token1Address","type":"address"},{"internalType":"address","name":"_earnedAddress","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"AUTOAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoFarmAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"convertDustToEarned","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"earnedToToken0Path","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"earnedToToken1Path","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":[],"name":"farm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farmContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"isAutoComp","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCAKEStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastEarnBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyGov","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"token0Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"token0ToEarnedPath","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"token1ToEarnedPath","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"wantAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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"}]
Contract Creation Code
60806040526001600b60146101000a81548160ff0219169083151502179055506000600c556000600d556000600e556014600f5560966010556127066011553480156200004b57600080fd5b5060405162005d7438038062005d7483398181016040526101808110156200007257600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505060006200010362000f9260201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600180819055506000600260006101000a81548160ff0219169083151502179055508b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600260016101000a81548160ff021916908315150217905550876002806101000a81548160ff02191690831515021790555084600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060028054906101000a900460ff161562000f4d57600260019054906101000a900460ff16620003a65783600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b86600260036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560038190555081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060600160405280600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601290600362000579929190620011b0565b50600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1614156200069c57604051806040016040528073bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060129060026200069a9291906200123f565b505b6040518060600160405280600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506013906003620007a5929190620011b0565b50600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff161415620008c8576040518060400160405280600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506013906002620008c69291906200123f565b505b6040518060600160405280600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506014906003620009d1929190620011b0565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff16141562000af4576040518060400160405280600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601490600262000af29291906200123f565b505b6040518060600160405280600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601590600362000bfd929190620011b0565b50600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff16141562000d2057604051806040016040528073bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601590600262000d1e9291906200123f565b505b6040518060600160405280600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601690600362000e29929190620011b0565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff16141562000f4c57604051806040016040528073bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601690600262000f4a9291906200123f565b505b5b62000f80600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000f9a60201b60201c565b5050505050505050505050506200130b565b600033905090565b62000faa62000f9260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200106b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620010f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018062005d4e6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8280548282559060005260206000209081019282156200122c579160200282015b828111156200122b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620011d1565b5b5090506200123b9190620012ce565b5090565b828054828255906000526020600020908101928215620012bb579160200282015b82811115620012ba5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062001260565b5b509050620012ca9190620012ce565b5090565b5b808211156200130757600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101620012cf565b5090565b614a33806200131b6000396000f3fe608060405234801561001057600080fd5b50600436106102ba5760003560e01c80637ff36fbe11610182578063c8e3d18b116100e9578063e7a03679116100a2578063f2fde38b1161007c578063f2fde38b14610a95578063f3fef3a314610ad9578063f400d31114610b3b578063fa97484114610b69576102ba565b8063e7a0367914610a25578063ee50dc3414610a59578063f106845414610a77576102ba565b8063c8e3d18b146108f7578063cfad57a21461094f578063d389800f14610993578063d7cb416f1461099d578063e5dd455a146109d1578063e7198474146109f1576102ba565b80639fc33a9f1161013b5780639fc33a9f146107f7578063b3545c011461082b578063b40fa1ce14610849578063b77050e714610877578063c11c2e92146108cf578063c302a4d0146108d9576102ba565b80637ff36fbe146106ef5780638456cb5914610723578063846d9e171461072d57806385f02dd61461074d5780638da5cb5b1461076b57806396e9aff81461079f576102ba565b806342da4eb31161022657806362e582e7116101df57806362e582e71461058357806363fe3e3a146105db57806367206d401461060f578063693a090b1461067d578063715018a6146106b1578063783478ad146106bb576102ba565b806342da4eb31461047357806344a3955e1461049157806346008a07146104af57806347e7ef24146104e35780634d9f7bb2146105455780635c975abb14610563576102ba565b8063178a8d0711610278578063178a8d07146103c15780632717eff3146103df578063366ba246146103fd57806336e9332d146104315780633e1a89121461043b5780633f4ba83a14610469576102ba565b80627a2ae3146102bf578063061c7d48146103175780630b6bb30b146103355780630daef321146103655780630fa4e01e146103855780631334903f146103a3575b600080fd5b6102eb600480360360208110156102d557600080fd5b8101908080359060200190929190505050610b9d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61031f610bd9565b6040518082815260200191505060405180910390f35b6103636004803603602081101561034b57600080fd5b81019080803515159060200190929190505050610bdf565b005b61036d610cbf565b60405180821515815260200191505060405180910390f35b61038d610cd2565b6040518082815260200191505060405180910390f35b6103ab610cd8565b6040518082815260200191505060405180910390f35b6103c9610cde565b6040518082815260200191505060405180910390f35b6103e7610ce4565b6040518082815260200191505060405180910390f35b610405610cea565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610439610d10565b005b6104676004803603602081101561045157600080fd5b8101908080359060200190929190505050610da2565b005b610471610f5e565b005b61047b61102b565b6040518082815260200191505060405180910390f35b610499611031565b6040518082815260200191505060405180910390f35b6104b7611037565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61052f600480360360408110156104f957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105d565b6040518082815260200191505060405180910390f35b61054d6112be565b6040518082815260200191505060405180910390f35b61056b6112c4565b60405180821515815260200191505060405180910390f35b6105af6004803603602081101561059957600080fd5b81019080803590602001909291905050506112db565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105e3611317565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61067b6004803603606081101561062557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061132f565b005b6106856115aa565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106b96115d0565b005b6106c3611756565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106f761175c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61072b611782565b005b61073561184f565b60405180821515815260200191505060405180910390f35b610755611862565b6040518082815260200191505060405180910390f35b610773611868565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107cb600480360360208110156107b557600080fd5b8101908080359060200190929190505050611891565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107ff6118cd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108336118f3565b6040518082815260200191505060405180910390f35b6108756004803603602081101561085f57600080fd5b81019080803590602001909291905050506118f9565b005b6108a36004803603602081101561088d57600080fd5b8101908080359060200190929190505050611a40565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108d7611a7c565b005b6108e16121f8565b6040518082815260200191505060405180910390f35b6109236004803603602081101561090d57600080fd5b81019080803590602001909291905050506121fe565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109916004803603602081101561096557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061223a565b005b61099b612341565b005b6109a5612f85565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109d9612fab565b60405180821515815260200191505060405180910390f35b6109f9612fbc565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a2d612fe2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a61613008565b6040518082815260200191505060405180910390f35b610a7f61300e565b6040518082815260200191505060405180910390f35b610ad760048036036020811015610aab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613014565b005b610b2560048036036040811015610aef57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061321f565b6040518082815260200191505060405180910390f35b610b6760048036036020811015610b5157600080fd5b810190808035906020019092919050505061370b565b005b610b71613850565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60168181548110610baa57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61012c81565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ca2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260048152602001807f21676f760000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600b60146101000a81548160ff02191690831515021790555050565b600b60149054906101000a900460ff1681565b600c5481565b60115481565b60105481565b61271081565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026001541415610d89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550610d99613876565b60018081905550565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b6126de8111610edc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f2173616665202d20746f6f206c6f77000000000000000000000000000000000081525060200191505060405180910390fd5b612710811115610f54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f2173616665202d20746f6f20686967680000000000000000000000000000000081525060200191505060405180910390fd5b8060118190555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b611029613b0a565b565b600d5481565b600e5481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611067613bfd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611127576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600260009054906101000a900460ff16156111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6111f9333084600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613c05909392919063ffffffff16565b60008290506000600d54111561125d5761125a61271061124c600d5461123e601154611230600e548a613cc690919063ffffffff16565b613cc690919063ffffffff16565b613d4c90919063ffffffff16565b613d4c90919063ffffffff16565b90505b61127281600e54613d9690919063ffffffff16565b600e8190555060028054906101000a900460ff161561129857611293613876565b6112b4565b6112ad83600d54613d9690919063ffffffff16565b600d819055505b8091505092915050565b61271081565b6000600260009054906101000a900460ff16905090565b601281815481106112e857fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c81565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260048152602001807f21676f760000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f217361666500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561157a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f217361666500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6115a581838573ffffffffffffffffffffffffffffffffffffffff16613e1e9092919063ffffffff16565b505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115d8613bfd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611698576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61dead81565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b61184d613ec0565b565b600260019054906101000a900460ff1681565b600f5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6014818154811061189e57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61032081565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b6103206010541115611a36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260088152602001807f746f6f206869676800000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8060108190555050565b60158181548110611a4d57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900460ff1615611aff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b60028054906101000a900460ff16611b7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f2169734175746f436f6d7000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260019054906101000a900460ff1615611c02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f697343414b455374616b696e670000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611c8d57600080fd5b505afa158015611ca1573d6000803e3d6000fd5b505050506040513d6020811015611cb757600080fd5b81019080805190602001909291905050509050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611d4a5750600081115b15611efb57611dbe600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613fb49092919063ffffffff16565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d795826000601530603c42016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281038252858181548152602001915080548015611ebe57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611e74575b50509650505050505050600060405180830381600087803b158015611ee257600080fd5b505af1158015611ef6573d6000803e3d6000fd5b505050505b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611f8657600080fd5b505afa158015611f9a573d6000803e3d6000fd5b505050506040513d6020811015611fb057600080fd5b81019080805190602001909291905050509050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156120435750600081115b156121f4576120b7600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613fb49092919063ffffffff16565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d795826000601630603c42016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182810382528581815481526020019150805480156121b757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161216d575b50509650505050505050600060405180830381600087803b1580156121db57600080fd5b505af11580156121ef573d6000803e3d6000fd5b505050505b5050565b6126de81565b6013818154811061220b57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260048152602001807f21676f760000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900460ff16156123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b60028054906101000a900460ff16612444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f2169734175746f436f6d7000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600b60149054906101000a900460ff161561251d57600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461251c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b5b600260019054906101000a900460ff16156125c557600260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631058d28160006040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156125a857600080fd5b505af11580156125bc573d6000803e3d6000fd5b5050505061265e565b600260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e7060035460006040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b15801561264557600080fd5b505af1158015612659573d6000803e3d6000fd5b505050505b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156126e957600080fd5b505afa1580156126fd573d6000803e3d6000fd5b505050506040513d602081101561271357600080fd5b8101908080519060200190929190505050905061272f8161412d565b905061273a816141fe565b9050600260019054906101000a900460ff16156127665743600c81905550612760613876565b50612f83565b6127d5600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613fb49092919063ffffffff16565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461299c57600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d79561289e600284613d4c90919063ffffffff16565b6000601330603c42016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818154815260200191508054801561295f57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612915575b50509650505050505050600060405180830381600087803b15801561298357600080fd5b505af1158015612997573d6000803e3d6000fd5b505050505b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b6357600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d795612a65600284613d4c90919063ffffffff16565b6000601430603c42016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281038252858181548152602001915080548015612b2657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612adc575b50509650505050505050600060405180830381600087803b158015612b4a57600080fd5b505af1158015612b5e573d6000803e3d6000fd5b505050505b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bee57600080fd5b505afa158015612c02573d6000803e3d6000fd5b505050506040513d6020811015612c1857600080fd5b810190808051906020019092919050505090506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612cb657600080fd5b505afa158015612cca573d6000803e3d6000fd5b505050506040513d6020811015612ce057600080fd5b81019080805190602001909291905050509050600082118015612d035750600081115b15612f7057612d77600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613fb49092919063ffffffff16565b612de6600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613fb49092919063ffffffff16565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e33700600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858560008030603c42016040518963ffffffff1660e01b8152600401808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200198505050505050505050606060405180830381600087803b158015612f1d57600080fd5b505af1158015612f31573d6000803e3d6000fd5b505050506040513d6060811015612f4757600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505050505b43600c81905550612f7f613876565b5050505b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61271081565b60035481565b61301c613bfd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146130dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613162576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149676026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000613229613bfd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146132e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60026001541415613362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550600082116133e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f5f77616e74416d74203c3d20300000000000000000000000000000000000000081525060200191505060405180910390fd5b60028054906101000a900460ff161561353357600260019054906101000a900460ff161561349a57600260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631058d281836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561347d57600080fd5b505af1158015613491573d6000803e3d6000fd5b50505050613532565b600260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e70600354846040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b15801561351957600080fd5b505af115801561352d573d6000803e3d6000fd5b505050505b5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156135be57600080fd5b505afa1580156135d2573d6000803e3d6000fd5b505050506040513d60208110156135e857600080fd5b8101908080519060200190929190505050905080831115613607578092505b82600d54101561361757600d5492505b6000613642600d54613634600e5487613cc690919063ffffffff16565b613d4c90919063ffffffff16565b9050600e5481111561365457600e5490505b61366981600e5461440790919063ffffffff16565b600e8190555061368484600d5461440790919063ffffffff16565b600d819055506136f9600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613e1e9092919063ffffffff16565b80925050506001808190555092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146137ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f726973656400000000000000000000000000000000000081525060200191505060405180910390fd5b61012c811115613846576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260088152602001807f746f6f206869676800000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600f8190555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561390157600080fd5b505afa158015613915573d6000803e3d6000fd5b505050506040513d602081101561392b57600080fd5b8101908080519060200190929190505050905061395381600d54613d9690919063ffffffff16565b600d819055506139c8600260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613fb49092919063ffffffff16565b600260019054906101000a900460ff1615613a6f57600260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166341441d3b826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015613a5257600080fd5b505af1158015613a66573d6000803e3d6000fd5b50505050613b07565b600260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb158600354836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015613aee57600080fd5b505af1158015613b02573d6000803e3d6000fd5b505050505b50565b600260009054906101000a900460ff16613b8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600260006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613bd0613bfd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600033905090565b613cc0846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614451565b50505050565b600080831415613cd95760009050613d46565b6000828402905082848281613cea57fe5b0414613d41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149b36021913960400191505060405180910390fd5b809150505b92915050565b6000613d8e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614540565b905092915050565b600080828401905083811015613e14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613ebb8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614451565b505050565b600260009054906101000a900460ff1615613f43576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600260006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613f87613bfd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000614088828573ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561403f57600080fd5b505afa158015614053573d6000803e3d6000fd5b505050506040513d602081101561406957600080fd5b8101908080519060200190929190505050613d9690919063ffffffff16565b90506141278463095ea7b360e01b8584604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614451565b50505050565b6000808211156141f6576000600f5411156141f557600061416d61271061415f600f5486613cc690919063ffffffff16565b613d4c90919063ffffffff16565b90506141de600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613e1e9092919063ffffffff16565b6141f1818461440790919063ffffffff16565b9250505b5b819050919050565b6000806010541161421157819050614402565b600061423c61271061422e60105486613cc690919063ffffffff16565b613d4c90919063ffffffff16565b90506142ad600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613fb49092919063ffffffff16565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d795826000601261dead603c42016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182810382528581815481526020019150805480156143af57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311614365575b50509650505050505050600060405180830381600087803b1580156143d357600080fd5b505af11580156143e7573d6000803e3d6000fd5b505050506143fe818461440790919063ffffffff16565b9150505b919050565b600061444983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614606565b905092915050565b60606144b3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166146c69092919063ffffffff16565b905060008151111561453b578080602001905160208110156144d457600080fd5b810190808051906020019092919050505061453a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806149d4602a913960400191505060405180910390fd5b5b505050565b600080831182906145ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145b1578082015181840152602081019050614596565b50505050905090810190601f1680156145de5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816145f857fe5b049050809150509392505050565b60008383111582906146b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561467857808201518184015260208101905061465d565b50505050905090810190601f1680156146a55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60606146d584846000856146de565b90509392505050565b606082471015614739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061498d6026913960400191505060405180910390fd5b61474285614887565b6147b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061480457805182526020820191506020810190506020830392506147e1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614866576040519150601f19603f3d011682016040523d82523d6000602084013e61486b565b606091505b509150915061487b82828661489a565b92505050949350505050565b600080823b905060008111915050919050565b606083156148aa5782905061495f565b6000835111156148bd5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614924578082015181840152602081019050614909565b50505050905090810190601f1680156149515780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122054ec0b07b797b5bf5b5d4a769405718a8f54858cf2aa6ad2062c02ab49e7207864736f6c634300060c00334f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737300000000000000000000000028579eca0a326e53340edd93e18698d379876a040000000000000000000000000895196562c7868c5be92459fae7f877ed450452000000000000000000000000a184088a740c695e156f91f5cc086a06bb78b8270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000073feaa1ee314f8c655e354234017be2193c9e24e0000000000000000000000000000000000000000000000000000000000000029000000000000000000000000ff17ff314925dff772b71abdff2782bc913b35750000000000000000000000004bd17003473389a42daf6a0a729f6fdb328bbbd7000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d560000000000000000000000000e09fabb73bd3ade0a17ecc321fd13a19e81ce8200000000000000000000000005ff2b0db69458a0750badebc4f9e13add608c7f
Deployed ByteCode Sourcemap
52847:13940:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54812:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54052:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66314:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53791:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53826:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54361:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54106:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53985:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53705:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57843:62;;;:::i;:::-;;65345:345;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;65218:119;;;:::i;:::-;;53865:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53906:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53738:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57025:810;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54145:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51671:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54646:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53572:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;66453:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53504:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41769:148;;;:::i;:::-;;54260:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53399:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;65097:113;;;:::i;:::-;;53018:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53945:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41127:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54728:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53222:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54210:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;65939:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54770:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;63463:1626;;;:::i;:::-;;54529:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54686:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;66167:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59718:2611;;;:::i;:::-;;53434:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53125:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53469:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53366:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54470:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53303:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42072:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58424:1172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;65698:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53668:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54812:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54052:45::-;54094:3;54052:45;:::o;66314:131::-;66389:10;;;;;;;;;;;66375:24;;:10;:24;;;66367:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66429:8;66419:7;;:18;;;;;;;;;;;;;;;;;;66314:131;:::o;53791:26::-;;;;;;;;;;;;;:::o;53826:32::-;;;;:::o;54361:39::-;;;;:::o;54106:32::-;;;;:::o;53985:48::-;54028:5;53985:48;:::o;53705:26::-;;;;;;;;;;;;;:::o;57843:62::-;50080:1;50685:7;;:19;;50677:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50080:1;50818:7;:18;;;;57890:7:::1;:5;:7::i;:::-;50036:1:::0;50997:7;:22;;;;57843:62::o;65345:345::-;65443:10;;;;;;;;;;;65429:24;;:10;:24;;;65421:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54575:4;65491:18;:40;65483:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54517:5;65570:18;:42;;65562:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65664:18;65644:17;:38;;;;65345:345;:::o;65218:119::-;65279:10;;;;;;;;;;;65265:24;;:10;:24;;;65257:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65319:10;:8;:10::i;:::-;65218:119::o;53865:34::-;;;;:::o;53906:30::-;;;;:::o;53738:25::-;;;;;;;;;;;;;:::o;57025:810::-;57158:7;41349:12;:10;:12::i;:::-;41339:22;;:6;;;;;;;;;;:22;;;41331:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51989:7:::1;;;;;;;;;;;51988:8;51980:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;57183:132:::2;57242:10;57276:4;57296:8;57190:11;;;;;;;;;;;57183:36;;;;:132;;;;;;:::i;:::-;57328:19;57350:8;57328:30;;57391:1;57373:15;;:19;57369:233;;;57423:167;54517:5;57423:123;57530:15;;57423:84;57489:17;;57423:43;57454:11;;57423:8;:30;;:43;;;;:::i;:::-;:65;;:84;;;;:::i;:::-;:106;;:123;;;;:::i;:::-;:145;;:167;;;;:::i;:::-;57409:181;;57369:233;57626:28;57642:11;57626;;:15;;:28;;;;:::i;:::-;57612:11;:42;;;;57671:10;::::0;::::2;;;;;;;;57667:130;;;57698:7;:5;:7::i;:::-;57667:130;;;57756:29;57776:8;57756:15;;:19;;:29;;;;:::i;:::-;57738:15;:47;;;;57667:130;57816:11;57809:18;;;57025:810:::0;;;;:::o;54145:46::-;54186:5;54145:46;:::o;51671:78::-;51710:4;51734:7;;;;;;;;;;;51727:14;;51671:78;:::o;54646:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53572:89::-;53619:42;53572:89;:::o;66453:331::-;66603:10;;;;;;;;;;;66589:24;;:10;:24;;;66581:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66651:13;;;;;;;;;;;66641:23;;:6;:23;;;;66633:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66703:11;;;;;;;;;;;66693:21;;:6;:21;;;;66685:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66735:41;66763:3;66768:7;66742:6;66735:27;;;;:41;;;;;:::i;:::-;66453:331;;;:::o;53504:31::-;;;;;;;;;;;;;:::o;41769:148::-;41349:12;:10;:12::i;:::-;41339:22;;:6;;;;;;;;;;:22;;;41331:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41876:1:::1;41839:40;;41860:6;::::0;::::1;;;;;;;;41839:40;;;;;;;;;;;;41907:1;41890:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;41769:148::o:0;54260:92::-;54310:42;54260:92;:::o;53399:28::-;;;;;;;;;;;;;:::o;65097:113::-;65154:10;;;;;;;;;;;65140:24;;:10;:24;;;65132:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65194:8;:6;:8::i;:::-;65097:113::o;53018:25::-;;;;;;;;;;;;;:::o;53945:33::-;;;;:::o;41127:79::-;41165:7;41192:6;;;;;;;;;;;41185:13;;41127:79;:::o;54728:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53222:34::-;;;;;;;;;;;;;:::o;54210:43::-;54250:3;54210:43;:::o;65939:220::-;66025:10;;;;;;;;;;;66011:24;;:10;:24;;;66003:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54250:3;66073:11;;:28;;66065:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66139:12;66125:11;:26;;;;65939:220;:::o;54770:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63463:1626::-;51989:7;;;;;;;;;;;51988:8;51980:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63534:10:::1;::::0;::::1;;;;;;;;63526:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;63580:13;;;;;;;;;;;63579:14;63571:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;63783:17;63810:13;;;;;;;;;;;63803:31;;;63843:4;63803:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;63783:66;;63881:13;;;;;;;;;;;63864:30;;:13;;;;;;;;;;;:30;;;;:47;;;;;63910:1;63898:9;:13;63864:47;63860:537;;;63928:121;63990:16;;;;;;;;;;;64025:9;63935:13;;;;;;;;;;;63928:43;;;;:121;;;;;:::i;:::-;64137:16;;;;;;;;;;;64120:106;;;64245:9;64273:1;64293:18;64338:4;64368:2;64362:3;:8;64120:265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63860:537;64468:17;64495:13;;;;;;;;;;;64488:31;;;64528:4;64488:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;64468:66;;64566:13;;;;;;;;;;;64549:30;;:13;;;;;;;;;;;:30;;;;:47;;;;;64595:1;64583:9;:13;64549:47;64545:537;;;64613:121;64675:16;;;;;;;;;;;64710:9;64620:13;;;;;;;;;;;64613:43;;;;:121;;;;;:::i;:::-;64822:16;;;;;;;;;;;64805:106;;;64930:9;64958:1;64978:18;65023:4;65053:2;65047:3;:8;64805:265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64545:537;52028:1;;63463:1626::o:0;54529:50::-;54575:4;54529:50;:::o;54686:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66167:139::-;66244:10;;;;;;;;;;;66230:24;;:10;:24;;;66222:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66287:11;66274:10;;:24;;;;;;;;;;;;;;;;;;66167:139;:::o;59718:2611::-;51989:7;;;;;;;;;;;51988:8;51980:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59774:10:::1;::::0;::::1;;;;;;;;59766:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;59815:7;;;;;;;;;;;59811:91;;;59861:10;;;;;;;;;;;59847:24;;:10;:24;;;59839:51;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;59811:91;59950:13;;;;;;;;;;;59946:235;;;59997:19;;;;;;;;;;;59980:50;;;60031:1;59980:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59946:235;;;60132:19;;;;;;;;;;;60115:46;;;60162:3;;60167:1;60115:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59946:235;60243:17;60270:13;;;;;;;;;;;60263:31;;;60303:4;60263:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;60243:66;;60334:25;60349:9;60334:14;:25::i;:::-;60322:37;;60382:18;60390:9;60382:7;:18::i;:::-;60370:30;;60417:13;;;;;;;;;;;60413:117;;;60463:12;60447:13;:28;;;;60490:7;:5;:7::i;:::-;60512;;;60413:117;60542:109;60600:16;;;;;;;;;;;60631:9;60549:13;;;;;;;;;;;60542:43;;;;:109;;;;;:::i;:::-;60685:13;;;;;;;;;;;60668:30;;:13;;;;;;;;;;;:30;;;60664:378;;60775:16;;;;;;;;;;;60758:106;;;60883:16;60897:1;60883:9;:13;;:16;;;;:::i;:::-;60918:1;60938:18;60983:4;61013:2;61007:3;:8;60758:272;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60664:378;61075:13;;;;;;;;;;;61058:30;;:13;;;;;;;;;;;:30;;;61054:378;;61165:16;;;;;;;;;;;61148:106;;;61273:16;61287:1;61273:9;:13;;:16;;;;:::i;:::-;61308:1;61328:18;61373:4;61403:2;61397:3;:8;61148:272;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;61054:378;61491:17;61518:13;;;;;;;;;;;61511:31;;;61551:4;61511:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;61491:66;;61568:17;61595:13;;;;;;;;;;;61588:31;;;61628:4;61588:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;61568:66;;61661:1;61649:9;:13;:30;;;;;61678:1;61666:9;:13;61649:30;61645:616;;;61696:121;61758:16;;;;;;;;;;;61793:9;61703:13;;;;;;;;;;;61696:43;;;;:121;;;;;:::i;:::-;61832;61894:16;;;;;;;;;;;61929:9;61839:13;;;;;;;;;;;61832:43;;;;:121;;;;;:::i;:::-;61985:16;;;;;;;;;;;61968:47;;;62034:13;;;;;;;;;;;62066;;;;;;;;;;;62098:9;62126;62154:1;62174::::0;62202:4:::1;62232:2;62226:3;:8;61968:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61645:616;62289:12;62273:13;:28;;;;62314:7;:5;:7::i;:::-;52028:1;;;;59718:2611::o:0;53434:28::-;;;;;;;;;;;;;:::o;53125:22::-;;;;;;;;;;;;:::o;53469:28::-;;;;;;;;;;;;;:::o;53366:26::-;;;;;;;;;;;;;:::o;54470:52::-;54517:5;54470:52;:::o;53303:18::-;;;;:::o;42072:281::-;41349:12;:10;:12::i;:::-;41339:22;;:6;;;;;;;;;;:22;;;41331:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42195:1:::1;42175:22;;:8;:22;;;;42153:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42308:8;42279:38;;42300:6;::::0;::::1;;;;;;;;42279:38;;;;;;;;;;;;42337:8;42328:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;42072:281:::0;:::o;58424:1172::-;58557:7;41349:12;:10;:12::i;:::-;41339:22;;:6;;;;;;;;;;:22;;;41331:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50080:1:::1;50685:7;;:19;;50677:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;50080:1;50818:7;:18;;;;58601:1:::2;58590:8;:12;58582:38;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;58637:10;::::0;::::2;;;;;;;;58633:307;;;58668:13;;;;;;;;;;;58664:265;;;58719:19;;;;;;;;;;;58702:50;;;58753:8;58702:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;58664:265;;;58869:19;;;;;;;;;;;58852:46;;;58899:3;;58904:8;58852:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;58664:265;58633:307;58952:15;58977:11;;;;;;;;;;;58970:29;;;59008:4;58970:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;58952:62;;59040:7;59029:8;:18;59025:69;;;59075:7;59064:18;;59025:69;59128:8;59110:15;;:26;59106:85;;;59164:15;;59153:26;;59106:85;59203:21;59227:46;59257:15;;59227:25;59240:11;;59227:8;:12;;:25;;;;:::i;:::-;:29;;:46;;;;:::i;:::-;59203:70;;59304:11;;59288:13;:27;59284:87;;;59348:11;;59332:27;;59284:87;59395:30;59411:13;59395:11;;:15;;:30;;;;:::i;:::-;59381:11;:44;;;;59454:29;59474:8;59454:15;;:19;;:29;;;;:::i;:::-;59436:15;:47;;;;59496:59;59529:15;;;;;;;;;;;59546:8;59503:11;;;;;;;;;;;59496:32;;;;:59;;;;;:::i;:::-;59575:13;59568:20;;;;50036:1:::1;50997:7:::0;:22:::1;;;;58424:1172:::0;;;;:::o;65698:233::-;65788:10;;;;;;;;;;;65774:24;;:10;:24;;;65766:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54094:3;65836:14;:33;;65828:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65909:14;65893:13;:30;;;;65698:233;:::o;53668:30::-;;;;;;;;;;;;;:::o;57913:503::-;57950:15;57975:11;;;;;;;;;;;57968:29;;;58006:4;57968:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57950:62;;58041:28;58061:7;58041:15;;:19;;:28;;;;:::i;:::-;58023:15;:46;;;;58080:71;58122:19;;;;;;;;;;;58143:7;58087:11;;;;;;;;;;;58080:41;;;;:71;;;;;:::i;:::-;58168:13;;;;;;;;;;;58164:245;;;58215:19;;;;;;;;;;;58198:50;;;58249:7;58198:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58164:245;;;58355:19;;;;;;;;;;;58338:45;;;58384:3;;58389:7;58338:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58164:245;57913:503;:::o;52720:120::-;52265:7;;;;;;;;;;;52257:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52789:5:::1;52779:7;;:15;;;;;;;;;;;;;;;;;;52810:22;52819:12;:10;:12::i;:::-;52810:22;;;;;;;;;;;;;;;;;;;;52720:120::o:0;209:106::-;262:15;297:10;290:17;;209:106;:::o;27516:285::-;27660:133;27694:5;27737:27;;;27766:4;27772:2;27776:5;27714:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27660:19;:133::i;:::-;27516:285;;;;:::o;2214:471::-;2272:7;2522:1;2517;:6;2513:47;;;2547:1;2540:8;;;;2513:47;2572:9;2588:1;2584;:5;2572:17;;2617:1;2612;2608;:5;;;;;;:10;2600:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2676:1;2669:8;;;2214:471;;;;;:::o;3161:132::-;3219:7;3246:39;3250:1;3253;3246:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3239:46;;3161:132;;;;:::o;826:181::-;884:7;904:9;920:1;916;:5;904:17;;945:1;940;:6;;932:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;998:1;991:8;;;826:181;;;;:::o;27260:248::-;27377:123;27411:5;27454:23;;;27479:2;27483:5;27431:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27377:19;:123::i;:::-;27260:248;;;:::o;52461:118::-;51989:7;;;;;;;;;;;51988:8;51980:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52531:4:::1;52521:7;;:14;;;;;;;;;;;;;;;;;;52551:20;52558:12;:10;:12::i;:::-;52551:20;;;;;;;;;;;;;;;;;;;;52461:118::o:0;28785:436::-;28916:20;28952:50;28996:5;28952;:15;;;28976:4;28983:7;28952:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:43;;:50;;;;:::i;:::-;28916:86;;29013:200;29047:5;29108:22;;;29149:7;29175:12;29067:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29013:19;:200::i;:::-;28785:436;;;;:::o;62993:462::-;63055:7;63092:1;63079:10;:14;63075:343;;;63162:1;63146:13;;:17;63142:265;;;63184:11;63219:51;54028:5;63219:29;63234:13;;63219:10;:14;;:29;;;;:::i;:::-;:33;;:51;;;;:::i;:::-;63184:86;;63289:51;63324:10;;;;;;;;;;;63336:3;63296:13;;;;;;;;;;;63289:34;;;;:51;;;;;:::i;:::-;63372:19;63387:3;63372:10;:14;;:19;;;;:::i;:::-;63359:32;;63142:265;;63075:343;63437:10;63430:17;;62993:462;;;:::o;62337:648::-;62392:7;62431:1;62416:11;;:16;62412:66;;62456:10;62449:17;;;;62412:66;62490:18;62511:47;54186:5;62511:27;62526:11;;62511:10;:14;;:27;;;;:::i;:::-;:31;;:47;;;;:::i;:::-;62490:68;;62571:110;62629:16;;;;;;;;;;;62660:10;62578:13;;;;;;;;;;;62571:43;;;;:110;;;;;:::i;:::-;62711:16;;;;;;;;;;;62694:102;;;62811:10;62836:1;62852:16;54310:42;62918:2;62912:3;:8;62694:237;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62951:26;62966:10;62951;:14;;:26;;;;:::i;:::-;62944:33;;;62337:648;;;;:::o;1290:136::-;1348:7;1375:43;1379:1;1382;1375:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1368:50;;1290:136;;;;:::o;30150:885::-;30574:23;30613:118;30659:4;30613:118;;;;;;;;;;;;;;;;;30621:5;30613:27;;;;:118;;;;;:::i;:::-;30574:157;;30766:1;30746:10;:17;:21;30742:286;;;30919:10;30908:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30882:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30742:286;30150:885;;;:::o;3789:312::-;3909:7;3941:1;3937;:5;3944:12;3929:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3968:9;3984:1;3980;:5;;;;;;3968:17;;4092:1;4085:8;;;3789:312;;;;;:::o;1729:226::-;1849:7;1882:1;1877;:6;;1885:12;1869:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1909:9;1925:1;1921;:5;1909:17;;1946:1;1939:8;;;1729:226;;;;;:::o;22256:229::-;22393:12;22425:52;22447:6;22455:4;22461:1;22464:12;22425:21;:52::i;:::-;22418:59;;22256:229;;;;;:::o;23472:621::-;23642:12;23714:5;23689:21;:30;;23667:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23804:18;23815:6;23804:10;:18::i;:::-;23796:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23930:12;23944:23;23984:6;:11;;24003:5;24010:4;23984:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23929:86;;;;24033:52;24051:7;24060:10;24072:12;24033:17;:52::i;:::-;24026:59;;;;23472:621;;;;;;:::o;19219:444::-;19279:4;19487:12;19611:7;19599:20;19591:28;;19654:1;19647:4;:8;19640:15;;;19219:444;;;:::o;26384:777::-;26534:12;26563:7;26559:595;;;26594:10;26587:17;;;;26559:595;26728:1;26708:10;:17;:21;26704:439;;;26971:10;26965:17;27032:15;27019:10;27015:2;27011:19;27004:44;26919:148;27114:12;27107:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26384:777;;;;;;:::o
Swarm Source
ipfs://54ec0b07b797b5bf5b5d4a769405718a8f54858cf2aa6ad2062c02ab49e72078
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.