idleSUSDYield token contract has migrated to a new address.
Overview
Max Total Supply
25.993990664778594877 idleSUSDYield
Holders
1 (0.00%)
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
IdleTokenV3SUSD
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-06-13 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ 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: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.5.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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.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. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 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. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.0; /** * @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 {ERC20Mintable}. * * 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; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view 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 returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public 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 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 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 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 { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _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 { require(account != address(0), "ERC20: mint to the zero address"); _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 { require(account != address(0), "ERC20: burn from the zero address"); _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 is 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 { 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 Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } } // File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @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. * * 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; } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.5.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. */ contract ReentrancyGuard { // counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; constructor () internal { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call"); } } // File: @openzeppelin/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = _msgSender(); emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/access/Roles.sol pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: @openzeppelin/contracts/access/roles/PauserRole.sol pragma solidity ^0.5.0; contract PauserRole is Context { using Roles for Roles.Role; event PauserAdded(address indexed account); event PauserRemoved(address indexed account); Roles.Role private _pausers; constructor () internal { _addPauser(_msgSender()); } modifier onlyPauser() { require(isPauser(_msgSender()), "PauserRole: caller does not have the Pauser role"); _; } function isPauser(address account) public view returns (bool) { return _pausers.has(account); } function addPauser(address account) public onlyPauser { _addPauser(account); } function renouncePauser() public { _removePauser(_msgSender()); } function _addPauser(address account) internal { _pausers.add(account); emit PauserAdded(account); } function _removePauser(address account) internal { _pausers.remove(account); emit PauserRemoved(account); } } // File: @openzeppelin/contracts/lifecycle/Pausable.sol pragma solidity ^0.5.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract Pausable is Context, PauserRole { /** * @dev Emitted when the pause is triggered by a pauser (`account`). */ event Paused(address account); /** * @dev Emitted when the pause is lifted by a pauser (`account`). */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. Assigns the Pauser role * to the deployer. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Called by a pauser to pause, triggers stopped state. */ function pause() public onlyPauser whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Called by a pauser to unpause, returns to normal state. */ function unpause() public onlyPauser whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing 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. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` 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)); } 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. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "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/iERC20Fulcrum.sol pragma solidity 0.5.16; interface iERC20Fulcrum { function mint( address receiver, uint256 depositAmount) external returns (uint256 mintAmount); function burn( address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid); function tokenPrice() external view returns (uint256 price); function supplyInterestRate() external view returns (uint256); function rateMultiplier() external view returns (uint256); function baseRate() external view returns (uint256); function borrowInterestRate() external view returns (uint256); function avgBorrowInterestRate() external view returns (uint256); function protocolInterestRate() external view returns (uint256); function spreadMultiplier() external view returns (uint256); function totalAssetBorrow() external view returns (uint256); function totalAssetSupply() external view returns (uint256); function nextSupplyInterestRate(uint256) external view returns (uint256); function nextBorrowInterestRate(uint256) external view returns (uint256); function nextLoanInterestRate(uint256) external view returns (uint256); function totalSupplyInterestRate(uint256) external view returns (uint256); function claimLoanToken() external returns (uint256 claimedAmount); function dsr() external view returns (uint256); function chaiPrice() external view returns (uint256); } // File: contracts/interfaces/ILendingProtocol.sol pragma solidity 0.5.16; interface ILendingProtocol { function mint() external returns (uint256); function redeem(address account) external returns (uint256); function nextSupplyRate(uint256 amount) external view returns (uint256); function nextSupplyRateWithParams(uint256[] calldata params) external view returns (uint256); function getAPR() external view returns (uint256); function getPriceInToken() external view returns (uint256); function token() external view returns (address); function underlying() external view returns (address); function availableLiquidity() external view returns (uint256); } // File: contracts/interfaces/IIdleTokenV3.sol /** * @title: Idle Token interface * @author: Idle Labs Inc., idle.finance */ pragma solidity 0.5.16; interface IIdleTokenV3 { // view /** * IdleToken price calculation, in underlying * * @return : price in underlying token */ function tokenPrice() external view returns (uint256 price); /** * @return : underlying token address */ function token() external view returns (address); /** * underlying token decimals * * @return : decimals of underlying token */ function tokenDecimals() external view returns (uint256 decimals); /** * Get APR of every ILendingProtocol * * @return addresses: array of token addresses * @return aprs: array of aprs (ordered in respect to the `addresses` array) */ function getAPRs() external view returns (address[] memory addresses, uint256[] memory aprs); // external // We should save the amount one has deposited to calc interests /** * Used to mint IdleTokens, given an underlying amount (eg. DAI). * This method triggers a rebalance of the pools if needed * NOTE: User should 'approve' _amount of tokens before calling mintIdleToken * NOTE 2: this method can be paused * * @param _amount : amount of underlying token to be lended * @param : pass [] * @return mintedTokens : amount of IdleTokens minted */ function mintIdleToken(uint256 _amount, uint256[] calldata) external returns (uint256 mintedTokens); /** * Here we calc the pool share one can withdraw given the amount of IdleToken they want to burn * This method triggers a rebalance of the pools if needed * NOTE: If the contract is paused or iToken price has decreased one can still redeem but no rebalance happens. * NOTE 2: If iToken price has decresed one should not redeem (but can do it) otherwise he would capitalize the loss. * Ideally one should wait until the black swan event is terminated * * @param _amount : amount of IdleTokens to be burned * @param : pass [] * @return redeemedTokens : amount of underlying tokens redeemed */ function redeemIdleToken(uint256 _amount, bool _skipRebalance, uint256[] calldata) external returns (uint256 redeemedTokens); /** * Here we calc the pool share one can withdraw given the amount of IdleToken they want to burn * and send interest-bearing tokens (eg. cDAI/iDAI) directly to the user. * Underlying (eg. DAI) is not redeemed here. * * @param _amount : amount of IdleTokens to be burned */ function redeemInterestBearingTokens(uint256 _amount) external; /** * @param _newAmount : amount of underlying tokens that needs to be minted with this rebalance * @param : pass [] * @return : whether has rebalanced or not */ function rebalance(uint256 _newAmount, uint256[] calldata) external returns (bool); /** * @return : whether has rebalanced or not */ function rebalance() external returns (bool); } // File: contracts/interfaces/IIdleRebalancerV3.sol /** * @title: Idle Rebalancer interface * @author: Idle Labs Inc., idle.finance */ pragma solidity 0.5.16; interface IIdleRebalancerV3 { function getAllocations() external view returns (uint256[] memory _allocations); } // File: contracts/IdleRebalancerV3.sol /** * @title: Idle Rebalancer contract * @summary: Used for calculating amounts to lend on each implemented protocol. * This implementation works with Compound and Fulcrum only, * when a new protocol will be added this should be replaced * @author: Idle Labs Inc., idle.finance */ pragma solidity 0.5.16; contract IdleRebalancerV3 is IIdleRebalancerV3, Ownable { using SafeMath for uint256; uint256[] public lastAmounts; address[] public lastAmountsAddresses; address public rebalancerManager; address public idleToken; /** * @param _cToken : cToken address * @param _iToken : iToken address * @param _aToken : aToken address * @param _yxToken : yxToken address * @param _rebalancerManager : rebalancerManager address */ constructor(address _cToken, address _iToken, address _aToken, address _yxToken, address _rebalancerManager) public { require(_cToken != address(0) && _iToken != address(0) && _aToken != address(0) && _yxToken != address(0) && _rebalancerManager != address(0), 'some addr is 0'); rebalancerManager = _rebalancerManager; // Initially 100% on first lending protocol lastAmounts = [100000, 0, 0, 0]; lastAmountsAddresses = [_cToken, _iToken, _aToken, _yxToken]; } /** * Throws if called by any account other than rebalancerManager. */ modifier onlyRebalancerAndIdle() { require(msg.sender == rebalancerManager || msg.sender == idleToken, "Only rebalacer and IdleToken"); _; } /** * It allows owner to set the allowed rebalancer address * * @param _rebalancerManager : rebalance manager address */ function setRebalancerManager(address _rebalancerManager) external onlyOwner { require(_rebalancerManager != address(0), "_rebalancerManager addr is 0"); rebalancerManager = _rebalancerManager; } function setIdleToken(address _idleToken) external onlyOwner { require(idleToken == address(0), "idleToken addr already set"); require(_idleToken != address(0), "_idleToken addr is 0"); idleToken = _idleToken; } /** * It adds a new token address to lastAmountsAddresses list * * @param _newToken : new interest bearing token address */ function setNewToken(address _newToken) external onlyOwner { require(_newToken != address(0), "New token should be != 0"); for (uint256 i = 0; i < lastAmountsAddresses.length; i++) { if (lastAmountsAddresses[i] == _newToken) { return; } } lastAmountsAddresses.push(_newToken); lastAmounts.push(0); } // end onlyOwner /** * Used by Rebalance manager to set the new allocations * * @param _allocations : array with allocations in percentages (100% => 100000) * @param _addresses : array with addresses of tokens used, should be equal to lastAmountsAddresses */ function setAllocations(uint256[] calldata _allocations, address[] calldata _addresses) external onlyRebalancerAndIdle { require(_allocations.length == lastAmounts.length, "Alloc lengths are different, allocations"); require(_allocations.length == _addresses.length, "Alloc lengths are different, addresses"); uint256 total; for (uint256 i = 0; i < _allocations.length; i++) { require(_addresses[i] == lastAmountsAddresses[i], "Addresses do not match"); total = total.add(_allocations[i]); lastAmounts[i] = _allocations[i]; } require(total == 100000, "Not allocating 100%"); } function getAllocations() external view returns (uint256[] memory _allocations) { return lastAmounts; } function getAllocationsLength() external view returns (uint256) { return lastAmounts.length; } } // File: contracts/interfaces/IIdleToken.sol /** * @title: Idle Token interface * @author: Idle Labs Inc., idle.finance */ pragma solidity 0.5.16; interface IIdleToken { // view /** * IdleToken price calculation, in underlying * * @return : price in underlying token */ function tokenPrice() external view returns (uint256 price); /** * underlying token decimals * * @return : decimals of underlying token */ function tokenDecimals() external view returns (uint256 decimals); /** * Get APR of every ILendingProtocol * * @return addresses: array of token addresses * @return aprs: array of aprs (ordered in respect to the `addresses` array) */ function getAPRs() external view returns (address[] memory addresses, uint256[] memory aprs); // external // We should save the amount one has deposited to calc interests /** * Used to mint IdleTokens, given an underlying amount (eg. DAI). * This method triggers a rebalance of the pools if needed * NOTE: User should 'approve' _amount of tokens before calling mintIdleToken * NOTE 2: this method can be paused * * @param _amount : amount of underlying token to be lended * @param _clientProtocolAmounts : client side calculated amounts to put on each lending protocol * @return mintedTokens : amount of IdleTokens minted */ function mintIdleToken(uint256 _amount, uint256[] calldata _clientProtocolAmounts) external returns (uint256 mintedTokens); /** * @param _amount : amount of underlying token to be lended * @return : address[] array with all token addresses used, * eg [cTokenAddress, iTokenAddress] * @return : uint256[] array with all amounts for each protocol in order, * eg [amountCompound, amountFulcrum] */ function getParamsForMintIdleToken(uint256 _amount) external returns (address[] memory, uint256[] memory); /** * Here we calc the pool share one can withdraw given the amount of IdleToken they want to burn * This method triggers a rebalance of the pools if needed * NOTE: If the contract is paused or iToken price has decreased one can still redeem but no rebalance happens. * NOTE 2: If iToken price has decresed one should not redeem (but can do it) otherwise he would capitalize the loss. * Ideally one should wait until the black swan event is terminated * * @param _amount : amount of IdleTokens to be burned * @param _clientProtocolAmounts : client side calculated amounts to put on each lending protocol * @return redeemedTokens : amount of underlying tokens redeemed */ function redeemIdleToken(uint256 _amount, bool _skipRebalance, uint256[] calldata _clientProtocolAmounts) external returns (uint256 redeemedTokens); /** * @param _amount : amount of IdleTokens to be burned * @param _skipRebalance : whether to skip the rebalance process or not * @return : address[] array with all token addresses used, * eg [cTokenAddress, iTokenAddress] * @return : uint256[] array with all amounts for each protocol in order, * eg [amountCompound, amountFulcrum] */ function getParamsForRedeemIdleToken(uint256 _amount, bool _skipRebalance) external returns (address[] memory, uint256[] memory); /** * Here we calc the pool share one can withdraw given the amount of IdleToken they want to burn * and send interest-bearing tokens (eg. cDAI/iDAI) directly to the user. * Underlying (eg. DAI) is not redeemed here. * * @param _amount : amount of IdleTokens to be burned */ function redeemInterestBearingTokens(uint256 _amount) external; /** * @param _clientProtocolAmounts : client side calculated amounts to put on each lending protocol * @return claimedTokens : amount of underlying tokens claimed */ function claimITokens(uint256[] calldata _clientProtocolAmounts) external returns (uint256 claimedTokens); /** * @param _newAmount : amount of underlying tokens that needs to be minted with this rebalance * @param _clientProtocolAmounts : client side calculated amounts to put on each lending protocol * @return : whether has rebalanced or not */ function rebalance(uint256 _newAmount, uint256[] calldata _clientProtocolAmounts) external returns (bool); /** * @param _newAmount : amount of underlying tokens that needs to be minted with this rebalance * @return : address[] array with all token addresses used, * eg [cTokenAddress, iTokenAddress] * @return : uint256[] array with all amounts for each protocol in order, * eg [amountCompound, amountFulcrum] */ function getParamsForRebalance(uint256 _newAmount) external returns (address[] memory, uint256[] memory); } // File: contracts/IdlePriceCalculator.sol /** * @title: Idle Price Calculator contract * @summary: Used for calculating the current IdleToken price in underlying (eg. DAI) * price is: Net Asset Value / totalSupply * @author: Idle Labs Inc., idle.finance */ pragma solidity 0.5.16; contract IdlePriceCalculator { using SafeMath for uint256; /** * IdleToken price calculation, in underlying (eg. DAI) * * @return : price in underlying token */ function tokenPrice( uint256 totalSupply, address idleToken, address[] calldata currentTokensUsed, address[] calldata protocolWrappersAddresses ) external view returns (uint256 price) { require(currentTokensUsed.length == protocolWrappersAddresses.length, "Different Length"); if (totalSupply == 0) { return 10**(IIdleToken(idleToken).tokenDecimals()); } uint256 currPrice; uint256 currNav; uint256 totNav; for (uint256 i = 0; i < currentTokensUsed.length; i++) { currPrice = ILendingProtocol(protocolWrappersAddresses[i]).getPriceInToken(); // NAV = price * poolSupply currNav = currPrice.mul(IERC20(currentTokensUsed[i]).balanceOf(idleToken)); totNav = totNav.add(currNav); } price = totNav.div(totalSupply); // idleToken price in token wei } } // File: contracts/interfaces/GasToken.sol pragma solidity 0.5.16; interface GasToken { function freeUpTo(uint256 value) external returns (uint256 freed); function freeFromUpTo(address from, uint256 value) external returns (uint256 freed); function balanceOf(address from) external returns (uint256 balance); } // File: contracts/GST2Consumer.sol pragma solidity 0.5.16; contract GST2Consumer { GasToken public constant gst2 = GasToken(0x0000000000b3F879cb30FE243b4Dfee438691c04); uint256[] internal gasAmounts = [14154, 41130, 27710, 7020]; modifier gasDiscountFrom(address from) { uint256 initialGasLeft = gasleft(); _; _makeGasDiscount(initialGasLeft - gasleft(), from); } function _makeGasDiscount(uint256 gasSpent, address from) internal { // For more info https://gastoken.io/ // 14154 -> FREE_BASE -> base cost of freeing // 41130 -> 2 * REIMBURSE - FREE_TOKEN -> 2 * 24000 - 6870 uint256 tokens = (gasSpent + gasAmounts[0]) / gasAmounts[1]; uint256 safeNumTokens; uint256 gas = gasleft(); // For more info https://github.com/projectchicago/gastoken/blob/master/contract/gst2_free_example.sol if (gas >= gasAmounts[2]) { safeNumTokens = (gas - gasAmounts[2]) / gasAmounts[3]; } if (tokens > safeNumTokens) { tokens = safeNumTokens; } if (tokens > 0) { if (from == address(this)) { gst2.freeUpTo(tokens); } else { gst2.freeFromUpTo(from, tokens); } } } } // File: contracts/IdleTokenV3SUSD.sol /** * @title: Idle Token (V3) main contract * @summary: ERC20 that holds pooled user funds together * Each token rapresent a share of the underlying pools * and with each token user have the right to redeem a portion of these pools * @author: Idle Labs Inc., idle.finance */ pragma solidity 0.5.16; contract IdleTokenV3SUSD is ERC20, ERC20Detailed, ReentrancyGuard, Ownable, Pausable, IIdleTokenV3, GST2Consumer { using SafeERC20 for IERC20; using SafeMath for uint256; // eg. cTokenAddress => IdleCompoundAddress mapping(address => address) public protocolWrappers; // eg. DAI address address public token; // eg. iDAI address address public iToken; // used for claimITokens and userClaimITokens // Idle rebalancer current implementation address address public rebalancer; // Idle price calculator current implementation address address public priceCalculator; // Address collecting underlying fees address public feeAddress; // Last iToken price, used to pause contract in case of a black swan event uint256 public lastITokenPrice; // eg. 18 for DAI uint256 public tokenDecimals; // Max possible fee on interest gained uint256 constant MAX_FEE = 10000; // 100000 == 100% -> 10000 == 10% // Min delay for adding a new protocol uint256 constant NEW_PROTOCOL_DELAY = 60 * 60 * 24 * 3; // 3 days in seconds // Current fee on interest gained uint256 public fee; // Manual trigger for unpausing contract in case of a black swan event that caused the iToken price to not // return to the normal level bool public manualPlay; // Flag for disabling openRebalance for the risk adjusted variant bool public isRiskAdjusted; // Flag for disabling instant new protocols additions bool public isNewProtocolDelayed; // eg. [cTokenAddress, iTokenAddress, ...] address[] public allAvailableTokens; // last fully applied allocations (ie when all liquidity has been correctly placed) // eg. [5000, 0, 5000, 0] for 50% in compound, 0% fulcrum, 50% aave, 0 dydx. same order of allAvailableTokens uint256[] public lastAllocations; // Map that saves avg idleToken price paid for each user mapping(address => uint256) public userAvgPrices; // Map that saves amount with no fee for each user mapping(address => uint256) private userNoFeeQty; // timestamp when new protocol wrapper has been queued for change // protocol_wrapper_address -> timestamp mapping(address => uint256) public releaseTimes; /** * @dev constructor, initialize some variables, mainly addresses of other contracts * * @param _name : IdleToken name * @param _symbol : IdleToken symbol * @param _decimals : IdleToken decimals * @param _token : underlying token address * @param _aToken : aToken address * @param _rebalancer : Idle Rebalancer address * @param _idleAave : Idle Aave address */ constructor( string memory _name, // eg. IdleDAI string memory _symbol, // eg. IDLEDAI uint8 _decimals, // eg. 18 address _token, address _aToken, address _rebalancer, address _priceCalculator, address _idleAave) public ERC20Detailed(_name, _symbol, _decimals) { token = _token; tokenDecimals = ERC20Detailed(_token).decimals(); rebalancer = _rebalancer; priceCalculator = _priceCalculator; protocolWrappers[_aToken] = _idleAave; allAvailableTokens = [_aToken]; } // During a black swan event is possible that iToken price decreases instead of increasing, // with the consequence of lowering the IdleToken price. To mitigate this we implemented a // check on the iToken price that prevents users from minting cheap IdleTokens or rebalancing // the pool in this specific case. The redeemIdleToken won't be paused but the rebalance process // won't be triggered in this case. modifier whenITokenPriceHasNotDecreased() { if (iToken != address(0)) { uint256 iTokenPrice = iERC20Fulcrum(iToken).tokenPrice(); require( iTokenPrice >= lastITokenPrice || manualPlay, "Paused: iToken price decreased" ); _; if (iTokenPrice > lastITokenPrice) { lastITokenPrice = iTokenPrice; } } else { _; } } // onlyOwner /** * It allows owner to set the IdleRebalancerV3 address * * @param _rebalancer : new IdleRebalancerV3 address */ function setRebalancer(address _rebalancer) external onlyOwner { require(_rebalancer != address(0), 'Addr is 0'); rebalancer = _rebalancer; } /** * It allows owner to set the IdlePriceCalculator address * * @param _priceCalculator : new IdlePriceCalculator address */ function setPriceCalculator(address _priceCalculator) external onlyOwner { require(_priceCalculator != address(0), 'Addr is 0'); if (!isNewProtocolDelayed || (releaseTimes[_priceCalculator] != 0 && now - releaseTimes[_priceCalculator] > NEW_PROTOCOL_DELAY)) { priceCalculator = _priceCalculator; releaseTimes[_priceCalculator] = 0; return; } releaseTimes[_priceCalculator] = now; } /** * It allows owner to set a protocol wrapper address * * @param _token : underlying token address (eg. DAI) * @param _wrapper : Idle protocol wrapper address */ function setProtocolWrapper(address _token, address _wrapper) external onlyOwner { require(_token != address(0) && _wrapper != address(0), 'some addr is 0'); if (!isNewProtocolDelayed || (releaseTimes[_wrapper] != 0 && now - releaseTimes[_wrapper] > NEW_PROTOCOL_DELAY)) { // update allAvailableTokens if needed if (protocolWrappers[_token] == address(0)) { allAvailableTokens.push(_token); } protocolWrappers[_token] = _wrapper; releaseTimes[_wrapper] = 0; return; } releaseTimes[_wrapper] = now; } /** * It allows owner to unpause the contract when iToken price decreased and didn't return to the expected level * * @param _manualPlay : flag */ function setManualPlay(bool _manualPlay) external onlyOwner { manualPlay = _manualPlay; } /** * It allows owner to disable openRebalance * * @param _isRiskAdjusted : flag */ function setIsRiskAdjusted(bool _isRiskAdjusted) external onlyOwner { isRiskAdjusted = _isRiskAdjusted; } /** * It permanently disable instant new protocols additions */ function delayNewProtocols() external onlyOwner { isNewProtocolDelayed = true; } /** * It allows owner to set the fee (1000 == 10% of gained interest) * * @param _fee : fee amount where 100000 is 100%, max settable is MAX_FEE constant */ function setFee(uint256 _fee) external onlyOwner { require(_fee <= MAX_FEE, "Fee too high"); fee = _fee; } /** * It allows owner to set the fee address * * @param _feeAddress : fee address */ function setFeeAddress(address _feeAddress) external onlyOwner { require(_feeAddress != address(0), 'Addr is 0'); feeAddress = _feeAddress; } /** * It allows owner to set gas parameters * * @param _amounts : fee amount where 100000 is 100%, max settable is MAX_FEE constant */ function setGasParams(uint256[] calldata _amounts) external onlyOwner { gasAmounts = _amounts; } // view /** * IdleToken price calculation, in underlying * * @return : price in underlying token */ function tokenPrice() public view returns (uint256 price) { address[] memory protocolWrappersAddresses = new address[](allAvailableTokens.length); for (uint256 i = 0; i < allAvailableTokens.length; i++) { protocolWrappersAddresses[i] = protocolWrappers[allAvailableTokens[i]]; } price = IdlePriceCalculator(priceCalculator).tokenPrice( totalSupply(), address(this), allAvailableTokens, protocolWrappersAddresses ); } /** * Get APR of every ILendingProtocol * * @return addresses: array of token addresses * @return aprs: array of aprs (ordered in respect to the `addresses` array) */ function getAPRs() external view returns (address[] memory addresses, uint256[] memory aprs) { address currToken; addresses = new address[](allAvailableTokens.length); aprs = new uint256[](allAvailableTokens.length); for (uint256 i = 0; i < allAvailableTokens.length; i++) { currToken = allAvailableTokens[i]; addresses[i] = currToken; aprs[i] = ILendingProtocol(protocolWrappers[currToken]).getAPR(); } } /** * Get current avg APR of this IdleToken * * @return avgApr: current weighted avg apr */ function getAvgAPR() public view returns (uint256 avgApr) { (, uint256[] memory amounts, uint256 total) = _getCurrentAllocations(); uint256 currApr; uint256 weight; for (uint256 i = 0; i < allAvailableTokens.length; i++) { if (amounts[i] == 0) { continue; } currApr = ILendingProtocol(protocolWrappers[allAvailableTokens[i]]).getAPR(); weight = amounts[i].mul(10**18).div(total); avgApr = avgApr.add(currApr.mul(weight).div(10**18)); } } // ##### ERC20 modified transfer and transferFrom that also update the avgPrice paid for the recipient function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, allowance(sender, msg.sender).sub(amount, "ERC20: transfer amount exceeds allowance")); _updateAvgPrice(recipient, amount, userAvgPrices[sender]); return true; } function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(msg.sender, recipient, amount); _updateAvgPrice(recipient, amount, userAvgPrices[msg.sender]); return true; } // ##### // external /** * Used to mint IdleTokens, given an underlying amount (eg. DAI). * This method triggers a rebalance of the pools if needed and if _skipWholeRebalance is false * NOTE: User should 'approve' _amount of tokens before calling mintIdleToken * NOTE 2: this method can be paused * This method use GasTokens of this contract (if present) to get a gas discount * * @param _amount : amount of underlying token to be lended * @param _skipWholeRebalance : flag to choose whter to do a full rebalance or not * @return mintedTokens : amount of IdleTokens minted */ function mintIdleToken(uint256 _amount, bool _skipWholeRebalance) external nonReentrant gasDiscountFrom(address(this)) returns (uint256 mintedTokens) { return _mintIdleToken(_amount, new uint256[](0), _skipWholeRebalance); } /** * DEPRECATED: Used to mint IdleTokens, given an underlying amount (eg. DAI). * Keep for backward compatibility with IdleV2 * * @param _amount : amount of underlying token to be lended * @param : not used, pass empty array * @return mintedTokens : amount of IdleTokens minted */ function mintIdleToken(uint256 _amount, uint256[] calldata) external nonReentrant gasDiscountFrom(address(this)) returns (uint256 mintedTokens) { return _mintIdleToken(_amount, new uint256[](0), false); } /** * Here we calc the pool share one can withdraw given the amount of IdleToken they want to burn * This method triggers a rebalance of the pools if needed * NOTE: If the contract is paused or iToken price has decreased one can still redeem but no rebalance happens. * NOTE 2: If iToken price has decresed one should not redeem (but can do it) otherwise he would capitalize the loss. * Ideally one should wait until the black swan event is terminated * * @param _amount : amount of IdleTokens to be burned * @param _skipRebalance : whether to skip the rebalance process or not * @param : not used * @return redeemedTokens : amount of underlying tokens redeemed */ function redeemIdleToken(uint256 _amount, bool _skipRebalance, uint256[] calldata) external nonReentrant returns (uint256 redeemedTokens) { uint256 balance; for (uint256 i = 0; i < allAvailableTokens.length; i++) { balance = IERC20(allAvailableTokens[i]).balanceOf(address(this)); if (balance == 0) { continue; } redeemedTokens = redeemedTokens.add( _redeemProtocolTokens( protocolWrappers[allAvailableTokens[i]], allAvailableTokens[i], // _amount * protocolPoolBalance / idleSupply _amount.mul(balance).div(totalSupply()), // amount to redeem address(this) ) ); } _burn(msg.sender, _amount); if (fee > 0 && feeAddress != address(0)) { redeemedTokens = _getFee(_amount, redeemedTokens); } // send underlying minus fee to msg.sender IERC20(token).safeTransfer(msg.sender, redeemedTokens); if (this.paused() || iERC20Fulcrum(iToken).tokenPrice() < lastITokenPrice || _skipRebalance) { return redeemedTokens; } _rebalance(0, false); } /** * Here we calc the pool share one can withdraw given the amount of IdleToken they want to burn * and send interest-bearing tokens (eg. cDAI/iDAI) directly to the user. * Underlying (eg. DAI) is not redeemed here. * * @param _amount : amount of IdleTokens to be burned */ function redeemInterestBearingTokens(uint256 _amount) external nonReentrant { uint256 idleSupply = totalSupply(); address currentToken; uint256 balance; for (uint256 i = 0; i < allAvailableTokens.length; i++) { currentToken = allAvailableTokens[i]; balance = IERC20(currentToken).balanceOf(address(this)); if (balance == 0) { continue; } IERC20(currentToken).safeTransfer( msg.sender, _amount.mul(balance).div(idleSupply) // amount to redeem ); } _burn(msg.sender, _amount); } /** * Allow any users to set new allocations as long as the new allocations * give a better avg APR than before * Allocations should be in the format [100000, 0, 0, 0, ...] where length is the same * as lastAllocations variable and the sum of all value should be == 100000 * * This method is not callble if this instance of IdleToken is a risk adjusted instance * NOTE: this method can be paused * * @param _newAllocations : array with new allocations in percentage * @return : whether has rebalanced or not * @return avgApr : the new avg apr after rebalance */ function openRebalance(uint256[] calldata _newAllocations) external whenNotPaused whenITokenPriceHasNotDecreased returns (bool, uint256 avgApr) { require(!isRiskAdjusted, "Setting allocations not allowed"); uint256 initialAPR = getAvgAPR(); // Validate and update rebalancer allocations IdleRebalancerV3(rebalancer).setAllocations(_newAllocations, allAvailableTokens); bool hasRebalanced = _rebalance(0, false); uint256 newAprAfterRebalance = getAvgAPR(); require(newAprAfterRebalance > initialAPR, "APR not improved"); return (hasRebalanced, newAprAfterRebalance); } /** * Dynamic allocate all the pool across different lending protocols if needed, use gas refund from gasToken * * NOTE: this method can be paused. * msg.sender should approve this contract to spend GST2 tokens before calling * this method * * @return : whether has rebalanced or not */ function rebalanceWithGST() external gasDiscountFrom(msg.sender) returns (bool) { return _rebalance(0, false); } /** * DEPRECATED: Dynamic allocate all the pool across different lending protocols if needed, * Keep for backward compatibility with IdleV2 * * NOTE: this method can be paused * * @param : not used * @param : not used * @return : whether has rebalanced or not */ function rebalance(uint256, uint256[] calldata) external returns (bool) { return _rebalance(0, false); } /** * Dynamic allocate all the pool across different lending protocols if needed, * rebalance without params * * NOTE: this method can be paused * * @return : whether has rebalanced or not */ function rebalance() external returns (bool) { return _rebalance(0, false); } /** * Get the contract balance of every protocol currently used * * @return tokenAddresses : array with all token addresses used, * eg [cTokenAddress, iTokenAddress] * @return amounts : array with all amounts for each protocol in order, * eg [amountCompoundInUnderlying, amountFulcrumInUnderlying] * @return total : total AUM in underlying */ function getCurrentAllocations() external view returns (address[] memory tokenAddresses, uint256[] memory amounts, uint256 total) { return _getCurrentAllocations(); } // internal /** * Used to mint IdleTokens, given an underlying amount (eg. DAI). * This method triggers a rebalance of the pools if needed * NOTE: User should 'approve' _amount of tokens before calling mintIdleToken * NOTE 2: this method can be paused * This method use GasTokens of this contract (if present) to get a gas discount * * @param _amount : amount of underlying token to be lended * @param : not used * @param _skipWholeRebalance : flag to decide if doing a simple mint or mint + rebalance * @return mintedTokens : amount of IdleTokens minted */ function _mintIdleToken(uint256 _amount, uint256[] memory, bool _skipWholeRebalance) internal whenNotPaused whenITokenPriceHasNotDecreased returns (uint256 mintedTokens) { // Get current IdleToken price uint256 idlePrice = tokenPrice(); // transfer tokens to this contract IERC20(token).safeTransferFrom(msg.sender, address(this), _amount); // Rebalance the current pool if needed and mint new supplied amount _rebalance(0, _skipWholeRebalance); mintedTokens = _amount.mul(10**18).div(idlePrice); _mint(msg.sender, mintedTokens); _updateAvgPrice(msg.sender, mintedTokens, idlePrice); } /** * Dynamic allocate all the pool across different lending protocols if needed * * NOTE: this method can be paused * * @param : not used * @return : whether has rebalanced or not */ function _rebalance(uint256, bool _skipWholeRebalance) internal whenNotPaused whenITokenPriceHasNotDecreased returns (bool) { // check if we need to rebalance by looking at the allocations in rebalancer contract uint256[] memory rebalancerLastAllocations = IdleRebalancerV3(rebalancer).getAllocations(); bool areAllocationsEqual = rebalancerLastAllocations.length == lastAllocations.length; if (areAllocationsEqual) { for (uint256 i = 0; i < lastAllocations.length || !areAllocationsEqual; i++) { if (lastAllocations[i] != rebalancerLastAllocations[i]) { areAllocationsEqual = false; break; } } } uint256 balance = IERC20(token).balanceOf(address(this)); if (areAllocationsEqual && balance == 0) { return false; } if (balance > 0) { if (lastAllocations.length == 0 && _skipWholeRebalance) { // set in storage lastAllocations = rebalancerLastAllocations; } _mintWithAmounts(allAvailableTokens, _amountsFromAllocations(rebalancerLastAllocations, balance)); } if (_skipWholeRebalance || areAllocationsEqual) { return false; } // Instead of redeeming everything during rebalance we redeem and mint only what needs // to be reallocated // get current allocations in underlying (address[] memory tokenAddresses, uint256[] memory amounts, uint256 totalInUnderlying) = _getCurrentAllocations(); // calculate new allocations given the total uint256[] memory newAmounts = _amountsFromAllocations(rebalancerLastAllocations, totalInUnderlying); (uint256[] memory toMintAllocations, uint256 totalToMint, bool lowLiquidity) = _redeemAllNeeded(tokenAddresses, amounts, newAmounts); // if some protocol has liquidity that we should redeem, we do not update // lastAllocations to force another rebalance next time if (!lowLiquidity) { // Update lastAllocations with rebalancerLastAllocations delete lastAllocations; lastAllocations = rebalancerLastAllocations; } uint256 totalRedeemd = IERC20(token).balanceOf(address(this)); if (totalRedeemd > 1 && totalToMint > 1) { // Do not mint directly using toMintAllocations check with totalRedeemd uint256[] memory tempAllocations = new uint256[](toMintAllocations.length); for (uint256 i = 0; i < toMintAllocations.length; i++) { // Calc what would have been the correct allocations percentage if all was available tempAllocations[i] = toMintAllocations[i].mul(100000).div(totalToMint); } uint256[] memory partialAmounts = _amountsFromAllocations(tempAllocations, totalRedeemd); _mintWithAmounts(allAvailableTokens, partialAmounts); } return true; // hasRebalanced } /** * Update avg price paid for each idle token of a user * * @param usr : user that should have balance update * @param qty : new amount deposited / transferred, in idleToken * @param price : curr idleToken price in underlying */ function _updateAvgPrice(address usr, uint256 qty, uint256 price) internal { if (fee == 0) { userNoFeeQty[usr] = userNoFeeQty[usr].add(qty); return; } uint256 totBalance = balanceOf(usr).sub(userNoFeeQty[usr]); uint256 oldAvgPrice = userAvgPrices[usr]; uint256 oldBalance = totBalance.sub(qty); userAvgPrices[usr] = oldAvgPrice.mul(oldBalance).div(totBalance).add(price.mul(qty).div(totBalance)); } /** * Calculate fee and send them to feeAddress * * @param amount : in idleTokens * @param redeemed : in underlying * @return : net value in underlying */ function _getFee(uint256 amount, uint256 redeemed) internal returns (uint256) { uint256 noFeeQty = userNoFeeQty[msg.sender]; uint256 currPrice = tokenPrice(); if (noFeeQty > 0 && noFeeQty > amount) { noFeeQty = amount; } uint256 totalValPaid = noFeeQty.mul(currPrice).add(amount.sub(noFeeQty).mul(userAvgPrices[msg.sender])).div(10**18); uint256 currVal = amount.mul(currPrice).div(10**18); if (currVal < totalValPaid) { return redeemed; } uint256 gain = currVal.sub(totalValPaid); uint256 feeDue = gain.mul(fee).div(100000); IERC20(token).safeTransfer(feeAddress, feeDue); userNoFeeQty[msg.sender] = userNoFeeQty[msg.sender].sub(noFeeQty); return currVal.sub(feeDue); } /** * Mint specific amounts of protocols tokens * * @param tokenAddresses : array of protocol tokens * @param protocolAmounts : array of amounts to be minted * @return : net value in underlying */ function _mintWithAmounts(address[] memory tokenAddresses, uint256[] memory protocolAmounts) internal { // mint for each protocol and update currentTokensUsed require(tokenAddresses.length == protocolAmounts.length, "All tokens length != allocations length"); uint256 currAmount; for (uint256 i = 0; i < protocolAmounts.length; i++) { currAmount = protocolAmounts[i]; if (currAmount == 0) { continue; } _mintProtocolTokens(protocolWrappers[tokenAddresses[i]], currAmount); } } /** * Calculate amounts from percentage allocations (100000 => 100%) * * @param allocations : array of protocol allocations in percentage * @param total : total amount * @return : array with amounts */ function _amountsFromAllocations(uint256[] memory allocations, uint256 total) internal pure returns (uint256[] memory) { uint256[] memory newAmounts = new uint256[](allocations.length); uint256 currBalance = 0; uint256 allocatedBalance = 0; for (uint256 i = 0; i < allocations.length; i++) { if (i == allocations.length - 1) { newAmounts[i] = total.sub(allocatedBalance); } else { currBalance = total.mul(allocations[i]).div(100000); allocatedBalance = allocatedBalance.add(currBalance); newAmounts[i] = currBalance; } } return newAmounts; } /** * Redeem all underlying needed from each protocol * * @param tokenAddresses : array of protocol tokens addresses * @param amounts : array with current allocations in underlying * @param newAmounts : array with new allocations in underlying * @return toMintAllocations : array with amounts to be minted * @return totalToMint : total amount that needs to be minted */ function _redeemAllNeeded( address[] memory tokenAddresses, uint256[] memory amounts, uint256[] memory newAmounts ) internal returns ( uint256[] memory toMintAllocations, uint256 totalToMint, bool lowLiquidity ) { require(amounts.length == newAmounts.length, 'Lengths not equal'); toMintAllocations = new uint256[](amounts.length); ILendingProtocol protocol; uint256 currAmount; uint256 newAmount; address currToken; // check the difference between amounts and newAmounts for (uint256 i = 0; i < amounts.length; i++) { currToken = tokenAddresses[i]; newAmount = newAmounts[i]; currAmount = amounts[i]; protocol = ILendingProtocol(protocolWrappers[currToken]); if (currAmount > newAmount) { toMintAllocations[i] = 0; uint256 toRedeem = currAmount.sub(newAmount); uint256 availableLiquidity = protocol.availableLiquidity(); if (availableLiquidity < toRedeem) { lowLiquidity = true; toRedeem = availableLiquidity; } // redeem the difference _redeemProtocolTokens( protocolWrappers[currToken], currToken, // convert amount from underlying to protocol token toRedeem.mul(10**18).div(protocol.getPriceInToken()), address(this) // tokens are now in this contract ); } else { toMintAllocations[i] = newAmount.sub(currAmount); totalToMint = totalToMint.add(toMintAllocations[i]); } } } /** * Get the contract balance of every protocol currently used * * @return tokenAddresses : array with all token addresses used, * eg [cTokenAddress, iTokenAddress] * @return amounts : array with all amounts for each protocol in order, * eg [amountCompoundInUnderlying, amountFulcrumInUnderlying] * @return total : total AUM in underlying */ function _getCurrentAllocations() internal view returns (address[] memory tokenAddresses, uint256[] memory amounts, uint256 total) { // Get balance of every protocol implemented tokenAddresses = new address[](allAvailableTokens.length); amounts = new uint256[](allAvailableTokens.length); address currentToken; uint256 currTokenPrice; for (uint256 i = 0; i < allAvailableTokens.length; i++) { currentToken = allAvailableTokens[i]; tokenAddresses[i] = currentToken; currTokenPrice = ILendingProtocol(protocolWrappers[currentToken]).getPriceInToken(); amounts[i] = currTokenPrice.mul( IERC20(currentToken).balanceOf(address(this)) ).div(10**18); total = total.add(amounts[i]); } // return addresses and respective amounts in underlying return (tokenAddresses, amounts, total); } // ILendingProtocols calls /** * Mint protocol tokens through protocol wrapper * * @param _wrapperAddr : address of protocol wrapper * @param _amount : amount of underlying to be lended * @return tokens : new tokens minted */ function _mintProtocolTokens(address _wrapperAddr, uint256 _amount) internal returns (uint256 tokens) { if (_amount == 0) { return tokens; } // Transfer _amount underlying token (eg. DAI) to _wrapperAddr IERC20(token).safeTransfer(_wrapperAddr, _amount); tokens = ILendingProtocol(_wrapperAddr).mint(); } /** * Redeem underlying tokens through protocol wrapper * * @param _wrapperAddr : address of protocol wrapper * @param _amount : amount of `_token` to redeem * @param _token : protocol token address * @param _account : should be msg.sender when rebalancing and final user when redeeming * @return tokens : new tokens minted */ function _redeemProtocolTokens(address _wrapperAddr, address _token, uint256 _amount, address _account) internal returns (uint256 tokens) { if (_amount == 0) { return tokens; } // Transfer _amount of _protocolToken (eg. cDAI) to _wrapperAddr IERC20(_token).safeTransfer(_wrapperAddr, _amount); tokens = ILendingProtocol(_wrapperAddr).redeem(_account); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_aToken","type":"address"},{"internalType":"address","name":"_rebalancer","type":"address"},{"internalType":"address","name":"_priceCalculator","type":"address"},{"internalType":"address","name":"_idleAave","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allAvailableTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"delayNewProtocols","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAPRs","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"aprs","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAvgAPR","outputs":[{"internalType":"uint256","name":"avgApr","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentAllocations","outputs":[{"internalType":"address[]","name":"tokenAddresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"total","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gst2","outputs":[{"internalType":"contract GasToken","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"iToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isNewProtocolDelayed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isRiskAdjusted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastAllocations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastITokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"manualPlay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"name":"mintIdleToken","outputs":[{"internalType":"uint256","name":"mintedTokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_skipWholeRebalance","type":"bool"}],"name":"mintIdleToken","outputs":[{"internalType":"uint256","name":"mintedTokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"_newAllocations","type":"uint256[]"}],"name":"openRebalance","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"avgApr","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"priceCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"protocolWrappers","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"name":"rebalance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"rebalance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"rebalanceWithGST","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rebalancer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_skipRebalance","type":"bool"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"name":"redeemIdleToken","outputs":[{"internalType":"uint256","name":"redeemedTokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeemInterestBearingTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"releaseTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setGasParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_isRiskAdjusted","type":"bool"}],"name":"setIsRiskAdjusted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_manualPlay","type":"bool"}],"name":"setManualPlay","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_priceCalculator","type":"address"}],"name":"setPriceCalculator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_wrapper","type":"address"}],"name":"setProtocolWrapper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rebalancer","type":"address"}],"name":"setRebalancer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userAvgPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
61010060405261374a608090815261a0aa60a052616c3e60c052611b6c60e0526200002f90600a90600462000518565b503480156200003d57600080fd5b5060405162005de338038062005de383398181016040526101008110156200006457600080fd5b81019080805160405193929190846401000000008211156200008557600080fd5b9083019060208201858111156200009b57600080fd5b8251640100000000811182820188101715620000b657600080fd5b82525081516020918201929091019080838360005b83811015620000e5578181015183820152602001620000cb565b50505050905090810190601f168015620001135780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200013757600080fd5b9083019060208201858111156200014d57600080fd5b82516401000000008111828201881017156200016857600080fd5b82525081516020918201929091019080838360005b83811015620001975781810151838201526020016200017d565b50505050905090810190601f168015620001c55780820380516001836020036101000a031916815260200191505b506040908152602082810151918301516060840151608085015160a086015160c0909601518a519598509296509094909390928991899189916200021091600391908601906200056e565b508151620002269060049060208501906200056e565b506005805460ff191660ff92909216919091179055505060016006556200024c620003cb565b600780546001600160a01b0319166001600160a01b0392831617908190556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3620002be620002af6001600160e01b03620003cb16565b6001600160e01b03620003d016565b6009805460ff19169055600c80546001600160a01b0319166001600160a01b0387169081179091556040805163313ce56760e01b8152905163313ce56791600480820192602092909190829003018186803b1580156200031d57600080fd5b505afa15801562000332573d6000803e3d6000fd5b505050506040513d60208110156200034957600080fd5b505160ff16601255600e80546001600160a01b038086166001600160a01b031992831617909255600f80548584169083161790558582166000818152600b60209081526040918290208054958716959094169490941790925581519283019091528152620003bc906015906001620005e1565b5050505050505050506200068b565b335b90565b620003eb8160086200042260201b6200527b1790919060201c565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6200043782826001600160e01b03620004af16565b156200048a576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620004f85760405162461bcd60e51b815260040180806020018281038252602281526020018062005dc16022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b8280548282559060005260206000209081019282156200055c579160200282015b828111156200055c578251829061ffff1690559160200191906001019062000539565b506200056a92915062000647565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620005b157805160ff19168380011785556200055c565b828001600101855582156200055c579182015b828111156200055c578251825591602001919060010190620005c4565b82805482825590600052602060002090810192821562000639579160200282015b828111156200063957825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000602565b506200056a92915062000664565b620003cd91905b808211156200056a57600081556001016200064e565b620003cd91905b808211156200056a5780546001600160a01b03191681556001016200066b565b615726806200069b6000396000f3fe608060405234801561001057600080fd5b50600436106103995760003560e01c8063715018a6116101e9578063b13bd4911161010f578063dae0f05e116100ad578063f2ce58061161007c578063f2ce580614610c2e578063f2d50ba614610c5c578063f2fde38b14610c64578063fc0c546a14610c8a57610399565b8063dae0f05e14610bca578063dba2d85d14610bf0578063dd62ed3e14610bf8578063ddca3f4314610c2657610399565b8063c85c93aa116100e9578063c85c93aa14610a9a578063cb390f9714610b18578063cb50648814610b20578063da5163cc14610b3f57610399565b8063b13bd491146109cc578063be6fb53614610a6d578063bf7143c114610a7557610399565b80638b95e335116101875780639fc7875b116101565780639fc7875b1461094f578063a457c2d714610957578063a9059cbb14610983578063afdd3fc3146109af57610399565b80638b95e3351461092f5780638da5cb5b146109375780638f32d59b1461093f57806395d89b411461094757610399565b806382ba653d116101c357806382ba653d146108bc57806382dc1ec4146108db5780638456cb59146109015780638705fcd41461090957610399565b8063715018a6146108a45780637d7c2a1c146108ac5780637ff9b596146108b457610399565b80633b97e856116102ce57806346fbf68e1161026c57806369fe0e2d1161023b57806369fe0e2d146108335780636cfd1553146108505780636ef8d66d1461087657806370a082311461087e57610399565b806346fbf68e146107685780635c975abb1461078e5780636922d7b61461079657806369ad6af2146107bc57610399565b8063408cfe24116102a8578063408cfe241461068a578063412753581461069257806341826c2d1461069a57806345c8026c1461074257610399565b80633b97e856146106035780633cfcef641461060b5780633f4ba83a1461068257610399565b80631f80b18a1161033b578063313ce56711610315578063313ce5671461052c578063321551251461054a57806336a00082146105ba57806339509351146105d757610399565b80631f80b18a146104e657806323b872dd146104ee57806323d39ab51461052457610399565b80630df94ef2116103775780630df94ef21461047f578063154cf14e146104b757806318160ddd146104c1578063194a62a8146104c957610399565b806301d22ccd1461039e57806306fdde03146103c2578063095ea7b31461043f575b600080fd5b6103a6610c92565b604080516001600160a01b039092168252519081900360200190f35b6103ca610ca1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104045781810151838201526020016103ec565b50505050905090810190601f1680156104315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61046b6004803603604081101561045557600080fd5b506001600160a01b038135169060200135610d56565b604080519115158252519081900360200190f35b6104a56004803603602081101561049557600080fd5b50356001600160a01b0316610d74565b60408051918252519081900360200190f35b6104bf610d86565b005b6104a5610e0e565b6104bf600480360360208110156104df57600080fd5b5035610e14565b6104a5610f95565b61046b6004803603606081101561050457600080fd5b506001600160a01b0381358116916020810135909116906040013561110a565b6103a6611186565b610534611199565b6040805160ff9092168252519081900360200190f35b6104bf6004803603602081101561056057600080fd5b81019060208101813564010000000081111561057b57600080fd5b82018360208201111561058d57600080fd5b803590602001918460208302840111640100000000831117156105af57600080fd5b5090925090506111a2565b6103a6600480360360208110156105d057600080fd5b503561120c565b61046b600480360360408110156105ed57600080fd5b506001600160a01b038135169060200135611233565b6104a5611287565b6104a56004803603604081101561062157600080fd5b8135919081019060408101602082013564010000000081111561064357600080fd5b82018360208201111561065557600080fd5b8035906020019184602083028401116401000000008311171561067757600080fd5b50909250905061128d565b6104bf61132a565b6103a661143a565b6103a6611449565b6106a2611458565b604051808060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b838110156106ec5781810151838201526020016106d4565b50505050905001838103825285818151815260200191508051906020019060200280838360005b8381101561072b578181015183820152602001610713565b505050509050019550505050505060405180910390f35b6103a66004803603602081101561075857600080fd5b50356001600160a01b0316611470565b61046b6004803603602081101561077e57600080fd5b50356001600160a01b031661148b565b61046b61149e565b6104bf600480360360208110156107ac57600080fd5b50356001600160a01b03166114a7565b61046b600480360360408110156107d257600080fd5b813591908101906040810160208201356401000000008111156107f457600080fd5b82018360208201111561080657600080fd5b8035906020019184602083028401116401000000008311171561082857600080fd5b509092509050611622565b6104bf6004803603602081101561084957600080fd5b5035611637565b6104bf6004803603602081101561086657600080fd5b50356001600160a01b03166116ec565b6104bf6117da565b6104a56004803603602081101561089457600080fd5b50356001600160a01b03166117ec565b6104bf611807565b61046b6118c2565b6104a56118d4565b6104bf600480360360208110156108d257600080fd5b50351515611ab0565b6104bf600480360360208110156108f157600080fd5b50356001600160a01b0316611b3a565b6104bf611b89565b6104bf6004803603602081101561091f57600080fd5b50356001600160a01b0316611c7b565b6103a6611d69565b6103a6611d78565b61046b611d87565b6103ca611dad565b61046b611e2c565b61046b6004803603604081101561096d57600080fd5b506001600160a01b038135169060200135611e35565b61046b6004803603604081101561099957600080fd5b506001600160a01b038135169060200135611ea3565b6104a5600480360360208110156109c557600080fd5b5035611ecd565b6109d4611eeb565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610a18578181015183820152602001610a00565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610a57578181015183820152602001610a3f565b5050505090500194505050505060405180910390f35b61046b612065565b6104a560048036036040811015610a8b57600080fd5b50803590602001351515612074565b6104a560048036036060811015610ab057600080fd5b8135916020810135151591810190606081016040820135640100000000811115610ad957600080fd5b820183602082011115610aeb57600080fd5b80359060200191846020830284011164010000000083111715610b0d57600080fd5b509092509050612110565b61046b61243b565b6104bf60048036036020811015610b3657600080fd5b50351515612449565b610baf60048036036020811015610b5557600080fd5b810190602081018135640100000000811115610b7057600080fd5b820183602082011115610b8257600080fd5b80359060200191846020830284011164010000000083111715610ba457600080fd5b5090925090506124d9565b60408051921515835260208301919091528051918290030190f35b6104a560048036036020811015610be057600080fd5b50356001600160a01b0316612a3e565b61046b612a50565b6104a560048036036040811015610c0e57600080fd5b506001600160a01b0381358116916020013516612a76565b6104a5612aa1565b6104bf60048036036040811015610c4457600080fd5b506001600160a01b0381358116916020013516612aa7565b6104a5612cc7565b6104bf60048036036020811015610c7a57600080fd5b50356001600160a01b0316612ccd565b6103a6612d2f565b600e546001600160a01b031681565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d4b5780601f10610d2057610100808354040283529160200191610d4b565b820191906000526020600020905b815481529060010190602001808311610d2e57829003601f168201915b505050505090505b90565b6000610d6a610d63612d3e565b8484612d42565b5060015b92915050565b60176020526000908152604090205481565b610d8e611d87565b610ddf576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055565b60025490565b60068054600101908190556000610e29610e0e565b9050600080805b601554811015610f2d5760158181548110610e4757fe5b60009182526020918290200154604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b03909216955085926370a0823192602480840193829003018186803b158015610eb257600080fd5b505afa158015610ec6573d6000803e3d6000fd5b505050506040513d6020811015610edc57600080fd5b5051915081610eea57610f25565b610f2533610f0e86610f028a8763ffffffff612e2e16565b9063ffffffff612e8716565b6001600160a01b038616919063ffffffff612ec916565b600101610e30565b50610f383386612f49565b5050506006548114610f91576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050565b600060606000610fa3613045565b90935091506000905080805b60155481101561110257848181518110610fc557fe5b602002602001015160001415610fda576110fa565b600b600060158381548110610feb57fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283019091205482517fc89d5b8b000000000000000000000000000000000000000000000000000000008152925193169263c89d5b8b926004808201939291829003018186803b15801561106257600080fd5b505afa158015611076573d6000803e3d6000fd5b505050506040513d602081101561108c57600080fd5b505185519093506110c9908590610f0290670de0b6b3a7640000908990869081106110b357fe5b6020026020010151612e2e90919063ffffffff16565b91506110f76110ea670de0b6b3a7640000610f02868663ffffffff612e2e16565b879063ffffffff61329716565b95505b600101610faf565b505050505090565b60006111178484846132f1565b6111558433611150856040518060600160405280602881526020016155ef602891396111438a33612a76565b919063ffffffff61344d16565b612d42565b6001600160a01b03841660009081526017602052604090205461117b90849084906134e4565b5060015b9392505050565b6eb3f879cb30fe243b4dfee438691c0481565b60055460ff1690565b6111aa611d87565b6111fb576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b611207600a83836153e8565b505050565b6015818154811061121957fe5b6000918252602090912001546001600160a01b0316905081565b6000610d6a611240612d3e565b846111508560016000611251612d3e565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61329716565b60125481565b600680546001019081905560009030825a604080516000808252602082019092529192506112bc9189916135ea565b93506112ca5a820383613832565b50506006548114611322576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b509392505050565b61133a611335612d3e565b61148b565b6113755760405162461bcd60e51b81526004018080602001828103825260308152602001806154e86030913960400191505060405180910390fd5b60095460ff166113cc576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61141d612d3e565b604080516001600160a01b039092168252519081900360200190a1565b600d546001600160a01b031681565b6010546001600160a01b031681565b6060806000611465613045565b925092509250909192565b600b602052600090815260409020546001600160a01b031681565b6000610d6e60088363ffffffff613a2b16565b60095460ff1690565b6114af611d87565b611500576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661155b576040805162461bcd60e51b815260206004820152600960248201527f4164647220697320300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60145462010000900460ff1615806115b457506001600160a01b038116600090815260196020526040902054158015906115b457506001600160a01b0381166000908152601960205260409020546203f4804291909103115b1561160357600f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811790915560009081526019602052604081205561161f565b6001600160a01b03811660009081526019602052604090204290555b50565b600061162f600080613a92565b949350505050565b61163f611d87565b611690576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6127108111156116e7576040805162461bcd60e51b815260206004820152600c60248201527f46656520746f6f20686967680000000000000000000000000000000000000000604482015290519081900360640190fd5b601355565b6116f4611d87565b611745576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166117a0576040805162461bcd60e51b815260206004820152600960248201527f4164647220697320300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6117ea6117e5612d3e565b614624565b565b6001600160a01b031660009081526020819052604090205490565b61180f611d87565b611860576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60006118cf600080613a92565b905090565b60006060601580549050604051908082528060200260200182016040528015611907578160200160208202803883390190505b50905060005b60155481101561198357600b60006015838154811061192857fe5b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054835191169083908390811061196357fe5b6001600160a01b039092166020928302919091019091015260010161190d565b50600f546001600160a01b031663f28f322161199d610e0e565b306015856040518563ffffffff1660e01b815260040180858152602001846001600160a01b03166001600160a01b0316815260200180602001806020018381038352858181548152602001915080548015611a2157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a03575b50508381038252845181528451602091820191808701910280838360005b83811015611a57578181015183820152602001611a3f565b50505050905001965050505050505060206040518083038186803b158015611a7e57600080fd5b505afa158015611a92573d6000803e3d6000fd5b505050506040513d6020811015611aa857600080fd5b505192915050565b611ab8611d87565b611b09576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b611b45611335612d3e565b611b805760405162461bcd60e51b81526004018080602001828103825260308152602001806154e86030913960400191505060405180910390fd5b61161f8161466c565b611b94611335612d3e565b611bcf5760405162461bcd60e51b81526004018080602001828103825260308152602001806154e86030913960400191505060405180910390fd5b60095460ff1615611c27576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861141d612d3e565b611c83611d87565b611cd4576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116611d2f576040805162461bcd60e51b815260206004820152600960248201527f4164647220697320300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b601080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600f546001600160a01b031681565b6007546001600160a01b031690565b6007546000906001600160a01b0316611d9e612d3e565b6001600160a01b031614905090565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d4b5780601f10610d2057610100808354040283529160200191610d4b565b60145460ff1681565b6000610d6a611e42612d3e565b84611150856040518060600160405280602581526020016156cd6025913960016000611e6c612d3e565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61344d16565b6000611eb03384846132f1565b33600090815260176020526040902054610d6a90849084906134e4565b60168181548110611eda57fe5b600091825260209091200154905081565b6060806000601580549050604051908082528060200260200182016040528015611f1f578160200160208202803883390190505b506015546040805182815260208084028201019091529194508015611f4e578160200160208202803883390190505b50915060005b60155481101561205f5760158181548110611f6b57fe5b9060005260206000200160009054906101000a90046001600160a01b0316915081848281518110611f9857fe5b6001600160a01b039283166020918202929092018101919091528382166000908152600b82526040908190205481517fc89d5b8b000000000000000000000000000000000000000000000000000000008152915193169263c89d5b8b92600480840193919291829003018186803b15801561201257600080fd5b505afa158015612026573d6000803e3d6000fd5b505050506040513d602081101561203c57600080fd5b5051835184908390811061204c57fe5b6020908102919091010152600101611f54565b50509091565b60145462010000900460ff1681565b600680546001019081905560009030825a6040805160008152602081019091529091506120a3908790876135ea565b93506120b15a820383613832565b50506006548114612109576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5092915050565b600680546001019081905560009081805b60155481101561227b576015818154811061213857fe5b60009182526020918290200154604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156121a057600080fd5b505afa1580156121b4573d6000803e3d6000fd5b505050506040513d60208110156121ca57600080fd5b50519150816121d857612273565b612270612263600b6000601585815481106121ef57fe5b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054601580549190921691908590811061222d57fe5b6000918252602090912001546001600160a01b031661225d61224d610e0e565b610f028e8963ffffffff612e2e16565b306146b4565b859063ffffffff61329716565b93505b600101612121565b506122863388612f49565b60006013541180156122a257506010546001600160a01b031615155b156122b4576122b18784614767565b92505b600c546122d1906001600160a01b0316338563ffffffff612ec916565b306001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561230a57600080fd5b505afa15801561231e573d6000803e3d6000fd5b505050506040513d602081101561233457600080fd5b5051806123bb5750601154600d60009054906101000a90046001600160a01b03166001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561238d57600080fd5b505afa1580156123a1573d6000803e3d6000fd5b505050506040513d60208110156123b757600080fd5b5051105b806123c35750855b156123ce57506123dc565b6123d9600080613a92565b50505b6006548114612432576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50949350505050565b601454610100900460ff1681565b612451611d87565b6124a2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60148054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b600954600090819060ff1615612536576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600d546001600160a01b03161561284257600d54604080517f7ff9b59600000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691637ff9b596916004808301926020929190829003018186803b1580156125a557600080fd5b505afa1580156125b9573d6000803e3d6000fd5b505050506040513d60208110156125cf57600080fd5b5051601154909150811015806125e7575060145460ff165b612638576040805162461bcd60e51b815260206004820152601e60248201527f5061757365643a2069546f6b656e207072696365206465637265617365640000604482015290519081900360640190fd5b601454610100900460ff1615612695576040805162461bcd60e51b815260206004820152601f60248201527f53657474696e6720616c6c6f636174696f6e73206e6f7420616c6c6f77656400604482015290519081900360640190fd5b600061269f610f95565b600e54604080517fae773c1000000000000000000000000000000000000000000000000000000000815260048101918252604481018990529293506001600160a01b039091169163ae773c10918991899160159181906024810190606401866020870280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910184810383528554808252602090910191508590801561277c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161275e575b505095505050505050600060405180830381600087803b15801561279f57600080fd5b505af11580156127b3573d6000803e3d6000fd5b5050505060006127c4600080613a92565b905060006127d0610f95565b9050828111612826576040805162461bcd60e51b815260206004820152601060248201527f415052206e6f7420696d70726f76656400000000000000000000000000000000604482015290519081900360640190fd5b90945092505060115481111561283c5760118190555b50612a37565b601454610100900460ff161561289f576040805162461bcd60e51b815260206004820152601f60248201527f53657474696e6720616c6c6f636174696f6e73206e6f7420616c6c6f77656400604482015290519081900360640190fd5b60006128a9610f95565b600e54604080517fae773c1000000000000000000000000000000000000000000000000000000000815260048101918252604481018890529293506001600160a01b039091169163ae773c10918891889160159181906024810190606401866020870280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910184810383528554808252602090910191508590801561298657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612968575b505095505050505050600060405180830381600087803b1580156129a957600080fd5b505af11580156129bd573d6000803e3d6000fd5b5050505060006129ce600080613a92565b905060006129da610f95565b9050828111612a30576040805162461bcd60e51b815260206004820152601060248201527f415052206e6f7420696d70726f76656400000000000000000000000000000000604482015290519081900360640190fd5b9093509150505b9250929050565b60196020526000908152604090205481565b60003360005a9050612a63600080613a92565b9250612a715a820383613832565b505090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60135481565b612aaf611d87565b612b00576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03821615801590612b2057506001600160a01b03811615155b612b71576040805162461bcd60e51b815260206004820152600e60248201527f736f6d6520616464722069732030000000000000000000000000000000000000604482015290519081900360640190fd5b60145462010000900460ff161580612bca57506001600160a01b03811660009081526019602052604090205415801590612bca57506001600160a01b0381166000908152601960205260409020546203f4804291909103115b15612caa576001600160a01b038281166000908152600b602052604090205416612c5257601580546001810182556000919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384161790555b6001600160a01b038281166000908152600b6020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001694861694851790559282526019905290812055610f91565b6001600160a01b0316600090815260196020526040902042905550565b60115481565b612cd5611d87565b612d26576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61161f816148c7565b600c546001600160a01b031681565b3390565b6001600160a01b038316612d875760405162461bcd60e51b815260040180806020018281038252602481526020018061567f6024913960400191505060405180910390fd5b6001600160a01b038216612dcc5760405162461bcd60e51b815260040180806020018281038252602281526020018061553e6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082612e3d57506000610d6e565b82820282848281612e4a57fe5b041461117f5760405162461bcd60e51b81526004018080602001828103825260218152602001806155ce6021913960400191505060405180910390fd5b600061117f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614980565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526112079084906149e5565b6001600160a01b038216612f8e5760405162461bcd60e51b81526004018080602001828103825260218152602001806156396021913960400191505060405180910390fd5b612fd1816040518060600160405280602281526020016154c6602291396001600160a01b038516600090815260208190526040902054919063ffffffff61344d16565b6001600160a01b038316600090815260208190526040902055600254612ffd908263ffffffff614bc116565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6060806000601580549050604051908082528060200260200182016040528015613079578160200160208202803883390190505b5060155460408051828152602080840282010190915291945080156130a8578160200160208202803883390190505b509150600080805b60155481101561328f57601581815481106130c757fe5b9060005260206000200160009054906101000a90046001600160a01b03169250828682815181106130f457fe5b6001600160a01b039283166020918202929092018101919091528482166000908152600b82526040908190205481517f02bbce4600000000000000000000000000000000000000000000000000000000815291519316926302bbce4692600480840193919291829003018186803b15801561316e57600080fd5b505afa158015613182573d6000803e3d6000fd5b505050506040513d602081101561319857600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191935061324791670de0b6b3a764000091610f02916001600160a01b038816916370a08231916024808301926020929190829003018186803b15801561320e57600080fd5b505afa158015613222573d6000803e3d6000fd5b505050506040513d602081101561323857600080fd5b5051859063ffffffff612e2e16565b85828151811061325357fe5b60200260200101818152505061328585828151811061326e57fe5b60200260200101518561329790919063ffffffff16565b93506001016130b0565b505050909192565b60008282018381101561117f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0383166133365760405162461bcd60e51b815260040180806020018281038252602581526020018061565a6025913960400191505060405180910390fd5b6001600160a01b03821661337b5760405162461bcd60e51b81526004018080602001828103825260238152602001806154a36023913960400191505060405180910390fd5b6133be81604051806060016040528060268152602001615560602691396001600160a01b038616600090815260208190526040902054919063ffffffff61344d16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546133f3908263ffffffff61329716565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156134dc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134a1578181015183820152602001613489565b50505050905090810190601f1680156134ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b601354613532576001600160a01b038316600090815260186020526040902054613514908363ffffffff61329716565b6001600160a01b038416600090815260186020526040902055611207565b6001600160a01b03831660009081526018602052604081205461356490613558866117ec565b9063ffffffff614bc116565b6001600160a01b038516600090815260176020526040812054919250613590838663ffffffff614bc116565b90506135c96135a984610f02878963ffffffff612e2e16565b6135bd85610f02868663ffffffff612e2e16565b9063ffffffff61329716565b6001600160a01b038716600090815260176020526040902055505050505050565b60095460009060ff1615613645576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600d546001600160a01b0316156137c857600d54604080517f7ff9b59600000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691637ff9b596916004808301926020929190829003018186803b1580156136b457600080fd5b505afa1580156136c8573d6000803e3d6000fd5b505050506040513d60208110156136de57600080fd5b5051601154909150811015806136f6575060145460ff165b613747576040805162461bcd60e51b815260206004820152601e60248201527f5061757365643a2069546f6b656e207072696365206465637265617365640000604482015290519081900360640190fd5b60006137516118d4565b600c54909150613772906001600160a01b031633308963ffffffff614c0316565b61377d600085613a92565b5061379a81610f0288670de0b6b3a764000063ffffffff612e2e16565b92506137a63384614c8b565b6137b13384836134e4565b506011548111156137c25760118190555b5061117f565b60006137d26118d4565b600c549091506137f3906001600160a01b031633308863ffffffff614c0316565b6137fe600084613a92565b5061381b81610f0287670de0b6b3a764000063ffffffff612e2e16565b91506138273383614c8b565b6113223383836134e4565b6000600a60018154811061384257fe5b9060005260206000200154600a60008154811061385b57fe5b906000526020600020015484018161386f57fe5b0490506000805a9050600a60028154811061388657fe5b906000526020600020015481106138d657600a6003815481106138a557fe5b9060005260206000200154600a6002815481106138be57fe5b90600052602060002001548203816138d257fe5b0491505b818311156138e2578192505b8215613a24576001600160a01b038416301415613980576eb3f879cb30fe243b4dfee438691c046001600160a01b0316636366b936846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561394e57600080fd5b505af1158015613962573d6000803e3d6000fd5b505050506040513d602081101561397857600080fd5b50613a249050565b604080517f079d229f0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810185905290516eb3f879cb30fe243b4dfee438691c049163079d229f9160448083019260209291908290030181600087803b1580156139f757600080fd5b505af1158015613a0b573d6000803e3d6000fd5b505050506040513d6020811015613a2157600080fd5b50505b5050505050565b60006001600160a01b038216613a725760405162461bcd60e51b81526004018080602001828103825260228152602001806156176022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b60095460009060ff1615613aed576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600d546001600160a01b03161561411757600d54604080517f7ff9b59600000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691637ff9b596916004808301926020929190829003018186803b158015613b5c57600080fd5b505afa158015613b70573d6000803e3d6000fd5b505050506040513d6020811015613b8657600080fd5b505160115490915081101580613b9e575060145460ff165b613bef576040805162461bcd60e51b815260206004820152601e60248201527f5061757365643a2069546f6b656e207072696365206465637265617365640000604482015290519081900360640190fd5b600e54604080517f65ed6e2300000000000000000000000000000000000000000000000000000000815290516060926001600160a01b0316916365ed6e23916004808301926000929190829003018186803b158015613c4d57600080fd5b505afa158015613c61573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015613ca857600080fd5b8101908080516040519392919084640100000000821115613cc857600080fd5b908301906020820185811115613cdd57600080fd5b8251866020820283011164010000000082111715613cfa57600080fd5b82525081516020918201928201910280838360005b83811015613d27578181015183820152602001613d0f565b505050509050016040525050509050600060168054905082511490508015613da35760005b601654811080613d5a575081155b15613da157828181518110613d6b57fe5b602002602001015160168281548110613d8057fe5b906000526020600020015414613d995760009150613da1565b600101613d4c565b505b600c54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015613e0757600080fd5b505afa158015613e1b573d6000803e3d6000fd5b505050506040513d6020811015613e3157600080fd5b50519050818015613e40575080155b15613e515760009450505050614101565b8015613eeb57601654158015613e645750855b15613e7e578251613e7c906016906020860190615433565b505b613eeb6015805480602002602001604051908101604052809291908181526020018280548015613ed757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613eb9575b5050505050613ee68584614d7b565b614e61565b8580613ef45750815b15613f055760009450505050614101565b6060806000613f12613045565b9250925092506060613f248783614d7b565b90506060600080613f36878786614f1d565b92509250925080613f6257613f4d6016600061546e565b8951613f609060169060208d0190615433565b505b600c54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015613fc657600080fd5b505afa158015613fda573d6000803e3d6000fd5b505050506040513d6020811015613ff057600080fd5b505190506001811180156140045750600183115b156140f15760608451604051908082528060200260200182016040528015614036578160200160208202803883390190505b50905060005b855181101561407b5761405c85610f02620186a08985815181106110b357fe5b82828151811061406857fe5b602090810291909101015260010161403c565b5060606140888284614d7b565b90506140ee60158054806020026020016040519081016040528092919081815260200182805480156140e357602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116140c5575b505050505082614e61565b50505b60019c5050505050505050505050505b6011548111156141115760118190555b50610d6e565b600e54604080517f65ed6e2300000000000000000000000000000000000000000000000000000000815290516060926001600160a01b0316916365ed6e23916004808301926000929190829003018186803b15801561417557600080fd5b505afa158015614189573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405260208110156141d057600080fd5b81019080805160405193929190846401000000008211156141f057600080fd5b90830190602082018581111561420557600080fd5b825186602082028301116401000000008211171561422257600080fd5b82525081516020918201928201910280838360005b8381101561424f578181015183820152602001614237565b5050505090500160405250505090506000601680549050825114905080156142cb5760005b601654811080614282575081155b156142c95782818151811061429357fe5b6020026020010151601682815481106142a857fe5b9060005260206000200154146142c157600091506142c9565b600101614274565b505b600c54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561432f57600080fd5b505afa158015614343573d6000803e3d6000fd5b505050506040513d602081101561435957600080fd5b50519050818015614368575080155b156143795760009350505050610d6e565b801561440c5760165415801561438c5750845b156143a65782516143a4906016906020860190615433565b505b61440c6015805480602002602001604051908101604052809291908181526020018280548015613ed7576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311613eb9575050505050613ee68584614d7b565b84806144155750815b156144265760009350505050610d6e565b6060806000614433613045565b92509250925060606144458783614d7b565b90506060600080614457878786614f1d565b925092509250806144835761446e6016600061546e565b89516144819060169060208d0190615433565b505b600c54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156144e757600080fd5b505afa1580156144fb573d6000803e3d6000fd5b505050506040513d602081101561451157600080fd5b505190506001811180156145255750600183115b156146105760608451604051908082528060200260200182016040528015614557578160200160208202803883390190505b50905060005b855181101561459c5761457d85610f02620186a08985815181106110b357fe5b82828151811061458957fe5b602090810291909101015260010161455d565b5060606145a98284614d7b565b905061460d60158054806020026020016040519081016040528092919081815260200182805480156140e3576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116140c557505050505082614e61565b50505b5060019d9c50505050505050505050505050565b61463560088263ffffffff6151f616565b6040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b61467d60088263ffffffff61527b16565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6000826146c05761162f565b6146da6001600160a01b038516868563ffffffff612ec916565b846001600160a01b03166395a2251f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561473257600080fd5b505af1158015614746573d6000803e3d6000fd5b505050506040513d602081101561475c57600080fd5b505195945050505050565b33600090815260186020526040812054816147806118d4565b905060008211801561479157508482115b1561479a578491505b336000908152601760205260408120546147ec90670de0b6b3a764000090610f02906147dc906147d08b8963ffffffff614bc116565b9063ffffffff612e2e16565b6135bd878763ffffffff612e2e16565b9050600061480c670de0b6b3a7640000610f02898663ffffffff612e2e16565b9050818110156148225785945050505050610d6e565b6000614834828463ffffffff614bc116565b90506000614854620186a0610f0260135485612e2e90919063ffffffff16565b601054600c5491925061487a916001600160a01b0390811691168363ffffffff612ec916565b3360009081526018602052604090205461489a908763ffffffff614bc116565b336000908152601860205260409020556148ba838263ffffffff614bc116565b9998505050505050505050565b6001600160a01b03811661490c5760405162461bcd60e51b81526004018080602001828103825260268152602001806155186026913960400191505060405180910390fd5b6007546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600081836149cf5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156134a1578181015183820152602001613489565b5060008385816149db57fe5b0495945050505050565b6149f7826001600160a01b031661531a565b614a48576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310614aa457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614a67565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614b06576040519150601f19603f3d011682016040523d82523d6000602084013e614b0b565b606091505b509150915081614b62576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115614bbb57808060200190516020811015614b7e57600080fd5b5051614bbb5760405162461bcd60e51b815260040180806020018281038252602a8152602001806156a3602a913960400191505060405180910390fd5b50505050565b600061117f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061344d565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052614bbb9085906149e5565b6001600160a01b038216614ce6576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254614cf9908263ffffffff61329716565b6002556001600160a01b038216600090815260208190526040902054614d25908263ffffffff61329716565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6060808351604051908082528060200260200182016040528015614da9578160200160208202803883390190505b509050600080805b8651811015614e56576001875103811415614df357614dd6868363ffffffff614bc116565b848281518110614de257fe5b602002602001018181525050614e4e565b614e20620186a0610f02898481518110614e0957fe5b602002602001015189612e2e90919063ffffffff16565b9250614e32828463ffffffff61329716565b915082848281518110614e4157fe5b6020026020010181815250505b600101614db1565b509195945050505050565b8051825114614ea15760405162461bcd60e51b81526004018080602001828103825260278152602001806155866027913960400191505060405180910390fd5b6000805b8251811015614bbb57828181518110614eba57fe5b602002602001015191508160001415614ed257614f15565b614f13600b6000868481518110614ee557fe5b6020908102919091018101516001600160a01b03908116835290820192909252604001600020541683615351565b505b600101614ea5565b60606000808351855114614f78576040805162461bcd60e51b815260206004820152601160248201527f4c656e67746873206e6f7420657175616c000000000000000000000000000000604482015290519081900360640190fd5b8451604051908082528060200260200182016040528015614fa3578160200160208202803883390190505b5092506000808080805b89518110156151e8578a8181518110614fc257fe5b60200260200101519150888181518110614fd857fe5b60200260200101519250898181518110614fee57fe5b6020908102919091018101516001600160a01b038085166000908152600b909352604090922054909116955093508284111561518f57600088828151811061503257fe5b6020908102919091010152600061504f858563ffffffff614bc116565b90506000866001600160a01b031663743753596040518163ffffffff1660e01b815260040160206040518083038186803b15801561508c57600080fd5b505afa1580156150a0573d6000803e3d6000fd5b505050506040513d60208110156150b657600080fd5b50519050818110156150ca57600197508091505b615187600b6000866001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03168561225d8a6001600160a01b03166302bbce466040518163ffffffff1660e01b815260040160206040518083038186803b15801561514357600080fd5b505afa158015615157573d6000803e3d6000fd5b505050506040513d602081101561516d57600080fd5b5051610f0287670de0b6b3a764000063ffffffff612e2e16565b5050506151e0565b61519f838563ffffffff614bc116565b8882815181106151ab57fe5b6020026020010181815250506151dd8882815181106151c657fe5b60200260200101518861329790919063ffffffff16565b96505b600101614fad565b505050505093509350939050565b6152008282613a2b565b61523b5760405162461bcd60e51b81526004018080602001828103825260218152602001806155ad6021913960400191505060405180910390fd5b6001600160a01b031660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6152858282613a2b565b156152d7576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b031660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159061162f5750141592915050565b60008161535d57610d6e565b600c5461537a906001600160a01b0316848463ffffffff612ec916565b826001600160a01b0316631249c58b6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156153b557600080fd5b505af11580156153c9573d6000803e3d6000fd5b505050506040513d60208110156153df57600080fd5b50519392505050565b828054828255906000526020600020908101928215615423579160200282015b82811115615423578235825591602001919060010190615408565b5061542f929150615488565b5090565b828054828255906000526020600020908101928215615423579160200282015b82811115615423578251825591602001919060010190615453565b508054600082559060005260206000209081019061161f91905b610d5391905b8082111561542f576000815560010161548e56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365416c6c20746f6b656e73206c656e67746820213d20616c6c6f636174696f6e73206c656e677468526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158205503ba457ccd9be0872a25eb657bf7dffbc39f5ca89118ecb978b923d854653b64736f6c63430005100032526f6c65733a206163636f756e7420697320746865207a65726f206164647265737300000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000001200000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f51000000000000000000000000625ae63000f46200499120b906716420bd0592400000000000000000000000006b98a5e0e67e68f502e8950992e0b1c0aee0a506000000000000000000000000aefb1325a2c1756bc3fcc516d6c2cf947d22535800000000000000000000000013898151591b91ad5c41385b9af333676f481788000000000000000000000000000000000000000000000000000000000000001749646c6553555344207633205b4d6178207969656c645d000000000000000000000000000000000000000000000000000000000000000000000000000000000d69646c65535553445969656c6400000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103995760003560e01c8063715018a6116101e9578063b13bd4911161010f578063dae0f05e116100ad578063f2ce58061161007c578063f2ce580614610c2e578063f2d50ba614610c5c578063f2fde38b14610c64578063fc0c546a14610c8a57610399565b8063dae0f05e14610bca578063dba2d85d14610bf0578063dd62ed3e14610bf8578063ddca3f4314610c2657610399565b8063c85c93aa116100e9578063c85c93aa14610a9a578063cb390f9714610b18578063cb50648814610b20578063da5163cc14610b3f57610399565b8063b13bd491146109cc578063be6fb53614610a6d578063bf7143c114610a7557610399565b80638b95e335116101875780639fc7875b116101565780639fc7875b1461094f578063a457c2d714610957578063a9059cbb14610983578063afdd3fc3146109af57610399565b80638b95e3351461092f5780638da5cb5b146109375780638f32d59b1461093f57806395d89b411461094757610399565b806382ba653d116101c357806382ba653d146108bc57806382dc1ec4146108db5780638456cb59146109015780638705fcd41461090957610399565b8063715018a6146108a45780637d7c2a1c146108ac5780637ff9b596146108b457610399565b80633b97e856116102ce57806346fbf68e1161026c57806369fe0e2d1161023b57806369fe0e2d146108335780636cfd1553146108505780636ef8d66d1461087657806370a082311461087e57610399565b806346fbf68e146107685780635c975abb1461078e5780636922d7b61461079657806369ad6af2146107bc57610399565b8063408cfe24116102a8578063408cfe241461068a578063412753581461069257806341826c2d1461069a57806345c8026c1461074257610399565b80633b97e856146106035780633cfcef641461060b5780633f4ba83a1461068257610399565b80631f80b18a1161033b578063313ce56711610315578063313ce5671461052c578063321551251461054a57806336a00082146105ba57806339509351146105d757610399565b80631f80b18a146104e657806323b872dd146104ee57806323d39ab51461052457610399565b80630df94ef2116103775780630df94ef21461047f578063154cf14e146104b757806318160ddd146104c1578063194a62a8146104c957610399565b806301d22ccd1461039e57806306fdde03146103c2578063095ea7b31461043f575b600080fd5b6103a6610c92565b604080516001600160a01b039092168252519081900360200190f35b6103ca610ca1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104045781810151838201526020016103ec565b50505050905090810190601f1680156104315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61046b6004803603604081101561045557600080fd5b506001600160a01b038135169060200135610d56565b604080519115158252519081900360200190f35b6104a56004803603602081101561049557600080fd5b50356001600160a01b0316610d74565b60408051918252519081900360200190f35b6104bf610d86565b005b6104a5610e0e565b6104bf600480360360208110156104df57600080fd5b5035610e14565b6104a5610f95565b61046b6004803603606081101561050457600080fd5b506001600160a01b0381358116916020810135909116906040013561110a565b6103a6611186565b610534611199565b6040805160ff9092168252519081900360200190f35b6104bf6004803603602081101561056057600080fd5b81019060208101813564010000000081111561057b57600080fd5b82018360208201111561058d57600080fd5b803590602001918460208302840111640100000000831117156105af57600080fd5b5090925090506111a2565b6103a6600480360360208110156105d057600080fd5b503561120c565b61046b600480360360408110156105ed57600080fd5b506001600160a01b038135169060200135611233565b6104a5611287565b6104a56004803603604081101561062157600080fd5b8135919081019060408101602082013564010000000081111561064357600080fd5b82018360208201111561065557600080fd5b8035906020019184602083028401116401000000008311171561067757600080fd5b50909250905061128d565b6104bf61132a565b6103a661143a565b6103a6611449565b6106a2611458565b604051808060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b838110156106ec5781810151838201526020016106d4565b50505050905001838103825285818151815260200191508051906020019060200280838360005b8381101561072b578181015183820152602001610713565b505050509050019550505050505060405180910390f35b6103a66004803603602081101561075857600080fd5b50356001600160a01b0316611470565b61046b6004803603602081101561077e57600080fd5b50356001600160a01b031661148b565b61046b61149e565b6104bf600480360360208110156107ac57600080fd5b50356001600160a01b03166114a7565b61046b600480360360408110156107d257600080fd5b813591908101906040810160208201356401000000008111156107f457600080fd5b82018360208201111561080657600080fd5b8035906020019184602083028401116401000000008311171561082857600080fd5b509092509050611622565b6104bf6004803603602081101561084957600080fd5b5035611637565b6104bf6004803603602081101561086657600080fd5b50356001600160a01b03166116ec565b6104bf6117da565b6104a56004803603602081101561089457600080fd5b50356001600160a01b03166117ec565b6104bf611807565b61046b6118c2565b6104a56118d4565b6104bf600480360360208110156108d257600080fd5b50351515611ab0565b6104bf600480360360208110156108f157600080fd5b50356001600160a01b0316611b3a565b6104bf611b89565b6104bf6004803603602081101561091f57600080fd5b50356001600160a01b0316611c7b565b6103a6611d69565b6103a6611d78565b61046b611d87565b6103ca611dad565b61046b611e2c565b61046b6004803603604081101561096d57600080fd5b506001600160a01b038135169060200135611e35565b61046b6004803603604081101561099957600080fd5b506001600160a01b038135169060200135611ea3565b6104a5600480360360208110156109c557600080fd5b5035611ecd565b6109d4611eeb565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610a18578181015183820152602001610a00565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610a57578181015183820152602001610a3f565b5050505090500194505050505060405180910390f35b61046b612065565b6104a560048036036040811015610a8b57600080fd5b50803590602001351515612074565b6104a560048036036060811015610ab057600080fd5b8135916020810135151591810190606081016040820135640100000000811115610ad957600080fd5b820183602082011115610aeb57600080fd5b80359060200191846020830284011164010000000083111715610b0d57600080fd5b509092509050612110565b61046b61243b565b6104bf60048036036020811015610b3657600080fd5b50351515612449565b610baf60048036036020811015610b5557600080fd5b810190602081018135640100000000811115610b7057600080fd5b820183602082011115610b8257600080fd5b80359060200191846020830284011164010000000083111715610ba457600080fd5b5090925090506124d9565b60408051921515835260208301919091528051918290030190f35b6104a560048036036020811015610be057600080fd5b50356001600160a01b0316612a3e565b61046b612a50565b6104a560048036036040811015610c0e57600080fd5b506001600160a01b0381358116916020013516612a76565b6104a5612aa1565b6104bf60048036036040811015610c4457600080fd5b506001600160a01b0381358116916020013516612aa7565b6104a5612cc7565b6104bf60048036036020811015610c7a57600080fd5b50356001600160a01b0316612ccd565b6103a6612d2f565b600e546001600160a01b031681565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d4b5780601f10610d2057610100808354040283529160200191610d4b565b820191906000526020600020905b815481529060010190602001808311610d2e57829003601f168201915b505050505090505b90565b6000610d6a610d63612d3e565b8484612d42565b5060015b92915050565b60176020526000908152604090205481565b610d8e611d87565b610ddf576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055565b60025490565b60068054600101908190556000610e29610e0e565b9050600080805b601554811015610f2d5760158181548110610e4757fe5b60009182526020918290200154604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b03909216955085926370a0823192602480840193829003018186803b158015610eb257600080fd5b505afa158015610ec6573d6000803e3d6000fd5b505050506040513d6020811015610edc57600080fd5b5051915081610eea57610f25565b610f2533610f0e86610f028a8763ffffffff612e2e16565b9063ffffffff612e8716565b6001600160a01b038616919063ffffffff612ec916565b600101610e30565b50610f383386612f49565b5050506006548114610f91576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050565b600060606000610fa3613045565b90935091506000905080805b60155481101561110257848181518110610fc557fe5b602002602001015160001415610fda576110fa565b600b600060158381548110610feb57fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283019091205482517fc89d5b8b000000000000000000000000000000000000000000000000000000008152925193169263c89d5b8b926004808201939291829003018186803b15801561106257600080fd5b505afa158015611076573d6000803e3d6000fd5b505050506040513d602081101561108c57600080fd5b505185519093506110c9908590610f0290670de0b6b3a7640000908990869081106110b357fe5b6020026020010151612e2e90919063ffffffff16565b91506110f76110ea670de0b6b3a7640000610f02868663ffffffff612e2e16565b879063ffffffff61329716565b95505b600101610faf565b505050505090565b60006111178484846132f1565b6111558433611150856040518060600160405280602881526020016155ef602891396111438a33612a76565b919063ffffffff61344d16565b612d42565b6001600160a01b03841660009081526017602052604090205461117b90849084906134e4565b5060015b9392505050565b6eb3f879cb30fe243b4dfee438691c0481565b60055460ff1690565b6111aa611d87565b6111fb576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b611207600a83836153e8565b505050565b6015818154811061121957fe5b6000918252602090912001546001600160a01b0316905081565b6000610d6a611240612d3e565b846111508560016000611251612d3e565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61329716565b60125481565b600680546001019081905560009030825a604080516000808252602082019092529192506112bc9189916135ea565b93506112ca5a820383613832565b50506006548114611322576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b509392505050565b61133a611335612d3e565b61148b565b6113755760405162461bcd60e51b81526004018080602001828103825260308152602001806154e86030913960400191505060405180910390fd5b60095460ff166113cc576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61141d612d3e565b604080516001600160a01b039092168252519081900360200190a1565b600d546001600160a01b031681565b6010546001600160a01b031681565b6060806000611465613045565b925092509250909192565b600b602052600090815260409020546001600160a01b031681565b6000610d6e60088363ffffffff613a2b16565b60095460ff1690565b6114af611d87565b611500576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661155b576040805162461bcd60e51b815260206004820152600960248201527f4164647220697320300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60145462010000900460ff1615806115b457506001600160a01b038116600090815260196020526040902054158015906115b457506001600160a01b0381166000908152601960205260409020546203f4804291909103115b1561160357600f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811790915560009081526019602052604081205561161f565b6001600160a01b03811660009081526019602052604090204290555b50565b600061162f600080613a92565b949350505050565b61163f611d87565b611690576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6127108111156116e7576040805162461bcd60e51b815260206004820152600c60248201527f46656520746f6f20686967680000000000000000000000000000000000000000604482015290519081900360640190fd5b601355565b6116f4611d87565b611745576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166117a0576040805162461bcd60e51b815260206004820152600960248201527f4164647220697320300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6117ea6117e5612d3e565b614624565b565b6001600160a01b031660009081526020819052604090205490565b61180f611d87565b611860576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60006118cf600080613a92565b905090565b60006060601580549050604051908082528060200260200182016040528015611907578160200160208202803883390190505b50905060005b60155481101561198357600b60006015838154811061192857fe5b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054835191169083908390811061196357fe5b6001600160a01b039092166020928302919091019091015260010161190d565b50600f546001600160a01b031663f28f322161199d610e0e565b306015856040518563ffffffff1660e01b815260040180858152602001846001600160a01b03166001600160a01b0316815260200180602001806020018381038352858181548152602001915080548015611a2157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a03575b50508381038252845181528451602091820191808701910280838360005b83811015611a57578181015183820152602001611a3f565b50505050905001965050505050505060206040518083038186803b158015611a7e57600080fd5b505afa158015611a92573d6000803e3d6000fd5b505050506040513d6020811015611aa857600080fd5b505192915050565b611ab8611d87565b611b09576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b611b45611335612d3e565b611b805760405162461bcd60e51b81526004018080602001828103825260308152602001806154e86030913960400191505060405180910390fd5b61161f8161466c565b611b94611335612d3e565b611bcf5760405162461bcd60e51b81526004018080602001828103825260308152602001806154e86030913960400191505060405180910390fd5b60095460ff1615611c27576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861141d612d3e565b611c83611d87565b611cd4576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116611d2f576040805162461bcd60e51b815260206004820152600960248201527f4164647220697320300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b601080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600f546001600160a01b031681565b6007546001600160a01b031690565b6007546000906001600160a01b0316611d9e612d3e565b6001600160a01b031614905090565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d4b5780601f10610d2057610100808354040283529160200191610d4b565b60145460ff1681565b6000610d6a611e42612d3e565b84611150856040518060600160405280602581526020016156cd6025913960016000611e6c612d3e565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61344d16565b6000611eb03384846132f1565b33600090815260176020526040902054610d6a90849084906134e4565b60168181548110611eda57fe5b600091825260209091200154905081565b6060806000601580549050604051908082528060200260200182016040528015611f1f578160200160208202803883390190505b506015546040805182815260208084028201019091529194508015611f4e578160200160208202803883390190505b50915060005b60155481101561205f5760158181548110611f6b57fe5b9060005260206000200160009054906101000a90046001600160a01b0316915081848281518110611f9857fe5b6001600160a01b039283166020918202929092018101919091528382166000908152600b82526040908190205481517fc89d5b8b000000000000000000000000000000000000000000000000000000008152915193169263c89d5b8b92600480840193919291829003018186803b15801561201257600080fd5b505afa158015612026573d6000803e3d6000fd5b505050506040513d602081101561203c57600080fd5b5051835184908390811061204c57fe5b6020908102919091010152600101611f54565b50509091565b60145462010000900460ff1681565b600680546001019081905560009030825a6040805160008152602081019091529091506120a3908790876135ea565b93506120b15a820383613832565b50506006548114612109576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5092915050565b600680546001019081905560009081805b60155481101561227b576015818154811061213857fe5b60009182526020918290200154604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156121a057600080fd5b505afa1580156121b4573d6000803e3d6000fd5b505050506040513d60208110156121ca57600080fd5b50519150816121d857612273565b612270612263600b6000601585815481106121ef57fe5b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054601580549190921691908590811061222d57fe5b6000918252602090912001546001600160a01b031661225d61224d610e0e565b610f028e8963ffffffff612e2e16565b306146b4565b859063ffffffff61329716565b93505b600101612121565b506122863388612f49565b60006013541180156122a257506010546001600160a01b031615155b156122b4576122b18784614767565b92505b600c546122d1906001600160a01b0316338563ffffffff612ec916565b306001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561230a57600080fd5b505afa15801561231e573d6000803e3d6000fd5b505050506040513d602081101561233457600080fd5b5051806123bb5750601154600d60009054906101000a90046001600160a01b03166001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561238d57600080fd5b505afa1580156123a1573d6000803e3d6000fd5b505050506040513d60208110156123b757600080fd5b5051105b806123c35750855b156123ce57506123dc565b6123d9600080613a92565b50505b6006548114612432576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50949350505050565b601454610100900460ff1681565b612451611d87565b6124a2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60148054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b600954600090819060ff1615612536576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600d546001600160a01b03161561284257600d54604080517f7ff9b59600000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691637ff9b596916004808301926020929190829003018186803b1580156125a557600080fd5b505afa1580156125b9573d6000803e3d6000fd5b505050506040513d60208110156125cf57600080fd5b5051601154909150811015806125e7575060145460ff165b612638576040805162461bcd60e51b815260206004820152601e60248201527f5061757365643a2069546f6b656e207072696365206465637265617365640000604482015290519081900360640190fd5b601454610100900460ff1615612695576040805162461bcd60e51b815260206004820152601f60248201527f53657474696e6720616c6c6f636174696f6e73206e6f7420616c6c6f77656400604482015290519081900360640190fd5b600061269f610f95565b600e54604080517fae773c1000000000000000000000000000000000000000000000000000000000815260048101918252604481018990529293506001600160a01b039091169163ae773c10918991899160159181906024810190606401866020870280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910184810383528554808252602090910191508590801561277c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161275e575b505095505050505050600060405180830381600087803b15801561279f57600080fd5b505af11580156127b3573d6000803e3d6000fd5b5050505060006127c4600080613a92565b905060006127d0610f95565b9050828111612826576040805162461bcd60e51b815260206004820152601060248201527f415052206e6f7420696d70726f76656400000000000000000000000000000000604482015290519081900360640190fd5b90945092505060115481111561283c5760118190555b50612a37565b601454610100900460ff161561289f576040805162461bcd60e51b815260206004820152601f60248201527f53657474696e6720616c6c6f636174696f6e73206e6f7420616c6c6f77656400604482015290519081900360640190fd5b60006128a9610f95565b600e54604080517fae773c1000000000000000000000000000000000000000000000000000000000815260048101918252604481018890529293506001600160a01b039091169163ae773c10918891889160159181906024810190606401866020870280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910184810383528554808252602090910191508590801561298657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612968575b505095505050505050600060405180830381600087803b1580156129a957600080fd5b505af11580156129bd573d6000803e3d6000fd5b5050505060006129ce600080613a92565b905060006129da610f95565b9050828111612a30576040805162461bcd60e51b815260206004820152601060248201527f415052206e6f7420696d70726f76656400000000000000000000000000000000604482015290519081900360640190fd5b9093509150505b9250929050565b60196020526000908152604090205481565b60003360005a9050612a63600080613a92565b9250612a715a820383613832565b505090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60135481565b612aaf611d87565b612b00576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03821615801590612b2057506001600160a01b03811615155b612b71576040805162461bcd60e51b815260206004820152600e60248201527f736f6d6520616464722069732030000000000000000000000000000000000000604482015290519081900360640190fd5b60145462010000900460ff161580612bca57506001600160a01b03811660009081526019602052604090205415801590612bca57506001600160a01b0381166000908152601960205260409020546203f4804291909103115b15612caa576001600160a01b038281166000908152600b602052604090205416612c5257601580546001810182556000919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384161790555b6001600160a01b038281166000908152600b6020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001694861694851790559282526019905290812055610f91565b6001600160a01b0316600090815260196020526040902042905550565b60115481565b612cd5611d87565b612d26576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61161f816148c7565b600c546001600160a01b031681565b3390565b6001600160a01b038316612d875760405162461bcd60e51b815260040180806020018281038252602481526020018061567f6024913960400191505060405180910390fd5b6001600160a01b038216612dcc5760405162461bcd60e51b815260040180806020018281038252602281526020018061553e6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082612e3d57506000610d6e565b82820282848281612e4a57fe5b041461117f5760405162461bcd60e51b81526004018080602001828103825260218152602001806155ce6021913960400191505060405180910390fd5b600061117f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614980565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526112079084906149e5565b6001600160a01b038216612f8e5760405162461bcd60e51b81526004018080602001828103825260218152602001806156396021913960400191505060405180910390fd5b612fd1816040518060600160405280602281526020016154c6602291396001600160a01b038516600090815260208190526040902054919063ffffffff61344d16565b6001600160a01b038316600090815260208190526040902055600254612ffd908263ffffffff614bc116565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6060806000601580549050604051908082528060200260200182016040528015613079578160200160208202803883390190505b5060155460408051828152602080840282010190915291945080156130a8578160200160208202803883390190505b509150600080805b60155481101561328f57601581815481106130c757fe5b9060005260206000200160009054906101000a90046001600160a01b03169250828682815181106130f457fe5b6001600160a01b039283166020918202929092018101919091528482166000908152600b82526040908190205481517f02bbce4600000000000000000000000000000000000000000000000000000000815291519316926302bbce4692600480840193919291829003018186803b15801561316e57600080fd5b505afa158015613182573d6000803e3d6000fd5b505050506040513d602081101561319857600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191935061324791670de0b6b3a764000091610f02916001600160a01b038816916370a08231916024808301926020929190829003018186803b15801561320e57600080fd5b505afa158015613222573d6000803e3d6000fd5b505050506040513d602081101561323857600080fd5b5051859063ffffffff612e2e16565b85828151811061325357fe5b60200260200101818152505061328585828151811061326e57fe5b60200260200101518561329790919063ffffffff16565b93506001016130b0565b505050909192565b60008282018381101561117f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0383166133365760405162461bcd60e51b815260040180806020018281038252602581526020018061565a6025913960400191505060405180910390fd5b6001600160a01b03821661337b5760405162461bcd60e51b81526004018080602001828103825260238152602001806154a36023913960400191505060405180910390fd5b6133be81604051806060016040528060268152602001615560602691396001600160a01b038616600090815260208190526040902054919063ffffffff61344d16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546133f3908263ffffffff61329716565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156134dc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134a1578181015183820152602001613489565b50505050905090810190601f1680156134ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b601354613532576001600160a01b038316600090815260186020526040902054613514908363ffffffff61329716565b6001600160a01b038416600090815260186020526040902055611207565b6001600160a01b03831660009081526018602052604081205461356490613558866117ec565b9063ffffffff614bc116565b6001600160a01b038516600090815260176020526040812054919250613590838663ffffffff614bc116565b90506135c96135a984610f02878963ffffffff612e2e16565b6135bd85610f02868663ffffffff612e2e16565b9063ffffffff61329716565b6001600160a01b038716600090815260176020526040902055505050505050565b60095460009060ff1615613645576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600d546001600160a01b0316156137c857600d54604080517f7ff9b59600000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691637ff9b596916004808301926020929190829003018186803b1580156136b457600080fd5b505afa1580156136c8573d6000803e3d6000fd5b505050506040513d60208110156136de57600080fd5b5051601154909150811015806136f6575060145460ff165b613747576040805162461bcd60e51b815260206004820152601e60248201527f5061757365643a2069546f6b656e207072696365206465637265617365640000604482015290519081900360640190fd5b60006137516118d4565b600c54909150613772906001600160a01b031633308963ffffffff614c0316565b61377d600085613a92565b5061379a81610f0288670de0b6b3a764000063ffffffff612e2e16565b92506137a63384614c8b565b6137b13384836134e4565b506011548111156137c25760118190555b5061117f565b60006137d26118d4565b600c549091506137f3906001600160a01b031633308863ffffffff614c0316565b6137fe600084613a92565b5061381b81610f0287670de0b6b3a764000063ffffffff612e2e16565b91506138273383614c8b565b6113223383836134e4565b6000600a60018154811061384257fe5b9060005260206000200154600a60008154811061385b57fe5b906000526020600020015484018161386f57fe5b0490506000805a9050600a60028154811061388657fe5b906000526020600020015481106138d657600a6003815481106138a557fe5b9060005260206000200154600a6002815481106138be57fe5b90600052602060002001548203816138d257fe5b0491505b818311156138e2578192505b8215613a24576001600160a01b038416301415613980576eb3f879cb30fe243b4dfee438691c046001600160a01b0316636366b936846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561394e57600080fd5b505af1158015613962573d6000803e3d6000fd5b505050506040513d602081101561397857600080fd5b50613a249050565b604080517f079d229f0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810185905290516eb3f879cb30fe243b4dfee438691c049163079d229f9160448083019260209291908290030181600087803b1580156139f757600080fd5b505af1158015613a0b573d6000803e3d6000fd5b505050506040513d6020811015613a2157600080fd5b50505b5050505050565b60006001600160a01b038216613a725760405162461bcd60e51b81526004018080602001828103825260228152602001806156176022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b60095460009060ff1615613aed576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600d546001600160a01b03161561411757600d54604080517f7ff9b59600000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691637ff9b596916004808301926020929190829003018186803b158015613b5c57600080fd5b505afa158015613b70573d6000803e3d6000fd5b505050506040513d6020811015613b8657600080fd5b505160115490915081101580613b9e575060145460ff165b613bef576040805162461bcd60e51b815260206004820152601e60248201527f5061757365643a2069546f6b656e207072696365206465637265617365640000604482015290519081900360640190fd5b600e54604080517f65ed6e2300000000000000000000000000000000000000000000000000000000815290516060926001600160a01b0316916365ed6e23916004808301926000929190829003018186803b158015613c4d57600080fd5b505afa158015613c61573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015613ca857600080fd5b8101908080516040519392919084640100000000821115613cc857600080fd5b908301906020820185811115613cdd57600080fd5b8251866020820283011164010000000082111715613cfa57600080fd5b82525081516020918201928201910280838360005b83811015613d27578181015183820152602001613d0f565b505050509050016040525050509050600060168054905082511490508015613da35760005b601654811080613d5a575081155b15613da157828181518110613d6b57fe5b602002602001015160168281548110613d8057fe5b906000526020600020015414613d995760009150613da1565b600101613d4c565b505b600c54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015613e0757600080fd5b505afa158015613e1b573d6000803e3d6000fd5b505050506040513d6020811015613e3157600080fd5b50519050818015613e40575080155b15613e515760009450505050614101565b8015613eeb57601654158015613e645750855b15613e7e578251613e7c906016906020860190615433565b505b613eeb6015805480602002602001604051908101604052809291908181526020018280548015613ed757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613eb9575b5050505050613ee68584614d7b565b614e61565b8580613ef45750815b15613f055760009450505050614101565b6060806000613f12613045565b9250925092506060613f248783614d7b565b90506060600080613f36878786614f1d565b92509250925080613f6257613f4d6016600061546e565b8951613f609060169060208d0190615433565b505b600c54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015613fc657600080fd5b505afa158015613fda573d6000803e3d6000fd5b505050506040513d6020811015613ff057600080fd5b505190506001811180156140045750600183115b156140f15760608451604051908082528060200260200182016040528015614036578160200160208202803883390190505b50905060005b855181101561407b5761405c85610f02620186a08985815181106110b357fe5b82828151811061406857fe5b602090810291909101015260010161403c565b5060606140888284614d7b565b90506140ee60158054806020026020016040519081016040528092919081815260200182805480156140e357602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116140c5575b505050505082614e61565b50505b60019c5050505050505050505050505b6011548111156141115760118190555b50610d6e565b600e54604080517f65ed6e2300000000000000000000000000000000000000000000000000000000815290516060926001600160a01b0316916365ed6e23916004808301926000929190829003018186803b15801561417557600080fd5b505afa158015614189573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405260208110156141d057600080fd5b81019080805160405193929190846401000000008211156141f057600080fd5b90830190602082018581111561420557600080fd5b825186602082028301116401000000008211171561422257600080fd5b82525081516020918201928201910280838360005b8381101561424f578181015183820152602001614237565b5050505090500160405250505090506000601680549050825114905080156142cb5760005b601654811080614282575081155b156142c95782818151811061429357fe5b6020026020010151601682815481106142a857fe5b9060005260206000200154146142c157600091506142c9565b600101614274565b505b600c54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561432f57600080fd5b505afa158015614343573d6000803e3d6000fd5b505050506040513d602081101561435957600080fd5b50519050818015614368575080155b156143795760009350505050610d6e565b801561440c5760165415801561438c5750845b156143a65782516143a4906016906020860190615433565b505b61440c6015805480602002602001604051908101604052809291908181526020018280548015613ed7576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311613eb9575050505050613ee68584614d7b565b84806144155750815b156144265760009350505050610d6e565b6060806000614433613045565b92509250925060606144458783614d7b565b90506060600080614457878786614f1d565b925092509250806144835761446e6016600061546e565b89516144819060169060208d0190615433565b505b600c54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156144e757600080fd5b505afa1580156144fb573d6000803e3d6000fd5b505050506040513d602081101561451157600080fd5b505190506001811180156145255750600183115b156146105760608451604051908082528060200260200182016040528015614557578160200160208202803883390190505b50905060005b855181101561459c5761457d85610f02620186a08985815181106110b357fe5b82828151811061458957fe5b602090810291909101015260010161455d565b5060606145a98284614d7b565b905061460d60158054806020026020016040519081016040528092919081815260200182805480156140e3576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116140c557505050505082614e61565b50505b5060019d9c50505050505050505050505050565b61463560088263ffffffff6151f616565b6040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b61467d60088263ffffffff61527b16565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6000826146c05761162f565b6146da6001600160a01b038516868563ffffffff612ec916565b846001600160a01b03166395a2251f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561473257600080fd5b505af1158015614746573d6000803e3d6000fd5b505050506040513d602081101561475c57600080fd5b505195945050505050565b33600090815260186020526040812054816147806118d4565b905060008211801561479157508482115b1561479a578491505b336000908152601760205260408120546147ec90670de0b6b3a764000090610f02906147dc906147d08b8963ffffffff614bc116565b9063ffffffff612e2e16565b6135bd878763ffffffff612e2e16565b9050600061480c670de0b6b3a7640000610f02898663ffffffff612e2e16565b9050818110156148225785945050505050610d6e565b6000614834828463ffffffff614bc116565b90506000614854620186a0610f0260135485612e2e90919063ffffffff16565b601054600c5491925061487a916001600160a01b0390811691168363ffffffff612ec916565b3360009081526018602052604090205461489a908763ffffffff614bc116565b336000908152601860205260409020556148ba838263ffffffff614bc116565b9998505050505050505050565b6001600160a01b03811661490c5760405162461bcd60e51b81526004018080602001828103825260268152602001806155186026913960400191505060405180910390fd5b6007546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600081836149cf5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156134a1578181015183820152602001613489565b5060008385816149db57fe5b0495945050505050565b6149f7826001600160a01b031661531a565b614a48576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310614aa457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614a67565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614b06576040519150601f19603f3d011682016040523d82523d6000602084013e614b0b565b606091505b509150915081614b62576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115614bbb57808060200190516020811015614b7e57600080fd5b5051614bbb5760405162461bcd60e51b815260040180806020018281038252602a8152602001806156a3602a913960400191505060405180910390fd5b50505050565b600061117f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061344d565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052614bbb9085906149e5565b6001600160a01b038216614ce6576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254614cf9908263ffffffff61329716565b6002556001600160a01b038216600090815260208190526040902054614d25908263ffffffff61329716565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6060808351604051908082528060200260200182016040528015614da9578160200160208202803883390190505b509050600080805b8651811015614e56576001875103811415614df357614dd6868363ffffffff614bc116565b848281518110614de257fe5b602002602001018181525050614e4e565b614e20620186a0610f02898481518110614e0957fe5b602002602001015189612e2e90919063ffffffff16565b9250614e32828463ffffffff61329716565b915082848281518110614e4157fe5b6020026020010181815250505b600101614db1565b509195945050505050565b8051825114614ea15760405162461bcd60e51b81526004018080602001828103825260278152602001806155866027913960400191505060405180910390fd5b6000805b8251811015614bbb57828181518110614eba57fe5b602002602001015191508160001415614ed257614f15565b614f13600b6000868481518110614ee557fe5b6020908102919091018101516001600160a01b03908116835290820192909252604001600020541683615351565b505b600101614ea5565b60606000808351855114614f78576040805162461bcd60e51b815260206004820152601160248201527f4c656e67746873206e6f7420657175616c000000000000000000000000000000604482015290519081900360640190fd5b8451604051908082528060200260200182016040528015614fa3578160200160208202803883390190505b5092506000808080805b89518110156151e8578a8181518110614fc257fe5b60200260200101519150888181518110614fd857fe5b60200260200101519250898181518110614fee57fe5b6020908102919091018101516001600160a01b038085166000908152600b909352604090922054909116955093508284111561518f57600088828151811061503257fe5b6020908102919091010152600061504f858563ffffffff614bc116565b90506000866001600160a01b031663743753596040518163ffffffff1660e01b815260040160206040518083038186803b15801561508c57600080fd5b505afa1580156150a0573d6000803e3d6000fd5b505050506040513d60208110156150b657600080fd5b50519050818110156150ca57600197508091505b615187600b6000866001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03168561225d8a6001600160a01b03166302bbce466040518163ffffffff1660e01b815260040160206040518083038186803b15801561514357600080fd5b505afa158015615157573d6000803e3d6000fd5b505050506040513d602081101561516d57600080fd5b5051610f0287670de0b6b3a764000063ffffffff612e2e16565b5050506151e0565b61519f838563ffffffff614bc116565b8882815181106151ab57fe5b6020026020010181815250506151dd8882815181106151c657fe5b60200260200101518861329790919063ffffffff16565b96505b600101614fad565b505050505093509350939050565b6152008282613a2b565b61523b5760405162461bcd60e51b81526004018080602001828103825260218152602001806155ad6021913960400191505060405180910390fd5b6001600160a01b031660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6152858282613a2b565b156152d7576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b031660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159061162f5750141592915050565b60008161535d57610d6e565b600c5461537a906001600160a01b0316848463ffffffff612ec916565b826001600160a01b0316631249c58b6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156153b557600080fd5b505af11580156153c9573d6000803e3d6000fd5b505050506040513d60208110156153df57600080fd5b50519392505050565b828054828255906000526020600020908101928215615423579160200282015b82811115615423578235825591602001919060010190615408565b5061542f929150615488565b5090565b828054828255906000526020600020908101928215615423579160200282015b82811115615423578251825591602001919060010190615453565b508054600082559060005260206000209081019061161f91905b610d5391905b8082111561542f576000815560010161548e56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365416c6c20746f6b656e73206c656e67746820213d20616c6c6f636174696f6e73206c656e677468526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158205503ba457ccd9be0872a25eb657bf7dffbc39f5ca89118ecb978b923d854653b64736f6c63430005100032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000001200000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f51000000000000000000000000625ae63000f46200499120b906716420bd0592400000000000000000000000006b98a5e0e67e68f502e8950992e0b1c0aee0a506000000000000000000000000aefb1325a2c1756bc3fcc516d6c2cf947d22535800000000000000000000000013898151591b91ad5c41385b9af333676f481788000000000000000000000000000000000000000000000000000000000000001749646c6553555344207633205b4d6178207969656c645d000000000000000000000000000000000000000000000000000000000000000000000000000000000d69646c65535553445969656c6400000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): IdleSUSD v3 [Max yield]
Arg [1] : _symbol (string): idleSUSDYield
Arg [2] : _decimals (uint8): 18
Arg [3] : _token (address): 0x57Ab1ec28D129707052df4dF418D58a2D46d5f51
Arg [4] : _aToken (address): 0x625aE63000f46200499120B906716420bd059240
Arg [5] : _rebalancer (address): 0x6b98a5E0E67e68f502e8950992E0b1C0AeE0A506
Arg [6] : _priceCalculator (address): 0xAefb1325A2C1756Bc3fcc516D6C2CF947D225358
Arg [7] : _idleAave (address): 0x13898151591b91Ad5C41385b9af333676F481788
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 00000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f51
Arg [4] : 000000000000000000000000625ae63000f46200499120b906716420bd059240
Arg [5] : 0000000000000000000000006b98a5e0e67e68f502e8950992e0b1c0aee0a506
Arg [6] : 000000000000000000000000aefb1325a2c1756bc3fcc516d6c2cf947d225358
Arg [7] : 00000000000000000000000013898151591b91ad5c41385b9af333676f481788
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [9] : 49646c6553555344207633205b4d6178207969656c645d000000000000000000
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [11] : 69646c65535553445969656c6400000000000000000000000000000000000000
Deployed Bytecode Sourcemap
52793:29682:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52793:29682:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53273:25;;;:::i;:::-;;;;-1:-1:-1;;;;;53273:25:0;;;;;;;;;;;;;;18593:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;18593:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12136:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12136:152:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;54677:48;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54677:48:0;-1:-1:-1;;;;;54677:48:0;;:::i;:::-;;;;;;;;;;;;;;;;59101:95;;;:::i;:::-;;11157:91;;;:::i;66306:617::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66306:617:0;;:::i;61451:541::-;;;:::i;62104:348::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;62104:348:0;;;;;;;;;;;;;;;;;:::i;51260:84::-;;;:::i;19445:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59939:111;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59939:111:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;59939:111:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;59939:111:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;59939:111:0;;-1:-1:-1;59939:111:0;-1:-1:-1;59939:111:0;:::i;54340:35::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54340:35:0;;:::i;13473:210::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13473:210:0;;;;;;;;:::i;53602:28::-;;;:::i;63862:222::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;63862:222:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;63862:222:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;63862:222:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;63862:222:0;;-1:-1:-1;63862:222:0;-1:-1:-1;63862:222:0;:::i;27690:120::-;;;:::i;53148:21::-;;;:::i;53438:25::-;;;:::i;69804:179::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;69804:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;69804:179:0;;;;;;;;;;;;;;;;;;;;53022:51;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53022:51:0;-1:-1:-1;;;;;53022:51:0;;:::i;25169:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25169:109:0;-1:-1:-1;;;;;25169:109:0;;:::i;26897:78::-;;;:::i;57274:444::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57274:444:0;-1:-1:-1;;;;;57274:444:0;;:::i;68946:117::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;68946:117:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;68946:117:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;68946:117:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;68946:117:0;;-1:-1:-1;68946:117:0;-1:-1:-1;68946:117:0;:::i;59378:128::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59378:128:0;;:::i;56962:163::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56962:163:0;-1:-1:-1;;;;;56962:163:0;;:::i;25386:79::-;;;:::i;11311:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11311:110:0;-1:-1:-1;;;;;11311:110:0;;:::i;22825:140::-;;;:::i;69292:85::-;;;:::i;60176:482::-;;;:::i;58687:104::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58687:104:0;;;;:::i;25286:92::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25286:92:0;-1:-1:-1;;;;;25286:92:0;;:::i;27477:118::-;;;:::i;59616:163::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59616:163:0;-1:-1:-1;;;;;59616:163:0;;:::i;53362:30::-;;;:::i;22014:79::-;;;:::i;22380:94::-;;;:::i;18795:87::-;;;:::i;54073:22::-;;;:::i;14186:261::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14186:261:0;;;;;;;;:::i;62456:214::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;62456:214:0;;;;;;;;:::i;54580:32::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54580:32:0;;:::i;60854:480::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;60854:480:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;60854:480:0;;;;;;;;;;;;;;;;;;;54257:32;;;:::i;63301:242::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63301:242:0;;;;;;;;;:::i;64810:1188::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;64810:1188:0;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;64810:1188:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;64810:1188:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;64810:1188:0;;-1:-1:-1;64810:1188:0;-1:-1:-1;64810:1188:0;:::i;54169:26::-;;;:::i;58900:120::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58900:120:0;;;;:::i;67542:636::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;67542:636:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;67542:636:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;67542:636:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;67542:636:0;;-1:-1:-1;67542:636:0;-1:-1:-1;67542:636:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;54950:47;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54950:47:0;-1:-1:-1;;;;;54950:47:0;;:::i;68506:132::-;;;:::i;11855:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11855:134:0;;;;;;;;;;:::i;53907:18::-;;;:::i;57911:604::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;57911:604:0;;;;;;;;;;:::i;53546:30::-;;;:::i;23120:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23120:109:0;-1:-1:-1;;;;;23120:109:0;;:::i;53100:20::-;;;:::i;53273:25::-;;;-1:-1:-1;;;;;53273:25:0;;:::o;18593:83::-;18663:5;18656:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18630:13;;18656:12;;18663:5;;18656:12;;18663:5;18656:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18593:83;;:::o;12136:152::-;12202:4;12219:39;12228:12;:10;:12::i;:::-;12242:7;12251:6;12219:8;:39::i;:::-;-1:-1:-1;12276:4:0;12136:152;;;;;:::o;54677:48::-;;;;;;;;;;;;;:::o;59101:95::-;22226:9;:7;:9::i;:::-;22218:54;;;;;-1:-1:-1;;;22218:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59163:20;:27;;;;;;;;59101:95::o;11157:91::-;11228:12;;11157:91;:::o;66306:617::-;20925:13;:18;;20942:1;20925:18;;;;;:13;66417;:11;:13::i;:::-;66396:34;-1:-1:-1;66439:20:0;;;66494:387;66518:18;:25;66514:29;;66494:387;;;66576:18;66595:1;66576:21;;;;;;;;;;;;;;;;;;;66618:45;;;;;;66657:4;66618:45;;;;;;-1:-1:-1;;;;;66576:21:0;;;;-1:-1:-1;66576:21:0;;66618:30;;:45;;;;;;;;;;66576:21;66618:45;;;5:2:-1;;;;30:1;27;20:12;5:2;66618:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66618:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66618:45:0;;-1:-1:-1;66678:12:0;66674:51;;66705:8;;66674:51;66735:136;66781:10;66804:36;66829:10;66804:20;:7;66816;66804:20;:11;:20;:::i;:::-;:24;:36;:24;:36;:::i;:::-;-1:-1:-1;;;;;66735:33:0;;;:136;;:33;:136;:::i;:::-;66545:3;;66494:387;;;;66891:26;66897:10;66909:7;66891:5;:26::i;:::-;21001:1;;;21037:13;;21021:12;:29;21013:73;;;;;-1:-1:-1;;;21013:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;66306:617;;:::o;61451:541::-;61503:14;61531:24;61557:13;61574:24;:22;:24::i;:::-;61528:70;;-1:-1:-1;61528:70:0;-1:-1:-1;61607:15:0;;-1:-1:-1;61607:15:0;;61654:333;61678:18;:25;61674:29;;61654:333;;;61725:7;61733:1;61725:10;;;;;;;;;;;;;;61739:1;61725:15;61721:54;;;61755:8;;61721:54;61812:16;:39;61829:18;61848:1;61829:21;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61829:21:0;;;61812:39;;;;;;;;;;;;;;;;;61795:66;;;;;;;61812:39;;;61795:64;;:66;;;;;61829:21;61795:66;;;;;;61812:39;61795:66;;;5:2:-1;;;;30:1;27;20:12;5:2;61795:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61795:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61795:66:0;61881:10;;61795:66;;-1:-1:-1;61881:33:0;;61908:5;;61881:22;;61896:6;;61881:7;;61889:1;;61881:10;;;;;;;;;;;;:14;;:22;;;;:::i;:33::-;61872:42;-1:-1:-1;61934:43:0;61945:31;61969:6;61945:19;:7;61872:42;61945:19;:11;:19;:::i;:31::-;61934:6;;:43;:10;:43;:::i;:::-;61925:52;;61654:333;61705:3;;61654:333;;;;61451:541;;;;;:::o;62104:348::-;62193:4;62206:36;62216:6;62224:9;62235:6;62206:9;:36::i;:::-;62249:115;62258:6;62266:10;62278:85;62312:6;62278:85;;;;;;;;;;;;;;;;;:29;62288:6;62296:10;62278:9;:29::i;:::-;:33;:85;;:33;:85;:::i;:::-;62249:8;:115::i;:::-;-1:-1:-1;;;;;62406:21:0;;;;;;:13;:21;;;;;;62371:57;;62387:9;;62398:6;;62371:15;:57::i;:::-;-1:-1:-1;62442:4:0;62104:348;;;;;;:::o;51260:84::-;51301:42;51260:84;:::o;19445:83::-;19511:9;;;;19445:83;:::o;59939:111::-;22226:9;:7;:9::i;:::-;22218:54;;;;;-1:-1:-1;;;22218:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60023:21;:10;60036:8;;60023:21;:::i;:::-;;59939:111;;:::o;54340:35::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54340:35:0;;-1:-1:-1;54340:35:0;:::o;13473:210::-;13553:4;13570:83;13579:12;:10;:12::i;:::-;13593:7;13602:50;13641:10;13602:11;:25;13614:12;:10;:12::i;:::-;-1:-1:-1;;;;;13602:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;13602:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;53602:28::-;;;;:::o;63862:222::-;20925:13;:18;;20942:1;20925:18;;;;;63994:20;;63973:4;63994:20;51486:9;64054:16;;;64068:1;64054:16;;;;;;;;;51461:34;;-1:-1:-1;64030:48:0;;64045:7;;64030:14;:48::i;:::-;64023:55;;51510:50;51544:9;51527:14;:26;51555:4;51510:16;:50::i;:::-;21001:1;;21037:13;;21021:12;:29;21013:73;;;;;-1:-1:-1;;;21013:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63862:222;;;;;;:::o;27690:120::-;25066:22;25075:12;:10;:12::i;:::-;25066:8;:22::i;:::-;25058:83;;;;-1:-1:-1;;;25058:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27333:7;;;;27325:40;;;;;-1:-1:-1;;;27325:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27749:7;:15;;;;;;27780:22;27789:12;:10;:12::i;:::-;27780:22;;;-1:-1:-1;;;;;27780:22:0;;;;;;;;;;;;;;27690:120::o;53148:21::-;;;-1:-1:-1;;;;;53148:21:0;;:::o;53438:25::-;;;-1:-1:-1;;;;;53438:25:0;;:::o;69804:179::-;69865:31;69898:24;69924:13;69953:24;:22;:24::i;:::-;69946:31;;;;;;69804:179;;;:::o;53022:51::-;;;;;;;;;;;;-1:-1:-1;;;;;53022:51:0;;:::o;25169:109::-;25225:4;25249:21;:8;25262:7;25249:21;:12;:21;:::i;26897:78::-;26960:7;;;;26897:78;:::o;57274:444::-;22226:9;:7;:9::i;:::-;22218:54;;;;;-1:-1:-1;;;22218:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57369:30:0;;57361:52;;;;;-1:-1:-1;;;57361:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57427:20;;;;;;;57426:21;;:123;;-1:-1:-1;;;;;;57452:30:0;;;;;;:12;:30;;;;;;:35;;;;:96;;-1:-1:-1;;;;;;57497:30:0;;;;;;:12;:30;;;;;;53828:16;57491:3;:36;;;;:57;57452:96;57422:246;;;57562:15;:34;;;;-1:-1:-1;;;;;57562:34:0;;;;;;;;-1:-1:-1;57607:30:0;;;:12;:30;;;;;:34;57652:7;;57422:246;-1:-1:-1;;;;;57676:30:0;;;;;;:12;:30;;;;;57709:3;57676:36;;22283:1;57274:444;:::o;68946:117::-;69017:4;69037:20;69048:1;69051:5;69037:10;:20::i;:::-;69030:27;68946:117;-1:-1:-1;;;;68946:117:0:o;59378:128::-;22226:9;:7;:9::i;:::-;22218:54;;;;;-1:-1:-1;;;22218:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53704:5;59449:4;:15;;59441:40;;;;;-1:-1:-1;;;59441:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59490:3;:10;59378:128::o;56962:163::-;22226:9;:7;:9::i;:::-;22218:54;;;;;-1:-1:-1;;;22218:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57047:25:0;;57039:47;;;;;-1:-1:-1;;;57039:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57095:10;:24;;;;-1:-1:-1;;;;;57095:24:0;;;;;;;;;;56962:163::o;25386:79::-;25430:27;25444:12;:10;:12::i;:::-;25430:13;:27::i;:::-;25386:79::o;11311:110::-;-1:-1:-1;;;;;11395:18:0;11368:7;11395:18;;;;;;;;;;;;11311:110::o;22825:140::-;22226:9;:7;:9::i;:::-;22218:54;;;;;-1:-1:-1;;;22218:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22908:6;;22887:40;;22924:1;;-1:-1:-1;;;;;22908:6:0;;22887:40;;22924:1;;22887:40;22938:6;:19;;;;;;22825:140::o;69292:85::-;69331:4;69351:20;69362:1;69365:5;69351:10;:20::i;:::-;69344:27;;69292:85;:::o;60176:482::-;60229:13;60253:42;60312:18;:25;;;;60298:40;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;60298:40:0;-1:-1:-1;60253:85:0;-1:-1:-1;60352:9:0;60347:147;60371:18;:25;60367:29;;60347:147;;;60445:16;:39;60462:18;60481:1;60462:21;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60462:21:0;;;60445:39;;;;;;;;;;;;;;;;60414:28;;60445:39;;;60414:25;;60440:1;;60414:28;;;;;;-1:-1:-1;;;;;60414:70:0;;;:28;;;;;;;;;;;:70;60398:3;;60347:147;;;-1:-1:-1;60530:15:0;;-1:-1:-1;;;;;60530:15:0;60510:47;60568:13;:11;:13::i;:::-;60591:4;60598:18;60618:25;60510:142;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60510:142:0;-1:-1:-1;;;;;60510:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60510:142:0;;;;;;;;;;;;;;;;-1:-1:-1;;60510:142:0;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;60510:142:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60510:142:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60510:142:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60510:142:0;;60176:482;-1:-1:-1;;60176:482:0:o;58687:104::-;22226:9;:7;:9::i;:::-;22218:54;;;;;-1:-1:-1;;;22218:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58761:10;:24;;;;;;;;;;;;;58687:104::o;25286:92::-;25066:22;25075:12;:10;:12::i;25066:22::-;25058:83;;;;-1:-1:-1;;;25058:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25351:19;25362:7;25351:10;:19::i;27477:118::-;25066:22;25075:12;:10;:12::i;25066:22::-;25058:83;;;;-1:-1:-1;;;25058:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27134:7;;;;27133:8;27125:37;;;;;-1:-1:-1;;;27125:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27537:7;:14;;;;27547:4;27537:14;;;27567:20;27574:12;:10;:12::i;59616:163::-;22226:9;:7;:9::i;:::-;22218:54;;;;;-1:-1:-1;;;22218:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59701:25:0;;59693:47;;;;;-1:-1:-1;;;59693:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59749:10;:24;;;;-1:-1:-1;;;;;59749:24:0;;;;;;;;;;59616:163::o;53362:30::-;;;-1:-1:-1;;;;;53362:30:0;;:::o;22014:79::-;22079:6;;-1:-1:-1;;;;;22079:6:0;22014:79;:::o;22380:94::-;22460:6;;22420:4;;-1:-1:-1;;;;;22460:6:0;22444:12;:10;:12::i;:::-;-1:-1:-1;;;;;22444:22:0;;22437:29;;22380:94;:::o;18795:87::-;18867:7;18860:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18834:13;;18860:14;;18867:7;;18860:14;;18867:7;18860:14;;;;;;;;;;;;;;;;;;;;;;;;54073:22;;;;;;:::o;14186:261::-;14271:4;14288:129;14297:12;:10;:12::i;:::-;14311:7;14320:96;14359:15;14320:96;;;;;;;;;;;;;;;;;:11;:25;14332:12;:10;:12::i;:::-;-1:-1:-1;;;;;14320:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;14320:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;62456:214::-;62525:4;62538:40;62548:10;62560:9;62571:6;62538:9;:40::i;:::-;62634:10;62620:25;;;;:13;:25;;;;;;62585:61;;62601:9;;62612:6;;62585:15;:61::i;54580:32::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54580:32:0;:::o;60854:480::-;60906:26;60934:21;60966:17;61018:18;:25;;;;61004:40;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;61004:40:0;-1:-1:-1;61074:18:0;:25;61060:40;;;;;;;;;;;;;;;;60992:52;;-1:-1:-1;61060:40:0;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;61060:40:0;-1:-1:-1;61053:47:0;-1:-1:-1;61114:9:0;61109:220;61133:18;:25;61129:29;;61109:220;;;61188:18;61207:1;61188:21;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61188:21:0;61176:33;;61235:9;61220;61230:1;61220:12;;;;;;;;-1:-1:-1;;;;;61220:24:0;;;:12;;;;;;;;;;:24;;;;61282:27;;;;;;;:16;:27;;;;;;;;61265:54;;;;;;;61282:27;;;61265:52;;:54;;;;;61220:12;;61265:54;;;;;;61282:27;61265:54;;;5:2:-1;;;;30:1;27;20:12;5:2;61265:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61265:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61265:54:0;61255:7;;:4;;61260:1;;61255:7;;;;;;;;;;;;;;;:64;61160:3;;61109:220;;;;60854:480;;;:::o;54257:32::-;;;;;;;;;:::o;63301:242::-;20925:13;:18;;20942:1;20925:18;;;;;63439:20;;63418:4;63439:20;51486:9;63499:16;;;63513:1;63499:16;;;;;;;;51461:34;;-1:-1:-1;63475:62:0;;63490:7;;63517:19;63475:14;:62::i;:::-;63468:69;;51510:50;51544:9;51527:14;:26;51555:4;51510:16;:50::i;:::-;21001:1;;21037:13;;21021:12;:29;21013:73;;;;;-1:-1:-1;;;21013:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63301:242;;;;;:::o;64810:1188::-;20925:13;:18;;20942:1;20925:18;;;;;64934:22;;;;64991:557;65015:18;:25;65011:29;;64991:557;;;65075:18;65094:1;65075:21;;;;;;;;;;;;;;;;;;;65068:54;;;;;;65116:4;65068:54;;;;;;-1:-1:-1;;;;;65075:21:0;;;;65068:39;;:54;;;;;;;;;;65075:21;65068:54;;;5:2:-1;;;;30:1;27;20:12;5:2;65068:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65068:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65068:54:0;;-1:-1:-1;65137:12:0;65133:51;;65164:8;;65133:51;65211:327;65242:285;65278:16;:39;65295:18;65314:1;65295:21;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65295:21:0;;;65278:39;;;;;;;;;;;;;;;;65332:18;:21;;65278:39;;;;;65332:18;65351:1;;65332:21;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65332:21:0;65427:39;65452:13;:11;:13::i;:::-;65427:20;:7;65439;65427:20;:11;:20;:::i;:39::-;65509:4;65242:21;:285::i;:::-;65211:14;;:327;:18;:327;:::i;:::-;65194:344;;64991:557;65042:3;;64991:557;;;;65558:26;65564:10;65576:7;65558:5;:26::i;:::-;65603:1;65597:3;;:7;:35;;;;-1:-1:-1;65608:10:0;;-1:-1:-1;;;;;65608:10:0;:24;;65597:35;65593:111;;;65662:32;65670:7;65679:14;65662:7;:32::i;:::-;65645:49;;65593:111;65769:5;;65762:54;;-1:-1:-1;;;;;65769:5:0;65789:10;65801:14;65762:54;:26;:54;:::i;:::-;65831:4;-1:-1:-1;;;;;65831:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65831:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65831:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65831:13:0;;:69;;;65885:15;;65862:6;;;;;;;;;-1:-1:-1;;;;;65862:6:0;-1:-1:-1;;;;;65848:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65848:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65848:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65848:34:0;:52;65831:69;:87;;;;65904:14;65831:87;65827:135;;;-1:-1:-1;65931:21:0;;65827:135;65972:20;65983:1;65986:5;65972:10;:20::i;:::-;;21001:1;;21037:13;;21021:12;:29;21013:73;;;;;-1:-1:-1;;;21013:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;64810:1188;;;;;;;:::o;54169:26::-;;;;;;;;;:::o;58900:120::-;22226:9;:7;:9::i;:::-;22218:54;;;;;-1:-1:-1;;;22218:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58982:14;:32;;;;;;;;;;;;;;;;;58900:120::o;67542:636::-;27134:7;;67674:4;;;;27134:7;;27133:8;27125:37;;;;;-1:-1:-1;;;27125:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56452:6;;-1:-1:-1;;;;;56452:6:0;:20;56448:353;;56519:6;;56505:34;;;;;;;;56483:19;;-1:-1:-1;;;;;56519:6:0;;56505:32;;:34;;;;;;;;;;;;;;56519:6;56505:34;;;5:2:-1;;;;30:1;27;20:12;5:2;56505:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56505:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56505:34:0;56581:15;;56505:34;;-1:-1:-1;56566:30:0;;;;:44;;-1:-1:-1;56600:10:0;;;;56566:44;56548:114;;;;;-1:-1:-1;;;56548:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67714:14;;;;;;;67713:15;67705:59;;;;;-1:-1:-1;;;67705:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67773:18;67794:11;:9;:11::i;:::-;67884:10;;67867:80;;;;;;;;;;;;;;;;;;67773:32;;-1:-1:-1;;;;;;67884:10:0;;;;67867:43;;67911:15;;;;67928:18;;67867:80;;;;;;;;67911:15;67867:80;;;;67911:15;67867:80;1:33:-1;99:1;81:16;;;74:27;137:4;117:14;133:9;113:30;157:16;;;67867:80:0;;;;;;;;;;;;;;;-1:-1:-1;67867:80:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67867:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67867:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67867:80:0;;;;67956:18;67977:20;67988:1;67991:5;67977:10;:20::i;:::-;67956:41;;68006:28;68037:11;:9;:11::i;:::-;68006:42;;68088:10;68065:20;:33;68057:62;;;;;-1:-1:-1;;;68057:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;68136:13;;-1:-1:-1;68151:20:0;-1:-1:-1;;56703:15:0;;56689:11;:29;56685:85;;;56731:15;:29;;;56685:85;56448:353;;;;67714:14;;;;;;;67713:15;67705:59;;;;;-1:-1:-1;;;67705:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67773:18;67794:11;:9;:11::i;:::-;67884:10;;67867:80;;;;;;;;;;;;;;;;;;67773:32;;-1:-1:-1;;;;;;67884:10:0;;;;67867:43;;67911:15;;;;67928:18;;67867:80;;;;;;;;67911:15;67867:80;;;;67911:15;67867:80;1:33:-1;99:1;81:16;;;74:27;137:4;117:14;133:9;113:30;157:16;;;67867:80:0;;;;;;;;;;;;;;;-1:-1:-1;67867:80:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67867:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67867:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67867:80:0;;;;67956:18;67977:20;67988:1;67991:5;67977:10;:20::i;:::-;67956:41;;68006:28;68037:11;:9;:11::i;:::-;68006:42;;68088:10;68065:20;:33;68057:62;;;;;-1:-1:-1;;;68057:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;68136:13;;-1:-1:-1;68151:20:0;-1:-1:-1;;56792:1:0;67542:636;;;;;:::o;54950:47::-;;;;;;;;;;;;;:::o;68506:132::-;68590:4;68564:10;51461:22;51486:9;51461:34;;68612:20;68623:1;68626:5;68612:10;:20::i;:::-;68605:27;;51510:50;51544:9;51527:14;:26;51555:4;51510:16;:50::i;:::-;68506:132;;;:::o;11855:134::-;-1:-1:-1;;;;;11954:18:0;;;11927:7;11954:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11855:134::o;53907:18::-;;;;:::o;57911:604::-;22226:9;:7;:9::i;:::-;22218:54;;;;;-1:-1:-1;;;22218:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58014:20:0;;;;;;:46;;-1:-1:-1;;;;;;58038:22:0;;;;58014:46;58006:73;;;;;-1:-1:-1;;;58006:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58095:20;;;;;;;58094:21;;:107;;-1:-1:-1;;;;;;58120:22:0;;;;;;:12;:22;;;;;;:27;;;;:80;;-1:-1:-1;;;;;;58157:22:0;;;;;;:12;:22;;;;;;53828:16;58151:3;:28;;;;:49;58120:80;58090:381;;;-1:-1:-1;;;;;58266:24:0;;;58302:1;58266:24;;;:16;:24;;;;;;;58262:100;;58319:18;27:10:-1;;39:1;23:18;;45:23;;-1:-1;58319:31:0;;;;;;;;;;-1:-1:-1;;;;;58319:31:0;;;;;58262:100;-1:-1:-1;;;;;58372:24:0;;;;;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;58418:22;;;:12;:22;;;;;:26;58455:7;;58090:381;-1:-1:-1;;;;;58481:22:0;;;;;:12;:22;;;;;58506:3;58481:28;;-1:-1:-1;57911:604:0:o;53546:30::-;;;;:::o;23120:109::-;22226:9;:7;:9::i;:::-;22218:54;;;;;-1:-1:-1;;;22218:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23193:28;23212:8;23193:18;:28::i;53100:20::-;;;-1:-1:-1;;;;;53100:20:0;;:::o;3738:98::-;3818:10;3738:98;:::o;17118:338::-;-1:-1:-1;;;;;17212:19:0;;17204:68;;;;-1:-1:-1;;;17204:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17291:21:0;;17283:68;;;;-1:-1:-1;;;17283:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17364:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17416:32;;;;;;;;;;;;;;;;;17118:338;;;:::o;6361:471::-;6419:7;6664:6;6660:47;;-1:-1:-1;6694:1:0;6687:8;;6660:47;6731:5;;;6735:1;6731;:5;:1;6755:5;;;;;:10;6747:56;;;;-1:-1:-1;;;6747:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7300:132;7358:7;7385:39;7389:1;7392;7385:39;;;;;;;;;;;;;;;;;:3;:39::i;31607:176::-;31716:58;;;-1:-1:-1;;;;;31716:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;31716:58:0;;;;;;;;25:18:-1;;61:17;;31716:58:0;182:15:-1;31739:23:0;179:29:-1;160:49;;31690:85:0;;31709:5;;31690:18;:85::i;16330:348::-;-1:-1:-1;;;;;16406:21:0;;16398:67;;;;-1:-1:-1;;;16398:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16499:68;16522:6;16499:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16499:18:0;;:9;:18;;;;;;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;16478:18:0;;:9;:18;;;;;;;;;;:89;16593:12;;:24;;16610:6;16593:24;:16;:24;:::i;:::-;16578:12;:39;16633:37;;;;;;;;16659:1;;-1:-1:-1;;;;;16633:37:0;;;;;;;;;;;;16330:348;;:::o;80153:918::-;80215:31;80248:24;80274:13;80381:18;:25;;;;80367:40;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;80367:40:0;-1:-1:-1;80440:18:0;:25;80426:40;;;;;;;;;;;;;;;;80350:57;;-1:-1:-1;80426:40:0;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;80426:40:0;-1:-1:-1;80416:50:0;-1:-1:-1;80477:20:0;;;80539:413;80563:18;:25;80559:29;;80539:413;;;80621:18;80640:1;80621:21;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;80621:21:0;80606:36;;80673:12;80653:14;80668:1;80653:17;;;;;;;;-1:-1:-1;;;;;80653:32:0;;;:17;;;;;;;;;;:32;;;;80730:30;;;;;;;:16;:30;;;;;;;;80713:66;;;;;;;80730:30;;;80713:64;;:66;;;;;80653:17;;80713:66;;;;;;80730:30;80713:66;;;5:2:-1;;;;30:1;27;20:12;5:2;80713:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;80713:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;80713:66:0;80834:45;;;;;;80873:4;80834:45;;;;;;80713:66;;-1:-1:-1;80803:99:0;;80895:6;;80803:87;;-1:-1:-1;;;;;80834:30:0;;;;;:45;;;;;80713:66;;80834:45;;;;;;;:30;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;80834:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;80834:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;80834:45:0;80803:14;;:87;:18;:87;:::i;:99::-;80790:7;80798:1;80790:10;;;;;;;;;;;;;:112;;;;;80921:21;80931:7;80939:1;80931:10;;;;;;;;;;;;;;80921:5;:9;;:21;;;;:::i;:::-;80913:29;-1:-1:-1;80590:3:0;;80539:413;;;-1:-1:-1;;;80153:918:0;;;:::o;4989:181::-;5047:7;5079:5;;;5103:6;;;;5095:46;;;;;-1:-1:-1;;;5095:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14937:471;-1:-1:-1;;;;;15035:20:0;;15027:70;;;;-1:-1:-1;;;15027:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15116:23:0;;15108:71;;;;-1:-1:-1;;;15108:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15212;15234:6;15212:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15212:17:0;;:9;:17;;;;;;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;15192:17:0;;;:9;:17;;;;;;;;;;;:91;;;;15317:20;;;;;;;:32;;15342:6;15317:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;15294:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;15365:35;;;;;;;15294:20;;15365:35;;;;;;;;;;;;;14937:471;;;:::o;5918:192::-;6004:7;6040:12;6032:6;;;;6024:29;;;;-1:-1:-1;;;6024:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6024:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6076:5:0;;;5918:192::o;74692:447::-;74778:3;;74774:92;;-1:-1:-1;;;;;74817:17:0;;;;;;:12;:17;;;;;;:26;;74839:3;74817:26;:21;:26;:::i;:::-;-1:-1:-1;;;;;74797:17:0;;;;;;:12;:17;;;;;:46;74852:7;;74774:92;-1:-1:-1;;;;;74914:17:0;;74874:18;74914:17;;;:12;:17;;;;;;74895:37;;:14;74927:3;74895:9;:14::i;:::-;:18;:37;:18;:37;:::i;:::-;-1:-1:-1;;;;;74961:18:0;;74939:19;74961:18;;;:13;:18;;;;;;74874:58;;-1:-1:-1;75007:19:0;74874:58;75022:3;75007:19;:14;:19;:::i;:::-;74986:40;-1:-1:-1;75054:79:0;75102:30;75121:10;75102:14;:5;75112:3;75102:14;:9;:14;:::i;:30::-;75054:43;75086:10;75054:27;:11;75070:10;75054:27;:15;:27;:::i;:43::-;:47;:79;:47;:79;:::i;:::-;-1:-1:-1;;;;;75033:18:0;;;;;;:13;:18;;;;;:100;-1:-1:-1;;;74692:447:0;;;:::o;70597:667::-;27134:7;;70755:20;;27134:7;;27133:8;27125:37;;;;;-1:-1:-1;;;27125:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56452:6;;-1:-1:-1;;;;;56452:6:0;:20;56448:353;;56519:6;;56505:34;;;;;;;;56483:19;;-1:-1:-1;;;;;56519:6:0;;56505:32;;:34;;;;;;;;;;;;;;56519:6;56505:34;;;5:2:-1;;;;30:1;27;20:12;5:2;56505:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56505:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56505:34:0;56581:15;;56505:34;;-1:-1:-1;56566:30:0;;;;:44;;-1:-1:-1;56600:10:0;;;;56566:44;56548:114;;;;;-1:-1:-1;;;56548:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;70824:17;70844:12;:10;:12::i;:::-;70915:5;;70824:32;;-1:-1:-1;70908:66:0;;-1:-1:-1;;;;;70915:5:0;70939:10;70959:4;70966:7;70908:66;:30;:66;:::i;:::-;71061:34;71072:1;71075:19;71061:10;:34::i;:::-;-1:-1:-1;71121:34:0;71145:9;71121:19;:7;71133:6;71121:19;:11;:19;:::i;:34::-;71106:49;;71164:31;71170:10;71182:12;71164:5;:31::i;:::-;71206:52;71222:10;71234:12;71248:9;71206:15;:52::i;:::-;56673:1;56703:15;;56689:11;:29;56685:85;;;56731:15;:29;;;56685:85;56448:353;;;;70824:17;70844:12;:10;:12::i;:::-;70915:5;;70824:32;;-1:-1:-1;70908:66:0;;-1:-1:-1;;;;;70915:5:0;70939:10;70959:4;70966:7;70908:66;:30;:66;:::i;:::-;71061:34;71072:1;71075:19;71061:10;:34::i;:::-;-1:-1:-1;71121:34:0;71145:9;71121:19;:7;71133:6;71121:19;:11;:19;:::i;:34::-;71106:49;;71164:31;71170:10;71182:12;71164:5;:31::i;:::-;71206:52;71222:10;71234:12;71248:9;71206:15;:52::i;51572:809::-;51804:14;51850:10;51861:1;51850:13;;;;;;;;;;;;;;;;51833:10;51844:1;51833:13;;;;;;;;;;;;;;;;51822:8;:24;51821:42;;;;;;51804:59;;51870:21;51898:11;51912:9;51898:23;;52049:10;52060:1;52049:13;;;;;;;;;;;;;;;;52042:3;:20;52038:96;;52113:10;52124:1;52113:13;;;;;;;;;;;;;;;;52096:10;52107:1;52096:13;;;;;;;;;;;;;;;;52090:3;:19;52089:37;;;;;;52073:53;;52038:96;52155:13;52146:6;:22;52142:67;;;52188:13;52179:22;;52142:67;52221:10;;52217:159;;-1:-1:-1;;;;;52246:21:0;;52262:4;52246:21;52242:127;;;51301:42;-1:-1:-1;;;;;52280:13:0;;52294:6;52280:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52280:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52280:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52242:127:0;;-1:-1:-1;52242:127:0;;52328:31;;;;;;-1:-1:-1;;;;;52328:31:0;;;;;;;;;;;;;;51301:42;;52328:17;;:31;;;;;;;;;;;;;;-1:-1:-1;51301:42:0;52328:31;;;5:2:-1;;;;30:1;27;20:12;5:2;52328:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52328:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;52242:127:0;51572:809;;;;;:::o;24434:203::-;24506:4;-1:-1:-1;;;;;24531:21:0;;24523:68;;;;-1:-1:-1;;;24523:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24609:20:0;:11;:20;;;;;;;;;;;;;;;24434:203::o;71485:2943::-;27134:7;;71613:4;;27134:7;;27133:8;27125:37;;;;;-1:-1:-1;;;27125:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56452:6;;-1:-1:-1;;;;;56452:6:0;:20;56448:353;;56519:6;;56505:34;;;;;;;;56483:19;;-1:-1:-1;;;;;56519:6:0;;56505:32;;:34;;;;;;;;;;;;;;56519:6;56505:34;;;5:2:-1;;;;30:1;27;20:12;5:2;56505:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56505:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56505:34:0;56581:15;;56505:34;;-1:-1:-1;56566:30:0;;;;:44;;-1:-1:-1;56600:10:0;;;;56566:44;56548:114;;;;;-1:-1:-1;;;56548:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;71783:10;;71766:45;;;;;;;;71721:42;;-1:-1:-1;;;;;71783:10:0;;71766:43;;:45;;;;;71783:10;;71766:45;;;;;;;71783:10;71766:45;;;5:2:-1;;;;30:1;27;20:12;5:2;71766:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71766:45:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;71766:45:0;80:15:-1;;;97:9;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;71766:45:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;71766:45:0;;421:4:-1;412:14;;;;71766:45:0;;;;;412:14:-1;71766:45:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;71766:45:0;;;;;;;;;;;71721:90;;71820:24;71883:15;:22;;;;71847:25;:32;:58;71820:85;;71918:19;71914:278;;;71955:9;71950:233;71974:15;:22;71970:26;;;:50;;;72001:19;72000:20;71970:50;71950:233;;;72066:25;72092:1;72066:28;;;;;;;;;;;;;;72044:15;72060:1;72044:18;;;;;;;;;;;;;;;;:50;72040:132;;72133:5;72111:27;;72153:5;;72040:132;72022:3;;71950:233;;;;71914:278;72225:5;;72218:38;;;;;;72250:4;72218:38;;;;;;72200:15;;-1:-1:-1;;;;;72225:5:0;;72218:23;;:38;;;;;;;;;;;;;;72225:5;72218:38;;;5:2:-1;;;;30:1;27;20:12;5:2;72218:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72218:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;72218:38:0;;-1:-1:-1;72269:19:0;:35;;;;-1:-1:-1;72292:12:0;;72269:35;72265:74;;;72324:5;72317:12;;;;;;;72265:74;72353:11;;72349:298;;72381:15;:22;:27;:50;;;;;72412:19;72381:50;72377:153;;;72475:43;;;;:15;;:43;;;;;:::i;:::-;;72377:153;72540:97;72557:18;72540:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;72540:97:0;;;;;;;;;;;;;;;;;;;;;72577:59;72601:25;72628:7;72577:23;:59::i;:::-;72540:16;:97::i;:::-;72661:19;:42;;;;72684:19;72661:42;72657:81;;;72723:5;72716:12;;;;;;;72657:81;72919:31;72952:24;72978:25;73007:24;:22;:24::i;:::-;72918:113;;;;;;73092:27;73122:69;73146:25;73173:17;73122:23;:69::i;:::-;73092:99;;73201:34;73237:19;73258:17;73279:53;73296:14;73312:7;73321:10;73279:16;:53::i;:::-;73200:132;;;;;;73492:12;73487:182;;73583:22;73590:15;;73583:22;:::i;:::-;73616:43;;;;:15;;:43;;;;;:::i;:::-;;73487:182;73707:5;;73700:38;;;;;;73732:4;73700:38;;;;;;73677:20;;-1:-1:-1;;;;;73707:5:0;;73700:23;;:38;;;;;;;;;;;;;;73707:5;73700:38;;;5:2:-1;;;;30:1;27;20:12;5:2;73700:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73700:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;73700:38:0;;-1:-1:-1;73766:1:0;73751:16;;:35;;;;;73785:1;73771:11;:15;73751:35;73747:637;;;73880:32;73929:17;:24;73915:39;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;73915:39:0;-1:-1:-1;73880:74:0;-1:-1:-1;73970:9:0;73965:246;73989:17;:24;73985:1;:28;73965:246;;;74150:49;74187:11;74150:32;74175:6;74150:17;74168:1;74150:20;;;;;;;:49;74129:15;74145:1;74129:18;;;;;;;;;;;;;;;;;:70;74015:3;;73965:246;;;;74223:31;74257:54;74281:15;74298:12;74257:23;:54::i;:::-;74223:88;;74322:52;74339:18;74322:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74322:52:0;;;;;;;;;;;;;;;;;;;;;74359:14;74322:16;:52::i;:::-;73747:637;;;74401:4;74394:11;;;;;;;;;;;;;56673:1;56703:15;;56689:11;:29;56685:85;;;56731:15;:29;;;56685:85;56448:353;;;;71783:10;;71766:45;;;;;;;;71721:42;;-1:-1:-1;;;;;71783:10:0;;71766:43;;:45;;;;;71783:10;;71766:45;;;;;;;71783:10;71766:45;;;5:2:-1;;;;30:1;27;20:12;5:2;71766:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71766:45:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;71766:45:0;80:15:-1;;;97:9;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;71766:45:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;71766:45:0;;421:4:-1;412:14;;;;71766:45:0;;;;;412:14:-1;71766:45:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;71766:45:0;;;;;;;;;;;71721:90;;71820:24;71883:15;:22;;;;71847:25;:32;:58;71820:85;;71918:19;71914:278;;;71955:9;71950:233;71974:15;:22;71970:26;;;:50;;;72001:19;72000:20;71970:50;71950:233;;;72066:25;72092:1;72066:28;;;;;;;;;;;;;;72044:15;72060:1;72044:18;;;;;;;;;;;;;;;;:50;72040:132;;72133:5;72111:27;;72153:5;;72040:132;72022:3;;71950:233;;;;71914:278;72225:5;;72218:38;;;;;;72250:4;72218:38;;;;;;72200:15;;-1:-1:-1;;;;;72225:5:0;;72218:23;;:38;;;;;;;;;;;;;;72225:5;72218:38;;;5:2:-1;;;;30:1;27;20:12;5:2;72218:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72218:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;72218:38:0;;-1:-1:-1;72269:19:0;:35;;;;-1:-1:-1;72292:12:0;;72269:35;72265:74;;;72324:5;72317:12;;;;;;;72265:74;72353:11;;72349:298;;72381:15;:22;:27;:50;;;;;72412:19;72381:50;72377:153;;;72475:43;;;;:15;;:43;;;;;:::i;:::-;;72377:153;72540:97;72557:18;72540:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;72540:97:0;;;;;;;;;;;;;;;;;;;;72577:59;72601:25;72628:7;72577:23;:59::i;72540:97::-;72661:19;:42;;;;72684:19;72661:42;72657:81;;;72723:5;72716:12;;;;;;;72657:81;72919:31;72952:24;72978:25;73007:24;:22;:24::i;:::-;72918:113;;;;;;73092:27;73122:69;73146:25;73173:17;73122:23;:69::i;:::-;73092:99;;73201:34;73237:19;73258:17;73279:53;73296:14;73312:7;73321:10;73279:16;:53::i;:::-;73200:132;;;;;;73492:12;73487:182;;73583:22;73590:15;;73583:22;:::i;:::-;73616:43;;;;:15;;:43;;;;;:::i;:::-;;73487:182;73707:5;;73700:38;;;;;;73732:4;73700:38;;;;;;73677:20;;-1:-1:-1;;;;;73707:5:0;;73700:23;;:38;;;;;;;;;;;;;;73707:5;73700:38;;;5:2:-1;;;;30:1;27;20:12;5:2;73700:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73700:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;73700:38:0;;-1:-1:-1;73766:1:0;73751:16;;:35;;;;;73785:1;73771:11;:15;73751:35;73747:637;;;73880:32;73929:17;:24;73915:39;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;73915:39:0;-1:-1:-1;73880:74:0;-1:-1:-1;73970:9:0;73965:246;73989:17;:24;73985:1;:28;73965:246;;;74150:49;74187:11;74150:32;74175:6;74150:17;74168:1;74150:20;;;;;;;:49;74129:15;74145:1;74129:18;;;;;;;;;;;;;;;;;:70;74015:3;;73965:246;;;;74223:31;74257:54;74281:15;74298:12;74257:23;:54::i;:::-;74223:88;;74322:52;74339:18;74322:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74322:52:0;;;;;;;;;;;;;;;;;;;;74359:14;74322:16;:52::i;:::-;73747:637;;;-1:-1:-1;74401:4:0;;71485:2943;-1:-1:-1;;;;;;;;;;;;;71485:2943:0:o;25603:130::-;25663:24;:8;25679:7;25663:24;:15;:24;:::i;:::-;25703:22;;-1:-1:-1;;;;;25703:22:0;;;;;;;;25603:130;:::o;25473:122::-;25530:21;:8;25543:7;25530:21;:12;:21;:::i;:::-;25567:20;;-1:-1:-1;;;;;25567:20:0;;;;;;;;25473:122;:::o;82062:410::-;82194:14;82223:12;82219:52;;82248:13;;82219:52;82351:50;-1:-1:-1;;;;;82351:27:0;;82379:12;82393:7;82351:50;:27;:50;:::i;:::-;82436:12;-1:-1:-1;;;;;82419:37:0;;82457:8;82419:47;;;;;;;;;;;;;-1:-1:-1;;;;;82419:47:0;-1:-1:-1;;;;;82419:47:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;82419:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;82419:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;82419:47:0;;82062:410;-1:-1:-1;;;;;82062:410:0:o;75327:754::-;75444:10;75396:7;75431:24;;;:12;:24;;;;;;75396:7;75482:12;:10;:12::i;:::-;75462:32;;75516:1;75505:8;:12;:33;;;;;75532:6;75521:8;:17;75505:33;75501:73;;;75560:6;75549:17;;75501:73;75672:10;75582:20;75658:25;;;:13;:25;;;;;;75605:92;;75690:6;;75605:80;;75633:51;;:20;:6;75644:8;75633:20;:10;:20;:::i;:::-;:24;:51;:24;:51;:::i;:::-;75605:23;:8;75618:9;75605:23;:12;:23;:::i;:92::-;75582:115;-1:-1:-1;75704:15:0;75722:33;75748:6;75722:21;:6;75733:9;75722:21;:10;:21;:::i;:33::-;75704:51;;75776:12;75766:7;:22;75762:60;;;75806:8;75799:15;;;;;;;;75762:60;75828:12;75843:25;:7;75855:12;75843:25;:11;:25;:::i;:::-;75828:40;;75875:14;75892:25;75910:6;75892:13;75901:3;;75892:4;:8;;:13;;;;:::i;:25::-;75951:10;;75931:5;;75875:42;;-1:-1:-1;75924:46:0;;-1:-1:-1;;;;;75931:5:0;;;;75951:10;75875:42;75924:46;:26;:46;:::i;:::-;76017:10;76004:24;;;;:12;:24;;;;;;:38;;76033:8;76004:38;:28;:38;:::i;:::-;75990:10;75977:24;;;;:12;:24;;;;;:65;76056:19;:7;76068:6;76056:19;:11;:19;:::i;:::-;76049:26;75327:754;-1:-1:-1;;;;;;;;;75327:754:0:o;23335:229::-;-1:-1:-1;;;;;23409:22:0;;23401:73;;;;-1:-1:-1;;;23401:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23511:6;;23490:38;;-1:-1:-1;;;;;23490:38:0;;;;23511:6;;23490:38;;23511:6;;23490:38;23539:6;:17;;;;-1:-1:-1;;;;;23539:17:0;;;;;;;;;;23335:229::o;7962:345::-;8048:7;8150:12;8143:5;8135:28;;;;-1:-1:-1;;;8135:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;8135:28:0;;8174:9;8190:1;8186;:5;;;;;;;7962:345;-1:-1:-1;;;;;7962:345:0:o;33646:1114::-;34250:27;34258:5;-1:-1:-1;;;;;34250:25:0;;:27::i;:::-;34242:71;;;;;-1:-1:-1;;;34242:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34387:12;34401:23;34436:5;-1:-1:-1;;;;;34428:19:0;34448:4;34428:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;34428:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;34386:67:0;;;;34472:7;34464:52;;;;;-1:-1:-1;;;34464:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34533:17;;:21;34529:224;;34675:10;34664:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34664:30:0;34656:85;;;;-1:-1:-1;;;34656:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33646:1114;;;;:::o;5445:136::-;5503:7;5530:43;5534:1;5537;5530:43;;;;;;;;;;;;;;;;;:3;:43::i;31791:204::-;31918:68;;;-1:-1:-1;;;;;31918:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;31918:68:0;;;;;;;;25:18:-1;;61:17;;31918:68:0;182:15:-1;31941:27:0;179:29:-1;160:49;;31892:95:0;;31911:5;;31892:18;:95::i;15689:308::-;-1:-1:-1;;;;;15765:21:0;;15757:65;;;;;-1:-1:-1;;;15757:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15850:12;;:24;;15867:6;15850:24;:16;:24;:::i;:::-;15835:12;:39;-1:-1:-1;;;;;15906:18:0;;:9;:18;;;;;;;;;;;:30;;15929:6;15906:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;15885:18:0;;:9;:18;;;;;;;;;;;:51;;;;15952:37;;;;;;;15885:18;;:9;;15952:37;;;;;;;;;;15689:308;;:::o;77091:638::-;77197:16;77222:27;77266:11;:18;77252:33;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;77252:33:0;-1:-1:-1;77222:63:0;-1:-1:-1;77292:19:0;;;77359:341;77383:11;:18;77379:1;:22;77359:341;;;77447:1;77426:11;:18;:22;77421:1;:27;77417:276;;;77477:27;:5;77487:16;77477:27;:9;:27;:::i;:::-;77461:10;77472:1;77461:13;;;;;;;;;;;;;:43;;;;;77417:276;;;77545:37;77575:6;77545:25;77555:11;77567:1;77555:14;;;;;;;;;;;;;;77545:5;:9;;:25;;;;:::i;:37::-;77531:51;-1:-1:-1;77612:33:0;:16;77531:51;77612:33;:20;:33;:::i;:::-;77593:52;;77672:11;77656:10;77667:1;77656:13;;;;;;;;;;;;;:27;;;;;77417:276;77403:3;;77359:341;;;-1:-1:-1;77713:10:0;;77091:638;-1:-1:-1;;;;;77091:638:0:o;76311:545::-;76513:15;:22;76488:14;:21;:47;76480:99;;;;-1:-1:-1;;;76480:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76588:18;;76615:236;76639:15;:22;76635:1;:26;76615:236;;;76690:15;76706:1;76690:18;;;;;;;;;;;;;;76677:31;;76721:10;76735:1;76721:15;76717:50;;;76749:8;;76717:50;76775:68;76795:16;:35;76812:14;76827:1;76812:17;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;76795:35:0;;;;;;;;;;;;;;-1:-1:-1;76795:35:0;;;76832:10;76775:19;:68::i;:::-;;76615:236;76663:3;;76615:236;;78140:1586;78302:34;78345:19;78373:17;78431:10;:17;78413:7;:14;:35;78405:65;;;;;-1:-1:-1;;;78405:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;78511:7;:14;78497:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;78497:29:0;-1:-1:-1;78477:49:0;-1:-1:-1;78533:25:0;;;;;78698:1023;78722:7;:14;78718:1;:18;78698:1023;;;78764:14;78779:1;78764:17;;;;;;;;;;;;;;78752:29;;78802:10;78813:1;78802:13;;;;;;;;;;;;;;78790:25;;78837:7;78845:1;78837:10;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;78884:27:0;;;;;;;:16;:27;;;;;;;;;;;;-1:-1:-1;78837:10:0;-1:-1:-1;78925:22:0;;;78921:793;;;78983:1;78960:17;78978:1;78960:20;;;;;;;;;;;;;;;;;:24;78995:16;79014:25;:10;79029:9;79014:25;:14;:25;:::i;:::-;78995:44;;79050:26;79079:8;-1:-1:-1;;;;;79079:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;79079:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;79079:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;79079:29:0;;-1:-1:-1;79123:29:0;;;79119:121;;;79182:4;79167:19;;79210:18;79199:29;;79119:121;79284:283;79318:16;:27;79335:9;-1:-1:-1;;;;;79318:27:0;-1:-1:-1;;;;;79318:27:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;79318:27:0;79358:9;79443:52;79468:8;-1:-1:-1;;;;;79468:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;79468:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;79468:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;79468:26:0;79443:20;:8;79456:6;79443:20;:12;:20;:::i;79284:283::-;;78921:793;;;;;79617:25;:9;79631:10;79617:25;:13;:25;:::i;:::-;79594:17;79612:1;79594:20;;;;;;;;;;;;;:48;;;;;79667:37;79683:17;79701:1;79683:20;;;;;;;;;;;;;;79667:11;:15;;:37;;;;:::i;:::-;79653:51;;78921:793;78738:3;;78698:1023;;;;78140:1586;;;;;;;;;;;:::o;24156:183::-;24236:18;24240:4;24246:7;24236:3;:18::i;:::-;24228:64;;;;-1:-1:-1;;;24228:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24303:20:0;24326:5;24303:20;;;;;;;;;;;:28;;;;;;24156:183::o;23898:178::-;23976:18;23980:4;23986:7;23976:3;:18::i;:::-;23975:19;23967:63;;;;;-1:-1:-1;;;23967:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24041:20:0;:11;:20;;;;;;;;;;;:27;;;;24064:4;24041:27;;;23898:178::o;28445:810::-;28505:4;29164:20;;29007:66;29204:15;;;;;:42;;-1:-1:-1;29223:23:0;;;29196:51;-1:-1:-1;;28445:810:0:o;81333:361::-;81429:14;81458:12;81454:52;;81483:13;;81454:52;81591:5;;81584:49;;-1:-1:-1;;;;;81591:5:0;81611:12;81625:7;81584:49;:26;:49;:::i;:::-;81668:12;-1:-1:-1;;;;;81651:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81651:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;81651:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;81651:37:0;;81333:361;-1:-1:-1;;;81333:361:0:o;52793:29682::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52793:29682:0;;;-1:-1:-1;52793:29682:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://5503ba457ccd9be0872a25eb657bf7dffbc39f5ca89118ecb978b923d854653b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.