More Info
Private Name Tags
ContractCreator
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 12954681 | 1192 days ago | IN | 0 ETH | 0.00089211 | ||||
Queue | 12954677 | 1192 days ago | IN | 0 ETH | 0.00164961 | ||||
Queue | 12954675 | 1192 days ago | IN | 0 ETH | 0.00163846 | ||||
Queue | 12954673 | 1192 days ago | IN | 0 ETH | 0.00170919 | ||||
Queue | 12954625 | 1192 days ago | IN | 0 ETH | 0.00168665 | ||||
Queue | 12954451 | 1192 days ago | IN | 0 ETH | 0.00163846 | ||||
0x60c06040 | 12954444 | 1192 days ago | IN | 0 ETH | 0.18033474 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Treasury
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-03 */ // Sources flattened with hardhat v2.5.0 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/math/[email protected] pragma solidity >=0.6.0 <0.8.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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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) { 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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.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 {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal virtual { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File contracts/math/BitMath.sol pragma solidity 0.7.5; library BitMath { function mostSignificantBit(uint256 x) internal pure returns (uint8 r) { require(x > 0, "BitMath::mostSignificantBit: zero"); if (x >= 0x100000000000000000000000000000000) { x >>= 128; r += 128; } if (x >= 0x10000000000000000) { x >>= 64; r += 64; } if (x >= 0x100000000) { x >>= 32; r += 32; } if (x >= 0x10000) { x >>= 16; r += 16; } if (x >= 0x100) { x >>= 8; r += 8; } if (x >= 0x10) { x >>= 4; r += 4; } if (x >= 0x4) { x >>= 2; r += 2; } if (x >= 0x2) r += 1; } } // File contracts/math/FullMath.sol pragma solidity 0.7.5; library FullMath { function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) { uint256 mm = mulmod(x, y, uint256(-1)); l = x * y; h = mm - l; if (mm < l) h -= 1; } function fullDiv( uint256 l, uint256 h, uint256 d ) private pure returns (uint256) { uint256 pow2 = d & -d; d /= pow2; l /= pow2; l += h * ((-pow2) / pow2 + 1); uint256 r = 1; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; return l * r; } function mulDiv( uint256 x, uint256 y, uint256 d ) internal pure returns (uint256) { (uint256 l, uint256 h) = fullMul(x, y); uint256 mm = mulmod(x, y, d); if (mm > l) h -= 1; l -= mm; require(h < d, "FullMath::mulDiv: overflow"); return fullDiv(l, h, d); } } // File contracts/math/FixedPoint.sol pragma solidity 0.7.5; library Babylonian { function sqrt(uint256 x) internal pure returns (uint256) { if (x == 0) return 0; uint256 xx = x; uint256 r = 1; if (xx >= 0x100000000000000000000000000000000) { xx >>= 128; r <<= 64; } if (xx >= 0x10000000000000000) { xx >>= 64; r <<= 32; } if (xx >= 0x100000000) { xx >>= 32; r <<= 16; } if (xx >= 0x10000) { xx >>= 16; r <<= 8; } if (xx >= 0x100) { xx >>= 8; r <<= 4; } if (xx >= 0x10) { xx >>= 4; r <<= 2; } if (xx >= 0x8) { r <<= 1; } r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; // Seven iterations should be enough uint256 r1 = x / r; return (r < r1 ? r : r1); } } library FixedPoint { // range: [0, 2**112 - 1] // resolution: 1 / 2**112 struct uq112x112 { uint224 _x; } // range: [0, 2**144 - 1] // resolution: 1 / 2**112 struct uq144x112 { uint256 _x; } uint8 private constant RESOLUTION = 112; uint256 private constant Q112 = 0x10000000000000000000000000000; uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000; uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits) // decode a UQ112x112 into a uint112 by truncating after the radix point function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } // decode a uq112x112 into a uint with 18 decimals of precision function decode112with18(uq112x112 memory self) internal pure returns (uint256) { return uint256(self._x) / 5192296858534827; } function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, "FixedPoint::fraction: division by zero"); if (numerator == 0) return FixedPoint.uq112x112(0); if (numerator <= uint144(-1)) { uint256 result = (numerator << RESOLUTION) / denominator; require(result <= uint224(-1), "FixedPoint::fraction: overflow"); return uq112x112(uint224(result)); } else { uint256 result = FullMath.mulDiv(numerator, Q112, denominator); require(result <= uint224(-1), "FixedPoint::fraction: overflow"); return uq112x112(uint224(result)); } } // square root of a UQ112x112 // lossy between 0/1 and 40 bits function sqrt(uq112x112 memory self) internal pure returns (uq112x112 memory) { if (self._x <= uint144(-1)) { return uq112x112(uint224(Babylonian.sqrt(uint256(self._x) << 112))); } uint8 safeShiftBits = 255 - BitMath.mostSignificantBit(self._x); safeShiftBits -= safeShiftBits % 2; return uq112x112( uint224( Babylonian.sqrt(uint256(self._x) << safeShiftBits) << ((112 - safeShiftBits) / 2) ) ); } } // File contracts/BondingCalculator.sol pragma solidity 0.7.5; library MySafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sqrrt(uint256 a) internal pure returns (uint256 c) { if (a > 3) { c = a; uint256 b = add(div(a, 2), 1); while (b < c) { c = b; b = div(add(div(a, b), b), 2); } } else if (a != 0) { c = 1; } } } interface IUniswapV2ERC20 { function totalSupply() external view returns (uint256); } interface IUniswapV2Pair is IUniswapV2ERC20 { function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function token0() external view returns (address); function token1() external view returns (address); } contract BondingCalculator { using FixedPoint for *; using MySafeMath for uint256; using MySafeMath for uint112; address public immutable HADES; constructor(address _HADES) { require(_HADES != address(0)); HADES = _HADES; } function getKValue(address _pair) public view returns (uint256 k_) { uint256 token0 = ERC20(IUniswapV2Pair(_pair).token0()).decimals(); uint256 token1 = ERC20(IUniswapV2Pair(_pair).token1()).decimals(); uint256 decimals = token0.add(token1).sub(ERC20(_pair).decimals()); (uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(_pair) .getReserves(); k_ = reserve0.mul(reserve1).div(10**decimals); } function getTotalValue(address _pair) public view returns (uint256 _value) { _value = getKValue(_pair).sqrrt().mul(2); } function valuation(address _pair, uint256 amount_) external view returns (uint256 _value) { uint256 totalValue = getTotalValue(_pair); uint256 totalSupply = IUniswapV2Pair(_pair).totalSupply(); _value = totalValue .mul(FixedPoint.fraction(amount_, totalSupply).decode112with18()) .div(1e18); } function markdown(address _pair) external view returns (uint256) { (uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(_pair) .getReserves(); uint256 reserve; if (IUniswapV2Pair(_pair).token0() == HADES) { reserve = reserve1; } else { reserve = reserve0; } return reserve.mul(2 * (10**ERC20(HADES).decimals())).div(getTotalValue(_pair)); } } // File @openzeppelin/contracts/access/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File @openzeppelin/contracts/access/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { using SafeMath for uint256; /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance"); _approve(account, _msgSender(), decreasedAllowance); _burn(account, amount); } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev ERC20 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC20Pausable is ERC20, Pausable { /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(!paused(), "ERC20Pausable: token transfer while paused"); } } // File @openzeppelin/contracts/presets/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev {ERC20} token, including: * * - ability for holders to burn (destroy) their tokens * - a minter role that allows for token minting (creation) * - a pauser role that allows to stop all token transfers * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to other accounts. */ contract ERC20PresetMinterPauser is Context, AccessControl, ERC20Burnable, ERC20Pausable { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the * account that deploys the contract. * * See {ERC20-constructor}. */ constructor(string memory name, string memory symbol) public ERC20(name, symbol) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); } /** * @dev Creates `amount` new tokens for `to`. * * See {ERC20-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 amount) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint"); _mint(to, amount); } /** * @dev Pauses all token transfers. * * See {ERC20Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC20Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause"); _unpause(); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override(ERC20, ERC20Pausable) { super._beforeTokenTransfer(from, to, amount); } } // File contracts/Treasury.sol pragma solidity 0.7.5; contract Treasury is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; event Deposit(address indexed token, uint256 amount, uint256 value); event Withdrawal(address indexed token, uint256 amount, uint256 value); event CreateDebt( address indexed debtor, address indexed token, uint256 amount, uint256 value ); event RepayDebt( address indexed debtor, address indexed token, uint256 amount, uint256 value ); event ReservesManaged(address indexed token, uint256 amount); event ReservesUpdated(uint256 indexed totalReserves); event ReservesAudited(uint256 indexed totalReserves); event RewardsMinted( address indexed caller, address indexed recipient, uint256 amount ); event ChangeQueued(MANAGING indexed managing, address queued); event ChangeActivated( MANAGING indexed managing, address activated, bool result ); enum MANAGING { RESERVEDEPOSITOR, RESERVESPENDER, RESERVETOKEN, RESERVEMANAGER, LIQUIDITYDEPOSITOR, LIQUIDITYTOKEN, LIQUIDITYMANAGER, DEBTOR, REWARDMANAGER, SHADES } address public immutable HADES; uint256 public immutable blocksNeededForQueue; address[] public reserveTokens; // Push only, beware false-positives. mapping(address => bool) public isReserveToken; mapping(address => uint256) public reserveTokenQueue; // Delays changes to mapping. address[] public reserveDepositors; // Push only, beware false-positives. Only for viewing. mapping(address => bool) public isReserveDepositor; mapping(address => uint256) public reserveDepositorQueue; // Delays changes to mapping. address[] public reserveSpenders; // Push only, beware false-positives. Only for viewing. mapping(address => bool) public isReserveSpender; mapping(address => uint256) public reserveSpenderQueue; // Delays changes to mapping. address[] public liquidityTokens; // Push only, beware false-positives. mapping(address => bool) public isLiquidityToken; mapping(address => uint256) public LiquidityTokenQueue; // Delays changes to mapping. address[] public liquidityDepositors; // Push only, beware false-positives. Only for viewing. mapping(address => bool) public isLiquidityDepositor; mapping(address => uint256) public LiquidityDepositorQueue; // Delays changes to mapping. mapping(address => address) public bondCalculator; // bond calculator for liquidity token address[] public reserveManagers; // Push only, beware false-positives. Only for viewing. mapping(address => bool) public isReserveManager; mapping(address => uint256) public ReserveManagerQueue; // Delays changes to mapping. address[] public liquidityManagers; // Push only, beware false-positives. Only for viewing. mapping(address => bool) public isLiquidityManager; mapping(address => uint256) public LiquidityManagerQueue; // Delays changes to mapping. address[] public debtors; // Push only, beware false-positives. Only for viewing. mapping(address => bool) public isDebtor; mapping(address => uint256) public debtorQueue; // Delays changes to mapping. mapping(address => uint256) public debtorBalance; address[] public rewardManagers; // Push only, beware false-positives. Only for viewing. mapping(address => bool) public isRewardManager; mapping(address => uint256) public rewardManagerQueue; // Delays changes to mapping. address public sHADES; uint256 public sHADESQueue; // Delays change to sHADES address uint256 public totalReserves; // Risk-free value of all assets uint256 public totalDebt; constructor( address _HADES, address _OHM, uint256 _blocksNeededForQueue ) { require(_HADES != address(0)); HADES = _HADES; isReserveToken[_OHM] = true; reserveTokens.push(_OHM); blocksNeededForQueue = _blocksNeededForQueue; } /** @notice allow approved address to deposit an asset for HADES @param _amount uint @param _token address @param _profit uint @param _only_deposit bool @return send_ uint */ function deposit( uint256 _amount, address _token, uint256 _profit, bool _only_deposit ) external returns (uint256 send_) { require(isReserveToken[_token] || isLiquidityToken[_token], "Not accepted"); IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount); if (isReserveToken[_token]) { require(isReserveDepositor[msg.sender], "Not approved"); } else { require(isLiquidityDepositor[msg.sender], "Not approved"); } uint256 value = valueOfToken(_token, _amount); // Just update reserves if _only_deposit is true - no HADES minting. // This is for sending the OHM from the aHades contract. // Otherwise, treat it like a normal deposit. if (_only_deposit) { totalReserves = totalReserves.add(value); emit ReservesUpdated(totalReserves); } else { // mint HADES needed and store amount of rewards for distribution send_ = value.sub(_profit); ERC20PresetMinterPauser(HADES).mint(msg.sender, send_); totalReserves = totalReserves.add(value); emit ReservesUpdated(totalReserves); emit Deposit(_token, _amount, value); } } /** @notice allow approved address to burn HADES for reserves @param _amount uint @param _token address */ function withdraw(uint256 _amount, address _token) external { require(isReserveToken[_token], "Not accepted"); // Only reserves can be used for redemptions require(isReserveSpender[msg.sender] == true, "Not approved"); uint256 value = valueOfToken(_token, _amount); ERC20PresetMinterPauser(HADES).burnFrom(msg.sender, value); totalReserves = totalReserves.sub(value); emit ReservesUpdated(totalReserves); IERC20(_token).safeTransfer(msg.sender, _amount); emit Withdrawal(_token, _amount, value); } /** @notice allow approved address to borrow reserves @param _amount uint @param _token address */ function incurDebt(uint256 _amount, address _token) external { require(isDebtor[msg.sender], "Not approved"); require(isReserveToken[_token], "Not accepted"); uint256 value = valueOfToken(_token, _amount); uint256 maximumDebt = IERC20(sHADES).balanceOf(msg.sender); // Can only borrow against sHADES held uint256 availableDebt = maximumDebt.sub(debtorBalance[msg.sender]); require(value <= availableDebt, "Exceeds debt limit"); debtorBalance[msg.sender] = debtorBalance[msg.sender].add(value); totalDebt = totalDebt.add(value); totalReserves = totalReserves.sub(value); emit ReservesUpdated(totalReserves); IERC20(_token).transfer(msg.sender, _amount); emit CreateDebt(msg.sender, _token, _amount, value); } /** @notice allow approved address to repay borrowed reserves with reserves @param _amount uint @param _token address */ function repayDebtWithReserve(uint256 _amount, address _token) external { require(isDebtor[msg.sender], "Not approved"); require(isReserveToken[_token], "Not accepted"); IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount); uint256 value = valueOfToken(_token, _amount); debtorBalance[msg.sender] = debtorBalance[msg.sender].sub(value); totalDebt = totalDebt.sub(value); totalReserves = totalReserves.add(value); emit ReservesUpdated(totalReserves); emit RepayDebt(msg.sender, _token, _amount, value); } /** @notice allow approved address to repay borrowed reserves with HADES @param _amount uint */ function repayDebtWithHADES(uint256 _amount) external { require(isDebtor[msg.sender], "Not approved"); ERC20PresetMinterPauser(HADES).burnFrom(msg.sender, _amount); debtorBalance[msg.sender] = debtorBalance[msg.sender].sub(_amount); totalDebt = totalDebt.sub(_amount); emit RepayDebt(msg.sender, HADES, _amount, _amount); } /** @notice allow approved address to withdraw assets @param _token address @param _amount uint */ function manage(address _token, uint256 _amount) external { if (isLiquidityToken[_token]) { require(isLiquidityManager[msg.sender], "Not approved"); } else { require(isReserveManager[msg.sender], "Not approved"); } uint256 value = valueOfToken(_token, _amount); require(value <= excessReserves(), "Insufficient reserves"); totalReserves = totalReserves.sub(value); emit ReservesUpdated(totalReserves); IERC20(_token).safeTransfer(msg.sender, _amount); emit ReservesManaged(_token, _amount); } /** @notice send epoch reward to staking contract */ function mintRewards(address _recipient, uint256 _amount) external { require(isRewardManager[msg.sender], "Not approved"); require(_amount <= excessReserves(), "Insufficient reserves"); ERC20PresetMinterPauser(HADES).mint(_recipient, _amount); emit RewardsMinted(msg.sender, _recipient, _amount); } /** @notice returns excess reserves not backing tokens @return uint */ function excessReserves() public view returns (uint256) { return totalReserves.sub(IERC20(HADES).totalSupply().sub(totalDebt)); } /** @notice takes inventory of all tracked assets @notice always consolidate to recognized reserves before audit */ function auditReserves() external onlyOwner { uint256 reserves; for (uint256 i = 0; i < reserveTokens.length; i++) { reserves = reserves.add( valueOfToken( reserveTokens[i], IERC20(reserveTokens[i]).balanceOf(address(this)) ) ); } for (uint256 i = 0; i < liquidityTokens.length; i++) { reserves = reserves.add( valueOfToken( liquidityTokens[i], IERC20(liquidityTokens[i]).balanceOf(address(this)) ) ); } totalReserves = reserves; emit ReservesUpdated(reserves); emit ReservesAudited(reserves); } /** @notice returns HADES valuation of asset @param _token address @param _amount uint @return value_ uint */ function valueOfToken(address _token, uint256 _amount) public view returns (uint256 value_) { if (isReserveToken[_token]) { // convert amount to match HADES decimals value_ = _amount .mul(10**ERC20(HADES).decimals()) .div(10**ERC20(_token).decimals()); } else if (isLiquidityToken[_token]) { value_ = BondingCalculator(bondCalculator[_token]).valuation( _token, _amount ); } } /** @notice queue address to change boolean in mapping @param _managing MANAGING @param _address address @return bool */ function queue(MANAGING _managing, address _address) external onlyOwner returns (bool) { require(_address != address(0)); if (_managing == MANAGING.RESERVEDEPOSITOR) { // 0 reserveDepositorQueue[_address] = block.number.add(blocksNeededForQueue); } else if (_managing == MANAGING.RESERVESPENDER) { // 1 reserveSpenderQueue[_address] = block.number.add(blocksNeededForQueue); } else if (_managing == MANAGING.RESERVETOKEN) { // 2 reserveTokenQueue[_address] = block.number.add(blocksNeededForQueue); } else if (_managing == MANAGING.RESERVEMANAGER) { // 3 ReserveManagerQueue[_address] = block.number.add( blocksNeededForQueue.mul(2) ); } else if (_managing == MANAGING.LIQUIDITYDEPOSITOR) { // 4 LiquidityDepositorQueue[_address] = block.number.add( blocksNeededForQueue ); } else if (_managing == MANAGING.LIQUIDITYTOKEN) { // 5 LiquidityTokenQueue[_address] = block.number.add(blocksNeededForQueue); } else if (_managing == MANAGING.LIQUIDITYMANAGER) { // 6 LiquidityManagerQueue[_address] = block.number.add( blocksNeededForQueue.mul(2) ); } else if (_managing == MANAGING.DEBTOR) { // 7 debtorQueue[_address] = block.number.add(blocksNeededForQueue); } else if (_managing == MANAGING.REWARDMANAGER) { // 8 rewardManagerQueue[_address] = block.number.add(blocksNeededForQueue); } else if (_managing == MANAGING.SHADES) { // 9 sHADESQueue = block.number.add(blocksNeededForQueue); } else return false; emit ChangeQueued(_managing, _address); return true; } /** @notice verify queue then set boolean in mapping @param _managing MANAGING @param _address address @param _calculator address @return bool */ function toggle( MANAGING _managing, address _address, address _calculator ) external onlyOwner returns (bool) { require(_address != address(0)); bool result; if (_managing == MANAGING.RESERVEDEPOSITOR) { // 0 if (requirements(reserveDepositorQueue, isReserveDepositor, _address)) { reserveDepositorQueue[_address] = 0; if (!listContains(reserveDepositors, _address)) { reserveDepositors.push(_address); } } result = !isReserveDepositor[_address]; isReserveDepositor[_address] = result; } else if (_managing == MANAGING.RESERVESPENDER) { // 1 if (requirements(reserveSpenderQueue, isReserveSpender, _address)) { reserveSpenderQueue[_address] = 0; if (!listContains(reserveSpenders, _address)) { reserveSpenders.push(_address); } } result = !isReserveSpender[_address]; isReserveSpender[_address] = result; } else if (_managing == MANAGING.RESERVETOKEN) { // 2 if (requirements(reserveTokenQueue, isReserveToken, _address)) { reserveTokenQueue[_address] = 0; if (!listContains(reserveTokens, _address)) { reserveTokens.push(_address); } } result = !isReserveToken[_address]; isReserveToken[_address] = result; } else if (_managing == MANAGING.RESERVEMANAGER) { // 3 if (requirements(ReserveManagerQueue, isReserveManager, _address)) { reserveManagers.push(_address); ReserveManagerQueue[_address] = 0; if (!listContains(reserveManagers, _address)) { reserveManagers.push(_address); } } result = !isReserveManager[_address]; isReserveManager[_address] = result; } else if (_managing == MANAGING.LIQUIDITYDEPOSITOR) { // 4 if ( requirements(LiquidityDepositorQueue, isLiquidityDepositor, _address) ) { liquidityDepositors.push(_address); LiquidityDepositorQueue[_address] = 0; if (!listContains(liquidityDepositors, _address)) { liquidityDepositors.push(_address); } } result = !isLiquidityDepositor[_address]; isLiquidityDepositor[_address] = result; } else if (_managing == MANAGING.LIQUIDITYTOKEN) { // 5 if (requirements(LiquidityTokenQueue, isLiquidityToken, _address)) { LiquidityTokenQueue[_address] = 0; if (!listContains(liquidityTokens, _address)) { liquidityTokens.push(_address); } } result = !isLiquidityToken[_address]; isLiquidityToken[_address] = result; bondCalculator[_address] = _calculator; } else if (_managing == MANAGING.LIQUIDITYMANAGER) { // 6 if (requirements(LiquidityManagerQueue, isLiquidityManager, _address)) { LiquidityManagerQueue[_address] = 0; if (!listContains(liquidityManagers, _address)) { liquidityManagers.push(_address); } } result = !isLiquidityManager[_address]; isLiquidityManager[_address] = result; } else if (_managing == MANAGING.DEBTOR) { // 7 if (requirements(debtorQueue, isDebtor, _address)) { debtorQueue[_address] = 0; if (!listContains(debtors, _address)) { debtors.push(_address); } } result = !isDebtor[_address]; isDebtor[_address] = result; } else if (_managing == MANAGING.REWARDMANAGER) { // 8 if (requirements(rewardManagerQueue, isRewardManager, _address)) { rewardManagerQueue[_address] = 0; if (!listContains(rewardManagers, _address)) { rewardManagers.push(_address); } } result = !isRewardManager[_address]; isRewardManager[_address] = result; } else if (_managing == MANAGING.SHADES) { // 9 sHADESQueue = 0; sHADES = _address; result = true; } else return false; emit ChangeActivated(_managing, _address, result); return true; } /** @notice checks requirements and returns altered structs @param queue_ mapping( address => uint256 ) @param status_ mapping( address => bool ) @param _address address @return bool */ function requirements( mapping(address => uint256) storage queue_, mapping(address => bool) storage status_, address _address ) internal view returns (bool) { if (!status_[_address]) { require(queue_[_address] != 0, "Must queue"); require(queue_[_address] <= block.number, "Queue not expired"); return true; } return false; } /** @notice checks array to ensure against duplicate @param _list address[] @param _token address @return bool */ function listContains(address[] storage _list, address _token) internal view returns (bool) { for (uint256 i = 0; i < _list.length; i++) { if (_list[i] == _token) { return true; } } return false; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_HADES","type":"address"},{"internalType":"address","name":"_OHM","type":"address"},{"internalType":"uint256","name":"_blocksNeededForQueue","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum Treasury.MANAGING","name":"managing","type":"uint8"},{"indexed":false,"internalType":"address","name":"activated","type":"address"},{"indexed":false,"internalType":"bool","name":"result","type":"bool"}],"name":"ChangeActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum Treasury.MANAGING","name":"managing","type":"uint8"},{"indexed":false,"internalType":"address","name":"queued","type":"address"}],"name":"ChangeQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"debtor","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"CreateDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"debtor","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"RepayDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"totalReserves","type":"uint256"}],"name":"ReservesAudited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReservesManaged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"totalReserves","type":"uint256"}],"name":"ReservesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"HADES","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LiquidityDepositorQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LiquidityManagerQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LiquidityTokenQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ReserveManagerQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auditReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blocksNeededForQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"debtorBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"debtorQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"debtors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_profit","type":"uint256"},{"internalType":"bool","name":"_only_deposit","type":"bool"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"send_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"excessReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"incurDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDebtor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityDepositor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReserveDepositor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReserveManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReserveSpender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReserveToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isRewardManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidityDepositors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidityManagers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidityTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"manage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Treasury.MANAGING","name":"_managing","type":"uint8"},{"internalType":"address","name":"_address","type":"address"}],"name":"queue","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"repayDebtWithHADES","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"repayDebtWithReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveDepositorQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveDepositors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveManagers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveSpenderQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveSpenders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveTokenQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardManagerQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardManagers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sHADES","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sHADESQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Treasury.MANAGING","name":"_managing","type":"uint8"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"_calculator","type":"address"}],"name":"toggle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"valueOfToken","outputs":[{"internalType":"uint256","name":"value_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b506040516200605538038062006055833981810160405260608110156200003757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505060006200006e6200024a60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200014757600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250506001600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060a0818152505050505062000252565b600033905090565b60805160601c60a051615d87620002ce6000398061315a52806138e752806139815280613a1b5280613aba5280613b625280613bfc5280613c9b5280613d435280613ddd5280613e7652508061139552806118dd5280611d7c52806129385280612e875280612fe05280613088528061325f5250615d876000f3fe608060405234801561001057600080fd5b50600436106102d55760003560e01c8063932cc8c311610182578063d1b317e5116100e9578063ee4e19a1116100a2578063fbfd393b1161007c578063fbfd393b146110ab578063fc7b9c1814611132578063fd1ec01014611150578063fff9ee87146111a8576102d5565b8063ee4e19a114610fb5578063f2fde38b1461100f578063fb93958814611053576102d5565b8063d1b317e514610dcc578063d796ffb814610e2e578063df89b34414610e7c578063e39e861814610ed6578063e83afee314610ef4578063ebd83cd814610f5b576102d5565b8063b5a527e01161013b578063b5a527e014610c1a578063b5b1d56014610c4e578063c24ad43e14610ca6578063cd85641a14610cfe578063d031370b14610d56578063d07f390f14610dae576102d5565b8063932cc8c314610a30578063a1210a2d14610a88578063a569e57114610ae2578063ab319c9a14610b3c578063b02a660914610b94578063b1bd38b014610bc2576102d5565b806368c31dd511610241578063788c6c01116101fa5780638da5cb5b116101d45780638da5cb5b1461092e5780638f59c727146109625780638f6a7b57146109ba5780638f840ddd14610a12576102d5565b8063788c6c0114610824578063869871bf1461087c57806387d67dff146108d4576102d5565b806368c31dd51461068e5780636a20de92146106e85780636b5e40a7146107365780636cd093111461078e57806370a0502a146107c2578063715018a61461081a576102d5565b8063124154ca11610293578063124154ca146104bc57806312422d23146105165780631af4da70146105645780632b7ce500146105d2578063437f7912146105dc5780634e83423c14610634576102d5565b8062f714ce146102da5780630619aff11461032857806306aaa1c814610380578063094a8651146103f85780630b0eee30146104505780630c3513a81461049e575b600080fd5b610326600480360360408110156102f057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611200565b005b6103546004803603602081101561033e57600080fd5b810190808035906020019092919050505061150c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e26004803603608081101561039657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080351515906020019092919050505061154b565b6040518082815260200191505060405180910390f35b61043a6004803603602081101561040e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a2e565b6040518082815260200191505060405180910390f35b61049c6004803603604081101561046657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a46565b005b6104a6611d6f565b6040518082815260200191505060405180910390f35b6104fe600480360360208110156104d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e3f565b60405180821515815260200191505060405180910390f35b6105626004803603604081101561052c57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e5f565b005b6105a66004803603602081101561057a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061239a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105da6123cd565b005b610608600480360360208110156105f257600080fd5b810190808035906020019092919050505061277b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106766004803603602081101561064a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127ba565b60405180821515815260200191505060405180910390f35b6106d0600480360360208110156106a457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127da565b60405180821515815260200191505060405180910390f35b610734600480360360408110156106fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127fa565b005b6107626004803603602081101561074c57600080fd5b8101908080359060200190929190505050612a48565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610796612a87565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107ee600480360360208110156107d857600080fd5b8101908080359060200190929190505050612aad565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610822612aec565b005b6108666004803603602081101561083a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c59565b6040518082815260200191505060405180910390f35b6108a86004803603602081101561089257600080fd5b8101908080359060200190929190505050612c71565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610916600480360360208110156108ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cb0565b60405180821515815260200191505060405180910390f35b610936612cd0565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a46004803603602081101561097857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cf9565b6040518082815260200191505060405180910390f35b6109e6600480360360208110156109d057600080fd5b8101908080359060200190929190505050612d11565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a1a612d50565b6040518082815260200191505060405180910390f35b610a7260048036036020811015610a4657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d56565b6040518082815260200191505060405180910390f35b610aca60048036036020811015610a9e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d6e565b60405180821515815260200191505060405180910390f35b610b2460048036036020811015610af857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d8e565b60405180821515815260200191505060405180910390f35b610b7e60048036036020811015610b5257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612dae565b6040518082815260200191505060405180910390f35b610bc060048036036020811015610baa57600080fd5b8101908080359060200190929190505050612dc6565b005b610c0460048036036020811015610bd857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061306e565b6040518082815260200191505060405180910390f35b610c22613086565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610c7a60048036036020811015610c6457600080fd5b81019080803590602001909291905050506130aa565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ce860048036036020811015610cbc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130e9565b6040518082815260200191505060405180910390f35b610d4060048036036020811015610d1457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613101565b6040518082815260200191505060405180910390f35b610d8260048036036020811015610d6c57600080fd5b8101908080359060200190929190505050613119565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610db6613158565b6040518082815260200191505060405180910390f35b610e1860048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061317c565b6040518082815260200191505060405180910390f35b610e7a60048036036040811015610e4457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061348d565b005b610ebe60048036036020811015610e9257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506137b2565b60405180821515815260200191505060405180910390f35b610ede6137d2565b6040518082815260200191505060405180910390f35b610f4360048036036040811015610f0a57600080fd5b81019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506137d8565b60405180821515815260200191505060405180910390f35b610f9d60048036036020811015610f7157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f25565b60405180821515815260200191505060405180910390f35b610ff760048036036020811015610fcb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f45565b60405180821515815260200191505060405180910390f35b6110516004803603602081101561102557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f65565b005b6110956004803603602081101561106957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614157565b6040518082815260200191505060405180910390f35b61111a600480360360608110156110c157600080fd5b81019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061416f565b60405180821515815260200191505060405180910390f35b61113a6152d8565b6040518082815260200191505060405180910390f35b61117c6004803603602081101561116657600080fd5b81019080803590602001909291905050506152de565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6111ea600480360360208110156111be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061531d565b6040518082815260200191505060405180910390f35b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f74206163636570746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b60011515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000611391828461317c565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379cc679033836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561142457600080fd5b505af1158015611438573d6000803e3d6000fd5b505050506114518160205461533590919063ffffffff16565b6020819055506020547f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a26114b133848473ffffffffffffffffffffffffffffffffffffffff166153b89092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb8483604051808381526020018281526020019250505060405180910390a2505050565b6011818154811061151c57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806115ee5750600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f74206163636570746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b61168d3330878773ffffffffffffffffffffffffffffffffffffffff1661545a909392919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117a357600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661179e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b611863565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b600061186f858761317c565b905082156118c65761188c8160205461551b90919063ffffffff16565b6020819055506020547f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a2611a25565b6118d9848261533590919063ffffffff16565b91507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1933846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561196c57600080fd5b505af1158015611980573d6000803e3d6000fd5b505050506119998160205461551b90919063ffffffff16565b6020819055506020547f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a28473ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a158783604051808381526020018281526020019250505060405180910390a25b50949350505050565b601a6020528060005260406000206000915090505481565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b5c57601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b611c1c565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b6000611c28838361317c565b9050611c32611d6f565b811115611ca7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f496e73756666696369656e74207265736572766573000000000000000000000081525060200191505060405180910390fd5b611cbc8160205461533590919063ffffffff16565b6020819055506020547f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a2611d1c33838573ffffffffffffffffffffffffffffffffffffffff166153b89092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff167f2bb2640731848fe9820ba48dbc978c1fc9bbd5f11b948bfab05b7dee3378fd80836040518082815260200191505060405180910390a2505050565b6000611e3a611e296021547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611de057600080fd5b505afa158015611df4573d6000803e3d6000fd5b505050506040513d6020811015611e0a57600080fd5b810190808051906020019092919050505061533590919063ffffffff16565b60205461533590919063ffffffff16565b905090565b60056020528060005260406000206000915054906101000a900460ff1681565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f74206163636570746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000611fe9828461317c565b90506000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561207657600080fd5b505afa15801561208a573d6000803e3d6000fd5b505050506040513d60208110156120a057600080fd5b810190808051906020019092919050505090506000612107601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361533590919063ffffffff16565b90508083111561217f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f457863656564732064656274206c696d6974000000000000000000000000000081525060200191505060405180910390fd5b6121d183601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461551b90919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122298360215461551b90919063ffffffff16565b6021819055506122448360205461533590919063ffffffff16565b6020819055506020547f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156122ea57600080fd5b505af11580156122fe573d6000803e3d6000fd5b505050506040513d602081101561231457600080fd5b8101908080519060200190929190505050508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7e1a939bed137a819b5d2979822c67f877689f7a863d5e4cb57cdca97b2977d68786604051808381526020018281526020019250505060405180910390a35050505050565b60106020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6123d56155a3565b73ffffffffffffffffffffffffffffffffffffffff166123f3612cd0565b73ffffffffffffffffffffffffffffffffffffffff161461247c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600080600090505b6001805490508110156125cb576125bc6125ad600183815481106124a457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600184815481106124dc57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561256d57600080fd5b505afa158015612581573d6000803e3d6000fd5b505050506040513d602081101561259757600080fd5b810190808051906020019092919050505061317c565b8361551b90919063ffffffff16565b91508080600101915050612484565b5060005b600a80549050811015612716576127076126f8600a83815481106125ef57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a848154811061262757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156126b857600080fd5b505afa1580156126cc573d6000803e3d6000fd5b505050506040513d60208110156126e257600080fd5b810190808051906020019092919050505061317c565b8361551b90919063ffffffff16565b915080806001019150506125cf565b5080602081905550807f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a2807fec691f09f6924b27932253f85caf99bacc30360cc0e50a1cc4d2acc24601446660405160405180910390a250565b6007818154811061278b57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601c6020528060005260406000206000915054906101000a900460ff1681565b60026020528060005260406000206000915054906101000a900460ff1681565b601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b6128c1611d6f565b811115612936576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f496e73756666696369656e74207265736572766573000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156129c757600080fd5b505af11580156129db573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ffa8ccab40e7da8146c2304cd0950334fd30a6ba093abe86261aa13911fed849c836040518082815260200191505060405180910390a35050565b60048181548110612a5857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60148181548110612abd57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612af46155a3565b73ffffffffffffffffffffffffffffffffffffffff16612b12612cd0565b73ffffffffffffffffffffffffffffffffffffffff1614612b9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60036020528060005260406000206000915090505481565b60178181548110612c8157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60086020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c6020528060005260406000206000915090505481565b600d8181548110612d2157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60205481565b60066020528060005260406000206000915090505481565b600e6020528060005260406000206000915054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60166020528060005260406000206000915090505481565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379cc679033836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015612f1657600080fd5b505af1158015612f2a573d6000803e3d6000fd5b50505050612f8081601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461533590919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612fd88160215461533590919063ffffffff16565b6021819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f3098384604051808381526020018281526020019250505060405180910390a350565b60136020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b601b81815481106130ba57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915090505481565b60196020528060005260406000206000915090505481565b6001818154811061312957600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613328576133218373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561321957600080fd5b505afa15801561322d573d6000803e3d6000fd5b505050506040513d602081101561324357600080fd5b810190808051906020019092919050505060ff16600a0a6133137f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156132c357600080fd5b505afa1580156132d7573d6000803e3d6000fd5b505050506040513d60208110156132ed57600080fd5b810190808051906020019092919050505060ff16600a0a856155ab90919063ffffffff16565b61563190919063ffffffff16565b9050613487565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561348657601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634249719f84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561344857600080fd5b505afa15801561345c573d6000803e3d6000fd5b505050506040513d602081101561347257600080fd5b810190808051906020019092919050505090505b5b92915050565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661354c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661360b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f74206163636570746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b6136383330848473ffffffffffffffffffffffffffffffffffffffff1661545a909392919063ffffffff16565b6000613644828461317c565b905061369881601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461533590919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136f08160215461533590919063ffffffff16565b60218190555061370b8160205461551b90919063ffffffff16565b6020819055506020547f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a28173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f3098584604051808381526020018281526020019250505060405180910390a3505050565b60156020528060005260406000206000915054906101000a900460ff1681565b601f5481565b60006137e26155a3565b73ffffffffffffffffffffffffffffffffffffffff16613800612cd0565b73ffffffffffffffffffffffffffffffffffffffff1614613889576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138c357600080fd5b600060098111156138d057fe5b8360098111156138dc57fe5b141561395d576139157f00000000000000000000000000000000000000000000000000000000000000004361551b90919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ec1565b6001600981111561396a57fe5b83600981111561397657fe5b14156139f7576139af7f00000000000000000000000000000000000000000000000000000000000000004361551b90919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ec0565b60026009811115613a0457fe5b836009811115613a1057fe5b1415613a9157613a497f00000000000000000000000000000000000000000000000000000000000000004361551b90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ebf565b60036009811115613a9e57fe5b836009811115613aaa57fe5b1415613b3e57613af6613ae760027f00000000000000000000000000000000000000000000000000000000000000006155ab90919063ffffffff16565b4361551b90919063ffffffff16565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ebe565b60046009811115613b4b57fe5b836009811115613b5757fe5b1415613bd857613b907f00000000000000000000000000000000000000000000000000000000000000004361551b90919063ffffffff16565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ebd565b60056009811115613be557fe5b836009811115613bf157fe5b1415613c7257613c2a7f00000000000000000000000000000000000000000000000000000000000000004361551b90919063ffffffff16565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ebc565b60066009811115613c7f57fe5b836009811115613c8b57fe5b1415613d1f57613cd7613cc860027f00000000000000000000000000000000000000000000000000000000000000006155ab90919063ffffffff16565b4361551b90919063ffffffff16565b601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ebb565b60076009811115613d2c57fe5b836009811115613d3857fe5b1415613db957613d717f00000000000000000000000000000000000000000000000000000000000000004361551b90919063ffffffff16565b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613eba565b60086009811115613dc657fe5b836009811115613dd257fe5b1415613e5357613e0b7f00000000000000000000000000000000000000000000000000000000000000004361551b90919063ffffffff16565b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613eb9565b600980811115613e5f57fe5b836009811115613e6b57fe5b1415613eaf57613ea47f00000000000000000000000000000000000000000000000000000000000000004361551b90919063ffffffff16565b601f81905550613eb8565b60009050613f1f565b5b5b5b5b5b5b5b5b5b826009811115613ecd57fe5b7f0e4f2c4b5bc209d509bc3d49348c787fefadc66a79351b470599ac0f5be52eaf83604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a2600190505b92915050565b60126020528060005260406000206000915054906101000a900460ff1681565b60186020528060005260406000206000915054906101000a900460ff1681565b613f6d6155a3565b73ffffffffffffffffffffffffffffffffffffffff16613f8b612cd0565b73ffffffffffffffffffffffffffffffffffffffff1614614014576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561409a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615cbb6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601d6020528060005260406000206000915090505481565b60006141796155a3565b73ffffffffffffffffffffffffffffffffffffffff16614197612cd0565b73ffffffffffffffffffffffffffffffffffffffff1614614220576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561425a57600080fd5b600080600981111561426857fe5b85600981111561427457fe5b14156143f15761428760066005866156ba565b15614345576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142dc60048561588a565b614344576004849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615268565b600160098111156143fe57fe5b85600981111561440a57fe5b14156145875761441d60096008866156ba565b156144db576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061447260078561588a565b6144da576007849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615267565b6002600981111561459457fe5b8560098111156145a057fe5b141561471d576145b360036002866156ba565b15614671576000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061460860018561588a565b614670576001849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615266565b6003600981111561472a57fe5b85600981111561473657fe5b14156149165761474960136012866156ba565b1561486a576011849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061480160118561588a565b614869576011849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615265565b6004600981111561492357fe5b85600981111561492f57fe5b1415614b0f57614942600f600e866156ba565b15614a6357600d849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506149fa600d8561588a565b614a6257600d849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615264565b60056009811115614b1c57fe5b856009811115614b2857fe5b1415614d2357614b3b600c600b866156ba565b15614bf9576000600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614b90600a8561588a565b614bf857600a849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550615263565b60066009811115614d3057fe5b856009811115614d3c57fe5b1415614eb957614d4f60166015866156ba565b15614e0d576000601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614da460148561588a565b614e0c576014849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b601560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615262565b60076009811115614ec657fe5b856009811115614ed257fe5b141561504f57614ee560196018866156ba565b15614fa3576000601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614f3a60178561588a565b614fa2576017849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615261565b6008600981111561505c57fe5b85600981111561506857fe5b14156151e55761507b601d601c866156ba565b15615139576000601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506150d0601b8561588a565b61513857601b849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615260565b6009808111156151f157fe5b8560098111156151fd57fe5b1415615255576000601f8190555083601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905061525f565b60009150506152d1565b5b5b5b5b5b5b5b5b5b84600981111561527457fe5b7f0dcacb7e392f3d6a216ed2660e3dcfd40b7793d33591db2ba185a6b8e44fc4778583604051808373ffffffffffffffffffffffffffffffffffffffff16815260200182151581526020019250505060405180910390a260019150505b9392505050565b60215481565b600a81815481106152ee57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f6020528060005260406000206000915090505481565b6000828211156153ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b6154558363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061592b565b505050565b615515846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061592b565b50505050565b600080828401905083811015615599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b6000808314156155be576000905061562b565b60008284029050828482816155cf57fe5b0414615626576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615d076021913960400191505060405180910390fd5b809150505b92915050565b60008082116156a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b8183816156b157fe5b04905092915050565b60008260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661587e5760008460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156157c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4d7573742071756575650000000000000000000000000000000000000000000081525060200191505060405180910390fd5b438460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115615875576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f5175657565206e6f74206578706972656400000000000000000000000000000081525060200191505060405180910390fd5b60019050615883565b600090505b9392505050565b600080600090505b838054905081101561591f578273ffffffffffffffffffffffffffffffffffffffff168482815481106158c157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415615912576001915050615925565b8080600101915050615892565b50600090505b92915050565b606061598d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615a1a9092919063ffffffff16565b9050600081511115615a15578080602001905160208110156159ae57600080fd5b8101908080519060200190929190505050615a14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d28602a913960400191505060405180910390fd5b5b505050565b6060615a298484600085615a32565b90509392505050565b606082471015615a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615ce16026913960400191505060405180910390fd5b615a9685615bdb565b615b08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310615b585780518252602082019150602081019050602083039250615b35565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615bba576040519150601f19603f3d011682016040523d82523d6000602084013e615bbf565b606091505b5091509150615bcf828286615bee565b92505050949350505050565b600080823b905060008111915050919050565b60608315615bfe57829050615cb3565b600083511115615c115782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615c78578082015181840152602081019050615c5d565b50505050905090810190601f168015615ca55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212209cdd9ab1828dc11bb790a9125b237f9e0c0077c55e684e1f7af184b729dc75a264736f6c63430007050033000000000000000000000000a48d2070472ad4d872d2f5d5893488c763424e09000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8990000000000000000000000000000000000000000000000000000000000001770
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102d55760003560e01c8063932cc8c311610182578063d1b317e5116100e9578063ee4e19a1116100a2578063fbfd393b1161007c578063fbfd393b146110ab578063fc7b9c1814611132578063fd1ec01014611150578063fff9ee87146111a8576102d5565b8063ee4e19a114610fb5578063f2fde38b1461100f578063fb93958814611053576102d5565b8063d1b317e514610dcc578063d796ffb814610e2e578063df89b34414610e7c578063e39e861814610ed6578063e83afee314610ef4578063ebd83cd814610f5b576102d5565b8063b5a527e01161013b578063b5a527e014610c1a578063b5b1d56014610c4e578063c24ad43e14610ca6578063cd85641a14610cfe578063d031370b14610d56578063d07f390f14610dae576102d5565b8063932cc8c314610a30578063a1210a2d14610a88578063a569e57114610ae2578063ab319c9a14610b3c578063b02a660914610b94578063b1bd38b014610bc2576102d5565b806368c31dd511610241578063788c6c01116101fa5780638da5cb5b116101d45780638da5cb5b1461092e5780638f59c727146109625780638f6a7b57146109ba5780638f840ddd14610a12576102d5565b8063788c6c0114610824578063869871bf1461087c57806387d67dff146108d4576102d5565b806368c31dd51461068e5780636a20de92146106e85780636b5e40a7146107365780636cd093111461078e57806370a0502a146107c2578063715018a61461081a576102d5565b8063124154ca11610293578063124154ca146104bc57806312422d23146105165780631af4da70146105645780632b7ce500146105d2578063437f7912146105dc5780634e83423c14610634576102d5565b8062f714ce146102da5780630619aff11461032857806306aaa1c814610380578063094a8651146103f85780630b0eee30146104505780630c3513a81461049e575b600080fd5b610326600480360360408110156102f057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611200565b005b6103546004803603602081101561033e57600080fd5b810190808035906020019092919050505061150c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e26004803603608081101561039657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080351515906020019092919050505061154b565b6040518082815260200191505060405180910390f35b61043a6004803603602081101561040e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a2e565b6040518082815260200191505060405180910390f35b61049c6004803603604081101561046657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a46565b005b6104a6611d6f565b6040518082815260200191505060405180910390f35b6104fe600480360360208110156104d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e3f565b60405180821515815260200191505060405180910390f35b6105626004803603604081101561052c57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e5f565b005b6105a66004803603602081101561057a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061239a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105da6123cd565b005b610608600480360360208110156105f257600080fd5b810190808035906020019092919050505061277b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106766004803603602081101561064a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127ba565b60405180821515815260200191505060405180910390f35b6106d0600480360360208110156106a457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127da565b60405180821515815260200191505060405180910390f35b610734600480360360408110156106fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127fa565b005b6107626004803603602081101561074c57600080fd5b8101908080359060200190929190505050612a48565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610796612a87565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107ee600480360360208110156107d857600080fd5b8101908080359060200190929190505050612aad565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610822612aec565b005b6108666004803603602081101561083a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c59565b6040518082815260200191505060405180910390f35b6108a86004803603602081101561089257600080fd5b8101908080359060200190929190505050612c71565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610916600480360360208110156108ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cb0565b60405180821515815260200191505060405180910390f35b610936612cd0565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a46004803603602081101561097857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cf9565b6040518082815260200191505060405180910390f35b6109e6600480360360208110156109d057600080fd5b8101908080359060200190929190505050612d11565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a1a612d50565b6040518082815260200191505060405180910390f35b610a7260048036036020811015610a4657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d56565b6040518082815260200191505060405180910390f35b610aca60048036036020811015610a9e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d6e565b60405180821515815260200191505060405180910390f35b610b2460048036036020811015610af857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d8e565b60405180821515815260200191505060405180910390f35b610b7e60048036036020811015610b5257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612dae565b6040518082815260200191505060405180910390f35b610bc060048036036020811015610baa57600080fd5b8101908080359060200190929190505050612dc6565b005b610c0460048036036020811015610bd857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061306e565b6040518082815260200191505060405180910390f35b610c22613086565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610c7a60048036036020811015610c6457600080fd5b81019080803590602001909291905050506130aa565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ce860048036036020811015610cbc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130e9565b6040518082815260200191505060405180910390f35b610d4060048036036020811015610d1457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613101565b6040518082815260200191505060405180910390f35b610d8260048036036020811015610d6c57600080fd5b8101908080359060200190929190505050613119565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610db6613158565b6040518082815260200191505060405180910390f35b610e1860048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061317c565b6040518082815260200191505060405180910390f35b610e7a60048036036040811015610e4457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061348d565b005b610ebe60048036036020811015610e9257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506137b2565b60405180821515815260200191505060405180910390f35b610ede6137d2565b6040518082815260200191505060405180910390f35b610f4360048036036040811015610f0a57600080fd5b81019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506137d8565b60405180821515815260200191505060405180910390f35b610f9d60048036036020811015610f7157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f25565b60405180821515815260200191505060405180910390f35b610ff760048036036020811015610fcb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f45565b60405180821515815260200191505060405180910390f35b6110516004803603602081101561102557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f65565b005b6110956004803603602081101561106957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614157565b6040518082815260200191505060405180910390f35b61111a600480360360608110156110c157600080fd5b81019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061416f565b60405180821515815260200191505060405180910390f35b61113a6152d8565b6040518082815260200191505060405180910390f35b61117c6004803603602081101561116657600080fd5b81019080803590602001909291905050506152de565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6111ea600480360360208110156111be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061531d565b6040518082815260200191505060405180910390f35b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f74206163636570746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b60011515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000611391828461317c565b90507f000000000000000000000000a48d2070472ad4d872d2f5d5893488c763424e0973ffffffffffffffffffffffffffffffffffffffff166379cc679033836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561142457600080fd5b505af1158015611438573d6000803e3d6000fd5b505050506114518160205461533590919063ffffffff16565b6020819055506020547f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a26114b133848473ffffffffffffffffffffffffffffffffffffffff166153b89092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb8483604051808381526020018281526020019250505060405180910390a2505050565b6011818154811061151c57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806115ee5750600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f74206163636570746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b61168d3330878773ffffffffffffffffffffffffffffffffffffffff1661545a909392919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117a357600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661179e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b611863565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b600061186f858761317c565b905082156118c65761188c8160205461551b90919063ffffffff16565b6020819055506020547f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a2611a25565b6118d9848261533590919063ffffffff16565b91507f000000000000000000000000a48d2070472ad4d872d2f5d5893488c763424e0973ffffffffffffffffffffffffffffffffffffffff166340c10f1933846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561196c57600080fd5b505af1158015611980573d6000803e3d6000fd5b505050506119998160205461551b90919063ffffffff16565b6020819055506020547f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a28473ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a158783604051808381526020018281526020019250505060405180910390a25b50949350505050565b601a6020528060005260406000206000915090505481565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b5c57601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b611c1c565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b6000611c28838361317c565b9050611c32611d6f565b811115611ca7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f496e73756666696369656e74207265736572766573000000000000000000000081525060200191505060405180910390fd5b611cbc8160205461533590919063ffffffff16565b6020819055506020547f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a2611d1c33838573ffffffffffffffffffffffffffffffffffffffff166153b89092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff167f2bb2640731848fe9820ba48dbc978c1fc9bbd5f11b948bfab05b7dee3378fd80836040518082815260200191505060405180910390a2505050565b6000611e3a611e296021547f000000000000000000000000a48d2070472ad4d872d2f5d5893488c763424e0973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611de057600080fd5b505afa158015611df4573d6000803e3d6000fd5b505050506040513d6020811015611e0a57600080fd5b810190808051906020019092919050505061533590919063ffffffff16565b60205461533590919063ffffffff16565b905090565b60056020528060005260406000206000915054906101000a900460ff1681565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f74206163636570746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000611fe9828461317c565b90506000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561207657600080fd5b505afa15801561208a573d6000803e3d6000fd5b505050506040513d60208110156120a057600080fd5b810190808051906020019092919050505090506000612107601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361533590919063ffffffff16565b90508083111561217f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f457863656564732064656274206c696d6974000000000000000000000000000081525060200191505060405180910390fd5b6121d183601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461551b90919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122298360215461551b90919063ffffffff16565b6021819055506122448360205461533590919063ffffffff16565b6020819055506020547f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156122ea57600080fd5b505af11580156122fe573d6000803e3d6000fd5b505050506040513d602081101561231457600080fd5b8101908080519060200190929190505050508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7e1a939bed137a819b5d2979822c67f877689f7a863d5e4cb57cdca97b2977d68786604051808381526020018281526020019250505060405180910390a35050505050565b60106020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6123d56155a3565b73ffffffffffffffffffffffffffffffffffffffff166123f3612cd0565b73ffffffffffffffffffffffffffffffffffffffff161461247c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600080600090505b6001805490508110156125cb576125bc6125ad600183815481106124a457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600184815481106124dc57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561256d57600080fd5b505afa158015612581573d6000803e3d6000fd5b505050506040513d602081101561259757600080fd5b810190808051906020019092919050505061317c565b8361551b90919063ffffffff16565b91508080600101915050612484565b5060005b600a80549050811015612716576127076126f8600a83815481106125ef57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a848154811061262757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156126b857600080fd5b505afa1580156126cc573d6000803e3d6000fd5b505050506040513d60208110156126e257600080fd5b810190808051906020019092919050505061317c565b8361551b90919063ffffffff16565b915080806001019150506125cf565b5080602081905550807f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a2807fec691f09f6924b27932253f85caf99bacc30360cc0e50a1cc4d2acc24601446660405160405180910390a250565b6007818154811061278b57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601c6020528060005260406000206000915054906101000a900460ff1681565b60026020528060005260406000206000915054906101000a900460ff1681565b601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b6128c1611d6f565b811115612936576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f496e73756666696369656e74207265736572766573000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000a48d2070472ad4d872d2f5d5893488c763424e0973ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156129c757600080fd5b505af11580156129db573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ffa8ccab40e7da8146c2304cd0950334fd30a6ba093abe86261aa13911fed849c836040518082815260200191505060405180910390a35050565b60048181548110612a5857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60148181548110612abd57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612af46155a3565b73ffffffffffffffffffffffffffffffffffffffff16612b12612cd0565b73ffffffffffffffffffffffffffffffffffffffff1614612b9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60036020528060005260406000206000915090505481565b60178181548110612c8157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60086020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c6020528060005260406000206000915090505481565b600d8181548110612d2157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60205481565b60066020528060005260406000206000915090505481565b600e6020528060005260406000206000915054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60166020528060005260406000206000915090505481565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000a48d2070472ad4d872d2f5d5893488c763424e0973ffffffffffffffffffffffffffffffffffffffff166379cc679033836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015612f1657600080fd5b505af1158015612f2a573d6000803e3d6000fd5b50505050612f8081601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461533590919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612fd88160215461533590919063ffffffff16565b6021819055507f000000000000000000000000a48d2070472ad4d872d2f5d5893488c763424e0973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f3098384604051808381526020018281526020019250505060405180910390a350565b60136020528060005260406000206000915090505481565b7f000000000000000000000000a48d2070472ad4d872d2f5d5893488c763424e0981565b601b81815481106130ba57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915090505481565b60196020528060005260406000206000915090505481565b6001818154811061312957600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000177081565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613328576133218373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561321957600080fd5b505afa15801561322d573d6000803e3d6000fd5b505050506040513d602081101561324357600080fd5b810190808051906020019092919050505060ff16600a0a6133137f000000000000000000000000a48d2070472ad4d872d2f5d5893488c763424e0973ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156132c357600080fd5b505afa1580156132d7573d6000803e3d6000fd5b505050506040513d60208110156132ed57600080fd5b810190808051906020019092919050505060ff16600a0a856155ab90919063ffffffff16565b61563190919063ffffffff16565b9050613487565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561348657601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634249719f84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561344857600080fd5b505afa15801561345c573d6000803e3d6000fd5b505050506040513d602081101561347257600080fd5b810190808051906020019092919050505090505b5b92915050565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661354c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420617070726f766564000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661360b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f74206163636570746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b6136383330848473ffffffffffffffffffffffffffffffffffffffff1661545a909392919063ffffffff16565b6000613644828461317c565b905061369881601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461533590919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136f08160215461533590919063ffffffff16565b60218190555061370b8160205461551b90919063ffffffff16565b6020819055506020547f93bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d6660405160405180910390a28173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f3098584604051808381526020018281526020019250505060405180910390a3505050565b60156020528060005260406000206000915054906101000a900460ff1681565b601f5481565b60006137e26155a3565b73ffffffffffffffffffffffffffffffffffffffff16613800612cd0565b73ffffffffffffffffffffffffffffffffffffffff1614613889576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138c357600080fd5b600060098111156138d057fe5b8360098111156138dc57fe5b141561395d576139157f00000000000000000000000000000000000000000000000000000000000017704361551b90919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ec1565b6001600981111561396a57fe5b83600981111561397657fe5b14156139f7576139af7f00000000000000000000000000000000000000000000000000000000000017704361551b90919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ec0565b60026009811115613a0457fe5b836009811115613a1057fe5b1415613a9157613a497f00000000000000000000000000000000000000000000000000000000000017704361551b90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ebf565b60036009811115613a9e57fe5b836009811115613aaa57fe5b1415613b3e57613af6613ae760027f00000000000000000000000000000000000000000000000000000000000017706155ab90919063ffffffff16565b4361551b90919063ffffffff16565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ebe565b60046009811115613b4b57fe5b836009811115613b5757fe5b1415613bd857613b907f00000000000000000000000000000000000000000000000000000000000017704361551b90919063ffffffff16565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ebd565b60056009811115613be557fe5b836009811115613bf157fe5b1415613c7257613c2a7f00000000000000000000000000000000000000000000000000000000000017704361551b90919063ffffffff16565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ebc565b60066009811115613c7f57fe5b836009811115613c8b57fe5b1415613d1f57613cd7613cc860027f00000000000000000000000000000000000000000000000000000000000017706155ab90919063ffffffff16565b4361551b90919063ffffffff16565b601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ebb565b60076009811115613d2c57fe5b836009811115613d3857fe5b1415613db957613d717f00000000000000000000000000000000000000000000000000000000000017704361551b90919063ffffffff16565b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613eba565b60086009811115613dc657fe5b836009811115613dd257fe5b1415613e5357613e0b7f00000000000000000000000000000000000000000000000000000000000017704361551b90919063ffffffff16565b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613eb9565b600980811115613e5f57fe5b836009811115613e6b57fe5b1415613eaf57613ea47f00000000000000000000000000000000000000000000000000000000000017704361551b90919063ffffffff16565b601f81905550613eb8565b60009050613f1f565b5b5b5b5b5b5b5b5b5b826009811115613ecd57fe5b7f0e4f2c4b5bc209d509bc3d49348c787fefadc66a79351b470599ac0f5be52eaf83604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a2600190505b92915050565b60126020528060005260406000206000915054906101000a900460ff1681565b60186020528060005260406000206000915054906101000a900460ff1681565b613f6d6155a3565b73ffffffffffffffffffffffffffffffffffffffff16613f8b612cd0565b73ffffffffffffffffffffffffffffffffffffffff1614614014576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561409a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615cbb6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601d6020528060005260406000206000915090505481565b60006141796155a3565b73ffffffffffffffffffffffffffffffffffffffff16614197612cd0565b73ffffffffffffffffffffffffffffffffffffffff1614614220576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561425a57600080fd5b600080600981111561426857fe5b85600981111561427457fe5b14156143f15761428760066005866156ba565b15614345576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142dc60048561588a565b614344576004849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615268565b600160098111156143fe57fe5b85600981111561440a57fe5b14156145875761441d60096008866156ba565b156144db576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061447260078561588a565b6144da576007849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615267565b6002600981111561459457fe5b8560098111156145a057fe5b141561471d576145b360036002866156ba565b15614671576000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061460860018561588a565b614670576001849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615266565b6003600981111561472a57fe5b85600981111561473657fe5b14156149165761474960136012866156ba565b1561486a576011849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061480160118561588a565b614869576011849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615265565b6004600981111561492357fe5b85600981111561492f57fe5b1415614b0f57614942600f600e866156ba565b15614a6357600d849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506149fa600d8561588a565b614a6257600d849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615264565b60056009811115614b1c57fe5b856009811115614b2857fe5b1415614d2357614b3b600c600b866156ba565b15614bf9576000600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614b90600a8561588a565b614bf857600a849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550615263565b60066009811115614d3057fe5b856009811115614d3c57fe5b1415614eb957614d4f60166015866156ba565b15614e0d576000601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614da460148561588a565b614e0c576014849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b601560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615262565b60076009811115614ec657fe5b856009811115614ed257fe5b141561504f57614ee560196018866156ba565b15614fa3576000601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614f3a60178561588a565b614fa2576017849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615261565b6008600981111561505c57fe5b85600981111561506857fe5b14156151e55761507b601d601c866156ba565b15615139576000601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506150d0601b8561588a565b61513857601b849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615905080601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550615260565b6009808111156151f157fe5b8560098111156151fd57fe5b1415615255576000601f8190555083601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905061525f565b60009150506152d1565b5b5b5b5b5b5b5b5b5b84600981111561527457fe5b7f0dcacb7e392f3d6a216ed2660e3dcfd40b7793d33591db2ba185a6b8e44fc4778583604051808373ffffffffffffffffffffffffffffffffffffffff16815260200182151581526020019250505060405180910390a260019150505b9392505050565b60215481565b600a81815481106152ee57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f6020528060005260406000206000915090505481565b6000828211156153ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b6154558363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061592b565b505050565b615515846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061592b565b50505050565b600080828401905083811015615599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b6000808314156155be576000905061562b565b60008284029050828482816155cf57fe5b0414615626576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615d076021913960400191505060405180910390fd5b809150505b92915050565b60008082116156a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b8183816156b157fe5b04905092915050565b60008260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661587e5760008460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156157c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4d7573742071756575650000000000000000000000000000000000000000000081525060200191505060405180910390fd5b438460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115615875576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f5175657565206e6f74206578706972656400000000000000000000000000000081525060200191505060405180910390fd5b60019050615883565b600090505b9392505050565b600080600090505b838054905081101561591f578273ffffffffffffffffffffffffffffffffffffffff168482815481106158c157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415615912576001915050615925565b8080600101915050615892565b50600090505b92915050565b606061598d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615a1a9092919063ffffffff16565b9050600081511115615a15578080602001905160208110156159ae57600080fd5b8101908080519060200190929190505050615a14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d28602a913960400191505060405180910390fd5b5b505050565b6060615a298484600085615a32565b90509392505050565b606082471015615a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615ce16026913960400191505060405180910390fd5b615a9685615bdb565b615b08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310615b585780518252602082019150602081019050602083039250615b35565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615bba576040519150601f19603f3d011682016040523d82523d6000602084013e615bbf565b606091505b5091509150615bcf828286615bee565b92505050949350505050565b600080823b905060008111915050919050565b60608315615bfe57829050615cb3565b600083511115615c115782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615c78578082015181840152602081019050615c5d565b50505050905090810190601f168015615ca55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212209cdd9ab1828dc11bb790a9125b237f9e0c0077c55e684e1f7af184b729dc75a264736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a48d2070472ad4d872d2f5d5893488c763424e09000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8990000000000000000000000000000000000000000000000000000000000001770
-----Decoded View---------------
Arg [0] : _HADES (address): 0xA48D2070472aD4d872d2F5D5893488c763424e09
Arg [1] : _OHM (address): 0x383518188C0C6d7730D91b2c03a03C837814a899
Arg [2] : _blocksNeededForQueue (uint256): 6000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000a48d2070472ad4d872d2f5d5893488c763424e09
Arg [1] : 000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001770
Deployed Bytecode Sourcemap
69510:18309:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75061:548;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72032:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;73723:1189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;72723:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;77894:562;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;78962:137;;;:::i;:::-;;;;;;;;;;;;;;;;;;;71084:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;75750:780;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;71937:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;79248:646;;;:::i;:::-;;71232:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;72870:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;70849:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;78533:325;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70989:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;73012:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;72269:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32730:148;;;:::i;:::-;;70900:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;72512:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;71325:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32079:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;71597:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;71688:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;73106:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;71139:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;71785:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;71544:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;72419:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;77396:357;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72178:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;70689:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;72778:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;71378:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;72642:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;70776:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;70724:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;80055:476;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;76693:574;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72364:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;73038:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;80703:1739;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;72125:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;72597:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33033:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72922:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;82648:4118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;73172:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;71469:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;71842:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;75061:548;75136:14;:22;75151:6;75136:22;;;;;;;;;;;;;;;;;;;;;;;;;75128:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75267:4;75235:36;;:16;:28;75252:10;75235:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;75227:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75297:13;75313:29;75326:6;75334:7;75313:12;:29::i;:::-;75297:45;;75373:5;75349:39;;;75389:10;75401:5;75349:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75432:24;75450:5;75432:13;;:17;;:24;;;;:::i;:::-;75416:13;:40;;;;75484:13;;75468:30;;;;;;;;;;75507:48;75535:10;75547:7;75514:6;75507:27;;;;:48;;;;;:::i;:::-;75580:6;75569:34;;;75588:7;75597:5;75569:34;;;;;;;;;;;;;;;;;;;;;;;;75061:548;;;:::o;72032:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73723:1189::-;73853:13;73883:14;:22;73898:6;73883:22;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;73909:16;:24;73926:6;73909:24;;;;;;;;;;;;;;;;;;;;;;;;;73883:50;73875:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73957:67;73989:10;74009:4;74016:7;73964:6;73957:31;;;;:67;;;;;;:::i;:::-;74037:14;:22;74052:6;74037:22;;;;;;;;;;;;;;;;;;;;;;;;;74033:180;;;74078:18;:30;74097:10;74078:30;;;;;;;;;;;;;;;;;;;;;;;;;74070:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74033:180;;;74156:20;:32;74177:10;74156:32;;;;;;;;;;;;;;;;;;;;;;;;;74148:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74033:180;74219:13;74235:29;74248:6;74256:7;74235:12;:29::i;:::-;74219:45;;74464:13;74460:447;;;74504:24;74522:5;74504:13;;:17;;:24;;;;:::i;:::-;74488:13;:40;;;;74558:13;;74542:30;;;;;;;;;;74460:447;;;74676:18;74686:7;74676:5;:9;;:18;;;;:::i;:::-;74668:26;;74727:5;74703:35;;;74739:10;74751:5;74703:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74784:24;74802:5;74784:13;;:17;;:24;;;;:::i;:::-;74768:13;:40;;;;74838:13;;74822:30;;;;;;;;;;74876:6;74868:31;;;74884:7;74893:5;74868:31;;;;;;;;;;;;;;;;;;;;;;;;74460:447;73723:1189;;;;;;;:::o;72723:48::-;;;;;;;;;;;;;;;;;:::o;77894:562::-;77963:16;:24;77980:6;77963:24;;;;;;;;;;;;;;;;;;;;;;;;;77959:178;;;78006:18;:30;78025:10;78006:30;;;;;;;;;;;;;;;;;;;;;;;;;77998:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77959:178;;;78084:16;:28;78101:10;78084:28;;;;;;;;;;;;;;;;;;;;;;;;;78076:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77959:178;78145:13;78161:29;78174:6;78182:7;78161:12;:29::i;:::-;78145:45;;78214:16;:14;:16::i;:::-;78205:5;:25;;78197:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78281:24;78299:5;78281:13;;:17;;:24;;;;:::i;:::-;78265:13;:40;;;;78333:13;;78317:30;;;;;;;;;;78356:48;78384:10;78396:7;78363:6;78356:27;;;;:48;;;;;:::i;:::-;78434:6;78418:32;;;78442:7;78418:32;;;;;;;;;;;;;;;;;;77894:562;;;:::o;78962:137::-;79009:7;79032:61;79050:42;79082:9;;79057:5;79050:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;:42;;;;:::i;:::-;79032:13;;:17;;:61;;;;:::i;:::-;79025:68;;78962:137;:::o;71084:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;75750:780::-;75826:8;:20;75835:10;75826:20;;;;;;;;;;;;;;;;;;;;;;;;;75818:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75878:14;:22;75893:6;75878:22;;;;;;;;;;;;;;;;;;;;;;;;;75870:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75926:13;75942:29;75955:6;75963:7;75942:12;:29::i;:::-;75926:45;;75980:19;76009:6;;;;;;;;;;;76002:24;;;76027:10;76002:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75980:58;;76084:21;76108:42;76124:13;:25;76138:10;76124:25;;;;;;;;;;;;;;;;76108:11;:15;;:42;;;;:::i;:::-;76084:66;;76174:13;76165:5;:22;;76157:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76247:36;76277:5;76247:13;:25;76261:10;76247:25;;;;;;;;;;;;;;;;:29;;:36;;;;:::i;:::-;76219:13;:25;76233:10;76219:25;;;;;;;;;;;;;;;:64;;;;76302:20;76316:5;76302:9;;:13;;:20;;;;:::i;:::-;76290:9;:32;;;;76347:24;76365:5;76347:13;;:17;;:24;;;;:::i;:::-;76331:13;:40;;;;76399:13;;76383:30;;;;;;;;;;76429:6;76422:23;;;76446:10;76458:7;76422:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76501:6;76478:46;;76489:10;76478:46;;;76509:7;76518:5;76478:46;;;;;;;;;;;;;;;;;;;;;;;;75750:780;;;;;:::o;71937:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;79248:646::-;32310:12;:10;:12::i;:::-;32299:23;;:7;:5;:7::i;:::-;:23;;;32291:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79299:16:::1;79327:9:::0;79339:1:::1;79327:13;;79322:225;79346:13;:20;;;;79342:1;:24;79322:225;;;79393:146;79416:114;79441:13;79455:1;79441:16;;;;;;;;;;;;;;;;;;;;;;;;;79477:13;79491:1;79477:16;;;;;;;;;;;;;;;;;;;;;;;;;79470:34;;;79513:4;79470:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;79416:12;:114::i;:::-;79393:8;:12;;:146;;;;:::i;:::-;79382:157;;79368:3;;;;;;;79322:225;;;;79558:9;79553:231;79577:15;:22;;;;79573:1;:26;79553:231;;;79626:150;79649:118;79674:15;79690:1;79674:18;;;;;;;;;;;;;;;;;;;;;;;;;79712:15;79728:1;79712:18;;;;;;;;;;;;;;;;;;;;;;;;;79705:36;;;79750:4;79705:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;79649:12;:118::i;:::-;79626:8;:12;;:150;;;;:::i;:::-;79615:161;;79601:3;;;;;;;79553:231;;;;79806:8;79790:13;:24;;;;79842:8;79826:25;;;;;;;;;;79879:8;79863:25;;;;;;;;;;32370:1;79248:646::o:0;71232:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72870:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;70849:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;78533:325::-;78615:15;:27;78631:10;78615:27;;;;;;;;;;;;;;;;;;;;;;;;;78607:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78685:16;:14;:16::i;:::-;78674:7;:27;;78666:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78760:5;78736:35;;;78772:10;78784:7;78736:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78832:10;78806:46;;78820:10;78806:46;;;78844:7;78806:46;;;;;;;;;;;;;;;;;;78533:325;;:::o;70989:34::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73012:21::-;;;;;;;;;;;;;:::o;72269:34::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32730:148::-;32310:12;:10;:12::i;:::-;32299:23;;:7;:5;:7::i;:::-;:23;;;32291:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32837:1:::1;32800:40;;32821:6;::::0;::::1;;;;;;;;32800:40;;;;;;;;;;;;32868:1;32851:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;32730:148::o:0;70900:52::-;;;;;;;;;;;;;;;;;:::o;72512:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71325:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;32079:87::-;32125:7;32152:6;;;;;;;;;;;32145:13;;32079:87;:::o;71597:54::-;;;;;;;;;;;;;;;;;:::o;71688:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73106:28::-;;;;:::o;71139:56::-;;;;;;;;;;;;;;;;;:::o;71785:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;71544:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;72419:56::-;;;;;;;;;;;;;;;;;:::o;77396:357::-;77465:8;:20;77474:10;77465:20;;;;;;;;;;;;;;;;;;;;;;;;;77457:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77535:5;77511:39;;;77551:10;77563:7;77511:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77608:38;77638:7;77608:13;:25;77622:10;77608:25;;;;;;;;;;;;;;;;:29;;:38;;;;:::i;:::-;77580:13;:25;77594:10;77580:25;;;;;;;;;;;;;;;:66;;;;77665:22;77679:7;77665:9;;:13;;:22;;;;:::i;:::-;77653:9;:34;;;;77723:5;77701:46;;77711:10;77701:46;;;77730:7;77739;77701:46;;;;;;;;;;;;;;;;;;;;;;;;77396:357;:::o;72178:54::-;;;;;;;;;;;;;;;;;:::o;70689:30::-;;;:::o;72778:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71378:54::-;;;;;;;;;;;;;;;;;:::o;72642:46::-;;;;;;;;;;;;;;;;;:::o;70776:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70724:45::-;;;:::o;80055:476::-;80146:14;80176;:22;80191:6;80176:22;;;;;;;;;;;;;;;;;;;;;;;;;80172:354;;;80267:94;80342:6;80336:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80332:28;;:2;:28;80267:50;80299:5;80293:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80289:27;;:2;:27;80267:7;:21;;:50;;;;:::i;:::-;:64;;:94;;;;:::i;:::-;80258:103;;80172:354;;;80379:16;:24;80396:6;80379:24;;;;;;;;;;;;;;;;;;;;;;;;;80375:151;;;80441:14;:22;80456:6;80441:22;;;;;;;;;;;;;;;;;;;;;;;;;80423:51;;;80485:6;80502:7;80423:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80414:104;;80375:151;80172:354;80055:476;;;;:::o;76693:574::-;76780:8;:20;76789:10;76780:20;;;;;;;;;;;;;;;;;;;;;;;;;76772:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76832:14;:22;76847:6;76832:22;;;;;;;;;;;;;;;;;;;;;;;;;76824:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76880:67;76912:10;76932:4;76939:7;76887:6;76880:31;;;;:67;;;;;;:::i;:::-;76956:13;76972:29;76985:6;76993:7;76972:12;:29::i;:::-;76956:45;;77036:36;77066:5;77036:13;:25;77050:10;77036:25;;;;;;;;;;;;;;;;:29;;:36;;;;:::i;:::-;77008:13;:25;77022:10;77008:25;;;;;;;;;;;;;;;:64;;;;77091:20;77105:5;77091:9;;:13;;:20;;;;:::i;:::-;77079:9;:32;;;;77136:24;77154:5;77136:13;;:17;;:24;;;;:::i;:::-;77120:13;:40;;;;77188:13;;77172:30;;;;;;;;;;77238:6;77216:45;;77226:10;77216:45;;;77246:7;77255:5;77216:45;;;;;;;;;;;;;;;;;;;;;;;;76693:574;;;:::o;72364:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;73038:26::-;;;;:::o;80703:1739::-;80799:4;32310:12;:10;:12::i;:::-;32299:23;;:7;:5;:7::i;:::-;:23;;;32291:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80843:1:::1;80823:22;;:8;:22;;;;80815:31;;;::::0;::::1;;80870:25;80857:38;;;;;;;;:9;:38;;;;;;;;;80853:1518;;;80952:38;80969:20;80952:12;:16;;:38;;;;:::i;:::-;80918:21;:31;80940:8;80918:31;;;;;;;;;;;;;;;:72;;;;80853:1518;;;81021:23;81008:36;;;;;;;;:9;:36;;;;;;;;;81004:1367;;;81099:38;81116:20;81099:12;:16;;:38;;;;:::i;:::-;81067:19;:29;81087:8;81067:29;;;;;;;;;;;;;;;:70;;;;81004:1367;;;81168:21;81155:34;;;;;;;;:9;:34;;;;;;;;;81151:1220;;;81242:38;81259:20;81242:12;:16;;:38;;;;:::i;:::-;81212:17;:27;81230:8;81212:27;;;;;;;;;;;;;;;:68;;;;81151:1220;;;81311:23;81298:36;;;;;;;;:9;:36;;;;;;;;;81294:1077;;;81389:63;81416:27;81441:1;81416:20;:24;;:27;;;;:::i;:::-;81389:12;:16;;:63;;;;:::i;:::-;81357:19;:29;81377:8;81357:29;;;;;;;;;;;;;;;:95;;;;81294:1077;;;81483:27;81470:40;;;;;;;;:9;:40;;;;;;;;;81466:905;;;81569:56;81596:20;81569:12;:16;;:56;;;;:::i;:::-;81533:23;:33;81557:8;81533:33;;;;;;;;;;;;;;;:92;;;;81466:905;;;81656:23;81643:36;;;;;;;;:9;:36;;;;;;;;;81639:732;;;81734:38;81751:20;81734:12;:16;;:38;;;;:::i;:::-;81702:19;:29;81722:8;81702:29;;;;;;;;;;;;;;;:70;;;;81639:732;;;81803:25;81790:38;;;;;;;;:9;:38;;;;;;;;;81786:585;;;81885:63;81912:27;81937:1;81912:20;:24;;:27;;;;:::i;:::-;81885:12;:16;;:63;;;;:::i;:::-;81851:21;:31;81873:8;81851:31;;;;;;;;;;;;;;;:97;;;;81786:585;;;81979:15;81966:28;;;;;;;;:9;:28;;;;;;;;;81962:409;;;82041:38;82058:20;82041:12;:16;;:38;;;;:::i;:::-;82017:11;:21;82029:8;82017:21;;;;;;;;;;;;;;;:62;;;;81962:409;;;82110:22;82097:35;;;;;;;;:9;:35;;;;;;;;;82093:278;;;82186:38;82203:20;82186:12;:16;;:38;;;;:::i;:::-;82155:18;:28;82174:8;82155:28;;;;;;;;;;;;;;;:69;;;;82093:278;;;82255:15;82242:28:::0;::::1;;;;;;;:9;:28;;;;;;;;;82238:133;;;82307:38;82324:20;82307:12;:16;;:38;;;;:::i;:::-;82293:11;:52;;;;82238:133;;;82366:5;82359:12;;;;82238:133;82093:278;81962:409;81786:585;81639:732;81466:905;81294:1077;81151:1220;81004:1367;80853:1518;82398:9;82385:33;;;;;;;;;82409:8;82385:33;;;;;;;;;;;;;;;;;;;;82432:4;82425:11;;32370:1;80703:1739:::0;;;;:::o;72125:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;72597:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;33033:244::-;32310:12;:10;:12::i;:::-;32299:23;;:7;:5;:7::i;:::-;:23;;;32291:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33142:1:::1;33122:22;;:8;:22;;;;33114:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33232:8;33203:38;;33224:6;::::0;::::1;;;;;;;;33203:38;;;;;;;;;;;;33261:8;33252:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;33033:244:::0;:::o;72922:53::-;;;;;;;;;;;;;;;;;:::o;82648:4118::-;82771:4;32310:12;:10;:12::i;:::-;32299:23;;:7;:5;:7::i;:::-;:23;;;32291:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82812:1:::1;82792:22;;:8;:22;;;;82784:31;;;::::0;::::1;;82822:11;82857:25:::0;82844:38:::1;;;;;;;;:9;:38;;;;;;;;;82840:3844;;;82909:65;82922:21;82945:18;82965:8;82909:12;:65::i;:::-;82905:242;;;83021:1;82987:21;:31;83009:8;82987:31;;;;;;;;;;;;;;;:35;;;;83038:41;83051:17;83070:8;83038:12;:41::i;:::-;83033:105;;83094:17;83117:8;83094:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83033:105;82905:242;83165:18;:28;83184:8;83165:28;;;;;;;;;;;;;;;;;;;;;;;;;83164:29;83155:38;;83233:6;83202:18;:28;83221:8;83202:28;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;82840:3844;;;83270:23;83257:36;;;;;;;;:9;:36;;;;;;;;;83253:3431;;;83320:61;83333:19;83354:16;83372:8;83320:12;:61::i;:::-;83316:232;;;83426:1;83394:19;:29;83414:8;83394:29;;;;;;;;;;;;;;;:33;;;;83443:39;83456:15;83473:8;83443:12;:39::i;:::-;83438:101;;83497:15;83518:8;83497:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83438:101;83316:232;83566:16;:26;83583:8;83566:26;;;;;;;;;;;;;;;;;;;;;;;;;83565:27;83556:36;;83630:6;83601:16;:26;83618:8;83601:26;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;83253:3431;;;83667:21;83654:34;;;;;;;;:9;:34;;;;;;;;;83650:3034;;;83715:57;83728:17;83747:14;83763:8;83715:12;:57::i;:::-;83711:222;;;83815:1;83785:17;:27;83803:8;83785:27;;;;;;;;;;;;;;;:31;;;;83832:37;83845:13;83860:8;83832:12;:37::i;:::-;83827:97;;83884:13;83903:8;83884:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83827:97;83711:222;83951:14;:24;83966:8;83951:24;;;;;;;;;;;;;;;;;;;;;;;;;83950:25;83941:34;;84011:6;83984:14;:24;83999:8;83984:24;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;83650:3034;;;84048:23;84035:36;;;;;;;;:9;:36;;;;;;;;;84031:2653;;;84098:61;84111:19;84132:16;84150:8;84098:12;:61::i;:::-;84094:273;;;84172:15;84193:8;84172:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84245:1;84213:19;:29;84233:8;84213:29;;;;;;;;;;;;;;;:33;;;;84262:39;84275:15;84292:8;84262:12;:39::i;:::-;84257:101;;84316:15;84337:8;84316:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84257:101;84094:273;84385:16;:26;84402:8;84385:26;;;;;;;;;;;;;;;;;;;;;;;;;84384:27;84375:36;;84449:6;84420:16;:26;84437:8;84420:26;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;84031:2653;;;84486:27;84473:40;;;;;;;;:9;:40;;;;;;;;;84469:2215;;;84550:69;84563:23;84588:20;84610:8;84550:12;:69::i;:::-;84536:315;;;84640:19;84665:8;84640:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84721:1;84685:23;:33;84709:8;84685:33;;;;;;;;;;;;;;;:37;;;;84738:43;84751:19;84772:8;84738:12;:43::i;:::-;84733:109;;84796:19;84821:8;84796:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84733:109;84536:315;84869:20;:30;84890:8;84869:30;;;;;;;;;;;;;;;;;;;;;;;;;84868:31;84859:40;;84941:6;84908:20;:30;84929:8;84908:30;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;84469:2215;;;84978:23;84965:36;;;;;;;;:9;:36;;;;;;;;;84961:1723;;;85028:61;85041:19;85062:16;85080:8;85028:12;:61::i;:::-;85024:232;;;85134:1;85102:19;:29;85122:8;85102:29;;;;;;;;;;;;;;;:33;;;;85151:39;85164:15;85181:8;85151:12;:39::i;:::-;85146:101;;85205:15;85226:8;85205:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85146:101;85024:232;85274:16;:26;85291:8;85274:26;;;;;;;;;;;;;;;;;;;;;;;;;85273:27;85264:36;;85338:6;85309:16;:26;85326:8;85309:26;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;85380:11;85353:14;:24;85368:8;85353:24;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;84961:1723;;;85422:25;85409:38;;;;;;;;:9;:38;;;;;;;;;85405:1279;;;85474:65;85487:21;85510:18;85530:8;85474:12;:65::i;:::-;85470:242;;;85586:1;85552:21;:31;85574:8;85552:31;;;;;;;;;;;;;;;:35;;;;85603:41;85616:17;85635:8;85603:12;:41::i;:::-;85598:105;;85659:17;85682:8;85659:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85598:105;85470:242;85730:18;:28;85749:8;85730:28;;;;;;;;;;;;;;;;;;;;;;;;;85729:29;85720:38;;85798:6;85767:18;:28;85786:8;85767:28;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;85405:1279;;;85835:15;85822:28;;;;;;;;:9;:28;;;;;;;;;85818:866;;;85877:45;85890:11;85903:8;85913;85877:12;:45::i;:::-;85873:192;;;85959:1;85935:11;:21;85947:8;85935:21;;;;;;;;;;;;;;;:25;;;;85976:31;85989:7;85998:8;85976:12;:31::i;:::-;85971:85;;86022:7;86035:8;86022:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85971:85;85873:192;86083:8;:18;86092:8;86083:18;;;;;;;;;;;;;;;;;;;;;;;;;86082:19;86073:28;;86131:6;86110:8;:18;86119:8;86110:18;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;85818:866;;;86168:22;86155:35;;;;;;;;:9;:35;;;;;;;;;86151:533;;;86217:59;86230:18;86250:15;86267:8;86217:12;:59::i;:::-;86213:227;;;86320:1;86289:18;:28;86308:8;86289:28;;;;;;;;;;;;;;;:32;;;;86337:38;86350:14;86366:8;86337:12;:38::i;:::-;86332:99;;86390:14;86410:8;86390:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86332:99;86213:227;86458:15;:25;86474:8;86458:25;;;;;;;;;;;;;;;;;;;;;;;;;86457:26;86448:35;;86520:6;86492:15;:25;86508:8;86492:25;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;86151:533;;;86557:15;86544:28:::0;::::1;;;;;;;:9;:28;;;;;;;;;86540:144;;;86609:1;86595:11;:15;;;;86628:8;86619:6;;:17;;;;;;;;;;;;;;;;;;86654:4;86645:13;;86540:144;;;86679:5;86672:12;;;;;86540:144;86151:533;85818:866;85405:1279;84961:1723;84469:2215;84031:2653;83650:3034;83253:3431;82840:3844;86714:9;86698:44;;;;;;;;;86725:8;86735:6;86698:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;86756:4;86749:11;;;32370:1;82648:4118:::0;;;;;:::o;73172:24::-;;;;:::o;71469:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71842:58::-;;;;;;;;;;;;;;;;;:::o;7134:158::-;7192:7;7225:1;7220;:6;;7212:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7283:1;7279;:5;7272:12;;7134:158;;;;:::o;41989:177::-;42072:86;42092:5;42122:23;;;42147:2;42151:5;42099:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42072:19;:86::i;:::-;41989:177;;;:::o;42174:205::-;42275:96;42295:5;42325:27;;;42354:4;42360:2;42364:5;42302:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42275:19;:96::i;:::-;42174:205;;;;:::o;6672:179::-;6730:7;6750:9;6766:1;6762;:5;6750:17;;6791:1;6786;:6;;6778:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6842:1;6835:8;;;6672:179;;;;:::o;702:106::-;755:15;790:10;783:17;;702:106;:::o;7551:220::-;7609:7;7638:1;7633;:6;7629:20;;;7648:1;7641:8;;;;7629:20;7660:9;7676:1;7672;:5;7660:17;;7705:1;7700;7696;:5;;;;;;:10;7688:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7762:1;7755:8;;;7551:220;;;;;:::o;8249:153::-;8307:7;8339:1;8335;:5;8327:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8393:1;8389;:5;;;;;;8382:12;;8249:153;;;;:::o;87013:382::-;87182:4;87200:7;:17;87208:8;87200:17;;;;;;;;;;;;;;;;;;;;;;;;;87195:176;;87256:1;87236:6;:16;87243:8;87236:16;;;;;;;;;;;;;;;;:21;;87228:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87309:12;87289:6;:16;87296:8;87289:16;;;;;;;;;;;;;;;;:32;;87281:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87359:4;87352:11;;;;87195:176;87384:5;87377:12;;87013:382;;;;;;:::o;87560:256::-;87661:4;87682:9;87694:1;87682:13;;87677:115;87701:5;:12;;;;87697:1;:16;87677:115;;;87745:6;87733:18;;:5;87739:1;87733:8;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;87729:56;;;87771:4;87764:11;;;;;87729:56;87715:3;;;;;;;87677:115;;;;87805:5;87798:12;;87560:256;;;;;:::o;44294:761::-;44718:23;44744:69;44772:4;44744:69;;;;;;;;;;;;;;;;;44752:5;44744:27;;;;:69;;;;;:::i;:::-;44718:95;;44848:1;44828:10;:17;:21;44824:224;;;44970:10;44959:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44951:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44824:224;44294:761;;;:::o;36980:195::-;37083:12;37115:52;37137:6;37145:4;37151:1;37154:12;37115:21;:52::i;:::-;37108:59;;36980:195;;;;;:::o;38032:530::-;38159:12;38217:5;38192:21;:30;;38184:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38284:18;38295:6;38284:10;:18::i;:::-;38276:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38410:12;38424:23;38451:6;:11;;38471:5;38479:4;38451:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38409:75;;;;38502:52;38520:7;38529:10;38541:12;38502:17;:52::i;:::-;38495:59;;;;38032:530;;;;;;:::o;34062:422::-;34122:4;34330:12;34441:7;34429:20;34421:28;;34475:1;34468:4;:8;34461:15;;;34062:422;;;:::o;40572:742::-;40687:12;40716:7;40712:595;;;40747:10;40740:17;;;;40712:595;40881:1;40861:10;:17;:21;40857:439;;;41124:10;41118:17;41185:15;41172:10;41168:2;41164:19;41157:44;41072:148;41267:12;41260:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40572:742;;;;;;:::o
Swarm Source
ipfs://9cdd9ab1828dc11bb790a9125b237f9e0c0077c55e684e1f7af184b729dc75a2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $93.54 | 361.9041 | $33,852.51 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.