More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 355 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 20653437 | 17 days ago | IN | 0 ETH | 0.00001386 | ||||
Approve | 18751027 | 284 days ago | IN | 0 ETH | 0.0006489 | ||||
Redeem | 14304914 | 931 days ago | IN | 0 ETH | 0.01601203 | ||||
Approve | 13996720 | 979 days ago | IN | 0 ETH | 0.00276652 | ||||
Approve | 13872690 | 998 days ago | IN | 0 ETH | 0.00281586 | ||||
Redeem | 13478233 | 1060 days ago | IN | 0 ETH | 0.01189307 | ||||
Redeem | 13412051 | 1071 days ago | IN | 0 ETH | 0.04201095 | ||||
Redeem | 13404638 | 1072 days ago | IN | 0 ETH | 0.01940109 | ||||
Redeem | 13390149 | 1074 days ago | IN | 0 ETH | 0.01769426 | ||||
Approve | 13382371 | 1075 days ago | IN | 0 ETH | 0.00526509 | ||||
Redeem | 13371543 | 1077 days ago | IN | 0 ETH | 0.02886615 | ||||
Redeem | 13364376 | 1078 days ago | IN | 0 ETH | 0.05468066 | ||||
Redeem | 13359116 | 1079 days ago | IN | 0 ETH | 0.02459838 | ||||
Redeem | 13347593 | 1081 days ago | IN | 0 ETH | 0.02166203 | ||||
Redeem | 13342897 | 1081 days ago | IN | 0 ETH | 0.03029066 | ||||
Redeem | 13332762 | 1083 days ago | IN | 0 ETH | 0.02386957 | ||||
Emergency Stop S... | 13322468 | 1085 days ago | IN | 0 ETH | 0.10140828 | ||||
Deposit | 13291259 | 1089 days ago | IN | 0 ETH | 0.0523801 | ||||
Redeem | 13286168 | 1090 days ago | IN | 0 ETH | 0.05079034 | ||||
Approve | 13215322 | 1101 days ago | IN | 0 ETH | 0.0023265 | ||||
Redeem | 13204259 | 1103 days ago | IN | 0 ETH | 0.0585266 | ||||
Approve | 13017484 | 1132 days ago | IN | 0 ETH | 0.00237303 | ||||
Redeem | 12997555 | 1135 days ago | IN | 0 ETH | 0.03818661 | ||||
Approve | 12984971 | 1137 days ago | IN | 0 ETH | 0.00127743 | ||||
Deposit | 12984962 | 1137 days ago | IN | 0 ETH | 0.03305184 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
zsToken
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-05 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * 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/IERC20.sol pragma solidity ^0.6.0; /** * Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * 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); /** * 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); /** * 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); /** * 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); function decimals() external view returns (uint8); /** * 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); /** * 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/SafeMath.sol pragma solidity ^0.6.0; /** * 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 { /** * 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; } /** * Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * Collection of functions related to the address type */ library Address { /** * 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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * 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"); } /** * 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"); } /** * 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); } /** * 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"); } /** * Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.6.0; /** * Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * 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; } /** * Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * 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 override returns (uint8) { return _decimals; } /** * See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * 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; } /** * See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * 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; } /** * 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; } /** * 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; } /** * 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; } /** * 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"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** 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"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * 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"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal 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); } /** * Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * 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. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * Returns the address of the current owner. */ function governance() public view returns (address) { return _owner; } /** * Throws if called by any account other than the owner. */ modifier onlyGovernance() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferGovernance(address newOwner) internal virtual onlyGovernance { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } 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"); } } } contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts/zsToken.sol // zsTokens are Stabilize proxy tokens that serve as receipts for deposits into Stabilize strategies // zsTokens should increase in value if the strategy it uses is profitable // When someone deposits into the zsToken contract, tokens are minted and when they redeem, tokens are burned interface StabilizeStrategy { function rewardTokensCount() external view returns (uint256); function rewardTokenAddress(uint256) external view returns (address); function withdrawTokenReserves() external view returns (address, uint256); function balance() external view returns (uint256); function pricePerToken() external view returns (uint256); function enter() external; function exit() external; function deposit(bool) external; function withdraw(address, uint256, uint256, bool) external returns (uint256); // Will withdraw to the address specified a percent of total shares } interface StabilizePriceOracle { function getPrice(address _address) external returns (uint256); } pragma solidity ^0.6.6; contract zsToken is ERC20("Stabilize Strategy Multi-Token", "zs-USD"), Ownable, ReentrancyGuard { using SafeERC20 for IERC20; // Variables uint256 constant divisionFactor = 100000; StabilizePriceOracle private oracleContract; // A reference to the price oracle contract // There are no fees to deposit and withdraw from the zs-Tokens // Info of each user. struct UserInfo { uint256 depositTime; // The time the user made the last deposit uint256 shareEstimate; } mapping(address => UserInfo) private userInfo; // Token information // This wrapped token accepts multiple stablecoins // DAI, USDC, USDT, sUSD struct TokenInfo { IERC20 token; // Reference of token uint256 decimals; // Decimals of token uint256 price; // Last price of token in USD } TokenInfo[] private tokenList; // An array of tokens accepted as deposits address private _underlyingPriceAsset; // Token from which the price is derived bool public depositsOpen = true; // Governance can open or close deposits without timelock, cannot block withdrawals // Strategy information StabilizeStrategy private currentStrategy; // This will be the contract for the strategy address private _pendingStrategy; // Events event Wrapped(address indexed user, uint256 amount); event Unwrapped(address indexed user, uint256 amount); constructor (address _priceAsset, StabilizePriceOracle _oracle) public { _underlyingPriceAsset = _priceAsset; oracleContract = _oracle; setupTokens(); } function setupTokens() internal { // Start with DAI IERC20 _token = IERC20(address(0x6B175474E89094C44Da98b954EedeAC495271d0F)); tokenList.push( TokenInfo({ token: _token, decimals: _token.decimals(), price: 1e18 }) ); // USDC _token = IERC20(address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)); tokenList.push( TokenInfo({ token: _token, decimals: _token.decimals(), price: 1e18 }) ); // USDT _token = IERC20(address(0xdAC17F958D2ee523a2206206994597C13D831ec7)); tokenList.push( TokenInfo({ token: _token, decimals: _token.decimals(), price: 1e18 }) ); // sUSD _token = IERC20(address(0x57Ab1ec28D129707052df4dF418D58a2D46d5f51)); tokenList.push( TokenInfo({ token: _token, decimals: _token.decimals(), price: 1e18 }) ); } function getCurrentStrategy() external view returns (address) { return address(currentStrategy); } function getPendingStrategy() external view returns (address) { return _pendingStrategy; } function underlyingAsset() public view returns (address) { // Can be used if staking in the STBZ pool return address(_underlyingPriceAsset); } function underlyingDepositAssets() public view returns (address, address, address, address) { // Returns all addresses accepted by this token vault return (address(tokenList[0].token), address(tokenList[1].token), address(tokenList[2].token), address(tokenList[3].token)); } function pricePerToken() public view returns (uint256) { if(totalSupply() == 0){ return 1e18; // Shown in Wei units }else{ return uint256(1e18).mul(valueOfVaultAndStrategy()).div(totalSupply()); } } function getNormalizedTotalBalance(address _address) public view returns (uint256) { uint256 _balance = 0; for(uint256 i = 0; i < tokenList.length; i++){ uint256 _bal = tokenList[i].token.balanceOf(_address); _bal = _bal.mul(1e18).div(10**tokenList[i].decimals); _balance = _balance.add(_bal); // This has been normalized to 1e18 decimals } return _balance; } function valueOfVaultAndStrategy() public view returns (uint256) { // The total value of the tokens uint256 balance = getNormalizedTotalBalance(address(this)); // Get tokens stored in this contract if(currentStrategy != StabilizeStrategy(address(0))){ balance += currentStrategy.balance(); // And tokens stored at the strategy } return balance; } function withdrawTokenReserves() public view returns (address, uint256) { // This function will return the address and amount of the token with the lowest price if(currentStrategy != StabilizeStrategy(address(0))){ return currentStrategy.withdrawTokenReserves(); }else{ uint256 length = tokenList.length; uint256 targetID = 0; uint256 targetPrice = 0; for(uint256 i = 0; i < length; i++){ if(tokenList[i].token.balanceOf(address(this)) > 0){ uint256 _price = tokenList[i].price; if(targetPrice == 0 || _price <= targetPrice){ targetPrice = _price; targetID = i; } } } if(targetPrice > 0){ return (address(tokenList[targetID].token), tokenList[targetID].token.balanceOf(address(this))); }else{ return (address(0), 0); // No balance } } } function updateTokenPrices() internal { for(uint256 i = 0; i < tokenList.length; i++){ uint256 price = oracleContract.getPrice(address(tokenList[i].token)); if(price > 0){ tokenList[i].price = price; } } } // Now handle deposits into the strategy function deposit(uint256 amount, uint256 _tokenID) public nonReentrant { uint256 total = valueOfVaultAndStrategy(); // Get token equivalent at strategy and here if applicable require(depositsOpen == true, "Deposits have been suspended, but you can still withdraw"); require(currentStrategy != StabilizeStrategy(address(0)),"No strategy contract has been selected yet"); require(_tokenID < tokenList.length, "Token ID is outside range of tokens in contract"); IERC20 _token = tokenList[_tokenID].token; // Trusted tokens uint256 _before = _token.balanceOf(address(this)); _token.safeTransferFrom(_msgSender(), address(this), amount); // Transfer token to this address amount = _token.balanceOf(address(this)).sub(_before); // Some tokens lose amount (transfer fee) upon transfer require(amount > 0, "Cannot deposit 0"); bool nonContract = false; if(tx.origin == _msgSender()){ nonContract = true; // The sender is not a contract, we will allow market sells and buys } uint256 _strategyBalance = currentStrategy.balance(); // Will get the balance of the value of the main tokens at the strategy // Now call the strategy to deposit pushTokensToStrategy(); // Push any strategy tokens here into the strategy currentStrategy.deposit(nonContract); // Activate strategy deposit require(currentStrategy.balance() > _strategyBalance, "No change in strategy balance"); // Balance should increase uint256 normalizedAmount = amount.mul(1e18).div(10**tokenList[_tokenID].decimals); // Make sure everything is same units uint256 mintAmount = normalizedAmount; if(totalSupply() > 0){ // There is already a balance here, calculate our share mintAmount = normalizedAmount.mul(totalSupply()).div(total); // Our share of the total } _mint(_msgSender(),mintAmount); // Now mint new zs-token to the depositor // Add the user information userInfo[_msgSender()].depositTime = now; userInfo[_msgSender()].shareEstimate = userInfo[_msgSender()].shareEstimate.add(mintAmount); emit Wrapped(_msgSender(), amount); } function redeem(uint256 share) public nonReentrant { // Essentially withdraw our equivalent share of the pool based on share value // Users cannot choose which stablecoin they get. They get the lowest valued coin up to the highest value require(share > 0, "Cannot withdraw 0"); require(totalSupply() > 0, "No value redeemable"); uint256 tokenTotal = totalSupply(); // Now burn the token _burn(_msgSender(),share); // Burn the amount, will fail if user doesn't have enough bool nonContract = false; if(tx.origin == _msgSender()){ nonContract = true; // The sender is not a contract, we will allow market sells and buys }else{ // This is a contract redeeming require(userInfo[_msgSender()].depositTime < now && userInfo[_msgSender()].depositTime > 0, "Contract depositor cannot redeem in same transaction"); } // Update user information if(share <= userInfo[_msgSender()].shareEstimate){ userInfo[_msgSender()].shareEstimate = userInfo[_msgSender()].shareEstimate.sub(share); }else{ // Share is greater than our share estimate, can happen if tokens are transferred userInfo[_msgSender()].shareEstimate = 0; require(nonContract == true, "Contract depositors cannot take out more than what they put in"); } uint256 withdrawAmount = 0; if(currentStrategy != StabilizeStrategy(address(0))){ withdrawAmount = currentStrategy.withdraw(_msgSender(), share, tokenTotal, nonContract); // Returns the amount of underlying removed require(withdrawAmount > 0, "Failed to withdraw from the strategy"); }else{ // Pull directly from this contract the token amount in relation to the share if strategy not used if(share < tokenTotal){ uint256 _balance = getNormalizedTotalBalance(address(this)); uint256 _myBalance = _balance.mul(share).div(tokenTotal); withdrawPerPrice(_msgSender(), _myBalance, false); // This will withdraw based on token price withdrawAmount = _myBalance; }else{ // We are all shares, transfer all uint256 _balance = getNormalizedTotalBalance(address(this)); withdrawPerPrice(_msgSender(), _balance, true); withdrawAmount = _balance; } } emit Unwrapped(_msgSender(), withdrawAmount); } // This will withdraw the tokens from the contract based on their price, from lowest price to highest function withdrawPerPrice(address _receiver, uint256 _withdrawAmount, bool _takeAll) internal { uint256 length = tokenList.length; if(_takeAll == true){ for(uint256 i = 0; i < length; i++){ if(tokenList[i].token.balanceOf(address(this)) > 0){ tokenList[i].token.safeTransfer(_receiver, tokenList[i].token.balanceOf(address(this))); } } return; } bool[4] memory done; uint256 targetID = 0; uint256 targetPrice = 0; updateTokenPrices(); for(uint256 i = 0; i < length; i++){ targetPrice = 0; // Reset the target price // Find the lowest priced token to withdraw for(uint256 i2 = 0; i2 < length; i2++){ if(done[i2] == false){ uint256 _price = tokenList[i2].price; if(targetPrice == 0 || _price <= targetPrice){ targetPrice = _price; targetID = i2; } } } done[targetID] = true; // Determine the balance left uint256 _normalizedBalance = tokenList[targetID].token.balanceOf(address(this)).mul(1e18).div(10**tokenList[targetID].decimals); if(_normalizedBalance <= _withdrawAmount){ // Withdraw the entire balance of this token if(_normalizedBalance > 0){ _withdrawAmount = _withdrawAmount.sub(_normalizedBalance); tokenList[targetID].token.safeTransfer(_receiver, tokenList[targetID].token.balanceOf(address(this))); } }else{ // Withdraw a partial amount of this token if(_withdrawAmount > 0){ // Convert the withdraw amount to the token's decimal amount uint256 _balance = _withdrawAmount.mul(10**tokenList[targetID].decimals).div(1e18); _withdrawAmount = 0; tokenList[targetID].token.safeTransfer(_receiver, _balance); } break; // Nothing more to withdraw } } } // Governance functions // Stop/start all deposits, no timelock required // -------------------- function stopDeposits() external onlyGovernance { depositsOpen = false; } function startDeposits() external onlyGovernance { depositsOpen = true; } // A function used in case of strategy failure, possibly due to bug in theplatform our strategy is using, governance can stop using it quick function emergencyStopStrategy() external onlyGovernance { depositsOpen = false; if(currentStrategy != StabilizeStrategy(address(0)) && totalSupply() > 0){ currentStrategy.exit(); // Pulls all the tokens and accessory tokens from the strategy } currentStrategy = StabilizeStrategy(address(0)); _timelockType = 0; // Prevent governance from changing to new strategy without timelock } // -------------------- // Timelock variables uint256 private _timelockStart; // The start of the timelock to change governance variables uint256 private _timelockType; // The function that needs to be changed uint256 constant _timelockDuration = 86400; // Timelock is 24 hours // Reusable timelock variables address private _timelock_address; modifier timelockConditionsMet(uint256 _type) { require(_timelockType == _type, "Timelock not acquired for this function"); _timelockType = 0; // Reset the type once the timelock is used if(totalSupply() > 0){ // Timelock is only required after tokens exist require(now >= _timelockStart + _timelockDuration, "Timelock time not met"); } _; } // Change the owner of the token contract // -------------------- function startGovernanceChange(address _address) external onlyGovernance { _timelockStart = now; _timelockType = 1; _timelock_address = _address; } function finishGovernanceChange() external onlyGovernance timelockConditionsMet(1) { transferGovernance(_timelock_address); } // -------------------- // Change the treasury address // -------------------- function startChangeStrategy(address _address) external onlyGovernance { _timelockStart = now; _timelockType = 2; _timelock_address = _address; _pendingStrategy = _address; if(totalSupply() == 0){ // Can change strategy with one call in this case finishChangeStrategy(); } } function finishChangeStrategy() public onlyGovernance timelockConditionsMet(2) { if(currentStrategy != StabilizeStrategy(address(0)) && totalSupply() > 0){ currentStrategy.exit(); // Pulls all the tokens and accessory tokens from the strategy } currentStrategy = StabilizeStrategy(_timelock_address); if(currentStrategy != StabilizeStrategy(address(0)) && totalSupply() > 0){ pushTokensToStrategy(); // It will push any strategy reward tokens here to the new strategy currentStrategy.enter(); // Puts all the tokens and accessory tokens into the new strategy } _pendingStrategy = address(0); } function pushTokensToStrategy() internal { uint256 tokenCount = currentStrategy.rewardTokensCount(); for(uint256 i = 0; i < tokenCount; i++){ IERC20 _token = IERC20(address(currentStrategy.rewardTokenAddress(i))); uint256 _balance = _token.balanceOf(address(this)); if(_balance > 0){ _token.safeTransfer(address(currentStrategy), _balance); } } } // -------------------- // Change the price oracle contract used, in case of upgrades // -------------------- function startChangePriceOracle(address _address) external onlyGovernance { _timelockStart = now; _timelockType = 3; _timelock_address = _address; } function finishChangePriceOracle() external onlyGovernance timelockConditionsMet(3) { oracleContract = StabilizePriceOracle(_timelock_address); } // -------------------- }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_priceAsset","type":"address"},{"internalType":"contract StabilizePriceOracle","name":"_oracle","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unwrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Wrapped","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyStopStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishChangePriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishChangeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishGovernanceChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getNormalizedTotalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"startChangePriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"startChangeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"startGovernanceChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlyingAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"underlyingDepositAssets","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"valueOfVaultAndStrategy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawTokenReserves","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600a805460ff60a01b1916600160a01b1790553480156200002457600080fd5b5060405162003bf338038062003bf3833981810160405260408110156200004a57600080fd5b508051602091820151604080518082018252601e81527f53746162696c697a65205374726174656779204d756c74692d546f6b656e0000818601908152825180840190935260068352651e9ccb5554d160d21b958301959095528051939492939092620000bb916003919062000577565b508051620000d190600490602084019062000577565b50506005805460ff19166012179055506000620000f66001600160e01b036200019c16565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600655600a80546001600160a01b038085166001600160a01b0319928316179092556007805492841692909116919091179055620001946001600160e01b03620001a116565b505062000619565b335b90565b6000736b175474e89094c44da98b954eedeac495271d0f905060096040518060600160405280836001600160a01b03168152602001836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021057600080fd5b505afa15801562000225573d6000803e3d6000fd5b505050506040513d60208110156200023c57600080fd5b505160ff168152670de0b6b3a7640000602091820152825460018082018555600094855293829020835160039092020180546001600160a01b0319166001600160a01b039092169190911781558282015193810193909355604091820151600290930192909255805160608101825273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48808252825163313ce56760e01b81529251909450600993919283830192869263313ce567926004808201939291829003018186803b1580156200030257600080fd5b505afa15801562000317573d6000803e3d6000fd5b505050506040513d60208110156200032e57600080fd5b505160ff168152670de0b6b3a7640000602091820152825460018082018555600094855293829020835160039092020180546001600160a01b0319166001600160a01b039092169190911781558282015193810193909355604091820151600290930192909255805160608101825273dac17f958d2ee523a2206206994597c13d831ec7808252825163313ce56760e01b81529251909450600993919283830192869263313ce567926004808201939291829003018186803b158015620003f457600080fd5b505afa15801562000409573d6000803e3d6000fd5b505050506040513d60208110156200042057600080fd5b505160ff168152670de0b6b3a7640000602091820152825460018082018555600094855293829020835160039092020180546001600160a01b0319166001600160a01b03909216919091178155828201519381019390935560409182015160029093019290925580516060810182527357ab1ec28d129707052df4df418d58a2d46d5f51808252825163313ce56760e01b81529251909450600993919283830192869263313ce567926004808201939291829003018186803b158015620004e657600080fd5b505afa158015620004fb573d6000803e3d6000fd5b505050506040513d60208110156200051257600080fd5b505160ff168152670de0b6b3a7640000602091820152825460018082018555600094855293829020835160039092020180546001600160a01b0319166001600160a01b0390921691909117815590820151928101929092556040015160029091015550565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620005ba57805160ff1916838001178555620005ea565b82800160010185558215620005ea579182015b82811115620005ea578251825591602001919060010190620005cd565b50620005f8929150620005fc565b5090565b6200019e91905b80821115620005f8576000815560010162000603565b6135ca80620006296000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80637158da7c1161010f578063b9195072116100a2578063dd62ed3e11610071578063dd62ed3e14610528578063e2bbb15814610556578063f63aeac314610579578063f80087761461059f576101f0565b8063b9195072146104d0578063c650ea59146104d8578063d9a74be014610503578063db006a751461050b576101f0565b80639d63b8f7116100de5780639d63b8f71461044a578063a457c2d714610470578063a4b88e7b1461049c578063a9059cbb146104a4576101f0565b80637158da7c1461042a5780637b1b1de61461043257806383249ef91461043a57806395d89b4114610442576101f0565b8063549c4627116101875780635c27af87116101565780635c27af87146103b85780635cbe86bc146103c05780636d8ac22d146103c857806370a0823114610404576101f0565b8063549c462714610398578063563a7956146103a057806357a53799146103a85780635aa6e675146103b0576101f0565b8063313ce567116101c3578063313ce5671461030257806337c6de961461032057806339509351146103445780633e3bc62314610370576101f0565b806306fdde03146101f5578063095ea7b31461027257806318160ddd146102b257806323b872dd146102cc575b600080fd5b6101fd6105c5565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561023757818101518382015260200161021f565b50505050905090810190601f1680156102645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61029e6004803603604081101561028857600080fd5b506001600160a01b03813516906020013561065c565b604080519115158252519081900360200190f35b6102ba61067a565b60408051918252519081900360200190f35b61029e600480360360608110156102e257600080fd5b506001600160a01b03813581169160208101359091169060400135610680565b61030a61070d565b6040805160ff9092168252519081900360200190f35b610328610716565b604080516001600160a01b039092168252519081900360200190f35b61029e6004803603604081101561035a57600080fd5b506001600160a01b038135169060200135610725565b6103966004803603602081101561038657600080fd5b50356001600160a01b0316610779565b005b61029e610801565b6102ba610811565b6103966108b2565b6103286109df565b6103966109f3565b610396610a65565b6103d0610ad1565b604080516001600160a01b039586168152938516602085015291841683830152909216606082015290519081900360800190f35b6102ba6004803603602081101561041a57600080fd5b50356001600160a01b0316610b91565b610328610bac565b6102ba610bbb565b610328610c16565b6101fd610c25565b6102ba6004803603602081101561046057600080fd5b50356001600160a01b0316610c86565b61029e6004803603604081101561048657600080fd5b506001600160a01b038135169060200135610d91565b610396610dff565b61029e600480360360408110156104ba57600080fd5b506001600160a01b038135169060200135611056565b61039661106a565b6104e061118a565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6103966113ed565b6103966004803603602081101561052157600080fd5b50356114fd565b6102ba6004803603604081101561053e57600080fd5b506001600160a01b0381358116916020013516611992565b6103966004803603604081101561056c57600080fd5b50803590602001356119bd565b6103966004803603602081101561058f57600080fd5b50356001600160a01b0316611fc9565b610396600480360360208110156105b557600080fd5b50356001600160a01b031661206e565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b505050505090505b90565b60006106706106696120f6565b84846120fa565b5060015b92915050565b60025490565b600061068d8484846121e6565b610703846106996120f6565b6106fe856040518060600160405280602881526020016133f8602891396001600160a01b038a166000908152600160205260408120906106d76120f6565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61234216565b6120fa565b5060019392505050565b60055460ff1690565b600c546001600160a01b031690565b60006106706107326120f6565b846106fe85600160006107436120f6565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6123d916565b6107816120f6565b60055461010090046001600160a01b039081169116146107d6576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b42600d556003600e55600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600a54600160a01b900460ff1681565b60008061081d30610c86565b600b549091506001600160a01b0316156108ad57600b60009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561087f57600080fd5b505afa158015610893573d6000803e3d6000fd5b505050506040513d60208110156108a957600080fd5b5051015b905090565b6108ba6120f6565b60055461010090046001600160a01b0390811691161461090f576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b600380600e54146109515760405162461bcd60e51b81526004018080602001828103825260278152602001806133b06027913960400191505060405180910390fd5b6000600e81905561096061067a565b11156109ba5762015180600d54014210156109ba576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b50600f54600780546001600160a01b0319166001600160a01b03909216919091179055565b60055461010090046001600160a01b031690565b6109fb6120f6565b60055461010090046001600160a01b03908116911614610a50576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b600a805460ff60a01b1916600160a01b179055565b610a6d6120f6565b60055461010090046001600160a01b03908116911614610ac2576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b600a805460ff60a01b19169055565b6000806000806009600081548110610ae557fe5b6000918252602090912060039091020154600980546001600160a01b03909216916001908110610b1157fe5b6000918252602090912060039091020154600980546001600160a01b03909216916002908110610b3d57fe5b6000918252602090912060039182020154600980546001600160a01b039092169290918110610b6857fe5b6000918252602090912060039091020154929791965094506001600160a01b0390911692509050565b6001600160a01b031660009081526020819052604090205490565b600a546001600160a01b031690565b6000610bc561067a565b610bd85750670de0b6b3a7640000610659565b610c0f610be361067a565b610c03610bee610811565b670de0b6b3a76400009063ffffffff61243a16565b9063ffffffff61249316565b9050610659565b600b546001600160a01b031690565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106515780601f1061062657610100808354040283529160200191610651565b600080805b600954811015610d8a57600060098281548110610ca457fe5b600091825260209182902060039091020154604080516370a0823160e01b81526001600160a01b038981166004830152915191909216926370a082319260248082019391829003018186803b158015610cfc57600080fd5b505afa158015610d10573d6000803e3d6000fd5b505050506040513d6020811015610d2657600080fd5b505160098054919250610d6d9184908110610d3d57fe5b906000526020600020906003020160010154600a0a610c03670de0b6b3a76400008461243a90919063ffffffff16565b9050610d7f838263ffffffff6123d916565b925050600101610c8b565b5092915050565b6000610670610d9e6120f6565b846106fe856040518060600160405280602581526020016135706025913960016000610dc86120f6565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61234216565b610e076120f6565b60055461010090046001600160a01b03908116911614610e5c576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b600280600e5414610e9e5760405162461bcd60e51b81526004018080602001828103825260278152602001806133b06027913960400191505060405180910390fd5b6000600e819055610ead61067a565b1115610f075762015180600d5401421015610f07576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b600b546001600160a01b031615801590610f2857506000610f2661067a565b115b15610f9657600b60009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610f7d57600080fd5b505af1158015610f91573d6000803e3d6000fd5b505050505b600f54600b80546001600160a01b0319166001600160a01b0392831617908190551615801590610fcd57506000610fcb61067a565b115b1561104357610fda6124d5565b600b60009054906101000a90046001600160a01b03166001600160a01b031663e97dcb626040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561102a57600080fd5b505af115801561103e573d6000803e3d6000fd5b505050505b50600c80546001600160a01b0319169055565b60006106706110636120f6565b84846121e6565b6110726120f6565b60055461010090046001600160a01b039081169116146110c7576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b600180600e54146111095760405162461bcd60e51b81526004018080602001828103825260278152602001806133b06027913960400191505060405180910390fd5b6000600e81905561111861067a565b11156111725762015180600d5401421015611172576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b600f54611187906001600160a01b0316612679565b50565b600b5460009081906001600160a01b03161561121f57600b546040805163c650ea5960e01b815281516001600160a01b039093169263c650ea5992600480840193919291829003018186803b1580156111e257600080fd5b505afa1580156111f6573d6000803e3d6000fd5b505050506040513d604081101561120c57600080fd5b50805160209091015190925090506113e9565b600954600080805b8381101561130c5760006009828154811061123e57fe5b600091825260209182902060039091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561129257600080fd5b505afa1580156112a6573d6000803e3d6000fd5b505050506040513d60208110156112bc57600080fd5b50511115611304576000600982815481106112d357fe5b906000526020600020906003020160020154905082600014806112f65750828111155b15611302578092508193505b505b600101611227565b5080156113d9576009828154811061132057fe5b6000918252602090912060039091020154600980546001600160a01b03909216918490811061134b57fe5b600091825260209182902060039091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561139f57600080fd5b505afa1580156113b3573d6000803e3d6000fd5b505050506040513d60208110156113c957600080fd5b505190955093506113e992505050565b50600093508392506113e9915050565b9091565b6113f56120f6565b60055461010090046001600160a01b0390811691161461144a576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b600a805460ff60a01b19169055600b546001600160a01b0316158015906114785750600061147661067a565b115b156114e657600b60009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114cd57600080fd5b505af11580156114e1573d6000803e3d6000fd5b505050505b600b80546001600160a01b03191690556000600e55565b60026006541415611555576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600655806115a0576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b60006115aa61067a565b116115f2576040805162461bcd60e51b81526020600482015260136024820152724e6f2076616c75652072656465656d61626c6560681b604482015290519081900360640190fd5b60006115fc61067a565b905061160f6116096120f6565b83612782565b60006116196120f6565b6001600160a01b0316326001600160a01b0316141561163a575060016116ce565b42600860006116476120f6565b6001600160a01b0316815260208101919091526040016000205410801561169357506000600860006116776120f6565b6001600160a01b03168152602081019190915260400160002054115b6116ce5760405162461bcd60e51b81526004018080602001828103825260348152602001806134406034913960400191505060405180910390fd5b600860006116da6120f6565b6001600160a01b03166001600160a01b0316815260200190815260200160002060010154831161176b5761173d83600860006117146120f6565b6001600160a01b031681526020810191909152604001600020600101549063ffffffff61287e16565b600860006117496120f6565b6001600160a01b031681526020810191909152604001600020600101556117da565b6000600860006117796120f6565b6001600160a01b031681526020810191909152604001600020600190810191909155811515146117da5760405162461bcd60e51b815260040180806020018281038252603e815260200180613508603e913960400191505060405180910390fd5b600b546000906001600160a01b0316156118d357600b546001600160a01b031663234b67456118076120f6565b604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482018890526044820187905285151560648301525160848083019260209291908290030181600087803b15801561186457600080fd5b505af1158015611878573d6000803e3d6000fd5b505050506040513d602081101561188e57600080fd5b50519050806118ce5760405162461bcd60e51b815260040180806020018281038252602481526020018061338c6024913960400191505060405180910390fd5b61193f565b8284101561191c5760006118e630610c86565b905060006118fe85610c03848963ffffffff61243a16565b905061191361190b6120f6565b8260006128c0565b915061193f9050565b600061192730610c86565b905061193c6119346120f6565b8260016128c0565b90505b6119476120f6565b6001600160a01b03167f95ae649bfaaef9def56a52f4fb2d9e8fa5496bb7082930e442c74cc76b03dcb3826040518082815260200191505060405180910390a2505060016006555050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60026006541415611a15576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026006556000611a24610811565b600a54909150600160a01b900460ff161515600114611a745760405162461bcd60e51b81526004018080602001828103825260388152602001806132956038913960400191505060405180910390fd5b600b546001600160a01b0316611abb5760405162461bcd60e51b815260040180806020018281038252602a8152602001806134ba602a913960400191505060405180910390fd5b6009548210611afb5760405162461bcd60e51b815260040180806020018281038252602f815260200180613337602f913960400191505060405180910390fd5b600060098381548110611b0a57fe5b60009182526020808320600390920290910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b158015611b6257600080fd5b505afa158015611b76573d6000803e3d6000fd5b505050506040513d6020811015611b8c57600080fd5b50519050611bb3611b9b6120f6565b6001600160a01b03841690308863ffffffff612cf516565b604080516370a0823160e01b81523060048201529051611c379183916001600160a01b038616916370a08231916024808301926020929190829003018186803b158015611bff57600080fd5b505afa158015611c13573d6000803e3d6000fd5b505050506040513d6020811015611c2957600080fd5b50519063ffffffff61287e16565b945060008511611c81576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6000611c8b6120f6565b6001600160a01b0316326001600160a01b03161415611ca8575060015b600b54604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b158015611ced57600080fd5b505afa158015611d01573d6000803e3d6000fd5b505050506040513d6020811015611d1757600080fd5b50519050611d236124d5565b600b54604080516362b939e160e11b8152841515600482015290516001600160a01b039092169163c57273c29160248082019260009290919082900301818387803b158015611d7157600080fd5b505af1158015611d85573d6000803e3d6000fd5b5050505080600b60009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015611dd857600080fd5b505afa158015611dec573d6000803e3d6000fd5b505050506040513d6020811015611e0257600080fd5b505111611e56576040805162461bcd60e51b815260206004820152601d60248201527f4e6f206368616e676520696e2073747261746567792062616c616e6365000000604482015290519081900360640190fd5b6000611e9860098881548110611e6857fe5b906000526020600020906003020160010154600a0a610c03670de0b6b3a76400008b61243a90919063ffffffff16565b9050806000611ea561067a565b1115611eca57611ec787610c03611eba61067a565b859063ffffffff61243a16565b90505b611edb611ed56120f6565b82612d55565b4260086000611ee86120f6565b6001600160a01b03166001600160a01b0316815260200190815260200160002060000181905550611f488160086000611f1f6120f6565b6001600160a01b031681526020810191909152604001600020600101549063ffffffff6123d916565b60086000611f546120f6565b6001600160a01b03168152602081019190915260400160002060010155611f796120f6565b6001600160a01b03167f4700c1726b4198077cd40320a32c45265a1910521eb0ef713dd1d8412413d7fc8a6040518082815260200191505060405180910390a25050600160065550505050505050565b611fd16120f6565b60055461010090046001600160a01b03908116911614612026576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b42600d556002600e55600f80546001600160a01b0383166001600160a01b03199182168117909255600c8054909116909117905561206261067a565b61118757611187610dff565b6120766120f6565b60055461010090046001600160a01b039081169116146120cb576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b42600d556001600e55600f80546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b03831661213f5760405162461bcd60e51b81526004018080602001828103825260248152602001806134e46024913960400191505060405180910390fd5b6001600160a01b0382166121845760405162461bcd60e51b81526004018080602001828103825260228152602001806133156022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661222b5760405162461bcd60e51b81526004018080602001828103825260258152602001806134956025913960400191505060405180910390fd5b6001600160a01b0382166122705760405162461bcd60e51b81526004018080602001828103825260238152602001806132726023913960400191505060405180910390fd5b6122b381604051806060016040528060268152602001613366602691396001600160a01b038616600090815260208190526040902054919063ffffffff61234216565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546122e8908263ffffffff6123d916565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156123d15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561239657818101518382015260200161237e565b50505050905090810190601f1680156123c35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015612433576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261244957506000610674565b8282028284828161245657fe5b04146124335760405162461bcd60e51b81526004018080602001828103825260218152602001806133d76021913960400191505060405180910390fd5b600061243383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e45565b600b546040805163780d9d2d60e01b815290516000926001600160a01b03169163780d9d2d916004808301926020929190829003018186803b15801561251a57600080fd5b505afa15801561252e573d6000803e3d6000fd5b505050506040513d602081101561254457600080fd5b5051905060005b8181101561267557600b5460408051635930a0a160e01b81526004810184905290516000926001600160a01b031691635930a0a1916024808301926020929190829003018186803b15801561259f57600080fd5b505afa1580156125b3573d6000803e3d6000fd5b505050506040513d60208110156125c957600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561261757600080fd5b505afa15801561262b573d6000803e3d6000fd5b505050506040513d602081101561264157600080fd5b50519050801561266b57600b5461266b906001600160a01b0384811691168363ffffffff612eaa16565b505060010161254b565b5050565b6126816120f6565b60055461010090046001600160a01b039081169116146126d6576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b6001600160a01b03811661271b5760405162461bcd60e51b81526004018080602001828103825260268152602001806132ef6026913960400191505060405180910390fd5b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0382166127c75760405162461bcd60e51b81526004018080602001828103825260218152602001806134746021913960400191505060405180910390fd5b61280a816040518060600160405280602281526020016132cd602291396001600160a01b038516600090815260208190526040902054919063ffffffff61234216565b6001600160a01b038316600090815260208190526040902055600254612836908263ffffffff61287e16565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600061243383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612342565b60095460018215151415612a435760005b81811015612a3c576000600982815481106128e857fe5b600091825260209182902060039091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561293c57600080fd5b505afa158015612950573d6000803e3d6000fd5b505050506040513d602081101561296657600080fd5b50511115612a3457612a34856009838154811061297f57fe5b600091825260209182902060039091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156129d357600080fd5b505afa1580156129e7573d6000803e3d6000fd5b505050506040513d60208110156129fd57600080fd5b50516009805485908110612a0d57fe5b60009182526020909120600390910201546001600160a01b0316919063ffffffff612eaa16565b6001016128d1565b5050612cf0565b612a4b613253565b600080612a56612efc565b60005b84811015612cea5760009150815b85811015612acc57848160048110612a7b57fe5b6020020151612ac457600060098281548110612a9357fe5b90600052602060002090600302016002015490508360001480612ab65750838111155b15612ac2578093508194505b505b600101612a67565b506001848460048110612adb57fe5b9115156020909202015260098054600091612bb49186908110612afa57fe5b906000526020600020906003020160010154600a0a610c03670de0b6b3a764000060098881548110612b2857fe5b600091825260209182902060039091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015612b7c57600080fd5b505afa158015612b90573d6000803e3d6000fd5b505050506040513d6020811015612ba657600080fd5b50519063ffffffff61243a16565b9050878111612c79578015612c7457612bd3888263ffffffff61287e16565b9750612c748960098681548110612be657fe5b600091825260209182902060039091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015612c3a57600080fd5b505afa158015612c4e573d6000803e3d6000fd5b505050506040513d6020811015612c6457600080fd5b50516009805488908110612a0d57fe5b612ce1565b8715612cdb576000612cc1670de0b6b3a7640000610c0360098881548110612c9d57fe5b906000526020600020906003020160010154600a0a8c61243a90919063ffffffff16565b905060009850612cd98a8260098881548110612a0d57fe5b505b50612cea565b50600101612a59565b50505050505b505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612d4f908590612fe5565b50505050565b6001600160a01b038216612db0576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612dc3908263ffffffff6123d916565b6002556001600160a01b038216600090815260208190526040902054612def908263ffffffff6123d916565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183612e945760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561239657818101518382015260200161237e565b506000838581612ea057fe5b0495945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612cf0908490612fe5565b60005b60095481101561118757600754600980546000926001600160a01b0316916341976e099185908110612f2d57fe5b60009182526020808320600390920290910154604080516001600160e01b031960e087901b1681526001600160a01b0390921660048301525160248083019491928390030190829087803b158015612f8457600080fd5b505af1158015612f98573d6000803e3d6000fd5b505050506040513d6020811015612fae57600080fd5b505190508015612fdc578060098381548110612fc657fe5b9060005260206000209060030201600201819055505b50600101612eff565b606061303a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130969092919063ffffffff16565b805190915015612cf05780806020019051602081101561305957600080fd5b5051612cf05760405162461bcd60e51b815260040180806020018281038252602a815260200180613546602a913960400191505060405180910390fd5b60606130a584846000856130ad565b949350505050565b60606130b88561321a565b613109576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106131485780518252601f199092019160209182019101613129565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131aa576040519150601f19603f3d011682016040523d82523d6000602084013e6131af565b606091505b509150915081156131c35791506130a59050565b8051156131d35780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561239657818101518382015260200161237e565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906130a5575050151592915050565b6040518060800160405280600490602082028036833750919291505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734465706f736974732068617665206265656e2073757370656e6465642c2062757420796f752063616e207374696c6c20776974686472617745524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373546f6b656e204944206973206f7574736964652072616e6765206f6620746f6b656e7320696e20636f6e747261637445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654661696c656420746f2077697468647261772066726f6d2074686520737472617465677954696d656c6f636b206e6f7420616371756972656420666f7220746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e7472616374206465706f7369746f722063616e6e6f742072656465656d20696e2073616d65207472616e73616374696f6e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734e6f20737472617465677920636f6e747261637420686173206265656e2073656c65637465642079657445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e7472616374206465706f7369746f72732063616e6e6f742074616b65206f7574206d6f7265207468616e207768617420746865792070757420696e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208e948a2b0bcce26275886d6ae593ebc412e92063b525d6ad037caba99c13731c64736f6c63430006060033000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000438462bf1b159c64c05d795b5589435f318c25fc
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80637158da7c1161010f578063b9195072116100a2578063dd62ed3e11610071578063dd62ed3e14610528578063e2bbb15814610556578063f63aeac314610579578063f80087761461059f576101f0565b8063b9195072146104d0578063c650ea59146104d8578063d9a74be014610503578063db006a751461050b576101f0565b80639d63b8f7116100de5780639d63b8f71461044a578063a457c2d714610470578063a4b88e7b1461049c578063a9059cbb146104a4576101f0565b80637158da7c1461042a5780637b1b1de61461043257806383249ef91461043a57806395d89b4114610442576101f0565b8063549c4627116101875780635c27af87116101565780635c27af87146103b85780635cbe86bc146103c05780636d8ac22d146103c857806370a0823114610404576101f0565b8063549c462714610398578063563a7956146103a057806357a53799146103a85780635aa6e675146103b0576101f0565b8063313ce567116101c3578063313ce5671461030257806337c6de961461032057806339509351146103445780633e3bc62314610370576101f0565b806306fdde03146101f5578063095ea7b31461027257806318160ddd146102b257806323b872dd146102cc575b600080fd5b6101fd6105c5565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561023757818101518382015260200161021f565b50505050905090810190601f1680156102645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61029e6004803603604081101561028857600080fd5b506001600160a01b03813516906020013561065c565b604080519115158252519081900360200190f35b6102ba61067a565b60408051918252519081900360200190f35b61029e600480360360608110156102e257600080fd5b506001600160a01b03813581169160208101359091169060400135610680565b61030a61070d565b6040805160ff9092168252519081900360200190f35b610328610716565b604080516001600160a01b039092168252519081900360200190f35b61029e6004803603604081101561035a57600080fd5b506001600160a01b038135169060200135610725565b6103966004803603602081101561038657600080fd5b50356001600160a01b0316610779565b005b61029e610801565b6102ba610811565b6103966108b2565b6103286109df565b6103966109f3565b610396610a65565b6103d0610ad1565b604080516001600160a01b039586168152938516602085015291841683830152909216606082015290519081900360800190f35b6102ba6004803603602081101561041a57600080fd5b50356001600160a01b0316610b91565b610328610bac565b6102ba610bbb565b610328610c16565b6101fd610c25565b6102ba6004803603602081101561046057600080fd5b50356001600160a01b0316610c86565b61029e6004803603604081101561048657600080fd5b506001600160a01b038135169060200135610d91565b610396610dff565b61029e600480360360408110156104ba57600080fd5b506001600160a01b038135169060200135611056565b61039661106a565b6104e061118a565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6103966113ed565b6103966004803603602081101561052157600080fd5b50356114fd565b6102ba6004803603604081101561053e57600080fd5b506001600160a01b0381358116916020013516611992565b6103966004803603604081101561056c57600080fd5b50803590602001356119bd565b6103966004803603602081101561058f57600080fd5b50356001600160a01b0316611fc9565b610396600480360360208110156105b557600080fd5b50356001600160a01b031661206e565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b505050505090505b90565b60006106706106696120f6565b84846120fa565b5060015b92915050565b60025490565b600061068d8484846121e6565b610703846106996120f6565b6106fe856040518060600160405280602881526020016133f8602891396001600160a01b038a166000908152600160205260408120906106d76120f6565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61234216565b6120fa565b5060019392505050565b60055460ff1690565b600c546001600160a01b031690565b60006106706107326120f6565b846106fe85600160006107436120f6565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6123d916565b6107816120f6565b60055461010090046001600160a01b039081169116146107d6576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b42600d556003600e55600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600a54600160a01b900460ff1681565b60008061081d30610c86565b600b549091506001600160a01b0316156108ad57600b60009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561087f57600080fd5b505afa158015610893573d6000803e3d6000fd5b505050506040513d60208110156108a957600080fd5b5051015b905090565b6108ba6120f6565b60055461010090046001600160a01b0390811691161461090f576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b600380600e54146109515760405162461bcd60e51b81526004018080602001828103825260278152602001806133b06027913960400191505060405180910390fd5b6000600e81905561096061067a565b11156109ba5762015180600d54014210156109ba576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b50600f54600780546001600160a01b0319166001600160a01b03909216919091179055565b60055461010090046001600160a01b031690565b6109fb6120f6565b60055461010090046001600160a01b03908116911614610a50576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b600a805460ff60a01b1916600160a01b179055565b610a6d6120f6565b60055461010090046001600160a01b03908116911614610ac2576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b600a805460ff60a01b19169055565b6000806000806009600081548110610ae557fe5b6000918252602090912060039091020154600980546001600160a01b03909216916001908110610b1157fe5b6000918252602090912060039091020154600980546001600160a01b03909216916002908110610b3d57fe5b6000918252602090912060039182020154600980546001600160a01b039092169290918110610b6857fe5b6000918252602090912060039091020154929791965094506001600160a01b0390911692509050565b6001600160a01b031660009081526020819052604090205490565b600a546001600160a01b031690565b6000610bc561067a565b610bd85750670de0b6b3a7640000610659565b610c0f610be361067a565b610c03610bee610811565b670de0b6b3a76400009063ffffffff61243a16565b9063ffffffff61249316565b9050610659565b600b546001600160a01b031690565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106515780601f1061062657610100808354040283529160200191610651565b600080805b600954811015610d8a57600060098281548110610ca457fe5b600091825260209182902060039091020154604080516370a0823160e01b81526001600160a01b038981166004830152915191909216926370a082319260248082019391829003018186803b158015610cfc57600080fd5b505afa158015610d10573d6000803e3d6000fd5b505050506040513d6020811015610d2657600080fd5b505160098054919250610d6d9184908110610d3d57fe5b906000526020600020906003020160010154600a0a610c03670de0b6b3a76400008461243a90919063ffffffff16565b9050610d7f838263ffffffff6123d916565b925050600101610c8b565b5092915050565b6000610670610d9e6120f6565b846106fe856040518060600160405280602581526020016135706025913960016000610dc86120f6565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61234216565b610e076120f6565b60055461010090046001600160a01b03908116911614610e5c576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b600280600e5414610e9e5760405162461bcd60e51b81526004018080602001828103825260278152602001806133b06027913960400191505060405180910390fd5b6000600e819055610ead61067a565b1115610f075762015180600d5401421015610f07576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b600b546001600160a01b031615801590610f2857506000610f2661067a565b115b15610f9657600b60009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610f7d57600080fd5b505af1158015610f91573d6000803e3d6000fd5b505050505b600f54600b80546001600160a01b0319166001600160a01b0392831617908190551615801590610fcd57506000610fcb61067a565b115b1561104357610fda6124d5565b600b60009054906101000a90046001600160a01b03166001600160a01b031663e97dcb626040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561102a57600080fd5b505af115801561103e573d6000803e3d6000fd5b505050505b50600c80546001600160a01b0319169055565b60006106706110636120f6565b84846121e6565b6110726120f6565b60055461010090046001600160a01b039081169116146110c7576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b600180600e54146111095760405162461bcd60e51b81526004018080602001828103825260278152602001806133b06027913960400191505060405180910390fd5b6000600e81905561111861067a565b11156111725762015180600d5401421015611172576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b600f54611187906001600160a01b0316612679565b50565b600b5460009081906001600160a01b03161561121f57600b546040805163c650ea5960e01b815281516001600160a01b039093169263c650ea5992600480840193919291829003018186803b1580156111e257600080fd5b505afa1580156111f6573d6000803e3d6000fd5b505050506040513d604081101561120c57600080fd5b50805160209091015190925090506113e9565b600954600080805b8381101561130c5760006009828154811061123e57fe5b600091825260209182902060039091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561129257600080fd5b505afa1580156112a6573d6000803e3d6000fd5b505050506040513d60208110156112bc57600080fd5b50511115611304576000600982815481106112d357fe5b906000526020600020906003020160020154905082600014806112f65750828111155b15611302578092508193505b505b600101611227565b5080156113d9576009828154811061132057fe5b6000918252602090912060039091020154600980546001600160a01b03909216918490811061134b57fe5b600091825260209182902060039091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561139f57600080fd5b505afa1580156113b3573d6000803e3d6000fd5b505050506040513d60208110156113c957600080fd5b505190955093506113e992505050565b50600093508392506113e9915050565b9091565b6113f56120f6565b60055461010090046001600160a01b0390811691161461144a576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b600a805460ff60a01b19169055600b546001600160a01b0316158015906114785750600061147661067a565b115b156114e657600b60009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114cd57600080fd5b505af11580156114e1573d6000803e3d6000fd5b505050505b600b80546001600160a01b03191690556000600e55565b60026006541415611555576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600655806115a0576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b60006115aa61067a565b116115f2576040805162461bcd60e51b81526020600482015260136024820152724e6f2076616c75652072656465656d61626c6560681b604482015290519081900360640190fd5b60006115fc61067a565b905061160f6116096120f6565b83612782565b60006116196120f6565b6001600160a01b0316326001600160a01b0316141561163a575060016116ce565b42600860006116476120f6565b6001600160a01b0316815260208101919091526040016000205410801561169357506000600860006116776120f6565b6001600160a01b03168152602081019190915260400160002054115b6116ce5760405162461bcd60e51b81526004018080602001828103825260348152602001806134406034913960400191505060405180910390fd5b600860006116da6120f6565b6001600160a01b03166001600160a01b0316815260200190815260200160002060010154831161176b5761173d83600860006117146120f6565b6001600160a01b031681526020810191909152604001600020600101549063ffffffff61287e16565b600860006117496120f6565b6001600160a01b031681526020810191909152604001600020600101556117da565b6000600860006117796120f6565b6001600160a01b031681526020810191909152604001600020600190810191909155811515146117da5760405162461bcd60e51b815260040180806020018281038252603e815260200180613508603e913960400191505060405180910390fd5b600b546000906001600160a01b0316156118d357600b546001600160a01b031663234b67456118076120f6565b604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482018890526044820187905285151560648301525160848083019260209291908290030181600087803b15801561186457600080fd5b505af1158015611878573d6000803e3d6000fd5b505050506040513d602081101561188e57600080fd5b50519050806118ce5760405162461bcd60e51b815260040180806020018281038252602481526020018061338c6024913960400191505060405180910390fd5b61193f565b8284101561191c5760006118e630610c86565b905060006118fe85610c03848963ffffffff61243a16565b905061191361190b6120f6565b8260006128c0565b915061193f9050565b600061192730610c86565b905061193c6119346120f6565b8260016128c0565b90505b6119476120f6565b6001600160a01b03167f95ae649bfaaef9def56a52f4fb2d9e8fa5496bb7082930e442c74cc76b03dcb3826040518082815260200191505060405180910390a2505060016006555050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60026006541415611a15576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026006556000611a24610811565b600a54909150600160a01b900460ff161515600114611a745760405162461bcd60e51b81526004018080602001828103825260388152602001806132956038913960400191505060405180910390fd5b600b546001600160a01b0316611abb5760405162461bcd60e51b815260040180806020018281038252602a8152602001806134ba602a913960400191505060405180910390fd5b6009548210611afb5760405162461bcd60e51b815260040180806020018281038252602f815260200180613337602f913960400191505060405180910390fd5b600060098381548110611b0a57fe5b60009182526020808320600390920290910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b158015611b6257600080fd5b505afa158015611b76573d6000803e3d6000fd5b505050506040513d6020811015611b8c57600080fd5b50519050611bb3611b9b6120f6565b6001600160a01b03841690308863ffffffff612cf516565b604080516370a0823160e01b81523060048201529051611c379183916001600160a01b038616916370a08231916024808301926020929190829003018186803b158015611bff57600080fd5b505afa158015611c13573d6000803e3d6000fd5b505050506040513d6020811015611c2957600080fd5b50519063ffffffff61287e16565b945060008511611c81576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6000611c8b6120f6565b6001600160a01b0316326001600160a01b03161415611ca8575060015b600b54604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b158015611ced57600080fd5b505afa158015611d01573d6000803e3d6000fd5b505050506040513d6020811015611d1757600080fd5b50519050611d236124d5565b600b54604080516362b939e160e11b8152841515600482015290516001600160a01b039092169163c57273c29160248082019260009290919082900301818387803b158015611d7157600080fd5b505af1158015611d85573d6000803e3d6000fd5b5050505080600b60009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015611dd857600080fd5b505afa158015611dec573d6000803e3d6000fd5b505050506040513d6020811015611e0257600080fd5b505111611e56576040805162461bcd60e51b815260206004820152601d60248201527f4e6f206368616e676520696e2073747261746567792062616c616e6365000000604482015290519081900360640190fd5b6000611e9860098881548110611e6857fe5b906000526020600020906003020160010154600a0a610c03670de0b6b3a76400008b61243a90919063ffffffff16565b9050806000611ea561067a565b1115611eca57611ec787610c03611eba61067a565b859063ffffffff61243a16565b90505b611edb611ed56120f6565b82612d55565b4260086000611ee86120f6565b6001600160a01b03166001600160a01b0316815260200190815260200160002060000181905550611f488160086000611f1f6120f6565b6001600160a01b031681526020810191909152604001600020600101549063ffffffff6123d916565b60086000611f546120f6565b6001600160a01b03168152602081019190915260400160002060010155611f796120f6565b6001600160a01b03167f4700c1726b4198077cd40320a32c45265a1910521eb0ef713dd1d8412413d7fc8a6040518082815260200191505060405180910390a25050600160065550505050505050565b611fd16120f6565b60055461010090046001600160a01b03908116911614612026576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b42600d556002600e55600f80546001600160a01b0383166001600160a01b03199182168117909255600c8054909116909117905561206261067a565b61118757611187610dff565b6120766120f6565b60055461010090046001600160a01b039081169116146120cb576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b42600d556001600e55600f80546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b03831661213f5760405162461bcd60e51b81526004018080602001828103825260248152602001806134e46024913960400191505060405180910390fd5b6001600160a01b0382166121845760405162461bcd60e51b81526004018080602001828103825260228152602001806133156022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661222b5760405162461bcd60e51b81526004018080602001828103825260258152602001806134956025913960400191505060405180910390fd5b6001600160a01b0382166122705760405162461bcd60e51b81526004018080602001828103825260238152602001806132726023913960400191505060405180910390fd5b6122b381604051806060016040528060268152602001613366602691396001600160a01b038616600090815260208190526040902054919063ffffffff61234216565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546122e8908263ffffffff6123d916565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156123d15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561239657818101518382015260200161237e565b50505050905090810190601f1680156123c35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015612433576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261244957506000610674565b8282028284828161245657fe5b04146124335760405162461bcd60e51b81526004018080602001828103825260218152602001806133d76021913960400191505060405180910390fd5b600061243383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e45565b600b546040805163780d9d2d60e01b815290516000926001600160a01b03169163780d9d2d916004808301926020929190829003018186803b15801561251a57600080fd5b505afa15801561252e573d6000803e3d6000fd5b505050506040513d602081101561254457600080fd5b5051905060005b8181101561267557600b5460408051635930a0a160e01b81526004810184905290516000926001600160a01b031691635930a0a1916024808301926020929190829003018186803b15801561259f57600080fd5b505afa1580156125b3573d6000803e3d6000fd5b505050506040513d60208110156125c957600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561261757600080fd5b505afa15801561262b573d6000803e3d6000fd5b505050506040513d602081101561264157600080fd5b50519050801561266b57600b5461266b906001600160a01b0384811691168363ffffffff612eaa16565b505060010161254b565b5050565b6126816120f6565b60055461010090046001600160a01b039081169116146126d6576040805162461bcd60e51b81526020600482018190526024820152600080516020613420833981519152604482015290519081900360640190fd5b6001600160a01b03811661271b5760405162461bcd60e51b81526004018080602001828103825260268152602001806132ef6026913960400191505060405180910390fd5b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0382166127c75760405162461bcd60e51b81526004018080602001828103825260218152602001806134746021913960400191505060405180910390fd5b61280a816040518060600160405280602281526020016132cd602291396001600160a01b038516600090815260208190526040902054919063ffffffff61234216565b6001600160a01b038316600090815260208190526040902055600254612836908263ffffffff61287e16565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600061243383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612342565b60095460018215151415612a435760005b81811015612a3c576000600982815481106128e857fe5b600091825260209182902060039091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561293c57600080fd5b505afa158015612950573d6000803e3d6000fd5b505050506040513d602081101561296657600080fd5b50511115612a3457612a34856009838154811061297f57fe5b600091825260209182902060039091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156129d357600080fd5b505afa1580156129e7573d6000803e3d6000fd5b505050506040513d60208110156129fd57600080fd5b50516009805485908110612a0d57fe5b60009182526020909120600390910201546001600160a01b0316919063ffffffff612eaa16565b6001016128d1565b5050612cf0565b612a4b613253565b600080612a56612efc565b60005b84811015612cea5760009150815b85811015612acc57848160048110612a7b57fe5b6020020151612ac457600060098281548110612a9357fe5b90600052602060002090600302016002015490508360001480612ab65750838111155b15612ac2578093508194505b505b600101612a67565b506001848460048110612adb57fe5b9115156020909202015260098054600091612bb49186908110612afa57fe5b906000526020600020906003020160010154600a0a610c03670de0b6b3a764000060098881548110612b2857fe5b600091825260209182902060039091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015612b7c57600080fd5b505afa158015612b90573d6000803e3d6000fd5b505050506040513d6020811015612ba657600080fd5b50519063ffffffff61243a16565b9050878111612c79578015612c7457612bd3888263ffffffff61287e16565b9750612c748960098681548110612be657fe5b600091825260209182902060039091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015612c3a57600080fd5b505afa158015612c4e573d6000803e3d6000fd5b505050506040513d6020811015612c6457600080fd5b50516009805488908110612a0d57fe5b612ce1565b8715612cdb576000612cc1670de0b6b3a7640000610c0360098881548110612c9d57fe5b906000526020600020906003020160010154600a0a8c61243a90919063ffffffff16565b905060009850612cd98a8260098881548110612a0d57fe5b505b50612cea565b50600101612a59565b50505050505b505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612d4f908590612fe5565b50505050565b6001600160a01b038216612db0576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612dc3908263ffffffff6123d916565b6002556001600160a01b038216600090815260208190526040902054612def908263ffffffff6123d916565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183612e945760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561239657818101518382015260200161237e565b506000838581612ea057fe5b0495945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612cf0908490612fe5565b60005b60095481101561118757600754600980546000926001600160a01b0316916341976e099185908110612f2d57fe5b60009182526020808320600390920290910154604080516001600160e01b031960e087901b1681526001600160a01b0390921660048301525160248083019491928390030190829087803b158015612f8457600080fd5b505af1158015612f98573d6000803e3d6000fd5b505050506040513d6020811015612fae57600080fd5b505190508015612fdc578060098381548110612fc657fe5b9060005260206000209060030201600201819055505b50600101612eff565b606061303a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130969092919063ffffffff16565b805190915015612cf05780806020019051602081101561305957600080fd5b5051612cf05760405162461bcd60e51b815260040180806020018281038252602a815260200180613546602a913960400191505060405180910390fd5b60606130a584846000856130ad565b949350505050565b60606130b88561321a565b613109576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106131485780518252601f199092019160209182019101613129565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131aa576040519150601f19603f3d011682016040523d82523d6000602084013e6131af565b606091505b509150915081156131c35791506130a59050565b8051156131d35780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561239657818101518382015260200161237e565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906130a5575050151592915050565b6040518060800160405280600490602082028036833750919291505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734465706f736974732068617665206265656e2073757370656e6465642c2062757420796f752063616e207374696c6c20776974686472617745524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373546f6b656e204944206973206f7574736964652072616e6765206f6620746f6b656e7320696e20636f6e747261637445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654661696c656420746f2077697468647261772066726f6d2074686520737472617465677954696d656c6f636b206e6f7420616371756972656420666f7220746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e7472616374206465706f7369746f722063616e6e6f742072656465656d20696e2073616d65207472616e73616374696f6e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734e6f20737472617465677920636f6e747261637420686173206265656e2073656c65637465642079657445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e7472616374206465706f7369746f72732063616e6e6f742074616b65206f7574206d6f7265207468616e207768617420746865792070757420696e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208e948a2b0bcce26275886d6ae593ebc412e92063b525d6ad037caba99c13731c64736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000438462bf1b159c64c05d795b5589435f318c25fc
-----Decoded View---------------
Arg [0] : _priceAsset (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [1] : _oracle (address): 0x438462BF1B159c64C05d795b5589435f318c25fC
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [1] : 000000000000000000000000438462bf1b159c64c05d795b5589435f318c25fc
Deployed Bytecode Sourcemap
33262:17877:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33262:17877:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;17524:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;17524:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19604:169;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;19604:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;18593:100;;;:::i;:::-;;;;;;;;;;;;;;;;20242:321;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;20242:321:0;;;;;;;;;;;;;;;;;:::i;18441:92::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36303:104;;;:::i;:::-;;;;-1:-1:-1;;;;;36303:104:0;;;;;;;;;;;;;;20967:218;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;20967:218:0;;;;;;;;:::i;50754:180::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50754:180:0;-1:-1:-1;;;;;50754:180:0;;:::i;:::-;;34326:31;;;:::i;37626:400::-;;;:::i;50946:159::-;;;:::i;26473:84::-;;;:::i;47045:87::-;;;:::i;46950:::-;;;:::i;36592:297::-;;;:::i;:::-;;;;-1:-1:-1;;;;;36592:297:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:119;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18751:119:0;-1:-1:-1;;;;;18751:119:0;;:::i;36415:165::-;;;:::i;36901:262::-;;;:::i;36179:112::-;;;:::i;17721:87::-;;;:::i;37175:439::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37175:439:0;-1:-1:-1;;;;;37175:439:0;;:::i;21683:269::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;21683:269:0;;;;;;;;:::i;49469:693::-;;;:::i;19078:175::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;19078:175:0;;;;;;;;:::i;48847:139::-;;;:::i;38038:1075::-;;;:::i;:::-;;;;-1:-1:-1;;;;;38038:1075:0;;;;;;;;;;;;;;;;;;;;;47286:447;;;:::i;41785:2610::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41785:2610:0;;:::i;19311:151::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;19311:151:0;;;;;;;;;;:::i;39475:2298::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39475:2298:0;;;;;;;:::i;49098:359::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49098:359:0;-1:-1:-1;;;;;49098:359:0;;:::i;48649:186::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48649:186:0;-1:-1:-1;;;;;48649:186:0;;:::i;17524:83::-;17594:5;17587:12;;;;;;;;-1:-1:-1;;17587:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17561:13;;17587:12;;17594:5;;17587:12;;17594:5;17587:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17524:83;;:::o;19604:169::-;19687:4;19704:39;19713:12;:10;:12::i;:::-;19727:7;19736:6;19704:8;:39::i;:::-;-1:-1:-1;19761:4:0;19604:169;;;;;:::o;18593:100::-;18673:12;;18593:100;:::o;20242:321::-;20348:4;20365:36;20375:6;20383:9;20394:6;20365:9;:36::i;:::-;20412:121;20421:6;20429:12;:10;:12::i;:::-;20443:89;20481:6;20443:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20443:19:0;;;;;;:11;:19;;;;;;20463:12;:10;:12::i;:::-;-1:-1:-1;;;;;20443:33:0;;;;;;;;;;;;-1:-1:-1;20443:33:0;;;:89;;:37;:89;:::i;:::-;20412:8;:121::i;:::-;-1:-1:-1;20551:4:0;20242:321;;;;;:::o;18441:92::-;18516:9;;;;18441:92;:::o;36303:104::-;36383:16;;-1:-1:-1;;;;;36383:16:0;36303:104;:::o;20967:218::-;21055:4;21072:83;21081:12;:10;:12::i;:::-;21095:7;21104:50;21143:10;21104:11;:25;21116:12;:10;:12::i;:::-;-1:-1:-1;;;;;21104:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21104:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;50754:180::-;26700:12;:10;:12::i;:::-;26690:6;;;;;-1:-1:-1;;;;;26690:6:0;;;:22;;;26682:67;;;;;-1:-1:-1;;;26682:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26682:67:0;;;;;;;;;;;;;;;50856:3:::1;50839:14;:20:::0;50886:1:::1;50870:13;:17:::0;50898::::1;:28:::0;;-1:-1:-1;;;;;;50898:28:0::1;-1:-1:-1::0;;;;;50898:28:0;;;::::1;::::0;;;::::1;::::0;;50754:180::o;34326:31::-;;;-1:-1:-1;;;34326:31:0;;;;;:::o;37626:400::-;37682:7;37735:15;37753:40;37787:4;37753:25;:40::i;:::-;37845:15;;37735:58;;-1:-1:-1;;;;;;37845:15:0;:48;37842:152;;37920:15;;;;;;;;;-1:-1:-1;;;;;37920:15:0;-1:-1:-1;;;;;37920:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37920:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37920:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37920:25:0;37909:36;37842:152;38011:7;-1:-1:-1;37626:400:0;:::o;50946:159::-;26700:12;:10;:12::i;:::-;26690:6;;;;;-1:-1:-1;;;;;26690:6:0;;;:22;;;26682:67;;;;;-1:-1:-1;;;26682:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26682:67:0;;;;;;;;;;;;;;;51027:1:::1;48226:5;48209:13;;:22;48201:74;;;;-1:-1:-1::0;;;48201:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48302:1;48286:13;:17:::0;;;48361:13:::1;:11;:13::i;:::-;:17;48358:184;;;48020:5;48470:14;;:34;48463:3;:41;;48455:75;;;::::0;;-1:-1:-1;;;48455:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48455:75:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;51079:17:0::2;::::0;51041:14:::2;:56:::0;;-1:-1:-1;;;;;;51041:56:0::2;-1:-1:-1::0;;;;;51079:17:0;;::::2;51041:56:::0;;;::::2;::::0;;50946:159::o;26473:84::-;26543:6;;;;;-1:-1:-1;;;;;26543:6:0;;26473:84::o;47045:87::-;26700:12;:10;:12::i;:::-;26690:6;;;;;-1:-1:-1;;;;;26690:6:0;;;:22;;;26682:67;;;;;-1:-1:-1;;;26682:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26682:67:0;;;;;;;;;;;;;;;47105:12:::1;:19:::0;;-1:-1:-1;;;;47105:19:0::1;-1:-1:-1::0;;;47105:19:0::1;::::0;;47045:87::o;46950:::-;26700:12;:10;:12::i;:::-;26690:6;;;;;-1:-1:-1;;;;;26690:6:0;;;:22;;;26682:67;;;;;-1:-1:-1;;;26682:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26682:67:0;;;;;;;;;;;;;;;47009:12:::1;:20:::0;;-1:-1:-1;;;;47009:20:0::1;::::0;;46950:87::o;36592:297::-;36648:7;36657;36666;36675;36774:9;36784:1;36774:12;;;;;;;;;;;;;;;;;;;;;:18;36803:9;:12;;-1:-1:-1;;;;;36774:18:0;;;;;;36803:12;;;;;;;;;;;;;;;;;;;:18;36832:9;:12;;-1:-1:-1;;;;;36803:18:0;;;;36842:1;;36832:12;;;;;;;;;;;;;;;;;;;:18;36861:9;:12;;-1:-1:-1;;;;;36832:18:0;;;;36861:9;;:12;;;;;;;;;;;;;;;;;;;:18;36758:123;;;;-1:-1:-1;36758:123:0;-1:-1:-1;;;;;;36861:18:0;;;;-1:-1:-1;36592:297:0;-1:-1:-1;36592:297:0:o;18751:119::-;-1:-1:-1;;;;;18844:18:0;18817:7;18844:18;;;;;;;;;;;;18751:119::o;36415:165::-;36550:21;;-1:-1:-1;;;;;36550:21:0;36415:165;:::o;36901:262::-;36947:7;36970:13;:11;:13::i;:::-;36967:189;;-1:-1:-1;37011:4:0;37004:11;;36967:189;37075:63;37124:13;:11;:13::i;:::-;37075:44;37093:25;:23;:25::i;:::-;37083:4;;37075:44;:17;:44;:::i;:::-;:48;:63;:48;:63;:::i;:::-;37068:70;;;;36179:112;36267:15;;-1:-1:-1;;;;;36267:15:0;36179:112;:::o;17721:87::-;17793:7;17786:14;;;;;;;;-1:-1:-1;;17786:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17760:13;;17786:14;;17793:7;;17786:14;;17793:7;17786:14;;;;;;;;;;;;;;;;;;;;;;;;37175:439;37249:7;;;37300:281;37323:9;:16;37319:20;;37300:281;;;37360:12;37375:9;37385:1;37375:12;;;;;;;;;;;;;;;;;;;;;;:18;:38;;;-1:-1:-1;;;37375:38:0;;-1:-1:-1;;;;;37375:38:0;;;;;;;;;:18;;;;;:28;;:38;;;;;;;;;;;:18;:38;;;2:2:-1;;;;27:1;24;17:12;2:2;37375:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37375:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37375:38:0;37458:9;:12;;37375:38;;-1:-1:-1;37435:45:0;;37468:1;;37458:12;;;;;;;;;;;;;;;;:21;;;37454:2;:25;37435:14;37444:4;37435;:8;;:14;;;;:::i;:45::-;37428:52;-1:-1:-1;37506:18:0;:8;37428:52;37506:18;:12;:18;:::i;:::-;37495:29;-1:-1:-1;;37341:3:0;;37300:281;;;-1:-1:-1;37598:8:0;37175:439;-1:-1:-1;;37175:439:0:o;21683:269::-;21776:4;21793:129;21802:12;:10;:12::i;:::-;21816:7;21825:96;21864:15;21825:96;;;;;;;;;;;;;;;;;:11;:25;21837:12;:10;:12::i;:::-;-1:-1:-1;;;;;21825:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21825:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;49469:693::-;26700:12;:10;:12::i;:::-;26690:6;;;;;-1:-1:-1;;;;;26690:6:0;;;:22;;;26682:67;;;;;-1:-1:-1;;;26682:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26682:67:0;;;;;;;;;;;;;;;49545:1:::1;48226:5;48209:13;;:22;48201:74;;;;-1:-1:-1::0;;;48201:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48302:1;48286:13;:17:::0;;;48361:13:::1;:11;:13::i;:::-;:17;48358:184;;;48020:5;48470:14;;:34;48463:3;:41;;48455:75;;;::::0;;-1:-1:-1;;;48455:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48455:75:0;;;;;;;;;;;;;::::1;;49562:15:::2;::::0;-1:-1:-1;;;;;49562:15:0::2;:48:::0;;::::2;::::0;:69:::2;;;49630:1;49614:13;:11;:13::i;:::-;:17;49562:69;49559:186;;;49647:15;;;;;;;;;-1:-1:-1::0;;;;;49647:15:0::2;-1:-1:-1::0;;;;;49647:20:0::2;;:22;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;49647:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;49647:22:0;;;;49559:186;49791:17;::::0;49755:15:::2;:54:::0;;-1:-1:-1;;;;;;49755:54:0::2;-1:-1:-1::0;;;;;49791:17:0;;::::2;49755:54;::::0;;;;49823:15:::2;:48:::0;;::::2;::::0;:69:::2;;;49891:1;49875:13;:11;:13::i;:::-;:17;49823:69;49820:295;;;49908:22;:20;:22::i;:::-;50013:15;;;;;;;;;-1:-1:-1::0;;;;;50013:15:0::2;-1:-1:-1::0;;;;;50013:21:0::2;;:23;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;50013:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;50013:23:0;;;;49820:295;-1:-1:-1::0;50125:16:0::2;:29:::0;;-1:-1:-1;;;;;;50125:29:0::2;::::0;;49469:693::o;19078:175::-;19164:4;19181:42;19191:12;:10;:12::i;:::-;19205:9;19216:6;19181:9;:42::i;48847:139::-;26700:12;:10;:12::i;:::-;26690:6;;;;;-1:-1:-1;;;;;26690:6:0;;;:22;;;26682:67;;;;;-1:-1:-1;;;26682:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26682:67:0;;;;;;;;;;;;;;;48927:1:::1;48226:5;48209:13;;:22;48201:74;;;;-1:-1:-1::0;;;48201:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48302:1;48286:13;:17:::0;;;48361:13:::1;:11;:13::i;:::-;:17;48358:184;;;48020:5;48470:14;;:34;48463:3;:41;;48455:75;;;::::0;;-1:-1:-1;;;48455:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48455:75:0;;;;;;;;;;;;;::::1;;48960:17:::2;::::0;48941:37:::2;::::0;-1:-1:-1;;;;;48960:17:0::2;48941:18;:37::i;:::-;26760:1:::1;48847:139::o:0;38038:1075::-;38220:15;;38092:7;;;;-1:-1:-1;;;;;38220:15:0;:48;38217:889;;38291:15;;:39;;;-1:-1:-1;;;38291:39:0;;;;-1:-1:-1;;;;;38291:15:0;;;;:37;;:39;;;;;;;;;;;;;:15;:39;;;2:2:-1;;;;27:1;24;17:12;2:2;38291:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38291:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38291:39:0;;;;;;;;;-1:-1:-1;38291:39:0;-1:-1:-1;38284:46:0;;38217:889;38378:9;:16;38361:14;;;38482:375;38505:6;38501:1;:10;38482:375;;;38585:1;38539:9;38549:1;38539:12;;;;;;;;;;;;;;;;;;;;;;:18;:43;;;-1:-1:-1;;;38539:43:0;;38576:4;38539:43;;;;;;-1:-1:-1;;;;;38539:18:0;;;;:28;;:43;;;;;;;;;;:18;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;38539:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38539:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38539:43:0;:47;38536:306;;;38610:14;38627:9;38637:1;38627:12;;;;;;;;;;;;;;;;;;:18;;;38610:35;;38671:11;38686:1;38671:16;:41;;;;38701:11;38691:6;:21;;38671:41;38668:155;;;38754:6;38740:20;;38798:1;38787:12;;38668:155;38536:306;;38513:3;;38482:375;;;-1:-1:-1;38874:15:0;;38871:224;;38925:9;38935:8;38925:19;;;;;;;;;;;;;;;;;;;;;:25;38953:9;:19;;-1:-1:-1;;;;;38925:25:0;;;;38963:8;;38953:19;;;;;;;;;;;;;;;;;;;;:25;:50;;;-1:-1:-1;;;38953:50:0;;38997:4;38953:50;;;;;;-1:-1:-1;;;;;38953:25:0;;;;:35;;:50;;;;;;;;;;:25;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;38953:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38953:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38953:50:0;38909:95;;-1:-1:-1;38953:50:0;-1:-1:-1;38909:95:0;;-1:-1:-1;;;38909:95:0;38871:224;-1:-1:-1;39059:1:0;;-1:-1:-1;39059:1:0;;-1:-1:-1;39043:22:0;;-1:-1:-1;;39043:22:0;38217:889;38038:1075;;:::o;47286:447::-;26700:12;:10;:12::i;:::-;26690:6;;;;;-1:-1:-1;;;;;26690:6:0;;;:22;;;26682:67;;;;;-1:-1:-1;;;26682:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26682:67:0;;;;;;;;;;;;;;;47354:12:::1;:20:::0;;-1:-1:-1;;;;47354:20:0::1;::::0;;47388:15:::1;::::0;-1:-1:-1;;;;;47388:15:0::1;:48:::0;;::::1;::::0;:69:::1;;;47456:1;47440:13;:11;:13::i;:::-;:17;47388:69;47385:186;;;47473:15;;;;;;;;;-1:-1:-1::0;;;;;47473:15:0::1;-1:-1:-1::0;;;;;47473:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;47473:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;47473:22:0;;;;47385:186;47581:15;:47:::0;;-1:-1:-1;;;;;;47581:47:0::1;::::0;;47625:1:::1;47639:13;:17:::0;47286:447::o;41785:2610::-;31218:1;31824:7;;:19;;31816:63;;;;;-1:-1:-1;;;31816:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31218:1;31957:7;:18;42057:9;42049:39:::1;;;::::0;;-1:-1:-1;;;42049:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42049:39:0;;;;;;;;;;;;;::::1;;42123:1;42107:13;:11;:13::i;:::-;:17;42099:49;;;::::0;;-1:-1:-1;;;42099:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42099:49:0;;;;;;;;;;;;;::::1;;42159:18;42180:13;:11;:13::i;:::-;42159:34;;42235:25;42241:12;:10;:12::i;:::-;42254:5;42235;:25::i;:::-;42339:16;42390:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;42377:25:0::1;:9;-1:-1:-1::0;;;;;42377:25:0::1;;42374:366;;;-1:-1:-1::0;42432:4:0::1;42374:366;;;42626:3;42589:8;:22;42598:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;42589:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;42589:22:0;:34;:40:::1;:82:::0;::::1;;;;42670:1;42633:8;:22;42642:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;42633:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;42633:22:0;:34;:38:::1;42589:82;42581:147;;;;-1:-1:-1::0;;;42581:147:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42808:8;:22;42817:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;42808:22:0::1;-1:-1:-1::0;;;;;42808:22:0::1;;;;;;;;;;;;:36;;;42799:5;:45;42796:437;;42899:47;42940:5;42899:8;:22;42908:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;42899:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;42899:22:0;:36:::1;;::::0;;:47:::1;:40;:47;:::i;:::-;42860:8;:22;42869:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;42860:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;42860:22:0;:36:::1;;:86:::0;42796:437:::1;;;43111:1;43072:8;:22;43081:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;43072:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;43072:22:0;:36:::1;::::0;;::::1;:40:::0;;;;43135:19;::::1;;;43127:94;;;;-1:-1:-1::0;;;43127:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43285:15;::::0;43245:22:::1;::::0;-1:-1:-1;;;;;43285:15:0::1;:48:::0;43282:1041:::1;;43366:15;::::0;-1:-1:-1;;;;;43366:15:0::1;:24;43391:12;:10;:12::i;:::-;43366:70;::::0;;-1:-1:-1;;;;;;43366:70:0::1;::::0;;;;;;-1:-1:-1;;;;;43366:70:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;::::1;;::::0;;;;;;;;;;::::1;::::0;;;;;;;;-1:-1:-1;43366:70:0;;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;43366:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43366:70:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;43366:70:0;;-1:-1:-1;43503:18:0;43495:67:::1;;;;-1:-1:-1::0;;;43495:67:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43282:1041;;;43716:10;43708:5;:18;43705:607;;;43746:16;43765:40;43799:4;43765:25;:40::i;:::-;43746:59:::0;-1:-1:-1;43824:18:0::1;43845:35;43869:10:::0;43845:19:::1;43746:59:::0;43858:5;43845:19:::1;:12;:19;:::i;:35::-;43824:56;;43899:49;43916:12;:10;:12::i;:::-;43930:10;43942:5;43899:16;:49::i;:::-;44027:10:::0;-1:-1:-1;43705:607:0::1;::::0;-1:-1:-1;43705:607:0::1;;44128:16;44147:40;44181:4;44147:25;:40::i;:::-;44128:59;;44206:46;44223:12;:10;:12::i;:::-;44237:8;44247:4;44206:16;:46::i;:::-;44288:8:::0;-1:-1:-1;43705:607:0::1;44358:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;44348:39:0::1;;44372:14;44348:39;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;31174:1:0;32136:7;:22;-1:-1:-1;;41785:2610:0:o;19311:151::-;-1:-1:-1;;;;;19427:18:0;;;19400:7;19427:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19311:151::o;39475:2298::-;31218:1;31824:7;;:19;;31816:63;;;;;-1:-1:-1;;;31816:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31218:1;31957:7;:18;39557:13:::1;39573:25;:23;:25::i;:::-;39686:12;::::0;39557:41;;-1:-1:-1;;;;39686:12:0;::::1;;;:20;;39702:4;39686:20;39678:89;;;;-1:-1:-1::0;;;39678:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39786:15;::::0;-1:-1:-1;;;;;39786:15:0::1;39778:102;;;;-1:-1:-1::0;;;39778:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39910:9;:16:::0;39899:27;::::1;39891:87;;;;-1:-1:-1::0;;;39891:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39999:13;40015:9;40025:8;40015:19;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;:25:::0;40087:31:::1;::::0;;-1:-1:-1;;;40087:31:0;;40112:4:::1;40087:31;::::0;::::1;::::0;;;-1:-1:-1;;;;;40015:25:0;;::::1;::::0;-1:-1:-1;40015:25:0;;40087:16:::1;::::0;:31;;;;;;;;;;40015:25;40087:31;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;40087:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40087:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;40087:31:0;;-1:-1:-1;40129:60:0::1;40153:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;40129:23:0;::::1;::::0;40175:4:::1;40182:6:::0;40129:60:::1;:23;:60;:::i;:::-;40243:31;::::0;;-1:-1:-1;;;40243:31:0;;40268:4:::1;40243:31;::::0;::::1;::::0;;;:44:::1;::::0;40279:7;;-1:-1:-1;;;;;40243:16:0;::::1;::::0;::::1;::::0;:31;;;;;::::1;::::0;;;;;;;;:16;:31;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;40243:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40243:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;40243:31:0;;:44:::1;:35;:44;:::i;:::-;40234:53;;40371:1;40362:6;:10;40354:39;;;::::0;;-1:-1:-1;;;40354:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40354:39:0;;;;;;;;;;;;;::::1;;40404:16;40455:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;40442:25:0::1;:9;-1:-1:-1::0;;;;;40442:25:0::1;;40439:143;;;-1:-1:-1::0;40497:4:0::1;40439:143;40619:15;::::0;:25:::1;::::0;;-1:-1:-1;;;40619:25:0;;;;40592:24:::1;::::0;-1:-1:-1;;;;;40619:15:0::1;::::0;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:25;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;40619:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40619:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;40619:25:0;;-1:-1:-1;40772:22:0::1;:20;:22::i;:::-;40856:15;::::0;:36:::1;::::0;;-1:-1:-1;;;40856:36:0;;;::::1;;;::::0;::::1;::::0;;;-1:-1:-1;;;;;40856:15:0;;::::1;::::0;:23:::1;::::0;:36;;;;;:15:::1;::::0;:36;;;;;;;;:15;;:36;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;40856:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40856:36:0;;;;40968:16;40940:15;;;;;;;;;-1:-1:-1::0;;;;;40940:15:0::1;-1:-1:-1::0;;;;;40940:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40940:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40940:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;40940:25:0;:44:::1;40932:86;;;::::0;;-1:-1:-1;;;40932:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41056:24;41083:54;41108:9;41118:8;41108:19;;;;;;;;;;;;;;;;;;:28;;;41104:2;:32;41083:16;41094:4;41083:6;:10;;:16;;;;:::i;:54::-;41056:81:::0;-1:-1:-1;41056:81:0;41186:18:::1;41237:13;:11;:13::i;:::-;:17;41234:202;;;41352:46;41392:5;41352:35;41373:13;:11;:13::i;:::-;41352:16:::0;;:35:::1;:20;:35;:::i;:46::-;41339:59;;41234:202;41446:30;41452:12;:10;:12::i;:::-;41465:10;41446:5;:30::i;:::-;41613:3;41576:8;:22;41585:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41576:22:0::1;-1:-1:-1::0;;;;;41576:22:0::1;;;;;;;;;;;;:34;;:40;;;;41666:52;41707:10;41666:8;:22;41675:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41666:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41666:22:0;:36:::1;;::::0;;:52:::1;:40;:52;:::i;:::-;41627:8;:22;41636:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41627:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41627:22:0;:36:::1;;:91:::0;41744:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;41736:29:0::1;;41758:6;41736:29;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;31174:1:0;32136:7;:22;-1:-1:-1;;;;;;;39475:2298:0:o;49098:359::-;26700:12;:10;:12::i;:::-;26690:6;;;;;-1:-1:-1;;;;;26690:6:0;;;:22;;;26682:67;;;;;-1:-1:-1;;;26682:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26682:67:0;;;;;;;;;;;;;;;49197:3:::1;49180:14;:20:::0;49227:1:::1;49211:13;:17:::0;49239::::1;:28:::0;;-1:-1:-1;;;;;49239:28:0;::::1;-1:-1:-1::0;;;;;;49239:28:0;;::::1;::::0;::::1;::::0;;;49278:16:::1;:27:::0;;;;::::1;::::0;;::::1;::::0;;49319:13:::1;:11;:13::i;:::-;49316:134;;49416:22;:20;:22::i;48649:186::-:0;26700:12;:10;:12::i;:::-;26690:6;;;;;-1:-1:-1;;;;;26690:6:0;;;:22;;;26682:67;;;;;-1:-1:-1;;;26682:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26682:67:0;;;;;;;;;;;;;;;48750:3:::1;48733:14;:20:::0;48780:1:::1;48764:13;:17:::0;48792::::1;:28:::0;;-1:-1:-1;;;;;;48792:28:0::1;-1:-1:-1::0;;;;;48792:28:0;;;::::1;::::0;;;::::1;::::0;;48649:186::o;650:106::-;738:10;650:106;:::o;24626:346::-;-1:-1:-1;;;;;24728:19:0;;24720:68;;;;-1:-1:-1;;;24720:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24807:21:0;;24799:68;;;;-1:-1:-1;;;24799:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24880:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24932:32;;;;;;;;;;;;;;;;;24626:346;;;:::o;22437:479::-;-1:-1:-1;;;;;22543:20:0;;22535:70;;;;-1:-1:-1;;;22535:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22624:23:0;;22616:71;;;;-1:-1:-1;;;22616:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22720;22742:6;22720:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22720:17:0;;:9;:17;;;;;;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;22700:17:0;;;:9;:17;;;;;;;;;;;:91;;;;22825:20;;;;;;;:32;;22850:6;22825:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;22802:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;22873:35;;;;;;;22802:20;;22873:35;;;;;;;;;;;;;22437:479;;;:::o;5624:192::-;5710:7;5746:12;5738:6;;;;5730:29;;;;-1:-1:-1;;;5730:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5730:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5782:5:0;;;5624:192::o;4731:181::-;4789:7;4821:5;;;4845:6;;;;4837:46;;;;;-1:-1:-1;;;4837:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4903:1;4731:181;-1:-1:-1;;;4731:181:0:o;6070:471::-;6128:7;6373:6;6369:47;;-1:-1:-1;6403:1:0;6396:8;;6369:47;6440:5;;;6444:1;6440;:5;:1;6464:5;;;;;:10;6456:56;;;;-1:-1:-1;;;6456:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7012:132;7070:7;7097:39;7101:1;7104;7097:39;;;;;;;;;;;;;;;;;:3;:39::i;50174:447::-;50247:15;;:35;;;-1:-1:-1;;;50247:35:0;;;;50226:18;;-1:-1:-1;;;;;50247:15:0;;:33;;:35;;;;;;;;;;;;;;:15;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;50247:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50247:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50247:35:0;;-1:-1:-1;50297:9:0;50293:321;50316:10;50312:1;:14;50293:321;;;50378:15;;:37;;;-1:-1:-1;;;50378:37:0;;;;;;;;;;50347:13;;-1:-1:-1;;;;;50378:15:0;;:34;;:37;;;;;;;;;;;;;;:15;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;50378:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50378:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50378:37:0;50451:31;;;-1:-1:-1;;;50451:31:0;;50476:4;50451:31;;;;;;50378:37;;-1:-1:-1;50432:16:0;;-1:-1:-1;;;;;50451:16:0;;;;;:31;;;;;50378:37;;50451:31;;;;;;;:16;:31;;;2:2:-1;;;;27:1;24;17:12;2:2;50451:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50451:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50451:31:0;;-1:-1:-1;50500:12:0;;50497:106;;50560:15;;50532:55;;-1:-1:-1;;;;;50532:19:0;;;;50560:15;50578:8;50532:55;:19;:55;:::i;:::-;-1:-1:-1;;50328:3:0;;50293:321;;;;50174:447;:::o;26919:252::-;26700:12;:10;:12::i;:::-;26690:6;;;;;-1:-1:-1;;;;;26690:6:0;;;:22;;;26682:67;;;;;-1:-1:-1;;;26682:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26682:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27016:22:0;::::1;27008:73;;;;-1:-1:-1::0;;;27008:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27118:6;::::0;27097:38:::1;::::0;-1:-1:-1;;;;;27097:38:0;;::::1;::::0;27118:6:::1;::::0;::::1;;::::0;27097:38:::1;::::0;;;::::1;27146:6;:17:::0;;-1:-1:-1;;;;;27146:17:0;;::::1;;;-1:-1:-1::0;;;;;;27146:17:0;;::::1;::::0;;;::::1;::::0;;26919:252::o;23835:356::-;-1:-1:-1;;;;;23919:21:0;;23911:67;;;;-1:-1:-1;;;23911:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24012:68;24035:6;24012:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24012:18:0;;:9;:18;;;;;;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;23991:18:0;;:9;:18;;;;;;;;;;:89;24106:12;;:24;;24123:6;24106:24;:16;:24;:::i;:::-;24091:12;:39;24146:37;;;;;;;;24172:1;;-1:-1:-1;;;;;24146:37:0;;;;;;;;;;;;23835:356;;:::o;5190:136::-;5248:7;5275:43;5279:1;5282;5275:43;;;;;;;;;;;;;;;;;:3;:43::i;44514:2306::-;44636:9;:16;44678:4;44666:16;;;;44663:317;;;44702:9;44698:250;44721:6;44717:1;:10;44698:250;;;44801:1;44755:9;44765:1;44755:12;;;;;;;;;;;;;;;;;;;;;;:18;:43;;;-1:-1:-1;;;44755:43:0;;44792:4;44755:43;;;;;;-1:-1:-1;;;;;44755:18:0;;;;:28;;:43;;;;;;;;;;:18;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;44755:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44755:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44755:43:0;:47;44752:181;;;44826:87;44858:9;44869;44879:1;44869:12;;;;;;;;;;;;;;;;;;;;;;:18;:43;;;-1:-1:-1;;;44869:43:0;;44906:4;44869:43;;;;;;-1:-1:-1;;;;;44869:18:0;;;;:28;;:43;;;;;;;;;;:18;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;44869:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44869:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44869:43:0;44826:9;:12;;44836:1;;44826:12;;;;;;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;44826:18:0;;:87;;:31;:87;:::i;:::-;44729:3;;44698:250;;;;44962:7;;;44663:317;44990:19;;:::i;:::-;45020:16;;45085:19;:17;:19::i;:::-;45119:9;45115:1698;45138:6;45134:1;:10;45115:1698;;;45193:1;;-1:-1:-1;45193:1:0;45292:350;45317:6;45312:2;:11;45292:350;;;45352:4;45357:2;45352:8;;;;;;;;;;;45349:278;;45393:14;45410:9;45420:2;45410:13;;;;;;;;;;;;;;;;;;:19;;;45393:36;;45455:11;45470:1;45455:16;:41;;;;45485:11;45475:6;:21;;45455:41;45452:156;;;45538:6;45524:20;;45582:2;45571:13;;45452:156;45349:278;;45325:4;;45292:350;;;;45673:4;45656;45661:8;45656:14;;;;;;;:21;;;:14;;;;;:21;45847:9;:19;;45749:26;;45778:98;;45857:8;;45847:19;;;;;;;;;;;;;;;;:28;;;45843:2;:32;45778:60;45833:4;45778:9;45788:8;45778:19;;;;;;;;;;;;;;;;;;;;;;:25;:50;;;-1:-1:-1;;;45778:50:0;;45822:4;45778:50;;;;;;-1:-1:-1;;;;;45778:25:0;;;;:35;;:50;;;;;;;;;;:25;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;45778:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45778:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45778:50:0;;:60;:54;:60;:::i;:98::-;45749:127;;45916:15;45894:18;:37;45891:911;;46016:22;;46013:270;;46080:39;:15;46100:18;46080:39;:19;:39;:::i;:::-;46062:57;;46142:101;46181:9;46192;46202:8;46192:19;;;;;;;;;;;;;;;;;;;;;;:25;:50;;;-1:-1:-1;;;46192:50:0;;46236:4;46192:50;;;;;;-1:-1:-1;;;;;46192:25:0;;;;:35;;:50;;;;;;;;;;:25;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;46192:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46192:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;46192:50:0;46142:9;:19;;46152:8;;46142:19;;;;;:101;45891:911;;;46384:19;;46381:354;;46509:16;46528:63;46586:4;46528:53;46552:9;46562:8;46552:19;;;;;;;;;;;;;;;;;;:28;;;46548:2;:32;46528:15;:19;;:53;;;;:::i;:63::-;46509:82;;46632:1;46614:19;;46656:59;46695:9;46706:8;46656:9;46666:8;46656:19;;;;;;;:59;46381:354;;46753:5;;;45891:911;-1:-1:-1;45146:3:0;;45115:1698;;;;44514:2306;;;;;;;;:::o;27455:205::-;27583:68;;;-1:-1:-1;;;;;27583:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;27583:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;27556:96:0;;27576:5;;27556:19;:96::i;:::-;27455:205;;;;:::o;23192:316::-;-1:-1:-1;;;;;23276:21:0;;23268:65;;;;;-1:-1:-1;;;23268:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23361:12;;:24;;23378:6;23361:24;:16;:24;:::i;:::-;23346:12;:39;-1:-1:-1;;;;;23417:18:0;;:9;:18;;;;;;;;;;;:30;;23440:6;23417:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;23396:18:0;;:9;:18;;;;;;;;;;;:51;;;;23463:37;;;;;;;23396:18;;:9;;23463:37;;;;;;;;;;23192:316;;:::o;7635:278::-;7721:7;7756:12;7749:5;7741:28;;;;-1:-1:-1;;;7741:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7741:28:0;;7780:9;7796:1;7792;:5;;;;;;;7635:278;-1:-1:-1;;;;;7635:278:0:o;27270:177::-;27380:58;;;-1:-1:-1;;;;;27380:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;27380:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;27353:86:0;;27373:5;;27353:19;:86::i;39125:292::-;39178:9;39174:228;39197:9;:16;39193:20;;39174:228;;;39250:14;;39282:9;:12;;39234:13;;-1:-1:-1;;;;;39250:14:0;;:23;;39292:1;;39282:12;;;;;;;;;;;;;;;;;;;;;:18;39250:52;;;-1:-1:-1;;;;;;39250:52:0;;;;;;;-1:-1:-1;;;;;39282:18:0;;;39250:52;;;;;;;;;;;;;;;;;;;;;;;2:2:-1;;;;27:1;24;17:12;2:2;39250:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39250:52:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39250:52:0;;-1:-1:-1;39320:9:0;;39317:74;;39370:5;39349:9;39359:1;39349:12;;;;;;;;;;;;;;;;;;:18;;:26;;;;39317:74;-1:-1:-1;39215:3:0;;39174:228;;29575:761;29999:23;30025:69;30053:4;30025:69;;;;;;;;;;;;;;;;;30033:5;-1:-1:-1;;;;;30025:27:0;;;:69;;;;;:::i;:::-;30109:17;;29999:95;;-1:-1:-1;30109:21:0;30105:224;;30251:10;30240:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30240:30:0;30232:85;;;;-1:-1:-1;;;30232:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13008:196;13111:12;13143:53;13166:6;13174:4;13180:1;13183:12;13143:22;:53::i;:::-;13136:60;13008:196;-1:-1:-1;;;;13008:196:0:o;14375:979::-;14505:12;14538:18;14549:6;14538:10;:18::i;:::-;14530:60;;;;;-1:-1:-1;;;14530:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14664:12;14678:23;14705:6;-1:-1:-1;;;;;14705:11:0;14725:8;14736:4;14705:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;14705:36:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;14663:78:0;;;;14756:7;14752:595;;;14787:10;-1:-1:-1;14780:17:0;;-1:-1:-1;14780:17:0;14752:595;14901:17;;:21;14897:439;;15164:10;15158:17;15225:15;15212:10;15208:2;15204:19;15197:44;15112:148;15300:20;;-1:-1:-1;;;15300:20:0;;;;;;;;;;;;;;;;;15307:12;;15300:20;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;9908:619:0;9968:4;10436:20;;10279:66;10476:23;;;;;;:42;;-1:-1:-1;;10503:15:0;;;10468:51;-1:-1:-1;;9908:619:0:o;33262:17877::-;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;-1:-1;33262:17877:0;;;-1:-1:-1;;33262:17877:0:o
Swarm Source
ipfs://8e948a2b0bcce26275886d6ae593ebc412e92063b525d6ad037caba99c13731c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.999563 | 101.0636 | $101.02 |
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.