ETH Price: $2,612.35 (+1.75%)

Token

Stabilize Strategy Multi-Seigniorage (zs-SGR)
 

Overview

Max Total Supply

398,141.959859962944510222 zs-SGR

Holders

13

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
15 zs-SGR

Value
$0.00
0xfb5461b2433de1236784dd29b6c6415732c16e9a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
zsToken

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-31
*/

// 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/zs-SGR.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
}

pragma solidity ^0.6.6;

contract zsToken is ERC20("Stabilize Strategy Multi-Seigniorage", "zs-SGR"), Ownable, ReentrancyGuard {
    using SafeERC20 for IERC20;

    // Variables
    uint256 constant divisionFactor = 100000;
    
    // 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 sgr coins
    // ESD, DSD, BAC
    struct TokenInfo {
        IERC20 token; // Reference of token
        uint256 decimals; // Decimals of token
    }
    
    TokenInfo[] private tokenList; // An array of tokens accepted as deposits
    address private _underlyingPriceAsset; // Token from which the price is derived for STBZ staking
    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) public {
        _underlyingPriceAsset = _priceAsset;
        setupWithdrawTokens();
    }
    
    function setupWithdrawTokens() internal {
        // Start with ESD
        IERC20 _token = IERC20(address(0x36F3FD68E7325a35EB768F1AedaAe9EA0689d723));
        tokenList.push(
            TokenInfo({
                token: _token,
                decimals: _token.decimals()
            })
        );   
        
        // DSD
        _token = IERC20(address(0xBD2F0Cd039E0BFcf88901C98c0bFAc5ab27566e3));
        tokenList.push(
            TokenInfo({
                token: _token,
                decimals: _token.decimals()
            })
        );
        
        // BAC
        _token = IERC20(address(0x3449FC1Cd036255BA1EB19d65fF4BA2b8903A69a));
        tokenList.push(
            TokenInfo({
                token: _token,
                decimals: _token.decimals()
            })
        );
    }
    
    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) {
        // Returns all addresses accepted by this token vault
        return (address(tokenList[0].token), address(tokenList[1].token), address(tokenList[2].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 highest balance
        if(currentStrategy != StabilizeStrategy(address(0))){
            return currentStrategy.withdrawTokenReserves();
        }else{
            uint256 length = tokenList.length;
            uint256 targetID = 0;
            uint256 targetNormBalance = 0;
            for(uint256 i = 0; i < length; i++){
                uint256 _normBal = tokenList[i].token.balanceOf(address(this)).mul(1e18).div(10**tokenList[i].decimals);
                if(_normBal > 0){
                    if(targetNormBalance == 0 || _normBal >= targetNormBalance){
                        targetNormBalance = _normBal;
                        targetID = i;
                    }
                }
            }
            if(targetNormBalance > 0){
                return (address(tokenList[targetID].token), tokenList[targetID].token.balanceOf(address(this)));
            }else{
                return (address(0), 0); // No balance
            }
        }
    }
    
    
    // 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
        }
        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 token they get. They get the largest quantity coin up to the lowest quantity
        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);
                withdrawPerBalance(_msgSender(), _myBalance, false); // This will withdraw based on token balanace
                withdrawAmount = _myBalance;
            }else{
                // We are all shares, transfer all
                uint256 _balance = getNormalizedTotalBalance(address(this));
                withdrawPerBalance(_msgSender(), _balance, true);
                withdrawAmount = _balance;
            }
        }
        
        emit Unwrapped(_msgSender(), withdrawAmount);
    }
    
    // This will withdraw the tokens from the contract based on their balance, from highest balance to lowest
    function withdrawPerBalance(address _receiver, uint256 _withdrawAmount, bool _takeAll) internal {
        uint256 length = tokenList.length;
        if(_takeAll == true){
            // Send the entire balance
            for(uint256 i = 0; i < length; i++){
                uint256 _bal = tokenList[i].token.balanceOf(address(this));
                if(_bal > 0){
                    tokenList[i].token.safeTransfer(_receiver, _bal);
                }
            }
            return;
        }
        bool[4] memory done;
        uint256 targetID = 0;
        uint256 targetNormBalance = 0;
        for(uint256 i = 0; i < length; i++){
            
            targetNormBalance = 0; // Reset the target balance
            // Find the highest balanced token to withdraw
            for(uint256 i2 = 0; i2 < length; i2++){
                if(done[i2] == false){
                    uint256 _normBal = tokenList[i2].token.balanceOf(address(this)).mul(1e18).div(10**tokenList[i2].decimals);
                    if(targetNormBalance == 0 || _normBal >= targetNormBalance){
                        targetNormBalance = _normBal;
                        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 the platform 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);
            }
        }
    }
    // --------------------

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_priceAsset","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":"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":"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"}],"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"}]

60806040526009805460ff60a01b1916600160a01b1790553480156200002457600080fd5b506040516200365938038062003659833981810160405260208110156200004a57600080fd5b505160408051606081019091526024808252620036356020830139604051806040016040528060068152602001653d3996a9a3a960d11b81525081600390805190602001906200009c929190620003ef565b508051620000b2906004906020840190620003ef565b50506005805460ff19166012179055506000620000d76001600160e01b036200015e16565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600655600980546001600160a01b0319166001600160a01b0383161790556200015762000163565b5062000491565b335b90565b60007336f3fd68e7325a35eb768f1aedaae9ea0689d723905060086040518060400160405280836001600160a01b03168152602001836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620001d257600080fd5b505afa158015620001e7573d6000803e3d6000fd5b505050506040513d6020811015620001fe57600080fd5b505160ff1690528154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b039093169290921782559183015191015560408051808201825273bd2f0cd039e0bfcf88901c98c0bfac5ab27566e3808252825163313ce56760e01b81529251909450600893919283830192869263313ce567926004808201939291829003018186803b158015620002a557600080fd5b505afa158015620002ba573d6000803e3d6000fd5b505050506040513d6020811015620002d157600080fd5b505160ff1690528154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b0390931692909217825591830151910155604080518082018252733449fc1cd036255ba1eb19d65ff4ba2b8903a69a808252825163313ce56760e01b81529251909450600893919283830192869263313ce567926004808201939291829003018186803b1580156200037857600080fd5b505afa1580156200038d573d6000803e3d6000fd5b505050506040513d6020811015620003a457600080fd5b505160ff1690528154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b03909316929092178255919092015191015550565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200043257805160ff191683800117855562000462565b8280016001018555821562000462579182015b828111156200046257825182559160200191906001019062000445565b506200047092915062000474565b5090565b6200016091905b808211156200047057600081556001016200047b565b61319480620004a16000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80637b1b1de611610104578063b9195072116100a2578063dd62ed3e11610071578063dd62ed3e146104db578063e2bbb15814610509578063f63aeac31461052c578063f800877614610552576101da565b8063b919507214610483578063c650ea591461048b578063d9a74be0146104b6578063db006a75146104be576101da565b80639d63b8f7116100de5780639d63b8f7146103fd578063a457c2d714610423578063a4b88e7b1461044f578063a9059cbb14610457576101da565b80637b1b1de6146103e557806383249ef9146103ed57806395d89b41146103f5576101da565b8063549c46271161017c5780635cbe86bc1161014b5780635cbe86bc1461037c5780636d8ac22d1461038457806370a08231146103b75780637158da7c146103dd576101da565b8063549c46271461035a578063563a7956146103625780635aa6e6751461036a5780635c27af8714610372576101da565b806323b872dd116101b857806323b872dd146102b6578063313ce567146102ec57806337c6de961461030a578063395093511461032e576101da565b806306fdde03146101df578063095ea7b31461025c57806318160ddd1461029c575b600080fd5b6101e7610578565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610221578181015183820152602001610209565b50505050905090810190601f16801561024e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102886004803603604081101561027257600080fd5b506001600160a01b03813516906020013561060f565b604080519115158252519081900360200190f35b6102a461062d565b60408051918252519081900360200190f35b610288600480360360608110156102cc57600080fd5b506001600160a01b03813581169160208101359091169060400135610633565b6102f46106c0565b6040805160ff9092168252519081900360200190f35b6103126106c9565b604080516001600160a01b039092168252519081900360200190f35b6102886004803603604081101561034457600080fd5b506001600160a01b0381351690602001356106d8565b61028861072c565b6102a461073c565b6103126107dd565b61037a6107f1565b005b61037a610863565b61038c6108cf565b604080516001600160a01b039485168152928416602084015292168183015290519081900360600190f35b6102a4600480360360208110156103cd57600080fd5b50356001600160a01b031661095f565b61031261097a565b6102a4610989565b6103126109e4565b6101e76109f3565b6102a46004803603602081101561041357600080fd5b50356001600160a01b0316610a54565b6102886004803603604081101561043957600080fd5b506001600160a01b038135169060200135610b5f565b61037a610bcd565b6102886004803603604081101561046d57600080fd5b506001600160a01b038135169060200135610e24565b61037a610e38565b610493610f58565b604080516001600160a01b03909316835260208301919091528051918290030190f35b61037a6111d4565b61037a600480360360208110156104d457600080fd5b50356112e4565b6102a4600480360360408110156104f157600080fd5b506001600160a01b0381358116916020013516611779565b61037a6004803603604081101561051f57600080fd5b50803590602001356117a4565b61037a6004803603602081101561054257600080fd5b50356001600160a01b0316611db0565b61037a6004803603602081101561056857600080fd5b50356001600160a01b0316611e55565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106045780601f106105d957610100808354040283529160200191610604565b820191906000526020600020905b8154815290600101906020018083116105e757829003601f168201915b505050505090505b90565b600061062361061c611edd565b8484611ee1565b5060015b92915050565b60025490565b6000610640848484611fcd565b6106b68461064c611edd565b6106b185604051806060016040528060288152602001612fc2602891396001600160a01b038a1660009081526001602052604081209061068a611edd565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61212916565b611ee1565b5060019392505050565b60055460ff1690565b600b546001600160a01b031690565b60006106236106e5611edd565b846106b185600160006106f6611edd565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6121c016565b600954600160a01b900460ff1681565b60008061074830610a54565b600a549091506001600160a01b0316156107d857600a60009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b1580156107aa57600080fd5b505afa1580156107be573d6000803e3d6000fd5b505050506040513d60208110156107d457600080fd5b5051015b905090565b60055461010090046001600160a01b031690565b6107f9611edd565b60055461010090046001600160a01b0390811691161461084e576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b6009805460ff60a01b1916600160a01b179055565b61086b611edd565b60055461010090046001600160a01b039081169116146108c0576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b6009805460ff60a01b19169055565b600080600060086000815481106108e257fe5b6000918252602090912060029091020154600880546001600160a01b0390921691600190811061090e57fe5b6000918252602090912060029182020154600880546001600160a01b03909216929091811061093957fe5b600091825260209091206002909102015491945092506001600160a01b03169050909192565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b031690565b600061099361062d565b6109a65750670de0b6b3a764000061060c565b6109dd6109b161062d565b6109d16109bc61073c565b670de0b6b3a76400009063ffffffff61222116565b9063ffffffff61227a16565b905061060c565b600a546001600160a01b031690565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106045780601f106105d957610100808354040283529160200191610604565b600080805b600854811015610b5857600060088281548110610a7257fe5b600091825260209182902060029091020154604080516370a0823160e01b81526001600160a01b038981166004830152915191909216926370a082319260248082019391829003018186803b158015610aca57600080fd5b505afa158015610ade573d6000803e3d6000fd5b505050506040513d6020811015610af457600080fd5b505160088054919250610b3b9184908110610b0b57fe5b906000526020600020906002020160010154600a0a6109d1670de0b6b3a76400008461222190919063ffffffff16565b9050610b4d838263ffffffff6121c016565b925050600101610a59565b5092915050565b6000610623610b6c611edd565b846106b18560405180606001604052806025815260200161313a6025913960016000610b96611edd565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61212916565b610bd5611edd565b60055461010090046001600160a01b03908116911614610c2a576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b600280600d5414610c6c5760405162461bcd60e51b8152600401808060200182810382526027815260200180612f7a6027913960400191505060405180910390fd5b6000600d819055610c7b61062d565b1115610cd55762015180600c5401421015610cd5576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b600a546001600160a01b031615801590610cf657506000610cf461062d565b115b15610d6457600a60009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d4b57600080fd5b505af1158015610d5f573d6000803e3d6000fd5b505050505b600e54600a80546001600160a01b0319166001600160a01b0392831617908190551615801590610d9b57506000610d9961062d565b115b15610e1157610da86122bc565b600a60009054906101000a90046001600160a01b03166001600160a01b031663e97dcb626040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b505050505b50600b80546001600160a01b0319169055565b6000610623610e31611edd565b8484611fcd565b610e40611edd565b60055461010090046001600160a01b03908116911614610e95576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b600180600d5414610ed75760405162461bcd60e51b8152600401808060200182810382526027815260200180612f7a6027913960400191505060405180910390fd5b6000600d819055610ee661062d565b1115610f405762015180600c5401421015610f40576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b600e54610f55906001600160a01b0316612460565b50565b600a5460009081906001600160a01b031615610fed57600a546040805163c650ea5960e01b815281516001600160a01b039093169263c650ea5992600480840193919291829003018186803b158015610fb057600080fd5b505afa158015610fc4573d6000803e3d6000fd5b505050506040513d6040811015610fda57600080fd5b50805160209091015190925090506111d0565b600854600080805b838110156110f35760006110c96008838154811061100f57fe5b906000526020600020906002020160010154600a0a6109d1670de0b6b3a76400006008868154811061103d57fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561109157600080fd5b505afa1580156110a5573d6000803e3d6000fd5b505050506040513d60208110156110bb57600080fd5b50519063ffffffff61222116565b905080156110ea578215806110de5750828110155b156110ea578092508193505b50600101610ff5565b5080156111c0576008828154811061110757fe5b6000918252602090912060029091020154600880546001600160a01b03909216918490811061113257fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561118657600080fd5b505afa15801561119a573d6000803e3d6000fd5b505050506040513d60208110156111b057600080fd5b505190955093506111d092505050565b50600093508392506111d0915050565b9091565b6111dc611edd565b60055461010090046001600160a01b03908116911614611231576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b6009805460ff60a01b19169055600a546001600160a01b03161580159061125f5750600061125d61062d565b115b156112cd57600a60009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156112b457600080fd5b505af11580156112c8573d6000803e3d6000fd5b505050505b600a80546001600160a01b03191690556000600d55565b6002600654141561133c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260065580611387576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b600061139161062d565b116113d9576040805162461bcd60e51b81526020600482015260136024820152724e6f2076616c75652072656465656d61626c6560681b604482015290519081900360640190fd5b60006113e361062d565b90506113f66113f0611edd565b83612569565b6000611400611edd565b6001600160a01b0316326001600160a01b03161415611421575060016114b5565b426007600061142e611edd565b6001600160a01b0316815260208101919091526040016000205410801561147a575060006007600061145e611edd565b6001600160a01b03168152602081019190915260400160002054115b6114b55760405162461bcd60e51b815260040180806020018281038252603481526020018061300a6034913960400191505060405180910390fd5b600760006114c1611edd565b6001600160a01b03166001600160a01b031681526020019081526020016000206001015483116115525761152483600760006114fb611edd565b6001600160a01b031681526020810191909152604001600020600101549063ffffffff61266516565b60076000611530611edd565b6001600160a01b031681526020810191909152604001600020600101556115c1565b600060076000611560611edd565b6001600160a01b031681526020810191909152604001600020600190810191909155811515146115c15760405162461bcd60e51b815260040180806020018281038252603e8152602001806130d2603e913960400191505060405180910390fd5b600a546000906001600160a01b0316156116ba57600a546001600160a01b031663234b67456115ee611edd565b604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482018890526044820187905285151560648301525160848083019260209291908290030181600087803b15801561164b57600080fd5b505af115801561165f573d6000803e3d6000fd5b505050506040513d602081101561167557600080fd5b50519050806116b55760405162461bcd60e51b8152600401808060200182810382526024815260200180612f566024913960400191505060405180910390fd5b611726565b828410156117035760006116cd30610a54565b905060006116e5856109d1848963ffffffff61222116565b90506116fa6116f2611edd565b8260006126a7565b91506117269050565b600061170e30610a54565b905061172361171b611edd565b8260016126a7565b90505b61172e611edd565b6001600160a01b03167f95ae649bfaaef9def56a52f4fb2d9e8fa5496bb7082930e442c74cc76b03dcb3826040518082815260200191505060405180910390a2505060016006555050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600260065414156117fc576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600655600061180b61073c565b600954909150600160a01b900460ff16151560011461185b5760405162461bcd60e51b8152600401808060200182810382526038815260200180612e5f6038913960400191505060405180910390fd5b600a546001600160a01b03166118a25760405162461bcd60e51b815260040180806020018281038252602a815260200180613084602a913960400191505060405180910390fd5b60085482106118e25760405162461bcd60e51b815260040180806020018281038252602f815260200180612f01602f913960400191505060405180910390fd5b6000600883815481106118f157fe5b60009182526020808320600290920290910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b15801561194957600080fd5b505afa15801561195d573d6000803e3d6000fd5b505050506040513d602081101561197357600080fd5b5051905061199a611982611edd565b6001600160a01b03841690308863ffffffff6129ac16565b604080516370a0823160e01b81523060048201529051611a1e9183916001600160a01b038616916370a08231916024808301926020929190829003018186803b1580156119e657600080fd5b505afa1580156119fa573d6000803e3d6000fd5b505050506040513d6020811015611a1057600080fd5b50519063ffffffff61266516565b945060008511611a68576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6000611a72611edd565b6001600160a01b0316326001600160a01b03161415611a8f575060015b600a54604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b158015611ad457600080fd5b505afa158015611ae8573d6000803e3d6000fd5b505050506040513d6020811015611afe57600080fd5b50519050611b0a6122bc565b600a54604080516362b939e160e11b8152841515600482015290516001600160a01b039092169163c57273c29160248082019260009290919082900301818387803b158015611b5857600080fd5b505af1158015611b6c573d6000803e3d6000fd5b5050505080600a60009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015611bbf57600080fd5b505afa158015611bd3573d6000803e3d6000fd5b505050506040513d6020811015611be957600080fd5b505111611c3d576040805162461bcd60e51b815260206004820152601d60248201527f4e6f206368616e676520696e2073747261746567792062616c616e6365000000604482015290519081900360640190fd5b6000611c7f60088881548110611c4f57fe5b906000526020600020906002020160010154600a0a6109d1670de0b6b3a76400008b61222190919063ffffffff16565b9050806000611c8c61062d565b1115611cb157611cae876109d1611ca161062d565b859063ffffffff61222116565b90505b611cc2611cbc611edd565b82612a0c565b4260076000611ccf611edd565b6001600160a01b03166001600160a01b0316815260200190815260200160002060000181905550611d2f8160076000611d06611edd565b6001600160a01b031681526020810191909152604001600020600101549063ffffffff6121c016565b60076000611d3b611edd565b6001600160a01b03168152602081019190915260400160002060010155611d60611edd565b6001600160a01b03167f4700c1726b4198077cd40320a32c45265a1910521eb0ef713dd1d8412413d7fc8a6040518082815260200191505060405180910390a25050600160065550505050505050565b611db8611edd565b60055461010090046001600160a01b03908116911614611e0d576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b42600c556002600d55600e80546001600160a01b0383166001600160a01b03199182168117909255600b80549091169091179055611e4961062d565b610f5557610f55610bcd565b611e5d611edd565b60055461010090046001600160a01b03908116911614611eb2576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b42600c556001600d55600e80546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316611f265760405162461bcd60e51b81526004018080602001828103825260248152602001806130ae6024913960400191505060405180910390fd5b6001600160a01b038216611f6b5760405162461bcd60e51b8152600401808060200182810382526022815260200180612edf6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166120125760405162461bcd60e51b815260040180806020018281038252602581526020018061305f6025913960400191505060405180910390fd5b6001600160a01b0382166120575760405162461bcd60e51b8152600401808060200182810382526023815260200180612e3c6023913960400191505060405180910390fd5b61209a81604051806060016040528060268152602001612f30602691396001600160a01b038616600090815260208190526040902054919063ffffffff61212916565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546120cf908263ffffffff6121c016565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156121b85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561217d578181015183820152602001612165565b50505050905090810190601f1680156121aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561221a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261223057506000610627565b8282028284828161223d57fe5b041461221a5760405162461bcd60e51b8152600401808060200182810382526021815260200180612fa16021913960400191505060405180910390fd5b600061221a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612afc565b600a546040805163780d9d2d60e01b815290516000926001600160a01b03169163780d9d2d916004808301926020929190829003018186803b15801561230157600080fd5b505afa158015612315573d6000803e3d6000fd5b505050506040513d602081101561232b57600080fd5b5051905060005b8181101561245c57600a5460408051635930a0a160e01b81526004810184905290516000926001600160a01b031691635930a0a1916024808301926020929190829003018186803b15801561238657600080fd5b505afa15801561239a573d6000803e3d6000fd5b505050506040513d60208110156123b057600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156123fe57600080fd5b505afa158015612412573d6000803e3d6000fd5b505050506040513d602081101561242857600080fd5b50519050801561245257600a54612452906001600160a01b0384811691168363ffffffff612b6116565b5050600101612332565b5050565b612468611edd565b60055461010090046001600160a01b039081169116146124bd576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b6001600160a01b0381166125025760405162461bcd60e51b8152600401808060200182810382526026815260200180612eb96026913960400191505060405180910390fd5b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0382166125ae5760405162461bcd60e51b815260040180806020018281038252602181526020018061303e6021913960400191505060405180910390fd5b6125f181604051806060016040528060228152602001612e97602291396001600160a01b038516600090815260208190526040902054919063ffffffff61212916565b6001600160a01b03831660009081526020819052604090205560025461261d908263ffffffff61266516565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600061221a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612129565b600854600182151514156127a05760005b81811015612799576000600882815481106126cf57fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561272357600080fd5b505afa158015612737573d6000803e3d6000fd5b505050506040513d602081101561274d57600080fd5b5051905080156127905761279086826008858154811061276957fe5b60009182526020909120600290910201546001600160a01b0316919063ffffffff612b6116565b506001016126b8565b50506129a7565b6127a8612e1d565b600080805b848110156129a15760009150815b8581101561280f578481600481106127cf57fe5b60200201516128075760006127ea6008838154811061100f57fe5b90508315806127f95750838110155b15612805578093508194505b505b6001016127bb565b50600184846004811061281e57fe5b911515602090920201526008805460009161286b918690811061283d57fe5b906000526020600020906002020160010154600a0a6109d1670de0b6b3a76400006008888154811061103d57fe5b905087811161293057801561292b5761288a888263ffffffff61266516565b975061292b896008868154811061289d57fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156128f157600080fd5b505afa158015612905573d6000803e3d6000fd5b505050506040513d602081101561291b57600080fd5b5051600880548890811061276957fe5b612998565b8715612992576000612978670de0b6b3a76400006109d16008888154811061295457fe5b906000526020600020906002020160010154600a0a8c61222190919063ffffffff16565b9050600098506129908a826008888154811061276957fe5b505b506129a1565b506001016127ad565b50505050505b505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a06908590612baf565b50505050565b6001600160a01b038216612a67576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612a7a908263ffffffff6121c016565b6002556001600160a01b038216600090815260208190526040902054612aa6908263ffffffff6121c016565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183612b4b5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561217d578181015183820152602001612165565b506000838581612b5757fe5b0495945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526129a79084905b6060612c04826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612c609092919063ffffffff16565b8051909150156129a757808060200190516020811015612c2357600080fd5b50516129a75760405162461bcd60e51b815260040180806020018281038252602a815260200180613110602a913960400191505060405180910390fd5b6060612c6f8484600085612c77565b949350505050565b6060612c8285612de4565b612cd3576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612d125780518252601f199092019160209182019101612cf3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612d74576040519150601f19603f3d011682016040523d82523d6000602084013e612d79565b606091505b50915091508115612d8d579150612c6f9050565b805115612d9d5780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561217d578181015183820152602001612165565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612c6f575050151592915050565b6040518060800160405280600490602082028036833750919291505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734465706f736974732068617665206265656e2073757370656e6465642c2062757420796f752063616e207374696c6c20776974686472617745524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373546f6b656e204944206973206f7574736964652072616e6765206f6620746f6b656e7320696e20636f6e747261637445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654661696c656420746f2077697468647261772066726f6d2074686520737472617465677954696d656c6f636b206e6f7420616371756972656420666f7220746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e7472616374206465706f7369746f722063616e6e6f742072656465656d20696e2073616d65207472616e73616374696f6e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734e6f20737472617465677920636f6e747261637420686173206265656e2073656c65637465642079657445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e7472616374206465706f7369746f72732063616e6e6f742074616b65206f7574206d6f7265207468616e207768617420746865792070757420696e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206a580a307783d99330718e0f0c76b54fb5280d5947d7c3be8c712fb55489e10564736f6c6343000606003353746162696c697a65205374726174656779204d756c74692d536569676e696f72616765000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80637b1b1de611610104578063b9195072116100a2578063dd62ed3e11610071578063dd62ed3e146104db578063e2bbb15814610509578063f63aeac31461052c578063f800877614610552576101da565b8063b919507214610483578063c650ea591461048b578063d9a74be0146104b6578063db006a75146104be576101da565b80639d63b8f7116100de5780639d63b8f7146103fd578063a457c2d714610423578063a4b88e7b1461044f578063a9059cbb14610457576101da565b80637b1b1de6146103e557806383249ef9146103ed57806395d89b41146103f5576101da565b8063549c46271161017c5780635cbe86bc1161014b5780635cbe86bc1461037c5780636d8ac22d1461038457806370a08231146103b75780637158da7c146103dd576101da565b8063549c46271461035a578063563a7956146103625780635aa6e6751461036a5780635c27af8714610372576101da565b806323b872dd116101b857806323b872dd146102b6578063313ce567146102ec57806337c6de961461030a578063395093511461032e576101da565b806306fdde03146101df578063095ea7b31461025c57806318160ddd1461029c575b600080fd5b6101e7610578565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610221578181015183820152602001610209565b50505050905090810190601f16801561024e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102886004803603604081101561027257600080fd5b506001600160a01b03813516906020013561060f565b604080519115158252519081900360200190f35b6102a461062d565b60408051918252519081900360200190f35b610288600480360360608110156102cc57600080fd5b506001600160a01b03813581169160208101359091169060400135610633565b6102f46106c0565b6040805160ff9092168252519081900360200190f35b6103126106c9565b604080516001600160a01b039092168252519081900360200190f35b6102886004803603604081101561034457600080fd5b506001600160a01b0381351690602001356106d8565b61028861072c565b6102a461073c565b6103126107dd565b61037a6107f1565b005b61037a610863565b61038c6108cf565b604080516001600160a01b039485168152928416602084015292168183015290519081900360600190f35b6102a4600480360360208110156103cd57600080fd5b50356001600160a01b031661095f565b61031261097a565b6102a4610989565b6103126109e4565b6101e76109f3565b6102a46004803603602081101561041357600080fd5b50356001600160a01b0316610a54565b6102886004803603604081101561043957600080fd5b506001600160a01b038135169060200135610b5f565b61037a610bcd565b6102886004803603604081101561046d57600080fd5b506001600160a01b038135169060200135610e24565b61037a610e38565b610493610f58565b604080516001600160a01b03909316835260208301919091528051918290030190f35b61037a6111d4565b61037a600480360360208110156104d457600080fd5b50356112e4565b6102a4600480360360408110156104f157600080fd5b506001600160a01b0381358116916020013516611779565b61037a6004803603604081101561051f57600080fd5b50803590602001356117a4565b61037a6004803603602081101561054257600080fd5b50356001600160a01b0316611db0565b61037a6004803603602081101561056857600080fd5b50356001600160a01b0316611e55565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106045780601f106105d957610100808354040283529160200191610604565b820191906000526020600020905b8154815290600101906020018083116105e757829003601f168201915b505050505090505b90565b600061062361061c611edd565b8484611ee1565b5060015b92915050565b60025490565b6000610640848484611fcd565b6106b68461064c611edd565b6106b185604051806060016040528060288152602001612fc2602891396001600160a01b038a1660009081526001602052604081209061068a611edd565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61212916565b611ee1565b5060019392505050565b60055460ff1690565b600b546001600160a01b031690565b60006106236106e5611edd565b846106b185600160006106f6611edd565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6121c016565b600954600160a01b900460ff1681565b60008061074830610a54565b600a549091506001600160a01b0316156107d857600a60009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b1580156107aa57600080fd5b505afa1580156107be573d6000803e3d6000fd5b505050506040513d60208110156107d457600080fd5b5051015b905090565b60055461010090046001600160a01b031690565b6107f9611edd565b60055461010090046001600160a01b0390811691161461084e576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b6009805460ff60a01b1916600160a01b179055565b61086b611edd565b60055461010090046001600160a01b039081169116146108c0576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b6009805460ff60a01b19169055565b600080600060086000815481106108e257fe5b6000918252602090912060029091020154600880546001600160a01b0390921691600190811061090e57fe5b6000918252602090912060029182020154600880546001600160a01b03909216929091811061093957fe5b600091825260209091206002909102015491945092506001600160a01b03169050909192565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b031690565b600061099361062d565b6109a65750670de0b6b3a764000061060c565b6109dd6109b161062d565b6109d16109bc61073c565b670de0b6b3a76400009063ffffffff61222116565b9063ffffffff61227a16565b905061060c565b600a546001600160a01b031690565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106045780601f106105d957610100808354040283529160200191610604565b600080805b600854811015610b5857600060088281548110610a7257fe5b600091825260209182902060029091020154604080516370a0823160e01b81526001600160a01b038981166004830152915191909216926370a082319260248082019391829003018186803b158015610aca57600080fd5b505afa158015610ade573d6000803e3d6000fd5b505050506040513d6020811015610af457600080fd5b505160088054919250610b3b9184908110610b0b57fe5b906000526020600020906002020160010154600a0a6109d1670de0b6b3a76400008461222190919063ffffffff16565b9050610b4d838263ffffffff6121c016565b925050600101610a59565b5092915050565b6000610623610b6c611edd565b846106b18560405180606001604052806025815260200161313a6025913960016000610b96611edd565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61212916565b610bd5611edd565b60055461010090046001600160a01b03908116911614610c2a576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b600280600d5414610c6c5760405162461bcd60e51b8152600401808060200182810382526027815260200180612f7a6027913960400191505060405180910390fd5b6000600d819055610c7b61062d565b1115610cd55762015180600c5401421015610cd5576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b600a546001600160a01b031615801590610cf657506000610cf461062d565b115b15610d6457600a60009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d4b57600080fd5b505af1158015610d5f573d6000803e3d6000fd5b505050505b600e54600a80546001600160a01b0319166001600160a01b0392831617908190551615801590610d9b57506000610d9961062d565b115b15610e1157610da86122bc565b600a60009054906101000a90046001600160a01b03166001600160a01b031663e97dcb626040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b505050505b50600b80546001600160a01b0319169055565b6000610623610e31611edd565b8484611fcd565b610e40611edd565b60055461010090046001600160a01b03908116911614610e95576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b600180600d5414610ed75760405162461bcd60e51b8152600401808060200182810382526027815260200180612f7a6027913960400191505060405180910390fd5b6000600d819055610ee661062d565b1115610f405762015180600c5401421015610f40576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b600e54610f55906001600160a01b0316612460565b50565b600a5460009081906001600160a01b031615610fed57600a546040805163c650ea5960e01b815281516001600160a01b039093169263c650ea5992600480840193919291829003018186803b158015610fb057600080fd5b505afa158015610fc4573d6000803e3d6000fd5b505050506040513d6040811015610fda57600080fd5b50805160209091015190925090506111d0565b600854600080805b838110156110f35760006110c96008838154811061100f57fe5b906000526020600020906002020160010154600a0a6109d1670de0b6b3a76400006008868154811061103d57fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561109157600080fd5b505afa1580156110a5573d6000803e3d6000fd5b505050506040513d60208110156110bb57600080fd5b50519063ffffffff61222116565b905080156110ea578215806110de5750828110155b156110ea578092508193505b50600101610ff5565b5080156111c0576008828154811061110757fe5b6000918252602090912060029091020154600880546001600160a01b03909216918490811061113257fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561118657600080fd5b505afa15801561119a573d6000803e3d6000fd5b505050506040513d60208110156111b057600080fd5b505190955093506111d092505050565b50600093508392506111d0915050565b9091565b6111dc611edd565b60055461010090046001600160a01b03908116911614611231576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b6009805460ff60a01b19169055600a546001600160a01b03161580159061125f5750600061125d61062d565b115b156112cd57600a60009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156112b457600080fd5b505af11580156112c8573d6000803e3d6000fd5b505050505b600a80546001600160a01b03191690556000600d55565b6002600654141561133c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260065580611387576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b600061139161062d565b116113d9576040805162461bcd60e51b81526020600482015260136024820152724e6f2076616c75652072656465656d61626c6560681b604482015290519081900360640190fd5b60006113e361062d565b90506113f66113f0611edd565b83612569565b6000611400611edd565b6001600160a01b0316326001600160a01b03161415611421575060016114b5565b426007600061142e611edd565b6001600160a01b0316815260208101919091526040016000205410801561147a575060006007600061145e611edd565b6001600160a01b03168152602081019190915260400160002054115b6114b55760405162461bcd60e51b815260040180806020018281038252603481526020018061300a6034913960400191505060405180910390fd5b600760006114c1611edd565b6001600160a01b03166001600160a01b031681526020019081526020016000206001015483116115525761152483600760006114fb611edd565b6001600160a01b031681526020810191909152604001600020600101549063ffffffff61266516565b60076000611530611edd565b6001600160a01b031681526020810191909152604001600020600101556115c1565b600060076000611560611edd565b6001600160a01b031681526020810191909152604001600020600190810191909155811515146115c15760405162461bcd60e51b815260040180806020018281038252603e8152602001806130d2603e913960400191505060405180910390fd5b600a546000906001600160a01b0316156116ba57600a546001600160a01b031663234b67456115ee611edd565b604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482018890526044820187905285151560648301525160848083019260209291908290030181600087803b15801561164b57600080fd5b505af115801561165f573d6000803e3d6000fd5b505050506040513d602081101561167557600080fd5b50519050806116b55760405162461bcd60e51b8152600401808060200182810382526024815260200180612f566024913960400191505060405180910390fd5b611726565b828410156117035760006116cd30610a54565b905060006116e5856109d1848963ffffffff61222116565b90506116fa6116f2611edd565b8260006126a7565b91506117269050565b600061170e30610a54565b905061172361171b611edd565b8260016126a7565b90505b61172e611edd565b6001600160a01b03167f95ae649bfaaef9def56a52f4fb2d9e8fa5496bb7082930e442c74cc76b03dcb3826040518082815260200191505060405180910390a2505060016006555050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600260065414156117fc576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600655600061180b61073c565b600954909150600160a01b900460ff16151560011461185b5760405162461bcd60e51b8152600401808060200182810382526038815260200180612e5f6038913960400191505060405180910390fd5b600a546001600160a01b03166118a25760405162461bcd60e51b815260040180806020018281038252602a815260200180613084602a913960400191505060405180910390fd5b60085482106118e25760405162461bcd60e51b815260040180806020018281038252602f815260200180612f01602f913960400191505060405180910390fd5b6000600883815481106118f157fe5b60009182526020808320600290920290910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b15801561194957600080fd5b505afa15801561195d573d6000803e3d6000fd5b505050506040513d602081101561197357600080fd5b5051905061199a611982611edd565b6001600160a01b03841690308863ffffffff6129ac16565b604080516370a0823160e01b81523060048201529051611a1e9183916001600160a01b038616916370a08231916024808301926020929190829003018186803b1580156119e657600080fd5b505afa1580156119fa573d6000803e3d6000fd5b505050506040513d6020811015611a1057600080fd5b50519063ffffffff61266516565b945060008511611a68576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6000611a72611edd565b6001600160a01b0316326001600160a01b03161415611a8f575060015b600a54604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b158015611ad457600080fd5b505afa158015611ae8573d6000803e3d6000fd5b505050506040513d6020811015611afe57600080fd5b50519050611b0a6122bc565b600a54604080516362b939e160e11b8152841515600482015290516001600160a01b039092169163c57273c29160248082019260009290919082900301818387803b158015611b5857600080fd5b505af1158015611b6c573d6000803e3d6000fd5b5050505080600a60009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015611bbf57600080fd5b505afa158015611bd3573d6000803e3d6000fd5b505050506040513d6020811015611be957600080fd5b505111611c3d576040805162461bcd60e51b815260206004820152601d60248201527f4e6f206368616e676520696e2073747261746567792062616c616e6365000000604482015290519081900360640190fd5b6000611c7f60088881548110611c4f57fe5b906000526020600020906002020160010154600a0a6109d1670de0b6b3a76400008b61222190919063ffffffff16565b9050806000611c8c61062d565b1115611cb157611cae876109d1611ca161062d565b859063ffffffff61222116565b90505b611cc2611cbc611edd565b82612a0c565b4260076000611ccf611edd565b6001600160a01b03166001600160a01b0316815260200190815260200160002060000181905550611d2f8160076000611d06611edd565b6001600160a01b031681526020810191909152604001600020600101549063ffffffff6121c016565b60076000611d3b611edd565b6001600160a01b03168152602081019190915260400160002060010155611d60611edd565b6001600160a01b03167f4700c1726b4198077cd40320a32c45265a1910521eb0ef713dd1d8412413d7fc8a6040518082815260200191505060405180910390a25050600160065550505050505050565b611db8611edd565b60055461010090046001600160a01b03908116911614611e0d576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b42600c556002600d55600e80546001600160a01b0383166001600160a01b03199182168117909255600b80549091169091179055611e4961062d565b610f5557610f55610bcd565b611e5d611edd565b60055461010090046001600160a01b03908116911614611eb2576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b42600c556001600d55600e80546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316611f265760405162461bcd60e51b81526004018080602001828103825260248152602001806130ae6024913960400191505060405180910390fd5b6001600160a01b038216611f6b5760405162461bcd60e51b8152600401808060200182810382526022815260200180612edf6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166120125760405162461bcd60e51b815260040180806020018281038252602581526020018061305f6025913960400191505060405180910390fd5b6001600160a01b0382166120575760405162461bcd60e51b8152600401808060200182810382526023815260200180612e3c6023913960400191505060405180910390fd5b61209a81604051806060016040528060268152602001612f30602691396001600160a01b038616600090815260208190526040902054919063ffffffff61212916565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546120cf908263ffffffff6121c016565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156121b85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561217d578181015183820152602001612165565b50505050905090810190601f1680156121aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561221a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261223057506000610627565b8282028284828161223d57fe5b041461221a5760405162461bcd60e51b8152600401808060200182810382526021815260200180612fa16021913960400191505060405180910390fd5b600061221a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612afc565b600a546040805163780d9d2d60e01b815290516000926001600160a01b03169163780d9d2d916004808301926020929190829003018186803b15801561230157600080fd5b505afa158015612315573d6000803e3d6000fd5b505050506040513d602081101561232b57600080fd5b5051905060005b8181101561245c57600a5460408051635930a0a160e01b81526004810184905290516000926001600160a01b031691635930a0a1916024808301926020929190829003018186803b15801561238657600080fd5b505afa15801561239a573d6000803e3d6000fd5b505050506040513d60208110156123b057600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156123fe57600080fd5b505afa158015612412573d6000803e3d6000fd5b505050506040513d602081101561242857600080fd5b50519050801561245257600a54612452906001600160a01b0384811691168363ffffffff612b6116565b5050600101612332565b5050565b612468611edd565b60055461010090046001600160a01b039081169116146124bd576040805162461bcd60e51b81526020600482018190526024820152600080516020612fea833981519152604482015290519081900360640190fd5b6001600160a01b0381166125025760405162461bcd60e51b8152600401808060200182810382526026815260200180612eb96026913960400191505060405180910390fd5b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0382166125ae5760405162461bcd60e51b815260040180806020018281038252602181526020018061303e6021913960400191505060405180910390fd5b6125f181604051806060016040528060228152602001612e97602291396001600160a01b038516600090815260208190526040902054919063ffffffff61212916565b6001600160a01b03831660009081526020819052604090205560025461261d908263ffffffff61266516565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600061221a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612129565b600854600182151514156127a05760005b81811015612799576000600882815481106126cf57fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561272357600080fd5b505afa158015612737573d6000803e3d6000fd5b505050506040513d602081101561274d57600080fd5b5051905080156127905761279086826008858154811061276957fe5b60009182526020909120600290910201546001600160a01b0316919063ffffffff612b6116565b506001016126b8565b50506129a7565b6127a8612e1d565b600080805b848110156129a15760009150815b8581101561280f578481600481106127cf57fe5b60200201516128075760006127ea6008838154811061100f57fe5b90508315806127f95750838110155b15612805578093508194505b505b6001016127bb565b50600184846004811061281e57fe5b911515602090920201526008805460009161286b918690811061283d57fe5b906000526020600020906002020160010154600a0a6109d1670de0b6b3a76400006008888154811061103d57fe5b905087811161293057801561292b5761288a888263ffffffff61266516565b975061292b896008868154811061289d57fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156128f157600080fd5b505afa158015612905573d6000803e3d6000fd5b505050506040513d602081101561291b57600080fd5b5051600880548890811061276957fe5b612998565b8715612992576000612978670de0b6b3a76400006109d16008888154811061295457fe5b906000526020600020906002020160010154600a0a8c61222190919063ffffffff16565b9050600098506129908a826008888154811061276957fe5b505b506129a1565b506001016127ad565b50505050505b505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a06908590612baf565b50505050565b6001600160a01b038216612a67576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612a7a908263ffffffff6121c016565b6002556001600160a01b038216600090815260208190526040902054612aa6908263ffffffff6121c016565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183612b4b5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561217d578181015183820152602001612165565b506000838581612b5757fe5b0495945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526129a79084905b6060612c04826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612c609092919063ffffffff16565b8051909150156129a757808060200190516020811015612c2357600080fd5b50516129a75760405162461bcd60e51b815260040180806020018281038252602a815260200180613110602a913960400191505060405180910390fd5b6060612c6f8484600085612c77565b949350505050565b6060612c8285612de4565b612cd3576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612d125780518252601f199092019160209182019101612cf3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612d74576040519150601f19603f3d011682016040523d82523d6000602084013e612d79565b606091505b50915091508115612d8d579150612c6f9050565b805115612d9d5780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561217d578181015183820152602001612165565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612c6f575050151592915050565b6040518060800160405280600490602082028036833750919291505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734465706f736974732068617665206265656e2073757370656e6465642c2062757420796f752063616e207374696c6c20776974686472617745524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373546f6b656e204944206973206f7574736964652072616e6765206f6620746f6b656e7320696e20636f6e747261637445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654661696c656420746f2077697468647261772066726f6d2074686520737472617465677954696d656c6f636b206e6f7420616371756972656420666f7220746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e7472616374206465706f7369746f722063616e6e6f742072656465656d20696e2073616d65207472616e73616374696f6e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734e6f20737472617465677920636f6e747261637420686173206265656e2073656c65637465642079657445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e7472616374206465706f7369746f72732063616e6e6f742074616b65206f7574206d6f7265207468616e207768617420746865792070757420696e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206a580a307783d99330718e0f0c76b54fb5280d5947d7c3be8c712fb55489e10564736f6c63430006060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7

-----Decoded View---------------
Arg [0] : _priceAsset (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7


Deployed Bytecode Sourcemap

33153:16650:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33153:16650: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;:::-;;;;;;;;;;;;;;;;;;;35627:104;;;:::i;:::-;;;;-1:-1:-1;;;;;35627: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;34082:31::-;;;:::i;36912:400::-;;;:::i;26473:84::-;;;:::i;46192:87::-;;;:::i;:::-;;46097;;;:::i;35916:259::-;;;:::i;:::-;;;;-1:-1:-1;;;;;35916:259: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;35739:165::-;;;:::i;36187:262::-;;;:::i;35503:112::-;;;:::i;17721:87::-;;;:::i;36461:439::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36461:439:0;-1:-1:-1;;;;;36461: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;48617: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;47995:139::-;;;:::i;37324:1141::-;;;:::i;:::-;;;;-1:-1:-1;;;;;37324:1141:0;;;;;;;;;;;;;;;;;;;;;46434:447;;;:::i;40802:2617::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40802:2617: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;38529:2261::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38529:2261:0;;;;;;;:::i;48246:359::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48246:359:0;-1:-1:-1;;;;;48246:359:0;;:::i;47797:186::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47797:186:0;-1:-1:-1;;;;;47797: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;35627:104::-;35707:16;;-1:-1:-1;;;;;35707:16:0;35627: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;34082:31::-;;;-1:-1:-1;;;34082:31:0;;;;;:::o;36912:400::-;36968:7;37021:15;37039:40;37073:4;37039:25;:40::i;:::-;37131:15;;37021:58;;-1:-1:-1;;;;;;37131:15:0;:48;37128:152;;37206:15;;;;;;;;;-1:-1:-1;;;;;37206:15:0;-1:-1:-1;;;;;37206:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37206:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37206:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37206:25:0;37195:36;37128:152;37297:7;-1:-1:-1;36912:400:0;:::o;26473:84::-;26543:6;;;;;-1:-1:-1;;;;;26543:6:0;;26473:84::o;46192: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;;;;;;;;;;;;;;;46252:12:::1;:19:::0;;-1:-1:-1;;;;46252:19:0::1;-1:-1:-1::0;;;46252:19:0::1;::::0;;46192:87::o;46097:::-;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;;;;;;;;;;;;;;;46156:12:::1;:20:::0;;-1:-1:-1;;;;46156:20:0::1;::::0;;46097:87::o;35916:259::-;35972:7;35981;35990;36089:9;36099:1;36089:12;;;;;;;;;;;;;;;;;;;;;:18;36118:9;:12;;-1:-1:-1;;;;;36089:18:0;;;;;;36118:12;;;;;;;;;;;;;;;;;;;:18;36147:9;:12;;-1:-1:-1;;;;;36118:18:0;;;;36147:9;;:12;;;;;;;;;;;;;;;;;;;:18;36073:94;;-1:-1:-1;36073:94:0;-1:-1:-1;;;;;;36147:18:0;;-1:-1:-1;35916:259:0;;;:::o;18751:119::-;-1:-1:-1;;;;;18844:18:0;18817:7;18844:18;;;;;;;;;;;;18751:119::o;35739:165::-;35874:21;;-1:-1:-1;;;;;35874:21:0;35739:165;:::o;36187:262::-;36233:7;36256:13;:11;:13::i;:::-;36253:189;;-1:-1:-1;36297:4:0;36290:11;;36253:189;36361:63;36410:13;:11;:13::i;:::-;36361:44;36379:25;:23;:25::i;:::-;36369:4;;36361:44;:17;:44;:::i;:::-;:48;:63;:48;:63;:::i;:::-;36354:70;;;;35503:112;35591:15;;-1:-1:-1;;;;;35591:15:0;35503: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;;;;;;;;;;;;;;;;;;;;;;;;36461:439;36535:7;;;36586:281;36609:9;:16;36605:20;;36586:281;;;36646:12;36661:9;36671:1;36661:12;;;;;;;;;;;;;;;;;;;;;;:18;:38;;;-1:-1:-1;;;36661:38:0;;-1:-1:-1;;;;;36661:38:0;;;;;;;;;:18;;;;;:28;;:38;;;;;;;;;;;:18;:38;;;2:2:-1;;;;27:1;24;17:12;2:2;36661:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36661:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36661:38:0;36744:9;:12;;36661:38;;-1:-1:-1;36721:45:0;;36754:1;;36744:12;;;;;;;;;;;;;;;;:21;;;36740:2;:25;36721:14;36730:4;36721;:8;;:14;;;;:::i;:45::-;36714:52;-1:-1:-1;36792:18:0;:8;36714:52;36792:18;:12;:18;:::i;:::-;36781:29;-1:-1:-1;;36627:3:0;;36586:281;;;-1:-1:-1;36884:8:0;36461:439;-1:-1:-1;;36461: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;48617: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;;;;;;;;;;;;;;;48693:1:::1;47374:5;47357:13;;:22;47349:74;;;;-1:-1:-1::0;;;47349:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47450:1;47434:13;:17:::0;;;47509:13:::1;:11;:13::i;:::-;:17;47506:184;;;47168:5;47618:14;;:34;47611:3;:41;;47603:75;;;::::0;;-1:-1:-1;;;47603:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47603:75:0;;;;;;;;;;;;;::::1;;48710:15:::2;::::0;-1:-1:-1;;;;;48710:15:0::2;:48:::0;;::::2;::::0;:69:::2;;;48778:1;48762:13;:11;:13::i;:::-;:17;48710:69;48707:186;;;48795:15;;;;;;;;;-1:-1:-1::0;;;;;48795:15:0::2;-1:-1:-1::0;;;;;48795:20:0::2;;:22;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;48795:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;48795:22:0;;;;48707:186;48939:17;::::0;48903:15:::2;:54:::0;;-1:-1:-1;;;;;;48903:54:0::2;-1:-1:-1::0;;;;;48939:17:0;;::::2;48903:54;::::0;;;;48971:15:::2;:48:::0;;::::2;::::0;:69:::2;;;49039:1;49023:13;:11;:13::i;:::-;:17;48971:69;48968:295;;;49056:22;:20;:22::i;:::-;49161:15;;;;;;;;;-1:-1:-1::0;;;;;49161:15:0::2;-1:-1:-1::0;;;;;49161:21:0::2;;:23;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;49161:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;49161:23:0;;;;48968:295;-1:-1:-1::0;49273:16:0::2;:29:::0;;-1:-1:-1;;;;;;49273:29:0::2;::::0;;48617:693::o;19078:175::-;19164:4;19181:42;19191:12;:10;:12::i;:::-;19205:9;19216:6;19181:9;:42::i;47995: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;;;;;;;;;;;;;;;48075:1:::1;47374:5;47357:13;;:22;47349:74;;;;-1:-1:-1::0;;;47349:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47450:1;47434:13;:17:::0;;;47509:13:::1;:11;:13::i;:::-;:17;47506:184;;;47168:5;47618:14;;:34;47611:3;:41;;47603:75;;;::::0;;-1:-1:-1;;;47603:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47603:75:0;;;;;;;;;;;;;::::1;;48108:17:::2;::::0;48089:37:::2;::::0;-1:-1:-1;;;;;48108:17:0::2;48089:18;:37::i;:::-;26760:1:::1;47995:139::o:0;37324:1141::-;37509:15;;37378:7;;;;-1:-1:-1;;;;;37509:15:0;:48;37506:952;;37580:15;;:39;;;-1:-1:-1;;;37580:39:0;;;;-1:-1:-1;;;;;37580:15:0;;;;:37;;:39;;;;;;;;;;;;;:15;:39;;;2:2:-1;;;;27:1;24;17:12;2:2;37580:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37580:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37580:39:0;;;;;;;;;-1:-1:-1;37580:39:0;-1:-1:-1;37573:46:0;;37506:952;37667:9;:16;37650:14;;;37777:426;37800:6;37796:1;:10;37777:426;;;37831:16;37850:84;37912:9;37922:1;37912:12;;;;;;;;;;;;;;;;;;:21;;;37908:2;:25;37850:53;37898:4;37850:9;37860:1;37850:12;;;;;;;;;;;;;;;;;;;;;;:18;:43;;;-1:-1:-1;;;37850:43:0;;37887:4;37850:43;;;;;;-1:-1:-1;;;;;37850:18:0;;;;:28;;:43;;;;;;;;;;:18;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;37850:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37850:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37850:43:0;;:53;:47;:53;:::i;:84::-;37831:103;-1:-1:-1;37956:12:0;;37953:235;;37995:22;;;:55;;;38033:17;38021:8;:29;;37995:55;37992:177;;;38098:8;38078:28;;38144:1;38133:12;;37992:177;-1:-1:-1;37808:3:0;;37777:426;;;-1:-1:-1;38220:21:0;;38217:230;;38277:9;38287:8;38277:19;;;;;;;;;;;;;;;;;;;;;:25;38305:9;:19;;-1:-1:-1;;;;;38277:25:0;;;;38315:8;;38305:19;;;;;;;;;;;;;;;;;;;;:25;:50;;;-1:-1:-1;;;38305:50:0;;38349:4;38305:50;;;;;;-1:-1:-1;;;;;38305:25:0;;;;:35;;:50;;;;;;;;;;:25;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;38305:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38305:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38305:50:0;38261:95;;-1:-1:-1;38305:50:0;-1:-1:-1;38261:95:0;;-1:-1:-1;;;38261:95:0;38217:230;-1:-1:-1;38411:1:0;;-1:-1:-1;38411:1:0;;-1:-1:-1;38395:22:0;;-1:-1:-1;;38395:22:0;37506:952;37324:1141;;:::o;46434: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;;;;;;;;;;;;;;;46502:12:::1;:20:::0;;-1:-1:-1;;;;46502:20:0::1;::::0;;46536:15:::1;::::0;-1:-1:-1;;;;;46536:15:0::1;:48:::0;;::::1;::::0;:69:::1;;;46604:1;46588:13;:11;:13::i;:::-;:17;46536:69;46533:186;;;46621:15;;;;;;;;;-1:-1:-1::0;;;;;46621:15:0::1;-1:-1:-1::0;;;;;46621:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;46621:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;46621:22:0;;;;46533:186;46729:15;:47:::0;;-1:-1:-1;;;;;;46729:47:0::1;::::0;;46773:1:::1;46787:13;:17:::0;46434:447::o;40802:2617::-;31218:1;31824:7;;:19;;31816:63;;;;;-1:-1:-1;;;31816:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31218:1;31957:7;:18;41074:9;41066:39:::1;;;::::0;;-1:-1:-1;;;41066:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41066:39:0;;;;;;;;;;;;;::::1;;41140:1;41124:13;:11;:13::i;:::-;:17;41116:49;;;::::0;;-1:-1:-1;;;41116:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41116:49:0;;;;;;;;;;;;;::::1;;41176:18;41197:13;:11;:13::i;:::-;41176:34;;41252:25;41258:12;:10;:12::i;:::-;41271:5;41252;:25::i;:::-;41356:16;41407:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41394:25:0::1;:9;-1:-1:-1::0;;;;;41394:25:0::1;;41391:366;;;-1:-1:-1::0;41449:4:0::1;41391:366;;;41643:3;41606:8;:22;41615:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41606:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41606:22:0;:34;:40:::1;:82:::0;::::1;;;;41687:1;41650:8;:22;41659:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41650:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41650:22:0;:34;:38:::1;41606:82;41598:147;;;;-1:-1:-1::0;;;41598:147:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41825:8;:22;41834:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41825:22:0::1;-1:-1:-1::0;;;;;41825:22:0::1;;;;;;;;;;;;:36;;;41816:5;:45;41813:437;;41916:47;41957:5;41916:8;:22;41925:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41916:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41916:22:0;:36:::1;;::::0;;:47:::1;:40;:47;:::i;:::-;41877:8;:22;41886:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41877:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41877:22:0;:36:::1;;:86:::0;41813:437:::1;;;42128:1;42089:8;:22;42098:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;42089:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;42089:22:0;:36:::1;::::0;;::::1;:40:::0;;;;42152:19;::::1;;;42144:94;;;;-1:-1:-1::0;;;42144:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42302:15;::::0;42262:22:::1;::::0;-1:-1:-1;;;;;42302:15:0::1;:48:::0;42299:1048:::1;;42383:15;::::0;-1:-1:-1;;;;;42383:15:0::1;:24;42408:12;:10;:12::i;:::-;42383:70;::::0;;-1:-1:-1;;;;;;42383:70:0::1;::::0;;;;;;-1:-1:-1;;;;;42383:70:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;::::1;;::::0;;;;;;;;;;::::1;::::0;;;;;;;;-1:-1:-1;42383:70:0;;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;42383:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42383:70:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;42383:70:0;;-1:-1:-1;42520:18:0;42512:67:::1;;;;-1:-1:-1::0;;;42512:67:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42299:1048;;;42733:10;42725:5;:18;42722:614;;;42763:16;42782:40;42816:4;42782:25;:40::i;:::-;42763:59:::0;-1:-1:-1;42841:18:0::1;42862:35;42886:10:::0;42862:19:::1;42763:59:::0;42875:5;42862:19:::1;:12;:19;:::i;:35::-;42841:56;;42916:51;42935:12;:10;:12::i;:::-;42949:10;42961:5;42916:18;:51::i;:::-;43049:10:::0;-1:-1:-1;42722:614:0::1;::::0;-1:-1:-1;42722:614:0::1;;43150:16;43169:40;43203:4;43169:25;:40::i;:::-;43150:59;;43228:48;43247:12;:10;:12::i;:::-;43261:8;43271:4;43228:18;:48::i;:::-;43312:8:::0;-1:-1:-1;42722:614:0::1;43382:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;43372:39:0::1;;43396:14;43372:39;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;31174:1:0;32136:7;:22;-1:-1:-1;;40802:2617:0:o;19311:151::-;-1:-1:-1;;;;;19427:18:0;;;19400:7;19427:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19311:151::o;38529:2261::-;31218:1;31824:7;;:19;;31816:63;;;;;-1:-1:-1;;;31816:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31218:1;31957:7;:18;38611:13:::1;38627:25;:23;:25::i;:::-;38740:12;::::0;38611:41;;-1:-1:-1;;;;38740:12:0;::::1;;;:20;;38756:4;38740:20;38732:89;;;;-1:-1:-1::0;;;38732:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38840:15;::::0;-1:-1:-1;;;;;38840:15:0::1;38832:102;;;;-1:-1:-1::0;;;38832:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38964:9;:16:::0;38953:27;::::1;38945:87;;;;-1:-1:-1::0;;;38945:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39053:13;39069:9;39079:8;39069:19;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;:25:::0;39141:31:::1;::::0;;-1:-1:-1;;;39141:31:0;;39166:4:::1;39141:31;::::0;::::1;::::0;;;-1:-1:-1;;;;;39069:25:0;;::::1;::::0;-1:-1:-1;39069:25:0;;39141:16:::1;::::0;:31;;;;;;;;;;39069:25;39141:31;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;39141:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39141:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;39141:31:0;;-1:-1:-1;39183:60:0::1;39207:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;39183:23:0;::::1;::::0;39229:4:::1;39236:6:::0;39183:60:::1;:23;:60;:::i;:::-;39297:31;::::0;;-1:-1:-1;;;39297:31:0;;39322:4:::1;39297:31;::::0;::::1;::::0;;;:44:::1;::::0;39333:7;;-1:-1:-1;;;;;39297: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;39297:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39297:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;39297:31:0;;:44:::1;:35;:44;:::i;:::-;39288:53;;39425:1;39416:6;:10;39408:39;;;::::0;;-1:-1:-1;;;39408:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39408:39:0;;;;;;;;;;;;;::::1;;39458:16;39509:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;39496:25:0::1;:9;-1:-1:-1::0;;;;;39496:25:0::1;;39493:106;;;-1:-1:-1::0;39551:4:0::1;39493:106;39636:15;::::0;:25:::1;::::0;;-1:-1:-1;;;39636:25:0;;;;39609:24:::1;::::0;-1:-1:-1;;;;;39636: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;39636:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39636:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;39636:25:0;;-1:-1:-1;39789:22:0::1;:20;:22::i;:::-;39873:15;::::0;:36:::1;::::0;;-1:-1:-1;;;39873:36:0;;;::::1;;;::::0;::::1;::::0;;;-1:-1:-1;;;;;39873: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;39873:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39873:36:0;;;;39985:16;39957:15;;;;;;;;;-1:-1:-1::0;;;;;39957:15:0::1;-1:-1:-1::0;;;;;39957:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;39957:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39957:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;39957:25:0;:44:::1;39949:86;;;::::0;;-1:-1:-1;;;39949:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;40073:24;40100:54;40125:9;40135:8;40125:19;;;;;;;;;;;;;;;;;;:28;;;40121:2;:32;40100:16;40111:4;40100:6;:10;;:16;;;;:::i;:54::-;40073:81:::0;-1:-1:-1;40073:81:0;40203:18:::1;40254:13;:11;:13::i;:::-;:17;40251:202;;;40369:46;40409:5;40369:35;40390:13;:11;:13::i;:::-;40369:16:::0;;:35:::1;:20;:35;:::i;:46::-;40356:59;;40251:202;40463:30;40469:12;:10;:12::i;:::-;40482:10;40463:5;:30::i;:::-;40630:3;40593:8;:22;40602:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;40593:22:0::1;-1:-1:-1::0;;;;;40593:22:0::1;;;;;;;;;;;;:34;;:40;;;;40683:52;40724:10;40683:8;:22;40692:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;40683:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;40683:22:0;:36:::1;;::::0;;:52:::1;:40;:52;:::i;:::-;40644:8;:22;40653:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;40644:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;40644:22:0;:36:::1;;:91:::0;40761:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;40753:29:0::1;;40775:6;40753:29;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;31174:1:0;32136:7;:22;-1:-1:-1;;;;;;;38529:2261:0:o;48246: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;;;;;;;;;;;;;;;48345:3:::1;48328:14;:20:::0;48375:1:::1;48359:13;:17:::0;48387::::1;:28:::0;;-1:-1:-1;;;;;48387:28:0;::::1;-1:-1:-1::0;;;;;;48387:28:0;;::::1;::::0;::::1;::::0;;;48426:16:::1;:27:::0;;;;::::1;::::0;;::::1;::::0;;48467:13:::1;:11;:13::i;:::-;48464:134;;48564:22;:20;:22::i;47797: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;;;;;;;;;;;;;;;47898:3:::1;47881:14;:20:::0;47928:1:::1;47912:13;:17:::0;47940::::1;:28:::0;;-1:-1:-1;;;;;;47940:28:0::1;-1:-1:-1::0;;;;;47940:28:0;;;::::1;::::0;;;::::1;::::0;;47797: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;49322:447::-;49395:15;;:35;;;-1:-1:-1;;;49395:35:0;;;;49374:18;;-1:-1:-1;;;;;49395:15:0;;:33;;:35;;;;;;;;;;;;;;:15;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;49395:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49395:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49395:35:0;;-1:-1:-1;49445:9:0;49441:321;49464:10;49460:1;:14;49441:321;;;49526:15;;:37;;;-1:-1:-1;;;49526:37:0;;;;;;;;;;49495:13;;-1:-1:-1;;;;;49526:15:0;;:34;;:37;;;;;;;;;;;;;;:15;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;49526:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49526:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49526:37:0;49599:31;;;-1:-1:-1;;;49599:31:0;;49624:4;49599:31;;;;;;49526:37;;-1:-1:-1;49580:16:0;;-1:-1:-1;;;;;49599:16:0;;;;;:31;;;;;49526:37;;49599:31;;;;;;;:16;:31;;;2:2:-1;;;;27:1;24;17:12;2:2;49599:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49599:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49599:31:0;;-1:-1:-1;49648:12:0;;49645:106;;49708:15;;49680:55;;-1:-1:-1;;;;;49680:19:0;;;;49708:15;49726:8;49680:55;:19;:55;:::i;:::-;-1:-1:-1;;49476:3:0;;49441:321;;;;49322: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;43542:2425::-;43666:9;:16;43708:4;43696:16;;;;43693:356;;;43772:9;43768:249;43791:6;43787:1;:10;43768:249;;;43822:12;43837:9;43847:1;43837:12;;;;;;;;;;;;;;;;;;;;;;:18;:43;;;-1:-1:-1;;;43837:43:0;;43874:4;43837:43;;;;;;-1:-1:-1;;;;;43837:18:0;;;;:28;;:43;;;;;;;;;;:18;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;43837:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43837:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43837:43:0;;-1:-1:-1;43902:8:0;;43899:103;;43934:48;43966:9;43977:4;43934:9;43944:1;43934:12;;;;;;;;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;43934:18:0;;:48;;:31;:48;:::i;:::-;-1:-1:-1;43799:3:0;;43768:249;;;;44031:7;;;43693:356;44059:19;;:::i;:::-;44089:16;;;44160:1800;44183:6;44179:1;:10;44160:1800;;;44244:1;;-1:-1:-1;44244:1:0;44348:441;44373:6;44368:2;:11;44348:441;;;44408:4;44413:2;44408:8;;;;;;;;;;;44405:369;;44449:16;44468:86;44531:9;44541:2;44531:13;;;;;;;44468:86;44449:105;-1:-1:-1;44580:22:0;;;:55;;;44618:17;44606:8;:29;;44580:55;44577:178;;;44683:8;44663:28;;44729:2;44718:13;;44577:178;44405:369;;44381:4;;44348:441;;;;44820:4;44803;44808:8;44803:14;;;;;;;:21;;;:14;;;;;:21;44994:9;:19;;44896:26;;44925:98;;45004:8;;44994:19;;;;;;;;;;;;;;;;:28;;;44990:2;:32;44925:60;44980:4;44925:9;44935:8;44925:19;;;;;;;:98;44896:127;;45063:15;45041:18;:37;45038:911;;45163:22;;45160:270;;45227:39;:15;45247:18;45227:39;:19;:39;:::i;:::-;45209:57;;45289:101;45328:9;45339;45349:8;45339:19;;;;;;;;;;;;;;;;;;;;;;:25;:50;;;-1:-1:-1;;;45339:50:0;;45383:4;45339:50;;;;;;-1:-1:-1;;;;;45339:25:0;;;;:35;;:50;;;;;;;;;;:25;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;45339:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45339:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45339:50:0;45289:9;:19;;45299:8;;45289:19;;;;;:101;45038:911;;;45531:19;;45528:354;;45656:16;45675:63;45733:4;45675:53;45699:9;45709:8;45699:19;;;;;;;;;;;;;;;;;;:28;;;45695:2;:32;45675:15;:19;;:53;;;;:::i;:63::-;45656:82;;45779:1;45761:19;;45803:59;45842:9;45853:8;45803:9;45813:8;45803:19;;;;;;;:59;45528:354;;45900:5;;;45038:911;-1:-1:-1;44191:3:0;;44160:1800;;;;43542:2425;;;;;;;;:::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;;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;33153:16650::-;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;-1:-1;33153:16650:0;;;-1:-1:-1;;33153:16650:0:o

Swarm Source

ipfs://6a580a307783d99330718e0f0c76b54fb5280d5947d7c3be8c712fb55489e105
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.