ETH Price: $3,490.13 (-0.03%)

Token

ZETA (ZETA)
 

Overview

Max Total Supply

1,530,907.04153168180190791 ZETA

Holders

65

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
squid42.eth
Balance
0.447962898058007617 ZETA

Value
$0.00
0x455d7Eb74860d0937423b9184f9e8461aa354Ebb
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:
ZETA

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-07
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    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;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        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);
            }
        }
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    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;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. 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 returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface IAdmin {
    function admin() external view returns (address);
}

interface IUNIStakingRewards {
    function stake(uint amount) external;
    function withdraw(uint amount) external;
    function getReward() external;
    function rewardPerToken() external view returns (uint);
    function rewardPerTokenStored() external view returns (uint);
    function earned(address account) external view returns (uint);
    function userRewardPerTokenPaid(address) external view returns (uint);
    function rewards(address) external view returns (uint);
    function balanceOf(address account) external view returns (uint);
}

contract ZETA is ERC20 {
    using SafeMath for uint;
    using SafeERC20 for IERC20;

    uint public tokenPerBlock;
    uint public tokenPerBlockAdmin;

    uint public BONUS_MULTIPLIER;

    uint public startBlock;
    uint public bonusEndBlock;
    uint public endBlock;

    uint public adminClaimRewardEndBlock;
    uint public lastClaimBlockAdmin;

    uint public totalPoolWeight;

    IAdmin public admin;

    poolInfo[] public rewardPools;
    address public UNIAddress;
    address public adminReceiveAddress;

    struct userInfo {
        uint lastClaimAmount;
        uint depositAmount;
        uint rewardsUni;
        uint userRewardPerTokenPaidUni;
    }

    struct poolInfo {
        address addrToken;
        address addrUniStakingRewards;
        uint rewardRate;
        uint lastUpdateBlock;
        uint totalBalance;
        uint poolWeight;
        uint totalRewardsUni;
    }


    mapping (address => mapping (uint => userInfo)) public userInfos;

    event NewRewardPool(address rewardPool);
    event Deposit(address indexed account, uint indexed idx, uint amount);
    event Withdrawal(address indexed account, uint indexed idx, uint amount);
    event ClaimReward(address indexed account, uint indexed idx, uint amount);

    constructor (
        address adminAddress,
        address _adminReceiveAddress,
        address reserveContractAddress,
        address YFIInspirdropAddress,
        address uniAddress,
        uint _tokenPerBlock,
        uint _startBlock,
        uint _bonusEndBlock,
        uint _endBlock,
        uint _adminEndBlock,
        uint initialReserveAmount,
        uint yfiAirdropAmount,
        uint _tokenPerBlockAdmin,
        uint _bonus_multiplier
    ) ERC20("ZETA", "ZETA") public {
        tokenPerBlock = _tokenPerBlock;
        startBlock = _startBlock;
        bonusEndBlock = _bonusEndBlock;
        endBlock = _endBlock;
        adminClaimRewardEndBlock = _adminEndBlock;
        tokenPerBlockAdmin = _tokenPerBlockAdmin;
        BONUS_MULTIPLIER = _bonus_multiplier;

        lastClaimBlockAdmin = startBlock;

        admin = IAdmin(adminAddress);
        adminReceiveAddress = _adminReceiveAddress;
        _mint(reserveContractAddress, initialReserveAmount);
        _mint(YFIInspirdropAddress, yfiAirdropAmount);
        UNIAddress = uniAddress;
    }

    function setAdminReceiveAddress(address addr) public {
        require(msg.sender == admin.admin(), "Not admin");
        adminReceiveAddress = addr;
    }

    function addRewardPool(address addrToken, address addrUniStakingRewards, uint poolWeight) public {
        require(msg.sender == admin.admin(), "Not admin");
        for (uint i = 0; i < rewardPools.length; i++) {
            updatePool(i);
        }
        rewardPools.push(
            poolInfo(
                addrToken,
                addrUniStakingRewards,
                0,
                startBlock > block.number ? startBlock : block.number,
                0,
                poolWeight,
                0
            )
        );
        totalPoolWeight = totalPoolWeight.add(poolWeight);
        emit NewRewardPool(addrToken);
    }

    function setPoolWeight(uint idx, uint poolWeight) public {
        require(msg.sender == admin.admin(), "Not admin");
        for (uint i = 0; i < rewardPools.length; i++) {
            updatePool(i);
        }
        totalPoolWeight = totalPoolWeight.sub(rewardPools[idx].poolWeight).add(poolWeight);
        rewardPools[idx].poolWeight = poolWeight;
    }

    function rewardPerPeriod(uint lastUpdateBlock) public view returns (uint) {
        uint _from = lastUpdateBlock;
        uint _to = block.number < startBlock ? startBlock : (block.number > endBlock ? endBlock : block.number);

        uint period;
        if (_to <= bonusEndBlock) {
            period = _to.sub(_from).mul(BONUS_MULTIPLIER);
        } else if (_from >= bonusEndBlock) {
            period = _to.sub(_from);
        } else {
            period = bonusEndBlock.sub(_from).mul(BONUS_MULTIPLIER).add(
                _to.sub(bonusEndBlock)
            );
        }

        return period.mul(tokenPerBlock);
    }

    function rewardAmount(uint idx, address account) public view returns (uint) {
        poolInfo memory pool = rewardPools[idx];
        userInfo memory user = userInfos[account][idx];

        uint rewardRate = pool.rewardRate;
        if (block.number > pool.lastUpdateBlock && pool.totalBalance != 0) {
            rewardRate = rewardRate.add(
                rewardPerPeriod(pool.lastUpdateBlock)
                    .mul(pool.poolWeight)
                    .div(totalPoolWeight)
                    .mul(1e18)
                    .div(pool.totalBalance));
        }
        return user.depositAmount.mul(rewardRate).div(1e18).sub(user.lastClaimAmount);
    }

    function rewardAmountUni(uint idx, address account) public view returns (uint) {
        poolInfo memory pool = rewardPools[idx];
        userInfo memory user = userInfos[account][idx];
        uint rewardPerTokenUni = 0;
        if(pool.addrUniStakingRewards != address(0)) {
            rewardPerTokenUni = IUNIStakingRewards(pool.addrUniStakingRewards)
                .rewardPerToken();
        }
        return user.depositAmount
            .mul(rewardPerTokenUni.sub(user.userRewardPerTokenPaidUni))
            .div(1e18)
            .add(user.rewardsUni);
    }

    function deposit(uint idx, uint amount) public {
        require(idx < rewardPools.length, "Not in reward pool list");

        userInfo storage user = userInfos[msg.sender][idx];
        poolInfo storage pool = rewardPools[idx];

        if (user.depositAmount > 0) {
            claimReward(idx);
        } else {
            updatePool(idx);
        }

        pool.totalBalance = pool.totalBalance.add(amount);

        user.depositAmount = user.depositAmount.add(amount);
        user.lastClaimAmount = user.depositAmount.mul(pool.rewardRate).div(1e18);

        IERC20(pool.addrToken).safeTransferFrom(msg.sender, address(this), amount);

        if (pool.addrUniStakingRewards != address(0)) {
            IERC20(pool.addrToken).approve(pool.addrUniStakingRewards, amount);
            IUNIStakingRewards(pool.addrUniStakingRewards).stake(amount);
        }

        emit Deposit(msg.sender, idx, amount);
    }

    function withdraw(uint idx, uint amount) public {
        require(idx < rewardPools.length, "Not in reward pool list");

        userInfo storage user = userInfos[msg.sender][idx];
        poolInfo storage pool = rewardPools[idx];

        claimReward(idx);

        pool.totalBalance = pool.totalBalance.sub(amount);

        user.depositAmount = user.depositAmount.sub(amount);
        user.lastClaimAmount = user.depositAmount.mul(pool.rewardRate).div(1e18);

        if (pool.addrUniStakingRewards != address(0)) {
            IUNIStakingRewards(pool.addrUniStakingRewards).withdraw(amount);
        }

        IERC20(pool.addrToken).safeTransfer(msg.sender, amount);

        emit Withdrawal(msg.sender, idx, amount);
    }

    function updatePoolUni(uint idx) private {
        poolInfo storage pool = rewardPools[idx];
        userInfo storage user = userInfos[msg.sender][idx];
        IUNIStakingRewards uni = IUNIStakingRewards(pool.addrUniStakingRewards);

        uint _before = IERC20(UNIAddress).balanceOf(address(this));
        uni.getReward();
        uint _after = IERC20(UNIAddress).balanceOf(address(this));
        pool.totalRewardsUni = pool.totalRewardsUni.add(_after.sub(_before));

        uint rewardPerTokenUni = uni.rewardPerTokenStored();

        user.rewardsUni = user.depositAmount
            .mul(rewardPerTokenUni.sub(user.userRewardPerTokenPaidUni))
            .div(1e18)
            .add(user.rewardsUni);
        user.userRewardPerTokenPaidUni = rewardPerTokenUni;
    }

    function claimRewardUni(uint idx) private {
        poolInfo storage pool = rewardPools[idx];
        userInfo storage user = userInfos[msg.sender][idx];
        updatePoolUni(idx);

        if(user.rewardsUni > 0) {
            uint _rewardAmount = user.rewardsUni;
            if(_rewardAmount > pool.totalRewardsUni) {
                _rewardAmount = pool.totalRewardsUni;
            }
            user.rewardsUni = 0;
            pool.totalRewardsUni = pool.totalRewardsUni.sub(_rewardAmount);
            IERC20(UNIAddress).safeTransfer(msg.sender, _rewardAmount);
        }
    }

    function updatePool(uint idx) private {
        poolInfo storage pool = rewardPools[idx];

        if (pool.addrUniStakingRewards != address(0)) {
            claimRewardUni(idx);
        }

        if (block.number <= pool.lastUpdateBlock) {
            return;
        }

        uint currentBlock = block.number >= endBlock ? endBlock : block.number;

        if (pool.totalBalance == 0) {
            pool.lastUpdateBlock = currentBlock;
            return;
        }

        uint rewardPerPool = rewardPerPeriod(pool.lastUpdateBlock)
            .mul(pool.poolWeight)
            .div(totalPoolWeight);

        pool.rewardRate = pool.rewardRate
            .add(rewardPerPool
                .mul(1e18)
                .div(pool.totalBalance)
        );

        pool.lastUpdateBlock = currentBlock;
    }

    function claimReward(uint idx) public {
        require(idx < rewardPools.length, "Not in reward pool list");
        userInfo storage user = userInfos[msg.sender][idx];

        updatePool(idx);

        uint reward = user.depositAmount
            .mul(rewardPools[idx].rewardRate)
            .div(1e18)
            .sub(user.lastClaimAmount);

        if(reward > 0) {
            user.lastClaimAmount = reward.add(user.lastClaimAmount);
            _mint(msg.sender, reward);
        }

        emit ClaimReward(msg.sender, idx, reward);
    }

    function claimRewardAdmin() public {
        require(lastClaimBlockAdmin < adminClaimRewardEndBlock, "No more reward for admin");
        uint toBlock = block.number >= adminClaimRewardEndBlock ? adminClaimRewardEndBlock : block.number;
        uint reward = toBlock.sub(lastClaimBlockAdmin).mul(tokenPerBlockAdmin);
        _mint(adminReceiveAddress, reward);
        lastClaimBlockAdmin = toBlock;
        emit ClaimReward(adminReceiveAddress, 0, reward);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"adminAddress","type":"address"},{"internalType":"address","name":"_adminReceiveAddress","type":"address"},{"internalType":"address","name":"reserveContractAddress","type":"address"},{"internalType":"address","name":"YFIInspirdropAddress","type":"address"},{"internalType":"address","name":"uniAddress","type":"address"},{"internalType":"uint256","name":"_tokenPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"},{"internalType":"uint256","name":"_endBlock","type":"uint256"},{"internalType":"uint256","name":"_adminEndBlock","type":"uint256"},{"internalType":"uint256","name":"initialReserveAmount","type":"uint256"},{"internalType":"uint256","name":"yfiAirdropAmount","type":"uint256"},{"internalType":"uint256","name":"_tokenPerBlockAdmin","type":"uint256"},{"internalType":"uint256","name":"_bonus_multiplier","type":"uint256"}],"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":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"idx","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"idx","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardPool","type":"address"}],"name":"NewRewardPool","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":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"idx","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addrToken","type":"address"},{"internalType":"address","name":"addrUniStakingRewards","type":"address"},{"internalType":"uint256","name":"poolWeight","type":"uint256"}],"name":"addRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"contract IAdmin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminClaimRewardEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminReceiveAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewardAdmin","outputs":[],"stateMutability":"nonpayable","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":"idx","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"lastClaimBlockAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"rewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"rewardAmountUni","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lastUpdateBlock","type":"uint256"}],"name":"rewardPerPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPools","outputs":[{"internalType":"address","name":"addrToken","type":"address"},{"internalType":"address","name":"addrUniStakingRewards","type":"address"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateBlock","type":"uint256"},{"internalType":"uint256","name":"totalBalance","type":"uint256"},{"internalType":"uint256","name":"poolWeight","type":"uint256"},{"internalType":"uint256","name":"totalRewardsUni","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setAdminReceiveAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"},{"internalType":"uint256","name":"poolWeight","type":"uint256"}],"name":"setPoolWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPerBlockAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPoolWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userInfos","outputs":[{"internalType":"uint256","name":"lastClaimAmount","type":"uint256"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"rewardsUni","type":"uint256"},{"internalType":"uint256","name":"userRewardPerTokenPaidUni","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200455c3803806200455c83398181016040526101c08110156200003857600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050506040518060400160405280600481526020017f5a455441000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5a4554410000000000000000000000000000000000000000000000000000000081525081600390805190602001906200014f92919062000528565b5080600490805190602001906200016892919062000528565b506012600560006101000a81548160ff021916908360ff1602179055505050886006819055508760098190555086600a8190555085600b8190555084600c819055508160078190555080600881905550600954600d819055508d600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508c601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002558c85620002bc60201b60201c565b620002678b84620002bc60201b60201c565b89601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505050505050505050620005ce565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b62000374600083836200049a60201b60201c565b62000390816002546200049f60201b620028f71790919060201c565b600281905550620003ee816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200049f60201b620028f71790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b505050565b6000808284019050838110156200051e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200056b57805160ff19168380011785556200059c565b828001600101855582156200059c579182015b828111156200059b5782518255916020019190600101906200057e565b5b509050620005ab9190620005af565b5090565b5b80821115620005ca576000816000905550600101620005b0565b5090565b613f7e80620005de6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80635291162311610125578063a9059cbb116100ad578063cf60d6e71161007c578063cf60d6e714610a2c578063dd62ed3e14610a4a578063e2bbb15814610ac2578063eb5a5bfd14610afa578063f851a44014610b5c57610211565b8063a9059cbb146108e8578063ae169a501461094c578063b28f136d1461097a578063bde858c3146109be57610211565b806372359269116100f457806372359269146107835780638aa28550146107c557806395d89b41146107e3578063a457c2d714610866578063a4842003146108ca57610211565b806352911623146106725780635a89b6ca146106aa5780636c4d70601461072157806370a082311461072b57610211565b80631aed6553116101a8578063395093511161017757806339509351146105025780634198709a14610566578063441a3e701461058457806346abf391146105bc57806348cd4cb11461065457610211565b80631aed65531461040b57806323b872dd146104295780633088d8c5146104ad578063313ce567146104e157610211565b80630bf2a634116101e45780630bf2a634146103395780630c3eb0a11461039b57806318160ddd146103cf578063193d2c5e146103ed57610211565b8063025590041461021657806306fdde0314610234578063083c6323146102b7578063095ea7b3146102d5575b600080fd5b61021e610b90565b6040518082815260200191505060405180910390f35b61023c610b96565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561027c578082015181840152602081019050610261565b50505050905090810190601f1680156102a95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102bf610c38565b6040518082815260200191505060405180910390f35b610321600480360360408110156102eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c3e565b60405180821515815260200191505060405180910390f35b6103856004803603604081101561034f57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c5c565b6040518082815260200191505060405180910390f35b6103a3610eed565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103d7610f13565b6040518082815260200191505060405180910390f35b6103f5610f1d565b6040518082815260200191505060405180910390f35b610413610f23565b6040518082815260200191505060405180910390f35b6104956004803603606081101561043f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f29565b60405180821515815260200191505060405180910390f35b6104b5611002565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104e9611028565b604051808260ff16815260200191505060405180910390f35b61054e6004803603604081101561051857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061103f565b60405180821515815260200191505060405180910390f35b61056e6110f2565b6040518082815260200191505060405180910390f35b6105ba6004803603604081101561059a57600080fd5b8101908080359060200190929190803590602001909291905050506110f8565b005b6105e8600480360360208110156105d257600080fd5b81019080803590602001909291905050506113f5565b604051808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b61065c611484565b6040518082815260200191505060405180910390f35b6106a86004803603604081101561068857600080fd5b81019080803590602001909291908035906020019092919050505061148a565b005b6106f6600480360360408110156106c057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611666565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6107296116a3565b005b61076d6004803603602081101561074157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061180a565b6040518082815260200191505060405180910390f35b6107af6004803603602081101561079957600080fd5b8101908080359060200190929190505050611852565b6040518082815260200191505060405180910390f35b6107cd61194f565b6040518082815260200191505060405180910390f35b6107eb611955565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561082b578082015181840152602081019050610810565b50505050905090810190601f1680156108585780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6108b26004803603604081101561087c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119f7565b60405180821515815260200191505060405180910390f35b6108d2611ac4565b6040518082815260200191505060405180910390f35b610934600480360360408110156108fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611aca565b60405180821515815260200191505060405180910390f35b6109786004803603602081101561096257600080fd5b8101908080359060200190929190505050611ae8565b005b6109bc6004803603602081101561099057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611caf565b005b610a2a600480360360608110156109d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e36565b005b610a3461216e565b6040518082815260200191505060405180910390f35b610aac60048036036040811015610a6057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612174565b6040518082815260200191505060405180910390f35b610af860048036036040811015610ad857600080fd5b8101908080359060200190929190803590602001909291905050506121fb565b005b610b4660048036036040811015610b1057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061260b565b6040518082815260200191505060405180910390f35b610b646128d1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600e5481565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c2e5780601f10610c0357610100808354040283529160200191610c2e565b820191906000526020600020905b815481529060010190602001808311610c1157829003601f168201915b5050505050905090565b600b5481565b6000610c52610c4b61297f565b8484612987565b6001905092915050565b6000610c66613d6b565b60108481548110610c7357fe5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509050610d74613dd4565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600082604001519050826060015143118015610e1a57506000836080015114155b15610e9b57610e98610e898460800151610e7b670de0b6b3a7640000610e6d600e54610e5f8a60a00151610e518c60600151611852565b612b7e90919063ffffffff16565b612c0490919063ffffffff16565b612b7e90919063ffffffff16565b612c0490919063ffffffff16565b826128f790919063ffffffff16565b90505b610ee28260000151610ed4670de0b6b3a7640000610ec6858760200151612b7e90919063ffffffff16565b612c0490919063ffffffff16565b612c4e90919063ffffffff16565b935050505092915050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b600d5481565b600a5481565b6000610f36848484612c98565b610ff784610f4261297f565b610ff285604051806060016040528060288152602001613e8960289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610fa861297f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f599092919063ffffffff16565b612987565b600190509392505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900460ff16905090565b60006110e861104c61297f565b846110e3856001600061105d61297f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128f790919063ffffffff16565b612987565b6001905092915050565b60065481565b6010805490508210611172576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e6f7420696e2072657761726420706f6f6c206c69737400000000000000000081525060200191505060405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002090506000601084815481106111d557fe5b906000526020600020906007020190506111ee84611ae8565b611205838260040154612c4e90919063ffffffff16565b8160040181905550611224838360010154612c4e90919063ffffffff16565b8260010181905550611261670de0b6b3a764000061125383600201548560010154612b7e90919063ffffffff16565b612c0490919063ffffffff16565b8260000181905550600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611351578060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561133857600080fd5b505af115801561134c573d6000803e3d6000fd5b505050505b6113a033848360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130199092919063ffffffff16565b833373ffffffffffffffffffffffffffffffffffffffff167fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb856040518082815260200191505060405180910390a350505050565b6010818154811061140257fe5b90600052602060002090600702016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060154905087565b60095481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b1580156114f257600080fd5b505afa158015611506573d6000803e3d6000fd5b505050506040513d602081101561151c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f4e6f742061646d696e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005b6010805490508110156115f3576115e6816130bb565b80806001019150506115d0565b506116398161162b6010858154811061160857fe5b906000526020600020906007020160050154600e54612c4e90919063ffffffff16565b6128f790919063ffffffff16565b600e81905550806010838154811061164d57fe5b9060005260206000209060070201600501819055505050565b6013602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154905084565b600c54600d541061171c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f206d6f72652072657761726420666f722061646d696e000000000000000081525060200191505060405180910390fd5b6000600c5443101561172e5743611732565b600c545b9050600061175f600754611751600d5485612c4e90919063ffffffff16565b612b7e90919063ffffffff16565b905061178d601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261321c565b81600d819055506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe74e5c9d4ac1fc33412485f18c159a0a391efe287ab3fd271123f30e6bacf4e3836040518082815260200191505060405180910390a35050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000808290506000600954431061187b57600b5443116118725743611876565b600b545b61187f565b6009545b90506000600a5482116118ba576118b36008546118a58585612c4e90919063ffffffff16565b612b7e90919063ffffffff16565b9050611930565b600a5483106118dd576118d68383612c4e90919063ffffffff16565b905061192f565b61192c6118f5600a5484612c4e90919063ffffffff16565b61191e60085461191087600a54612c4e90919063ffffffff16565b612b7e90919063ffffffff16565b6128f790919063ffffffff16565b90505b5b61194560065482612b7e90919063ffffffff16565b9350505050919050565b60085481565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119ed5780601f106119c2576101008083540402835291602001916119ed565b820191906000526020600020905b8154815290600101906020018083116119d057829003601f168201915b5050505050905090565b6000611aba611a0461297f565b84611ab585604051806060016040528060258152602001613f246025913960016000611a2e61297f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f599092919063ffffffff16565b612987565b6001905092915050565b60075481565b6000611ade611ad761297f565b8484612c98565b6001905092915050565b6010805490508110611b62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e6f7420696e2072657761726420706f6f6c206c69737400000000000000000081525060200191505060405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000209050611bbf826130bb565b6000611c268260000154611c18670de0b6b3a7640000611c0a60108881548110611be557fe5b9060005260206000209060070201600201548760010154612b7e90919063ffffffff16565b612c0490919063ffffffff16565b612c4e90919063ffffffff16565b90506000811115611c5b57611c488260000154826128f790919063ffffffff16565b8260000181905550611c5a338261321c565b5b823373ffffffffffffffffffffffffffffffffffffffff167fe74e5c9d4ac1fc33412485f18c159a0a391efe287ab3fd271123f30e6bacf4e3836040518082815260200191505060405180910390a3505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b158015611d1757600080fd5b505afa158015611d2b573d6000803e3d6000fd5b505050506040513d6020811015611d4157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611df2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f4e6f742061646d696e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b158015611e9e57600080fd5b505afa158015611eb2573d6000803e3d6000fd5b505050506040513d6020811015611ec857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f4e6f742061646d696e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005b601080549050811015611f9f57611f92816130bb565b8080600101915050611f7c565b5060106040518060e001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001600081526020014360095411611ffb5743611fff565b6009545b8152602001600081526020018381526020016000815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505061211681600e546128f790919063ffffffff16565b600e819055507f5b2761211791e9995750a7bcc36f06f1ccb6591c543010dd0795eb5e82baec2083604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b600c5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6010805490508210612275576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e6f7420696e2072657761726420706f6f6c206c69737400000000000000000081525060200191505060405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002090506000601084815481106122d857fe5b90600052602060002090600702019050600082600101541115612303576122fe84611ae8565b61230d565b61230c846130bb565b5b6123248382600401546128f790919063ffffffff16565b81600401819055506123438383600101546128f790919063ffffffff16565b8260010181905550612380670de0b6b3a764000061237283600201548560010154612b7e90919063ffffffff16565b612c0490919063ffffffff16565b82600001819055506123d93330858460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166133e3909392919063ffffffff16565b600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125b6578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b38260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156124ea57600080fd5b505af11580156124fe573d6000803e3d6000fd5b505050506040513d602081101561251457600080fd5b8101908080519060200190929190505050508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561259d57600080fd5b505af11580156125b1573d6000803e3d6000fd5b505050505b833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b6000612615613d6b565b6010848154811061262257fe5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509050612723613dd4565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905060008073ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff161461286957826020015173ffffffffffffffffffffffffffffffffffffffff1663cd3daf9d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561282b57600080fd5b505afa15801561283f573d6000803e3d6000fd5b505050506040513d602081101561285557600080fd5b810190808051906020019092919050505090505b6128c682604001516128b8670de0b6b3a76400006128aa612897876060015187612c4e90919063ffffffff16565b8760200151612b7e90919063ffffffff16565b612c0490919063ffffffff16565b6128f790919063ffffffff16565b935050505092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080828401905083811015612975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613ed66024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613e206022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600080831415612b915760009050612bfe565b6000828402905082848281612ba257fe5b0414612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613e686021913960400191505060405180910390fd5b809150505b92915050565b6000612c4683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506134a4565b905092915050565b6000612c9083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612f59565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613eb16025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613dfd6023913960400191505060405180910390fd5b612daf83838361356a565b612e1a81604051806060016040528060268152602001613e42602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f599092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612ead816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128f790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290613006576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612fcb578082015181840152602081019050612fb0565b50505050905090810190601f168015612ff85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6130b68363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061356f565b505050565b6000601082815481106130ca57fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461313c5761313b8261365e565b5b8060030154431161314d5750613219565b6000600b5443101561315f5743613163565b600b545b9050600082600401541415613182578082600301819055505050613219565b60006131bb600e546131ad856005015461319f8760030154611852565b612b7e90919063ffffffff16565b612c0490919063ffffffff16565b90506132046131f184600401546131e3670de0b6b3a764000085612b7e90919063ffffffff16565b612c0490919063ffffffff16565b84600201546128f790919063ffffffff16565b83600201819055508183600301819055505050505b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6132cb6000838361356a565b6132e0816002546128f790919063ffffffff16565b600281905550613337816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128f790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b61349e846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061356f565b50505050565b60008083118290613550576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156135155780820151818401526020810190506134fa565b50505050905090810190601f1680156135425780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161355c57fe5b049050809150509392505050565b505050565b60606135d1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137819092919063ffffffff16565b9050600081511115613659578080602001905160208110156135f257600080fd5b8101908080519060200190929190505050613658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613efa602a913960400191505060405180910390fd5b5b505050565b60006010828154811061366d57fe5b906000526020600020906007020190506000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002090506136da83613799565b60008160020154111561377c57600081600201549050826006015481111561370457826006015490505b60008260020181905550613725818460060154612c4e90919063ffffffff16565b836006018190555061377a3382601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130199092919063ffffffff16565b505b505050565b60606137908484600085613b52565b90509392505050565b6000601082815481106137a857fe5b906000526020600020906007020190506000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020905060008260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156138c057600080fd5b505afa1580156138d4573d6000803e3d6000fd5b505050506040513d60208110156138ea57600080fd5b810190808051906020019092919050505090508173ffffffffffffffffffffffffffffffffffffffff16633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561394557600080fd5b505af1158015613959573d6000803e3d6000fd5b505050506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156139e857600080fd5b505afa1580156139fc573d6000803e3d6000fd5b505050506040513d6020811015613a1257600080fd5b81019080805190602001909291905050509050613a4e613a3b8383612c4e90919063ffffffff16565b86600601546128f790919063ffffffff16565b856006018190555060008373ffffffffffffffffffffffffffffffffffffffff1663df136d656040518163ffffffff1660e01b815260040160206040518083038186803b158015613a9e57600080fd5b505afa158015613ab2573d6000803e3d6000fd5b505050506040513d6020811015613ac857600080fd5b81019080805190602001909291905050509050613b388560020154613b2a670de0b6b3a7640000613b1c613b098a6003015487612c4e90919063ffffffff16565b8a60010154612b7e90919063ffffffff16565b612c0490919063ffffffff16565b6128f790919063ffffffff16565b856002018190555080856003018190555050505050505050565b6060613b5d85613d58565b613bcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613c1f5780518252602082019150602081019050602083039250613bfc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c81576040519150601f19603f3d011682016040523d82523d6000602084013e613c86565b606091505b50915091508115613c9b578092505050613d50565b600081511115613cae5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d15578082015181840152602081019050613cfa565b50505050905090810190601f168015613d425780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806080016040528060008152602001600081526020016000815260200160008152509056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220383b62d2668f7bf59350a395ca35522d423a5372a8c1d20a4bc3ccab191118de64736f6c634300060c00330000000000000000000000007f6d59c2a1342b9fef9815d5d2de6537bb8a653c00000000000000000000000017142514bbb117aa14b80e081ec4423770ccb4640000000000000000000000002fcacb11ccad0e1377f509be6443ed2c83e0267f0000000000000000000000006bb2bd7e381539166735cba44841be23f6cd4e840000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000000000000000000000000000000429d069189e00000000000000000000000000000000000000000000000000000000000000a7f56c0000000000000000000000000000000000000000000000000000000000aa986c00000000000000000000000000000000000000000000000000000000012aea6c000000000000000000000000000000000000000000000000000000000128476c00000000000000000000000000000000000000000000d72aacae2caa50800000000000000000000000000000000000000000000000000cb49b44ba602d800000000000000000000000000000000000000000000000000000006c1872fb2f2ba80000000000000000000000000000000000000000000000000000000000000003

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102115760003560e01c80635291162311610125578063a9059cbb116100ad578063cf60d6e71161007c578063cf60d6e714610a2c578063dd62ed3e14610a4a578063e2bbb15814610ac2578063eb5a5bfd14610afa578063f851a44014610b5c57610211565b8063a9059cbb146108e8578063ae169a501461094c578063b28f136d1461097a578063bde858c3146109be57610211565b806372359269116100f457806372359269146107835780638aa28550146107c557806395d89b41146107e3578063a457c2d714610866578063a4842003146108ca57610211565b806352911623146106725780635a89b6ca146106aa5780636c4d70601461072157806370a082311461072b57610211565b80631aed6553116101a8578063395093511161017757806339509351146105025780634198709a14610566578063441a3e701461058457806346abf391146105bc57806348cd4cb11461065457610211565b80631aed65531461040b57806323b872dd146104295780633088d8c5146104ad578063313ce567146104e157610211565b80630bf2a634116101e45780630bf2a634146103395780630c3eb0a11461039b57806318160ddd146103cf578063193d2c5e146103ed57610211565b8063025590041461021657806306fdde0314610234578063083c6323146102b7578063095ea7b3146102d5575b600080fd5b61021e610b90565b6040518082815260200191505060405180910390f35b61023c610b96565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561027c578082015181840152602081019050610261565b50505050905090810190601f1680156102a95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102bf610c38565b6040518082815260200191505060405180910390f35b610321600480360360408110156102eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c3e565b60405180821515815260200191505060405180910390f35b6103856004803603604081101561034f57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c5c565b6040518082815260200191505060405180910390f35b6103a3610eed565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103d7610f13565b6040518082815260200191505060405180910390f35b6103f5610f1d565b6040518082815260200191505060405180910390f35b610413610f23565b6040518082815260200191505060405180910390f35b6104956004803603606081101561043f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f29565b60405180821515815260200191505060405180910390f35b6104b5611002565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104e9611028565b604051808260ff16815260200191505060405180910390f35b61054e6004803603604081101561051857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061103f565b60405180821515815260200191505060405180910390f35b61056e6110f2565b6040518082815260200191505060405180910390f35b6105ba6004803603604081101561059a57600080fd5b8101908080359060200190929190803590602001909291905050506110f8565b005b6105e8600480360360208110156105d257600080fd5b81019080803590602001909291905050506113f5565b604051808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b61065c611484565b6040518082815260200191505060405180910390f35b6106a86004803603604081101561068857600080fd5b81019080803590602001909291908035906020019092919050505061148a565b005b6106f6600480360360408110156106c057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611666565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6107296116a3565b005b61076d6004803603602081101561074157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061180a565b6040518082815260200191505060405180910390f35b6107af6004803603602081101561079957600080fd5b8101908080359060200190929190505050611852565b6040518082815260200191505060405180910390f35b6107cd61194f565b6040518082815260200191505060405180910390f35b6107eb611955565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561082b578082015181840152602081019050610810565b50505050905090810190601f1680156108585780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6108b26004803603604081101561087c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119f7565b60405180821515815260200191505060405180910390f35b6108d2611ac4565b6040518082815260200191505060405180910390f35b610934600480360360408110156108fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611aca565b60405180821515815260200191505060405180910390f35b6109786004803603602081101561096257600080fd5b8101908080359060200190929190505050611ae8565b005b6109bc6004803603602081101561099057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611caf565b005b610a2a600480360360608110156109d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e36565b005b610a3461216e565b6040518082815260200191505060405180910390f35b610aac60048036036040811015610a6057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612174565b6040518082815260200191505060405180910390f35b610af860048036036040811015610ad857600080fd5b8101908080359060200190929190803590602001909291905050506121fb565b005b610b4660048036036040811015610b1057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061260b565b6040518082815260200191505060405180910390f35b610b646128d1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600e5481565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c2e5780601f10610c0357610100808354040283529160200191610c2e565b820191906000526020600020905b815481529060010190602001808311610c1157829003601f168201915b5050505050905090565b600b5481565b6000610c52610c4b61297f565b8484612987565b6001905092915050565b6000610c66613d6b565b60108481548110610c7357fe5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509050610d74613dd4565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600082604001519050826060015143118015610e1a57506000836080015114155b15610e9b57610e98610e898460800151610e7b670de0b6b3a7640000610e6d600e54610e5f8a60a00151610e518c60600151611852565b612b7e90919063ffffffff16565b612c0490919063ffffffff16565b612b7e90919063ffffffff16565b612c0490919063ffffffff16565b826128f790919063ffffffff16565b90505b610ee28260000151610ed4670de0b6b3a7640000610ec6858760200151612b7e90919063ffffffff16565b612c0490919063ffffffff16565b612c4e90919063ffffffff16565b935050505092915050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b600d5481565b600a5481565b6000610f36848484612c98565b610ff784610f4261297f565b610ff285604051806060016040528060288152602001613e8960289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610fa861297f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f599092919063ffffffff16565b612987565b600190509392505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900460ff16905090565b60006110e861104c61297f565b846110e3856001600061105d61297f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128f790919063ffffffff16565b612987565b6001905092915050565b60065481565b6010805490508210611172576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e6f7420696e2072657761726420706f6f6c206c69737400000000000000000081525060200191505060405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002090506000601084815481106111d557fe5b906000526020600020906007020190506111ee84611ae8565b611205838260040154612c4e90919063ffffffff16565b8160040181905550611224838360010154612c4e90919063ffffffff16565b8260010181905550611261670de0b6b3a764000061125383600201548560010154612b7e90919063ffffffff16565b612c0490919063ffffffff16565b8260000181905550600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611351578060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561133857600080fd5b505af115801561134c573d6000803e3d6000fd5b505050505b6113a033848360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130199092919063ffffffff16565b833373ffffffffffffffffffffffffffffffffffffffff167fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb856040518082815260200191505060405180910390a350505050565b6010818154811061140257fe5b90600052602060002090600702016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060154905087565b60095481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b1580156114f257600080fd5b505afa158015611506573d6000803e3d6000fd5b505050506040513d602081101561151c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f4e6f742061646d696e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005b6010805490508110156115f3576115e6816130bb565b80806001019150506115d0565b506116398161162b6010858154811061160857fe5b906000526020600020906007020160050154600e54612c4e90919063ffffffff16565b6128f790919063ffffffff16565b600e81905550806010838154811061164d57fe5b9060005260206000209060070201600501819055505050565b6013602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154905084565b600c54600d541061171c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f206d6f72652072657761726420666f722061646d696e000000000000000081525060200191505060405180910390fd5b6000600c5443101561172e5743611732565b600c545b9050600061175f600754611751600d5485612c4e90919063ffffffff16565b612b7e90919063ffffffff16565b905061178d601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261321c565b81600d819055506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe74e5c9d4ac1fc33412485f18c159a0a391efe287ab3fd271123f30e6bacf4e3836040518082815260200191505060405180910390a35050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000808290506000600954431061187b57600b5443116118725743611876565b600b545b61187f565b6009545b90506000600a5482116118ba576118b36008546118a58585612c4e90919063ffffffff16565b612b7e90919063ffffffff16565b9050611930565b600a5483106118dd576118d68383612c4e90919063ffffffff16565b905061192f565b61192c6118f5600a5484612c4e90919063ffffffff16565b61191e60085461191087600a54612c4e90919063ffffffff16565b612b7e90919063ffffffff16565b6128f790919063ffffffff16565b90505b5b61194560065482612b7e90919063ffffffff16565b9350505050919050565b60085481565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119ed5780601f106119c2576101008083540402835291602001916119ed565b820191906000526020600020905b8154815290600101906020018083116119d057829003601f168201915b5050505050905090565b6000611aba611a0461297f565b84611ab585604051806060016040528060258152602001613f246025913960016000611a2e61297f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f599092919063ffffffff16565b612987565b6001905092915050565b60075481565b6000611ade611ad761297f565b8484612c98565b6001905092915050565b6010805490508110611b62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e6f7420696e2072657761726420706f6f6c206c69737400000000000000000081525060200191505060405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000209050611bbf826130bb565b6000611c268260000154611c18670de0b6b3a7640000611c0a60108881548110611be557fe5b9060005260206000209060070201600201548760010154612b7e90919063ffffffff16565b612c0490919063ffffffff16565b612c4e90919063ffffffff16565b90506000811115611c5b57611c488260000154826128f790919063ffffffff16565b8260000181905550611c5a338261321c565b5b823373ffffffffffffffffffffffffffffffffffffffff167fe74e5c9d4ac1fc33412485f18c159a0a391efe287ab3fd271123f30e6bacf4e3836040518082815260200191505060405180910390a3505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b158015611d1757600080fd5b505afa158015611d2b573d6000803e3d6000fd5b505050506040513d6020811015611d4157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611df2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f4e6f742061646d696e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b158015611e9e57600080fd5b505afa158015611eb2573d6000803e3d6000fd5b505050506040513d6020811015611ec857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f4e6f742061646d696e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005b601080549050811015611f9f57611f92816130bb565b8080600101915050611f7c565b5060106040518060e001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001600081526020014360095411611ffb5743611fff565b6009545b8152602001600081526020018381526020016000815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505061211681600e546128f790919063ffffffff16565b600e819055507f5b2761211791e9995750a7bcc36f06f1ccb6591c543010dd0795eb5e82baec2083604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b600c5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6010805490508210612275576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e6f7420696e2072657761726420706f6f6c206c69737400000000000000000081525060200191505060405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002090506000601084815481106122d857fe5b90600052602060002090600702019050600082600101541115612303576122fe84611ae8565b61230d565b61230c846130bb565b5b6123248382600401546128f790919063ffffffff16565b81600401819055506123438383600101546128f790919063ffffffff16565b8260010181905550612380670de0b6b3a764000061237283600201548560010154612b7e90919063ffffffff16565b612c0490919063ffffffff16565b82600001819055506123d93330858460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166133e3909392919063ffffffff16565b600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125b6578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b38260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156124ea57600080fd5b505af11580156124fe573d6000803e3d6000fd5b505050506040513d602081101561251457600080fd5b8101908080519060200190929190505050508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561259d57600080fd5b505af11580156125b1573d6000803e3d6000fd5b505050505b833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b6000612615613d6b565b6010848154811061262257fe5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509050612723613dd4565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905060008073ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff161461286957826020015173ffffffffffffffffffffffffffffffffffffffff1663cd3daf9d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561282b57600080fd5b505afa15801561283f573d6000803e3d6000fd5b505050506040513d602081101561285557600080fd5b810190808051906020019092919050505090505b6128c682604001516128b8670de0b6b3a76400006128aa612897876060015187612c4e90919063ffffffff16565b8760200151612b7e90919063ffffffff16565b612c0490919063ffffffff16565b6128f790919063ffffffff16565b935050505092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080828401905083811015612975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613ed66024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613e206022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600080831415612b915760009050612bfe565b6000828402905082848281612ba257fe5b0414612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613e686021913960400191505060405180910390fd5b809150505b92915050565b6000612c4683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506134a4565b905092915050565b6000612c9083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612f59565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613eb16025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613dfd6023913960400191505060405180910390fd5b612daf83838361356a565b612e1a81604051806060016040528060268152602001613e42602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f599092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612ead816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128f790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290613006576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612fcb578082015181840152602081019050612fb0565b50505050905090810190601f168015612ff85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6130b68363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061356f565b505050565b6000601082815481106130ca57fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461313c5761313b8261365e565b5b8060030154431161314d5750613219565b6000600b5443101561315f5743613163565b600b545b9050600082600401541415613182578082600301819055505050613219565b60006131bb600e546131ad856005015461319f8760030154611852565b612b7e90919063ffffffff16565b612c0490919063ffffffff16565b90506132046131f184600401546131e3670de0b6b3a764000085612b7e90919063ffffffff16565b612c0490919063ffffffff16565b84600201546128f790919063ffffffff16565b83600201819055508183600301819055505050505b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6132cb6000838361356a565b6132e0816002546128f790919063ffffffff16565b600281905550613337816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128f790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b61349e846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061356f565b50505050565b60008083118290613550576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156135155780820151818401526020810190506134fa565b50505050905090810190601f1680156135425780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161355c57fe5b049050809150509392505050565b505050565b60606135d1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137819092919063ffffffff16565b9050600081511115613659578080602001905160208110156135f257600080fd5b8101908080519060200190929190505050613658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613efa602a913960400191505060405180910390fd5b5b505050565b60006010828154811061366d57fe5b906000526020600020906007020190506000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002090506136da83613799565b60008160020154111561377c57600081600201549050826006015481111561370457826006015490505b60008260020181905550613725818460060154612c4e90919063ffffffff16565b836006018190555061377a3382601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130199092919063ffffffff16565b505b505050565b60606137908484600085613b52565b90509392505050565b6000601082815481106137a857fe5b906000526020600020906007020190506000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020905060008260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156138c057600080fd5b505afa1580156138d4573d6000803e3d6000fd5b505050506040513d60208110156138ea57600080fd5b810190808051906020019092919050505090508173ffffffffffffffffffffffffffffffffffffffff16633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561394557600080fd5b505af1158015613959573d6000803e3d6000fd5b505050506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156139e857600080fd5b505afa1580156139fc573d6000803e3d6000fd5b505050506040513d6020811015613a1257600080fd5b81019080805190602001909291905050509050613a4e613a3b8383612c4e90919063ffffffff16565b86600601546128f790919063ffffffff16565b856006018190555060008373ffffffffffffffffffffffffffffffffffffffff1663df136d656040518163ffffffff1660e01b815260040160206040518083038186803b158015613a9e57600080fd5b505afa158015613ab2573d6000803e3d6000fd5b505050506040513d6020811015613ac857600080fd5b81019080805190602001909291905050509050613b388560020154613b2a670de0b6b3a7640000613b1c613b098a6003015487612c4e90919063ffffffff16565b8a60010154612b7e90919063ffffffff16565b612c0490919063ffffffff16565b6128f790919063ffffffff16565b856002018190555080856003018190555050505050505050565b6060613b5d85613d58565b613bcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613c1f5780518252602082019150602081019050602083039250613bfc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c81576040519150601f19603f3d011682016040523d82523d6000602084013e613c86565b606091505b50915091508115613c9b578092505050613d50565b600081511115613cae5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d15578082015181840152602081019050613cfa565b50505050905090810190601f168015613d425780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806080016040528060008152602001600081526020016000815260200160008152509056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220383b62d2668f7bf59350a395ca35522d423a5372a8c1d20a4bc3ccab191118de64736f6c634300060c0033

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

0000000000000000000000007f6d59c2a1342b9fef9815d5d2de6537bb8a653c00000000000000000000000017142514bbb117aa14b80e081ec4423770ccb4640000000000000000000000002fcacb11ccad0e1377f509be6443ed2c83e0267f0000000000000000000000006bb2bd7e381539166735cba44841be23f6cd4e840000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000000000000000000000000000000429d069189e00000000000000000000000000000000000000000000000000000000000000a7f56c0000000000000000000000000000000000000000000000000000000000aa986c00000000000000000000000000000000000000000000000000000000012aea6c000000000000000000000000000000000000000000000000000000000128476c00000000000000000000000000000000000000000000d72aacae2caa50800000000000000000000000000000000000000000000000000cb49b44ba602d800000000000000000000000000000000000000000000000000000006c1872fb2f2ba80000000000000000000000000000000000000000000000000000000000000003

-----Decoded View---------------
Arg [0] : adminAddress (address): 0x7F6D59C2a1342B9fEF9815d5D2de6537BB8A653C
Arg [1] : _adminReceiveAddress (address): 0x17142514BBb117aa14B80e081eC4423770cCB464
Arg [2] : reserveContractAddress (address): 0x2fcaCb11cCAd0E1377F509BE6443ed2c83e0267F
Arg [3] : YFIInspirdropAddress (address): 0x6bB2bd7e381539166735cBA44841be23f6cD4e84
Arg [4] : uniAddress (address): 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984
Arg [5] : _tokenPerBlock (uint256): 300000000000000000
Arg [6] : _startBlock (uint256): 11007340
Arg [7] : _bonusEndBlock (uint256): 11180140
Arg [8] : _endBlock (uint256): 19589740
Arg [9] : _adminEndBlock (uint256): 19416940
Arg [10] : initialReserveAmount (uint256): 1016096000000000000000000
Arg [11] : yfiAirdropAmount (uint256): 60000000000000000000000
Arg [12] : _tokenPerBlockAdmin (uint256): 30426179604261800
Arg [13] : _bonus_multiplier (uint256): 3

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000007f6d59c2a1342b9fef9815d5d2de6537bb8a653c
Arg [1] : 00000000000000000000000017142514bbb117aa14b80e081ec4423770ccb464
Arg [2] : 0000000000000000000000002fcacb11ccad0e1377f509be6443ed2c83e0267f
Arg [3] : 0000000000000000000000006bb2bd7e381539166735cba44841be23f6cd4e84
Arg [4] : 0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984
Arg [5] : 0000000000000000000000000000000000000000000000000429d069189e0000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000a7f56c
Arg [7] : 0000000000000000000000000000000000000000000000000000000000aa986c
Arg [8] : 00000000000000000000000000000000000000000000000000000000012aea6c
Arg [9] : 000000000000000000000000000000000000000000000000000000000128476c
Arg [10] : 00000000000000000000000000000000000000000000d72aacae2caa50800000
Arg [11] : 000000000000000000000000000000000000000000000cb49b44ba602d800000
Arg [12] : 000000000000000000000000000000000000000000000000006c1872fb2f2ba8
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000003


Deployed Bytecode Sourcemap

30120:10571:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30496:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17027:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30384:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19133:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34406:676;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30596:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18102:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30456:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30352:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19776:321;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30628:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;17954:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20506:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30215:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36631:748;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30560:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30323:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33381:365;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31074:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40218:470;;;:::i;:::-;;18265:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33754:644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30286:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17229:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21227:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30247:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18597:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;39645:565;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32541:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32707:666;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30413:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18835:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35680:943;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35090:582;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30532:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30496:27;;;;:::o;17027:83::-;17064:13;17097:5;17090:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17027:83;:::o;30384:20::-;;;;:::o;19133:169::-;19216:4;19233:39;19242:12;:10;:12::i;:::-;19256:7;19265:6;19233:8;:39::i;:::-;19290:4;19283:11;;19133:169;;;;:::o;34406:676::-;34476:4;34493:20;;:::i;:::-;34516:11;34528:3;34516:16;;;;;;;;;;;;;;;;;;34493:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34543:20;;:::i;:::-;34566:9;:18;34576:7;34566:18;;;;;;;;;;;;;;;:23;34585:3;34566:23;;;;;;;;;;;34543:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34602:15;34620:4;:15;;;34602:33;;34665:4;:20;;;34650:12;:35;:61;;;;;34710:1;34689:4;:17;;;:22;;34650:61;34646:341;;;34741:234;34774:200;34956:4;:17;;;34774:155;34924:4;34774:123;34881:15;;34774:80;34838:4;:15;;;34774:37;34790:4;:20;;;34774:15;:37::i;:::-;:63;;:80;;;;:::i;:::-;:106;;:123;;;;:::i;:::-;:149;;:155;;;;:::i;:::-;:181;;:200;;;;:::i;:::-;34741:10;:14;;:234;;;;:::i;:::-;34728:247;;34646:341;35004:70;35053:4;:20;;;35004:44;35043:4;35004:34;35027:10;35004:4;:18;;;:22;;:34;;;;:::i;:::-;:38;;:44;;;;:::i;:::-;:48;;:70;;;;:::i;:::-;34997:77;;;;;34406:676;;;;:::o;30596:25::-;;;;;;;;;;;;;:::o;18102:100::-;18155:7;18182:12;;18175:19;;18102:100;:::o;30456:31::-;;;;:::o;30352:25::-;;;;:::o;19776:321::-;19882:4;19899:36;19909:6;19917:9;19928:6;19899:9;:36::i;:::-;19946:121;19955:6;19963:12;:10;:12::i;:::-;19977:89;20015:6;19977:89;;;;;;;;;;;;;;;;;:11;:19;19989:6;19977:19;;;;;;;;;;;;;;;:33;19997:12;:10;:12::i;:::-;19977:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;19946:8;:121::i;:::-;20085:4;20078:11;;19776:321;;;;;:::o;30628:34::-;;;;;;;;;;;;;:::o;17954:83::-;17995:5;18020:9;;;;;;;;;;;18013:16;;17954:83;:::o;20506:218::-;20594:4;20611:83;20620:12;:10;:12::i;:::-;20634:7;20643:50;20682:10;20643:11;:25;20655:12;:10;:12::i;:::-;20643:25;;;;;;;;;;;;;;;:34;20669:7;20643:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;20611:8;:83::i;:::-;20712:4;20705:11;;20506:218;;;;:::o;30215:25::-;;;;:::o;36631:748::-;36704:11;:18;;;;36698:3;:24;36690:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36763:21;36787:9;:21;36797:10;36787:21;;;;;;;;;;;;;;;:26;36809:3;36787:26;;;;;;;;;;;36763:50;;36824:21;36848:11;36860:3;36848:16;;;;;;;;;;;;;;;;;;36824:40;;36877:16;36889:3;36877:11;:16::i;:::-;36926:29;36948:6;36926:4;:17;;;:21;;:29;;;;:::i;:::-;36906:4;:17;;:49;;;;36989:30;37012:6;36989:4;:18;;;:22;;:30;;;;:::i;:::-;36968:4;:18;;:51;;;;37053:49;37097:4;37053:39;37076:4;:15;;;37053:4;:18;;;:22;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;37030:4;:20;;:72;;;;37157:1;37119:40;;:4;:26;;;;;;;;;;;;:40;;;37115:136;;37195:4;:26;;;;;;;;;;;;37176:55;;;37232:6;37176:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37115:136;37263:55;37299:10;37311:6;37270:4;:14;;;;;;;;;;;;37263:35;;;;:55;;;;;:::i;:::-;37359:3;37347:10;37336:35;;;37364:6;37336:35;;;;;;;;;;;;;;;;;;36631:748;;;;:::o;30560:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30323:22::-;;;;:::o;33381:365::-;33471:5;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33457:27;;:10;:27;;;33449:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33514:6;33509:86;33530:11;:18;;;;33526:1;:22;33509:86;;;33570:13;33581:1;33570:10;:13::i;:::-;33550:3;;;;;;;33509:86;;;;33623:64;33676:10;33623:48;33643:11;33655:3;33643:16;;;;;;;;;;;;;;;;;;:27;;;33623:15;;:19;;:48;;;;:::i;:::-;:52;;:64;;;;:::i;:::-;33605:15;:82;;;;33728:10;33698:11;33710:3;33698:16;;;;;;;;;;;;;;;;;;:27;;:40;;;;33381:365;;:::o;31074:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40218:470::-;40294:24;;40272:19;;:46;40264:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40358:12;40389:24;;40373:12;:40;;:82;;40443:12;40373:82;;;40416:24;;40373:82;40358:97;;40466:11;40480:56;40517:18;;40480:32;40492:19;;40480:7;:11;;:32;;;;:::i;:::-;:36;;:56;;;;:::i;:::-;40466:70;;40547:34;40553:19;;;;;;;;;;;40574:6;40547:5;:34::i;:::-;40614:7;40592:19;:29;;;;40670:1;40649:19;;;;;;;;;;;40637:43;;;40673:6;40637:43;;;;;;;;;;;;;;;;;;40218:470;;:::o;18265:119::-;18331:7;18358:9;:18;18368:7;18358:18;;;;;;;;;;;;;;;;18351:25;;18265:119;;;:::o;33754:644::-;33822:4;33839:10;33852:15;33839:28;;33878:8;33904:10;;33889:12;:25;:92;;33946:8;;33931:12;:23;:49;;33968:12;33931:49;;;33957:8;;33931:49;33889:92;;;33917:10;;33889:92;33878:103;;33994:11;34027:13;;34020:3;:20;34016:330;;34066:36;34085:16;;34066:14;34074:5;34066:3;:7;;:14;;;;:::i;:::-;:18;;:36;;;;:::i;:::-;34057:45;;34016:330;;;34133:13;;34124:5;:22;34120:226;;34172:14;34180:5;34172:3;:7;;:14;;;;:::i;:::-;34163:23;;34120:226;;;34228:106;34297:22;34305:13;;34297:3;:7;;:22;;;;:::i;:::-;34228:46;34257:16;;34228:24;34246:5;34228:13;;:17;;:24;;;;:::i;:::-;:28;;:46;;;;:::i;:::-;:50;;:106;;;;:::i;:::-;34219:115;;34120:226;34016:330;34365:25;34376:13;;34365:6;:10;;:25;;;;:::i;:::-;34358:32;;;;;33754:644;;;:::o;30286:28::-;;;;:::o;17229:87::-;17268:13;17301:7;17294:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17229:87;:::o;21227:269::-;21320:4;21337:129;21346:12;:10;:12::i;:::-;21360:7;21369:96;21408:15;21369:96;;;;;;;;;;;;;;;;;:11;:25;21381:12;:10;:12::i;:::-;21369:25;;;;;;;;;;;;;;;:34;21395:7;21369:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;21337:8;:129::i;:::-;21484:4;21477:11;;21227:269;;;;:::o;30247:30::-;;;;:::o;18597:175::-;18683:4;18700:42;18710:12;:10;:12::i;:::-;18724:9;18735:6;18700:9;:42::i;:::-;18760:4;18753:11;;18597:175;;;;:::o;39645:565::-;39708:11;:18;;;;39702:3;:24;39694:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39765:21;39789:9;:21;39799:10;39789:21;;;;;;;;;;;;;;;:26;39811:3;39789:26;;;;;;;;;;;39765:50;;39828:15;39839:3;39828:10;:15::i;:::-;39856:11;39870:129;39978:4;:20;;;39870:89;39954:4;39870:65;39907:11;39919:3;39907:16;;;;;;;;;;;;;;;;;;:27;;;39870:4;:18;;;:36;;:65;;;;:::i;:::-;:83;;:89;;;;:::i;:::-;:107;;:129;;;;:::i;:::-;39856:143;;40024:1;40015:6;:10;40012:137;;;40065:32;40076:4;:20;;;40065:6;:10;;:32;;;;:::i;:::-;40042:4;:20;;:55;;;;40112:25;40118:10;40130:6;40112:5;:25::i;:::-;40012:137;40190:3;40178:10;40166:36;;;40195:6;40166:36;;;;;;;;;;;;;;;;;;39645:565;;;:::o;32541:158::-;32627:5;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32613:27;;:10;:27;;;32605:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32687:4;32665:19;;:26;;;;;;;;;;;;;;;;;;32541:158;:::o;32707:666::-;32837:5;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32823:27;;:10;:27;;;32815:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32880:6;32875:86;32896:11;:18;;;;32892:1;:22;32875:86;;;32936:13;32947:1;32936:10;:13::i;:::-;32916:3;;;;;;;32875:86;;;;32971:11;33002:252;;;;;;;;33029:9;33002:252;;;;;;33057:21;33002:252;;;;;;33097:1;33002:252;;;;33130:12;33117:10;;:25;:53;;33158:12;33117:53;;;33145:10;;33117:53;33002:252;;;;33189:1;33002:252;;;;33209:10;33002:252;;;;33238:1;33002:252;;;32971:294;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33294:31;33314:10;33294:15;;:19;;:31;;;;:::i;:::-;33276:15;:49;;;;33341:24;33355:9;33341:24;;;;;;;;;;;;;;;;;;;;32707:666;;;:::o;30413:36::-;;;;:::o;18835:151::-;18924:7;18951:11;:18;18963:5;18951:18;;;;;;;;;;;;;;;:27;18970:7;18951:27;;;;;;;;;;;;;;;;18944:34;;18835:151;;;;:::o;35680:943::-;35752:11;:18;;;;35746:3;:24;35738:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35811:21;35835:9;:21;35845:10;35835:21;;;;;;;;;;;;;;;:26;35857:3;35835:26;;;;;;;;;;;35811:50;;35872:21;35896:11;35908:3;35896:16;;;;;;;;;;;;;;;;;;35872:40;;35950:1;35929:4;:18;;;:22;35925:119;;;35968:16;35980:3;35968:11;:16::i;:::-;35925:119;;;36017:15;36028:3;36017:10;:15::i;:::-;35925:119;36076:29;36098:6;36076:4;:17;;;:21;;:29;;;;:::i;:::-;36056:4;:17;;:49;;;;36139:30;36162:6;36139:4;:18;;;:22;;:30;;;;:::i;:::-;36118:4;:18;;:51;;;;36203:49;36247:4;36203:39;36226:4;:15;;;36203:4;:18;;;:22;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;36180:4;:20;;:72;;;;36265:74;36305:10;36325:4;36332:6;36272:4;:14;;;;;;;;;;;;36265:39;;;;:74;;;;;;:::i;:::-;36394:1;36356:40;;:4;:26;;;;;;;;;;;;:40;;;36352:214;;36420:4;:14;;;;;;;;;;;;36413:30;;;36444:4;:26;;;;;;;;;;;;36472:6;36413:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36513:4;:26;;;;;;;;;;;;36494:52;;;36547:6;36494:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36352:214;36603:3;36591:10;36583:32;;;36608:6;36583:32;;;;;;;;;;;;;;;;;;35680:943;;;;:::o;35090:582::-;35163:4;35180:20;;:::i;:::-;35203:11;35215:3;35203:16;;;;;;;;;;;;;;;;;;35180:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35230:20;;:::i;:::-;35253:9;:18;35263:7;35253:18;;;;;;;;;;;;;;;:23;35272:3;35253:23;;;;;;;;;;;35230:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35287:22;35365:1;35327:40;;:4;:26;;;:40;;;35324:173;;35423:4;:26;;;35404:79;;;:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35384:101;;35324:173;35514:150;35648:4;:15;;;35514:115;35624:4;35514:91;35551:53;35573:4;:30;;;35551:17;:21;;:53;;;;:::i;:::-;35514:4;:18;;;:36;;:91;;;;:::i;:::-;:109;;:115;;;;:::i;:::-;:133;;:150;;;;:::i;:::-;35507:157;;;;;35090:582;;;;:::o;30532:19::-;;;;;;;;;;;;;:::o;900:181::-;958:7;978:9;994:1;990;:5;978:17;;1019:1;1014;:6;;1006:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1072:1;1065:8;;;900:181;;;;:::o;5903:106::-;5956:15;5991:10;5984:17;;5903:106;:::o;24372:346::-;24491:1;24474:19;;:5;:19;;;;24466:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24572:1;24553:21;;:7;:21;;;;24545:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24656:6;24626:11;:18;24638:5;24626:18;;;;;;;;;;;;;;;:27;24645:7;24626:27;;;;;;;;;;;;;;;:36;;;;24694:7;24678:32;;24687:5;24678:32;;;24703:6;24678:32;;;;;;;;;;;;;;;;;;24372:346;;;:::o;2254:471::-;2312:7;2562:1;2557;:6;2553:47;;;2587:1;2580:8;;;;2553:47;2612:9;2628:1;2624;:5;2612:17;;2657:1;2652;2648;:5;;;;;;:10;2640:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2716:1;2709:8;;;2254:471;;;;;:::o;3201:132::-;3259:7;3286:39;3290:1;3293;3286:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3279:46;;3201:132;;;;:::o;1364:136::-;1422:7;1449:43;1453:1;1456;1449:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1442:50;;1364:136;;;;:::o;21986:539::-;22110:1;22092:20;;:6;:20;;;;22084:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22194:1;22173:23;;:9;:23;;;;22165:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22249:47;22270:6;22278:9;22289:6;22249:20;:47::i;:::-;22329:71;22351:6;22329:71;;;;;;;;;;;;;;;;;:9;:17;22339:6;22329:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;22309:9;:17;22319:6;22309:17;;;;;;;;;;;;;;;:91;;;;22434:32;22459:6;22434:9;:20;22444:9;22434:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;22411:9;:20;22421:9;22411:20;;;;;;;;;;;;;;;:55;;;;22499:9;22482:35;;22491:6;22482:35;;;22510:6;22482:35;;;;;;;;;;;;;;;;;;21986:539;;;:::o;1803:192::-;1889:7;1922:1;1917;:6;;1925:12;1909:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1949:9;1965:1;1961;:5;1949:17;;1986:1;1979:8;;;1803:192;;;;;:::o;26401:177::-;26484:86;26504:5;26534:23;;;26559:2;26563:5;26511:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26484:19;:86::i;:::-;26401:177;;;:::o;38796:841::-;38845:21;38869:11;38881:3;38869:16;;;;;;;;;;;;;;;;;;38845:40;;38940:1;38902:40;;:4;:26;;;;;;;;;;;;:40;;;38898:92;;38959:19;38974:3;38959:14;:19::i;:::-;38898:92;39022:4;:20;;;39006:12;:36;39002:75;;39059:7;;;39002:75;39089:17;39125:8;;39109:12;:24;;:50;;39147:12;39109:50;;;39136:8;;39109:50;39089:70;;39197:1;39176:4;:17;;;:22;39172:111;;;39238:12;39215:4;:20;;:35;;;;39265:7;;;;39172:111;39295:18;39316:107;39407:15;;39316:72;39372:4;:15;;;39316:37;39332:4;:20;;;39316:15;:37::i;:::-;:55;;:72;;;;:::i;:::-;:90;;:107;;;;:::i;:::-;39295:128;;39454:127;39488:82;39552:4;:17;;;39488:41;39524:4;39488:13;:35;;:41;;;;:::i;:::-;:63;;:82;;;;:::i;:::-;39454:4;:15;;;:33;;:127;;;;:::i;:::-;39436:4;:15;;:145;;;;39617:12;39594:4;:20;;:35;;;;38796:841;;;;;:::o;22806:378::-;22909:1;22890:21;;:7;:21;;;;22882:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22960:49;22989:1;22993:7;23002:6;22960:20;:49::i;:::-;23037:24;23054:6;23037:12;;:16;;:24;;;;:::i;:::-;23022:12;:39;;;;23093:30;23116:6;23093:9;:18;23103:7;23093:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;23072:9;:18;23082:7;23072:18;;;;;;;;;;;;;;;:51;;;;23160:7;23139:37;;23156:1;23139:37;;;23169:6;23139:37;;;;;;;;;;;;;;;;;;22806:378;;:::o;26586:205::-;26687:96;26707:5;26737:27;;;26766:4;26772:2;26776:5;26714:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26687:19;:96::i;:::-;26586:205;;;;:::o;3829:278::-;3915:7;3947:1;3943;:5;3950:12;3935:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3974:9;3990:1;3986;:5;;;;;;3974:17;;4098:1;4091:8;;;3829:278;;;;;:::o;25743:92::-;;;;:::o;28706:761::-;29130:23;29156:69;29184:4;29156:69;;;;;;;;;;;;;;;;;29164:5;29156:27;;;;:69;;;;;:::i;:::-;29130:95;;29260:1;29240:10;:17;:21;29236:224;;;29382:10;29371:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29363:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29236:224;28706:761;;;:::o;38188:600::-;38241:21;38265:11;38277:3;38265:16;;;;;;;;;;;;;;;;;;38241:40;;38292:21;38316:9;:21;38326:10;38316:21;;;;;;;;;;;;;;;:26;38338:3;38316:26;;;;;;;;;;;38292:50;;38353:18;38367:3;38353:13;:18::i;:::-;38405:1;38387:4;:15;;;:19;38384:397;;;38423:18;38444:4;:15;;;38423:36;;38493:4;:20;;;38477:13;:36;38474:112;;;38550:4;:20;;;38534:36;;38474:112;38618:1;38600:4;:15;;:19;;;;38657:39;38682:13;38657:4;:20;;;:24;;:39;;;;:::i;:::-;38634:4;:20;;:62;;;;38711:58;38743:10;38755:13;38718:10;;;;;;;;;;;38711:31;;;;:58;;;;;:::i;:::-;38384:397;;38188:600;;;:::o;12571:196::-;12674:12;12706:53;12729:6;12737:4;12743:1;12746:12;12706:22;:53::i;:::-;12699:60;;12571:196;;;;;:::o;37387:793::-;37439:21;37463:11;37475:3;37463:16;;;;;;;;;;;;;;;;;;37439:40;;37490:21;37514:9;:21;37524:10;37514:21;;;;;;;;;;;;;;;:26;37536:3;37514:26;;;;;;;;;;;37490:50;;37551:22;37595:4;:26;;;;;;;;;;;;37551:71;;37635:12;37657:10;;;;;;;;;;;37650:28;;;37687:4;37650:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37635:58;;37704:3;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37730:11;37751:10;;;;;;;;;;;37744:28;;;37781:4;37744:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37730:57;;37821:45;37846:19;37857:7;37846:6;:10;;:19;;;;:::i;:::-;37821:4;:20;;;:24;;:45;;;;:::i;:::-;37798:4;:20;;:68;;;;37879:22;37904:3;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37879:51;;37961:150;38095:4;:15;;;37961:115;38071:4;37961:91;37998:53;38020:4;:30;;;37998:17;:21;;:53;;;;:::i;:::-;37961:4;:18;;;:36;;:91;;;;:::i;:::-;:109;;:115;;;;:::i;:::-;:133;;:150;;;;:::i;:::-;37943:4;:15;;:168;;;;38155:17;38122:4;:30;;:50;;;;37387:793;;;;;;;:::o;13948:979::-;14078:12;14111:18;14122:6;14111:10;:18::i;:::-;14103:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14237:12;14251:23;14278:6;:11;;14298:8;14309:4;14278:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14236:78;;;;14329:7;14325:595;;;14360:10;14353:17;;;;;;14325:595;14494:1;14474:10;:17;:21;14470:439;;;14737:10;14731:17;14798:15;14785:10;14781:2;14777:19;14770:44;14685:148;14880:12;14873:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13948:979;;;;;;;:::o;9651:422::-;9711:4;9919:12;10030:7;10018:20;10010:28;;10064:1;10057:4;:8;10050:15;;;9651:422;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

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