ETH Price: $3,461.39 (-0.46%)
Gas: 12 Gwei

Token

Staked HEGIC (sHEGIC)
 

Overview

Max Total Supply

2,629,412.67860493944544032 sHEGIC

Holders

103

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
278,436.37638270180971534 sHEGIC

Value
$0.00
0x7dd0cb21e7c74776bd57f939c4f608246d32f6c4
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:
HegicStakingPool

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-21
*/

// Sources flattened with hardhat v2.6.0 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]


pragma solidity >=0.6.0 <0.8.0;

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/math/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity >=0.6.0 <0.8.0;



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

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

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

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return _decimals;
    }

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(sender, recipient, amount);

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

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

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

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

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

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

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

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

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

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

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


// File contracts/Interfaces.sol

/**
 * Hegic
 * Copyright (C) 2020 Hegic Protocol
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

pragma solidity 0.6.12;

interface IHegicStaking is IERC20 {
    function classicLockupPeriod() external view returns (uint256);
    function lastBoughtTimestamp(address) external view returns (uint256);

    function claimProfits(address account) external returns (uint profit);
    function buyStakingLot(uint amount) external;
    function sellStakingLot(uint amount) external;
    function profitOf(address account) external view returns (uint profit);
}

interface IHegicStakingETH is IHegicStaking {
    function sendProfit() external payable;
}

interface IHegicStakingERC20 is IHegicStaking {
    function sendProfit(uint amount) external;
}

interface IOldStakingPool {
    function ownerPerformanceFee(address account) external view returns (uint);
    function withdraw(uint256 amount) external;
}

interface IOldPool {
    function withdraw(uint256 amount) external returns (uint);
}


// File @openzeppelin/contracts/access/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity >=0.6.2 <0.8.0;

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

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

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

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

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity >=0.6.0 <0.8.0;



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

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

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

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

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

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

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

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


// File contracts/HegicStakingPool.sol

// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.6.12;




contract HegicStakingPool is Ownable, ERC20{
    using SafeMath for uint;
    using SafeERC20 for IERC20;

    // Tokens
    IERC20 public immutable HEGIC;

    mapping(Asset => IHegicStaking) public staking; 

    uint public constant STAKING_LOT_PRICE = 888_000e18;
    uint public constant ACCURACY = 1e32;

    address payable public FALLBACK_RECIPIENT;
    address payable public FEE_RECIPIENT;

    address public constant OLD_HEGIC_STAKING_POOL = address(0xf4128B00AFdA933428056d0F0D1d7652aF7e2B35);
    address public constant Z_HEGIC = address(0x837010619aeb2AE24141605aFC8f66577f6fb2e7);

    uint public performanceFee = 5000;
    uint public discountedPerformanceFee = 4000;
    bool public depositsAllowed = true;
    uint public lockUpPeriod = 15 minutes;
    bool private migrating;

    uint public totalBalance;
    uint public lockedBalance;
    uint public totalNumberOfStakingLots;

    mapping(Asset => uint) public numberOfStakingLots;
    mapping(Asset => uint) public totalProfitPerToken;
    mapping(Asset => IERC20) public token;
    enum Asset {WBTC, ETH, USDC}

    mapping(address => uint) public ownerPerformanceFee;
    mapping(address => bool) public isNotFirstTime;
    mapping(address => uint) public lastDepositTime;
    mapping(address => mapping(Asset => uint)) lastProfit;
    mapping(address => mapping(Asset => uint)) savedProfit;

    event Deposit(address account, uint amount);
    event Withdraw(address account, uint amount);
    event BuyLot(Asset asset, address account);
    event SellLot(Asset asset, address account);
    event ClaimedProfit(address account, Asset asset, uint netProfit, uint fee);

    constructor(IERC20 _HEGIC, IERC20 _WBTC, IERC20 _WETH, IERC20 _USDC, IHegicStaking _stakingWBTC, IHegicStaking _stakingETH, IHegicStaking _stakingUSDC) public ERC20("Staked HEGIC", "sHEGIC"){
        HEGIC = _HEGIC;
        staking[Asset.WBTC] = _stakingWBTC;
        staking[Asset.ETH] = _stakingETH;
        staking[Asset.USDC] = _stakingUSDC;
        token[Asset.WBTC] = _WBTC;
        token[Asset.ETH] = _WETH;
        token[Asset.USDC] = _USDC;
        FEE_RECIPIENT = msg.sender;
        FALLBACK_RECIPIENT = msg.sender;

        // Approve Staking Lot Contract
        _HEGIC.approve(address(staking[Asset.WBTC]), type(uint256).max);
        _HEGIC.approve(address(staking[Asset.ETH]), type(uint256).max);
        _HEGIC.approve(address(staking[Asset.USDC]), type(uint256).max);
    }

    function approveContracts() external {
        require(depositsAllowed);
        HEGIC.approve(address(staking[Asset.WBTC]), type(uint256).max);
        HEGIC.approve(address(staking[Asset.ETH]), type(uint256).max);
        HEGIC.approve(address(staking[Asset.USDC]), type(uint256).max);
    }

    /**
     * @notice Stops the ability to add new deposits
     * @param _allow If set to false, new deposits will be rejected
     */
    function allowDeposits(bool _allow) external onlyOwner {
        depositsAllowed = _allow;
    }

    /**
     * @notice Changes Fee paid to creator (only paid when taking profits)
     * @param _fee New fee
     */
    function changePerformanceFee(uint _fee) external onlyOwner {
        require(_fee >= 0, "Fee too low");
        require(_fee <= 10000, "Fee too high");
        
        performanceFee = _fee;
    }

    /**
     * @notice Changes discounted Fee paid to creator (only paid when taking profits)
     * @param _fee New fee
     */
    function changeDiscountedPerformanceFee(uint _fee) external onlyOwner {
        require(_fee >= 0, "Fee too low");
        require(_fee <= 10000, "Fee too high");

        discountedPerformanceFee = _fee;
    }

    /**
     * @notice Changes Fee Recipient address
     * @param _recipient New address
     */
    function changeFeeRecipient(address _recipient) external onlyOwner {
        FEE_RECIPIENT = payable(_recipient);
    }

    /**
     * @notice Changes Fallback Recipient address. This is only used in case of unexpected behavior
     * @param _recipient New address
     */
    function changeFallbackRecipient(address _recipient) external onlyOwner {
        FALLBACK_RECIPIENT = payable(_recipient);
    }

    /**
     * @notice Toggles effect of lockup period by setting lockUpPeriod to 0 (disabled) or to 15 minutes(enabled)
     * @param _unlock Boolean: if true, unlocks funds
     */
    function unlockAllFunds(bool _unlock) external onlyOwner {
        if(_unlock) lockUpPeriod = 0;
        else lockUpPeriod = 15 minutes;
    }

    /**
     * @notice Migrates HEGIC from old staking pools (supports HegicStakingPool + ZLOT)
     * @param oldStakingPool staking pool from which we are migrating
     * @return HEGIC migrated
     */
    function migrateFromOldStakingPool(IOldStakingPool oldStakingPool) external returns (uint) {
        IERC20 sToken;
        // to avoid reseting fee during deposit
        isNotFirstTime[msg.sender] = true;
        if(address(oldStakingPool) == address(OLD_HEGIC_STAKING_POOL)) {
            sToken = IERC20(address(oldStakingPool));
            // take ownerPerformanceFee from old pool
            uint oldPerformanceFee = oldStakingPool.ownerPerformanceFee(msg.sender);
            uint dFee = discountedPerformanceFee;
            if(oldPerformanceFee > dFee) {
                ownerPerformanceFee[msg.sender] = dFee;
            } else {
                ownerPerformanceFee[msg.sender] = oldStakingPool.ownerPerformanceFee(msg.sender);
            }
        } else {
            // migrating from zLOT
            sToken = IERC20(Z_HEGIC);
            ownerPerformanceFee[msg.sender] = discountedPerformanceFee;
        }
        require(sToken.balanceOf(msg.sender) > 0, "Not enough balance / not supported");
        // requires approval
        uint256 oldBalance = sToken.balanceOf(msg.sender);
        sToken.safeTransferFrom(msg.sender, address(this), oldBalance);
        if(address(oldStakingPool) == address(OLD_HEGIC_STAKING_POOL)) {
            // migrating from HegicStakingPool
            oldStakingPool.withdraw(oldBalance);
        } else {
            // migrating from zLOT
            oldBalance = IOldPool(address(oldStakingPool)).withdraw(oldBalance);
        }
        migrating = true;
        deposit(oldBalance);
        return oldBalance;
    }

    /**
     * @notice Deposits _amount HEGIC in the contract. 
     * 
     * @param _amount Number of HEGIC to deposit in the contract // number of sHEGIC that will be minted
     */
    function deposit(uint _amount) public {
        require(_amount > 0, "Amount too low");
        require(depositsAllowed, "Deposits are not allowed at the moment");
        // set fee for that staking lot owner - this effectively sets the maximum FEE an owner can have
        // each time user deposits, this checks if current fee is higher or lower than previous fees
        // and updates it if it is lower
        if(ownerPerformanceFee[msg.sender] > performanceFee || !isNotFirstTime[msg.sender]) {
            ownerPerformanceFee[msg.sender] = performanceFee;
            isNotFirstTime[msg.sender] = true;
        }
        lastDepositTime[msg.sender] = block.timestamp;
        // receive deposit
        depositHegic(_amount);

        while(totalBalance.sub(lockedBalance) >= STAKING_LOT_PRICE){
            buyStakingLot();
        }
    }

    /**
     * @notice Withdraws _amount HEGIC from the contract. 
     * 
     * @param _amount Number of HEGIC to withdraw from contract // number of sHEGIC that will be burnt
     */
    function withdraw(uint _amount) public {
        require(_amount <= balanceOf(msg.sender), "Not enough balance");
        require(canWithdraw(msg.sender), "You deposited less than 15 mins ago. Your funds are locked");

        while(totalBalance.sub(lockedBalance) < _amount){
            sellStakingLot();
        }

        withdrawHegic(_amount);
    }

    /**
     * @notice Withdraws _amount HEGIC from the contract and claims all profit pending in contract
     * 
     */
    function claimProfitAndWithdraw() external {
        claimAllProfit();
        withdraw(balanceOf(msg.sender));
    }

    /**
     * @notice Claims profit for both assets. Profit will be paid to msg.sender
     * This is the most gas-efficient way to claim profits (instead of separately)
     * 
     */
    function claimAllProfit() public {
        claimProfit(Asset.WBTC);
        claimProfit(Asset.ETH);
        claimProfit(Asset.USDC);
    }

    /**
     * @notice Claims profit for specific _asset. Profit will be paid to msg.sender
     * 
     * @param _asset Asset (ETH or WBTC)
     */
    function claimProfit(Asset _asset) public {
        uint profit = saveProfit(msg.sender, _asset);
        savedProfit[msg.sender][_asset] = 0;
        
        _transferProfit(profit, _asset, msg.sender, ownerPerformanceFee[msg.sender]);
    }

    /**
     * @notice Returns profit to be paid when claimed
     * 
     * @param _account Account to get profit for
     * @param _asset Asset (ETH or WBTC)
     */
    function profitOf(address _account, Asset _asset) public view returns (uint profit) {
        return savedProfit[_account][_asset].add(getUnsaved(_account, _asset));
    }

    /**
     * @notice Returns address of Hegic's ETH Staking Lot contract
     */
    function getHegicStakingETH() public view returns (IHegicStaking HegicStakingETH){
        return staking[Asset.ETH];
    }

    /**
     * @notice Returns address of Hegic's WBTC Staking Lot contract
     */
    function getHegicStakingWBTC() public view returns (IHegicStaking HegicStakingWBTC){
        return staking[Asset.WBTC];
    }

    /**
     * @notice Returns address of Hegic's USDC Staking Lot contract
     */
    function getHegicStakingUSDC() public view returns (IHegicStaking HegicStakingWBTC){
        return staking[Asset.USDC];
    }

    /**
     * @notice Support function. Gets profit that has not been saved (either in Staking Lot contracts)
     * or in this contract
     * 
     * @param _account Account to get unsaved profit for
     * @param _asset Asset (ETH or WBTC)
     */
    function getUnsaved(address _account, Asset _asset) public view returns (uint profit) {
        profit = totalProfitPerToken[_asset].sub(lastProfit[_account][_asset]).add(getUnreceivedProfitPerToken(_asset)).mul(balanceOf(_account)).div(ACCURACY);
    }

    /**
     * @notice Internal function. Update profit per token for _asset
     * 
     * @param _asset Underlying asset (ETH or WBTC)
     */
    function updateProfit(Asset _asset) internal {
        uint profit = staking[_asset].profitOf(address(this));
        if(profit > 0) {
            profit = staking[_asset].claimProfits(address(this));
        }

        if(totalBalance <= 0) {
            IERC20 assetToken = token[_asset];
            assetToken.safeTransfer(FALLBACK_RECIPIENT, profit);
        } else {
            totalProfitPerToken[_asset] = totalProfitPerToken[_asset].add(profit.mul(ACCURACY).div(totalBalance));
        }
    }

    /**
     * @notice Internal function. Transfers net profit to the owner of the sHEGIC. 
     * 
     * @param _amount Amount of Asset (ETH or WBTC) to be sent
     * @param _asset Asset to be sent (ETH or WBTC)
     * @param _account Receiver of the net profit
     * @param _fee Fee % to be applied to the profit (100% = 100000)
     */
    function _transferProfit(uint _amount, Asset _asset, address _account, uint _fee) internal {
        uint netProfit = _amount.mul(uint(100000).sub(_fee)).div(100000);
        uint fee = _amount.sub(netProfit);

        IERC20 assetToken = token[_asset]; 
        assetToken.safeTransfer(_account, netProfit);
        assetToken.safeTransfer(FEE_RECIPIENT, fee);
        emit ClaimedProfit(_account, _asset, netProfit, fee);
    }

    /**
     * @notice Internal function to transfer deposited HEGIC to the contract and mint sHEGIC (Staked HEGIC)
     * @param _amount Amount of HEGIC to deposit // Amount of sHEGIC that will be minted
     */
    function depositHegic(uint _amount) internal {
        totalBalance = totalBalance.add(_amount); 
        // if we are during migration, we don't need to take HEGIC from the user
        if(!migrating) {
            HEGIC.safeTransferFrom(msg.sender, address(this), _amount);
        } else {
            migrating = false;
            require(totalBalance == HEGIC.balanceOf(address(this)).add(lockedBalance), "!");
        }

        _mint(msg.sender, _amount);
    }

    /**
     * @notice Internal function. Moves _amount HEGIC from contract to user
     * also burns staked HEGIC (sHEGIC) tokens
     * @param _amount Amount of HEGIC to withdraw // Amount of sHEGIC that will be burned
     */
    function withdrawHegic(uint _amount) internal {
        _burn(msg.sender, _amount);
        HEGIC.safeTransfer(msg.sender, _amount);
        totalBalance = totalBalance.sub(_amount);
        emit Withdraw(msg.sender, _amount);
    }

    /**
     * @notice Internal function. Chooses which lot to buy (ETH or WBTC) and buys it
     *
     */
    function buyStakingLot() internal {
        // we buy 1 ETH staking lot, then 1 WBTC staking lot, then 1 USDC staking lot, ...
        Asset asset = Asset.USDC;
        if(numberOfStakingLots[Asset.USDC] >= numberOfStakingLots[Asset.WBTC]){
            if(numberOfStakingLots[Asset.WBTC] >= numberOfStakingLots[Asset.ETH]){
                asset = Asset.ETH;
            } else {
                asset = Asset.WBTC;
            }
        }

        lockedBalance = lockedBalance.add(STAKING_LOT_PRICE);
        staking[asset].buyStakingLot(1);
        totalNumberOfStakingLots++;
        numberOfStakingLots[asset]++;
        emit BuyLot(asset, msg.sender);
    }

    /**
     * @notice Internal function. Chooses which lot to sell (ETH or WBTC or USDC) and sells it
     *
     */
    function sellStakingLot() internal {
        Asset asset = Asset.ETH;
        if(numberOfStakingLots[Asset.ETH] <= numberOfStakingLots[Asset.WBTC] || 
            staking[Asset.ETH].lastBoughtTimestamp(address(this))
                    .add(staking[Asset.ETH].classicLockupPeriod()) > block.timestamp || 
            staking[Asset.ETH].balanceOf(address(this)) == 0)
        {
            if(numberOfStakingLots[Asset.WBTC] <= numberOfStakingLots[Asset.USDC] && 
                staking[Asset.USDC].lastBoughtTimestamp(address(this))
                    .add(staking[Asset.USDC].classicLockupPeriod()) <= block.timestamp && 
                staking[Asset.USDC].balanceOf(address(this)) > 0){
                asset = Asset.USDC;
            } else if (staking[Asset.WBTC].lastBoughtTimestamp(address(this))
                    .add(staking[Asset.WBTC].classicLockupPeriod()) <= block.timestamp && 
                staking[Asset.WBTC].balanceOf(address(this)) > 0){
                asset = Asset.WBTC;
            } else {
                asset = Asset.ETH;
                // this require only applies here. otherwise conditions have been already checked
                require(
                    staking[asset].lastBoughtTimestamp(address(this))
                        .add(staking[asset].classicLockupPeriod()) <= block.timestamp &&
                        staking[asset].balanceOf(address(this)) > 0,
                    "Lot sale is locked by Hegic. Funds should be available in less than 24h"
                );
            }
        }

        lockedBalance = lockedBalance.sub(STAKING_LOT_PRICE);
        staking[asset].sellStakingLot(1);
        totalNumberOfStakingLots--;
        numberOfStakingLots[asset]--;
        emit SellLot(asset, msg.sender);
    }

    /**
     * @notice Support function. Calculates how much profit would receive each token if the contract claimed
     * profit accumulated in Hegic's Staking Lot contracts
     * 
     * @param _asset Asset (WBTC or ETH)
     */
    function getUnreceivedProfitPerToken(Asset _asset) public view returns (uint unreceivedProfitPerToken){
        uint profit = staking[_asset].profitOf(address(this));
        
        unreceivedProfitPerToken = profit.mul(ACCURACY).div(totalBalance);
    }

    /**
     * @notice Saves profit for a certain _account. This profit is absolute in value
     * this function is called before every token transfer to keep the state of profits correctly
     * 
     * @param _account account to save profit to
     */
    function saveProfit(address _account) internal {
        saveProfit(_account, Asset.WBTC);
        saveProfit(_account, Asset.ETH);
        saveProfit(_account, Asset.USDC);
    }

    /**
     * @notice Internal function that saves unpaid profit to keep accounting.
     * 
     * @param _account Account to save profit to
     * @param _asset Asset (WBTC or ETH)     
     */
    function saveProfit(address _account, Asset _asset) internal returns (uint profit) {
        updateProfit(_asset);
        uint unsaved = getUnsaved(_account, _asset);
        lastProfit[_account][_asset] = totalProfitPerToken[_asset];
        profit = savedProfit[_account][_asset].add(unsaved);
        savedProfit[_account][_asset] = profit;
    }

    /**
     * @notice Support function. Relevant to the profit system. It will save state of profit before each 
     * token transfer (either deposit or withdrawal)
     * 
     * @param from Account sending tokens 
     * @param to Account receiving tokens
     */
    function _beforeTokenTransfer(address from, address to, uint256) internal override {
        require(canWithdraw(from), "!locked funds");
        if (from != address(0)) saveProfit(from);
        if (to != address(0)) saveProfit(to);
    }

    /**
     * @notice Returns a boolean indicating if that specific _account can withdraw or not
     * (due to lockupperiod reasons)
     * @param _account Account to check withdrawal status 
     */
    function canWithdraw(address _account) public view returns (bool) {
        return (lastDepositTime[_account].add(lockUpPeriod) <= block.timestamp);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_HEGIC","type":"address"},{"internalType":"contract IERC20","name":"_WBTC","type":"address"},{"internalType":"contract IERC20","name":"_WETH","type":"address"},{"internalType":"contract IERC20","name":"_USDC","type":"address"},{"internalType":"contract IHegicStaking","name":"_stakingWBTC","type":"address"},{"internalType":"contract IHegicStaking","name":"_stakingETH","type":"address"},{"internalType":"contract IHegicStaking","name":"_stakingUSDC","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum HegicStakingPool.Asset","name":"asset","type":"uint8"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"BuyLot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"enum HegicStakingPool.Asset","name":"asset","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"netProfit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"ClaimedProfit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum HegicStakingPool.Asset","name":"asset","type":"uint8"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"SellLot","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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ACCURACY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FALLBACK_RECIPIENT","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_RECIPIENT","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HEGIC","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OLD_HEGIC_STAKING_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_LOT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Z_HEGIC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_allow","type":"bool"}],"name":"allowDeposits","outputs":[],"stateMutability":"nonpayable","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":[],"name":"approveContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"canWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"changeDiscountedPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"changeFallbackRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"changeFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"changePerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAllProfit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum HegicStakingPool.Asset","name":"_asset","type":"uint8"}],"name":"claimProfit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimProfitAndWithdraw","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":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositsAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discountedPerformanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHegicStakingETH","outputs":[{"internalType":"contract IHegicStaking","name":"HegicStakingETH","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHegicStakingUSDC","outputs":[{"internalType":"contract IHegicStaking","name":"HegicStakingWBTC","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHegicStakingWBTC","outputs":[{"internalType":"contract IHegicStaking","name":"HegicStakingWBTC","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum HegicStakingPool.Asset","name":"_asset","type":"uint8"}],"name":"getUnreceivedProfitPerToken","outputs":[{"internalType":"uint256","name":"unreceivedProfitPerToken","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"enum HegicStakingPool.Asset","name":"_asset","type":"uint8"}],"name":"getUnsaved","outputs":[{"internalType":"uint256","name":"profit","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":[{"internalType":"address","name":"","type":"address"}],"name":"isNotFirstTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDepositTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockUpPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IOldStakingPool","name":"oldStakingPool","type":"address"}],"name":"migrateFromOldStakingPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum HegicStakingPool.Asset","name":"","type":"uint8"}],"name":"numberOfStakingLots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ownerPerformanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"enum HegicStakingPool.Asset","name":"_asset","type":"uint8"}],"name":"profitOf","outputs":[{"internalType":"uint256","name":"profit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum HegicStakingPool.Asset","name":"","type":"uint8"}],"name":"staking","outputs":[{"internalType":"contract IHegicStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum HegicStakingPool.Asset","name":"","type":"uint8"}],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNumberOfStakingLots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum HegicStakingPool.Asset","name":"","type":"uint8"}],"name":"totalProfitPerToken","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_unlock","type":"bool"}],"name":"unlockAllFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052611388600a55610fa0600b55600c805460ff19166001179055610384600d553480156200003057600080fd5b506040516200406938038062004069833981810160405260e08110156200005657600080fd5b5080516020808301516040808501516060860151608087015160a088015160c09098015184518086018652600c81526b5374616b656420484547494360a01b818901528551808701909652600686526573484547494360d01b9786019790975296979496929591949093909291906000620000d062000536565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35081516200012f9060049060208501906200053a565b508051620001459060059060208401906200053a565b50506006805460ff19166012179055506001600160601b0319606088901b166080526000808052600760208190526000805160206200404983398151915280546001600160a01b0319166001600160a01b038716179055839160016002811115620001ac57fe5b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060076000600280811115620001f057fe5b6002811115620001fc57fe5b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555085601460008060028111156200024057fe5b60028111156200024c57fe5b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508460146000600160028111156200029157fe5b60028111156200029d57fe5b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360146000600280811115620002e157fe5b6002811115620002ed57fe5b81526020808201929092526040908101600090812080546001600160a01b039586166001600160a01b0319918216179091556009805482163390811790915560088054909216179055808052600783526000805160206200404983398151915254825163095ea7b360e01b8152908516600482015260001960248201529151938b169363095ea7b3936044808501949193918390030190829087803b1580156200039657600080fd5b505af1158015620003ab573d6000803e3d6000fd5b505050506040513d6020811015620003c257600080fd5b505060016000908152600760209081527fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b828546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051918b169363095ea7b39360448084019491939192918390030190829087803b1580156200044857600080fd5b505af11580156200045d573d6000803e3d6000fd5b505050506040513d60208110156200047457600080fd5b505060026000908152600760209081527fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051918b169363095ea7b39360448084019491939192918390030190829087803b158015620004fa57600080fd5b505af11580156200050f573d6000803e3d6000fd5b505050506040513d60208110156200052657600080fd5b50620005d6975050505050505050565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200057d57805160ff1916838001178555620005ad565b82800160010185558215620005ad579182015b82811115620005ad57825182559160200191906001019062000590565b50620005bb929150620005bf565b5090565b5b80821115620005bb5760008155600101620005c0565b60805160601c613a376200061260003980610f435280610fcc528061108a528061115a52806129255280612a815280612ae05250613a376000f3fe608060405234801561001057600080fd5b506004361061035c5760003560e01c806379a2908c116101d3578063b6b55f2511610104578063f02a7d19116100a2578063fbcd9b051161007c578063fbcd9b05146108db578063fbf683c1146108e3578063fd00ea1c146108eb578063ff4dfa961461090b5761035c565b8063f02a7d1914610872578063f2fde38b14610898578063f6156d5a146108be5761035c565b8063c592348f116100de578063c592348f146107f6578063dd62ed3e1461081c578063e32d03bf1461084a578063ebd090541461086a5761035c565b8063b6b55f251461078a578063bc41ab72146107a7578063bdd79f07146107c75761035c565b80638f76137f11610171578063a457c2d71161014b578063a457c2d714610722578063a9059cbb1461074e578063ad7a672f1461077a578063b04b243d146107825761035c565b80638f76137f146106f357806395d89b41146106fb5780639a213763146107035761035c565b806387788782116101ad57806387788782146106b55780638ad8a539146106bd5780638da5cb5b146106e35780638eaa9597146106eb5761035c565b806379a2908c146106855780637b80889b1461068d57806385335da8146106955761035c565b80632c2e33c3116102ad5780636132ac361161024b57806370a082311161022557806370a0823114610647578063715018a61461066d57806371e395a81461067557806377af8ceb1461067d5761035c565b80636132ac36146105f95780636c6925f91461061f5780636cc94a69146106275761035c565b8063313ce56711610287578063313ce5671461058a57806339509351146105a85780634aedc64f146105d45780635c029ac8146105f15761035c565b80632c2e33c3146105455780632d3008dd146105655780632e1a7d4d1461056d5761035c565b806318160ddd1161031a5780631cc23341116102f45780631cc23341146104d95780631e8bc190146104e157806323604071146104e957806323b872dd1461050f5761035c565b806318160ddd146104a357806319262d30146104ab5780631b016373146104d15761035c565b8062e36f41146103615780630100670b1461038557806302527753146103a6578063043134e0146103de57806306fdde03146103e6578063095ea7b314610463575b600080fd5b61036961093a565b604080516001600160a01b039092168252519081900360200190f35b6103a46004803603602081101561039b57600080fd5b50351515610952565b005b6103cc600480360360208110156103bc57600080fd5b50356001600160a01b03166109c7565b60408051918252519081900360200190f35b6103696109d9565b6103ee610a0b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610428578181015183820152602001610410565b50505050905090810190601f1680156104555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61048f6004803603604081101561047957600080fd5b506001600160a01b038135169060200135610aa1565b604080519115158252519081900360200190f35b6103cc610abf565b61048f600480360360208110156104c157600080fd5b50356001600160a01b0316610ac5565b610369610af6565b6103a4610b05565b610369610b20565b6103a4600480360360208110156104ff57600080fd5b50356001600160a01b0316610b2c565b61048f6004803603606081101561052557600080fd5b506001600160a01b03813581169160208101359091169060400135610bb0565b6103cc6004803603602081101561055b57600080fd5b503560ff16610c38565b6103cc610c4a565b6103a46004803603602081101561058357600080fd5b5035610c58565b610592610d25565b6040805160ff9092168252519081900360200190f35b61048f600480360360408110156105be57600080fd5b506001600160a01b038135169060200135610d2e565b6103a4600480360360208110156105ea57600080fd5b5035610d7c565b6103a4610e29565b6103cc6004803603602081101561060f57600080fd5b50356001600160a01b0316610e47565b6103cc610e59565b6103696004803603602081101561063d57600080fd5b503560ff16610e5f565b6103cc6004803603602081101561065d57600080fd5b50356001600160a01b0316610e7a565b6103a4610e95565b610369610f41565b6103a4610f65565b6103cc6111d2565b6103cc6111d8565b6103cc600480360360208110156106ab57600080fd5b503560ff166111de565b6103cc6112a5565b61048f600480360360208110156106d357600080fd5b50356001600160a01b03166112ab565b6103696112c0565b6103696112cf565b61048f6112da565b6103ee6112e3565b6103a46004803603602081101561071957600080fd5b50351515611344565b61048f6004803603604081101561073857600080fd5b506001600160a01b0381351690602001356113bf565b61048f6004803603604081101561076457600080fd5b506001600160a01b038135169060200135611427565b6103cc61143b565b610369611441565b6103a4600480360360208110156107a057600080fd5b5035611459565b6103cc600480360360208110156107bd57600080fd5b503560ff1661158d565b6103cc600480360360408110156107dd57600080fd5b5080356001600160a01b0316906020013560ff1661159f565b6103cc6004803603602081101561080c57600080fd5b50356001600160a01b03166115fb565b6103cc6004803603604081101561083257600080fd5b506001600160a01b03813581169160200135166119ee565b6103a46004803603602081101561086057600080fd5b503560ff16611a19565b610369611a93565b6103a46004803603602081101561088857600080fd5b50356001600160a01b0316611aa2565b6103a4600480360360208110156108ae57600080fd5b50356001600160a01b0316611b26565b6103a4600480360360208110156108d457600080fd5b5035611c28565b6103cc611cd5565b6103cc611ce7565b6103696004803603602081101561090157600080fd5b503560ff16611ced565b6103cc6004803603604081101561092157600080fd5b5080356001600160a01b0316906020013560ff16611d08565b73837010619aeb2ae24141605afc8f66577f6fb2e781565b61095a611dba565b6001600160a01b031661096b6112c0565b6001600160a01b0316146109b4576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b600c805460ff1916911515919091179055565b60176020526000908152604090205481565b600060078160025b60028111156109ec57fe5b81526020810191909152604001600020546001600160a01b0316905090565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a975780601f10610a6c57610100808354040283529160200191610a97565b820191906000526020600020905b815481529060010190602001808311610a7a57829003601f168201915b5050505050905090565b6000610ab5610aae611dba565b8484611dbe565b5060015b92915050565b60035490565b600d546001600160a01b03821660009081526017602052604081205490914291610aee91611eaa565b111592915050565b6008546001600160a01b031681565b610b0d610e29565b610b1e610b1933610e7a565b610c58565b565b600060078160016109e1565b610b34611dba565b6001600160a01b0316610b456112c0565b6001600160a01b031614610b8e576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bbd848484611f04565b610c2d84610bc9611dba565b610c2885604051806060016040528060288152602001613899602891396001600160a01b038a16600090815260026020526040812090610c07611dba565b6001600160a01b031681526020810191909152604001600020549190612061565b611dbe565b5060015b9392505050565b60126020526000908152604090205481565b69bc0a9392c65c3b00000081565b610c6133610e7a565b811115610caa576040805162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b604482015290519081900360640190fd5b610cb333610ac5565b610cee5760405162461bcd60e51b815260040180806020018281038252603a815260200180613721603a913960400191505060405180910390fd5b80610d06601054600f546120f890919063ffffffff16565b1015610d1957610d14612155565b610cee565b610d228161290e565b50565b60065460ff1690565b6000610ab5610d3b611dba565b84610c288560026000610d4c611dba565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611eaa565b610d84611dba565b6001600160a01b0316610d956112c0565b6001600160a01b031614610dde576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b612710811115610e24576040805162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015290519081900360640190fd5b600b55565b610e336000611a19565b610e3d6001611a19565b610b1e6002611a19565b60156020526000908152604090205481565b600d5481565b6007602052600090815260409020546001600160a01b031681565b6001600160a01b031660009081526001602052604090205490565b610e9d611dba565b6001600160a01b0316610eae6112c0565b6001600160a01b031614610ef7576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b7f000000000000000000000000000000000000000000000000000000000000000081565b600c5460ff16610f7457600080fd5b6000808052600760209081527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df546040805163095ea7b360e01b81526001600160a01b039283166004820152600019602482015290517f00000000000000000000000000000000000000000000000000000000000000009092169363095ea7b39360448084019491939192918390030190829087803b15801561101657600080fd5b505af115801561102a573d6000803e3d6000fd5b505050506040513d602081101561104057600080fd5b50506001600090815260076020908152600080516020613924833981519152546040805163095ea7b360e01b81526001600160a01b039283166004820152600019602482015290517f00000000000000000000000000000000000000000000000000000000000000009092169363095ea7b39360448084019491939192918390030190829087803b1580156110d457600080fd5b505af11580156110e8573d6000803e3d6000fd5b505050506040513d60208110156110fe57600080fd5b505060026000908152600760209081527fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d546040805163095ea7b360e01b81526001600160a01b039283166004820152600019602482015290517f00000000000000000000000000000000000000000000000000000000000000009092169363095ea7b39360448084019491939192918390030190829087803b1580156111a457600080fd5b505af11580156111b8573d6000803e3d6000fd5b505050506040513d60208110156111ce57600080fd5b5050565b600b5481565b60105481565b600080600760008460028111156111f157fe5b60028111156111fc57fe5b815260208082019290925260409081016000205481516354198ce960e01b815230600482015291516001600160a01b03909116926354198ce99260248082019391829003018186803b15801561125157600080fd5b505afa158015611265573d6000803e3d6000fd5b505050506040513d602081101561127b57600080fd5b5051600f54909150610c319061129f836d04ee2d6d415b85acef810000000061299a565b906129f3565b600a5481565b60166020526000908152604090205460ff1681565b6000546001600160a01b031690565b6000600781806109e1565b600c5460ff1681565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a975780601f10610a6c57610100808354040283529160200191610a97565b61134c611dba565b6001600160a01b031661135d6112c0565b6001600160a01b0316146113a6576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b80156113b6576000600d55610d22565b610384600d5550565b6000610ab56113cc611dba565b84610c28856040518060600160405280602581526020016139b760259139600260006113f6611dba565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612061565b6000610ab5611434611dba565b8484611f04565b600f5481565b73f4128b00afda933428056d0f0d1d7652af7e2b3581565b6000811161149f576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b604482015290519081900360640190fd5b600c5460ff166114e05760405162461bcd60e51b81526004018080602001828103825260268152602001806139dc6026913960400191505060405180910390fd5b600a5433600090815260156020526040902054118061150f57503360009081526016602052604090205460ff16155b1561153e57600a54336000908152601560209081526040808320939093556016905220805460ff191660011790555b33600090815260176020526040902042905561155981612a5a565b69bc0a9392c65c3b00000061157b601054600f546120f890919063ffffffff16565b10610d2257611588612b6a565b611559565b60136020526000908152604090205481565b6000610c316115ae8484611d08565b6001600160a01b0385166000908152601960205260408120908560028111156115d357fe5b60028111156115de57fe5b815260200190815260200160002054611eaa90919063ffffffff16565b336000908152601660205260408120805460ff19166001179055806001600160a01b03831673f4128b00afda933428056d0f0d1d7652af7e2b351415611768578290506000836001600160a01b0316636132ac36336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561168d57600080fd5b505afa1580156116a1573d6000803e3d6000fd5b505050506040513d60208110156116b757600080fd5b5051600b54909150808211156116de57336000908152601560205260409020819055611761565b60408051633099561b60e11b815233600482015290516001600160a01b03871691636132ac36916024808301926020929190829003018186803b15801561172457600080fd5b505afa158015611738573d6000803e3d6000fd5b505050506040513d602081101561174e57600080fd5b5051336000908152601560205260409020555b5050611792565b50600b543360009081526015602052604090205573837010619aeb2ae24141605afc8f66577f6fb2e75b6000816001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117e157600080fd5b505afa1580156117f5573d6000803e3d6000fd5b505050506040513d602081101561180b57600080fd5b5051116118495760405162461bcd60e51b81526004018080602001828103825260228152602001806138e16022913960400191505060405180910390fd5b6000816001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561189857600080fd5b505afa1580156118ac573d6000803e3d6000fd5b505050506040513d60208110156118c257600080fd5b505190506118db6001600160a01b038316333084612d13565b6001600160a01b03841673f4128b00afda933428056d0f0d1d7652af7e2b35141561196357836001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561194657600080fd5b505af115801561195a573d6000803e3d6000fd5b505050506119d8565b836001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156119a957600080fd5b505af11580156119bd573d6000803e3d6000fd5b505050506040513d60208110156119d357600080fd5b505190505b600e805460ff19166001179055610c3181611459565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000611a253383612d73565b3360009081526019602052604081209192509081846002811115611a4557fe5b6002811115611a5057fe5b8152602001908152602001600020819055506111ce81833360156000336001600160a01b03166001600160a01b0316815260200190815260200160002054612e8a565b6009546001600160a01b031681565b611aaa611dba565b6001600160a01b0316611abb6112c0565b6001600160a01b031614611b04576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b611b2e611dba565b6001600160a01b0316611b3f6112c0565b6001600160a01b031614611b88576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b6001600160a01b038116611bcd5760405162461bcd60e51b815260040180806020018281038252602681526020018061377d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611c30611dba565b6001600160a01b0316611c416112c0565b6001600160a01b031614611c8a576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b612710811115611cd0576040805162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015290519081900360640190fd5b600a55565b6d04ee2d6d415b85acef810000000081565b60115481565b6014602052600090815260409020546001600160a01b031681565b6000610c316d04ee2d6d415b85acef810000000061129f611d2886610e7a565b611db4611d34876111de565b6001600160a01b0389166000908152601860205260408120611dae918a6002811115611d5c57fe5b6002811115611d6757fe5b815260200190815260200160002054601360008b6002811115611d8657fe5b6002811115611d9157fe5b8152602001908152602001600020546120f890919063ffffffff16565b90611eaa565b9061299a565b3390565b6001600160a01b038316611e035760405162461bcd60e51b81526004018080602001828103825260248152602001806139696024913960400191505060405180910390fd5b6001600160a01b038216611e485760405162461bcd60e51b81526004018080602001828103825260228152602001806137a36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015610c31576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b038316611f495760405162461bcd60e51b81526004018080602001828103825260258152602001806139446025913960400191505060405180910390fd5b6001600160a01b038216611f8e5760405162461bcd60e51b81526004018080602001828103825260238152602001806136fe6023913960400191505060405180910390fd5b611f99838383612f81565b611fd6816040518060600160405280602681526020016137e5602691396001600160a01b0386166000908152600160205260409020549190612061565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546120059082611eaa565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156120f05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156120b557818101518382015260200161209d565b50505050905090810190601f1680156120e25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282111561214f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60126020526000805160206137c583398151915254600160008190527f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a35490911015806122c1575060016000526007602090815260008051602061392483398151915254604080516301b7150360e41b8152905142936122bf936001600160a01b031692631b7150309260048083019392829003018186803b1580156121fa57600080fd5b505afa15801561220e573d6000803e3d6000fd5b505050506040513d602081101561222457600080fd5b50516007600060015b600281111561223857fe5b8152602080820192909252604090810160002054815163a673729160e01b815230600482015291516001600160a01b039091169263a67372919260248082019391829003018186803b15801561228d57600080fd5b505afa1580156122a1573d6000803e3d6000fd5b505050506040513d60208110156122b757600080fd5b505190611eaa565b115b80612353575060016000526007602090815260008051602061392483398151915254604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561232557600080fd5b505afa158015612339573d6000803e3d6000fd5b505050506040513d602081101561234f57600080fd5b5051155b156127d15760126020527f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b254600080526000805160206137c5833981519152541180159061244557506002600052600760209081527fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d54604080516301b7150360e41b815290514293612442936001600160a01b031692631b7150309260048083019392829003018186803b15801561240b57600080fd5b505afa15801561241f573d6000803e3d6000fd5b505050506040513d602081101561243557600080fd5b505160076000600261222d565b11155b80156124ec575060026000908152600760209081527fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d54604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156124be57600080fd5b505afa1580156124d2573d6000803e3d6000fd5b505050506040513d60208110156124e857600080fd5b5051115b156124f9575060026127d1565b60008052600760209081527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df54604080516301b7150360e41b81529051429361259d936001600160a01b031692631b7150309260048083019392829003018186803b15801561256757600080fd5b505afa15801561257b573d6000803e3d6000fd5b505050506040513d602081101561259157600080fd5b5051600760008061222d565b1115801561264457506000808052600760209081527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df54604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561261657600080fd5b505afa15801561262a573d6000803e3d6000fd5b505050506040513d602081101561264057600080fd5b5051115b15612651575060006127d1565b50600160008190526007602090815260008051602061392483398151915254604080516301b7150360e41b8152905142936126ed936001600160a01b031692631b7150309260048083019392829003018186803b1580156126b157600080fd5b505afa1580156126c5573d6000803e3d6000fd5b505050506040513d60208110156126db57600080fd5b50516007600085600281111561222d57fe5b11158015612796575060006007600083600281111561270857fe5b600281111561271357fe5b815260208082019290925260409081016000205481516370a0823160e01b815230600482015291516001600160a01b03909116926370a082319260248082019391829003018186803b15801561276857600080fd5b505afa15801561277c573d6000803e3d6000fd5b505050506040513d602081101561279257600080fd5b5051115b6127d15760405162461bcd60e51b815260040180806020018281038252604781526020018061380b6047913960600191505060405180910390fd5b6010546127e89069bc0a9392c65c3b0000006120f8565b601055600760008260028111156127fb57fe5b600281111561280657fe5b8152602081019190915260409081016000908120548251634dcb56bd60e11b81526001600482015292516001600160a01b0390911692639b96ad7a92602480830193919282900301818387803b15801561285f57600080fd5b505af1158015612873573d6000803e3d6000fd5b5050601180546000190190555060129050600082600281111561289257fe5b600281111561289d57fe5b8152602081019190915260409081016000208054600019019055517fdc3f5a401c7c357082f07031359c05976172212c1fc5058a50167e5cc9995a3c9082903390808360028111156128eb57fe5b8152602001826001600160a01b031681526020019250505060405180910390a150565b6129183382613000565b61294c6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633836130fc565b600f5461295990826120f8565b600f55604080513381526020810183905281517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364929181900390910190a150565b6000826129a957506000610ab9565b828202828482816129b657fe5b0414610c315760405162461bcd60e51b81526004018080602001828103825260218152602001806138786021913960400191505060405180910390fd5b6000808211612a49576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612a5257fe5b049392505050565b600f54612a679082611eaa565b600f55600e5460ff16612aae57612aa96001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084612d13565b612b60565b600e805460ff19169055601054604080516370a0823160e01b81523060048201529051612b2792916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b15801561228d57600080fd5b600f5414612b60576040805162461bcd60e51b81526020600482015260016024820152602160f81b604482015290519081900360640190fd5b610d22338261314e565b60126020526000805160206137c583398151915254600260008190527f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b254909111612bfb5760126020527f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a354600080526000805160206137c58339815191525410612bf757506001612bfb565b5060005b601054612c129069bc0a9392c65c3b000000611eaa565b60105560076000826002811115612c2557fe5b6002811115612c3057fe5b815260208101919091526040908101600090812054825163ac1ec28f60e01b81526001600482015292516001600160a01b039091169263ac1ec28f92602480830193919282900301818387803b158015612c8957600080fd5b505af1158015612c9d573d6000803e3d6000fd5b505060118054600101905550601290506000826002811115612cbb57fe5b6002811115612cc657fe5b81526020810191909152604090810160002080546001019055517f292ab5c646bc4ceb188e46197669ad40d168778fb037a5cbad01d342e03d48119082903390808360028111156128eb57fe5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612d6d908590613240565b50505050565b6000612d7e826132f1565b6000612d8a8484611d08565b905060136000846002811115612d9c57fe5b6002811115612da757fe5b81526020019081526020016000205460186000866001600160a01b03166001600160a01b031681526020019081526020016000206000856002811115612de957fe5b6002811115612df457fe5b815260200190815260200160002081905550612e3d8160196000876001600160a01b03166001600160a01b0316815260200190815260200160002060008660028111156115d357fe5b6001600160a01b0385166000908152601960205260408120919350839190856002811115612e6757fe5b6002811115612e7257fe5b81526020810191909152604001600020555092915050565b6000612ea7620186a061129f612ea082866120f8565b889061299a565b90506000612eb586836120f8565b9050600060146000876002811115612ec957fe5b6002811115612ed457fe5b81526020810191909152604001600020546001600160a01b03169050612efb8186856130fc565b600954612f15906001600160a01b038381169116846130fc565b7f42bf830ec222b3077f036a1be5d7d50fd1fc16cfcb9c67a8547cf0241679eae08587858560405180856001600160a01b03168152602001846002811115612f5957fe5b815260200183815260200182815260200194505050505060405180910390a150505050505050565b612f8a83610ac5565b612fcb576040805162461bcd60e51b815260206004820152600d60248201526c216c6f636b65642066756e647360981b604482015290519081900360640190fd5b6001600160a01b03831615612fe357612fe3836134fb565b6001600160a01b03821615612ffb57612ffb826134fb565b505050565b6001600160a01b0382166130455760405162461bcd60e51b81526004018080602001828103825260218152602001806139036021913960400191505060405180910390fd5b61305182600083612f81565b61308e8160405180606001604052806022815260200161375b602291396001600160a01b0385166000908152600160205260409020549190612061565b6001600160a01b0383166000908152600160205260409020556003546130b490826120f8565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612ffb908490613240565b6001600160a01b0382166131a9576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6131b560008383612f81565b6003546131c29082611eaa565b6003556001600160a01b0382166000908152600160205260409020546131e89082611eaa565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6060613295826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661351e9092919063ffffffff16565b805190915015612ffb578080602001905160208110156132b457600080fd5b5051612ffb5760405162461bcd60e51b815260040180806020018281038252602a81526020018061398d602a913960400191505060405180910390fd5b60006007600083600281111561330357fe5b600281111561330e57fe5b815260208082019290925260409081016000205481516354198ce960e01b815230600482015291516001600160a01b03909116926354198ce99260248082019391829003018186803b15801561336357600080fd5b505afa158015613377573d6000803e3d6000fd5b505050506040513d602081101561338d57600080fd5b50519050801561343d57600760008360028111156133a757fe5b60028111156133b257fe5b81526020808201929092526040908101600090812054825163264eb21360e21b815230600482015292516001600160a01b039091169363993ac84c93602480820194929392918390030190829087803b15801561340e57600080fd5b505af1158015613422573d6000803e3d6000fd5b505050506040513d602081101561343857600080fd5b505190505b6000600f54116134985760006014600084600281111561345957fe5b600281111561346457fe5b81526020810191909152604001600020546008546001600160a01b03918216925061349291839116846130fc565b506111ce565b600f546134cb906134bb9061129f846d04ee2d6d415b85acef810000000061299a565b601360008560028111156115d357fe5b601360008460028111156134db57fe5b60028111156134e657fe5b81526020810191909152604001600020555050565b613506816000612d73565b50613512816001612d73565b506111ce816002612d73565b606061352d8484600085613535565b949350505050565b6060824710156135765760405162461bcd60e51b81526004018080602001828103825260268152602001806138526026913960400191505060405180910390fd5b61357f85613691565b6135d0576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061360f5780518252601f1990920191602091820191016135f0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613671576040519150601f19603f3d011682016040523d82523d6000602084013e613676565b606091505b5091509150613686828286613697565b979650505050505050565b3b151590565b606083156136a6575081610c31565b8251156136b65782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156120b557818101518382015260200161209d56fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373596f75206465706f7369746564206c657373207468616e203135206d696e732061676f2e20596f75722066756e647320617265206c6f636b656445524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573737e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654c6f742073616c65206973206c6f636b65642062792048656769632e2046756e64732073686f756c6420626520617661696c61626c6520696e206c657373207468616e20323468416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724e6f7420656e6f7567682062616c616e6365202f206e6f7420737570706f7274656445524332303a206275726e2066726f6d20746865207a65726f2061646472657373b39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b82845524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4465706f7369747320617265206e6f7420616c6c6f77656420617420746865206d6f6d656e74a2646970667358221220650a0b47464c7f2626a841b134476fbbddb7c24e10bfe831c86c9d5a55981b6864736f6c634300060c00336d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df000000000000000000000000584bc13c7d411c00c01a62e8019472de687684300000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000956bed5f95d3cfc16581c3892931c0d110376f9f000000000000000000000000c9ac1f2571748c4d02774b8d0fe5981ee4b897a2000000000000000000000000e7e8a2ed68f573d8cb25b9c7d734ebde65b47336

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061035c5760003560e01c806379a2908c116101d3578063b6b55f2511610104578063f02a7d19116100a2578063fbcd9b051161007c578063fbcd9b05146108db578063fbf683c1146108e3578063fd00ea1c146108eb578063ff4dfa961461090b5761035c565b8063f02a7d1914610872578063f2fde38b14610898578063f6156d5a146108be5761035c565b8063c592348f116100de578063c592348f146107f6578063dd62ed3e1461081c578063e32d03bf1461084a578063ebd090541461086a5761035c565b8063b6b55f251461078a578063bc41ab72146107a7578063bdd79f07146107c75761035c565b80638f76137f11610171578063a457c2d71161014b578063a457c2d714610722578063a9059cbb1461074e578063ad7a672f1461077a578063b04b243d146107825761035c565b80638f76137f146106f357806395d89b41146106fb5780639a213763146107035761035c565b806387788782116101ad57806387788782146106b55780638ad8a539146106bd5780638da5cb5b146106e35780638eaa9597146106eb5761035c565b806379a2908c146106855780637b80889b1461068d57806385335da8146106955761035c565b80632c2e33c3116102ad5780636132ac361161024b57806370a082311161022557806370a0823114610647578063715018a61461066d57806371e395a81461067557806377af8ceb1461067d5761035c565b80636132ac36146105f95780636c6925f91461061f5780636cc94a69146106275761035c565b8063313ce56711610287578063313ce5671461058a57806339509351146105a85780634aedc64f146105d45780635c029ac8146105f15761035c565b80632c2e33c3146105455780632d3008dd146105655780632e1a7d4d1461056d5761035c565b806318160ddd1161031a5780631cc23341116102f45780631cc23341146104d95780631e8bc190146104e157806323604071146104e957806323b872dd1461050f5761035c565b806318160ddd146104a357806319262d30146104ab5780631b016373146104d15761035c565b8062e36f41146103615780630100670b1461038557806302527753146103a6578063043134e0146103de57806306fdde03146103e6578063095ea7b314610463575b600080fd5b61036961093a565b604080516001600160a01b039092168252519081900360200190f35b6103a46004803603602081101561039b57600080fd5b50351515610952565b005b6103cc600480360360208110156103bc57600080fd5b50356001600160a01b03166109c7565b60408051918252519081900360200190f35b6103696109d9565b6103ee610a0b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610428578181015183820152602001610410565b50505050905090810190601f1680156104555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61048f6004803603604081101561047957600080fd5b506001600160a01b038135169060200135610aa1565b604080519115158252519081900360200190f35b6103cc610abf565b61048f600480360360208110156104c157600080fd5b50356001600160a01b0316610ac5565b610369610af6565b6103a4610b05565b610369610b20565b6103a4600480360360208110156104ff57600080fd5b50356001600160a01b0316610b2c565b61048f6004803603606081101561052557600080fd5b506001600160a01b03813581169160208101359091169060400135610bb0565b6103cc6004803603602081101561055b57600080fd5b503560ff16610c38565b6103cc610c4a565b6103a46004803603602081101561058357600080fd5b5035610c58565b610592610d25565b6040805160ff9092168252519081900360200190f35b61048f600480360360408110156105be57600080fd5b506001600160a01b038135169060200135610d2e565b6103a4600480360360208110156105ea57600080fd5b5035610d7c565b6103a4610e29565b6103cc6004803603602081101561060f57600080fd5b50356001600160a01b0316610e47565b6103cc610e59565b6103696004803603602081101561063d57600080fd5b503560ff16610e5f565b6103cc6004803603602081101561065d57600080fd5b50356001600160a01b0316610e7a565b6103a4610e95565b610369610f41565b6103a4610f65565b6103cc6111d2565b6103cc6111d8565b6103cc600480360360208110156106ab57600080fd5b503560ff166111de565b6103cc6112a5565b61048f600480360360208110156106d357600080fd5b50356001600160a01b03166112ab565b6103696112c0565b6103696112cf565b61048f6112da565b6103ee6112e3565b6103a46004803603602081101561071957600080fd5b50351515611344565b61048f6004803603604081101561073857600080fd5b506001600160a01b0381351690602001356113bf565b61048f6004803603604081101561076457600080fd5b506001600160a01b038135169060200135611427565b6103cc61143b565b610369611441565b6103a4600480360360208110156107a057600080fd5b5035611459565b6103cc600480360360208110156107bd57600080fd5b503560ff1661158d565b6103cc600480360360408110156107dd57600080fd5b5080356001600160a01b0316906020013560ff1661159f565b6103cc6004803603602081101561080c57600080fd5b50356001600160a01b03166115fb565b6103cc6004803603604081101561083257600080fd5b506001600160a01b03813581169160200135166119ee565b6103a46004803603602081101561086057600080fd5b503560ff16611a19565b610369611a93565b6103a46004803603602081101561088857600080fd5b50356001600160a01b0316611aa2565b6103a4600480360360208110156108ae57600080fd5b50356001600160a01b0316611b26565b6103a4600480360360208110156108d457600080fd5b5035611c28565b6103cc611cd5565b6103cc611ce7565b6103696004803603602081101561090157600080fd5b503560ff16611ced565b6103cc6004803603604081101561092157600080fd5b5080356001600160a01b0316906020013560ff16611d08565b73837010619aeb2ae24141605afc8f66577f6fb2e781565b61095a611dba565b6001600160a01b031661096b6112c0565b6001600160a01b0316146109b4576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b600c805460ff1916911515919091179055565b60176020526000908152604090205481565b600060078160025b60028111156109ec57fe5b81526020810191909152604001600020546001600160a01b0316905090565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a975780601f10610a6c57610100808354040283529160200191610a97565b820191906000526020600020905b815481529060010190602001808311610a7a57829003601f168201915b5050505050905090565b6000610ab5610aae611dba565b8484611dbe565b5060015b92915050565b60035490565b600d546001600160a01b03821660009081526017602052604081205490914291610aee91611eaa565b111592915050565b6008546001600160a01b031681565b610b0d610e29565b610b1e610b1933610e7a565b610c58565b565b600060078160016109e1565b610b34611dba565b6001600160a01b0316610b456112c0565b6001600160a01b031614610b8e576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bbd848484611f04565b610c2d84610bc9611dba565b610c2885604051806060016040528060288152602001613899602891396001600160a01b038a16600090815260026020526040812090610c07611dba565b6001600160a01b031681526020810191909152604001600020549190612061565b611dbe565b5060015b9392505050565b60126020526000908152604090205481565b69bc0a9392c65c3b00000081565b610c6133610e7a565b811115610caa576040805162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b604482015290519081900360640190fd5b610cb333610ac5565b610cee5760405162461bcd60e51b815260040180806020018281038252603a815260200180613721603a913960400191505060405180910390fd5b80610d06601054600f546120f890919063ffffffff16565b1015610d1957610d14612155565b610cee565b610d228161290e565b50565b60065460ff1690565b6000610ab5610d3b611dba565b84610c288560026000610d4c611dba565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611eaa565b610d84611dba565b6001600160a01b0316610d956112c0565b6001600160a01b031614610dde576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b612710811115610e24576040805162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015290519081900360640190fd5b600b55565b610e336000611a19565b610e3d6001611a19565b610b1e6002611a19565b60156020526000908152604090205481565b600d5481565b6007602052600090815260409020546001600160a01b031681565b6001600160a01b031660009081526001602052604090205490565b610e9d611dba565b6001600160a01b0316610eae6112c0565b6001600160a01b031614610ef7576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b7f000000000000000000000000584bc13c7d411c00c01a62e8019472de6876843081565b600c5460ff16610f7457600080fd5b6000808052600760209081527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df546040805163095ea7b360e01b81526001600160a01b039283166004820152600019602482015290517f000000000000000000000000584bc13c7d411c00c01a62e8019472de687684309092169363095ea7b39360448084019491939192918390030190829087803b15801561101657600080fd5b505af115801561102a573d6000803e3d6000fd5b505050506040513d602081101561104057600080fd5b50506001600090815260076020908152600080516020613924833981519152546040805163095ea7b360e01b81526001600160a01b039283166004820152600019602482015290517f000000000000000000000000584bc13c7d411c00c01a62e8019472de687684309092169363095ea7b39360448084019491939192918390030190829087803b1580156110d457600080fd5b505af11580156110e8573d6000803e3d6000fd5b505050506040513d60208110156110fe57600080fd5b505060026000908152600760209081527fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d546040805163095ea7b360e01b81526001600160a01b039283166004820152600019602482015290517f000000000000000000000000584bc13c7d411c00c01a62e8019472de687684309092169363095ea7b39360448084019491939192918390030190829087803b1580156111a457600080fd5b505af11580156111b8573d6000803e3d6000fd5b505050506040513d60208110156111ce57600080fd5b5050565b600b5481565b60105481565b600080600760008460028111156111f157fe5b60028111156111fc57fe5b815260208082019290925260409081016000205481516354198ce960e01b815230600482015291516001600160a01b03909116926354198ce99260248082019391829003018186803b15801561125157600080fd5b505afa158015611265573d6000803e3d6000fd5b505050506040513d602081101561127b57600080fd5b5051600f54909150610c319061129f836d04ee2d6d415b85acef810000000061299a565b906129f3565b600a5481565b60166020526000908152604090205460ff1681565b6000546001600160a01b031690565b6000600781806109e1565b600c5460ff1681565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a975780601f10610a6c57610100808354040283529160200191610a97565b61134c611dba565b6001600160a01b031661135d6112c0565b6001600160a01b0316146113a6576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b80156113b6576000600d55610d22565b610384600d5550565b6000610ab56113cc611dba565b84610c28856040518060600160405280602581526020016139b760259139600260006113f6611dba565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612061565b6000610ab5611434611dba565b8484611f04565b600f5481565b73f4128b00afda933428056d0f0d1d7652af7e2b3581565b6000811161149f576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b604482015290519081900360640190fd5b600c5460ff166114e05760405162461bcd60e51b81526004018080602001828103825260268152602001806139dc6026913960400191505060405180910390fd5b600a5433600090815260156020526040902054118061150f57503360009081526016602052604090205460ff16155b1561153e57600a54336000908152601560209081526040808320939093556016905220805460ff191660011790555b33600090815260176020526040902042905561155981612a5a565b69bc0a9392c65c3b00000061157b601054600f546120f890919063ffffffff16565b10610d2257611588612b6a565b611559565b60136020526000908152604090205481565b6000610c316115ae8484611d08565b6001600160a01b0385166000908152601960205260408120908560028111156115d357fe5b60028111156115de57fe5b815260200190815260200160002054611eaa90919063ffffffff16565b336000908152601660205260408120805460ff19166001179055806001600160a01b03831673f4128b00afda933428056d0f0d1d7652af7e2b351415611768578290506000836001600160a01b0316636132ac36336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561168d57600080fd5b505afa1580156116a1573d6000803e3d6000fd5b505050506040513d60208110156116b757600080fd5b5051600b54909150808211156116de57336000908152601560205260409020819055611761565b60408051633099561b60e11b815233600482015290516001600160a01b03871691636132ac36916024808301926020929190829003018186803b15801561172457600080fd5b505afa158015611738573d6000803e3d6000fd5b505050506040513d602081101561174e57600080fd5b5051336000908152601560205260409020555b5050611792565b50600b543360009081526015602052604090205573837010619aeb2ae24141605afc8f66577f6fb2e75b6000816001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117e157600080fd5b505afa1580156117f5573d6000803e3d6000fd5b505050506040513d602081101561180b57600080fd5b5051116118495760405162461bcd60e51b81526004018080602001828103825260228152602001806138e16022913960400191505060405180910390fd5b6000816001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561189857600080fd5b505afa1580156118ac573d6000803e3d6000fd5b505050506040513d60208110156118c257600080fd5b505190506118db6001600160a01b038316333084612d13565b6001600160a01b03841673f4128b00afda933428056d0f0d1d7652af7e2b35141561196357836001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561194657600080fd5b505af115801561195a573d6000803e3d6000fd5b505050506119d8565b836001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156119a957600080fd5b505af11580156119bd573d6000803e3d6000fd5b505050506040513d60208110156119d357600080fd5b505190505b600e805460ff19166001179055610c3181611459565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000611a253383612d73565b3360009081526019602052604081209192509081846002811115611a4557fe5b6002811115611a5057fe5b8152602001908152602001600020819055506111ce81833360156000336001600160a01b03166001600160a01b0316815260200190815260200160002054612e8a565b6009546001600160a01b031681565b611aaa611dba565b6001600160a01b0316611abb6112c0565b6001600160a01b031614611b04576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b611b2e611dba565b6001600160a01b0316611b3f6112c0565b6001600160a01b031614611b88576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b6001600160a01b038116611bcd5760405162461bcd60e51b815260040180806020018281038252602681526020018061377d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611c30611dba565b6001600160a01b0316611c416112c0565b6001600160a01b031614611c8a576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b612710811115611cd0576040805162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015290519081900360640190fd5b600a55565b6d04ee2d6d415b85acef810000000081565b60115481565b6014602052600090815260409020546001600160a01b031681565b6000610c316d04ee2d6d415b85acef810000000061129f611d2886610e7a565b611db4611d34876111de565b6001600160a01b0389166000908152601860205260408120611dae918a6002811115611d5c57fe5b6002811115611d6757fe5b815260200190815260200160002054601360008b6002811115611d8657fe5b6002811115611d9157fe5b8152602001908152602001600020546120f890919063ffffffff16565b90611eaa565b9061299a565b3390565b6001600160a01b038316611e035760405162461bcd60e51b81526004018080602001828103825260248152602001806139696024913960400191505060405180910390fd5b6001600160a01b038216611e485760405162461bcd60e51b81526004018080602001828103825260228152602001806137a36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015610c31576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b038316611f495760405162461bcd60e51b81526004018080602001828103825260258152602001806139446025913960400191505060405180910390fd5b6001600160a01b038216611f8e5760405162461bcd60e51b81526004018080602001828103825260238152602001806136fe6023913960400191505060405180910390fd5b611f99838383612f81565b611fd6816040518060600160405280602681526020016137e5602691396001600160a01b0386166000908152600160205260409020549190612061565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546120059082611eaa565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156120f05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156120b557818101518382015260200161209d565b50505050905090810190601f1680156120e25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282111561214f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60126020526000805160206137c583398151915254600160008190527f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a35490911015806122c1575060016000526007602090815260008051602061392483398151915254604080516301b7150360e41b8152905142936122bf936001600160a01b031692631b7150309260048083019392829003018186803b1580156121fa57600080fd5b505afa15801561220e573d6000803e3d6000fd5b505050506040513d602081101561222457600080fd5b50516007600060015b600281111561223857fe5b8152602080820192909252604090810160002054815163a673729160e01b815230600482015291516001600160a01b039091169263a67372919260248082019391829003018186803b15801561228d57600080fd5b505afa1580156122a1573d6000803e3d6000fd5b505050506040513d60208110156122b757600080fd5b505190611eaa565b115b80612353575060016000526007602090815260008051602061392483398151915254604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561232557600080fd5b505afa158015612339573d6000803e3d6000fd5b505050506040513d602081101561234f57600080fd5b5051155b156127d15760126020527f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b254600080526000805160206137c5833981519152541180159061244557506002600052600760209081527fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d54604080516301b7150360e41b815290514293612442936001600160a01b031692631b7150309260048083019392829003018186803b15801561240b57600080fd5b505afa15801561241f573d6000803e3d6000fd5b505050506040513d602081101561243557600080fd5b505160076000600261222d565b11155b80156124ec575060026000908152600760209081527fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d54604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156124be57600080fd5b505afa1580156124d2573d6000803e3d6000fd5b505050506040513d60208110156124e857600080fd5b5051115b156124f9575060026127d1565b60008052600760209081527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df54604080516301b7150360e41b81529051429361259d936001600160a01b031692631b7150309260048083019392829003018186803b15801561256757600080fd5b505afa15801561257b573d6000803e3d6000fd5b505050506040513d602081101561259157600080fd5b5051600760008061222d565b1115801561264457506000808052600760209081527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df54604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561261657600080fd5b505afa15801561262a573d6000803e3d6000fd5b505050506040513d602081101561264057600080fd5b5051115b15612651575060006127d1565b50600160008190526007602090815260008051602061392483398151915254604080516301b7150360e41b8152905142936126ed936001600160a01b031692631b7150309260048083019392829003018186803b1580156126b157600080fd5b505afa1580156126c5573d6000803e3d6000fd5b505050506040513d60208110156126db57600080fd5b50516007600085600281111561222d57fe5b11158015612796575060006007600083600281111561270857fe5b600281111561271357fe5b815260208082019290925260409081016000205481516370a0823160e01b815230600482015291516001600160a01b03909116926370a082319260248082019391829003018186803b15801561276857600080fd5b505afa15801561277c573d6000803e3d6000fd5b505050506040513d602081101561279257600080fd5b5051115b6127d15760405162461bcd60e51b815260040180806020018281038252604781526020018061380b6047913960600191505060405180910390fd5b6010546127e89069bc0a9392c65c3b0000006120f8565b601055600760008260028111156127fb57fe5b600281111561280657fe5b8152602081019190915260409081016000908120548251634dcb56bd60e11b81526001600482015292516001600160a01b0390911692639b96ad7a92602480830193919282900301818387803b15801561285f57600080fd5b505af1158015612873573d6000803e3d6000fd5b5050601180546000190190555060129050600082600281111561289257fe5b600281111561289d57fe5b8152602081019190915260409081016000208054600019019055517fdc3f5a401c7c357082f07031359c05976172212c1fc5058a50167e5cc9995a3c9082903390808360028111156128eb57fe5b8152602001826001600160a01b031681526020019250505060405180910390a150565b6129183382613000565b61294c6001600160a01b037f000000000000000000000000584bc13c7d411c00c01a62e8019472de687684301633836130fc565b600f5461295990826120f8565b600f55604080513381526020810183905281517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364929181900390910190a150565b6000826129a957506000610ab9565b828202828482816129b657fe5b0414610c315760405162461bcd60e51b81526004018080602001828103825260218152602001806138786021913960400191505060405180910390fd5b6000808211612a49576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612a5257fe5b049392505050565b600f54612a679082611eaa565b600f55600e5460ff16612aae57612aa96001600160a01b037f000000000000000000000000584bc13c7d411c00c01a62e8019472de6876843016333084612d13565b612b60565b600e805460ff19169055601054604080516370a0823160e01b81523060048201529051612b2792916001600160a01b037f000000000000000000000000584bc13c7d411c00c01a62e8019472de6876843016916370a0823191602480820192602092909190829003018186803b15801561228d57600080fd5b600f5414612b60576040805162461bcd60e51b81526020600482015260016024820152602160f81b604482015290519081900360640190fd5b610d22338261314e565b60126020526000805160206137c583398151915254600260008190527f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b254909111612bfb5760126020527f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a354600080526000805160206137c58339815191525410612bf757506001612bfb565b5060005b601054612c129069bc0a9392c65c3b000000611eaa565b60105560076000826002811115612c2557fe5b6002811115612c3057fe5b815260208101919091526040908101600090812054825163ac1ec28f60e01b81526001600482015292516001600160a01b039091169263ac1ec28f92602480830193919282900301818387803b158015612c8957600080fd5b505af1158015612c9d573d6000803e3d6000fd5b505060118054600101905550601290506000826002811115612cbb57fe5b6002811115612cc657fe5b81526020810191909152604090810160002080546001019055517f292ab5c646bc4ceb188e46197669ad40d168778fb037a5cbad01d342e03d48119082903390808360028111156128eb57fe5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612d6d908590613240565b50505050565b6000612d7e826132f1565b6000612d8a8484611d08565b905060136000846002811115612d9c57fe5b6002811115612da757fe5b81526020019081526020016000205460186000866001600160a01b03166001600160a01b031681526020019081526020016000206000856002811115612de957fe5b6002811115612df457fe5b815260200190815260200160002081905550612e3d8160196000876001600160a01b03166001600160a01b0316815260200190815260200160002060008660028111156115d357fe5b6001600160a01b0385166000908152601960205260408120919350839190856002811115612e6757fe5b6002811115612e7257fe5b81526020810191909152604001600020555092915050565b6000612ea7620186a061129f612ea082866120f8565b889061299a565b90506000612eb586836120f8565b9050600060146000876002811115612ec957fe5b6002811115612ed457fe5b81526020810191909152604001600020546001600160a01b03169050612efb8186856130fc565b600954612f15906001600160a01b038381169116846130fc565b7f42bf830ec222b3077f036a1be5d7d50fd1fc16cfcb9c67a8547cf0241679eae08587858560405180856001600160a01b03168152602001846002811115612f5957fe5b815260200183815260200182815260200194505050505060405180910390a150505050505050565b612f8a83610ac5565b612fcb576040805162461bcd60e51b815260206004820152600d60248201526c216c6f636b65642066756e647360981b604482015290519081900360640190fd5b6001600160a01b03831615612fe357612fe3836134fb565b6001600160a01b03821615612ffb57612ffb826134fb565b505050565b6001600160a01b0382166130455760405162461bcd60e51b81526004018080602001828103825260218152602001806139036021913960400191505060405180910390fd5b61305182600083612f81565b61308e8160405180606001604052806022815260200161375b602291396001600160a01b0385166000908152600160205260409020549190612061565b6001600160a01b0383166000908152600160205260409020556003546130b490826120f8565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612ffb908490613240565b6001600160a01b0382166131a9576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6131b560008383612f81565b6003546131c29082611eaa565b6003556001600160a01b0382166000908152600160205260409020546131e89082611eaa565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6060613295826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661351e9092919063ffffffff16565b805190915015612ffb578080602001905160208110156132b457600080fd5b5051612ffb5760405162461bcd60e51b815260040180806020018281038252602a81526020018061398d602a913960400191505060405180910390fd5b60006007600083600281111561330357fe5b600281111561330e57fe5b815260208082019290925260409081016000205481516354198ce960e01b815230600482015291516001600160a01b03909116926354198ce99260248082019391829003018186803b15801561336357600080fd5b505afa158015613377573d6000803e3d6000fd5b505050506040513d602081101561338d57600080fd5b50519050801561343d57600760008360028111156133a757fe5b60028111156133b257fe5b81526020808201929092526040908101600090812054825163264eb21360e21b815230600482015292516001600160a01b039091169363993ac84c93602480820194929392918390030190829087803b15801561340e57600080fd5b505af1158015613422573d6000803e3d6000fd5b505050506040513d602081101561343857600080fd5b505190505b6000600f54116134985760006014600084600281111561345957fe5b600281111561346457fe5b81526020810191909152604001600020546008546001600160a01b03918216925061349291839116846130fc565b506111ce565b600f546134cb906134bb9061129f846d04ee2d6d415b85acef810000000061299a565b601360008560028111156115d357fe5b601360008460028111156134db57fe5b60028111156134e657fe5b81526020810191909152604001600020555050565b613506816000612d73565b50613512816001612d73565b506111ce816002612d73565b606061352d8484600085613535565b949350505050565b6060824710156135765760405162461bcd60e51b81526004018080602001828103825260268152602001806138526026913960400191505060405180910390fd5b61357f85613691565b6135d0576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061360f5780518252601f1990920191602091820191016135f0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613671576040519150601f19603f3d011682016040523d82523d6000602084013e613676565b606091505b5091509150613686828286613697565b979650505050505050565b3b151590565b606083156136a6575081610c31565b8251156136b65782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156120b557818101518382015260200161209d56fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373596f75206465706f7369746564206c657373207468616e203135206d696e732061676f2e20596f75722066756e647320617265206c6f636b656445524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573737e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654c6f742073616c65206973206c6f636b65642062792048656769632e2046756e64732073686f756c6420626520617661696c61626c6520696e206c657373207468616e20323468416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724e6f7420656e6f7567682062616c616e6365202f206e6f7420737570706f7274656445524332303a206275726e2066726f6d20746865207a65726f2061646472657373b39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b82845524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4465706f7369747320617265206e6f7420616c6c6f77656420617420746865206d6f6d656e74a2646970667358221220650a0b47464c7f2626a841b134476fbbddb7c24e10bfe831c86c9d5a55981b6864736f6c634300060c0033

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

000000000000000000000000584bc13c7d411c00c01a62e8019472de687684300000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000956bed5f95d3cfc16581c3892931c0d110376f9f000000000000000000000000c9ac1f2571748c4d02774b8d0fe5981ee4b897a2000000000000000000000000e7e8a2ed68f573d8cb25b9c7d734ebde65b47336

-----Decoded View---------------
Arg [0] : _HEGIC (address): 0x584bC13c7D411c00c01A62e8019472dE68768430
Arg [1] : _WBTC (address): 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
Arg [2] : _WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : _USDC (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [4] : _stakingWBTC (address): 0x956BeD5f95D3Cfc16581C3892931C0D110376f9f
Arg [5] : _stakingETH (address): 0xc9aC1F2571748c4d02774b8d0fE5981ee4B897A2
Arg [6] : _stakingUSDC (address): 0xe7E8A2eD68f573D8CB25B9c7d734ebDE65b47336

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000584bc13c7d411c00c01a62e8019472de68768430
Arg [1] : 0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [4] : 000000000000000000000000956bed5f95d3cfc16581c3892931c0d110376f9f
Arg [5] : 000000000000000000000000c9ac1f2571748c4d02774b8d0fe5981ee4b897a2
Arg [6] : 000000000000000000000000e7e8a2ed68f573d8cb25b9c7d734ebde65b47336


Deployed Bytecode Sourcemap

38282:18427:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38809:85;;;:::i;:::-;;;;-1:-1:-1;;;;;38809:85:0;;;;;;;;;;;;;;41242:98;;;;;;;;;;;;;;;;-1:-1:-1;41242:98:0;;;;:::i;:::-;;39520:47;;;;;;;;;;;;;;;;-1:-1:-1;39520:47:0;-1:-1:-1;;;;;39520:47:0;;:::i;:::-;;;;;;;;;;;;;;;;48248:128;;;:::i;13511:91::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15657:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15657:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;14610:108;;;:::i;56550:156::-;;;;;;;;;;;;;;;;-1:-1:-1;56550:156:0;-1:-1:-1;;;;;56550:156:0;;:::i;38609:41::-;;;:::i;46484:120::-;;;:::i;47805:125::-;;;:::i;42139:121::-;;;;;;;;;;;;;;;;-1:-1:-1;42139:121:0;-1:-1:-1;;;;;42139:121:0;;:::i;16308:321::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16308:321:0;;;;;;;;;;;;;;;;;:::i;39217:49::-;;;;;;;;;;;;;;;;-1:-1:-1;39217:49:0;;;;:::i;38506:51::-;;;:::i;45985:364::-;;;;;;;;;;;;;;;;-1:-1:-1;45985:364:0;;:::i;14454:91::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17038:218;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17038:218:0;;;;;;;;:::i;41814:215::-;;;;;;;;;;;;;;;;-1:-1:-1;41814:215:0;;:::i;46804:142::-;;;:::i;39409:51::-;;;;;;;;;;;;;;;;-1:-1:-1;39409:51:0;-1:-1:-1;;;;;39409:51:0;;:::i;39034:37::-;;;:::i;38450:46::-;;;;;;;;;;;;;;;;-1:-1:-1;38450:46:0;;;;:::i;14781:127::-;;;;;;;;;;;;;;;;-1:-1:-1;14781:127:0;-1:-1:-1;;;;;14781:127:0;;:::i;25836:148::-;;;:::i;38412:29::-;;;:::i;40795:298::-;;;:::i;38943:43::-;;;:::i;39140:25::-;;;:::i;54529:260::-;;;;;;;;;;;;;;;;-1:-1:-1;54529:260:0;;;;:::i;38903:33::-;;;:::i;39467:46::-;;;;;;;;;;;;;;;;-1:-1:-1;39467:46:0;-1:-1:-1;;;;;39467:46:0;;:::i;25185:87::-;;;:::i;48025:128::-;;;:::i;38993:34::-;;;:::i;13721:95::-;;;:::i;42751:145::-;;;;;;;;;;;;;;;;-1:-1:-1;42751:145:0;;;;:::i;17759:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17759:269:0;;;;;;;;:::i;15121:175::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15121:175:0;;;;;;;;:::i;39109:24::-;;;:::i;38702:100::-;;;:::i;44919:867::-;;;;;;;;;;;;;;;;-1:-1:-1;44919:867:0;;:::i;39273:49::-;;;;;;;;;;;;;;;;-1:-1:-1;39273:49:0;;;;:::i;47538:173::-;;;;;;;;;;;;;;;;-1:-1:-1;47538:173:0;;-1:-1:-1;;;;;47538:173:0;;;;;;;;:::i;43113:1608::-;;;;;;;;;;;;;;;;-1:-1:-1;43113:1608:0;-1:-1:-1;;;;;43113:1608:0;;:::i;15359:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15359:151:0;;;;;;;;;;:::i;47108:248::-;;;;;;;;;;;;;;;;-1:-1:-1;47108:248:0;;;;:::i;38657:36::-;;;:::i;42425:131::-;;;;;;;;;;;;;;;;-1:-1:-1;42425:131:0;-1:-1:-1;;;;;42425:131:0;;:::i;26139:244::-;;;;;;;;;;;;;;;;-1:-1:-1;26139:244:0;-1:-1:-1;;;;;26139:244:0;;:::i;41470:203::-;;;;;;;;;;;;;;;;-1:-1:-1;41470:203:0;;:::i;38564:36::-;;;:::i;39172:::-;;;:::i;39329:37::-;;;;;;;;;;;;;;;;-1:-1:-1;39329:37:0;;;;:::i;48643:255::-;;;;;;;;;;;;;;;;-1:-1:-1;48643:255:0;;-1:-1:-1;;;;;48643:255:0;;;;;;;;:::i;38809:85::-;38851:42;38809:85;:::o;41242:98::-;25416:12;:10;:12::i;:::-;-1:-1:-1;;;;;25405:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;25405:23:0;;25397:68;;;;;-1:-1:-1;;;25397:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25397:68:0;;;;;;;;;;;;;;;41308:15:::1;:24:::0;;-1:-1:-1;;41308:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41242:98::o;39520:47::-;;;;;;;;;;;;;:::o;48248:128::-;48300:30;48349:7;48300:30;48357:10;48349:19;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48349:19:0;;-1:-1:-1;;;;;48349:19:0;;-1:-1:-1;48248:128:0;:::o;13511:91::-;13589:5;13582:12;;;;;;;;-1:-1:-1;;13582:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13556:13;;13582:12;;13589:5;;13582:12;;13589:5;13582:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13511:91;:::o;15657:169::-;15740:4;15757:39;15766:12;:10;:12::i;:::-;15780:7;15789:6;15757:8;:39::i;:::-;-1:-1:-1;15814:4:0;15657:169;;;;;:::o;14610:108::-;14698:12;;14610:108;:::o;56550:156::-;56665:12;;-1:-1:-1;;;;;56635:25:0;;56610:4;56635:25;;;:15;:25;;;;;;56610:4;;56682:15;;56635:43;;:29;:43::i;:::-;:62;;;56550:156;-1:-1:-1;;56550:156:0:o;38609:41::-;;;-1:-1:-1;;;;;38609:41:0;;:::o;46484:120::-;46538:16;:14;:16::i;:::-;46565:31;46574:21;46584:10;46574:9;:21::i;:::-;46565:8;:31::i;:::-;46484:120::o;47805:125::-;47856:29;47904:7;47856:29;47912:9;47904:18;;42139:121;25416:12;:10;:12::i;:::-;-1:-1:-1;;;;;25405:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;25405:23:0;;25397:68;;;;;-1:-1:-1;;;25397:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25397:68:0;;;;;;;;;;;;;;;42217:13:::1;:35:::0;;-1:-1:-1;;;;;;42217:35:0::1;-1:-1:-1::0;;;;;42217:35:0;;;::::1;::::0;;;::::1;::::0;;42139:121::o;16308:321::-;16414:4;16431:36;16441:6;16449:9;16460:6;16431:9;:36::i;:::-;16478:121;16487:6;16495:12;:10;:12::i;:::-;16509:89;16547:6;16509:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16509:19:0;;;;;;:11;:19;;;;;;16529:12;:10;:12::i;:::-;-1:-1:-1;;;;;16509:33:0;;;;;;;;;;;;-1:-1:-1;16509:33:0;;;:89;:37;:89::i;:::-;16478:8;:121::i;:::-;-1:-1:-1;16617:4:0;16308:321;;;;;;:::o;39217:49::-;;;;;;;;;;;;;:::o;38506:51::-;38547:10;38506:51;:::o;45985:364::-;46054:21;46064:10;46054:9;:21::i;:::-;46043:7;:32;;46035:63;;;;;-1:-1:-1;;;46035:63:0;;;;;;;;;;;;-1:-1:-1;;;46035:63:0;;;;;;;;;;;;;;;46117:23;46129:10;46117:11;:23::i;:::-;46109:94;;;;-1:-1:-1;;;46109:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46256:7;46222:31;46239:13;;46222:12;;:16;;:31;;;;:::i;:::-;:41;46216:91;;;46279:16;:14;:16::i;:::-;46216:91;;;46319:22;46333:7;46319:13;:22::i;:::-;45985:364;:::o;14454:91::-;14528:9;;;;14454:91;:::o;17038:218::-;17126:4;17143:83;17152:12;:10;:12::i;:::-;17166:7;17175:50;17214:10;17175:11;:25;17187:12;:10;:12::i;:::-;-1:-1:-1;;;;;17175:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;17175:25:0;;;:34;;;;;;;;;;;:38;:50::i;41814:215::-;25416:12;:10;:12::i;:::-;-1:-1:-1;;;;;25405:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;25405:23:0;;25397:68;;;;;-1:-1:-1;;;25397:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25397:68:0;;;;;;;;;;;;;;;41955:5:::1;41947:4;:13;;41939:38;;;::::0;;-1:-1:-1;;;41939:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41939:38:0;;;;;;;;;;;;;::::1;;41990:24;:31:::0;41814:215::o;46804:142::-;46848:23;46860:10;46848:11;:23::i;:::-;46882:22;46894:9;46882:11;:22::i;:::-;46915:23;46927:10;46915:11;:23::i;39409:51::-;;;;;;;;;;;;;:::o;39034:37::-;;;;:::o;38450:46::-;;;;;;;;;;;;-1:-1:-1;;;;;38450:46:0;;:::o;14781:127::-;-1:-1:-1;;;;;14882:18:0;14855:7;14882:18;;;:9;:18;;;;;;;14781:127::o;25836:148::-;25416:12;:10;:12::i;:::-;-1:-1:-1;;;;;25405:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;25405:23:0;;25397:68;;;;;-1:-1:-1;;;25397:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25397:68:0;;;;;;;;;;;;;;;25943:1:::1;25927:6:::0;;25906:40:::1;::::0;-1:-1:-1;;;;;25927:6:0;;::::1;::::0;25906:40:::1;::::0;25943:1;;25906:40:::1;25974:1;25957:19:::0;;-1:-1:-1;;;;;;25957:19:0::1;::::0;;25836:148::o;38412:29::-;;;:::o;40795:298::-;40851:15;;;;40843:24;;;;;;40900:19;;;;:7;:19;;;;;;;40878:62;;-1:-1:-1;;;40878:62:0;;-1:-1:-1;;;;;40900:19:0;;;40878:62;;;;-1:-1:-1;;40878:62:0;;;;;;:5;:13;;;;;;:62;;;;;40900:19;;40878:62;;;;;;;;;;:13;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40981:9:0;40973:18;;;;:7;:18;;;;-1:-1:-1;;;;;;;;;;;40973:18:0;;40951:61;;-1:-1:-1;;;40951:61:0;;-1:-1:-1;;;;;40973:18:0;;;40951:61;;;;-1:-1:-1;;40951:61:0;;;;;;:5;:13;;;;;;:61;;;;;40973:18;;40951:61;;;;;;;;;;:13;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41053:10:0;41045:19;;;;:7;:19;;;;;;;41023:62;;-1:-1:-1;;;41023:62:0;;-1:-1:-1;;;;;41045:19:0;;;41023:62;;;;-1:-1:-1;;41023:62:0;;;;;;:5;:13;;;;;;:62;;;;;41045:19;;41023:62;;;;;;;;;;:13;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40795:298:0:o;38943:43::-;;;;:::o;39140:25::-;;;;:::o;54529:260::-;54601:29;54642:11;54656:7;:15;54664:6;54656:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54656:15:0;;:39;;-1:-1:-1;;;54656:39:0;;54689:4;54656:39;;;;;;-1:-1:-1;;;;;54656:15:0;;;;:24;;:39;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54656:39:0;54768:12;;54656:39;;-1:-1:-1;54743:38:0;;:20;54656:39;38596:4;54743:10;:20::i;:::-;:24;;:38::i;38903:33::-;;;;:::o;39467:46::-;;;;;;;;;;;;;;;:::o;25185:87::-;25231:7;25258:6;-1:-1:-1;;;;;25258:6:0;25185:87;:::o;48025:128::-;48077:30;48126:7;48077:30;;48126:19;;38993:34;;;;;;:::o;13721:95::-;13801:7;13794:14;;;;;;;;-1:-1:-1;;13794:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13768:13;;13794:14;;13801:7;;13794:14;;13801:7;13794:14;;;;;;;;;;;;;;;;;;;;;;;;42751:145;25416:12;:10;:12::i;:::-;-1:-1:-1;;;;;25405:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;25405:23:0;;25397:68;;;;;-1:-1:-1;;;25397:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25397:68:0;;;;;;;;;;;;;;;42822:7:::1;42819:69;;;42846:1;42831:12;:16:::0;42819:69:::1;;;42878:10;42863:12;:25:::0;42751:145;:::o;17759:269::-;17852:4;17869:129;17878:12;:10;:12::i;:::-;17892:7;17901:96;17940:15;17901:96;;;;;;;;;;;;;;;;;:11;:25;17913:12;:10;:12::i;:::-;-1:-1:-1;;;;;17901:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;17901:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;15121:175::-;15207:4;15224:42;15234:12;:10;:12::i;:::-;15248:9;15259:6;15224:9;:42::i;39109:24::-;;;;:::o;38702:100::-;38759:42;38702:100;:::o;44919:867::-;44986:1;44976:7;:11;44968:38;;;;;-1:-1:-1;;;44968:38:0;;;;;;;;;;;;-1:-1:-1;;;44968:38:0;;;;;;;;;;;;;;;45025:15;;;;45017:66;;;;-1:-1:-1;;;45017:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45380:14;;45366:10;45346:31;;;;:19;:31;;;;;;:48;;:79;;-1:-1:-1;45414:10:0;45399:26;;;;:14;:26;;;;;;;;45398:27;45346:79;45343:207;;;45476:14;;45462:10;45442:31;;;;:19;:31;;;;;;;;:48;;;;45505:14;:26;;;:33;;-1:-1:-1;;45505:33:0;45534:4;45505:33;;;45343:207;45576:10;45560:27;;;;:15;:27;;;;;45590:15;45560:45;;45644:21;45657:7;45644:12;:21::i;:::-;38547:10;45684:31;45701:13;;45684:12;;:16;;:31;;;;:::i;:::-;:52;45678:101;;45752:15;:13;:15::i;:::-;45678:101;;39273:49;;;;;;;;;;;;;:::o;47538:173::-;47609:11;47640:63;47674:28;47685:8;47695:6;47674:10;:28::i;:::-;-1:-1:-1;;;;;47640:21:0;;;;;;:11;:21;;;;;;47662:6;47640:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:63;;;;:::i;43113:1608::-;43303:10;43198:4;43288:26;;;:14;:26;;;;;:33;;-1:-1:-1;;43288:33:0;43317:4;43288:33;;;43198:4;-1:-1:-1;;;;;43335:58:0;;38759:42;43335:58;43332:725;;;43434:14;43410:40;;43520:22;43545:14;-1:-1:-1;;;;;43545:34:0;;43580:10;43545:46;;;;;;;;;;;;;-1:-1:-1;;;;;43545:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43545:46:0;43618:24;;43545:46;;-1:-1:-1;43660:24:0;;;43657:223;;;43725:10;43705:31;;;;:19;:31;;;;;:38;;;43657:223;;;43818:46;;;-1:-1:-1;;;43818:46:0;;43853:10;43818:46;;;;;;-1:-1:-1;;;;;43818:34:0;;;;;:46;;;;;;;;;;;;;;:34;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43818:46:0;43804:10;43784:31;;;;:19;43818:46;43784:31;;;;:80;43657:223;43332:725;;;;;-1:-1:-1;44021:24:0;;44007:10;43987:31;;;;:19;:31;;;;;:58;38851:42;43332:725;44106:1;44075:6;-1:-1:-1;;;;;44075:16:0;;44092:10;44075:28;;;;;;;;;;;;;-1:-1:-1;;;;;44075:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44075:28:0;:32;44067:79;;;;-1:-1:-1;;;44067:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44187:18;44208:6;-1:-1:-1;;;;;44208:16:0;;44225:10;44208:28;;;;;;;;;;;;;-1:-1:-1;;;;;44208:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44208:28:0;;-1:-1:-1;44247:62:0;-1:-1:-1;;;;;44247:23:0;;44271:10;44291:4;44208:28;44247:23;:62::i;:::-;-1:-1:-1;;;;;44323:58:0;;38759:42;44323:58;44320:309;;;44446:14;-1:-1:-1;;;;;44446:23:0;;44470:10;44446:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44320:309;;;44580:14;-1:-1:-1;;;;;44563:42:0;;44606:10;44563:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44563:54:0;;-1:-1:-1;44320:309:0;44639:9;:16;;-1:-1:-1;;44639:16:0;44651:4;44639:16;;;44666:19;44674:10;44666:7;:19::i;15359:151::-;-1:-1:-1;;;;;15475:18:0;;;15448:7;15475:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15359:151::o;47108:248::-;47161:11;47175:30;47186:10;47198:6;47175:10;:30::i;:::-;47228:10;47250:1;47216:23;;;:11;:23;;;;;47161:44;;-1:-1:-1;47250:1:0;;47240:6;47216:31;;;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;;47272:76;47288:6;47296;47304:10;47316:19;:31;47336:10;-1:-1:-1;;;;;47316:31:0;-1:-1:-1;;;;;47316:31:0;;;;;;;;;;;;;47272:15;:76::i;38657:36::-;;;-1:-1:-1;;;;;38657:36:0;;:::o;42425:131::-;25416:12;:10;:12::i;:::-;-1:-1:-1;;;;;25405:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;25405:23:0;;25397:68;;;;;-1:-1:-1;;;25397:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25397:68:0;;;;;;;;;;;;;;;42508:18:::1;:40:::0;;-1:-1:-1;;;;;;42508:40:0::1;-1:-1:-1::0;;;;;42508:40:0;;;::::1;::::0;;;::::1;::::0;;42425:131::o;26139:244::-;25416:12;:10;:12::i;:::-;-1:-1:-1;;;;;25405:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;25405:23:0;;25397:68;;;;;-1:-1:-1;;;25397:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25397:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26228:22:0;::::1;26220:73;;;;-1:-1:-1::0;;;26220:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26330:6;::::0;;26309:38:::1;::::0;-1:-1:-1;;;;;26309:38:0;;::::1;::::0;26330:6;::::1;::::0;26309:38:::1;::::0;::::1;26358:6;:17:::0;;-1:-1:-1;;;;;;26358:17:0::1;-1:-1:-1::0;;;;;26358:17:0;;;::::1;::::0;;;::::1;::::0;;26139:244::o;41470:203::-;25416:12;:10;:12::i;:::-;-1:-1:-1;;;;;25405:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;25405:23:0;;25397:68;;;;;-1:-1:-1;;;25397:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25397:68:0;;;;;;;;;;;;;;;41601:5:::1;41593:4;:13;;41585:38;;;::::0;;-1:-1:-1;;;41585:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41585:38:0;;;;;;;;;;;;;::::1;;41644:14;:21:::0;41470:203::o;38564:36::-;38596:4;38564:36;:::o;39172:::-;;;;:::o;39329:37::-;;;;;;;;;;;;-1:-1:-1;;;;;39329:37:0;;:::o;48643:255::-;48716:11;48749:141;38596:4;48749:127;48856:19;48866:8;48856:9;:19::i;:::-;48749:102;48815:35;48843:6;48815:27;:35::i;:::-;-1:-1:-1;;;;;48781:20:0;;;;;;:10;:20;;;;;48749:61;;48802:6;48781:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;48749:19;:27;48769:6;48749:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;:61;;;;:::i;:::-;:65;;:102::i;:::-;:106;;:127::i;704:106::-;792:10;704:106;:::o;20906:346::-;-1:-1:-1;;;;;21008:19:0;;21000:68;;;;-1:-1:-1;;;21000:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21087:21:0;;21079:68;;;;-1:-1:-1;;;21079:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21160:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;21212:32;;;;;;;;;;;;;;;;;20906:346;;;:::o;6674:179::-;6732:7;6764:5;;;6788:6;;;;6780:46;;;;;-1:-1:-1;;;6780:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;18518:539;-1:-1:-1;;;;;18624:20:0;;18616:70;;;;-1:-1:-1;;;18616:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18705:23:0;;18697:71;;;;-1:-1:-1;;;18697:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18781:47;18802:6;18810:9;18821:6;18781:20;:47::i;:::-;18861:71;18883:6;18861:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18861:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;18841:17:0;;;;;;;:9;:17;;;;;;:91;;;;18966:20;;;;;;;:32;;18991:6;18966:24;:32::i;:::-;-1:-1:-1;;;;;18943:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;19014:35;;;;;;;18943:20;;19014:35;;;;;;;;;;;;;18518:539;;;:::o;9501:166::-;9587:7;9623:12;9615:6;;;;9607:29;;;;-1:-1:-1;;;9607:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9654:5:0;;;9501:166::o;7136:158::-;7194:7;7227:1;7222;:6;;7214:49;;;;;-1:-1:-1;;;7214:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7281:5:0;;;7136:158::o;52479:1803::-;52596:19;:31;;-1:-1:-1;;;;;;;;;;;52596:31:0;52539:9;52525:11;52562:30;;;;;52539:9;;-1:-1:-1;52562:65:0;;:222;;-1:-1:-1;52733:9:0;52725:18;;:7;:18;;;;-1:-1:-1;;;;;;;;;;;52725:18:0;;:40;;-1:-1:-1;;;52725:40:0;;;;52769:15;;52645:121;;-1:-1:-1;;;;;52725:18:0;;:38;;:40;;;;;:18;:40;;;;;:18;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52725:40:0;52645:7;:18;52653:9;52645:18;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52645:18:0;;:53;;-1:-1:-1;;;52645:53:0;;52692:4;52645:53;;;;;;-1:-1:-1;;;;;52645:18:0;;;;:38;;:53;;;;;;;;;;;:18;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52645:53:0;;:79;:121::i;:::-;:139;52562:222;:288;;;-1:-1:-1;52810:9:0;52802:18;;:7;:18;;;;-1:-1:-1;;;;;;;;;;;52802:18:0;;:43;;-1:-1:-1;;;52802:43:0;;52839:4;52802:43;;;;;;-1:-1:-1;;;;;52802:18:0;;;;:28;;:43;;;;;;;;;;:18;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52802:43:0;:48;52562:288;52559:1490;;;52914:19;:31;;;;;52879;;-1:-1:-1;;;;;;;;;;;52879:31:0;:66;;;;:230;;-1:-1:-1;53056:10:0;53048:19;;:7;:19;;;;;;;:41;;-1:-1:-1;;;53048:41:0;;;;53094:15;;52967:123;;-1:-1:-1;;;;;53048:19:0;;:39;;:41;;;;;:19;:41;;;;;:19;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53048:41:0;52967:7;:19;52975:10;52967:19;;:123;:142;;52879:230;:300;;;;-1:-1:-1;53139:10:0;53178:1;53131:19;;;:7;:19;;;;;;;:44;;-1:-1:-1;;;53131:44:0;;53169:4;53131:44;;;;;;-1:-1:-1;;;;;53131:19:0;;;;:29;;:44;;;;;;;;;;:19;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53131:44:0;:48;52879:300;52876:1162;;;-1:-1:-1;53207:10:0;52876:1162;;;53324:19;;;:7;:19;;;;;;;:41;;-1:-1:-1;;;53324:41:0;;;;53370:15;;53243:123;;-1:-1:-1;;;;;53324:19:0;;:39;;:41;;;;;:19;:41;;;;;:19;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53324:41:0;53243:7;:19;;;;:123;:142;;:212;;;;-1:-1:-1;53454:1:0;53407:19;;;:7;:19;;;;;;;:44;;-1:-1:-1;;;53407:44:0;;53445:4;53407:44;;;;;;-1:-1:-1;;;;;53407:19:0;;;;:29;;:44;;;;;;;;;;:19;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53407:44:0;:48;53243:212;53239:799;;;-1:-1:-1;53483:10:0;53239:799;;;-1:-1:-1;53542:9:0;53779:14;;;;:7;:14;;;;-1:-1:-1;;;;;;;;;;;53779:14:0;;:36;;-1:-1:-1;;;53779:36:0;;;;53820:15;;53699:117;;-1:-1:-1;;;;;53779:14:0;;:34;;:36;;;;;:14;:36;;;;;:14;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53779:36:0;53699:7;:14;53707:5;53699:14;;;;;;;:117;:136;;:208;;;;;53906:1;53864:7;:14;53872:5;53864:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53864:14:0;;:39;;-1:-1:-1;;;53864:39:0;;53897:4;53864:39;;;;;;-1:-1:-1;;;;;53864:14:0;;;;:24;;:39;;;;;;;;;;;:14;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53864:39:0;:43;53699:208;53669:353;;;;-1:-1:-1;;;53669:353:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54077:13;;:36;;38547:10;54077:17;:36::i;:::-;54061:13;:52;54124:7;:14;54132:5;54124:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54124:14:0;;;;:32;;-1:-1:-1;;;54124:32:0;;:14;:32;;;;;;-1:-1:-1;;;;;54124:14:0;;;;:29;;:32;;;;;-1:-1:-1;;54124:32:0;;;;;-1:-1:-1;54124:14:0;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54167:24:0;:26;;-1:-1:-1;;54167:26:0;;;-1:-1:-1;54204:19:0;;-1:-1:-1;54167:24:0;54224:5;54204:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54204:26:0;:28;;-1:-1:-1;;54204:28:0;;;54248:26;;;54256:5;;54263:10;;54248:26;54256:5;54248:26;;;;;;;;;;;;;-1:-1:-1;;;;;54248:26:0;;;;;;;;;;;;;;;;52479:1803;:::o;51313:237::-;51370:26;51376:10;51388:7;51370:5;:26::i;:::-;51407:39;-1:-1:-1;;;;;51407:5:0;:18;51426:10;51438:7;51407:18;:39::i;:::-;51472:12;;:25;;51489:7;51472:16;:25::i;:::-;51457:12;:40;51513:29;;;51522:10;51513:29;;;;;;;;;;;;;;;;;;;;;51313:237;:::o;7553:220::-;7611:7;7635:6;7631:20;;-1:-1:-1;7650:1:0;7643:8;;7631:20;7674:5;;;7678:1;7674;:5;:1;7698:5;;;;;:10;7690:56;;;;-1:-1:-1;;;7690:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8251:153;8309:7;8341:1;8337;:5;8329:44;;;;;-1:-1:-1;;;8329:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8395:1;8391;:5;;;;;;;8251:153;-1:-1:-1;;;8251:153:0:o;50591:480::-;50662:12;;:25;;50679:7;50662:16;:25::i;:::-;50647:12;:40;50785:9;;;;50781:244;;50811:58;-1:-1:-1;;;;;50811:5:0;:22;50834:10;50854:4;50861:7;50811:22;:58::i;:::-;50781:244;;;50902:9;:17;;-1:-1:-1;;50902:17:0;;;50993:13;;50958:30;;;-1:-1:-1;;;50958:30:0;;50982:4;50958:30;;;;;;:49;;50993:13;-1:-1:-1;;;;;50958:5:0;:15;;;;:30;;;;;;;;;;;;;;;:15;:30;;;;;;;;;;:49;50942:12;;:65;50934:79;;;;;-1:-1:-1;;;50934:79:0;;;;;;;;;;;;-1:-1:-1;;;50934:79:0;;;;;;;;;;;;;;;51037:26;51043:10;51055:7;51037:5;:26::i;51670:679::-;51880:19;:31;;-1:-1:-1;;;;;;;;;;;51880:31:0;51821:10;51807:11;51845:31;;;;;51821:10;;-1:-1:-1;51842:276:0;;51965:19;:30;;;;;51930:31;;-1:-1:-1;;;;;;;;;;;51930:31:0;:65;51927:180;;-1:-1:-1;52023:9:0;51927:180;;;-1:-1:-1;52081:10:0;51927:180;52146:13;;:36;;38547:10;52146:17;:36::i;:::-;52130:13;:52;52193:7;:14;52201:5;52193:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52193:14:0;;;;:31;;-1:-1:-1;;;52193:31:0;;:14;:31;;;;;;-1:-1:-1;;;;;52193:14:0;;;;:28;;:31;;;;;-1:-1:-1;;52193:31:0;;;;;-1:-1:-1;52193:14:0;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52235:24:0;:26;;;;;;-1:-1:-1;52272:19:0;;-1:-1:-1;52235:24:0;52292:5;52272:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52272:26:0;:28;;;;;;52316:25;;;52323:5;;52330:10;;52316:25;52323:5;52316:25;;;;;;;35280:205;35408:68;;;-1:-1:-1;;;;;35408:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35408:68:0;-1:-1:-1;;;35408:68:0;;;35381:96;;35401:5;;35381:19;:96::i;:::-;35280:205;;;;:::o;55453:356::-;55523:11;55547:20;55560:6;55547:12;:20::i;:::-;55578:12;55593:28;55604:8;55614:6;55593:10;:28::i;:::-;55578:43;;55663:19;:27;55683:6;55663:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;55632:10;:20;55643:8;-1:-1:-1;;;;;55632:20:0;-1:-1:-1;;;;;55632:20:0;;;;;;;;;;;;:28;55653:6;55632:28;;;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;;55710:42;55744:7;55710:11;:21;55722:8;-1:-1:-1;;;;;55710:21:0;-1:-1:-1;;;;;55710:21:0;;;;;;;;;;;;:29;55732:6;55710:29;;;;;;;:42;-1:-1:-1;;;;;55763:21:0;;;;;;:11;:21;;;;;55701:51;;-1:-1:-1;55701:51:0;;55763:21;55785:6;55763:29;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55763:29:0;:38;-1:-1:-1;55453:356:0;;-1:-1:-1;;55453:356:0:o;49929:437::-;50031:14;50048:47;50088:6;50048:35;50060:22;50088:6;50077:4;50060:16;:22::i;:::-;50048:7;;:11;:35::i;:47::-;50031:64;-1:-1:-1;50106:8:0;50117:22;:7;50031:64;50117:11;:22::i;:::-;50106:33;;50152:17;50172:5;:13;50178:6;50172:13;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50172:13:0;;-1:-1:-1;;;;;50172:13:0;;-1:-1:-1;50197:44:0;50172:13;50221:8;50231:9;50197:23;:44::i;:::-;50276:13;;50252:43;;-1:-1:-1;;;;;50252:23:0;;;;50276:13;50291:3;50252:23;:43::i;:::-;50311:47;50325:8;50335:6;50343:9;50354:3;50311:47;;;;-1:-1:-1;;;;;50311:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49929:437;;;;;;;:::o;56092:243::-;56194:17;56206:4;56194:11;:17::i;:::-;56186:43;;;;;-1:-1:-1;;;56186:43:0;;;;;;;;;;;;-1:-1:-1;;;56186:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;56244:18:0;;;56240:40;;56264:16;56275:4;56264:10;:16::i;:::-;-1:-1:-1;;;;;56295:16:0;;;56291:36;;56313:14;56324:2;56313:10;:14::i;:::-;56092:243;;;:::o;20050:418::-;-1:-1:-1;;;;;20134:21:0;;20126:67;;;;-1:-1:-1;;;20126:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20206:49;20227:7;20244:1;20248:6;20206:20;:49::i;:::-;20289:68;20312:6;20289:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20289:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;20268:18:0;;;;;;:9;:18;;;;;:89;20383:12;;:24;;20400:6;20383:16;:24::i;:::-;20368:12;:39;20423:37;;;;;;;;20449:1;;-1:-1:-1;;;;;20423:37:0;;;;;;;;;;;;20050:418;;:::o;35095:177::-;35205:58;;;-1:-1:-1;;;;;35205:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35205:58:0;-1:-1:-1;;;35205:58:0;;;35178:86;;35198:5;;35178:19;:86::i;19339:378::-;-1:-1:-1;;;;;19423:21:0;;19415:65;;;;;-1:-1:-1;;;19415:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19493:49;19522:1;19526:7;19535:6;19493:20;:49::i;:::-;19570:12;;:24;;19587:6;19570:16;:24::i;:::-;19555:12;:39;-1:-1:-1;;;;;19626:18:0;;;;;;:9;:18;;;;;;:30;;19649:6;19626:22;:30::i;:::-;-1:-1:-1;;;;;19605:18:0;;;;;;:9;:18;;;;;;;;:51;;;;19672:37;;;;;;;19605:18;;;;19672:37;;;;;;;;;;19339:378;;:::o;37400:761::-;37824:23;37850:69;37878:4;37850:69;;;;;;;;;;;;;;;;;37858:5;-1:-1:-1;;;;;37850:27:0;;;:69;;;;;:::i;:::-;37934:17;;37824:95;;-1:-1:-1;37934:21:0;37930:224;;38076:10;38065:30;;;;;;;;;;;;;;;-1:-1:-1;38065:30:0;38057:85;;;;-1:-1:-1;;;38057:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49056:515;49112:11;49126:7;:15;49134:6;49126:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49126:15:0;;:39;;-1:-1:-1;;;49126:39:0;;49159:4;49126:39;;;;;;-1:-1:-1;;;;;49126:15:0;;;;:24;;:39;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49126:39:0;;-1:-1:-1;49179:10:0;;49176:94;;49215:7;:15;49223:6;49215:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49215:15:0;;;;:43;;-1:-1:-1;;;49215:43:0;;49252:4;49215:43;;;;;;-1:-1:-1;;;;;49215:15:0;;;;:28;;:43;;;;;:15;;:43;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49215:43:0;;-1:-1:-1;49176:94:0;49301:1;49285:12;;:17;49282:282;;49319:17;49339:5;:13;49345:6;49339:13;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49339:13:0;;49391:18;;-1:-1:-1;;;;;49339:13:0;;;;-1:-1:-1;49367:51:0;;49339:13;;49391:18;49411:6;49367:23;:51::i;:::-;49282:282;;;;49538:12;;49481:71;;49513:38;;:20;:6;38596:4;49513:10;:20::i;:38::-;49481:19;:27;49501:6;49481:27;;;;;;;:71;49451:19;:27;49471:6;49451:27;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49451:27:0;:101;49056:515;;:::o;55059:183::-;55117:32;55128:8;55138:10;55117;:32::i;:::-;;55160:31;55171:8;55181:9;55160:10;:31::i;:::-;;55202:32;55213:8;55223:10;55202;:32::i;30086:195::-;30189:12;30221:52;30243:6;30251:4;30257:1;30260:12;30221:21;:52::i;:::-;30214:59;30086:195;-1:-1:-1;;;;30086:195:0:o;31138:530::-;31265:12;31323:5;31298:21;:30;;31290:81;;;;-1:-1:-1;;;31290:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31390:18;31401:6;31390:10;:18::i;:::-;31382:60;;;;;-1:-1:-1;;;31382:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31516:12;31530:23;31557:6;-1:-1:-1;;;;;31557:11:0;31577:5;31585:4;31557:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31557:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31515:75;;;;31608:52;31626:7;31635:10;31647:12;31608:17;:52::i;:::-;31601:59;31138:530;-1:-1:-1;;;;;;;31138:530:0:o;27168:422::-;27535:20;27574:8;;;27168:422::o;33678:742::-;33793:12;33822:7;33818:595;;;-1:-1:-1;33853:10:0;33846:17;;33818:595;33967:17;;:21;33963:439;;34230:10;34224:17;34291:15;34278:10;34274:2;34270:19;34263:44;34178:148;34366:20;;-1:-1:-1;;;34366:20:0;;;;;;;;;;;;;;;;;34373:12;;34366:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

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