ETH Price: $2,672.85 (+0.71%)
Gas: 6 Gwei

Token

Stabilize Strategy AMPL (zs-AMPL)
 

Overview

Max Total Supply

3.515961935407897606 zs-AMPL

Holders

1

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 zs-AMPL

Value
$0.00
0x1d847a1d6aa4b751b7e32eed29a659b802d37a4e
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 2021-04-23
*/

// 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-AMPL.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

// Users by default withdraw from main pool before collateral pool

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 AMPL", "zs-AMPL"), Ownable, ReentrancyGuard {
    using SafeERC20 for IERC20;

    // Variables
    uint256 constant DIVISION_FACTOR = 100000;
    
    // This token container doesn't have a fee but the underlying strategies may for AMPL
    
    // 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 is a single asset wrapper that only accepts main token
    // AMPL, USDC
    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 AMPL
        IERC20 _token = IERC20(address(0xD46bA6D942050d489DBd938a2C909A5d5039A161));
        tokenList.push(
            TokenInfo({
                token: _token,
                decimals: _token.decimals()
            })
        );
        
        // USDC
        _token = IERC20(address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48));
        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[] memory) {
        // Returns all addresses accepted by this token vault
        address[] memory addresses = new address[](tokenList.length);
        uint256 length = tokenList.length;
        for(uint256 i = 0; i < length; i++){
            addresses[i] = address(tokenList[i].token);
        }
        return addresses;
    }
    
    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 of main token, and if none available, the collateral asset
        if(currentStrategy != StabilizeStrategy(address(0))){
            return currentStrategy.withdrawTokenReserves();
        }else{
            if(tokenList[0].token.balanceOf(address(this)) > 0){
                return (address(tokenList[0].token), tokenList[0].token.balanceOf(address(this)));
            }else if(tokenList[1].token.balanceOf(address(this)) > 0){
                return (address(tokenList[1].token), tokenList[1].token.balanceOf(address(this)));
            }else{
                return (address(0), 0); // No balance
            }
        }
    }
    
    
    // Now handle deposits into the strategy
    function deposit(uint256 amount) 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");
        
        IERC20 _token = tokenList[0].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[0].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 main token then collateral if available
        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);
                withdrawPerOrder(_msgSender(), _myBalance, false); // This will withdraw based on token balanace
                withdrawAmount = _myBalance;
            }else{
                // We are all shares, transfer all
                uint256 _balance = getNormalizedTotalBalance(address(this));
                withdrawPerOrder(_msgSender(), _balance, true);
                withdrawAmount = _balance;
            }
        }
        
        emit Unwrapped(_msgSender(), withdrawAmount);
    }
    
    // This will withdraw the tokens from the contract based on order, essentially main token then collateral
    function withdrawPerOrder(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;
        }

        for(uint256 i = 0; i < length; i++){
            // Determine the balance left
            uint256 _normalizedBalance = tokenList[i].token.balanceOf(address(this)).mul(1e18).div(10**tokenList[i].decimals);
            if(_normalizedBalance <= _withdrawAmount){
                // Withdraw the entire balance of this token
                if(_normalizedBalance > 0){
                    _withdrawAmount = _withdrawAmount.sub(_normalizedBalance);
                    tokenList[i].token.safeTransfer(_receiver, tokenList[i].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[i].decimals).div(1e18);
                    _withdrawAmount = 0;
                    tokenList[i].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 TIMELOCK_DURATION = 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 + TIMELOCK_DURATION, "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"}],"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[]"}],"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"}]

60806040526009805460ff60a01b1916600160a01b1790553480156200002457600080fd5b506040516200358638038062003586833981810160405260208110156200004a57600080fd5b5051604080518082018252601781527f53746162696c697a6520537472617465677920414d504c0000000000000000006020828101918252835180850190945260078452661e9ccb5053541360ca1b908401528151919291620000b09160039162000330565b508051620000c690600490602084019062000330565b50506005805460ff19166012179055506000620000eb6001600160e01b036200017216565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600655600980546001600160a01b0319166001600160a01b0383161790556200016b62000177565b50620003d2565b335b90565b600073d46ba6d942050d489dbd938a2c909a5d5039a161905060086040518060400160405280836001600160a01b03168152602001836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620001e657600080fd5b505afa158015620001fb573d6000803e3d6000fd5b505050506040513d60208110156200021257600080fd5b505160ff1690528154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b039093169290921782559183015191015560408051808201825273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48808252825163313ce56760e01b81529251909450600893919283830192869263313ce567926004808201939291829003018186803b158015620002b957600080fd5b505afa158015620002ce573d6000803e3d6000fd5b505050506040513d6020811015620002e557600080fd5b505160ff1690528154600180820184556000938452602093849020835160029093020180546001600160a01b0319166001600160a01b03909316929092178255919092015191015550565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200037357805160ff1916838001178555620003a3565b82800160010185558215620003a3579182015b82811115620003a357825182559160200191906001019062000386565b50620003b1929150620003b5565b5090565b6200017491905b80821115620003b15760008155600101620003bc565b6131a480620003e26000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80637b1b1de611610104578063b6b55f25116100a2578063db006a7511610071578063db006a7514610500578063dd62ed3e1461051d578063f63aeac31461054b578063f800877614610571576101da565b8063b6b55f25146104a8578063b9195072146104c5578063c650ea59146104cd578063d9a74be0146104f8576101da565b80639d63b8f7116100de5780639d63b8f714610422578063a457c2d714610448578063a4b88e7b14610474578063a9059cbb1461047c576101da565b80637b1b1de61461040a57806383249ef91461041257806395d89b411461041a576101da565b8063549c46271161017c5780635cbe86bc1161014b5780635cbe86bc1461037c5780636d8ac22d1461038457806370a08231146103dc5780637158da7c14610402576101da565b8063549c46271461035a578063563a7956146103625780635aa6e6751461036a5780635c27af8714610372576101da565b806323b872dd116101b857806323b872dd146102b6578063313ce567146102ec57806337c6de961461030a578063395093511461032e576101da565b806306fdde03146101df578063095ea7b31461025c57806318160ddd1461029c575b600080fd5b6101e7610597565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610221578181015183820152602001610209565b50505050905090810190601f16801561024e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102886004803603604081101561027257600080fd5b506001600160a01b03813516906020013561062e565b604080519115158252519081900360200190f35b6102a461064c565b60408051918252519081900360200190f35b610288600480360360608110156102cc57600080fd5b506001600160a01b03813581169160208101359091169060400135610652565b6102f46106df565b6040805160ff9092168252519081900360200190f35b6103126106e8565b604080516001600160a01b039092168252519081900360200190f35b6102886004803603604081101561034457600080fd5b506001600160a01b0381351690602001356106f7565b61028861074b565b6102a461075b565b6103126107fc565b61037a610810565b005b61037a610882565b61038c6108ee565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103c85781810151838201526020016103b0565b505050509050019250505060405180910390f35b6102a4600480360360208110156103f257600080fd5b50356001600160a01b03166109a8565b6103126109c3565b6102a46109d2565b610312610a2d565b6101e7610a3c565b6102a46004803603602081101561043857600080fd5b50356001600160a01b0316610a9d565b6102886004803603604081101561045e57600080fd5b506001600160a01b038135169060200135610ba8565b61037a610c16565b6102886004803603604081101561049257600080fd5b506001600160a01b038135169060200135610e6d565b61037a600480360360208110156104be57600080fd5b5035610e81565b61037a61144e565b6104d561156e565b604080516001600160a01b03909316835260208301919091528051918290030190f35b61037a611834565b61037a6004803603602081101561051657600080fd5b5035611944565b6102a46004803603604081101561053357600080fd5b506001600160a01b0381358116916020013516611dd9565b61037a6004803603602081101561056157600080fd5b50356001600160a01b0316611e04565b61037a6004803603602081101561058757600080fd5b50356001600160a01b0316611ea9565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106235780601f106105f857610100808354040283529160200191610623565b820191906000526020600020905b81548152906001019060200180831161060657829003601f168201915b505050505090505b90565b600061064261063b611f31565b8484611f35565b5060015b92915050565b60025490565b600061065f848484612021565b6106d58461066b611f31565b6106d085604051806060016040528060288152602001612fd2602891396001600160a01b038a166000908152600160205260408120906106a9611f31565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61217d16565b611f35565b5060019392505050565b60055460ff1690565b600b546001600160a01b031690565b6000610642610704611f31565b846106d08560016000610715611f31565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61221416565b600954600160a01b900460ff1681565b60008061076730610a9d565b600a549091506001600160a01b0316156107f757600a60009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b1580156107c957600080fd5b505afa1580156107dd573d6000803e3d6000fd5b505050506040513d60208110156107f357600080fd5b5051015b905090565b60055461010090046001600160a01b031690565b610818611f31565b60055461010090046001600160a01b0390811691161461086d576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b6009805460ff60a01b1916600160a01b179055565b61088a611f31565b60055461010090046001600160a01b039081169116146108df576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b6009805460ff60a01b19169055565b600854606090819067ffffffffffffffff8111801561090c57600080fd5b50604051908082528060200260200182016040528015610936578160200160208202803683370190505b5060085490915060005b818110156109a0576008818154811061095557fe5b600091825260209091206002909102015483516001600160a01b039091169084908390811061098057fe5b6001600160a01b0390921660209283029190910190910152600101610940565b509091505090565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b031690565b60006109dc61064c565b6109ef5750670de0b6b3a764000061062b565b610a266109fa61064c565b610a1a610a0561075b565b670de0b6b3a76400009063ffffffff61227516565b9063ffffffff6122ce16565b905061062b565b600a546001600160a01b031690565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106235780601f106105f857610100808354040283529160200191610623565b600080805b600854811015610ba157600060088281548110610abb57fe5b600091825260209182902060029091020154604080516370a0823160e01b81526001600160a01b038981166004830152915191909216926370a082319260248082019391829003018186803b158015610b1357600080fd5b505afa158015610b27573d6000803e3d6000fd5b505050506040513d6020811015610b3d57600080fd5b505160088054919250610b849184908110610b5457fe5b906000526020600020906002020160010154600a0a610a1a670de0b6b3a76400008461227590919063ffffffff16565b9050610b96838263ffffffff61221416565b925050600101610aa2565b5092915050565b6000610642610bb5611f31565b846106d08560405180606001604052806025815260200161314a6025913960016000610bdf611f31565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61217d16565b610c1e611f31565b60055461010090046001600160a01b03908116911614610c73576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b600280600d5414610cb55760405162461bcd60e51b8152600401808060200182810382526027815260200180612f8a6027913960400191505060405180910390fd5b6000600d819055610cc461064c565b1115610d1e5762015180600c5401421015610d1e576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b600a546001600160a01b031615801590610d3f57506000610d3d61064c565b115b15610dad57600a60009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d9457600080fd5b505af1158015610da8573d6000803e3d6000fd5b505050505b600e54600a80546001600160a01b0319166001600160a01b0392831617908190551615801590610de457506000610de261064c565b115b15610e5a57610df1612310565b600a60009054906101000a90046001600160a01b03166001600160a01b031663e97dcb626040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e4157600080fd5b505af1158015610e55573d6000803e3d6000fd5b505050505b50600b80546001600160a01b0319169055565b6000610642610e7a611f31565b8484612021565b60026006541415610ed9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026006556000610ee861075b565b600954909150600160a01b900460ff161515600114610f385760405162461bcd60e51b8152600401808060200182810382526038815260200180612e9e6038913960400191505060405180910390fd5b600a546001600160a01b0316610f7f5760405162461bcd60e51b815260040180806020018281038252602a815260200180613094602a913960400191505060405180910390fd5b60006008600081548110610f8f57fe5b60009182526020808320600290920290910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b158015610fe757600080fd5b505afa158015610ffb573d6000803e3d6000fd5b505050506040513d602081101561101157600080fd5b50519050611038611020611f31565b6001600160a01b03841690308763ffffffff6124b416565b604080516370a0823160e01b815230600482015290516110bc9183916001600160a01b038616916370a08231916024808301926020929190829003018186803b15801561108457600080fd5b505afa158015611098573d6000803e3d6000fd5b505050506040513d60208110156110ae57600080fd5b50519063ffffffff61251416565b935060008411611106576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6000611110611f31565b6001600160a01b0316326001600160a01b0316141561112d575060015b600a54604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b15801561117257600080fd5b505afa158015611186573d6000803e3d6000fd5b505050506040513d602081101561119c57600080fd5b505190506111a8612310565b600a54604080516362b939e160e11b8152841515600482015290516001600160a01b039092169163c57273c29160248082019260009290919082900301818387803b1580156111f657600080fd5b505af115801561120a573d6000803e3d6000fd5b5050505080600a60009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561125d57600080fd5b505afa158015611271573d6000803e3d6000fd5b505050506040513d602081101561128757600080fd5b5051116112db576040805162461bcd60e51b815260206004820152601d60248201527f4e6f206368616e676520696e2073747261746567792062616c616e6365000000604482015290519081900360640190fd5b600061131e60086000815481106112ee57fe5b906000526020600020906002020160010154600a0a610a1a670de0b6b3a76400008a61227590919063ffffffff16565b905080600061132b61064c565b11156113505761134d87610a1a61134061064c565b859063ffffffff61227516565b90505b61136161135b611f31565b82612556565b426007600061136e611f31565b6001600160a01b03166001600160a01b03168152602001908152602001600020600001819055506113ce81600760006113a5611f31565b6001600160a01b031681526020810191909152604001600020600101549063ffffffff61221416565b600760006113da611f31565b6001600160a01b031681526020810191909152604001600020600101556113ff611f31565b6001600160a01b03167f4700c1726b4198077cd40320a32c45265a1910521eb0ef713dd1d8412413d7fc896040518082815260200191505060405180910390a250506001600655505050505050565b611456611f31565b60055461010090046001600160a01b039081169116146114ab576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b600180600d54146114ed5760405162461bcd60e51b8152600401808060200182810382526027815260200180612f8a6027913960400191505060405180910390fd5b6000600d8190556114fc61064c565b11156115565762015180600c5401421015611556576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b600e5461156b906001600160a01b0316612646565b50565b600a5460009081906001600160a01b03161561160357600a546040805163c650ea5960e01b815281516001600160a01b039093169263c650ea5992600480840193919291829003018186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d60408110156115f057600080fd5b5080516020909101519092509050611830565b6000600860008154811061161357fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561166757600080fd5b505afa15801561167b573d6000803e3d6000fd5b505050506040513d602081101561169157600080fd5b505111156117595760086000815481106116a757fe5b60009182526020822060029091020154600880546001600160a01b039092169290916116cf57fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561172357600080fd5b505afa158015611737573d6000803e3d6000fd5b505050506040513d602081101561174d57600080fd5b50519092509050611830565b6000600860018154811061176957fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156117bd57600080fd5b505afa1580156117d1573d6000803e3d6000fd5b505050506040513d60208110156117e757600080fd5b505111156118295760086001815481106117fd57fe5b6000918252602090912060029091020154600880546001600160a01b039092169160019081106116cf57fe5b5060009050805b9091565b61183c611f31565b60055461010090046001600160a01b03908116911614611891576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b6009805460ff60a01b19169055600a546001600160a01b0316158015906118bf575060006118bd61064c565b115b1561192d57600a60009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561191457600080fd5b505af1158015611928573d6000803e3d6000fd5b505050505b600a80546001600160a01b03191690556000600d55565b6002600654141561199c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600655806119e7576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b60006119f161064c565b11611a39576040805162461bcd60e51b81526020600482015260136024820152724e6f2076616c75652072656465656d61626c6560681b604482015290519081900360640190fd5b6000611a4361064c565b9050611a56611a50611f31565b8361274f565b6000611a60611f31565b6001600160a01b0316326001600160a01b03161415611a8157506001611b15565b4260076000611a8e611f31565b6001600160a01b03168152602081019190915260400160002054108015611ada5750600060076000611abe611f31565b6001600160a01b03168152602081019190915260400160002054115b611b155760405162461bcd60e51b815260040180806020018281038252603481526020018061301a6034913960400191505060405180910390fd5b60076000611b21611f31565b6001600160a01b03166001600160a01b03168152602001908152602001600020600101548311611bb257611b848360076000611b5b611f31565b6001600160a01b031681526020810191909152604001600020600101549063ffffffff61251416565b60076000611b90611f31565b6001600160a01b03168152602081019190915260400160002060010155611c21565b600060076000611bc0611f31565b6001600160a01b03168152602081019190915260400160002060019081019190915581151514611c215760405162461bcd60e51b815260040180806020018281038252603e8152602001806130e2603e913960400191505060405180910390fd5b600a546000906001600160a01b031615611d1a57600a546001600160a01b031663234b6745611c4e611f31565b604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482018890526044820187905285151560648301525160848083019260209291908290030181600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b505050506040513d6020811015611cd557600080fd5b5051905080611d155760405162461bcd60e51b8152600401808060200182810382526024815260200180612f666024913960400191505060405180910390fd5b611d86565b82841015611d63576000611d2d30610a9d565b90506000611d4585610a1a848963ffffffff61227516565b9050611d5a611d52611f31565b82600061284b565b9150611d869050565b6000611d6e30610a9d565b9050611d83611d7b611f31565b82600161284b565b90505b611d8e611f31565b6001600160a01b03167f95ae649bfaaef9def56a52f4fb2d9e8fa5496bb7082930e442c74cc76b03dcb3826040518082815260200191505060405180910390a2505060016006555050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611e0c611f31565b60055461010090046001600160a01b03908116911614611e61576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b42600c556002600d55600e80546001600160a01b0383166001600160a01b03199182168117909255600b80549091169091179055611e9d61064c565b61156b5761156b610c16565b611eb1611f31565b60055461010090046001600160a01b03908116911614611f06576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b42600c556001600d55600e80546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316611f7a5760405162461bcd60e51b81526004018080602001828103825260248152602001806130be6024913960400191505060405180910390fd5b6001600160a01b038216611fbf5760405162461bcd60e51b8152600401808060200182810382526022815260200180612f1e6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166120665760405162461bcd60e51b815260040180806020018281038252602581526020018061306f6025913960400191505060405180910390fd5b6001600160a01b0382166120ab5760405162461bcd60e51b8152600401808060200182810382526023815260200180612e7b6023913960400191505060405180910390fd5b6120ee81604051806060016040528060268152602001612f40602691396001600160a01b038616600090815260208190526040902054919063ffffffff61217d16565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612123908263ffffffff61221416565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561220c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156121d15781810151838201526020016121b9565b50505050905090810190601f1680156121fe5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561226e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261228457506000610646565b8282028284828161229157fe5b041461226e5760405162461bcd60e51b8152600401808060200182810382526021815260200180612fb16021913960400191505060405180910390fd5b600061226e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b59565b600a546040805163780d9d2d60e01b815290516000926001600160a01b03169163780d9d2d916004808301926020929190829003018186803b15801561235557600080fd5b505afa158015612369573d6000803e3d6000fd5b505050506040513d602081101561237f57600080fd5b5051905060005b818110156124b057600a5460408051635930a0a160e01b81526004810184905290516000926001600160a01b031691635930a0a1916024808301926020929190829003018186803b1580156123da57600080fd5b505afa1580156123ee573d6000803e3d6000fd5b505050506040513d602081101561240457600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561245257600080fd5b505afa158015612466573d6000803e3d6000fd5b505050506040513d602081101561247c57600080fd5b5051905080156124a657600a546124a6906001600160a01b0384811691168363ffffffff612bbe16565b5050600101612386565b5050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261250e908590612c0c565b50505050565b600061226e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061217d565b6001600160a01b0382166125b1576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6002546125c4908263ffffffff61221416565b6002556001600160a01b0382166000908152602081905260409020546125f0908263ffffffff61221416565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b61264e611f31565b60055461010090046001600160a01b039081169116146126a3576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b6001600160a01b0381166126e85760405162461bcd60e51b8152600401808060200182810382526026815260200180612ef86026913960400191505060405180910390fd5b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0382166127945760405162461bcd60e51b815260040180806020018281038252602181526020018061304e6021913960400191505060405180910390fd5b6127d781604051806060016040528060228152602001612ed6602291396001600160a01b038516600090815260208190526040902054919063ffffffff61217d16565b6001600160a01b038316600090815260208190526040902055600254612803908263ffffffff61251416565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600854600182151514156129445760005b8181101561293d5760006008828154811061287357fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156128c757600080fd5b505afa1580156128db573d6000803e3d6000fd5b505050506040513d60208110156128f157600080fd5b5051905080156129345761293486826008858154811061290d57fe5b60009182526020909120600290910201546001600160a01b0316919063ffffffff612bbe16565b5060010161285c565b5050612b54565b60005b81811015612b51576000612a1b6008838154811061296157fe5b906000526020600020906002020160010154600a0a610a1a670de0b6b3a76400006008868154811061298f57fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156129e357600080fd5b505afa1580156129f7573d6000803e3d6000fd5b505050506040513d6020811015612a0d57600080fd5b50519063ffffffff61227516565b9050848111612ae0578015612adb57612a3a858263ffffffff61251416565b9450612adb8660088481548110612a4d57fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015612aa157600080fd5b505afa158015612ab5573d6000803e3d6000fd5b505050506040513d6020811015612acb57600080fd5b5051600880548690811061290d57fe5b612b48565b8415612b42576000612b28670de0b6b3a7640000610a1a60088681548110612b0457fe5b906000526020600020906002020160010154600a0a8961227590919063ffffffff16565b905060009550612b4087826008868154811061290d57fe5b505b50612b51565b50600101612947565b50505b505050565b60008183612ba85760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156121d15781810151838201526020016121b9565b506000838581612bb457fe5b0495945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612b549084905b6060612c61826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612cbd9092919063ffffffff16565b805190915015612b5457808060200190516020811015612c8057600080fd5b5051612b545760405162461bcd60e51b815260040180806020018281038252602a815260200180613120602a913960400191505060405180910390fd5b6060612ccc8484600085612cd4565b949350505050565b6060612cdf85612e41565b612d30576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612d6f5780518252601f199092019160209182019101612d50565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612dd1576040519150601f19603f3d011682016040523d82523d6000602084013e612dd6565b606091505b50915091508115612dea579150612ccc9050565b805115612dfa5780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156121d15781810151838201526020016121b9565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612ccc57505015159291505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734465706f736974732068617665206265656e2073757370656e6465642c2062757420796f752063616e207374696c6c20776974686472617745524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654661696c656420746f2077697468647261772066726f6d2074686520737472617465677954696d656c6f636b206e6f7420616371756972656420666f7220746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e7472616374206465706f7369746f722063616e6e6f742072656465656d20696e2073616d65207472616e73616374696f6e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734e6f20737472617465677920636f6e747261637420686173206265656e2073656c65637465642079657445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e7472616374206465706f7369746f72732063616e6e6f742074616b65206f7574206d6f7265207468616e207768617420746865792070757420696e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b98bb702e230e6c063f631f0d057120d4dc76a04b54d9e7f52dc883bb779886a64736f6c63430006060033000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80637b1b1de611610104578063b6b55f25116100a2578063db006a7511610071578063db006a7514610500578063dd62ed3e1461051d578063f63aeac31461054b578063f800877614610571576101da565b8063b6b55f25146104a8578063b9195072146104c5578063c650ea59146104cd578063d9a74be0146104f8576101da565b80639d63b8f7116100de5780639d63b8f714610422578063a457c2d714610448578063a4b88e7b14610474578063a9059cbb1461047c576101da565b80637b1b1de61461040a57806383249ef91461041257806395d89b411461041a576101da565b8063549c46271161017c5780635cbe86bc1161014b5780635cbe86bc1461037c5780636d8ac22d1461038457806370a08231146103dc5780637158da7c14610402576101da565b8063549c46271461035a578063563a7956146103625780635aa6e6751461036a5780635c27af8714610372576101da565b806323b872dd116101b857806323b872dd146102b6578063313ce567146102ec57806337c6de961461030a578063395093511461032e576101da565b806306fdde03146101df578063095ea7b31461025c57806318160ddd1461029c575b600080fd5b6101e7610597565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610221578181015183820152602001610209565b50505050905090810190601f16801561024e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102886004803603604081101561027257600080fd5b506001600160a01b03813516906020013561062e565b604080519115158252519081900360200190f35b6102a461064c565b60408051918252519081900360200190f35b610288600480360360608110156102cc57600080fd5b506001600160a01b03813581169160208101359091169060400135610652565b6102f46106df565b6040805160ff9092168252519081900360200190f35b6103126106e8565b604080516001600160a01b039092168252519081900360200190f35b6102886004803603604081101561034457600080fd5b506001600160a01b0381351690602001356106f7565b61028861074b565b6102a461075b565b6103126107fc565b61037a610810565b005b61037a610882565b61038c6108ee565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103c85781810151838201526020016103b0565b505050509050019250505060405180910390f35b6102a4600480360360208110156103f257600080fd5b50356001600160a01b03166109a8565b6103126109c3565b6102a46109d2565b610312610a2d565b6101e7610a3c565b6102a46004803603602081101561043857600080fd5b50356001600160a01b0316610a9d565b6102886004803603604081101561045e57600080fd5b506001600160a01b038135169060200135610ba8565b61037a610c16565b6102886004803603604081101561049257600080fd5b506001600160a01b038135169060200135610e6d565b61037a600480360360208110156104be57600080fd5b5035610e81565b61037a61144e565b6104d561156e565b604080516001600160a01b03909316835260208301919091528051918290030190f35b61037a611834565b61037a6004803603602081101561051657600080fd5b5035611944565b6102a46004803603604081101561053357600080fd5b506001600160a01b0381358116916020013516611dd9565b61037a6004803603602081101561056157600080fd5b50356001600160a01b0316611e04565b61037a6004803603602081101561058757600080fd5b50356001600160a01b0316611ea9565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106235780601f106105f857610100808354040283529160200191610623565b820191906000526020600020905b81548152906001019060200180831161060657829003601f168201915b505050505090505b90565b600061064261063b611f31565b8484611f35565b5060015b92915050565b60025490565b600061065f848484612021565b6106d58461066b611f31565b6106d085604051806060016040528060288152602001612fd2602891396001600160a01b038a166000908152600160205260408120906106a9611f31565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61217d16565b611f35565b5060019392505050565b60055460ff1690565b600b546001600160a01b031690565b6000610642610704611f31565b846106d08560016000610715611f31565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61221416565b600954600160a01b900460ff1681565b60008061076730610a9d565b600a549091506001600160a01b0316156107f757600a60009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b1580156107c957600080fd5b505afa1580156107dd573d6000803e3d6000fd5b505050506040513d60208110156107f357600080fd5b5051015b905090565b60055461010090046001600160a01b031690565b610818611f31565b60055461010090046001600160a01b0390811691161461086d576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b6009805460ff60a01b1916600160a01b179055565b61088a611f31565b60055461010090046001600160a01b039081169116146108df576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b6009805460ff60a01b19169055565b600854606090819067ffffffffffffffff8111801561090c57600080fd5b50604051908082528060200260200182016040528015610936578160200160208202803683370190505b5060085490915060005b818110156109a0576008818154811061095557fe5b600091825260209091206002909102015483516001600160a01b039091169084908390811061098057fe5b6001600160a01b0390921660209283029190910190910152600101610940565b509091505090565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b031690565b60006109dc61064c565b6109ef5750670de0b6b3a764000061062b565b610a266109fa61064c565b610a1a610a0561075b565b670de0b6b3a76400009063ffffffff61227516565b9063ffffffff6122ce16565b905061062b565b600a546001600160a01b031690565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106235780601f106105f857610100808354040283529160200191610623565b600080805b600854811015610ba157600060088281548110610abb57fe5b600091825260209182902060029091020154604080516370a0823160e01b81526001600160a01b038981166004830152915191909216926370a082319260248082019391829003018186803b158015610b1357600080fd5b505afa158015610b27573d6000803e3d6000fd5b505050506040513d6020811015610b3d57600080fd5b505160088054919250610b849184908110610b5457fe5b906000526020600020906002020160010154600a0a610a1a670de0b6b3a76400008461227590919063ffffffff16565b9050610b96838263ffffffff61221416565b925050600101610aa2565b5092915050565b6000610642610bb5611f31565b846106d08560405180606001604052806025815260200161314a6025913960016000610bdf611f31565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61217d16565b610c1e611f31565b60055461010090046001600160a01b03908116911614610c73576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b600280600d5414610cb55760405162461bcd60e51b8152600401808060200182810382526027815260200180612f8a6027913960400191505060405180910390fd5b6000600d819055610cc461064c565b1115610d1e5762015180600c5401421015610d1e576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b600a546001600160a01b031615801590610d3f57506000610d3d61064c565b115b15610dad57600a60009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d9457600080fd5b505af1158015610da8573d6000803e3d6000fd5b505050505b600e54600a80546001600160a01b0319166001600160a01b0392831617908190551615801590610de457506000610de261064c565b115b15610e5a57610df1612310565b600a60009054906101000a90046001600160a01b03166001600160a01b031663e97dcb626040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e4157600080fd5b505af1158015610e55573d6000803e3d6000fd5b505050505b50600b80546001600160a01b0319169055565b6000610642610e7a611f31565b8484612021565b60026006541415610ed9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026006556000610ee861075b565b600954909150600160a01b900460ff161515600114610f385760405162461bcd60e51b8152600401808060200182810382526038815260200180612e9e6038913960400191505060405180910390fd5b600a546001600160a01b0316610f7f5760405162461bcd60e51b815260040180806020018281038252602a815260200180613094602a913960400191505060405180910390fd5b60006008600081548110610f8f57fe5b60009182526020808320600290920290910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b158015610fe757600080fd5b505afa158015610ffb573d6000803e3d6000fd5b505050506040513d602081101561101157600080fd5b50519050611038611020611f31565b6001600160a01b03841690308763ffffffff6124b416565b604080516370a0823160e01b815230600482015290516110bc9183916001600160a01b038616916370a08231916024808301926020929190829003018186803b15801561108457600080fd5b505afa158015611098573d6000803e3d6000fd5b505050506040513d60208110156110ae57600080fd5b50519063ffffffff61251416565b935060008411611106576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6000611110611f31565b6001600160a01b0316326001600160a01b0316141561112d575060015b600a54604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b15801561117257600080fd5b505afa158015611186573d6000803e3d6000fd5b505050506040513d602081101561119c57600080fd5b505190506111a8612310565b600a54604080516362b939e160e11b8152841515600482015290516001600160a01b039092169163c57273c29160248082019260009290919082900301818387803b1580156111f657600080fd5b505af115801561120a573d6000803e3d6000fd5b5050505080600a60009054906101000a90046001600160a01b03166001600160a01b031663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561125d57600080fd5b505afa158015611271573d6000803e3d6000fd5b505050506040513d602081101561128757600080fd5b5051116112db576040805162461bcd60e51b815260206004820152601d60248201527f4e6f206368616e676520696e2073747261746567792062616c616e6365000000604482015290519081900360640190fd5b600061131e60086000815481106112ee57fe5b906000526020600020906002020160010154600a0a610a1a670de0b6b3a76400008a61227590919063ffffffff16565b905080600061132b61064c565b11156113505761134d87610a1a61134061064c565b859063ffffffff61227516565b90505b61136161135b611f31565b82612556565b426007600061136e611f31565b6001600160a01b03166001600160a01b03168152602001908152602001600020600001819055506113ce81600760006113a5611f31565b6001600160a01b031681526020810191909152604001600020600101549063ffffffff61221416565b600760006113da611f31565b6001600160a01b031681526020810191909152604001600020600101556113ff611f31565b6001600160a01b03167f4700c1726b4198077cd40320a32c45265a1910521eb0ef713dd1d8412413d7fc896040518082815260200191505060405180910390a250506001600655505050505050565b611456611f31565b60055461010090046001600160a01b039081169116146114ab576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b600180600d54146114ed5760405162461bcd60e51b8152600401808060200182810382526027815260200180612f8a6027913960400191505060405180910390fd5b6000600d8190556114fc61064c565b11156115565762015180600c5401421015611556576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b600e5461156b906001600160a01b0316612646565b50565b600a5460009081906001600160a01b03161561160357600a546040805163c650ea5960e01b815281516001600160a01b039093169263c650ea5992600480840193919291829003018186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d60408110156115f057600080fd5b5080516020909101519092509050611830565b6000600860008154811061161357fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561166757600080fd5b505afa15801561167b573d6000803e3d6000fd5b505050506040513d602081101561169157600080fd5b505111156117595760086000815481106116a757fe5b60009182526020822060029091020154600880546001600160a01b039092169290916116cf57fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561172357600080fd5b505afa158015611737573d6000803e3d6000fd5b505050506040513d602081101561174d57600080fd5b50519092509050611830565b6000600860018154811061176957fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156117bd57600080fd5b505afa1580156117d1573d6000803e3d6000fd5b505050506040513d60208110156117e757600080fd5b505111156118295760086001815481106117fd57fe5b6000918252602090912060029091020154600880546001600160a01b039092169160019081106116cf57fe5b5060009050805b9091565b61183c611f31565b60055461010090046001600160a01b03908116911614611891576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b6009805460ff60a01b19169055600a546001600160a01b0316158015906118bf575060006118bd61064c565b115b1561192d57600a60009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561191457600080fd5b505af1158015611928573d6000803e3d6000fd5b505050505b600a80546001600160a01b03191690556000600d55565b6002600654141561199c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600655806119e7576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b60006119f161064c565b11611a39576040805162461bcd60e51b81526020600482015260136024820152724e6f2076616c75652072656465656d61626c6560681b604482015290519081900360640190fd5b6000611a4361064c565b9050611a56611a50611f31565b8361274f565b6000611a60611f31565b6001600160a01b0316326001600160a01b03161415611a8157506001611b15565b4260076000611a8e611f31565b6001600160a01b03168152602081019190915260400160002054108015611ada5750600060076000611abe611f31565b6001600160a01b03168152602081019190915260400160002054115b611b155760405162461bcd60e51b815260040180806020018281038252603481526020018061301a6034913960400191505060405180910390fd5b60076000611b21611f31565b6001600160a01b03166001600160a01b03168152602001908152602001600020600101548311611bb257611b848360076000611b5b611f31565b6001600160a01b031681526020810191909152604001600020600101549063ffffffff61251416565b60076000611b90611f31565b6001600160a01b03168152602081019190915260400160002060010155611c21565b600060076000611bc0611f31565b6001600160a01b03168152602081019190915260400160002060019081019190915581151514611c215760405162461bcd60e51b815260040180806020018281038252603e8152602001806130e2603e913960400191505060405180910390fd5b600a546000906001600160a01b031615611d1a57600a546001600160a01b031663234b6745611c4e611f31565b604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482018890526044820187905285151560648301525160848083019260209291908290030181600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b505050506040513d6020811015611cd557600080fd5b5051905080611d155760405162461bcd60e51b8152600401808060200182810382526024815260200180612f666024913960400191505060405180910390fd5b611d86565b82841015611d63576000611d2d30610a9d565b90506000611d4585610a1a848963ffffffff61227516565b9050611d5a611d52611f31565b82600061284b565b9150611d869050565b6000611d6e30610a9d565b9050611d83611d7b611f31565b82600161284b565b90505b611d8e611f31565b6001600160a01b03167f95ae649bfaaef9def56a52f4fb2d9e8fa5496bb7082930e442c74cc76b03dcb3826040518082815260200191505060405180910390a2505060016006555050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611e0c611f31565b60055461010090046001600160a01b03908116911614611e61576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b42600c556002600d55600e80546001600160a01b0383166001600160a01b03199182168117909255600b80549091169091179055611e9d61064c565b61156b5761156b610c16565b611eb1611f31565b60055461010090046001600160a01b03908116911614611f06576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b42600c556001600d55600e80546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316611f7a5760405162461bcd60e51b81526004018080602001828103825260248152602001806130be6024913960400191505060405180910390fd5b6001600160a01b038216611fbf5760405162461bcd60e51b8152600401808060200182810382526022815260200180612f1e6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166120665760405162461bcd60e51b815260040180806020018281038252602581526020018061306f6025913960400191505060405180910390fd5b6001600160a01b0382166120ab5760405162461bcd60e51b8152600401808060200182810382526023815260200180612e7b6023913960400191505060405180910390fd5b6120ee81604051806060016040528060268152602001612f40602691396001600160a01b038616600090815260208190526040902054919063ffffffff61217d16565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612123908263ffffffff61221416565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561220c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156121d15781810151838201526020016121b9565b50505050905090810190601f1680156121fe5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561226e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261228457506000610646565b8282028284828161229157fe5b041461226e5760405162461bcd60e51b8152600401808060200182810382526021815260200180612fb16021913960400191505060405180910390fd5b600061226e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b59565b600a546040805163780d9d2d60e01b815290516000926001600160a01b03169163780d9d2d916004808301926020929190829003018186803b15801561235557600080fd5b505afa158015612369573d6000803e3d6000fd5b505050506040513d602081101561237f57600080fd5b5051905060005b818110156124b057600a5460408051635930a0a160e01b81526004810184905290516000926001600160a01b031691635930a0a1916024808301926020929190829003018186803b1580156123da57600080fd5b505afa1580156123ee573d6000803e3d6000fd5b505050506040513d602081101561240457600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561245257600080fd5b505afa158015612466573d6000803e3d6000fd5b505050506040513d602081101561247c57600080fd5b5051905080156124a657600a546124a6906001600160a01b0384811691168363ffffffff612bbe16565b5050600101612386565b5050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261250e908590612c0c565b50505050565b600061226e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061217d565b6001600160a01b0382166125b1576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6002546125c4908263ffffffff61221416565b6002556001600160a01b0382166000908152602081905260409020546125f0908263ffffffff61221416565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b61264e611f31565b60055461010090046001600160a01b039081169116146126a3576040805162461bcd60e51b81526020600482018190526024820152600080516020612ffa833981519152604482015290519081900360640190fd5b6001600160a01b0381166126e85760405162461bcd60e51b8152600401808060200182810382526026815260200180612ef86026913960400191505060405180910390fd5b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0382166127945760405162461bcd60e51b815260040180806020018281038252602181526020018061304e6021913960400191505060405180910390fd5b6127d781604051806060016040528060228152602001612ed6602291396001600160a01b038516600090815260208190526040902054919063ffffffff61217d16565b6001600160a01b038316600090815260208190526040902055600254612803908263ffffffff61251416565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600854600182151514156129445760005b8181101561293d5760006008828154811061287357fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156128c757600080fd5b505afa1580156128db573d6000803e3d6000fd5b505050506040513d60208110156128f157600080fd5b5051905080156129345761293486826008858154811061290d57fe5b60009182526020909120600290910201546001600160a01b0316919063ffffffff612bbe16565b5060010161285c565b5050612b54565b60005b81811015612b51576000612a1b6008838154811061296157fe5b906000526020600020906002020160010154600a0a610a1a670de0b6b3a76400006008868154811061298f57fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156129e357600080fd5b505afa1580156129f7573d6000803e3d6000fd5b505050506040513d6020811015612a0d57600080fd5b50519063ffffffff61227516565b9050848111612ae0578015612adb57612a3a858263ffffffff61251416565b9450612adb8660088481548110612a4d57fe5b600091825260209182902060029091020154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015612aa157600080fd5b505afa158015612ab5573d6000803e3d6000fd5b505050506040513d6020811015612acb57600080fd5b5051600880548690811061290d57fe5b612b48565b8415612b42576000612b28670de0b6b3a7640000610a1a60088681548110612b0457fe5b906000526020600020906002020160010154600a0a8961227590919063ffffffff16565b905060009550612b4087826008868154811061290d57fe5b505b50612b51565b50600101612947565b50505b505050565b60008183612ba85760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156121d15781810151838201526020016121b9565b506000838581612bb457fe5b0495945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612b549084905b6060612c61826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612cbd9092919063ffffffff16565b805190915015612b5457808060200190516020811015612c8057600080fd5b5051612b545760405162461bcd60e51b815260040180806020018281038252602a815260200180613120602a913960400191505060405180910390fd5b6060612ccc8484600085612cd4565b949350505050565b6060612cdf85612e41565b612d30576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612d6f5780518252601f199092019160209182019101612d50565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612dd1576040519150601f19603f3d011682016040523d82523d6000602084013e612dd6565b606091505b50915091508115612dea579150612ccc9050565b805115612dfa5780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156121d15781810151838201526020016121b9565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612ccc57505015159291505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734465706f736974732068617665206265656e2073757370656e6465642c2062757420796f752063616e207374696c6c20776974686472617745524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654661696c656420746f2077697468647261772066726f6d2074686520737472617465677954696d656c6f636b206e6f7420616371756972656420666f7220746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e7472616374206465706f7369746f722063616e6e6f742072656465656d20696e2073616d65207472616e73616374696f6e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734e6f20737472617465677920636f6e747261637420686173206265656e2073656c65637465642079657445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e7472616374206465706f7369746f72732063616e6e6f742074616b65206f7574206d6f7265207468616e207768617420746865792070757420696e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b98bb702e230e6c063f631f0d057120d4dc76a04b54d9e7f52dc883bb779886a64736f6c63430006060033

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

000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

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

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


Deployed Bytecode Sourcemap

33224:15272:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33224:15272: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;:::-;;;;;;;;;;;;;;;;;;;35459:104;;;:::i;:::-;;;;-1:-1:-1;;;;;35459: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;34175:31::-;;;:::i;36886:400::-;;;:::i;26473:84::-;;;:::i;44885:87::-;;;:::i;:::-;;44790;;;:::i;35748:401::-;;;:::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;35748:401: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;35571:165::-;;;:::i;36161:262::-;;;:::i;35335:112::-;;;:::i;17721:87::-;;;:::i;36435:439::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36435:439:0;-1:-1:-1;;;;;36435: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;47310: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;38154:2131::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38154:2131:0;;:::i;46688:139::-;;;:::i;37298:792::-;;;:::i;:::-;;;;-1:-1:-1;;;;;37298:792:0;;;;;;;;;;;;;;;;;;;;;45127:447;;;:::i;40297:2601::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40297:2601: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;46939:359::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;46939:359:0;-1:-1:-1;;;;;46939:359:0;;:::i;46490:186::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;46490:186:0;-1:-1:-1;;;;;46490: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;35459:104::-;35539:16;;-1:-1:-1;;;;;35539:16:0;35459: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;34175:31::-;;;-1:-1:-1;;;34175:31:0;;;;;:::o;36886:400::-;36942:7;36995:15;37013:40;37047:4;37013:25;:40::i;:::-;37105:15;;36995:58;;-1:-1:-1;;;;;;37105:15:0;:48;37102:152;;37180:15;;;;;;;;;-1:-1:-1;;;;;37180:15:0;-1:-1:-1;;;;;37180:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37180:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37180:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37180:25:0;37169:36;37102:152;37271:7;-1:-1:-1;36886:400:0;:::o;26473:84::-;26543:6;;;;;-1:-1:-1;;;;;26543:6:0;;26473:84::o;44885: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;;;;;;;;;;;;;;;44945:12:::1;:19:::0;;-1:-1:-1;;;;44945:19:0::1;-1:-1:-1::0;;;44945:19:0::1;::::0;;44885:87::o;44790:::-;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;;;;;;;;;;;;;;;44849:12:::1;:20:::0;;-1:-1:-1;;;;44849:20:0::1;::::0;;44790:87::o;35748:401::-;35939:9;:16;35804;;;;35925:31;;;2:2:-1;;;;27:1;24;17:12;2:2;35925:31:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;35925:31:0;-1:-1:-1;35984:9:0;:16;35896:60;;-1:-1:-1;35967:14:0;36011:104;36034:6;36030:1;:10;36011:104;;;36084:9;36094:1;36084:12;;;;;;;;;;;;;;;;;;;;;:18;36061:12;;-1:-1:-1;;;;;36084:18:0;;;;36061:9;;36071:1;;36061:12;;;;;;-1:-1:-1;;;;;36061:42:0;;;:12;;;;;;;;;;;:42;36042:3;;36011:104;;;-1:-1:-1;36132:9:0;;-1:-1:-1;;35748:401:0;:::o;18751:119::-;-1:-1:-1;;;;;18844:18:0;18817:7;18844:18;;;;;;;;;;;;18751:119::o;35571:165::-;35706:21;;-1:-1:-1;;;;;35706:21:0;35571:165;:::o;36161:262::-;36207:7;36230:13;:11;:13::i;:::-;36227:189;;-1:-1:-1;36271:4:0;36264:11;;36227:189;36335:63;36384:13;:11;:13::i;:::-;36335:44;36353:25;:23;:25::i;:::-;36343:4;;36335:44;:17;:44;:::i;:::-;:48;:63;:48;:63;:::i;:::-;36328:70;;;;35335:112;35423:15;;-1:-1:-1;;;;;35423:15:0;35335: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;;;;;;;;;;;;;;;;;;;;;;;;36435:439;36509:7;;;36560:281;36583:9;:16;36579:20;;36560:281;;;36620:12;36635:9;36645:1;36635:12;;;;;;;;;;;;;;;;;;;;;;:18;:38;;;-1:-1:-1;;;36635:38:0;;-1:-1:-1;;;;;36635:38:0;;;;;;;;;:18;;;;;:28;;:38;;;;;;;;;;;:18;:38;;;2:2:-1;;;;27:1;24;17:12;2:2;36635:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36635:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36635:38:0;36718:9;:12;;36635:38;;-1:-1:-1;36695:45:0;;36728:1;;36718:12;;;;;;;;;;;;;;;;:21;;;36714:2;:25;36695:14;36704:4;36695;:8;;:14;;;;:::i;:45::-;36688:52;-1:-1:-1;36766:18:0;:8;36688:52;36766:18;:12;:18;:::i;:::-;36755:29;-1:-1:-1;;36601:3:0;;36560:281;;;-1:-1:-1;36858:8:0;36435:439;-1:-1:-1;;36435: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;47310: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;;;;;;;;;;;;;;;47386:1:::1;46067:5;46050:13;;:22;46042:74;;;;-1:-1:-1::0;;;46042:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46143:1;46127:13;:17:::0;;;46202:13:::1;:11;:13::i;:::-;:17;46199:184;;;45861:5;46311:14;;:34;46304:3;:41;;46296:75;;;::::0;;-1:-1:-1;;;46296:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;46296:75:0;;;;;;;;;;;;;::::1;;47403:15:::2;::::0;-1:-1:-1;;;;;47403:15:0::2;:48:::0;;::::2;::::0;:69:::2;;;47471:1;47455:13;:11;:13::i;:::-;:17;47403:69;47400:186;;;47488:15;;;;;;;;;-1:-1:-1::0;;;;;47488:15:0::2;-1:-1:-1::0;;;;;47488:20:0::2;;:22;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;47488:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;47488:22:0;;;;47400:186;47632:17;::::0;47596:15:::2;:54:::0;;-1:-1:-1;;;;;;47596:54:0::2;-1:-1:-1::0;;;;;47632:17:0;;::::2;47596:54;::::0;;;;47664:15:::2;:48:::0;;::::2;::::0;:69:::2;;;47732:1;47716:13;:11;:13::i;:::-;:17;47664:69;47661:295;;;47749:22;:20;:22::i;:::-;47854:15;;;;;;;;;-1:-1:-1::0;;;;;47854:15:0::2;-1:-1:-1::0;;;;;47854:21:0::2;;:23;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;47854:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;47854:23:0;;;;47661:295;-1:-1:-1::0;47966:16:0::2;:29:::0;;-1:-1:-1;;;;;;47966:29:0::2;::::0;;47310:693::o;19078:175::-;19164:4;19181:42;19191:12;:10;:12::i;:::-;19205:9;19216:6;19181:9;:42::i;38154:2131::-;31218:1;31824:7;;:19;;31816:63;;;;;-1:-1:-1;;;31816:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31218:1;31957:7;:18;38218:13:::1;38234:25;:23;:25::i;:::-;38347:12;::::0;38218:41;;-1:-1:-1;;;;38347:12:0;::::1;;;:20;;38363:4;38347:20;38339:89;;;;-1:-1:-1::0;;;38339:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38447:15;::::0;-1:-1:-1;;;;;38447:15:0::1;38439:102;;;;-1:-1:-1::0;;;38439:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38562:13;38578:9;38588:1;38578:12;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;:18:::0;38643:31:::1;::::0;;-1:-1:-1;;;38643:31:0;;38668:4:::1;38643:31;::::0;::::1;::::0;;;-1:-1:-1;;;;;38578:18:0;;::::1;::::0;-1:-1:-1;38578:18:0;;38643:16:::1;::::0;:31;;;;;;;;;;38578:18;38643:31;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;38643:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38643:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;38643:31:0;;-1:-1:-1;38685:60:0::1;38709:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;38685:23:0;::::1;::::0;38731:4:::1;38738:6:::0;38685:60:::1;:23;:60;:::i;:::-;38799:31;::::0;;-1:-1:-1;;;38799:31:0;;38824:4:::1;38799:31;::::0;::::1;::::0;;;:44:::1;::::0;38835:7;;-1:-1:-1;;;;;38799: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;38799:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38799:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;38799:31:0;;:44:::1;:35;:44;:::i;:::-;38790:53;;38927:1;38918:6;:10;38910:39;;;::::0;;-1:-1:-1;;;38910:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38910:39:0;;;;;;;;;;;;;::::1;;38960:16;39011:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;38998:25:0::1;:9;-1:-1:-1::0;;;;;38998:25:0::1;;38995:106;;;-1:-1:-1::0;39053:4:0::1;38995:106;39138:15;::::0;:25:::1;::::0;;-1:-1:-1;;;39138:25:0;;;;39111:24:::1;::::0;-1:-1:-1;;;;;39138: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;39138:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39138:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;39138:25:0;;-1:-1:-1;39291:22:0::1;:20;:22::i;:::-;39375:15;::::0;:36:::1;::::0;;-1:-1:-1;;;39375:36:0;;;::::1;;;::::0;::::1;::::0;;;-1:-1:-1;;;;;39375: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;39375:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39375:36:0;;;;39487:16;39459:15;;;;;;;;;-1:-1:-1::0;;;;;39459:15:0::1;-1:-1:-1::0;;;;;39459:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;39459:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39459:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;39459:25:0;:44:::1;39451:86;;;::::0;;-1:-1:-1;;;39451:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39575:24;39602:47;39627:9;39637:1;39627:12;;;;;;;;;;;;;;;;;;:21;;;39623:2;:25;39602:16;39613:4;39602:6;:10;;:16;;;;:::i;:47::-;39575:74:::0;-1:-1:-1;39575:74:0;39698:18:::1;39749:13;:11;:13::i;:::-;:17;39746:202;;;39864:46;39904:5;39864:35;39885:13;:11;:13::i;:::-;39864:16:::0;;:35:::1;:20;:35;:::i;:46::-;39851:59;;39746:202;39958:30;39964:12;:10;:12::i;:::-;39977:10;39958:5;:30::i;:::-;40125:3;40088:8;:22;40097:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;40088:22:0::1;-1:-1:-1::0;;;;;40088:22:0::1;;;;;;;;;;;;:34;;:40;;;;40178:52;40219:10;40178:8;:22;40187:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;40178:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;40178:22:0;:36:::1;;::::0;;:52:::1;:40;:52;:::i;:::-;40139:8;:22;40148:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;40139:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;40139:22:0;:36:::1;;:91:::0;40256:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;40248:29:0::1;;40270:6;40248:29;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;31174:1:0;32136:7;:22;-1:-1:-1;;;;;;38154:2131:0:o;46688: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;;;;;;;;;;;;;;;46768:1:::1;46067:5;46050:13;;:22;46042:74;;;;-1:-1:-1::0;;;46042:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46143:1;46127:13;:17:::0;;;46202:13:::1;:11;:13::i;:::-;:17;46199:184;;;45861:5;46311:14;;:34;46304:3;:41;;46296:75;;;::::0;;-1:-1:-1;;;46296:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;46296:75:0;;;;;;;;;;;;;::::1;;46801:17:::2;::::0;46782:37:::2;::::0;-1:-1:-1;;;;;46801:17:0::2;46782:18;:37::i;:::-;26760:1:::1;46688:139::o:0;37298:792::-;37517:15;;37352:7;;;;-1:-1:-1;;;;;37517:15:0;:48;37514:569;;37588:15;;:39;;;-1:-1:-1;;;37588:39:0;;;;-1:-1:-1;;;;;37588:15:0;;;;:37;;:39;;;;;;;;;;;;;:15;:39;;;2:2:-1;;;;27:1;24;17:12;2:2;37588:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37588:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37588:39:0;;;;;;;;;-1:-1:-1;37588:39:0;-1:-1:-1;37581:46:0;;37514:569;37707:1;37661:9;37671:1;37661:12;;;;;;;;;;;;;;;;;;;;;;:18;:43;;;-1:-1:-1;;;37661:43:0;;37698:4;37661:43;;;;;;-1:-1:-1;;;;;37661:18:0;;;;:28;;:43;;;;;;;;;;:18;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;37661:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37661:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37661:43:0;:47;37658:414;;;37744:9;37754:1;37744:12;;;;;;;;;;;;;;;;;;;;:18;37765:9;:12;;-1:-1:-1;;;;;37744:18:0;;;;37765:9;;:12;;;;;;;;;;;;;;;;;;:18;:43;;;-1:-1:-1;;;37765:43:0;;37802:4;37765:43;;;;;;-1:-1:-1;;;;;37765:18:0;;;;:28;;:43;;;;;;;;;;:18;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;37765:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37765:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37765:43:0;37728:81;;-1:-1:-1;37765:43:0;-1:-1:-1;37728:81:0;;37658:414;37879:1;37833:9;37843:1;37833:12;;;;;;;;;;;;;;;;;;;;;;:18;:43;;;-1:-1:-1;;;37833:43:0;;37870:4;37833:43;;;;;;-1:-1:-1;;;;;37833:18:0;;;;:28;;:43;;;;;;;;;;:18;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;37833:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37833:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37833:43:0;:47;37830:242;;;37916:9;37926:1;37916:12;;;;;;;;;;;;;;;;;;;;;:18;37937:9;:12;;-1:-1:-1;;;;;37916:18:0;;;;;;37937:12;;;;;37830:242;-1:-1:-1;38036:1:0;;-1:-1:-1;38036:1:0;37830:242;37298:792;;:::o;45127: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;;;;;;;;;;;;;;;45195:12:::1;:20:::0;;-1:-1:-1;;;;45195:20:0::1;::::0;;45229:15:::1;::::0;-1:-1:-1;;;;;45229:15:0::1;:48:::0;;::::1;::::0;:69:::1;;;45297:1;45281:13;:11;:13::i;:::-;:17;45229:69;45226:186;;;45314:15;;;;;;;;;-1:-1:-1::0;;;;;45314:15:0::1;-1:-1:-1::0;;;;;45314:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;45314:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;45314:22:0;;;;45226:186;45422:15;:47:::0;;-1:-1:-1;;;;;;45422:47:0::1;::::0;;45466:1:::1;45480:13;:17:::0;45127:447::o;40297:2601::-;31218:1;31824:7;;:19;;31816:63;;;;;-1:-1:-1;;;31816:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31218:1;31957:7;:18;40557:9;40549:39:::1;;;::::0;;-1:-1:-1;;;40549:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40549:39:0;;;;;;;;;;;;;::::1;;40623:1;40607:13;:11;:13::i;:::-;:17;40599:49;;;::::0;;-1:-1:-1;;;40599:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40599:49:0;;;;;;;;;;;;;::::1;;40659:18;40680:13;:11;:13::i;:::-;40659:34;;40735:25;40741:12;:10;:12::i;:::-;40754:5;40735;:25::i;:::-;40839:16;40890:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;40877:25:0::1;:9;-1:-1:-1::0;;;;;40877:25:0::1;;40874:366;;;-1:-1:-1::0;40932:4:0::1;40874:366;;;41126:3;41089:8;:22;41098:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41089:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41089:22:0;:34;:40:::1;:82:::0;::::1;;;;41170:1;41133:8;:22;41142:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41133:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41133:22:0;:34;:38:::1;41089:82;41081:147;;;;-1:-1:-1::0;;;41081:147:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41308:8;:22;41317:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41308:22:0::1;-1:-1:-1::0;;;;;41308:22:0::1;;;;;;;;;;;;:36;;;41299:5;:45;41296:437;;41399:47;41440:5;41399:8;:22;41408:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41399:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41399:22:0;:36:::1;;::::0;;:47:::1;:40;:47;:::i;:::-;41360:8;:22;41369:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41360:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41360:22:0;:36:::1;;:86:::0;41296:437:::1;;;41611:1;41572:8;:22;41581:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;41572:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41572:22:0;:36:::1;::::0;;::::1;:40:::0;;;;41635:19;::::1;;;41627:94;;;;-1:-1:-1::0;;;41627:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41785:15;::::0;41745:22:::1;::::0;-1:-1:-1;;;;;41785:15:0::1;:48:::0;41782:1044:::1;;41866:15;::::0;-1:-1:-1;;;;;41866:15:0::1;:24;41891:12;:10;:12::i;:::-;41866:70;::::0;;-1:-1:-1;;;;;;41866:70:0::1;::::0;;;;;;-1:-1:-1;;;;;41866:70:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;::::1;;::::0;;;;;;;;;;::::1;::::0;;;;;;;;-1:-1:-1;41866:70:0;;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;41866:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41866:70:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41866:70:0;;-1:-1:-1;42003:18:0;41995:67:::1;;;;-1:-1:-1::0;;;41995:67:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41782:1044;;;42216:10;42208:5;:18;42205:610;;;42246:16;42265:40;42299:4;42265:25;:40::i;:::-;42246:59:::0;-1:-1:-1;42324:18:0::1;42345:35;42369:10:::0;42345:19:::1;42246:59:::0;42358:5;42345:19:::1;:12;:19;:::i;:35::-;42324:56;;42399:49;42416:12;:10;:12::i;:::-;42430:10;42442:5;42399:16;:49::i;:::-;42530:10:::0;-1:-1:-1;42205:610:0::1;::::0;-1:-1:-1;42205:610:0::1;;42631:16;42650:40;42684:4;42650:25;:40::i;:::-;42631:59;;42709:46;42726:12;:10;:12::i;:::-;42740:8;42750:4;42709:16;:46::i;:::-;42791:8:::0;-1:-1:-1;42205:610:0::1;42861:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;42851:39:0::1;;42875:14;42851:39;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;31174:1:0;32136:7;:22;-1:-1:-1;;40297:2601:0:o;19311:151::-;-1:-1:-1;;;;;19427:18:0;;;19400:7;19427:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19311:151::o;46939: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;;;;;;;;;;;;;;;47038:3:::1;47021:14;:20:::0;47068:1:::1;47052:13;:17:::0;47080::::1;:28:::0;;-1:-1:-1;;;;;47080:28:0;::::1;-1:-1:-1::0;;;;;;47080:28:0;;::::1;::::0;::::1;::::0;;;47119:16:::1;:27:::0;;;;::::1;::::0;;::::1;::::0;;47160:13:::1;:11;:13::i;:::-;47157:134;;47257:22;:20;:22::i;46490: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;;;;;;;;;;;;;;;46591:3:::1;46574:14;:20:::0;46621:1:::1;46605:13;:17:::0;46633::::1;:28:::0;;-1:-1:-1;;;;;;46633:28:0::1;-1:-1:-1::0;;;;;46633:28:0;;;::::1;::::0;;;::::1;::::0;;46490: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;48015:447::-;48088:15;;:35;;;-1:-1:-1;;;48088:35:0;;;;48067:18;;-1:-1:-1;;;;;48088:15:0;;:33;;:35;;;;;;;;;;;;;;:15;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;48088:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48088:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48088:35:0;;-1:-1:-1;48138:9:0;48134:321;48157:10;48153:1;:14;48134:321;;;48219:15;;:37;;;-1:-1:-1;;;48219:37:0;;;;;;;;;;48188:13;;-1:-1:-1;;;;;48219:15:0;;:34;;:37;;;;;;;;;;;;;;:15;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;48219:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48219:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48219:37:0;48292:31;;;-1:-1:-1;;;48292:31:0;;48317:4;48292:31;;;;;;48219:37;;-1:-1:-1;48273:16:0;;-1:-1:-1;;;;;48292:16:0;;;;;:31;;;;;48219:37;;48292:31;;;;;;;:16;:31;;;2:2:-1;;;;27:1;24;17:12;2:2;48292:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48292:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48292:31:0;;-1:-1:-1;48341:12:0;;48338:106;;48401:15;;48373:55;;-1:-1:-1;;;;;48373:19:0;;;;48401:15;48419:8;48373:55;:19;:55;:::i;:::-;-1:-1:-1;;48169:3:0;;48134:321;;;;48015:447;:::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;5190:136::-;5248:7;5275:43;5279:1;5282;5275:43;;;;;;;;;;;;;;;;;:3;:43::i;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;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;43021:1639::-;43143:9;:16;43185:4;43173:16;;;;43170:356;;;43249:9;43245:249;43268:6;43264:1;:10;43245:249;;;43299:12;43314:9;43324:1;43314:12;;;;;;;;;;;;;;;;;;;;;;:18;:43;;;-1:-1:-1;;;43314:43:0;;43351:4;43314:43;;;;;;-1:-1:-1;;;;;43314:18:0;;;;:28;;:43;;;;;;;;;;:18;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;43314:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43314:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43314:43:0;;-1:-1:-1;43379:8:0;;43376:103;;43411:48;43443:9;43454:4;43411:9;43421:1;43411:12;;;;;;;;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;43411:18:0;;:48;;:31;:48;:::i;:::-;-1:-1:-1;43276:3:0;;43245:249;;;;43508:7;;;43170:356;43542:9;43538:1115;43561:6;43557:1;:10;43538:1115;;;43631:26;43660:84;43722:9;43732:1;43722:12;;;;;;;;;;;;;;;;;;:21;;;43718:2;:25;43660:53;43708:4;43660:9;43670:1;43660:12;;;;;;;;;;;;;;;;;;;;;;:18;:43;;;-1:-1:-1;;;43660:43:0;;43697:4;43660:43;;;;;;-1:-1:-1;;;;;43660:18:0;;;;:28;;:43;;;;;;;;;;:18;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;43660:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43660:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43660:43:0;;:53;:47;:53;:::i;:84::-;43631:113;;43784:15;43762:18;:37;43759:883;;43884:22;;43881:256;;43948:39;:15;43968:18;43948:39;:19;:39;:::i;:::-;43930:57;;44010:87;44042:9;44053;44063:1;44053:12;;;;;;;;;;;;;;;;;;;;;;:18;:43;;;-1:-1:-1;;;44053:43:0;;44090:4;44053:43;;;;;;-1:-1:-1;;;;;44053:18:0;;;;:28;;:43;;;;;;;;;;:18;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;44053:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44053:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44053:43:0;44010:9;:12;;44020:1;;44010:12;;;;;:87;43759:883;;;44238:19;;44235:340;;44363:16;44382:56;44433:4;44382:46;44406:9;44416:1;44406:12;;;;;;;;;;;;;;;;;;:21;;;44402:2;:25;44382:15;:19;;:46;;;;:::i;:56::-;44363:75;;44479:1;44461:19;;44503:52;44535:9;44546:8;44503:9;44513:1;44503:12;;;;;;;:52;44235:340;;44593:5;;;43759:883;-1:-1:-1;43569:3:0;;43538:1115;;;;43021:1639;;;;;:::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

Swarm Source

ipfs://b98bb702e230e6c063f631f0d057120d4dc76a04b54d9e7f52dc883bb779886a
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.