MATIC Price: $0.715829 (-1.84%)
Gas: 31 GWei
 

Overview

Max Total Supply

33,564.940074402867891337 EP

Holders

603

Total Transfers

-

Market

Price

$0.00 @ 0.000000 MATIC

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

$EP are the Proof-Of-Stake tokens of the FireBot ecosystem on Polygon. It allows stakers to receive a share of the daily emission of $FBX.

Contract Source Code Verified (Exact Match)

Contract Name:
ElementalParticles

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-10-27
*/

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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");

        (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");

        (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");

        (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");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev 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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^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 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'
        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) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

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

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @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
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^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 Contracts guidelines: functions revert
 * instead 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, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 this function is
     * overridden;
     *
     * 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 override returns (uint8) {
        return 18;
    }

    /**
     * @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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + 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) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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:
     *
     * - `account` 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 += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(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);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @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 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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: contracts/ElementalParticles.sol


pragma solidity ^0.8.17;




interface IFBX is IERC20 {
	function burnFrom(address account, uint256 amount) external;
}

contract ElementalParticles is ERC20, ERC20Burnable {

    using SafeERC20 for IFBX;
    IFBX public constant FBX = IFBX(0xD125443F38A69d776177c2B9c041f462936F8218);
    
    address public constant TEAM_MULTISIG = 0x82c11Ac3AD3575b0b6BeE9522329b875EFef6De5;
    uint256 public constant DAILY_EMISSION_DENOMINATOR = 1336;

    struct UserInfo {
        uint256 stakedEP;
        uint256 lastClaim;
        uint256 amountClaimed;
    }
    mapping(address => UserInfo) public userInfos;

    event Stake(address indexed account, uint256 amountEP);
    event Unstake(address indexed account, uint256 amountEP);
    
    constructor() ERC20("Elemental Particles", "EP") {
        _mint(msg.sender, 1e18 * 17050);
    }

    // FBX metrics
    function FBXLockedSupply() public view returns (uint256) {
        return FBX.balanceOf(address(this));
    }

    function FBXMaxSupply() public view returns (uint256) {
        return FBX.totalSupply();
    }

    function FBXBurntSupply() public view returns (uint256) {
        return 1e18 * 21000000 - FBXMaxSupply();
    }

    function FBXCirculatingSupply() public view returns (uint256) {
        return FBXMaxSupply() - FBXLockedSupply();
    }

    function TeamVestedFBX() public view returns (uint256) {
        return FBXLockedSupply() / 10;
    }

    function dailyFBXEmission() public view returns (uint256) {
        return FBXLockedSupply() / DAILY_EMISSION_DENOMINATOR;
    }

    function dailyFBXEmissionPerEP() public view returns (uint256) {
        uint256 totalStakedEP = balanceOf(address(this));
        if (totalStakedEP == 0) {
            return 0;
        }
        return 1e18 * dailyFBXEmission() / totalStakedEP;
    }

    // EP functions
    function claimableRewards(address account) public view returns (uint256 totalRewards, uint256 teamRewards, uint256 userRewards) {
        if (userInfos[account].stakedEP == 0) {
	        return (0, 0, 0);
        }
        uint256 elapsedTime = block.timestamp - userInfos[account].lastClaim;
        if (elapsedTime > 30 * 24 * 3600) {
            elapsedTime = 30 * 24 * 3600; // Max claimable FBX rewards period is 30 days
        }
        totalRewards = dailyFBXEmissionPerEP() * userInfos[account].stakedEP * elapsedTime / 24 / 3600 / 1e18;
        teamRewards = totalRewards / 10;
        userRewards = totalRewards - teamRewards;
    }

    function claimRewards() public returns (uint256) {
        (uint256 totalRewards, uint256 teamRewards, uint256 userRewards) = claimableRewards(msg.sender);
        userInfos[msg.sender].lastClaim = block.timestamp;
        if (totalRewards > 0) {
            userInfos[msg.sender].amountClaimed += userRewards;
            FBX.safeTransfer(TEAM_MULTISIG, teamRewards);
            FBX.safeTransfer(msg.sender, userRewards);
        }
        return userRewards;
    }

    function stakeEP(uint256 amountEP) external {
        require(amountEP > 0, "Amount to stake should be greater than 0.");
        claimRewards();
        transfer(address(this), amountEP);
        userInfos[msg.sender].stakedEP += amountEP;
        emit Stake(msg.sender, amountEP);
    }

    function unstakeEP(uint256 amountEP) external {
        require(amountEP > 0, "Amount to unstake should be greater than 0.");
        require(userInfos[msg.sender].stakedEP >= amountEP, "Not enough staked EP.");
        claimRewards();
        userInfos[msg.sender].stakedEP -= amountEP;
        _transfer(address(this), msg.sender, amountEP);
        emit Unstake(msg.sender, amountEP);
    }

    function mintEP(uint256 amountEP) external {
        require(amountEP > 0, "Amount to mint should be greater than 0.");
        FBX.burnFrom(msg.sender, 300 * amountEP);
        _mint(msg.sender, amountEP);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountEP","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountEP","type":"uint256"}],"name":"Unstake","type":"event"},{"inputs":[],"name":"DAILY_EMISSION_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FBX","outputs":[{"internalType":"contract IFBX","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FBXBurntSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FBXCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FBXLockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FBXMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_MULTISIG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamVestedFBX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimableRewards","outputs":[{"internalType":"uint256","name":"totalRewards","type":"uint256"},{"internalType":"uint256","name":"teamRewards","type":"uint256"},{"internalType":"uint256","name":"userRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailyFBXEmission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailyFBXEmissionPerEP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"amountEP","type":"uint256"}],"name":"mintEP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountEP","type":"uint256"}],"name":"stakeEP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountEP","type":"uint256"}],"name":"unstakeEP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfos","outputs":[{"internalType":"uint256","name":"stakedEP","type":"uint256"},{"internalType":"uint256","name":"lastClaim","type":"uint256"},{"internalType":"uint256","name":"amountClaimed","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280601381526020017f456c656d656e74616c205061727469636c6573000000000000000000000000008152506040518060400160405280600281526020017f455000000000000000000000000000000000000000000000000000000000000081525081600390816200008f9190620004c2565b508060049081620000a19190620004c2565b505050620000c03369039c4848393a7a280000620000c660201b60201c565b620006c4565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000138576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012f906200060a565b60405180910390fd5b6200014c600083836200023e60201b60201c565b80600260008282546200016091906200065b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620001b791906200065b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200021e9190620006a7565b60405180910390a36200023a600083836200024360201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ca57607f821691505b602082108103620002e057620002df62000282565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030b565b6200035686836200030b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a36200039d62000397846200036e565b62000378565b6200036e565b9050919050565b6000819050919050565b620003bf8362000382565b620003d7620003ce82620003aa565b84845462000318565b825550505050565b600090565b620003ee620003df565b620003fb818484620003b4565b505050565b5b81811015620004235762000417600082620003e4565b60018101905062000401565b5050565b601f82111562000472576200043c81620002e6565b6200044784620002fb565b8101602085101562000457578190505b6200046f6200046685620002fb565b83018262000400565b50505b505050565b600082821c905092915050565b6000620004976000198460080262000477565b1980831691505092915050565b6000620004b2838362000484565b9150826002028217905092915050565b620004cd8262000248565b67ffffffffffffffff811115620004e957620004e862000253565b5b620004f58254620002b1565b6200050282828562000427565b600060209050601f8311600181146200053a576000841562000525578287015190505b620005318582620004a4565b865550620005a1565b601f1984166200054a86620002e6565b60005b8281101562000574578489015182556001820191506020850194506020810190506200054d565b8683101562000594578489015162000590601f89168262000484565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620005f2601f83620005a9565b9150620005ff82620005ba565b602082019050919050565b600060208201905081810360008301526200062581620005e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000668826200036e565b915062000675836200036e565b925082820190508082111562000690576200068f6200062c565b5b92915050565b620006a1816200036e565b82525050565b6000602082019050620006be600083018462000696565b92915050565b612cc480620006d46000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636e84e3fa11610104578063b0038409116100a2578063dc01f60d11610071578063dc01f60d14610538578063dd62ed3e1461056a578063e80265c61461059a578063f90c8fd1146105b8576101cf565b8063b0038409146104c2578063b788f3a1146104e0578063beba222b146104fe578063c36d308a1461051c576101cf565b806395d89b41116100de57806395d89b41146104285780639af5d0ab14610446578063a457c2d714610462578063a9059cbb14610492576101cf565b80636e84e3fa146103be57806370a08231146103dc57806379cc67901461040c576101cf565b8063313ce56711610171578063395093511161014b578063395093511461032257806342966c681461035257806343b0215f1461036e5780635cef09e8146103a0576101cf565b8063313ce567146102c8578063372500ab146102e6578063386db0cd14610304576101cf565b806318160ddd116101ad57806318160ddd1461023e578063216af13e1461025c57806323b872dd1461027a578063309d73a5146102aa576101cf565b806306fdde03146101d4578063095ea7b3146101f25780630dd0b38c14610222575b600080fd5b6101dc6105d6565b6040516101e99190611d5f565b60405180910390f35b61020c60048036038101906102079190611e1a565b610668565b6040516102199190611e75565b60405180910390f35b61023c60048036038101906102379190611e90565b61068b565b005b61024661078c565b6040516102539190611ecc565b60405180910390f35b610264610796565b6040516102719190611ecc565b60405180910390f35b610294600480360381019061028f9190611ee7565b6107e3565b6040516102a19190611e75565b60405180910390f35b6102b2610812565b6040516102bf9190611ecc565b60405180910390f35b6102d0610818565b6040516102dd9190611f56565b60405180910390f35b6102ee610821565b6040516102fb9190611ecc565b60405180910390f35b61030c61097b565b6040516103199190611ecc565b60405180910390f35b61033c60048036038101906103379190611e1a565b610a10565b6040516103499190611e75565b60405180910390f35b61036c60048036038101906103679190611e90565b610a47565b005b61038860048036038101906103839190611f71565b610a5b565b60405161039793929190611f9e565b60405180910390f35b6103a8610a85565b6040516103b59190611ecc565b60405180910390f35b6103c6610b0f565b6040516103d39190611ecc565b60405180910390f35b6103f660048036038101906103f19190611f71565b610b2a565b6040516104039190611ecc565b60405180910390f35b61042660048036038101906104219190611e1a565b610b72565b005b610430610b92565b60405161043d9190611d5f565b60405180910390f35b610460600480360381019061045b9190611e90565b610c24565b005b61047c60048036038101906104779190611e1a565b610daa565b6040516104899190611e75565b60405180910390f35b6104ac60048036038101906104a79190611e1a565b610e21565b6040516104b99190611e75565b60405180910390f35b6104ca610e44565b6040516104d79190611ecc565b60405180910390f35b6104e8610e69565b6040516104f59190611fe4565b60405180910390f35b610506610e81565b604051610513919061205e565b60405180910390f35b61053660048036038101906105319190611e90565b610e99565b005b610552600480360381019061054d9190611f71565b610f77565b60405161056193929190611f9e565b60405180910390f35b610584600480360381019061057f9190612079565b6110ed565b6040516105919190611ecc565b60405180910390f35b6105a2611174565b6040516105af9190611ecc565b60405180910390f35b6105c0611195565b6040516105cd9190611ecc565b60405180910390f35b6060600380546105e5906120e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610611906120e8565b801561065e5780601f106106335761010080835404028352916020019161065e565b820191906000526020600020905b81548152906001019060200180831161064157829003601f168201915b5050505050905090565b6000806106736111b1565b90506106808185856111b9565b600191505092915050565b600081116106ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c59061218b565b60405180910390fd5b6106d6610821565b506106e13082610e21565b5080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461073491906121da565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a826040516107819190611ecc565b60405180910390a250565b6000600254905090565b6000806107a230610b2a565b9050600081036107b65760009150506107e0565b806107bf611195565b670de0b6b3a76400006107d2919061220e565b6107dc919061227f565b9150505b90565b6000806107ee6111b1565b90506107fb858285611382565b61080685858561140e565b60019150509392505050565b61053881565b60006012905090565b60008060008061083033610f77565b92509250925042600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555060008311156109725780600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008282546108d891906121da565b925050819055506109327382c11ac3ad3575b0b6bee9522329b875efef6de58373d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff1661168d9092919063ffffffff16565b610971338273d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff1661168d9092919063ffffffff16565b5b80935050505090565b600073d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109ca9190611fe4565b602060405180830381865afa1580156109e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0b91906122c5565b905090565b600080610a1b6111b1565b9050610a3c818585610a2d85896110ed565b610a3791906121da565b6111b9565b600191505092915050565b610a58610a526111b1565b82611713565b50565b60056020528060005260406000206000915090508060000154908060010154908060020154905083565b600073d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a91906122c5565b905090565b6000600a610b1b61097b565b610b25919061227f565b905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b8482610b7e6111b1565b83611382565b610b8e8282611713565b5050565b606060048054610ba1906120e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610bcd906120e8565b8015610c1a5780601f10610bef57610100808354040283529160200191610c1a565b820191906000526020600020905b815481529060010190602001808311610bfd57829003601f168201915b5050505050905090565b60008111610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90612364565b60405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce3906123d0565b60405180910390fd5b610cf4610821565b5080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610d4791906123f0565b92505081905550610d5930338361140e565b3373ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd82604051610d9f9190611ecc565b60405180910390a250565b600080610db56111b1565b90506000610dc382866110ed565b905083811015610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90612496565b60405180910390fd5b610e1582868684036111b9565b60019250505092915050565b600080610e2c6111b1565b9050610e3981858561140e565b600191505092915050565b6000610e4e610a85565b6a115eec47f6cf7e35000000610e6491906123f0565b905090565b7382c11ac3ad3575b0b6bee9522329b875efef6de581565b73d125443f38a69d776177c2b9c041f462936f821881565b60008111610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed390612528565b60405180910390fd5b73d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166379cc6790338361012c610f1b919061220e565b6040518363ffffffff1660e01b8152600401610f38929190612548565b600060405180830381600087803b158015610f5257600080fd5b505af1158015610f66573d6000803e3d6000fd5b50505050610f7433826118e9565b50565b600080600080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403610fd55760008060009250925092506110e6565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101544261102591906123f0565b905062278d008111156110395762278d0090505b670de0b6b3a7640000610e10601883600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611093610796565b61109d919061220e565b6110a7919061220e565b6110b1919061227f565b6110bb919061227f565b6110c5919061227f565b9350600a846110d4919061227f565b925082846110e291906123f0565b9150505b9193909250565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061117e61097b565b611186610a85565b61119091906123f0565b905090565b60006105386111a261097b565b6111ac919061227f565b905090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f906125e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90612675565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113759190611ecc565b60405180910390a3505050565b600061138e84846110ed565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461140857818110156113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f1906126e1565b60405180910390fd5b61140784848484036111b9565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490612773565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e390612805565b60405180910390fd5b6114f7838383611a48565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561157d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157490612897565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461161091906121da565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116749190611ecc565b60405180910390a3611687848484611a4d565b50505050565b61170e8363a9059cbb60e01b84846040516024016116ac929190612548565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611a52565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177990612929565b60405180910390fd5b61178e82600083611a48565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b906129bb565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461186b91906123f0565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118d09190611ecc565b60405180910390a36118e483600084611a4d565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90612a27565b60405180910390fd5b61196460008383611a48565b806002600082825461197691906121da565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119cb91906121da565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a309190611ecc565b60405180910390a3611a4460008383611a4d565b5050565b505050565b505050565b6000611ab4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b199092919063ffffffff16565b9050600081511115611b145780806020019051810190611ad49190612a73565b611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a90612b12565b60405180910390fd5b5b505050565b6060611b288484600085611b31565b90509392505050565b606082471015611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d90612ba4565b60405180910390fd5b611b7f85611c45565b611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb590612c10565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611be79190612c77565b60006040518083038185875af1925050503d8060008114611c24576040519150601f19603f3d011682016040523d82523d6000602084013e611c29565b606091505b5091509150611c39828286611c68565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315611c7857829050611cc8565b600083511115611c8b5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf9190611d5f565b60405180910390fd5b9392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d09578082015181840152602081019050611cee565b60008484015250505050565b6000601f19601f8301169050919050565b6000611d3182611ccf565b611d3b8185611cda565b9350611d4b818560208601611ceb565b611d5481611d15565b840191505092915050565b60006020820190508181036000830152611d798184611d26565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611db182611d86565b9050919050565b611dc181611da6565b8114611dcc57600080fd5b50565b600081359050611dde81611db8565b92915050565b6000819050919050565b611df781611de4565b8114611e0257600080fd5b50565b600081359050611e1481611dee565b92915050565b60008060408385031215611e3157611e30611d81565b5b6000611e3f85828601611dcf565b9250506020611e5085828601611e05565b9150509250929050565b60008115159050919050565b611e6f81611e5a565b82525050565b6000602082019050611e8a6000830184611e66565b92915050565b600060208284031215611ea657611ea5611d81565b5b6000611eb484828501611e05565b91505092915050565b611ec681611de4565b82525050565b6000602082019050611ee16000830184611ebd565b92915050565b600080600060608486031215611f0057611eff611d81565b5b6000611f0e86828701611dcf565b9350506020611f1f86828701611dcf565b9250506040611f3086828701611e05565b9150509250925092565b600060ff82169050919050565b611f5081611f3a565b82525050565b6000602082019050611f6b6000830184611f47565b92915050565b600060208284031215611f8757611f86611d81565b5b6000611f9584828501611dcf565b91505092915050565b6000606082019050611fb36000830186611ebd565b611fc06020830185611ebd565b611fcd6040830184611ebd565b949350505050565b611fde81611da6565b82525050565b6000602082019050611ff96000830184611fd5565b92915050565b6000819050919050565b600061202461201f61201a84611d86565b611fff565b611d86565b9050919050565b600061203682612009565b9050919050565b60006120488261202b565b9050919050565b6120588161203d565b82525050565b6000602082019050612073600083018461204f565b92915050565b600080604083850312156120905761208f611d81565b5b600061209e85828601611dcf565b92505060206120af85828601611dcf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061210057607f821691505b602082108103612113576121126120b9565b5b50919050565b7f416d6f756e7420746f207374616b652073686f756c642062652067726561746560008201527f72207468616e20302e0000000000000000000000000000000000000000000000602082015250565b6000612175602983611cda565b915061218082612119565b604082019050919050565b600060208201905081810360008301526121a481612168565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121e582611de4565b91506121f083611de4565b9250828201905080821115612208576122076121ab565b5b92915050565b600061221982611de4565b915061222483611de4565b925082820261223281611de4565b91508282048414831517612249576122486121ab565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061228a82611de4565b915061229583611de4565b9250826122a5576122a4612250565b5b828204905092915050565b6000815190506122bf81611dee565b92915050565b6000602082840312156122db576122da611d81565b5b60006122e9848285016122b0565b91505092915050565b7f416d6f756e7420746f20756e7374616b652073686f756c64206265206772656160008201527f746572207468616e20302e000000000000000000000000000000000000000000602082015250565b600061234e602b83611cda565b9150612359826122f2565b604082019050919050565b6000602082019050818103600083015261237d81612341565b9050919050565b7f4e6f7420656e6f756768207374616b65642045502e0000000000000000000000600082015250565b60006123ba601583611cda565b91506123c582612384565b602082019050919050565b600060208201905081810360008301526123e9816123ad565b9050919050565b60006123fb82611de4565b915061240683611de4565b925082820390508181111561241e5761241d6121ab565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612480602583611cda565b915061248b82612424565b604082019050919050565b600060208201905081810360008301526124af81612473565b9050919050565b7f416d6f756e7420746f206d696e742073686f756c64206265206772656174657260008201527f207468616e20302e000000000000000000000000000000000000000000000000602082015250565b6000612512602883611cda565b915061251d826124b6565b604082019050919050565b6000602082019050818103600083015261254181612505565b9050919050565b600060408201905061255d6000830185611fd5565b61256a6020830184611ebd565b9392505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006125cd602483611cda565b91506125d882612571565b604082019050919050565b600060208201905081810360008301526125fc816125c0565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061265f602283611cda565b915061266a82612603565b604082019050919050565b6000602082019050818103600083015261268e81612652565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006126cb601d83611cda565b91506126d682612695565b602082019050919050565b600060208201905081810360008301526126fa816126be565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061275d602583611cda565b915061276882612701565b604082019050919050565b6000602082019050818103600083015261278c81612750565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006127ef602383611cda565b91506127fa82612793565b604082019050919050565b6000602082019050818103600083015261281e816127e2565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612881602683611cda565b915061288c82612825565b604082019050919050565b600060208201905081810360008301526128b081612874565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612913602183611cda565b915061291e826128b7565b604082019050919050565b6000602082019050818103600083015261294281612906565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006129a5602283611cda565b91506129b082612949565b604082019050919050565b600060208201905081810360008301526129d481612998565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612a11601f83611cda565b9150612a1c826129db565b602082019050919050565b60006020820190508181036000830152612a4081612a04565b9050919050565b612a5081611e5a565b8114612a5b57600080fd5b50565b600081519050612a6d81612a47565b92915050565b600060208284031215612a8957612a88611d81565b5b6000612a9784828501612a5e565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612afc602a83611cda565b9150612b0782612aa0565b604082019050919050565b60006020820190508181036000830152612b2b81612aef565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612b8e602683611cda565b9150612b9982612b32565b604082019050919050565b60006020820190508181036000830152612bbd81612b81565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612bfa601d83611cda565b9150612c0582612bc4565b602082019050919050565b60006020820190508181036000830152612c2981612bed565b9050919050565b600081519050919050565b600081905092915050565b6000612c5182612c30565b612c5b8185612c3b565b9350612c6b818560208601611ceb565b80840191505092915050565b6000612c838284612c46565b91508190509291505056fea264697066735822122005c91d46f4f6cb2a8199f1493b1bbdc3bafe3184631760cdc48fbccbd8237d7464736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636e84e3fa11610104578063b0038409116100a2578063dc01f60d11610071578063dc01f60d14610538578063dd62ed3e1461056a578063e80265c61461059a578063f90c8fd1146105b8576101cf565b8063b0038409146104c2578063b788f3a1146104e0578063beba222b146104fe578063c36d308a1461051c576101cf565b806395d89b41116100de57806395d89b41146104285780639af5d0ab14610446578063a457c2d714610462578063a9059cbb14610492576101cf565b80636e84e3fa146103be57806370a08231146103dc57806379cc67901461040c576101cf565b8063313ce56711610171578063395093511161014b578063395093511461032257806342966c681461035257806343b0215f1461036e5780635cef09e8146103a0576101cf565b8063313ce567146102c8578063372500ab146102e6578063386db0cd14610304576101cf565b806318160ddd116101ad57806318160ddd1461023e578063216af13e1461025c57806323b872dd1461027a578063309d73a5146102aa576101cf565b806306fdde03146101d4578063095ea7b3146101f25780630dd0b38c14610222575b600080fd5b6101dc6105d6565b6040516101e99190611d5f565b60405180910390f35b61020c60048036038101906102079190611e1a565b610668565b6040516102199190611e75565b60405180910390f35b61023c60048036038101906102379190611e90565b61068b565b005b61024661078c565b6040516102539190611ecc565b60405180910390f35b610264610796565b6040516102719190611ecc565b60405180910390f35b610294600480360381019061028f9190611ee7565b6107e3565b6040516102a19190611e75565b60405180910390f35b6102b2610812565b6040516102bf9190611ecc565b60405180910390f35b6102d0610818565b6040516102dd9190611f56565b60405180910390f35b6102ee610821565b6040516102fb9190611ecc565b60405180910390f35b61030c61097b565b6040516103199190611ecc565b60405180910390f35b61033c60048036038101906103379190611e1a565b610a10565b6040516103499190611e75565b60405180910390f35b61036c60048036038101906103679190611e90565b610a47565b005b61038860048036038101906103839190611f71565b610a5b565b60405161039793929190611f9e565b60405180910390f35b6103a8610a85565b6040516103b59190611ecc565b60405180910390f35b6103c6610b0f565b6040516103d39190611ecc565b60405180910390f35b6103f660048036038101906103f19190611f71565b610b2a565b6040516104039190611ecc565b60405180910390f35b61042660048036038101906104219190611e1a565b610b72565b005b610430610b92565b60405161043d9190611d5f565b60405180910390f35b610460600480360381019061045b9190611e90565b610c24565b005b61047c60048036038101906104779190611e1a565b610daa565b6040516104899190611e75565b60405180910390f35b6104ac60048036038101906104a79190611e1a565b610e21565b6040516104b99190611e75565b60405180910390f35b6104ca610e44565b6040516104d79190611ecc565b60405180910390f35b6104e8610e69565b6040516104f59190611fe4565b60405180910390f35b610506610e81565b604051610513919061205e565b60405180910390f35b61053660048036038101906105319190611e90565b610e99565b005b610552600480360381019061054d9190611f71565b610f77565b60405161056193929190611f9e565b60405180910390f35b610584600480360381019061057f9190612079565b6110ed565b6040516105919190611ecc565b60405180910390f35b6105a2611174565b6040516105af9190611ecc565b60405180910390f35b6105c0611195565b6040516105cd9190611ecc565b60405180910390f35b6060600380546105e5906120e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610611906120e8565b801561065e5780601f106106335761010080835404028352916020019161065e565b820191906000526020600020905b81548152906001019060200180831161064157829003601f168201915b5050505050905090565b6000806106736111b1565b90506106808185856111b9565b600191505092915050565b600081116106ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c59061218b565b60405180910390fd5b6106d6610821565b506106e13082610e21565b5080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461073491906121da565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a826040516107819190611ecc565b60405180910390a250565b6000600254905090565b6000806107a230610b2a565b9050600081036107b65760009150506107e0565b806107bf611195565b670de0b6b3a76400006107d2919061220e565b6107dc919061227f565b9150505b90565b6000806107ee6111b1565b90506107fb858285611382565b61080685858561140e565b60019150509392505050565b61053881565b60006012905090565b60008060008061083033610f77565b92509250925042600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555060008311156109725780600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008282546108d891906121da565b925050819055506109327382c11ac3ad3575b0b6bee9522329b875efef6de58373d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff1661168d9092919063ffffffff16565b610971338273d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff1661168d9092919063ffffffff16565b5b80935050505090565b600073d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109ca9190611fe4565b602060405180830381865afa1580156109e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0b91906122c5565b905090565b600080610a1b6111b1565b9050610a3c818585610a2d85896110ed565b610a3791906121da565b6111b9565b600191505092915050565b610a58610a526111b1565b82611713565b50565b60056020528060005260406000206000915090508060000154908060010154908060020154905083565b600073d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a91906122c5565b905090565b6000600a610b1b61097b565b610b25919061227f565b905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b8482610b7e6111b1565b83611382565b610b8e8282611713565b5050565b606060048054610ba1906120e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610bcd906120e8565b8015610c1a5780601f10610bef57610100808354040283529160200191610c1a565b820191906000526020600020905b815481529060010190602001808311610bfd57829003601f168201915b5050505050905090565b60008111610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90612364565b60405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce3906123d0565b60405180910390fd5b610cf4610821565b5080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610d4791906123f0565b92505081905550610d5930338361140e565b3373ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd82604051610d9f9190611ecc565b60405180910390a250565b600080610db56111b1565b90506000610dc382866110ed565b905083811015610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90612496565b60405180910390fd5b610e1582868684036111b9565b60019250505092915050565b600080610e2c6111b1565b9050610e3981858561140e565b600191505092915050565b6000610e4e610a85565b6a115eec47f6cf7e35000000610e6491906123f0565b905090565b7382c11ac3ad3575b0b6bee9522329b875efef6de581565b73d125443f38a69d776177c2b9c041f462936f821881565b60008111610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed390612528565b60405180910390fd5b73d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166379cc6790338361012c610f1b919061220e565b6040518363ffffffff1660e01b8152600401610f38929190612548565b600060405180830381600087803b158015610f5257600080fd5b505af1158015610f66573d6000803e3d6000fd5b50505050610f7433826118e9565b50565b600080600080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403610fd55760008060009250925092506110e6565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101544261102591906123f0565b905062278d008111156110395762278d0090505b670de0b6b3a7640000610e10601883600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611093610796565b61109d919061220e565b6110a7919061220e565b6110b1919061227f565b6110bb919061227f565b6110c5919061227f565b9350600a846110d4919061227f565b925082846110e291906123f0565b9150505b9193909250565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061117e61097b565b611186610a85565b61119091906123f0565b905090565b60006105386111a261097b565b6111ac919061227f565b905090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f906125e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90612675565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113759190611ecc565b60405180910390a3505050565b600061138e84846110ed565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461140857818110156113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f1906126e1565b60405180910390fd5b61140784848484036111b9565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490612773565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e390612805565b60405180910390fd5b6114f7838383611a48565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561157d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157490612897565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461161091906121da565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116749190611ecc565b60405180910390a3611687848484611a4d565b50505050565b61170e8363a9059cbb60e01b84846040516024016116ac929190612548565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611a52565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177990612929565b60405180910390fd5b61178e82600083611a48565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b906129bb565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461186b91906123f0565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118d09190611ecc565b60405180910390a36118e483600084611a4d565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90612a27565b60405180910390fd5b61196460008383611a48565b806002600082825461197691906121da565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119cb91906121da565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a309190611ecc565b60405180910390a3611a4460008383611a4d565b5050565b505050565b505050565b6000611ab4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b199092919063ffffffff16565b9050600081511115611b145780806020019051810190611ad49190612a73565b611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a90612b12565b60405180910390fd5b5b505050565b6060611b288484600085611b31565b90509392505050565b606082471015611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d90612ba4565b60405180910390fd5b611b7f85611c45565b611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb590612c10565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611be79190612c77565b60006040518083038185875af1925050503d8060008114611c24576040519150601f19603f3d011682016040523d82523d6000602084013e611c29565b606091505b5091509150611c39828286611c68565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315611c7857829050611cc8565b600083511115611c8b5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf9190611d5f565b60405180910390fd5b9392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d09578082015181840152602081019050611cee565b60008484015250505050565b6000601f19601f8301169050919050565b6000611d3182611ccf565b611d3b8185611cda565b9350611d4b818560208601611ceb565b611d5481611d15565b840191505092915050565b60006020820190508181036000830152611d798184611d26565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611db182611d86565b9050919050565b611dc181611da6565b8114611dcc57600080fd5b50565b600081359050611dde81611db8565b92915050565b6000819050919050565b611df781611de4565b8114611e0257600080fd5b50565b600081359050611e1481611dee565b92915050565b60008060408385031215611e3157611e30611d81565b5b6000611e3f85828601611dcf565b9250506020611e5085828601611e05565b9150509250929050565b60008115159050919050565b611e6f81611e5a565b82525050565b6000602082019050611e8a6000830184611e66565b92915050565b600060208284031215611ea657611ea5611d81565b5b6000611eb484828501611e05565b91505092915050565b611ec681611de4565b82525050565b6000602082019050611ee16000830184611ebd565b92915050565b600080600060608486031215611f0057611eff611d81565b5b6000611f0e86828701611dcf565b9350506020611f1f86828701611dcf565b9250506040611f3086828701611e05565b9150509250925092565b600060ff82169050919050565b611f5081611f3a565b82525050565b6000602082019050611f6b6000830184611f47565b92915050565b600060208284031215611f8757611f86611d81565b5b6000611f9584828501611dcf565b91505092915050565b6000606082019050611fb36000830186611ebd565b611fc06020830185611ebd565b611fcd6040830184611ebd565b949350505050565b611fde81611da6565b82525050565b6000602082019050611ff96000830184611fd5565b92915050565b6000819050919050565b600061202461201f61201a84611d86565b611fff565b611d86565b9050919050565b600061203682612009565b9050919050565b60006120488261202b565b9050919050565b6120588161203d565b82525050565b6000602082019050612073600083018461204f565b92915050565b600080604083850312156120905761208f611d81565b5b600061209e85828601611dcf565b92505060206120af85828601611dcf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061210057607f821691505b602082108103612113576121126120b9565b5b50919050565b7f416d6f756e7420746f207374616b652073686f756c642062652067726561746560008201527f72207468616e20302e0000000000000000000000000000000000000000000000602082015250565b6000612175602983611cda565b915061218082612119565b604082019050919050565b600060208201905081810360008301526121a481612168565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121e582611de4565b91506121f083611de4565b9250828201905080821115612208576122076121ab565b5b92915050565b600061221982611de4565b915061222483611de4565b925082820261223281611de4565b91508282048414831517612249576122486121ab565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061228a82611de4565b915061229583611de4565b9250826122a5576122a4612250565b5b828204905092915050565b6000815190506122bf81611dee565b92915050565b6000602082840312156122db576122da611d81565b5b60006122e9848285016122b0565b91505092915050565b7f416d6f756e7420746f20756e7374616b652073686f756c64206265206772656160008201527f746572207468616e20302e000000000000000000000000000000000000000000602082015250565b600061234e602b83611cda565b9150612359826122f2565b604082019050919050565b6000602082019050818103600083015261237d81612341565b9050919050565b7f4e6f7420656e6f756768207374616b65642045502e0000000000000000000000600082015250565b60006123ba601583611cda565b91506123c582612384565b602082019050919050565b600060208201905081810360008301526123e9816123ad565b9050919050565b60006123fb82611de4565b915061240683611de4565b925082820390508181111561241e5761241d6121ab565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612480602583611cda565b915061248b82612424565b604082019050919050565b600060208201905081810360008301526124af81612473565b9050919050565b7f416d6f756e7420746f206d696e742073686f756c64206265206772656174657260008201527f207468616e20302e000000000000000000000000000000000000000000000000602082015250565b6000612512602883611cda565b915061251d826124b6565b604082019050919050565b6000602082019050818103600083015261254181612505565b9050919050565b600060408201905061255d6000830185611fd5565b61256a6020830184611ebd565b9392505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006125cd602483611cda565b91506125d882612571565b604082019050919050565b600060208201905081810360008301526125fc816125c0565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061265f602283611cda565b915061266a82612603565b604082019050919050565b6000602082019050818103600083015261268e81612652565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006126cb601d83611cda565b91506126d682612695565b602082019050919050565b600060208201905081810360008301526126fa816126be565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061275d602583611cda565b915061276882612701565b604082019050919050565b6000602082019050818103600083015261278c81612750565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006127ef602383611cda565b91506127fa82612793565b604082019050919050565b6000602082019050818103600083015261281e816127e2565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612881602683611cda565b915061288c82612825565b604082019050919050565b600060208201905081810360008301526128b081612874565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612913602183611cda565b915061291e826128b7565b604082019050919050565b6000602082019050818103600083015261294281612906565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006129a5602283611cda565b91506129b082612949565b604082019050919050565b600060208201905081810360008301526129d481612998565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612a11601f83611cda565b9150612a1c826129db565b602082019050919050565b60006020820190508181036000830152612a4081612a04565b9050919050565b612a5081611e5a565b8114612a5b57600080fd5b50565b600081519050612a6d81612a47565b92915050565b600060208284031215612a8957612a88611d81565b5b6000612a9784828501612a5e565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612afc602a83611cda565b9150612b0782612aa0565b604082019050919050565b60006020820190508181036000830152612b2b81612aef565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612b8e602683611cda565b9150612b9982612b32565b604082019050919050565b60006020820190508181036000830152612bbd81612b81565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612bfa601d83611cda565b9150612c0582612bc4565b602082019050919050565b60006020820190508181036000830152612c2981612bed565b9050919050565b600081519050919050565b600081905092915050565b6000612c5182612c30565b612c5b8185612c3b565b9350612c6b818560208601611ceb565b80840191505092915050565b6000612c838284612c46565b91508190509291505056fea264697066735822122005c91d46f4f6cb2a8199f1493b1bbdc3bafe3184631760cdc48fbccbd8237d7464736f6c63430008110033

Deployed Bytecode Sourcemap

34202:3850:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22075:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24426:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37123:294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23195:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35690:258;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25207:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34471:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23037:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36639:476;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34965:111;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25911:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33444:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34654:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;35084:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35441:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23366:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33854:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22294:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37425:400;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26652:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23699:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35189:114;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34382:82;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34294:75;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37833:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35977:654;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;23955:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35311:122;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35552:130;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22075:100;22129:13;22162:5;22155:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22075:100;:::o;24426:201::-;24509:4;24526:13;24542:12;:10;:12::i;:::-;24526:28;;24565:32;24574:5;24581:7;24590:6;24565:8;:32::i;:::-;24615:4;24608:11;;;24426:201;;;;:::o;37123:294::-;37197:1;37186:8;:12;37178:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37255:14;:12;:14::i;:::-;;37280:33;37297:4;37304:8;37280;:33::i;:::-;;37358:8;37324:9;:21;37334:10;37324:21;;;;;;;;;;;;;;;:30;;;:42;;;;;;;:::i;:::-;;;;;;;;37388:10;37382:27;;;37400:8;37382:27;;;;;;:::i;:::-;;;;;;;;37123:294;:::o;23195:108::-;23256:7;23283:12;;23276:19;;23195:108;:::o;35690:258::-;35744:7;35764:21;35788:24;35806:4;35788:9;:24::i;:::-;35764:48;;35844:1;35827:13;:18;35823:59;;35869:1;35862:8;;;;;35823:59;35927:13;35906:18;:16;:18::i;:::-;35899:4;:25;;;;:::i;:::-;:41;;;;:::i;:::-;35892:48;;;35690:258;;:::o;25207:295::-;25338:4;25355:15;25373:12;:10;:12::i;:::-;25355:30;;25396:38;25412:4;25418:7;25427:6;25396:15;:38::i;:::-;25445:27;25455:4;25461:2;25465:6;25445:9;:27::i;:::-;25490:4;25483:11;;;25207:295;;;;;:::o;34471:57::-;34524:4;34471:57;:::o;23037:93::-;23095:5;23120:2;23113:9;;23037:93;:::o;36639:476::-;36679:7;36700:20;36722:19;36743;36766:28;36783:10;36766:16;:28::i;:::-;36699:95;;;;;;36839:15;36805:9;:21;36815:10;36805:21;;;;;;;;;;;;;;;:31;;:49;;;;36884:1;36869:12;:16;36865:214;;;36941:11;36902:9;:21;36912:10;36902:21;;;;;;;;;;;;;;;:35;;;:50;;;;;;;:::i;:::-;;;;;;;;36967:44;34422:42;36999:11;34326:42;36967:16;;;;:44;;;;;:::i;:::-;37026:41;37043:10;37055:11;34326:42;37026:16;;;;:41;;;;;:::i;:::-;36865:214;37096:11;37089:18;;;;;36639:476;:::o;34965:111::-;35013:7;34326:42;35040:13;;;35062:4;35040:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35033:35;;34965:111;:::o;25911:238::-;25999:4;26016:13;26032:12;:10;:12::i;:::-;26016:28;;26055:64;26064:5;26071:7;26108:10;26080:25;26090:5;26097:7;26080:9;:25::i;:::-;:38;;;;:::i;:::-;26055:8;:64::i;:::-;26137:4;26130:11;;;25911:238;;;;:::o;33444:91::-;33500:27;33506:12;:10;:12::i;:::-;33520:6;33500:5;:27::i;:::-;33444:91;:::o;34654:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35084:97::-;35129:7;34326:42;35156:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35149:24;;35084:97;:::o;35441:103::-;35487:7;35534:2;35514:17;:15;:17::i;:::-;:22;;;;:::i;:::-;35507:29;;35441:103;:::o;23366:127::-;23440:7;23467:9;:18;23477:7;23467:18;;;;;;;;;;;;;;;;23460:25;;23366:127;;;:::o;33854:164::-;33931:46;33947:7;33956:12;:10;:12::i;:::-;33970:6;33931:15;:46::i;:::-;33988:22;33994:7;34003:6;33988:5;:22::i;:::-;33854:164;;:::o;22294:104::-;22350:13;22383:7;22376:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22294:104;:::o;37425:400::-;37501:1;37490:8;:12;37482:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37603:8;37569:9;:21;37579:10;37569:21;;;;;;;;;;;;;;;:30;;;:42;;37561:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37648:14;:12;:14::i;:::-;;37707:8;37673:9;:21;37683:10;37673:21;;;;;;;;;;;;;;;:30;;;:42;;;;;;;:::i;:::-;;;;;;;;37726:46;37744:4;37751:10;37763:8;37726:9;:46::i;:::-;37796:10;37788:29;;;37808:8;37788:29;;;;;;:::i;:::-;;;;;;;;37425:400;:::o;26652:436::-;26745:4;26762:13;26778:12;:10;:12::i;:::-;26762:28;;26801:24;26828:25;26838:5;26845:7;26828:9;:25::i;:::-;26801:52;;26892:15;26872:16;:35;;26864:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;26985:60;26994:5;27001:7;27029:15;27010:16;:34;26985:8;:60::i;:::-;27076:4;27069:11;;;;26652:436;;;;:::o;23699:193::-;23778:4;23795:13;23811:12;:10;:12::i;:::-;23795:28;;23834;23844:5;23851:2;23855:6;23834:9;:28::i;:::-;23880:4;23873:11;;;23699:193;;;;:::o;35189:114::-;35236:7;35281:14;:12;:14::i;:::-;35263:15;:32;;;;:::i;:::-;35256:39;;35189:114;:::o;34382:82::-;34422:42;34382:82;:::o;34294:75::-;34326:42;34294:75;:::o;37833:216::-;37906:1;37895:8;:12;37887:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34326:42;37963:12;;;37976:10;37994:8;37988:3;:14;;;;:::i;:::-;37963:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38014:27;38020:10;38032:8;38014:5;:27::i;:::-;37833:216;:::o;35977:654::-;36041:20;36063:19;36084;36151:1;36120:9;:18;36130:7;36120:18;;;;;;;;;;;;;;;:27;;;:32;36116:78;;36174:1;36177;36180;36166:16;;;;;;;;36116:78;36204:19;36244:9;:18;36254:7;36244:18;;;;;;;;;;;;;;;:28;;;36226:15;:46;;;;:::i;:::-;36204:68;;36301:14;36287:11;:28;36283:136;;;36346:14;36332:28;;36283:136;36526:4;36519;36514:2;36500:11;36470:9;:18;36480:7;36470:18;;;;;;;;;;;;;;;:27;;;36444:23;:21;:23::i;:::-;:53;;;;:::i;:::-;:67;;;;:::i;:::-;:72;;;;:::i;:::-;:79;;;;:::i;:::-;:86;;;;:::i;:::-;36429:101;;36570:2;36555:12;:17;;;;:::i;:::-;36541:31;;36612:11;36597:12;:26;;;;:::i;:::-;36583:40;;36105:526;35977:654;;;;;;:::o;23955:151::-;24044:7;24071:11;:18;24083:5;24071:18;;;;;;;;;;;;;;;:27;24090:7;24071:27;;;;;;;;;;;;;;;;24064:34;;23955:151;;;;:::o;35311:122::-;35364:7;35408:17;:15;:17::i;:::-;35391:14;:12;:14::i;:::-;:34;;;;:::i;:::-;35384:41;;35311:122;:::o;35552:130::-;35601:7;34524:4;35628:17;:15;:17::i;:::-;:46;;;;:::i;:::-;35621:53;;35552:130;:::o;11597:98::-;11650:7;11677:10;11670:17;;11597:98;:::o;30277:380::-;30430:1;30413:19;;:5;:19;;;30405:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30511:1;30492:21;;:7;:21;;;30484:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30595:6;30565:11;:18;30577:5;30565:18;;;;;;;;;;;;;;;:27;30584:7;30565:27;;;;;;;;;;;;;;;:36;;;;30633:7;30617:32;;30626:5;30617:32;;;30642:6;30617:32;;;;;;:::i;:::-;;;;;;;;30277:380;;;:::o;30948:453::-;31083:24;31110:25;31120:5;31127:7;31110:9;:25::i;:::-;31083:52;;31170:17;31150:16;:37;31146:248;;31232:6;31212:16;:26;;31204:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31316:51;31325:5;31332:7;31360:6;31341:16;:25;31316:8;:51::i;:::-;31146:248;31072:329;30948:453;;;:::o;27558:671::-;27705:1;27689:18;;:4;:18;;;27681:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27782:1;27768:16;;:2;:16;;;27760:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;27837:38;27858:4;27864:2;27868:6;27837:20;:38::i;:::-;27888:19;27910:9;:15;27920:4;27910:15;;;;;;;;;;;;;;;;27888:37;;27959:6;27944:11;:21;;27936:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;28076:6;28062:11;:20;28044:9;:15;28054:4;28044:15;;;;;;;;;;;;;;;:38;;;;28121:6;28104:9;:13;28114:2;28104:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;28160:2;28145:26;;28154:4;28145:26;;;28164:6;28145:26;;;;;;:::i;:::-;;;;;;;;28184:37;28204:4;28210:2;28214:6;28184:19;:37::i;:::-;27670:559;27558:671;;;:::o;15404:211::-;15521:86;15541:5;15571:23;;;15596:2;15600:5;15548:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15521:19;:86::i;:::-;15404:211;;;:::o;29248:591::-;29351:1;29332:21;;:7;:21;;;29324:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29404:49;29425:7;29442:1;29446:6;29404:20;:49::i;:::-;29466:22;29491:9;:18;29501:7;29491:18;;;;;;;;;;;;;;;;29466:43;;29546:6;29528:14;:24;;29520:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29665:6;29648:14;:23;29627:9;:18;29637:7;29627:18;;;;;;;;;;;;;;;:44;;;;29709:6;29693:12;;:22;;;;;;;:::i;:::-;;;;;;;;29759:1;29733:37;;29742:7;29733:37;;;29763:6;29733:37;;;;;;:::i;:::-;;;;;;;;29783:48;29803:7;29820:1;29824:6;29783:19;:48::i;:::-;29313:526;29248:591;;:::o;28516:399::-;28619:1;28600:21;;:7;:21;;;28592:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;28670:49;28699:1;28703:7;28712:6;28670:20;:49::i;:::-;28748:6;28732:12;;:22;;;;;;;:::i;:::-;;;;;;;;28787:6;28765:9;:18;28775:7;28765:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;28830:7;28809:37;;28826:1;28809:37;;;28839:6;28809:37;;;;;;:::i;:::-;;;;;;;;28859:48;28887:1;28891:7;28900:6;28859:19;:48::i;:::-;28516:399;;:::o;32001:125::-;;;;:::o;32730:124::-;;;;:::o;18471:716::-;18895:23;18921:69;18949:4;18921:69;;;;;;;;;;;;;;;;;18929:5;18921:27;;;;:69;;;;;:::i;:::-;18895:95;;19025:1;19005:10;:17;:21;19001:179;;;19102:10;19091:30;;;;;;;;;;;;:::i;:::-;19083:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;19001:179;18541:646;18471:716;;:::o;3978:229::-;4115:12;4147:52;4169:6;4177:4;4183:1;4186:12;4147:21;:52::i;:::-;4140:59;;3978:229;;;;;:::o;5098:510::-;5268:12;5326:5;5301:21;:30;;5293:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5393:18;5404:6;5393:10;:18::i;:::-;5385:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5459:12;5473:23;5500:6;:11;;5519:5;5526:4;5500:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5458:73;;;;5549:51;5566:7;5575:10;5587:12;5549:16;:51::i;:::-;5542:58;;;;5098:510;;;;;;:::o;1233:326::-;1293:4;1550:1;1528:7;:19;;;:23;1521:30;;1233:326;;;:::o;7784:762::-;7934:12;7963:7;7959:580;;;7994:10;7987:17;;;;7959:580;8128:1;8108:10;:17;:21;8104:424;;;8356:10;8350:17;8417:15;8404:10;8400:2;8396:19;8389:44;8104:424;8499:12;8492:20;;;;;;;;;;;:::i;:::-;;;;;;;;7784:762;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:329::-;3505:6;3554:2;3542:9;3533:7;3529:23;3525:32;3522:119;;;3560:79;;:::i;:::-;3522:119;3680:1;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3651:117;3446:329;;;;:::o;3781:118::-;3868:24;3886:5;3868:24;:::i;:::-;3863:3;3856:37;3781:118;;:::o;3905:222::-;3998:4;4036:2;4025:9;4021:18;4013:26;;4049:71;4117:1;4106:9;4102:17;4093:6;4049:71;:::i;:::-;3905:222;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:86::-;4793:7;4833:4;4826:5;4822:16;4811:27;;4758:86;;;:::o;4850:112::-;4933:22;4949:5;4933:22;:::i;:::-;4928:3;4921:35;4850:112;;:::o;4968:214::-;5057:4;5095:2;5084:9;5080:18;5072:26;;5108:67;5172:1;5161:9;5157:17;5148:6;5108:67;:::i;:::-;4968:214;;;;:::o;5188:329::-;5247:6;5296:2;5284:9;5275:7;5271:23;5267:32;5264:119;;;5302:79;;:::i;:::-;5264:119;5422:1;5447:53;5492:7;5483:6;5472:9;5468:22;5447:53;:::i;:::-;5437:63;;5393:117;5188:329;;;;:::o;5523:442::-;5672:4;5710:2;5699:9;5695:18;5687:26;;5723:71;5791:1;5780:9;5776:17;5767:6;5723:71;:::i;:::-;5804:72;5872:2;5861:9;5857:18;5848:6;5804:72;:::i;:::-;5886;5954:2;5943:9;5939:18;5930:6;5886:72;:::i;:::-;5523:442;;;;;;:::o;5971:118::-;6058:24;6076:5;6058:24;:::i;:::-;6053:3;6046:37;5971:118;;:::o;6095:222::-;6188:4;6226:2;6215:9;6211:18;6203:26;;6239:71;6307:1;6296:9;6292:17;6283:6;6239:71;:::i;:::-;6095:222;;;;:::o;6323:60::-;6351:3;6372:5;6365:12;;6323:60;;;:::o;6389:142::-;6439:9;6472:53;6490:34;6499:24;6517:5;6499:24;:::i;:::-;6490:34;:::i;:::-;6472:53;:::i;:::-;6459:66;;6389:142;;;:::o;6537:126::-;6587:9;6620:37;6651:5;6620:37;:::i;:::-;6607:50;;6537:126;;;:::o;6669:139::-;6732:9;6765:37;6796:5;6765:37;:::i;:::-;6752:50;;6669:139;;;:::o;6814:157::-;6914:50;6958:5;6914:50;:::i;:::-;6909:3;6902:63;6814:157;;:::o;6977:248::-;7083:4;7121:2;7110:9;7106:18;7098:26;;7134:84;7215:1;7204:9;7200:17;7191:6;7134:84;:::i;:::-;6977:248;;;;:::o;7231:474::-;7299:6;7307;7356:2;7344:9;7335:7;7331:23;7327:32;7324:119;;;7362:79;;:::i;:::-;7324:119;7482:1;7507:53;7552:7;7543:6;7532:9;7528:22;7507:53;:::i;:::-;7497:63;;7453:117;7609:2;7635:53;7680:7;7671:6;7660:9;7656:22;7635:53;:::i;:::-;7625:63;;7580:118;7231:474;;;;;:::o;7711:180::-;7759:77;7756:1;7749:88;7856:4;7853:1;7846:15;7880:4;7877:1;7870:15;7897:320;7941:6;7978:1;7972:4;7968:12;7958:22;;8025:1;8019:4;8015:12;8046:18;8036:81;;8102:4;8094:6;8090:17;8080:27;;8036:81;8164:2;8156:6;8153:14;8133:18;8130:38;8127:84;;8183:18;;:::i;:::-;8127:84;7948:269;7897:320;;;:::o;8223:228::-;8363:34;8359:1;8351:6;8347:14;8340:58;8432:11;8427:2;8419:6;8415:15;8408:36;8223:228;:::o;8457:366::-;8599:3;8620:67;8684:2;8679:3;8620:67;:::i;:::-;8613:74;;8696:93;8785:3;8696:93;:::i;:::-;8814:2;8809:3;8805:12;8798:19;;8457:366;;;:::o;8829:419::-;8995:4;9033:2;9022:9;9018:18;9010:26;;9082:9;9076:4;9072:20;9068:1;9057:9;9053:17;9046:47;9110:131;9236:4;9110:131;:::i;:::-;9102:139;;8829:419;;;:::o;9254:180::-;9302:77;9299:1;9292:88;9399:4;9396:1;9389:15;9423:4;9420:1;9413:15;9440:191;9480:3;9499:20;9517:1;9499:20;:::i;:::-;9494:25;;9533:20;9551:1;9533:20;:::i;:::-;9528:25;;9576:1;9573;9569:9;9562:16;;9597:3;9594:1;9591:10;9588:36;;;9604:18;;:::i;:::-;9588:36;9440:191;;;;:::o;9637:410::-;9677:7;9700:20;9718:1;9700:20;:::i;:::-;9695:25;;9734:20;9752:1;9734:20;:::i;:::-;9729:25;;9789:1;9786;9782:9;9811:30;9829:11;9811:30;:::i;:::-;9800:41;;9990:1;9981:7;9977:15;9974:1;9971:22;9951:1;9944:9;9924:83;9901:139;;10020:18;;:::i;:::-;9901:139;9685:362;9637:410;;;;:::o;10053:180::-;10101:77;10098:1;10091:88;10198:4;10195:1;10188:15;10222:4;10219:1;10212:15;10239:185;10279:1;10296:20;10314:1;10296:20;:::i;:::-;10291:25;;10330:20;10348:1;10330:20;:::i;:::-;10325:25;;10369:1;10359:35;;10374:18;;:::i;:::-;10359:35;10416:1;10413;10409:9;10404:14;;10239:185;;;;:::o;10430:143::-;10487:5;10518:6;10512:13;10503:22;;10534:33;10561:5;10534:33;:::i;:::-;10430:143;;;;:::o;10579:351::-;10649:6;10698:2;10686:9;10677:7;10673:23;10669:32;10666:119;;;10704:79;;:::i;:::-;10666:119;10824:1;10849:64;10905:7;10896:6;10885:9;10881:22;10849:64;:::i;:::-;10839:74;;10795:128;10579:351;;;;:::o;10936:230::-;11076:34;11072:1;11064:6;11060:14;11053:58;11145:13;11140:2;11132:6;11128:15;11121:38;10936:230;:::o;11172:366::-;11314:3;11335:67;11399:2;11394:3;11335:67;:::i;:::-;11328:74;;11411:93;11500:3;11411:93;:::i;:::-;11529:2;11524:3;11520:12;11513:19;;11172:366;;;:::o;11544:419::-;11710:4;11748:2;11737:9;11733:18;11725:26;;11797:9;11791:4;11787:20;11783:1;11772:9;11768:17;11761:47;11825:131;11951:4;11825:131;:::i;:::-;11817:139;;11544:419;;;:::o;11969:171::-;12109:23;12105:1;12097:6;12093:14;12086:47;11969:171;:::o;12146:366::-;12288:3;12309:67;12373:2;12368:3;12309:67;:::i;:::-;12302:74;;12385:93;12474:3;12385:93;:::i;:::-;12503:2;12498:3;12494:12;12487:19;;12146:366;;;:::o;12518:419::-;12684:4;12722:2;12711:9;12707:18;12699:26;;12771:9;12765:4;12761:20;12757:1;12746:9;12742:17;12735:47;12799:131;12925:4;12799:131;:::i;:::-;12791:139;;12518:419;;;:::o;12943:194::-;12983:4;13003:20;13021:1;13003:20;:::i;:::-;12998:25;;13037:20;13055:1;13037:20;:::i;:::-;13032:25;;13081:1;13078;13074:9;13066:17;;13105:1;13099:4;13096:11;13093:37;;;13110:18;;:::i;:::-;13093:37;12943:194;;;;:::o;13143:224::-;13283:34;13279:1;13271:6;13267:14;13260:58;13352:7;13347:2;13339:6;13335:15;13328:32;13143:224;:::o;13373:366::-;13515:3;13536:67;13600:2;13595:3;13536:67;:::i;:::-;13529:74;;13612:93;13701:3;13612:93;:::i;:::-;13730:2;13725:3;13721:12;13714:19;;13373:366;;;:::o;13745:419::-;13911:4;13949:2;13938:9;13934:18;13926:26;;13998:9;13992:4;13988:20;13984:1;13973:9;13969:17;13962:47;14026:131;14152:4;14026:131;:::i;:::-;14018:139;;13745:419;;;:::o;14170:227::-;14310:34;14306:1;14298:6;14294:14;14287:58;14379:10;14374:2;14366:6;14362:15;14355:35;14170:227;:::o;14403:366::-;14545:3;14566:67;14630:2;14625:3;14566:67;:::i;:::-;14559:74;;14642:93;14731:3;14642:93;:::i;:::-;14760:2;14755:3;14751:12;14744:19;;14403:366;;;:::o;14775:419::-;14941:4;14979:2;14968:9;14964:18;14956:26;;15028:9;15022:4;15018:20;15014:1;15003:9;14999:17;14992:47;15056:131;15182:4;15056:131;:::i;:::-;15048:139;;14775:419;;;:::o;15200:332::-;15321:4;15359:2;15348:9;15344:18;15336:26;;15372:71;15440:1;15429:9;15425:17;15416:6;15372:71;:::i;:::-;15453:72;15521:2;15510:9;15506:18;15497:6;15453:72;:::i;:::-;15200:332;;;;;:::o;15538:223::-;15678:34;15674:1;15666:6;15662:14;15655:58;15747:6;15742:2;15734:6;15730:15;15723:31;15538:223;:::o;15767:366::-;15909:3;15930:67;15994:2;15989:3;15930:67;:::i;:::-;15923:74;;16006:93;16095:3;16006:93;:::i;:::-;16124:2;16119:3;16115:12;16108:19;;15767:366;;;:::o;16139:419::-;16305:4;16343:2;16332:9;16328:18;16320:26;;16392:9;16386:4;16382:20;16378:1;16367:9;16363:17;16356:47;16420:131;16546:4;16420:131;:::i;:::-;16412:139;;16139:419;;;:::o;16564:221::-;16704:34;16700:1;16692:6;16688:14;16681:58;16773:4;16768:2;16760:6;16756:15;16749:29;16564:221;:::o;16791:366::-;16933:3;16954:67;17018:2;17013:3;16954:67;:::i;:::-;16947:74;;17030:93;17119:3;17030:93;:::i;:::-;17148:2;17143:3;17139:12;17132:19;;16791:366;;;:::o;17163:419::-;17329:4;17367:2;17356:9;17352:18;17344:26;;17416:9;17410:4;17406:20;17402:1;17391:9;17387:17;17380:47;17444:131;17570:4;17444:131;:::i;:::-;17436:139;;17163:419;;;:::o;17588:179::-;17728:31;17724:1;17716:6;17712:14;17705:55;17588:179;:::o;17773:366::-;17915:3;17936:67;18000:2;17995:3;17936:67;:::i;:::-;17929:74;;18012:93;18101:3;18012:93;:::i;:::-;18130:2;18125:3;18121:12;18114:19;;17773:366;;;:::o;18145:419::-;18311:4;18349:2;18338:9;18334:18;18326:26;;18398:9;18392:4;18388:20;18384:1;18373:9;18369:17;18362:47;18426:131;18552:4;18426:131;:::i;:::-;18418:139;;18145:419;;;:::o;18570:224::-;18710:34;18706:1;18698:6;18694:14;18687:58;18779:7;18774:2;18766:6;18762:15;18755:32;18570:224;:::o;18800:366::-;18942:3;18963:67;19027:2;19022:3;18963:67;:::i;:::-;18956:74;;19039:93;19128:3;19039:93;:::i;:::-;19157:2;19152:3;19148:12;19141:19;;18800:366;;;:::o;19172:419::-;19338:4;19376:2;19365:9;19361:18;19353:26;;19425:9;19419:4;19415:20;19411:1;19400:9;19396:17;19389:47;19453:131;19579:4;19453:131;:::i;:::-;19445:139;;19172:419;;;:::o;19597:222::-;19737:34;19733:1;19725:6;19721:14;19714:58;19806:5;19801:2;19793:6;19789:15;19782:30;19597:222;:::o;19825:366::-;19967:3;19988:67;20052:2;20047:3;19988:67;:::i;:::-;19981:74;;20064:93;20153:3;20064:93;:::i;:::-;20182:2;20177:3;20173:12;20166:19;;19825:366;;;:::o;20197:419::-;20363:4;20401:2;20390:9;20386:18;20378:26;;20450:9;20444:4;20440:20;20436:1;20425:9;20421:17;20414:47;20478:131;20604:4;20478:131;:::i;:::-;20470:139;;20197:419;;;:::o;20622:225::-;20762:34;20758:1;20750:6;20746:14;20739:58;20831:8;20826:2;20818:6;20814:15;20807:33;20622:225;:::o;20853:366::-;20995:3;21016:67;21080:2;21075:3;21016:67;:::i;:::-;21009:74;;21092:93;21181:3;21092:93;:::i;:::-;21210:2;21205:3;21201:12;21194:19;;20853:366;;;:::o;21225:419::-;21391:4;21429:2;21418:9;21414:18;21406:26;;21478:9;21472:4;21468:20;21464:1;21453:9;21449:17;21442:47;21506:131;21632:4;21506:131;:::i;:::-;21498:139;;21225:419;;;:::o;21650:220::-;21790:34;21786:1;21778:6;21774:14;21767:58;21859:3;21854:2;21846:6;21842:15;21835:28;21650:220;:::o;21876:366::-;22018:3;22039:67;22103:2;22098:3;22039:67;:::i;:::-;22032:74;;22115:93;22204:3;22115:93;:::i;:::-;22233:2;22228:3;22224:12;22217:19;;21876:366;;;:::o;22248:419::-;22414:4;22452:2;22441:9;22437:18;22429:26;;22501:9;22495:4;22491:20;22487:1;22476:9;22472:17;22465:47;22529:131;22655:4;22529:131;:::i;:::-;22521:139;;22248:419;;;:::o;22673:221::-;22813:34;22809:1;22801:6;22797:14;22790:58;22882:4;22877:2;22869:6;22865:15;22858:29;22673:221;:::o;22900:366::-;23042:3;23063:67;23127:2;23122:3;23063:67;:::i;:::-;23056:74;;23139:93;23228:3;23139:93;:::i;:::-;23257:2;23252:3;23248:12;23241:19;;22900:366;;;:::o;23272:419::-;23438:4;23476:2;23465:9;23461:18;23453:26;;23525:9;23519:4;23515:20;23511:1;23500:9;23496:17;23489:47;23553:131;23679:4;23553:131;:::i;:::-;23545:139;;23272:419;;;:::o;23697:181::-;23837:33;23833:1;23825:6;23821:14;23814:57;23697:181;:::o;23884:366::-;24026:3;24047:67;24111:2;24106:3;24047:67;:::i;:::-;24040:74;;24123:93;24212:3;24123:93;:::i;:::-;24241:2;24236:3;24232:12;24225:19;;23884:366;;;:::o;24256:419::-;24422:4;24460:2;24449:9;24445:18;24437:26;;24509:9;24503:4;24499:20;24495:1;24484:9;24480:17;24473:47;24537:131;24663:4;24537:131;:::i;:::-;24529:139;;24256:419;;;:::o;24681:116::-;24751:21;24766:5;24751:21;:::i;:::-;24744:5;24741:32;24731:60;;24787:1;24784;24777:12;24731:60;24681:116;:::o;24803:137::-;24857:5;24888:6;24882:13;24873:22;;24904:30;24928:5;24904:30;:::i;:::-;24803:137;;;;:::o;24946:345::-;25013:6;25062:2;25050:9;25041:7;25037:23;25033:32;25030:119;;;25068:79;;:::i;:::-;25030:119;25188:1;25213:61;25266:7;25257:6;25246:9;25242:22;25213:61;:::i;:::-;25203:71;;25159:125;24946:345;;;;:::o;25297:229::-;25437:34;25433:1;25425:6;25421:14;25414:58;25506:12;25501:2;25493:6;25489:15;25482:37;25297:229;:::o;25532:366::-;25674:3;25695:67;25759:2;25754:3;25695:67;:::i;:::-;25688:74;;25771:93;25860:3;25771:93;:::i;:::-;25889:2;25884:3;25880:12;25873:19;;25532:366;;;:::o;25904:419::-;26070:4;26108:2;26097:9;26093:18;26085:26;;26157:9;26151:4;26147:20;26143:1;26132:9;26128:17;26121:47;26185:131;26311:4;26185:131;:::i;:::-;26177:139;;25904:419;;;:::o;26329:225::-;26469:34;26465:1;26457:6;26453:14;26446:58;26538:8;26533:2;26525:6;26521:15;26514:33;26329:225;:::o;26560:366::-;26702:3;26723:67;26787:2;26782:3;26723:67;:::i;:::-;26716:74;;26799:93;26888:3;26799:93;:::i;:::-;26917:2;26912:3;26908:12;26901:19;;26560:366;;;:::o;26932:419::-;27098:4;27136:2;27125:9;27121:18;27113:26;;27185:9;27179:4;27175:20;27171:1;27160:9;27156:17;27149:47;27213:131;27339:4;27213:131;:::i;:::-;27205:139;;26932:419;;;:::o;27357:179::-;27497:31;27493:1;27485:6;27481:14;27474:55;27357:179;:::o;27542:366::-;27684:3;27705:67;27769:2;27764:3;27705:67;:::i;:::-;27698:74;;27781:93;27870:3;27781:93;:::i;:::-;27899:2;27894:3;27890:12;27883:19;;27542:366;;;:::o;27914:419::-;28080:4;28118:2;28107:9;28103:18;28095:26;;28167:9;28161:4;28157:20;28153:1;28142:9;28138:17;28131:47;28195:131;28321:4;28195:131;:::i;:::-;28187:139;;27914:419;;;:::o;28339:98::-;28390:6;28424:5;28418:12;28408:22;;28339:98;;;:::o;28443:147::-;28544:11;28581:3;28566:18;;28443:147;;;;:::o;28596:386::-;28700:3;28728:38;28760:5;28728:38;:::i;:::-;28782:88;28863:6;28858:3;28782:88;:::i;:::-;28775:95;;28879:65;28937:6;28932:3;28925:4;28918:5;28914:16;28879:65;:::i;:::-;28969:6;28964:3;28960:16;28953:23;;28704:278;28596:386;;;;:::o;28988:271::-;29118:3;29140:93;29229:3;29220:6;29140:93;:::i;:::-;29133:100;;29250:3;29243:10;;28988:271;;;;:::o

Swarm Source

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