My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xe6e64158e0e179bc86b419ca531552bf940e313d3af2b00d933e3bb60d483136 | Set Strategy | 6157007 | 582 days 14 hrs ago | 0xc9a51fb9057380494262fd291aed74317332c0a2 | IN | Snowball: BenQi Controller V4 | 0 AVAX | 0.00123045 | |
0xdd164188507901b319a2c5329cb6ff75bb640380d19664e37c3136b9c25158c3 | Approve Strategy | 6157002 | 582 days 14 hrs ago | 0xc9a51fb9057380494262fd291aed74317332c0a2 | IN | Snowball: BenQi Controller V4 | 0 AVAX | 0.001168575 | |
0xd5a9fca883bfda51bb0f2508e290578c67759dac02da731270e4e827752347e8 | Set Globe | 6157000 | 582 days 14 hrs ago | 0xc9a51fb9057380494262fd291aed74317332c0a2 | IN | Snowball: BenQi Controller V4 | 0 AVAX | 0.00117175 | |
0x0de4c9738040d6e59d4fcb515bd797c169fd0ed11a8f6e9a1ba3427f17d4df89 | 0x60806040 | 6156245 | 582 days 15 hrs ago | 0xc9a51fb9057380494262fd291aed74317332c0a2 | IN | Create: BenqiControllerV4 | 0 AVAX | 0.067031 |
[ Download CSV Export ]
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
BenqiControllerV4
Compiler Version
v0.6.7+commit.b8d736ae
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2021-11-05 */ /** *Submitted for verification at snowtrace.io on 2021-11-05 */ // Sources flattened with hardhat v2.6.5 https://hardhat.org // File contracts/interfaces/controller.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; interface IController { function globes(address) external view returns (address); function rewards() external view returns (address); function devfund() external view returns (address); function treasury() external view returns (address); function balanceOf(address) external view returns (uint256); function withdraw(address, uint256) external; function earn(address, uint256) external; } // File contracts/lib/safe-math.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ 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; } } // File contracts/lib/context.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address 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; } } // File contracts/lib/erc20.sol // File: contracts/GSN/Context.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; // File: contracts/token/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // 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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); 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); } } } } // File: contracts/token/ERC20/ERC20.sol /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; 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 { } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using 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"); } } } // File contracts/interfaces/globe.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface IGlobe is IERC20 { function token() external view returns (address); function claimInsurance() external; // NOTE: Only yDelegatedVault implements this function getRatio() external view returns (uint256); function depositAll() external; function deposit(uint256) external; function withdrawAll() external; function withdraw(uint256) external; function earn() external; function decimals() external view returns (uint8); } // File contracts/interfaces/globe-converter.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface IGlobeConverter { function convert( address _refundExcess, // address to send the excess amount when adding liquidity uint256 _amount, // UNI LP Amount bytes calldata _data ) external returns (uint256); } // File contracts/interfaces/onesplit.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface OneSplitAudit { function getExpectedReturn( address fromToken, address toToken, uint256 amount, uint256 parts, uint256 featureFlags ) external view returns (uint256 returnAmount, uint256[] memory distribution); function swap( address fromToken, address toToken, uint256 amount, uint256 minReturn, uint256[] calldata distribution, uint256 featureFlags ) external payable; } // File contracts/interfaces/strategy.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface IStrategy { function rewards() external view returns (address); function gauge() external view returns (address); function want() external view returns (address); function timelock() external view returns (address); function deposit() external; function withdrawForSwap(uint256) external returns (uint256); function withdraw(address) external; function withdraw(uint256) external; function skim() external; function withdrawAll() external returns (uint256); function balanceOf() external view returns (uint256); function harvest() external; function setTimelock(address) external; function setController(address _controller) external; function execute(address _target, bytes calldata _data) external payable returns (bytes memory response); function execute(bytes calldata _data) external payable returns (bytes memory response); } // File contracts/interfaces/converter.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface Converter { function convert(address) external returns (uint256); } // File contracts/controllers/bankerjoe-controller.sol // https://github.com/iearn-finance/globes/blob/master/contracts/controllers/StrategyControllerV1.sol pragma solidity ^0.6.7; pragma experimental ABIEncoderV2; contract BenqiControllerV4 { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; address public constant burn = 0x000000000000000000000000000000000000dEaD; address public onesplit = 0xC586BeF4a0992C495Cf22e1aeEE4E446CECDee0E; address public governance; address public strategist; address public devfund; address public treasury; address public timelock; // Convenience fee 0.1% uint256 public convenienceFee = 100; uint256 public constant convenienceFeeMax = 100000; mapping(address => address) public globes; // takes lp address and returns associated globe mapping(address => address) public strategies; // takes lp and returns associated strategy mapping(address => mapping(address => address)) public converters; mapping(address => mapping(address => bool)) public approvedStrategies; mapping(address => bool) public approvedGlobeConverters; uint256 public split = 500; uint256 public constant max = 10000; constructor( address _governance, address _strategist, address _timelock, address _devfund, address _treasury ) public { governance = _governance; strategist = _strategist; timelock = _timelock; devfund = _devfund; treasury = _treasury; } function setDevFund(address _devfund) public { require(msg.sender == governance, "!governance"); devfund = _devfund; } function setTreasury(address _treasury) public { require(msg.sender == governance, "!governance"); treasury = _treasury; } function setStrategist(address _strategist) public { require(msg.sender == governance, "!governance"); strategist = _strategist; } function setSplit(uint256 _split) public { require(msg.sender == governance, "!governance"); require(_split <= max, "numerator cannot be greater than denominator"); split = _split; } function setOneSplit(address _onesplit) public { require(msg.sender == governance, "!governance"); onesplit = _onesplit; } function setGovernance(address _governance) public { require(msg.sender == governance, "!governance"); governance = _governance; } function setTimelock(address _timelock) public { require(msg.sender == timelock, "!timelock"); timelock = _timelock; } function setGlobe(address _token, address _globe) public { require( msg.sender == strategist || msg.sender == governance, "!strategist" ); require(globes[_token] == address(0), "globe"); globes[_token] = _globe; } function approveGlobeConverter(address _converter) public { require(msg.sender == governance, "!governance"); approvedGlobeConverters[_converter] = true; } function revokeGlobeConverter(address _converter) public { require(msg.sender == governance, "!governance"); approvedGlobeConverters[_converter] = false; } function approveStrategy(address _token, address _strategy) public { require(msg.sender == timelock, "!timelock"); approvedStrategies[_token][_strategy] = true; } function revokeStrategy(address _token, address _strategy) public { require(msg.sender == governance, "!governance"); require(strategies[_token] != _strategy, "cannot revoke active strategy"); approvedStrategies[_token][_strategy] = false; } function setConvenienceFee(uint256 _convenienceFee) external { require(msg.sender == timelock, "!timelock"); convenienceFee = _convenienceFee; } function setStrategy(address _token, address _strategy) public { require( msg.sender == strategist || msg.sender == governance, "!strategist" ); require(approvedStrategies[_token][_strategy] == true, "!approved"); address _current = strategies[_token]; if (_current != address(0)) { IStrategy(_current).withdrawAll(); } strategies[_token] = _strategy; } function earn(address _token, uint256 _amount) public { address _strategy = strategies[_token]; address _want = IStrategy(_strategy).want(); if (_want != _token) { address converter = converters[_token][_want]; IERC20(_token).safeTransfer(converter, _amount); _amount = Converter(converter).convert(_strategy); IERC20(_want).safeTransfer(_strategy, _amount); } else { IERC20(_token).safeTransfer(_strategy, _amount); } IStrategy(_strategy).deposit(); } function balanceOf(address _token) external view returns (uint256) { return IStrategy(strategies[_token]).balanceOf(); } function withdrawAll(address _token) public { require( msg.sender == strategist || msg.sender == governance, "!strategist" ); IStrategy(strategies[_token]).withdrawAll(); } function inCaseTokensGetStuck(address _token, uint256 _amount) public { require( msg.sender == strategist || msg.sender == governance, "!governance" ); IERC20(_token).safeTransfer(msg.sender, _amount); } function inCaseStrategyTokenGetStuck(address _strategy, address _token) public { require( msg.sender == strategist || msg.sender == governance, "!governance" ); IStrategy(_strategy).withdraw(_token); } function getExpectedReturn( address _strategy, address _token, uint256 parts ) public view returns (uint256 expected) { uint256 _balance = IERC20(_token).balanceOf(_strategy); address _want = IStrategy(_strategy).want(); (expected, ) = OneSplitAudit(onesplit).getExpectedReturn( _token, _want, _balance, parts, 0 ); } // Only allows to withdraw non-core strategy tokens ~ this is over and above normal yield function yearn( address _strategy, address _token, uint256 parts ) public { require( msg.sender == strategist || msg.sender == governance, "!governance" ); // This contract should never have value in it, but just incase since this is a public call uint256 _before = IERC20(_token).balanceOf(address(this)); IStrategy(_strategy).withdraw(_token); uint256 _after = IERC20(_token).balanceOf(address(this)); if (_after > _before) { uint256 _amount = _after.sub(_before); address _want = IStrategy(_strategy).want(); uint256[] memory _distribution; uint256 _expected; _before = IERC20(_want).balanceOf(address(this)); IERC20(_token).safeApprove(onesplit, 0); IERC20(_token).safeApprove(onesplit, _amount); (_expected, _distribution) = OneSplitAudit(onesplit) .getExpectedReturn(_token, _want, _amount, parts, 0); OneSplitAudit(onesplit).swap( _token, _want, _amount, _expected, _distribution, 0 ); _after = IERC20(_want).balanceOf(address(this)); if (_after > _before) { _amount = _after.sub(_before); uint256 _treasury = _amount.mul(split).div(max); earn(_want, _amount.sub(_treasury)); IERC20(_want).safeTransfer(treasury, _treasury); } } } function withdraw(address _token, uint256 _amount) public { require(msg.sender == globes[_token], "!globe"); IStrategy(strategies[_token]).withdraw(_amount); } // Function to swap between globes function swapExactGlobeForGlobe( address _fromGlobe, // From which Globe address _toGlobe, // To which Globe uint256 _fromGlobeAmount, // How much globe tokens to swap uint256 _toGlobeMinAmount, // How much globe tokens you'd like at a minimum address payable[] calldata _targets, bytes[] calldata _data ) external returns (uint256) { require(_targets.length == _data.length, "!length"); // Only return last response for (uint256 i = 0; i < _targets.length; i++) { require(_targets[i] != address(0), "!converter"); require(approvedGlobeConverters[_targets[i]], "!converter"); } address _fromGlobeToken = IGlobe(_fromGlobe).token(); address _toGlobeToken = IGlobe(_toGlobe).token(); // Get pTokens from msg.sender IERC20(_fromGlobe).safeTransferFrom( msg.sender, address(this), _fromGlobeAmount ); // Calculate how much underlying // is the amount of pTokens worth uint256 _fromGlobeUnderlyingAmount = _fromGlobeAmount .mul(IGlobe(_fromGlobe).getRatio()) .div(10**uint256(IGlobe(_fromGlobe).decimals())); // Call 'withdrawForSwap' on Globe's current strategy if Globe // doesn't have enough initial capital. // This has moves the funds from the strategy to the Globe's // 'earnable' amount. Enabling 'free' withdrawals uint256 _fromGlobeAvailUnderlying = IERC20(_fromGlobeToken).balanceOf( _fromGlobe ); if (_fromGlobeAvailUnderlying < _fromGlobeUnderlyingAmount) { IStrategy(strategies[_fromGlobeToken]).withdrawForSwap( _fromGlobeUnderlyingAmount.sub(_fromGlobeAvailUnderlying) ); } // Withdraw from Globe // Note: this is free since its still within the "earnable" amount // as we transferred the access IERC20(_fromGlobe).safeApprove(_fromGlobe, 0); IERC20(_fromGlobe).safeApprove(_fromGlobe, _fromGlobeAmount); IGlobe(_fromGlobe).withdraw(_fromGlobeAmount); // Calculate fee uint256 _fromUnderlyingBalance = IERC20(_fromGlobeToken).balanceOf( address(this) ); uint256 _convenienceFee = _fromUnderlyingBalance.mul(convenienceFee).div( convenienceFeeMax ); if (_convenienceFee > 1) { IERC20(_fromGlobeToken).safeTransfer(devfund, _convenienceFee.div(2)); IERC20(_fromGlobeToken).safeTransfer(treasury, _convenienceFee.div(2)); } // Executes sequence of logic for (uint256 i = 0; i < _targets.length; i++) { _execute(_targets[i], _data[i]); } // Deposit into new Globe uint256 _toBal = IERC20(_toGlobeToken).balanceOf(address(this)); IERC20(_toGlobeToken).safeApprove(_toGlobe, 0); IERC20(_toGlobeToken).safeApprove(_toGlobe, _toBal); IGlobe(_toGlobe).deposit(_toBal); // Send Globe Tokens to user uint256 _toGlobeBal = IGlobe(_toGlobe).balanceOf(address(this)); if (_toGlobeBal < _toGlobeMinAmount) { revert("!min-globe-amount"); } IGlobe(_toGlobe).transfer(msg.sender, _toGlobeBal); return _toGlobeBal; } function _execute(address _target, bytes memory _data) internal returns (bytes memory response) { require(_target != address(0), "!target"); // call contract in current context assembly { let succeeded := delegatecall( sub(gas(), 5000), _target, add(_data, 0x20), mload(_data), 0, 0 ) let size := returndatasize() response := mload(0x40) mstore( 0x40, add(response, and(add(add(size, 0x20), 0x1f), not(0x1f))) ) mstore(response, size) returndatacopy(add(response, 0x20), 0, size) switch iszero(succeeded) case 1 { // throw if delegatecall failed revert(add(response, 0x20), size) } } } }
[{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_timelock","type":"address"},{"internalType":"address","name":"_devfund","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_converter","type":"address"}],"name":"approveGlobeConverter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_strategy","type":"address"}],"name":"approveStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedGlobeConverters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"approvedStrategies","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convenienceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convenienceFeeMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"converters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devfund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"earn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"parts","type":"uint256"}],"name":"getExpectedReturn","outputs":[{"internalType":"uint256","name":"expected","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"globes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"inCaseStrategyTokenGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onesplit","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_converter","type":"address"}],"name":"revokeGlobeConverter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_strategy","type":"address"}],"name":"revokeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_convenienceFee","type":"uint256"}],"name":"setConvenienceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devfund","type":"address"}],"name":"setDevFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_globe","type":"address"}],"name":"setGlobe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_onesplit","type":"address"}],"name":"setOneSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_split","type":"uint256"}],"name":"setSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_strategy","type":"address"}],"name":"setStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"split","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"strategies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fromGlobe","type":"address"},{"internalType":"address","name":"_toGlobe","type":"address"},{"internalType":"uint256","name":"_fromGlobeAmount","type":"uint256"},{"internalType":"uint256","name":"_toGlobeMinAmount","type":"uint256"},{"internalType":"address payable[]","name":"_targets","type":"address[]"},{"internalType":"bytes[]","name":"_data","type":"bytes[]"}],"name":"swapExactGlobeForGlobe","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"parts","type":"uint256"}],"name":"yearn","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600080546001600160a01b03191673c586bef4a0992c495cf22e1aeee4e446cecdee0e17905560646006556101f4600c553480156200004257600080fd5b5060405162002da138038062002da18339810160408190526200006591620000c8565b600180546001600160a01b03199081166001600160a01b0397881617909155600280548216958716959095179094556005805485169386169390931790925560038054841691851691909117905560048054909216921691909117905562000160565b600080600080600060a08688031215620000e0578081fd5b8551620000ed8162000147565b6020870151909550620001008162000147565b6040870151909450620001138162000147565b6060870151909350620001268162000147565b6080870151909250620001398162000147565b809150509295509295909350565b6001600160a01b03811681146200015d57600080fd5b50565b612c3180620001706000396000f3fe608060405234801561001057600080fd5b506004361061023c5760003560e01c80638d8f1e671161013b578063c7b9d530116100b8578063f712adbb1161007c578063f712adbb146104a1578063f7654176146104a9578063f89c44a7146104b1578063fa09e630146104c4578063fbe8b5ce146104d75761023c565b8063c7b9d5301461044d578063d33219b414610460578063e4f2494d14610468578063f0f442601461047b578063f3fef3a31461048e5761023c565b8063ae4db919116100ff578063ae4db919146103ee578063b02bf4b914610401578063bdacb30314610414578063c494448e14610427578063c6d758cb1461043a5761023c565b80638d8f1e67146103a55780638da1df4d146103ad5780639bcdff1f146103c0578063a1578b6a146103c8578063ab033ea9146103db5761023c565b80635aa6e675116101c95780636dcd64e51161018d5780636dcd64e5146103395780636f8bec301461034c57806370a082311461036c57806372cb5d971461037f57806383c9a30b146103925761023c565b80635aa6e675146102ee57806361d027b3146102f6578063674e694f146102fe5780636ac5db19146103115780636d1b4bde146103265761023c565b80631fe4a686116102105780631fe4a6861461028f57806330ed9dff146102ad57806339ebf823146102c057806344df8e70146102d3578063590bbb60146102db5761023c565b8062b267531461024157806304209f4814610256578063197baa6d146102695780631dfd45af1461027c575b600080fd5b61025461024f366004612420565b6104df565b005b610254610264366004612490565b610533565b610254610277366004612458565b610a2b565b61025461028a3660046125c0565b610acc565b610297610afb565b6040516102a491906126d1565b60405180910390f35b6102546102bb366004612458565b610b0a565b6102976102ce366004612420565b610baf565b610297610bca565b6102546102e9366004612458565b610bd0565b610297610c68565b610297610c77565b61025461030c3660046125c0565b610c86565b610319610cd7565b6040516102a49190612b20565b610297610334366004612420565b610cdd565b610319610347366004612490565b610cf8565b61035f61035a366004612420565b610e83565b6040516102a491906127e7565b61031961037a366004612420565b610e98565b61025461038d366004612458565b610f28565b6103196103a03660046124d0565b611076565b6102976118f8565b6102546103bb366004612420565b611907565b610319611953565b61035f6103d6366004612458565b61195a565b6102546103e9366004612420565b61197a565b6102546103fc366004612420565b6119c6565b61025461040f366004612575565b611a12565b610254610422366004612420565b611c05565b610254610435366004612458565b611c51565b610254610448366004612575565b611caf565b61025461045b366004612420565b611d0c565b610297611d58565b610297610476366004612458565b611d67565b610254610489366004612420565b611d8d565b61025461049c366004612575565b611dd9565b610297611e51565b610319611e60565b6102546104bf366004612420565b611e66565b6102546104d2366004612420565b611eb4565b610319611f7c565b6001546001600160a01b031633146105125760405162461bcd60e51b815260040161050990612881565b60405180910390fd5b6001600160a01b03166000908152600b60205260409020805460ff19169055565b6002546001600160a01b031633148061055657506001546001600160a01b031633145b6105725760405162461bcd60e51b815260040161050990612881565b6040516370a0823160e01b81526000906001600160a01b038416906370a08231906105a19030906004016126d1565b60206040518083038186803b1580156105b957600080fd5b505afa1580156105cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f191906125d8565b6040516351cff8d960e01b81529091506001600160a01b038516906351cff8d9906106209086906004016126d1565b600060405180830381600087803b15801561063a57600080fd5b505af115801561064e573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03861691506370a08231906106819030906004016126d1565b60206040518083038186803b15801561069957600080fd5b505afa1580156106ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d191906125d8565b905081811115610a245760006106ed828463ffffffff611f8216565b90506000866001600160a01b0316631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b15801561072a57600080fd5b505afa15801561073e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610762919061243c565b905060606000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161079491906126d1565b60206040518083038186803b1580156107ac57600080fd5b505afa1580156107c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e491906125d8565b60008054919750610809916001600160a01b038b81169291169063ffffffff611fcb16565b600054610829906001600160a01b038a811691168663ffffffff611fcb16565b6000805460405163085e2c5b60e01b81526001600160a01b039091169163085e2c5b91610861918c9188918a918e91906004016127b6565b60006040518083038186803b15801561087957600080fd5b505afa15801561088d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108b591908101906125f0565b60008054604051637153a8af60e11b81529295509293506001600160a01b039092169163e2a7515e916108f4918c9188918a9188918a9160040161273c565b600060405180830381600087803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b50506040516370a0823160e01b81526001600160a01b03861692506370a0823191506109529030906004016126d1565b60206040518083038186803b15801561096a57600080fd5b505afa15801561097e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a291906125d8565b945085851115610a1f576109bc858763ffffffff611f8216565b935060006109e76127106109db600c54886120ca90919063ffffffff16565b9063ffffffff61210416565b90506109fd8461040f878463ffffffff611f8216565b600454610a1d906001600160a01b0386811691168363ffffffff61214616565b505b505050505b5050505050565b6002546001600160a01b0316331480610a4e57506001546001600160a01b031633145b610a6a5760405162461bcd60e51b815260040161050990612881565b6040516351cff8d960e01b81526001600160a01b038316906351cff8d990610a969084906004016126d1565b600060405180830381600087803b158015610ab057600080fd5b505af1158015610ac4573d6000803e3d6000fd5b505050505050565b6005546001600160a01b03163314610af65760405162461bcd60e51b815260040161050990612aa7565b600655565b6002546001600160a01b031681565b6002546001600160a01b0316331480610b2d57506001546001600160a01b031633145b610b495760405162461bcd60e51b81526004016105099061285c565b6001600160a01b038281166000908152600760205260409020541615610b815760405162461bcd60e51b81526004016105099061295a565b6001600160a01b03918216600090815260076020526040902080546001600160a01b03191691909216179055565b6008602052600090815260409020546001600160a01b031681565b61dead81565b6001546001600160a01b03163314610bfa5760405162461bcd60e51b815260040161050990612881565b6001600160a01b0382811660009081526008602052604090205481169082161415610c375760405162461bcd60e51b815260040161050990612825565b6001600160a01b039182166000908152600a602090815260408083209390941682529190915220805460ff19169055565b6001546001600160a01b031681565b6004546001600160a01b031681565b6001546001600160a01b03163314610cb05760405162461bcd60e51b815260040161050990612881565b612710811115610cd25760405162461bcd60e51b8152600401610509906128c7565b600c55565b61271081565b6007602052600090815260409020546001600160a01b031681565b600080836001600160a01b03166370a08231866040518263ffffffff1660e01b8152600401610d2791906126d1565b60206040518083038186803b158015610d3f57600080fd5b505afa158015610d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7791906125d8565b90506000856001600160a01b0316631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b158015610db457600080fd5b505afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec919061243c565b6000805460405163085e2c5b60e01b81529293506001600160a01b03169163085e2c5b91610e24918991869188918b916004016127b6565b60006040518083038186803b158015610e3c57600080fd5b505afa158015610e50573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e7891908101906125f0565b509695505050505050565b600b6020526000908152604090205460ff1681565b6001600160a01b03808216600090815260086020908152604080832054815163722713f760e01b815291519394169263722713f792600480840193919291829003018186803b158015610eea57600080fd5b505afa158015610efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2291906125d8565b92915050565b6002546001600160a01b0316331480610f4b57506001546001600160a01b031633145b610f675760405162461bcd60e51b81526004016105099061285c565b6001600160a01b038083166000908152600a602090815260408083209385168352929052205460ff161515600114610fb15760405162461bcd60e51b815260040161050990612937565b6001600160a01b0380831660009081526008602052604090205416801561104757806001600160a01b031663853828b66040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561100d57600080fd5b505af1158015611021573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104591906125d8565b505b506001600160a01b03918216600090815260086020526040902080546001600160a01b03191691909216179055565b60008382146110975760405162461bcd60e51b815260040161050990612a86565b60005b848110156111525760008686838181106110b057fe5b90506020020160208101906110c59190612420565b6001600160a01b031614156110ec5760405162461bcd60e51b815260040161050990612913565b600b60008787848181106110fc57fe5b90506020020160208101906111119190612420565b6001600160a01b0316815260208101919091526040016000205460ff1661114a5760405162461bcd60e51b815260040161050990612913565b60010161109a565b506000896001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561118e57600080fd5b505afa1580156111a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c6919061243c565b90506000896001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561120357600080fd5b505afa158015611217573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123b919061243c565b90506112586001600160a01b038c1633308c63ffffffff61216516565b60006113558c6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561129657600080fd5b505afa1580156112aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ce9190612694565b60ff16600a0a6109db8e6001600160a01b031663ec1ebd7a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561131057600080fd5b505afa158015611324573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134891906125d8565b8d9063ffffffff6120ca16565b90506000836001600160a01b03166370a082318e6040518263ffffffff1660e01b815260040161138591906126d1565b60206040518083038186803b15801561139d57600080fd5b505afa1580156113b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d591906125d8565b90508181101561147f576001600160a01b038085166000908152600860205260409020541663c6223e2661140f848463ffffffff611f8216565b6040518263ffffffff1660e01b815260040161142b9190612b20565b602060405180830381600087803b15801561144557600080fd5b505af1158015611459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147d91906125d8565b505b61149a6001600160a01b038e168e600063ffffffff611fcb16565b6114b46001600160a01b038e168e8d63ffffffff611fcb16565b604051632e1a7d4d60e01b81526001600160a01b038e1690632e1a7d4d906114e0908e90600401612b20565b600060405180830381600087803b1580156114fa57600080fd5b505af115801561150e573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03871691506370a08231906115419030906004016126d1565b60206040518083038186803b15801561155957600080fd5b505afa15801561156d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159191906125d8565b905060006115b1620186a06109db600654856120ca90919063ffffffff16565b90506001811115611615576003546115f4906001600160a01b03166115dd83600263ffffffff61210416565b6001600160a01b038916919063ffffffff61214616565b600454611615906001600160a01b03166115dd83600263ffffffff61210416565b60005b8a8110156116a55761169c8c8c8381811061162f57fe5b90506020020160208101906116449190612420565b8b8b8481811061165057fe5b90506020028101906116629190612b29565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061218c92505050565b50600101611618565b506040516370a0823160e01b81526000906001600160a01b038716906370a08231906116d59030906004016126d1565b60206040518083038186803b1580156116ed57600080fd5b505afa158015611701573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172591906125d8565b90506117468f6000886001600160a01b0316611fcb9092919063ffffffff16565b6117648f82886001600160a01b0316611fcb9092919063ffffffff16565b8e6001600160a01b031663b6b55f25826040518263ffffffff1660e01b81526004016117909190612b20565b600060405180830381600087803b1580156117aa57600080fd5b505af11580156117be573d6000803e3d6000fd5b5050505060008f6001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016117f091906126d1565b60206040518083038186803b15801561180857600080fd5b505afa15801561181c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184091906125d8565b90508d8110156118625760405162461bcd60e51b8152600401610509906129da565b8f6001600160a01b031663a9059cbb33836040518363ffffffff1660e01b81526004016118909291906126e5565b602060405180830381600087803b1580156118aa57600080fd5b505af11580156118be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e291906125a0565b5097505050505050505098975050505050505050565b6003546001600160a01b031681565b6001546001600160a01b031633146119315760405162461bcd60e51b815260040161050990612881565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b620186a081565b600a60209081526000928352604080842090915290825290205460ff1681565b6001546001600160a01b031633146119a45760405162461bcd60e51b815260040161050990612881565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146119f05760405162461bcd60e51b815260040161050990612881565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038083166000908152600860209081526040808320548151631f1fcd5160e01b815291519416938492631f1fcd519260048082019391829003018186803b158015611a6357600080fd5b505afa158015611a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9b919061243c565b9050836001600160a01b0316816001600160a01b031614611b92576001600160a01b038085166000818152600960209081526040808320868616845290915290205490911690611af290828663ffffffff61214616565b60405163def2489b60e01b81526001600160a01b0382169063def2489b90611b1e9086906004016126d1565b602060405180830381600087803b158015611b3857600080fd5b505af1158015611b4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7091906125d8565b9350611b8c6001600160a01b038316848663ffffffff61214616565b50611bac565b611bac6001600160a01b038516838563ffffffff61214616565b816001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611be757600080fd5b505af1158015611bfb573d6000803e3d6000fd5b5050505050505050565b6005546001600160a01b03163314611c2f5760405162461bcd60e51b815260040161050990612aa7565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611c7b5760405162461bcd60e51b815260040161050990612aa7565b6001600160a01b039182166000908152600a602090815260408083209390941682529190915220805460ff19166001179055565b6002546001600160a01b0316331480611cd257506001546001600160a01b031633145b611cee5760405162461bcd60e51b815260040161050990612881565b611d086001600160a01b038316338363ffffffff61214616565b5050565b6001546001600160a01b03163314611d365760405162461bcd60e51b815260040161050990612881565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b60096020908152600092835260408084209091529082529020546001600160a01b031681565b6001546001600160a01b03163314611db75760405162461bcd60e51b815260040161050990612881565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03828116600090815260076020526040902054163314611e125760405162461bcd60e51b8152600401610509906129ba565b6001600160a01b0380831660009081526008602052604090819020549051632e1a7d4d60e01b8152911690632e1a7d4d90610a96908490600401612b20565b6000546001600160a01b031681565b600c5481565b6001546001600160a01b03163314611e905760405162461bcd60e51b815260040161050990612881565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6002546001600160a01b0316331480611ed757506001546001600160a01b031633145b611ef35760405162461bcd60e51b81526004016105099061285c565b6001600160a01b03808216600090815260086020908152604080832054815163429c145b60e11b8152915194169363853828b693600480840194938390030190829087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0891906125d8565b60065481565b6000611fc483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612204565b9392505050565b8015806120535750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061200190309086906004016126fe565b60206040518083038186803b15801561201957600080fd5b505afa15801561202d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205191906125d8565b155b61206f5760405162461bcd60e51b815260040161050990612aca565b6120c58363095ea7b360e01b848460405160240161208e9291906126e5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612230565b505050565b6000826120d957506000610f22565b828202828482816120e657fe5b0414611fc45760405162461bcd60e51b815260040161050990612979565b6000611fc483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506122bf565b6120c58363a9059cbb60e01b848460405160240161208e9291906126e5565b612186846323b872dd60e01b85858560405160240161208e93929190612718565b50505050565b60606001600160a01b0383166121b45760405162461bcd60e51b8152600401610509906128a6565b600080835160208501866113885a03f43d6040519250601f19601f6020830101168301604052808352806000602085013e8115600181146121f4576121fb565b8160208501fd5b50505092915050565b600081848411156122285760405162461bcd60e51b815260040161050991906127f2565b505050900390565b6060612285826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122f69092919063ffffffff16565b8051909150156120c557808060200190518101906122a391906125a0565b6120c55760405162461bcd60e51b815260040161050990612a3c565b600081836122e05760405162461bcd60e51b815260040161050991906127f2565b5060008385816122ec57fe5b0495945050505050565b6060612305848460008561230d565b949350505050565b6060612318856123d1565b6123345760405162461bcd60e51b815260040161050990612a05565b60006060866001600160a01b0316858760405161235191906126b5565b60006040518083038185875af1925050503d806000811461238e576040519150601f19603f3d011682016040523d82523d6000602084013e612393565b606091505b509150915081156123a75791506123059050565b8051156123b75780518082602001fd5b8360405162461bcd60e51b815260040161050991906127f2565b3b151590565b60008083601f8401126123e8578182fd5b50813567ffffffffffffffff8111156123ff578182fd5b602083019150836020808302850101111561241957600080fd5b9250929050565b600060208284031215612431578081fd5b8135611fc481612be3565b60006020828403121561244d578081fd5b8151611fc481612be3565b6000806040838503121561246a578081fd5b823561247581612be3565b9150602083013561248581612be3565b809150509250929050565b6000806000606084860312156124a4578081fd5b83356124af81612be3565b925060208401356124bf81612be3565b929592945050506040919091013590565b60008060008060008060008060c0898b0312156124eb578384fd5b88356124f681612be3565b9750602089013561250681612be3565b96506040890135955060608901359450608089013567ffffffffffffffff80821115612530578586fd5b61253c8c838d016123d7565b909650945060a08b0135915080821115612554578384fd5b506125618b828c016123d7565b999c989b5096995094979396929594505050565b60008060408385031215612587578182fd5b823561259281612be3565b946020939093013593505050565b6000602082840312156125b1578081fd5b81518015158114611fc4578182fd5b6000602082840312156125d1578081fd5b5035919050565b6000602082840312156125e9578081fd5b5051919050565b60008060408385031215612602578182fd5b8251915060208084015167ffffffffffffffff811115612620578283fd5b80850186601f820112612631578384fd5b8051915061264661264183612b97565b612b70565b82815283810190828501858502840186018a1015612662578687fd5b8693505b84841015612684578051835260019390930192918501918501612666565b5080955050505050509250929050565b6000602082840312156126a5578081fd5b815160ff81168114611fc4578182fd5b600082516126c7818460208701612bb7565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0387811682528616602080830191909152604082018690526060820185905260c06080830181905284519083018190526000918581019160e085019190845b8181101561279e57845184529382019392820192600101612782565b50505060a09390930193909352509695505050505050565b6001600160a01b03958616815293909416602084015260408301919091526060820152608081019190915260a00190565b901515815260200190565b6000602082528251806020840152612811816040850160208701612bb7565b601f01601f19169190910160400192915050565b6020808252601d908201527f63616e6e6f74207265766f6b6520616374697665207374726174656779000000604082015260600190565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b6020808252600b908201526a21676f7665726e616e636560a81b604082015260600190565b602080825260079082015266085d185c99d95d60ca1b604082015260600190565b6020808252602c908201527f6e756d657261746f722063616e6e6f742062652067726561746572207468616e60408201526b103232b737b6b4b730ba37b960a11b606082015260800190565b6020808252600a908201526910b1b7b73b32b93a32b960b11b604082015260600190565b60208082526009908201526808585c1c1c9bdd995960ba1b604082015260600190565b602080825260059082015264676c6f626560d81b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526006908201526521676c6f626560d01b604082015260600190565b602080825260119082015270085b5a5b8b59db1bd8994b585b5bdd5b9d607a1b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b602080825260079082015266042d8cadccee8d60cb1b604082015260600190565b6020808252600990820152682174696d656c6f636b60b81b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b6000808335601e19843603018112612b3f578283fd5b8084018035925067ffffffffffffffff831115612b5a578384fd5b6020019250503681900382131561241957600080fd5b60405181810167ffffffffffffffff81118282101715612b8f57600080fd5b604052919050565b600067ffffffffffffffff821115612bad578081fd5b5060209081020190565b60005b83811015612bd2578181015183820152602001612bba565b838111156121865750506000910152565b6001600160a01b0381168114612bf857600080fd5b5056fea2646970667358221220e740d2cf672e50e3ca9e269be63e84e1319c04adf08ad7462e71f26aa32ff95464736f6c63430006070033000000000000000000000000294ab3200ef36200db84c4128b7f1b4eec71e38a000000000000000000000000c9a51fb9057380494262fd291aed74317332c0a2000000000000000000000000c9a51fb9057380494262fd291aed74317332c0a20000000000000000000000000aa5cb6f365259524f7ece8e09cce9a7b394077a000000000000000000000000028933a66dd0ccc239a3d5c2243b2d96672f11f5
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000294ab3200ef36200db84c4128b7f1b4eec71e38a000000000000000000000000c9a51fb9057380494262fd291aed74317332c0a2000000000000000000000000c9a51fb9057380494262fd291aed74317332c0a20000000000000000000000000aa5cb6f365259524f7ece8e09cce9a7b394077a000000000000000000000000028933a66dd0ccc239a3d5c2243b2d96672f11f5
-----Decoded View---------------
Arg [0] : _governance (address): 0x294ab3200ef36200db84c4128b7f1b4eec71e38a
Arg [1] : _strategist (address): 0xc9a51fb9057380494262fd291aed74317332c0a2
Arg [2] : _timelock (address): 0xc9a51fb9057380494262fd291aed74317332c0a2
Arg [3] : _devfund (address): 0x0aa5cb6f365259524f7ece8e09cce9a7b394077a
Arg [4] : _treasury (address): 0x028933a66dd0ccc239a3d5c2243b2d96672f11f5
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000294ab3200ef36200db84c4128b7f1b4eec71e38a
Arg [1] : 000000000000000000000000c9a51fb9057380494262fd291aed74317332c0a2
Arg [2] : 000000000000000000000000c9a51fb9057380494262fd291aed74317332c0a2
Arg [3] : 0000000000000000000000000aa5cb6f365259524f7ece8e09cce9a7b394077a
Arg [4] : 000000000000000000000000028933a66dd0ccc239a3d5c2243b2d96672f11f5
Deployed ByteCode Sourcemap
33734:12716:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33734:12716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;36761:178:0;;;;;;;;;:::i;:::-;;40138:1628;;;;;;;;;:::i;39299:273::-;;;;;;;;;:::i;37421:167::-;;;;;;;;;:::i;34057:25::-;;;:::i;:::-;;;;;;;;;;;;;;;;36287:280;;;;;;;;;:::i;34407:45::-;;;;;;;;;:::i;33868:73::-;;;:::i;37140:273::-;;;;;;;;;:::i;34025:25::-;;;:::i;34118:23::-;;;:::i;35602:214::-;;;;;;;;;:::i;34749:35::-;;;:::i;:::-;;;;;;;;34310:41;;;;;;;;;:::i;39580:455::-;;;;;;;;;:::i;34652:55::-;;;;;;;;;:::i;:::-;;;;;;;;38650:134;;;;;;;;;:::i;37596:462::-;;;;;;;;;:::i;42004:3451::-;;;;;;;;;:::i;34089:22::-;;;:::i;35824:145::-;;;;;;;;;:::i;34251:50::-;;;:::i;34575:70::-;;;;;;;;;:::i;35977:153::-;;;;;;;;;:::i;35139:141::-;;;;;;;;;:::i;38066:576::-;;;;;;;;;:::i;36138:141::-;;;;;;;;;:::i;36947:185::-;;;;;;;;;:::i;39030:261::-;;;;;;;;;:::i;35441:153::-;;;;;;;;;:::i;34148:23::-;;;:::i;34503:65::-;;;;;;;;;:::i;35288:145::-;;;;;;;;;:::i;41774:182::-;;;;;;;;;:::i;33948:68::-;;;:::i;34716:26::-;;;:::i;36575:178::-;;;;;;;;;:::i;38792:230::-;;;;;;;;;:::i;34209:35::-;;;:::i;36761:178::-;36851:10;;-1:-1:-1;;;;;36851:10:0;36837;:24;36829:48;;;;-1:-1:-1;;;36829:48:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36888:35:0;36926:5;36888:35;;;:23;:35;;;;;:43;;-1:-1:-1;;36888:43:0;;;36761:178::o;40138:1628::-;40291:10;;-1:-1:-1;;;;;40291:10:0;40277;:24;;:52;;-1:-1:-1;40319:10:0;;-1:-1:-1;;;;;40319:10:0;40305;:24;40277:52;40255:113;;;;-1:-1:-1;;;40255:113:0;;;;;;;;;40498:39;;-1:-1:-1;;;40498:39:0;;40480:15;;-1:-1:-1;;;;;40498:24:0;;;;;:39;;40531:4;;40498:39;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40498:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40498:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40498:39:0;;;;;;;;;40548:37;;-1:-1:-1;;;40548:37:0;;40480:57;;-1:-1:-1;;;;;;40548:29:0;;;;;:37;;40578:6;;40548:37;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40548:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;40613:39:0;;-1:-1:-1;;;40613:39:0;;40596:14;;-1:-1:-1;;;;;;40613:24:0;;;-1:-1:-1;40613:24:0;;:39;;40646:4;;40613:39;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40613:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40613:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40613:39:0;;;;;;;;;40596:56;;40676:7;40667:6;:16;40663:1096;;;40700:15;40718:19;:6;40729:7;40718:19;:10;:19;:::i;:::-;40700:37;;40752:13;40778:9;-1:-1:-1;;;;;40768:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40768:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40768:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40768:27:0;;;;;;;;;40752:43;;40810:30;40855:17;40904:5;-1:-1:-1;;;;;40897:23:0;;40929:4;40897:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40897:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40897:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40897:38:0;;;;;;;;;40977:8;;;40887:48;;-1:-1:-1;40950:39:0;;-1:-1:-1;;;;;40950:26:0;;;;40977:8;;;40950:39;:26;:39;:::i;:::-;41031:8;;41004:45;;-1:-1:-1;;;;;41004:26:0;;;;41031:8;41041:7;41004:45;:26;:45;:::i;:::-;41107:8;;;41093:93;;-1:-1:-1;;;41093:93:0;;-1:-1:-1;;;;;41107:8:0;;;;41093:59;;:93;;41153:6;;41161:5;;41168:7;;41177:5;;41107:8;41093:93;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41093:93:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41093:93:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;41093:93:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;41093:93:0;;;;;;;;;41215:8;;;41201:198;;-1:-1:-1;;;41201:198:0;;41064:122;;-1:-1:-1;41064:122:0;;-1:-1:-1;;;;;;41215:8:0;;;;41201:28;;:198;;41248:6;;41273:5;;41297:7;;41064:122;;;;41201:198;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41201:198:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;41423:38:0;;-1:-1:-1;;;41423:38:0;;-1:-1:-1;;;;;41423:23:0;;;-1:-1:-1;41423:23:0;;-1:-1:-1;41423:38:0;;41455:4;;41423:38;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41423:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41423:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41423:38:0;;;;;;;;;41414:47;;41489:7;41480:6;:16;41476:272;;;41527:19;:6;41538:7;41527:19;:10;:19;:::i;:::-;41517:29;;41565:17;41585:27;34779:5;41585:18;41597:5;;41585:7;:11;;:18;;;;:::i;:::-;:22;:27;:22;:27;:::i;:::-;41565:47;-1:-1:-1;41631:35:0;41636:5;41643:22;:7;41565:47;41643:22;:11;:22;:::i;41631:35::-;41712:8;;41685:47;;-1:-1:-1;;;;;41685:26:0;;;;41712:8;41722:9;41685:47;:26;:47;:::i;:::-;41476:272;;40663:1096;;;;;40138:1628;;;;;:::o;39299:273::-;39439:10;;-1:-1:-1;;;;;39439:10:0;39425;:24;;:52;;-1:-1:-1;39467:10:0;;-1:-1:-1;;;;;39467:10:0;39453;:24;39425:52;39403:113;;;;-1:-1:-1;;;39403:113:0;;;;;;;;;39527:37;;-1:-1:-1;;;39527:37:0;;-1:-1:-1;;;;;39527:29:0;;;;;:37;;39557:6;;39527:37;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39527:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39527:37:0;;;;39299:273;;:::o;37421:167::-;37515:8;;-1:-1:-1;;;;;37515:8:0;37501:10;:22;37493:44;;;;-1:-1:-1;;;37493:44:0;;;;;;;;;37548:14;:32;37421:167::o;34057:25::-;;;-1:-1:-1;;;;;34057:25:0;;:::o;36287:280::-;36391:10;;-1:-1:-1;;;;;36391:10:0;36377;:24;;:52;;-1:-1:-1;36419:10:0;;-1:-1:-1;;;;;36419:10:0;36405;:24;36377:52;36355:113;;;;-1:-1:-1;;;36355:113:0;;;;;;;;;-1:-1:-1;;;;;36487:14:0;;;36513:1;36487:14;;;:6;:14;;;;;;;:28;36479:46;;;;-1:-1:-1;;;36479:46:0;;;;;;;;;-1:-1:-1;;;;;36536:14:0;;;;;;;:6;:14;;;;;:23;;-1:-1:-1;;;;;;36536:23:0;;;;;;;;36287:280::o;34407:45::-;;;;;;;;;;;;-1:-1:-1;;;;;34407:45:0;;:::o;33868:73::-;33899:42;33868:73;:::o;37140:273::-;37239:10;;-1:-1:-1;;;;;37239:10:0;37225;:24;37217:48;;;;-1:-1:-1;;;37217:48:0;;;;;;;;;-1:-1:-1;;;;;37284:18:0;;;;;;;:10;:18;;;;;;;;:31;;;;;37276:73;;;;-1:-1:-1;;;37276:73:0;;;;;;;;;-1:-1:-1;;;;;37360:26:0;;;37400:5;37360:26;;;:18;:26;;;;;;;;:37;;;;;;;;;;;:45;;-1:-1:-1;;37360:45:0;;;37140:273::o;34025:25::-;;;-1:-1:-1;;;;;34025:25:0;;:::o;34118:23::-;;;-1:-1:-1;;;;;34118:23:0;;:::o;35602:214::-;35676:10;;-1:-1:-1;;;;;35676:10:0;35662;:24;35654:48;;;;-1:-1:-1;;;35654:48:0;;;;;;;;;34779:5;35721:6;:13;;35713:70;;;;-1:-1:-1;;;35713:70:0;;;;;;;;;35794:5;:14;35602:214::o;34749:35::-;34779:5;34749:35;:::o;34310:41::-;;;;;;;;;;;;-1:-1:-1;;;;;34310:41:0;;:::o;39580:455::-;39712:16;39741;39767:6;-1:-1:-1;;;;;39760:24:0;;39785:9;39760:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39760:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39760:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39760:35:0;;;;;;;;;39741:54;;39806:13;39832:9;-1:-1:-1;;;;;39822:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39822:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39822:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39822:27:0;;;;;;;;;39889:8;;;39875:152;;-1:-1:-1;;;39875:152:0;;39806:43;;-1:-1:-1;;;;;;39889:8:0;;39875:41;;:152;;39931:6;;39806:43;;39972:8;;39995:5;;39875:152;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39875:152:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39875:152:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;39875:152:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;39875:152:0;;;;;;;;;-1:-1:-1;39860:167:0;39580:455;-1:-1:-1;;;;;;39580:455:0:o;34652:55::-;;;;;;;;;;;;;;;:::o;38650:134::-;-1:-1:-1;;;;;38745:18:0;;;38708:7;38745:18;;;:10;:18;;;;;;;;;38735:41;;-1:-1:-1;;;38735:41:0;;;;38708:7;;38745:18;;38735:39;;:41;;;;;38745:18;;38735:41;;;;;;38745:18;38735:41;;;2:2:-1;;;;27:1;24;17:12;2:2;38735:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38735:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38735:41:0;;;;;;;;;38728:48;38650:134;-1:-1:-1;;38650:134:0:o;37596:462::-;37706:10;;-1:-1:-1;;;;;37706:10:0;37692;:24;;:52;;-1:-1:-1;37734:10:0;;-1:-1:-1;;;;;37734:10:0;37720;:24;37692:52;37670:113;;;;-1:-1:-1;;;37670:113:0;;;;;;;;;-1:-1:-1;;;;;37802:26:0;;;;;;;:18;:26;;;;;;;;:37;;;;;;;;;;;;:45;;:37;:45;37794:67;;;;-1:-1:-1;;;37794:67:0;;;;;;;;;-1:-1:-1;;;;;37893:18:0;;;37874:16;37893:18;;;:10;:18;;;;;;;37926:22;;37922:88;;37975:8;-1:-1:-1;;;;;37965:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37965:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37965:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;37965:33:0;;;;;;;;;;37922:88;-1:-1:-1;;;;;;38020:18:0;;;;;;;:10;:18;;;;;:30;;-1:-1:-1;;;;;;38020:30:0;;;;;;;;37596:462::o;42004:3451::-;42387:7;42415:31;;;42407:51;;;;-1:-1:-1;;;42407:51:0;;;;;;;;;42514:9;42509:195;42529:19;;;42509:195;;;42601:1;42578:8;;42587:1;42578:11;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42578:25:0;;;42570:48;;;;-1:-1:-1;;;42570:48:0;;;;;;;;;42641:23;:36;42665:8;;42674:1;42665:11;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42641:36:0;;;;;;;;;;;;-1:-1:-1;42641:36:0;;;;42633:59;;;;-1:-1:-1;;;42633:59:0;;;;;;;;;42550:3;;42509:195;;;;42716:23;42749:10;-1:-1:-1;;;;;42742:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42742:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42742:26:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42742:26:0;;;;;;;;;42716:52;;42779:21;42810:8;-1:-1:-1;;;;;42803:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42803:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42803:24:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42803:24:0;;;;;;;;;42779:48;-1:-1:-1;42880:130:0;-1:-1:-1;;;;;42880:35:0;;42930:10;42963:4;42983:16;42880:130;:35;:130;:::i;:::-;43108:34;43145:127;43248:10;-1:-1:-1;;;;;43241:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43241:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43241:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43241:29:0;;;;;;;;;43233:38;;43229:2;:42;43145:65;43187:10;-1:-1:-1;;;;;43180:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43180:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43180:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43180:29:0;;;;;;;;;43145:16;;:65;:34;:65;:::i;:127::-;43108:164;;43535:33;43578:15;-1:-1:-1;;;;;43571:33:0;;43619:10;43571:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43571:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43571:69:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43571:69:0;;;;;;;;;43535:105;;43683:26;43655:25;:54;43651:232;;;-1:-1:-1;;;;;43736:27:0;;;;;;;:10;:27;;;;;;;43726:54;43799:57;:26;43830:25;43799:57;:30;:57;:::i;:::-;43726:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43726:145:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43726:145:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43726:145:0;;;;;;;;;;43651:232;44050:45;-1:-1:-1;;;;;44050:30:0;;44081:10;44093:1;44050:45;:30;:45;:::i;:::-;44106:60;-1:-1:-1;;;;;44106:30:0;;44137:10;44149:16;44106:60;:30;:60;:::i;:::-;44177:45;;-1:-1:-1;;;44177:45:0;;-1:-1:-1;;;;;44177:27:0;;;;;:45;;44205:16;;44177:45;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44177:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;44294:72:0;;-1:-1:-1;;;44294:72:0;;44261:30;;-1:-1:-1;;;;;;44294:33:0;;;-1:-1:-1;44294:33:0;;:72;;44350:4;;44294:72;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44294:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44294:72:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44294:72:0;;;;;;;;;44261:105;;44377:23;44403:89;34295:6;44403:42;44430:14;;44403:22;:26;;:42;;;;:::i;:89::-;44377:115;;44527:1;44509:15;:19;44505:206;;;44582:7;;44545:69;;-1:-1:-1;;;;;44582:7:0;44591:22;:15;44611:1;44591:22;:19;:22;:::i;:::-;-1:-1:-1;;;;;44545:36:0;;;:69;;:36;:69;:::i;:::-;44666:8;;44629:70;;-1:-1:-1;;;;;44666:8:0;44676:22;:15;44696:1;44676:22;:19;:22;:::i;44629:70::-;44767:9;44762:104;44782:19;;;44762:104;;;44823:31;44832:8;;44841:1;44832:11;;;;;;;;;;;;;;;;;;;;;;44845:5;;44851:1;44845:8;;;;;;;;;;;;;;;;;;;;44823:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;44823:8:0;;-1:-1:-1;;;44823:31:0:i;:::-;-1:-1:-1;44803:3:0;;44762:104;;;-1:-1:-1;44930:46:0;;-1:-1:-1;;;44930:46:0;;44913:14;;-1:-1:-1;;;;;44930:31:0;;;;;:46;;44970:4;;44930:46;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44930:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44930:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44930:46:0;;;;;;;;;44913:63;;44987:46;45021:8;45031:1;44994:13;-1:-1:-1;;;;;44987:33:0;;;:46;;;;;:::i;:::-;45044:51;45078:8;45088:6;45051:13;-1:-1:-1;;;;;45044:33:0;;;:51;;;;;:::i;:::-;45113:8;-1:-1:-1;;;;;45106:24:0;;45131:6;45106:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45106:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45106:32:0;;;;45189:19;45218:8;-1:-1:-1;;;;;45211:26:0;;45246:4;45211:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45211:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45211:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45211:41:0;;;;;;;;;45189:63;;45281:17;45267:11;:31;45263:91;;;45315:27;;-1:-1:-1;;;45315:27:0;;;;;;;;45263:91;45373:8;-1:-1:-1;;;;;45366:25:0;;45392:10;45404:11;45366:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45366:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45366:50:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45366:50:0;;;;;;;;;-1:-1:-1;45436:11:0;-1:-1:-1;;;;;;;;42004:3451:0;;;;;;;;;;:::o;34089:22::-;;;-1:-1:-1;;;;;34089:22:0;;:::o;35824:145::-;35904:10;;-1:-1:-1;;;;;35904:10:0;35890;:24;35882:48;;;;-1:-1:-1;;;35882:48:0;;;;;;;;;35941:8;:20;;-1:-1:-1;;;;;;35941:20:0;-1:-1:-1;;;;;35941:20:0;;;;;;;;;;35824:145::o;34251:50::-;34295:6;34251:50;:::o;34575:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35977:153::-;36061:10;;-1:-1:-1;;;;;36061:10:0;36047;:24;36039:48;;;;-1:-1:-1;;;36039:48:0;;;;;;;;;36098:10;:24;;-1:-1:-1;;;;;;36098:24:0;-1:-1:-1;;;;;36098:24:0;;;;;;;;;;35977:153::o;35139:141::-;35217:10;;-1:-1:-1;;;;;35217:10:0;35203;:24;35195:48;;;;-1:-1:-1;;;35195:48:0;;;;;;;;;35254:7;:18;;-1:-1:-1;;;;;;35254:18:0;-1:-1:-1;;;;;35254:18:0;;;;;;;;;;35139:141::o;38066:576::-;-1:-1:-1;;;;;38151:18:0;;;38131:17;38151:18;;;:10;:18;;;;;;;;;38196:27;;-1:-1:-1;;;38196:27:0;;;;38151:18;;;;;38196:25;;:27;;;;;;;;;;;38151:18;38196:27;;;2:2:-1;;;;27:1;24;17:12;2:2;38196:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38196:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38196:27:0;;;;;;;;;38180:43;;38247:6;-1:-1:-1;;;;;38238:15:0;:5;-1:-1:-1;;;;;38238:15:0;;38234:360;;-1:-1:-1;;;;;38290:18:0;;;38270:17;38290:18;;;:10;:18;;;;;;;;:25;;;;;;;;;;;;;;;38330:47;;38290:25;38369:7;38330:47;:27;:47;:::i;:::-;38402:39;;-1:-1:-1;;;38402:39:0;;-1:-1:-1;;;;;38402:28:0;;;;;:39;;38431:9;;38402:39;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38402:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38402:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38402:39:0;;;;;;;;;38392:49;-1:-1:-1;38456:46:0;-1:-1:-1;;;;;38456:26:0;;38483:9;38392:49;38456:46;:26;:46;:::i;:::-;38234:360;;;;38535:47;-1:-1:-1;;;;;38535:27:0;;38563:9;38574:7;38535:47;:27;:47;:::i;:::-;38614:9;-1:-1:-1;;;;;38604:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38604:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38604:30:0;;;;38066:576;;;;:::o;36138:141::-;36218:8;;-1:-1:-1;;;;;36218:8:0;36204:10;:22;36196:44;;;;-1:-1:-1;;;36196:44:0;;;;;;;;;36251:8;:20;;-1:-1:-1;;;;;;36251:20:0;-1:-1:-1;;;;;36251:20:0;;;;;;;;;;36138:141::o;36947:185::-;37047:8;;-1:-1:-1;;;;;37047:8:0;37033:10;:22;37025:44;;;;-1:-1:-1;;;37025:44:0;;;;;;;;;-1:-1:-1;;;;;37080:26:0;;;;;;;:18;:26;;;;;;;;:37;;;;;;;;;;;:44;;-1:-1:-1;;37080:44:0;37120:4;37080:44;;;36947:185::o;39030:261::-;39147:10;;-1:-1:-1;;;;;39147:10:0;39133;:24;;:52;;-1:-1:-1;39175:10:0;;-1:-1:-1;;;;;39175:10:0;39161;:24;39133:52;39111:113;;;;-1:-1:-1;;;39111:113:0;;;;;;;;;39235:48;-1:-1:-1;;;;;39235:27:0;;39263:10;39275:7;39235:48;:27;:48;:::i;:::-;39030:261;;:::o;35441:153::-;35525:10;;-1:-1:-1;;;;;35525:10:0;35511;:24;35503:48;;;;-1:-1:-1;;;35503:48:0;;;;;;;;;35562:10;:24;;-1:-1:-1;;;;;;35562:24:0;-1:-1:-1;;;;;35562:24:0;;;;;;;;;;35441:153::o;34148:23::-;;;-1:-1:-1;;;;;34148:23:0;;:::o;34503:65::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34503:65:0;;:::o;35288:145::-;35368:10;;-1:-1:-1;;;;;35368:10:0;35354;:24;35346:48;;;;-1:-1:-1;;;35346:48:0;;;;;;;;;35405:8;:20;;-1:-1:-1;;;;;;35405:20:0;-1:-1:-1;;;;;35405:20:0;;;;;;;;;;35288:145::o;41774:182::-;-1:-1:-1;;;;;41865:14:0;;;;;;;:6;:14;;;;;;;41851:10;:28;41843:47;;;;-1:-1:-1;;;41843:47:0;;;;;;;;;-1:-1:-1;;;;;41911:18:0;;;;;;;:10;:18;;;;;;;;41901:47;;-1:-1:-1;;;41901:47:0;;41911:18;;;41901:38;;:47;;41940:7;;41901:47;;;;33948:68;;;-1:-1:-1;;;;;33948:68:0;;:::o;34716:26::-;;;;:::o;36575:178::-;36666:10;;-1:-1:-1;;;;;36666:10:0;36652;:24;36644:48;;;;-1:-1:-1;;;36644:48:0;;;;;;;;;-1:-1:-1;;;;;36703:35:0;;;;;:23;:35;;;;;:42;;-1:-1:-1;;36703:42:0;36741:4;36703:42;;;36575:178::o;38792:230::-;38883:10;;-1:-1:-1;;;;;38883:10:0;38869;:24;;:52;;-1:-1:-1;38911:10:0;;-1:-1:-1;;;;;38911:10:0;38897;:24;38869:52;38847:113;;;;-1:-1:-1;;;38847:113:0;;;;;;;;;-1:-1:-1;;;;;38981:18:0;;;;;;;:10;:18;;;;;;;;;38971:43;;-1:-1:-1;;;38971:43:0;;;;38981:18;;;38971:41;;:43;;;;;38981:18;38971:43;;;;;;;38981:18;38971:43;;;2:2:-1;;;;27:1;24;17:12;2:2;38971:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38971:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38971:43:0;;;;;;;;34209:35;;;;:::o;2092:136::-;2150:7;2177:43;2181:1;2184;2177:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2170:50;2092:136;-1:-1:-1;;;2092:136:0:o;28159:622::-;28529:10;;;28528:62;;-1:-1:-1;28545:39:0;;-1:-1:-1;;;28545:39:0;;-1:-1:-1;;;;;28545:15:0;;;;;:39;;28569:4;;28576:7;;28545:39;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28545:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28545:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;28545:39:0;;;;;;;;;:44;28528:62;28520:152;;;;-1:-1:-1;;;28520:152:0;;;;;;;;;28683:90;28703:5;28733:22;;;28757:7;28766:5;28710:62;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;28710:62:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;28710:62:0;;;179:29:-1;;;;160:49;;;28683:19:0;:90::i;:::-;28159:622;;;:::o;2982:471::-;3040:7;3285:6;3281:47;;-1:-1:-1;3315:1:0;3308:8;;3281:47;3352:5;;;3356:1;3352;:5;:1;3376:5;;;;;:10;3368:56;;;;-1:-1:-1;;;3368:56:0;;;;;;;;3929:132;3987:7;4014:39;4018:1;4021;4014:39;;;;;;;;;;;;;;;;;:3;:39::i;27500:177::-;27583:86;27603:5;27633:23;;;27658:2;27662:5;27610:58;;;;;;;;;;27685:205;27786:96;27806:5;27836:27;;;27865:4;27871:2;27875:5;27813:68;;;;;;;;;;;27786:96;27685:205;;;;:::o;45463:984::-;45554:21;-1:-1:-1;;;;;45601:21:0;;45593:41;;;;-1:-1:-1;;;45593:41:0;;;;;;;;;45911:1;45891;45866:5;45860:12;45836:4;45829:5;45825:16;45799:7;45775:4;45768:5;45764:16;45733:194;45953:16;46003:4;45997:11;45985:23;;46120:4;46116:9;46109:4;46102;46096;46092:15;46088:26;46084:42;46074:8;46070:57;46047:4;46022:120;46173:4;46163:8;46156:22;46231:4;46228:1;46221:4;46211:8;46207:19;46192:44;46266:9;46259:17;46299:1;46294:135;;;;46252:177;;46294:135;46405:4;46398;46388:8;46384:19;46377:33;46252:177;;;;45701:739;;;;:::o;2531:192::-;2617:7;2653:12;2645:6;;;;2637:29;;;;-1:-1:-1;;;2637:29:0;;;;;;;;;;-1:-1:-1;;;2689:5:0;;;2531:192::o;29805:761::-;30229:23;30255:69;30283:4;30255:69;;;;;;;;;;;;;;;;;30263:5;-1:-1:-1;;;;;30255:27:0;;;:69;;;;;:::i;:::-;30339:17;;30229:95;;-1:-1:-1;30339:21:0;30335:224;;30481:10;30470:30;;;;;;;;;;;;;;30462:85;;;;-1:-1:-1;;;30462:85:0;;;;;;;;4557:278;4643:7;4678:12;4671:5;4663:28;;;;-1:-1:-1;;;4663:28:0;;;;;;;;;;;4702:9;4718:1;4714;:5;;;;;;;4557:278;-1:-1:-1;;;;;4557:278:0:o;13626:196::-;13729:12;13761:53;13784:6;13792:4;13798:1;13801:12;13761:22;:53::i;:::-;13754:60;13626:196;-1:-1:-1;;;;13626:196:0:o;15003:979::-;15133:12;15166:18;15177:6;15166:10;:18::i;:::-;15158:60;;;;-1:-1:-1;;;15158:60:0;;;;;;;;;15292:12;15306:23;15333:6;-1:-1:-1;;;;;15333:11:0;15353:8;15364:4;15333:36;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;15291:78:0;;;;15384:7;15380:595;;;15415:10;-1:-1:-1;15408:17:0;;-1:-1:-1;15408:17:0;15380:595;15529:17;;:21;15525:439;;15792:10;15786:17;15853:15;15840:10;15836:2;15832:19;15825:44;15740:148;15935:12;15928:20;;-1:-1:-1;;;15928:20:0;;;;;;;;;10708:422;11075:20;11114:8;;;10708:422::o;462:360:-1:-;;;600:3;593:4;585:6;581:17;577:27;567:2;;-1:-1;;608:12;567:2;-1:-1;638:20;;678:18;667:30;;664:2;;;-1:-1;;700:12;664:2;744:4;736:6;732:17;720:29;;795:3;744:4;;779:6;775:17;736:6;761:32;;758:41;755:2;;;812:1;;802:12;755:2;560:262;;;;;;2515:241;;2619:2;2607:9;2598:7;2594:23;2590:32;2587:2;;;-1:-1;;2625:12;2587:2;85:6;72:20;97:33;124:5;97:33;;2763:263;;2878:2;2866:9;2857:7;2853:23;2849:32;2846:2;;;-1:-1;;2884:12;2846:2;226:6;220:13;238:33;265:5;238:33;;3297:366;;;3418:2;3406:9;3397:7;3393:23;3389:32;3386:2;;;-1:-1;;3424:12;3386:2;85:6;72:20;97:33;124:5;97:33;;;3476:63;-1:-1;3576:2;3615:22;;72:20;97:33;72:20;97:33;;;3584:63;;;;3380:283;;;;;;3670:491;;;;3808:2;3796:9;3787:7;3783:23;3779:32;3776:2;;;-1:-1;;3814:12;3776:2;85:6;72:20;97:33;124:5;97:33;;;3866:63;-1:-1;3966:2;4005:22;;72:20;97:33;72:20;97:33;;;3770:391;;3974:63;;-1:-1;;;4074:2;4113:22;;;;2167:20;;3770:391;4168:1219;;;;;;;;;4446:3;4434:9;4425:7;4421:23;4417:33;4414:2;;;-1:-1;;4453:12;4414:2;85:6;72:20;97:33;124:5;97:33;;;4505:63;-1:-1;4605:2;4644:22;;72:20;97:33;72:20;97:33;;;4613:63;-1:-1;4713:2;4752:22;;2167:20;;-1:-1;4821:2;4860:22;;2167:20;;-1:-1;4957:3;4942:19;;4929:33;4982:18;4971:30;;;4968:2;;;-1:-1;;5004:12;4968:2;5042:88;5122:7;5113:6;5102:9;5098:22;5042:88;;;5032:98;;-1:-1;5032:98;-1:-1;5195:3;5180:19;;5167:33;;-1:-1;5209:30;;;5206:2;;;-1:-1;;5242:12;5206:2;;5280:91;5363:7;5354:6;5343:9;5339:22;5280:91;;;4408:979;;;;-1:-1;4408:979;;-1:-1;4408:979;;;;;;5270:101;-1:-1;;;4408:979;5394:366;;;5515:2;5503:9;5494:7;5490:23;5486:32;5483:2;;;-1:-1;;5521:12;5483:2;85:6;72:20;97:33;124:5;97:33;;;5573:63;5673:2;5712:22;;;;2167:20;;-1:-1;;;5477:283;5767:257;;5879:2;5867:9;5858:7;5854:23;5850:32;5847:2;;;-1:-1;;5885:12;5847:2;2046:6;2040:13;30163:5;28613:13;28606:21;30141:5;30138:32;30128:2;;-1:-1;;30174:12;6031:241;;6135:2;6123:9;6114:7;6110:23;6106:32;6103:2;;;-1:-1;;6141:12;6103:2;-1:-1;2167:20;;6097:175;-1:-1;6097:175;6279:263;;6394:2;6382:9;6373:7;6369:23;6365:32;6362:2;;;-1:-1;;6400:12;6362:2;-1:-1;2315:13;;6356:186;-1:-1;6356:186;6549:528;;;6706:2;6694:9;6685:7;6681:23;6677:32;6674:2;;;-1:-1;;6712:12;6674:2;2321:6;2315:13;6764:74;;6896:2;;6885:9;6881:18;6875:25;6920:18;6912:6;6909:30;6906:2;;;-1:-1;;6942:12;6906:2;7044:6;7033:9;7029:22;1363:3;1356:4;1348:6;1344:17;1340:27;1330:2;;-1:-1;;1371:12;1330:2;1411:6;1405:13;1391:27;;1433:80;1448:64;1505:6;1448:64;;;1433:80;;;1541:21;;;1598:14;;;;1573:17;;;1687;;;1678:27;;;;1675:36;-1:-1;1672:2;;;-1:-1;;1714:12;1672:2;-1:-1;1740:10;;1734:217;1759:6;1756:1;1753:13;1734:217;;;2315:13;;1827:61;;1781:1;1774:9;;;;;1902:14;;;;1930;;1734:217;;;1738:14;6962:99;;;;;;;;6668:409;;;;;;7084:259;;7197:2;7185:9;7176:7;7172:23;7168:32;7165:2;;;-1:-1;;7203:12;7165:2;2460:6;2454:13;28917:4;30407:5;28906:16;30384:5;30381:33;30371:2;;-1:-1;;30418:12;15146:262;;8801:5;27418:12;8912:52;8957:6;8952:3;8945:4;8938:5;8934:16;8912:52;;;8976:16;;;;;15271:137;-1:-1;;15271:137;15415:213;-1:-1;;;;;28701:54;;;;7752:37;;15533:2;15518:18;;15504:124;15635:340;-1:-1;;;;;28701:54;;;;7611:58;;15961:2;15946:18;;14977:37;15789:2;15774:18;;15760:215;15982:324;-1:-1;;;;;28701:54;;;7752:37;;28701:54;;16292:2;16277:18;;7752:37;16128:2;16113:18;;16099:207;16313:435;-1:-1;;;;;28701:54;;;7752:37;;28701:54;;;;16651:2;16636:18;;7752:37;16734:2;16719:18;;14977:37;;;;16487:2;16472:18;;16458:290;16755:935;-1:-1;;;;;28701:54;;;7752:37;;28701:54;;17236:2;17221:18;;;7752:37;;;;17319:2;17304:18;;14977:37;;;17402:2;17387:18;;14977:37;;;17071:3;17439;17424:19;;17417:49;;;27418:12;;17056:19;;;27950;;;16755:935;;27272:14;;;;27990;;;;17236:2;16755:935;8240:260;8265:6;8262:1;8259:13;8240:260;;;8326:13;;14977:37;;27805:14;;;;7504;;;;8287:1;8280:9;8240:260;;;-1:-1;;;17675:3;17660:19;;;;9083:58;;;;-1:-1;17472:116;17042:648;-1:-1;;;;;;17042:648;17697:675;-1:-1;;;;;28701:54;;;7752:37;;28701:54;;;;18100:2;18085:18;;7752:37;18183:2;18168:18;;14977:37;;;;18266:2;18251:18;;14977:37;18357:3;18342:19;;9083:58;;;;17935:3;17920:19;;17906:466;18710:201;28613:13;;28606:21;8595:34;;18822:2;18807:18;;18793:118;18918:301;;19056:2;19077:17;19070:47;9298:5;27418:12;27962:6;19056:2;19045:9;19041:18;27950:19;9392:52;9437:6;27990:14;19045:9;27990:14;19056:2;9418:5;9414:16;9392:52;;;29797:7;29781:14;-1:-1;;29777:28;9456:39;;;;27990:14;9456:39;;19027:192;-1:-1;;19027:192;19226:407;19417:2;19431:47;;;9732:2;19402:18;;;27950:19;9768:31;27990:14;;;9748:52;9819:12;;;19388:245;19640:407;19831:2;19845:47;;;10070:2;19816:18;;;27950:19;-1:-1;;;27990:14;;;10086:34;10139:12;;;19802:245;20054:407;20245:2;20259:47;;;10390:2;20230:18;;;27950:19;-1:-1;;;27990:14;;;10406:34;10459:12;;;20216:245;20468:407;20659:2;20673:47;;;10710:1;20644:18;;;27950:19;-1:-1;;;27990:14;;;10725:30;10774:12;;;20630:245;20882:407;21073:2;21087:47;;;11025:2;21058:18;;;27950:19;11061:34;27990:14;;;11041:55;-1:-1;;;11116:12;;;11109:36;11164:12;;;21044:245;21296:407;21487:2;21501:47;;;11415:2;21472:18;;;27950:19;-1:-1;;;27990:14;;;11431:33;11483:12;;;21458:245;21710:407;21901:2;21915:47;;;11734:1;21886:18;;;27950:19;-1:-1;;;27990:14;;;11749:32;11800:12;;;21872:245;22124:407;22315:2;22329:47;;;12051:1;22300:18;;;27950:19;-1:-1;;;27990:14;;;12066:28;12113:12;;;22286:245;22538:407;22729:2;22743:47;;;12364:2;22714:18;;;27950:19;12400:34;27990:14;;;12380:55;-1:-1;;;12455:12;;;12448:25;12492:12;;;22700:245;22952:407;23143:2;23157:47;;;12743:1;23128:18;;;27950:19;-1:-1;;;27990:14;;;12758:29;12806:12;;;23114:245;23366:407;23557:2;23571:47;;;13057:2;23542:18;;;27950:19;-1:-1;;;27990:14;;;13073:40;13132:12;;;23528:245;23780:407;23971:2;23985:47;;;13383:2;23956:18;;;27950:19;13419:31;27990:14;;;13399:52;13470:12;;;23942:245;24194:407;24385:2;24399:47;;;13721:2;24370:18;;;27950:19;13757:34;27990:14;;;13737:55;-1:-1;;;13812:12;;;13805:34;13858:12;;;24356:245;24608:407;24799:2;24813:47;;;14109:1;24784:18;;;27950:19;-1:-1;;;27990:14;;;14124:30;14173:12;;;24770:245;25022:407;25213:2;25227:47;;;14424:1;25198:18;;;27950:19;-1:-1;;;27990:14;;;14439:32;14490:12;;;25184:245;25436:407;25627:2;25641:47;;;14741:2;25612:18;;;27950:19;14777:34;27990:14;;;14757:55;-1:-1;;;14832:12;;;14825:46;14890:12;;;25598:245;25850:213;14977:37;;;25968:2;25953:18;;25939:124;26070:506;;;26205:11;26192:25;26256:48;;26280:8;26264:14;26260:29;26256:48;26236:18;26232:73;26222:2;;-1:-1;;26309:12;26222:2;26350:18;26340:8;26336:33;26403:4;26390:18;26380:28;;26428:18;26420:6;26417:30;26414:2;;;-1:-1;;26450:12;26414:2;26295:4;26478:13;;-1:-1;;26264:14;26510:38;;;26500:49;;26497:2;;;26562:1;;26552:12;26583:256;26645:2;26639:9;26671:17;;;26746:18;26731:34;;26767:22;;;26728:62;26725:2;;;26803:1;;26793:12;26725:2;26645;26812:22;26623:216;;-1:-1;26623:216;26846:304;;27005:18;26997:6;26994:30;26991:2;;;-1:-1;;27027:12;26991:2;-1:-1;27072:4;27060:17;;;27125:15;;26928:222;29437:268;29502:1;29509:101;29523:6;29520:1;29517:13;29509:101;;;29590:11;;;29584:18;29571:11;;;29564:39;29545:2;29538:10;29509:101;;;29625:6;29622:1;29619:13;29616:2;;;-1:-1;;29502:1;29672:16;;29665:27;29486:219;29818:117;-1:-1;;;;;28701:54;;29877:35;;29867:2;;29926:1;;29916:12;29867:2;29861:74;
Swarm Source
ipfs://e740d2cf672e50e3ca9e269be63e84e1319c04adf08ad7462e71f26aa32ff954
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.