ETH Price: $3,643.56 (+8.34%)

Token

STEALTH (STEALTH)
 

Overview

Max Total Supply

25,830,086.018518518518517904 STEALTH

Holders

307

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
72,075.348379629629629624 STEALTH

Value
$0.00
0x8696768c88aa6a5280fd949cd5e44bc950227dfd
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
NftNinjasStaking

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-24
*/

/**
 *Submitted for verification at Etherscan.io on 2022-03-22
*/

/**
 *Submitted for verification at Etherscan.io on 2022-01-22
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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/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/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

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

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `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 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/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: contracts/WastelandStaking.sol

//SPDX-License-Identifier: Unlicense

pragma solidity ^0.8.0;






contract NftNinjasStaking is ERC20, Ownable, Pausable, ReentrancyGuard {
    IERC721 public NftNinjas;

    uint256 constant public MAX_SUPPLY = type(uint256).max;
    uint256 constant public MAX_PER_TX = 25;
    uint256 constant public BASE_RATE = 100 ether;

    uint256 public totalStaked;
    uint256 public totalClaimed;
    mapping(address => uint256) public stash;
    mapping(address => uint256) public lastUpdate;
    mapping(uint256 => address) public tokenOwners;
    mapping(address => mapping(uint256 => uint256)) public ownedTokens;
    mapping(address => uint256) public stakedTokens;
    mapping(address => uint256) public specialStakedTokens;
    mapping (uint256 => bool) public specialTokens;
    mapping(uint256 => uint256) public tokenIndex;
    mapping(address => bool) public allowed;

    constructor(address nftNinjas)
        ERC20("STEALTH", "STEALTH")
    {
        NftNinjas = IERC721(nftNinjas);
        NftNinjas.setApprovalForAll(msg.sender, true);
    }

    modifier onlyAllowed() {
        require(allowed[msg.sender], "Caller not allowed");
        _;
    }

    modifier isApprovedForAll() {
        require(
            NftNinjas.isApprovedForAll(msg.sender, address(this)),
            "Contract not approved"
        );
        _;
    }

    function setSpecialTokens(uint256[] calldata tokenIds, bool state) public onlyOwner {
        require(tokenIds.length > 0, "No tokens selected");

        for(uint256 i = 0; i < tokenIds.length; i++) {
            specialTokens[tokenIds[i]] = state;
        }
    }

    /// @notice Get NFTNINJAS token ID by account and index
    /// @param account The address of the token owner
    /// @param index Index of the owned token
    /// @return The token ID of the owned token at that index
    function getOwnedByIndex(address account, uint256 index) public view returns (uint256) {
        require(index < stakedTokens[account], "Nonexistent token");

        return ownedTokens[account][index];
    }

    /// @notice Get amount of claimable STEALTH tokens
    /// @param account The address to return claimable token amount for
    /// @return The amount of claimable tokens
    function getClaimable(address account) public view returns (uint256) {
        return stash[account] + _getPending(account);
    }

    function _getPending(address account) internal view returns (uint256) {
        return (stakedTokens[account] + specialStakedTokens[account])
        * BASE_RATE
        * (block.timestamp - lastUpdate[account])
        / 1 days;
    }

    function _update(address account) internal {
        stash[account] += _getPending(account);
        lastUpdate[account] = block.timestamp;
    }

    /// @notice Claim available STEALTH tokens
    /// @param account The address to claim tokens for
    function claim(address account) public nonReentrant {
        _claim(account);
    }

    function _claim(address account) internal whenNotPaused {
        require(msg.sender == account || allowed[msg.sender], "Caller not allowed");
        require(totalClaimed < MAX_SUPPLY,                    "Max supply has been claimed");

        uint256 claimable = getClaimable(account);
        uint256 claimAmount = totalClaimed + claimable > MAX_SUPPLY
            ? MAX_SUPPLY - totalClaimed
            : claimable;

        _mint(account, claimAmount);
        stash[account] = 0;
        lastUpdate[account] = block.timestamp;
        totalClaimed += claimAmount;
    }

    /// @notice Remove NFTNINJAS tokens from staking contract and optionally collect STEALTH tokens
    /// @param account The address to change permissions for
    /// @param isAllowed Whether the address is allowed to use privileged functionality
    function setAllowed(address account, bool isAllowed) external onlyOwner {
        allowed[account] = isAllowed;
    }

    /// @notice Stake NFTNINJAS tokens
    /// @param tokenIds The tokens IDs to stake
    function stake(uint256[] calldata tokenIds) external isApprovedForAll whenNotPaused {
        require(tokenIds.length <= MAX_PER_TX, "Exceeds max tokens per transaction");

        _update(msg.sender);

        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(NftNinjas.ownerOf(tokenIds[i]) == msg.sender, "Caller is not token owner");

            uint256 current = tokenIds[i];

            if(specialTokens[current]) {
                specialStakedTokens[msg.sender] += 1;
            }

            tokenOwners[current] = msg.sender;
            tokenIndex[current] = stakedTokens[msg.sender];
            ownedTokens[msg.sender][tokenIndex[current]] = current;
            stakedTokens[msg.sender] += 1;

            NftNinjas.transferFrom(msg.sender, address(this), tokenIds[i]);
        }

        totalStaked += tokenIds.length;
    }

    /// @notice Remove NFTNINJAS tokens and optionally collect STEALTH tokens
    /// @param tokenIds The tokens IDs to unstake
    /// @param claimTokens Whether STEALTH tokens should be claimed
    function unstake(uint256[] calldata tokenIds, bool claimTokens) external nonReentrant {
        require(tokenIds.length <= MAX_PER_TX, "Exceeds max tokens per transaction");

        if (claimTokens) _claim(msg.sender);
        else _update(msg.sender);

        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(tokenOwners[tokenIds[i]] == msg.sender, "Caller is not token owner");

            uint256 last = ownedTokens[msg.sender][stakedTokens[msg.sender] - 1];

            if(specialTokens[tokenIds[i]]) {
                specialStakedTokens[msg.sender] -= 1;
            }

            tokenOwners[tokenIds[i]] = address(0);
            tokenIndex[last] = tokenIndex[tokenIds[i]];
            ownedTokens[msg.sender][tokenIndex[tokenIds[i]]] = last;
            stakedTokens[msg.sender] -= 1;

            NftNinjas.transferFrom(address(this), msg.sender, tokenIds[i]);
        }

        totalStaked -= tokenIds.length;
    }

    /// @notice Burn a specified amount of STEALTH tokens
    /// @dev Used only by contracts for extending token utility
    /// @param from The account to burn tokens from
    /// @param amount The amount of tokens to burn
    function burn(address from, uint256 amount) external onlyAllowed {
        _burn(from, amount);
    }

    /// @notice Mint a specified amount of STEALTH tokens
    /// @dev Used only by owner for creating treasury
    /// @param to The account to mint tokens to
    /// @param amount The amount of tokens to mint
    function mint(address to, uint256 amount) external onlyOwner {
        _mint(to, amount);
        totalClaimed += amount;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"nftNinjas","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BASE_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NftNinjas","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getOwnedByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"setAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setSpecialTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"specialStakedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"specialTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bool","name":"claimTokens","type":"bool"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200442d3803806200442d83398181016040528101906200003791906200038b565b6040518060400160405280600781526020017f535445414c5448000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f535445414c5448000000000000000000000000000000000000000000000000008152508160039080519060200190620000bb929190620002c4565b508060049080519060200190620000d4929190620002c4565b505050620000f7620000eb620001f660201b60201c565b620001fe60201b60201c565b6000600560146101000a81548160ff021916908315150217905550600160068190555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a22cb4653360016040518363ffffffff1660e01b8152600401620001bb929190620003df565b600060405180830381600087803b158015620001d657600080fd5b505af1158015620001eb573d6000803e3d6000fd5b5050505050620004d0565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002d2906200044c565b90600052602060002090601f016020900481019282620002f6576000855562000342565b82601f106200031157805160ff191683800117855562000342565b8280016001018555821562000342579182015b828111156200034157825182559160200191906001019062000324565b5b50905062000351919062000355565b5090565b5b808211156200037057600081600090555060010162000356565b5090565b6000815190506200038581620004b6565b92915050565b600060208284031215620003a457620003a3620004b1565b5b6000620003b48482850162000374565b91505092915050565b620003c8816200040c565b82525050565b620003d98162000420565b82525050565b6000604082019050620003f66000830185620003bd565b620004056020830184620003ce565b9392505050565b600062000419826200042c565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200046557607f821691505b602082108114156200047c576200047b62000482565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620004c1816200040c565b8114620004cd57600080fd5b50565b613f4d80620004e06000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806370e87aac1161013b578063a9059cbb116100b8578063e149f0361161007c578063e149f0361461072a578063e80fadcd1461075a578063f2fde38b1461078a578063f43a22dc146107a6578063f8a14f46146107c45761023d565b8063a9059cbb1461064c578063cb03fb1e1461067c578063d54ad2a1146106ac578063d63a8e11146106ca578063dd62ed3e146106fa5761023d565b80639dc29fac116100ff5780639dc29fac146105705780639e97f7d01461058c578063a457c2d7146105bc578063a583024b146105ec578063a5b39cfb1461061c5761023d565b806370e87aac146104ee578063715018a61461050c578063817b1cd2146105165780638da5cb5b1461053457806395d89b41146105525761023d565b8063313ce567116101c957806341910f901161018d57806341910f901461044a5780634697f05d146104685780635c975abb14610484578063609866e4146104a257806370a08231146104be5761023d565b8063313ce567146103a65780633228337a146103c457806332cb6b0c146103e057806339509351146103fe57806340c10f191461042e5761023d565b806318160ddd1161021057806318160ddd146102dc5780631d0504a8146102fa5780631e83409a1461032a57806323b872dd146103465780632da74ccc146103765761023d565b80630583e9f81461024257806306fdde0314610272578063095ea7b3146102905780630fbf0a93146102c0575b600080fd5b61025c60048036038101906102579190612f4a565b6107f4565b604051610269919061364d565b60405180910390f35b61027a61080c565b604051610287919061338b565b60405180910390f35b6102aa60048036038101906102a59190612e30565b61089e565b6040516102b79190613355565b60405180910390f35b6102da60048036038101906102d59190612e70565b6108bc565b005b6102e4610e62565b6040516102f1919061364d565b60405180910390f35b610314600480360381019061030f9190612d03565b610e6c565b604051610321919061364d565b60405180910390f35b610344600480360381019061033f9190612d03565b610e84565b005b610360600480360381019061035b9190612d9d565b610ee6565b60405161036d9190613355565b60405180910390f35b610390600480360381019061038b9190612e30565b610fde565b60405161039d919061364d565b60405180910390f35b6103ae6110ba565b6040516103bb9190613668565b60405180910390f35b6103de60048036038101906103d99190612ebd565b6110c3565b005b6103e86115e5565b6040516103f5919061364d565b60405180910390f35b61041860048036038101906104139190612e30565b611609565b6040516104259190613355565b60405180910390f35b61044860048036038101906104439190612e30565b6116b5565b005b610452611758565b60405161045f919061364d565b60405180910390f35b610482600480360381019061047d9190612df0565b611765565b005b61048c61183c565b6040516104999190613355565b60405180910390f35b6104bc60048036038101906104b79190612ebd565b611853565b005b6104d860048036038101906104d39190612d03565b611980565b6040516104e5919061364d565b60405180910390f35b6104f66119c8565b6040516105039190613370565b60405180910390f35b6105146119ee565b005b61051e611a76565b60405161052b919061364d565b60405180910390f35b61053c611a7c565b60405161054991906132da565b60405180910390f35b61055a611aa6565b604051610567919061338b565b60405180910390f35b61058a60048036038101906105859190612e30565b611b38565b005b6105a660048036038101906105a19190612f4a565b611bd2565b6040516105b39190613355565b60405180910390f35b6105d660048036038101906105d19190612e30565b611bf2565b6040516105e39190613355565b60405180910390f35b61060660048036038101906106019190612d03565b611cdd565b604051610613919061364d565b60405180910390f35b61063660048036038101906106319190612d03565b611d39565b604051610643919061364d565b60405180910390f35b61066660048036038101906106619190612e30565b611d51565b6040516106739190613355565b60405180910390f35b61069660048036038101906106919190612d03565b611d6f565b6040516106a3919061364d565b60405180910390f35b6106b4611d87565b6040516106c1919061364d565b60405180910390f35b6106e460048036038101906106df9190612d03565b611d8d565b6040516106f19190613355565b60405180910390f35b610714600480360381019061070f9190612d5d565b611dad565b604051610721919061364d565b60405180910390f35b610744600480360381019061073f9190612e30565b611e34565b604051610751919061364d565b60405180910390f35b610774600480360381019061076f9190612d03565b611e59565b604051610781919061364d565b60405180910390f35b6107a4600480360381019061079f9190612d03565b611e71565b005b6107ae611f69565b6040516107bb919061364d565b60405180910390f35b6107de60048036038101906107d99190612f4a565b611f6e565b6040516107eb91906132da565b60405180910390f35b60116020528060005260406000206000915090505481565b60606003805461081b90613872565b80601f016020809104026020016040519081016040528092919081815260200182805461084790613872565b80156108945780601f1061086957610100808354040283529160200191610894565b820191906000526020600020905b81548152906001019060200180831161087757829003601f168201915b5050505050905090565b60006108b26108ab611fa1565b8484611fa9565b6001905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b81526004016109199291906132f5565b60206040518083038186803b15801561093157600080fd5b505afa158015610945573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109699190612f1d565b6109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f9061348d565b60405180910390fd5b6109b061183c565b156109f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e7906134ed565b60405180910390fd5b6019828290501115610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e906134ad565b60405180910390fd5b610a4033612174565b60005b82829050811015610e41573373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858585818110610ab657610ab561397a565b5b905060200201356040518263ffffffff1660e01b8152600401610ad9919061364d565b60206040518083038186803b158015610af157600080fd5b505afa158015610b05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b299190612d30565b73ffffffffffffffffffffffffffffffffffffffff1614610b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b769061356d565b60405180910390fd5b6000838383818110610b9457610b9361397a565b5b9050602002013590506010600082815260200190815260200160002060009054906101000a900460ff1615610c1b576001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c13919061369f565b925050819055505b33600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601160008381526020019081526020016000208190555080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060116000858152602001908152602001600020548152602001908152602001600020819055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d7c919061369f565b92505081905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330878787818110610dd657610dd561397a565b5b905060200201356040518463ffffffff1660e01b8152600401610dfb9392919061331e565b600060405180830381600087803b158015610e1557600080fd5b505af1158015610e29573d6000803e3d6000fd5b50505050508080610e39906138a4565b915050610a43565b508181905060086000828254610e57919061369f565b925050819055505050565b6000600254905090565b600a6020528060005260406000206000915090505481565b60026006541415610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec1906135ed565b60405180910390fd5b6002600681905550610edb81612219565b600160068190555050565b6000610ef38484846124b2565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f3e611fa1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb59061352d565b60405180910390fd5b610fd285610fca611fa1565b858403611fa9565b60019150509392505050565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548210611061576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110589061350d565b60405180910390fd5b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006012905090565b60026006541415611109576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611100906135ed565b60405180910390fd5b60026006819055506019838390501115611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906134ad565b60405180910390fd5b801561116c5761116733612219565b611176565b61117533612174565b5b60005b838390508110156115bb573373ffffffffffffffffffffffffffffffffffffffff16600c60008686858181106111b2576111b161397a565b5b90506020020135815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461123e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112359061356d565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112cd9190613780565b8152602001908152602001600020549050601060008686858181106112f5576112f461397a565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1615611375576001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461136d9190613780565b925050819055505b6000600c600087878681811061138e5761138d61397a565b5b90506020020135815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601160008686858181106113f8576113f761397a565b5b90506020020135815260200190815260200160002054601160008381526020019081526020016000208190555080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006011600089898881811061147e5761147d61397a565b5b905060200201358152602001908152602001600020548152602001908152602001600020819055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114f69190613780565b92505081905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd30338888878181106115505761154f61397a565b5b905060200201356040518463ffffffff1660e01b81526004016115759392919061331e565b600060405180830381600087803b15801561158f57600080fd5b505af11580156115a3573d6000803e3d6000fd5b505050505080806115b3906138a4565b915050611179565b5082829050600860008282546115d19190613780565b925050819055506001600681905550505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b60006116ab611616611fa1565b848460016000611624611fa1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116a6919061369f565b611fa9565b6001905092915050565b6116bd611fa1565b73ffffffffffffffffffffffffffffffffffffffff166116db611a7c565b73ffffffffffffffffffffffffffffffffffffffff1614611731576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117289061354d565b60405180910390fd5b61173b8282612733565b806009600082825461174d919061369f565b925050819055505050565b68056bc75e2d6310000081565b61176d611fa1565b73ffffffffffffffffffffffffffffffffffffffff1661178b611a7c565b73ffffffffffffffffffffffffffffffffffffffff16146117e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d89061354d565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600560149054906101000a900460ff16905090565b61185b611fa1565b73ffffffffffffffffffffffffffffffffffffffff16611879611a7c565b73ffffffffffffffffffffffffffffffffffffffff16146118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c69061354d565b60405180910390fd5b60008383905011611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c906133cd565b60405180910390fd5b60005b8383905081101561197a57816010600086868581811061193b5761193a61397a565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611972906138a4565b915050611918565b50505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119f6611fa1565b73ffffffffffffffffffffffffffffffffffffffff16611a14611a7c565b73ffffffffffffffffffffffffffffffffffffffff1614611a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a619061354d565b60405180910390fd5b611a746000612893565b565b60085481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611ab590613872565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae190613872565b8015611b2e5780601f10611b0357610100808354040283529160200191611b2e565b820191906000526020600020905b815481529060010190602001808311611b1157829003601f168201915b5050505050905090565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb906133ed565b60405180910390fd5b611bce8282612959565b5050565b60106020528060005260406000206000915054906101000a900460ff1681565b60008060016000611c01611fa1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb59061360d565b60405180910390fd5b611cd2611cc9611fa1565b85858403611fa9565b600191505092915050565b6000611ce882612b30565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d32919061369f565b9050919050565b600e6020528060005260406000206000915090505481565b6000611d65611d5e611fa1565b84846124b2565b6001905092915050565b600b6020528060005260406000206000915090505481565b60095481565b60126020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600d602052816000526040600020602052806000526040600020600091509150505481565b600f6020528060005260406000206000915090505481565b611e79611fa1565b73ffffffffffffffffffffffffffffffffffffffff16611e97611a7c565b73ffffffffffffffffffffffffffffffffffffffff1614611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee49061354d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f549061342d565b60405180910390fd5b611f6681612893565b50565b601981565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612019576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612010906135cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612089576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120809061344d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612167919061364d565b60405180910390a3505050565b61217d81612b30565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121cb919061369f565b9250508190555042600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b61222161183c565b15612261576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612258906134ed565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122e45750601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a906133ed565b60405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60095410612387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237e906134cd565b60405180910390fd5b600061239282611cdd565b905060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826009546123c5919061369f565b116123d057816123ff565b6009547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6123fe9190613780565b5b905061240b8382612733565b6000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600960008282546124a6919061369f565b92505081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612519906135ad565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612592576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612589906133ad565b60405180910390fd5b61259d838383612c3a565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261a9061346d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126b6919061369f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161271a919061364d565b60405180910390a361272d848484612c3f565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279a9061362d565b60405180910390fd5b6127af60008383612c3a565b80600260008282546127c1919061369f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612816919061369f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161287b919061364d565b60405180910390a361288f60008383612c3f565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c09061358d565b60405180910390fd5b6129d582600083612c3a565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a529061340d565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254612ab29190613780565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b17919061364d565b60405180910390a3612b2b83600084612c3f565b505050565b600062015180600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442612b819190613780565b68056bc75e2d63100000600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c15919061369f565b612c1f9190613726565b612c299190613726565b612c3391906136f5565b9050919050565b505050565b505050565b600081359050612c5381613ed2565b92915050565b600081519050612c6881613ed2565b92915050565b60008083601f840112612c8457612c836139ae565b5b8235905067ffffffffffffffff811115612ca157612ca06139a9565b5b602083019150836020820283011115612cbd57612cbc6139b3565b5b9250929050565b600081359050612cd381613ee9565b92915050565b600081519050612ce881613ee9565b92915050565b600081359050612cfd81613f00565b92915050565b600060208284031215612d1957612d186139bd565b5b6000612d2784828501612c44565b91505092915050565b600060208284031215612d4657612d456139bd565b5b6000612d5484828501612c59565b91505092915050565b60008060408385031215612d7457612d736139bd565b5b6000612d8285828601612c44565b9250506020612d9385828601612c44565b9150509250929050565b600080600060608486031215612db657612db56139bd565b5b6000612dc486828701612c44565b9350506020612dd586828701612c44565b9250506040612de686828701612cee565b9150509250925092565b60008060408385031215612e0757612e066139bd565b5b6000612e1585828601612c44565b9250506020612e2685828601612cc4565b9150509250929050565b60008060408385031215612e4757612e466139bd565b5b6000612e5585828601612c44565b9250506020612e6685828601612cee565b9150509250929050565b60008060208385031215612e8757612e866139bd565b5b600083013567ffffffffffffffff811115612ea557612ea46139b8565b5b612eb185828601612c6e565b92509250509250929050565b600080600060408486031215612ed657612ed56139bd565b5b600084013567ffffffffffffffff811115612ef457612ef36139b8565b5b612f0086828701612c6e565b93509350506020612f1386828701612cc4565b9150509250925092565b600060208284031215612f3357612f326139bd565b5b6000612f4184828501612cd9565b91505092915050565b600060208284031215612f6057612f5f6139bd565b5b6000612f6e84828501612cee565b91505092915050565b612f80816137b4565b82525050565b612f8f816137c6565b82525050565b612f9e81613809565b82525050565b6000612faf82613683565b612fb9818561368e565b9350612fc981856020860161383f565b612fd2816139c2565b840191505092915050565b6000612fea60238361368e565b9150612ff5826139d3565b604082019050919050565b600061300d60128361368e565b915061301882613a22565b602082019050919050565b600061303060128361368e565b915061303b82613a4b565b602082019050919050565b600061305360228361368e565b915061305e82613a74565b604082019050919050565b600061307660268361368e565b915061308182613ac3565b604082019050919050565b600061309960228361368e565b91506130a482613b12565b604082019050919050565b60006130bc60268361368e565b91506130c782613b61565b604082019050919050565b60006130df60158361368e565b91506130ea82613bb0565b602082019050919050565b600061310260228361368e565b915061310d82613bd9565b604082019050919050565b6000613125601b8361368e565b915061313082613c28565b602082019050919050565b600061314860108361368e565b915061315382613c51565b602082019050919050565b600061316b60118361368e565b915061317682613c7a565b602082019050919050565b600061318e60288361368e565b915061319982613ca3565b604082019050919050565b60006131b160208361368e565b91506131bc82613cf2565b602082019050919050565b60006131d460198361368e565b91506131df82613d1b565b602082019050919050565b60006131f760218361368e565b915061320282613d44565b604082019050919050565b600061321a60258361368e565b915061322582613d93565b604082019050919050565b600061323d60248361368e565b915061324882613de2565b604082019050919050565b6000613260601f8361368e565b915061326b82613e31565b602082019050919050565b600061328360258361368e565b915061328e82613e5a565b604082019050919050565b60006132a6601f8361368e565b91506132b182613ea9565b602082019050919050565b6132c5816137f2565b82525050565b6132d4816137fc565b82525050565b60006020820190506132ef6000830184612f77565b92915050565b600060408201905061330a6000830185612f77565b6133176020830184612f77565b9392505050565b60006060820190506133336000830186612f77565b6133406020830185612f77565b61334d60408301846132bc565b949350505050565b600060208201905061336a6000830184612f86565b92915050565b60006020820190506133856000830184612f95565b92915050565b600060208201905081810360008301526133a58184612fa4565b905092915050565b600060208201905081810360008301526133c681612fdd565b9050919050565b600060208201905081810360008301526133e681613000565b9050919050565b6000602082019050818103600083015261340681613023565b9050919050565b6000602082019050818103600083015261342681613046565b9050919050565b6000602082019050818103600083015261344681613069565b9050919050565b600060208201905081810360008301526134668161308c565b9050919050565b60006020820190508181036000830152613486816130af565b9050919050565b600060208201905081810360008301526134a6816130d2565b9050919050565b600060208201905081810360008301526134c6816130f5565b9050919050565b600060208201905081810360008301526134e681613118565b9050919050565b600060208201905081810360008301526135068161313b565b9050919050565b600060208201905081810360008301526135268161315e565b9050919050565b6000602082019050818103600083015261354681613181565b9050919050565b60006020820190508181036000830152613566816131a4565b9050919050565b60006020820190508181036000830152613586816131c7565b9050919050565b600060208201905081810360008301526135a6816131ea565b9050919050565b600060208201905081810360008301526135c68161320d565b9050919050565b600060208201905081810360008301526135e681613230565b9050919050565b6000602082019050818103600083015261360681613253565b9050919050565b6000602082019050818103600083015261362681613276565b9050919050565b6000602082019050818103600083015261364681613299565b9050919050565b600060208201905061366260008301846132bc565b92915050565b600060208201905061367d60008301846132cb565b92915050565b600081519050919050565b600082825260208201905092915050565b60006136aa826137f2565b91506136b5836137f2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136ea576136e96138ed565b5b828201905092915050565b6000613700826137f2565b915061370b836137f2565b92508261371b5761371a61391c565b5b828204905092915050565b6000613731826137f2565b915061373c836137f2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613775576137746138ed565b5b828202905092915050565b600061378b826137f2565b9150613796836137f2565b9250828210156137a9576137a86138ed565b5b828203905092915050565b60006137bf826137d2565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006138148261381b565b9050919050565b60006138268261382d565b9050919050565b6000613838826137d2565b9050919050565b60005b8381101561385d578082015181840152602081019050613842565b8381111561386c576000848401525b50505050565b6000600282049050600182168061388a57607f821691505b6020821081141561389e5761389d61394b565b5b50919050565b60006138af826137f2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138e2576138e16138ed565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20746f6b656e732073656c65637465640000000000000000000000000000600082015250565b7f43616c6c6572206e6f7420616c6c6f7765640000000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206e6f7420617070726f7665640000000000000000000000600082015250565b7f45786365656473206d617820746f6b656e7320706572207472616e736163746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d617820737570706c7920686173206265656e20636c61696d65640000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616c6c6572206973206e6f7420746f6b656e206f776e657200000000000000600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613edb816137b4565b8114613ee657600080fd5b50565b613ef2816137c6565b8114613efd57600080fd5b50565b613f09816137f2565b8114613f1457600080fd5b5056fea2646970667358221220fe6db35379538b50de52d41566022dd0d22b4bac15536b7537c802b845f013b664736f6c63430008070033000000000000000000000000b63ce3ac885a3318fc2e563fdb190e9a5dda5b33

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061023d5760003560e01c806370e87aac1161013b578063a9059cbb116100b8578063e149f0361161007c578063e149f0361461072a578063e80fadcd1461075a578063f2fde38b1461078a578063f43a22dc146107a6578063f8a14f46146107c45761023d565b8063a9059cbb1461064c578063cb03fb1e1461067c578063d54ad2a1146106ac578063d63a8e11146106ca578063dd62ed3e146106fa5761023d565b80639dc29fac116100ff5780639dc29fac146105705780639e97f7d01461058c578063a457c2d7146105bc578063a583024b146105ec578063a5b39cfb1461061c5761023d565b806370e87aac146104ee578063715018a61461050c578063817b1cd2146105165780638da5cb5b1461053457806395d89b41146105525761023d565b8063313ce567116101c957806341910f901161018d57806341910f901461044a5780634697f05d146104685780635c975abb14610484578063609866e4146104a257806370a08231146104be5761023d565b8063313ce567146103a65780633228337a146103c457806332cb6b0c146103e057806339509351146103fe57806340c10f191461042e5761023d565b806318160ddd1161021057806318160ddd146102dc5780631d0504a8146102fa5780631e83409a1461032a57806323b872dd146103465780632da74ccc146103765761023d565b80630583e9f81461024257806306fdde0314610272578063095ea7b3146102905780630fbf0a93146102c0575b600080fd5b61025c60048036038101906102579190612f4a565b6107f4565b604051610269919061364d565b60405180910390f35b61027a61080c565b604051610287919061338b565b60405180910390f35b6102aa60048036038101906102a59190612e30565b61089e565b6040516102b79190613355565b60405180910390f35b6102da60048036038101906102d59190612e70565b6108bc565b005b6102e4610e62565b6040516102f1919061364d565b60405180910390f35b610314600480360381019061030f9190612d03565b610e6c565b604051610321919061364d565b60405180910390f35b610344600480360381019061033f9190612d03565b610e84565b005b610360600480360381019061035b9190612d9d565b610ee6565b60405161036d9190613355565b60405180910390f35b610390600480360381019061038b9190612e30565b610fde565b60405161039d919061364d565b60405180910390f35b6103ae6110ba565b6040516103bb9190613668565b60405180910390f35b6103de60048036038101906103d99190612ebd565b6110c3565b005b6103e86115e5565b6040516103f5919061364d565b60405180910390f35b61041860048036038101906104139190612e30565b611609565b6040516104259190613355565b60405180910390f35b61044860048036038101906104439190612e30565b6116b5565b005b610452611758565b60405161045f919061364d565b60405180910390f35b610482600480360381019061047d9190612df0565b611765565b005b61048c61183c565b6040516104999190613355565b60405180910390f35b6104bc60048036038101906104b79190612ebd565b611853565b005b6104d860048036038101906104d39190612d03565b611980565b6040516104e5919061364d565b60405180910390f35b6104f66119c8565b6040516105039190613370565b60405180910390f35b6105146119ee565b005b61051e611a76565b60405161052b919061364d565b60405180910390f35b61053c611a7c565b60405161054991906132da565b60405180910390f35b61055a611aa6565b604051610567919061338b565b60405180910390f35b61058a60048036038101906105859190612e30565b611b38565b005b6105a660048036038101906105a19190612f4a565b611bd2565b6040516105b39190613355565b60405180910390f35b6105d660048036038101906105d19190612e30565b611bf2565b6040516105e39190613355565b60405180910390f35b61060660048036038101906106019190612d03565b611cdd565b604051610613919061364d565b60405180910390f35b61063660048036038101906106319190612d03565b611d39565b604051610643919061364d565b60405180910390f35b61066660048036038101906106619190612e30565b611d51565b6040516106739190613355565b60405180910390f35b61069660048036038101906106919190612d03565b611d6f565b6040516106a3919061364d565b60405180910390f35b6106b4611d87565b6040516106c1919061364d565b60405180910390f35b6106e460048036038101906106df9190612d03565b611d8d565b6040516106f19190613355565b60405180910390f35b610714600480360381019061070f9190612d5d565b611dad565b604051610721919061364d565b60405180910390f35b610744600480360381019061073f9190612e30565b611e34565b604051610751919061364d565b60405180910390f35b610774600480360381019061076f9190612d03565b611e59565b604051610781919061364d565b60405180910390f35b6107a4600480360381019061079f9190612d03565b611e71565b005b6107ae611f69565b6040516107bb919061364d565b60405180910390f35b6107de60048036038101906107d99190612f4a565b611f6e565b6040516107eb91906132da565b60405180910390f35b60116020528060005260406000206000915090505481565b60606003805461081b90613872565b80601f016020809104026020016040519081016040528092919081815260200182805461084790613872565b80156108945780601f1061086957610100808354040283529160200191610894565b820191906000526020600020905b81548152906001019060200180831161087757829003601f168201915b5050505050905090565b60006108b26108ab611fa1565b8484611fa9565b6001905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b81526004016109199291906132f5565b60206040518083038186803b15801561093157600080fd5b505afa158015610945573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109699190612f1d565b6109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f9061348d565b60405180910390fd5b6109b061183c565b156109f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e7906134ed565b60405180910390fd5b6019828290501115610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e906134ad565b60405180910390fd5b610a4033612174565b60005b82829050811015610e41573373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858585818110610ab657610ab561397a565b5b905060200201356040518263ffffffff1660e01b8152600401610ad9919061364d565b60206040518083038186803b158015610af157600080fd5b505afa158015610b05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b299190612d30565b73ffffffffffffffffffffffffffffffffffffffff1614610b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b769061356d565b60405180910390fd5b6000838383818110610b9457610b9361397a565b5b9050602002013590506010600082815260200190815260200160002060009054906101000a900460ff1615610c1b576001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c13919061369f565b925050819055505b33600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601160008381526020019081526020016000208190555080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060116000858152602001908152602001600020548152602001908152602001600020819055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d7c919061369f565b92505081905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330878787818110610dd657610dd561397a565b5b905060200201356040518463ffffffff1660e01b8152600401610dfb9392919061331e565b600060405180830381600087803b158015610e1557600080fd5b505af1158015610e29573d6000803e3d6000fd5b50505050508080610e39906138a4565b915050610a43565b508181905060086000828254610e57919061369f565b925050819055505050565b6000600254905090565b600a6020528060005260406000206000915090505481565b60026006541415610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec1906135ed565b60405180910390fd5b6002600681905550610edb81612219565b600160068190555050565b6000610ef38484846124b2565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f3e611fa1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb59061352d565b60405180910390fd5b610fd285610fca611fa1565b858403611fa9565b60019150509392505050565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548210611061576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110589061350d565b60405180910390fd5b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006012905090565b60026006541415611109576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611100906135ed565b60405180910390fd5b60026006819055506019838390501115611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906134ad565b60405180910390fd5b801561116c5761116733612219565b611176565b61117533612174565b5b60005b838390508110156115bb573373ffffffffffffffffffffffffffffffffffffffff16600c60008686858181106111b2576111b161397a565b5b90506020020135815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461123e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112359061356d565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112cd9190613780565b8152602001908152602001600020549050601060008686858181106112f5576112f461397a565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1615611375576001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461136d9190613780565b925050819055505b6000600c600087878681811061138e5761138d61397a565b5b90506020020135815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601160008686858181106113f8576113f761397a565b5b90506020020135815260200190815260200160002054601160008381526020019081526020016000208190555080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006011600089898881811061147e5761147d61397a565b5b905060200201358152602001908152602001600020548152602001908152602001600020819055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114f69190613780565b92505081905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd30338888878181106115505761154f61397a565b5b905060200201356040518463ffffffff1660e01b81526004016115759392919061331e565b600060405180830381600087803b15801561158f57600080fd5b505af11580156115a3573d6000803e3d6000fd5b505050505080806115b3906138a4565b915050611179565b5082829050600860008282546115d19190613780565b925050819055506001600681905550505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b60006116ab611616611fa1565b848460016000611624611fa1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116a6919061369f565b611fa9565b6001905092915050565b6116bd611fa1565b73ffffffffffffffffffffffffffffffffffffffff166116db611a7c565b73ffffffffffffffffffffffffffffffffffffffff1614611731576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117289061354d565b60405180910390fd5b61173b8282612733565b806009600082825461174d919061369f565b925050819055505050565b68056bc75e2d6310000081565b61176d611fa1565b73ffffffffffffffffffffffffffffffffffffffff1661178b611a7c565b73ffffffffffffffffffffffffffffffffffffffff16146117e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d89061354d565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600560149054906101000a900460ff16905090565b61185b611fa1565b73ffffffffffffffffffffffffffffffffffffffff16611879611a7c565b73ffffffffffffffffffffffffffffffffffffffff16146118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c69061354d565b60405180910390fd5b60008383905011611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c906133cd565b60405180910390fd5b60005b8383905081101561197a57816010600086868581811061193b5761193a61397a565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611972906138a4565b915050611918565b50505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119f6611fa1565b73ffffffffffffffffffffffffffffffffffffffff16611a14611a7c565b73ffffffffffffffffffffffffffffffffffffffff1614611a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a619061354d565b60405180910390fd5b611a746000612893565b565b60085481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611ab590613872565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae190613872565b8015611b2e5780601f10611b0357610100808354040283529160200191611b2e565b820191906000526020600020905b815481529060010190602001808311611b1157829003601f168201915b5050505050905090565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb906133ed565b60405180910390fd5b611bce8282612959565b5050565b60106020528060005260406000206000915054906101000a900460ff1681565b60008060016000611c01611fa1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb59061360d565b60405180910390fd5b611cd2611cc9611fa1565b85858403611fa9565b600191505092915050565b6000611ce882612b30565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d32919061369f565b9050919050565b600e6020528060005260406000206000915090505481565b6000611d65611d5e611fa1565b84846124b2565b6001905092915050565b600b6020528060005260406000206000915090505481565b60095481565b60126020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600d602052816000526040600020602052806000526040600020600091509150505481565b600f6020528060005260406000206000915090505481565b611e79611fa1565b73ffffffffffffffffffffffffffffffffffffffff16611e97611a7c565b73ffffffffffffffffffffffffffffffffffffffff1614611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee49061354d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f549061342d565b60405180910390fd5b611f6681612893565b50565b601981565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612019576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612010906135cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612089576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120809061344d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612167919061364d565b60405180910390a3505050565b61217d81612b30565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121cb919061369f565b9250508190555042600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b61222161183c565b15612261576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612258906134ed565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122e45750601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a906133ed565b60405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60095410612387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237e906134cd565b60405180910390fd5b600061239282611cdd565b905060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826009546123c5919061369f565b116123d057816123ff565b6009547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6123fe9190613780565b5b905061240b8382612733565b6000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600960008282546124a6919061369f565b92505081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612519906135ad565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612592576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612589906133ad565b60405180910390fd5b61259d838383612c3a565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261a9061346d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126b6919061369f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161271a919061364d565b60405180910390a361272d848484612c3f565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279a9061362d565b60405180910390fd5b6127af60008383612c3a565b80600260008282546127c1919061369f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612816919061369f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161287b919061364d565b60405180910390a361288f60008383612c3f565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c09061358d565b60405180910390fd5b6129d582600083612c3a565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a529061340d565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254612ab29190613780565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b17919061364d565b60405180910390a3612b2b83600084612c3f565b505050565b600062015180600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442612b819190613780565b68056bc75e2d63100000600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c15919061369f565b612c1f9190613726565b612c299190613726565b612c3391906136f5565b9050919050565b505050565b505050565b600081359050612c5381613ed2565b92915050565b600081519050612c6881613ed2565b92915050565b60008083601f840112612c8457612c836139ae565b5b8235905067ffffffffffffffff811115612ca157612ca06139a9565b5b602083019150836020820283011115612cbd57612cbc6139b3565b5b9250929050565b600081359050612cd381613ee9565b92915050565b600081519050612ce881613ee9565b92915050565b600081359050612cfd81613f00565b92915050565b600060208284031215612d1957612d186139bd565b5b6000612d2784828501612c44565b91505092915050565b600060208284031215612d4657612d456139bd565b5b6000612d5484828501612c59565b91505092915050565b60008060408385031215612d7457612d736139bd565b5b6000612d8285828601612c44565b9250506020612d9385828601612c44565b9150509250929050565b600080600060608486031215612db657612db56139bd565b5b6000612dc486828701612c44565b9350506020612dd586828701612c44565b9250506040612de686828701612cee565b9150509250925092565b60008060408385031215612e0757612e066139bd565b5b6000612e1585828601612c44565b9250506020612e2685828601612cc4565b9150509250929050565b60008060408385031215612e4757612e466139bd565b5b6000612e5585828601612c44565b9250506020612e6685828601612cee565b9150509250929050565b60008060208385031215612e8757612e866139bd565b5b600083013567ffffffffffffffff811115612ea557612ea46139b8565b5b612eb185828601612c6e565b92509250509250929050565b600080600060408486031215612ed657612ed56139bd565b5b600084013567ffffffffffffffff811115612ef457612ef36139b8565b5b612f0086828701612c6e565b93509350506020612f1386828701612cc4565b9150509250925092565b600060208284031215612f3357612f326139bd565b5b6000612f4184828501612cd9565b91505092915050565b600060208284031215612f6057612f5f6139bd565b5b6000612f6e84828501612cee565b91505092915050565b612f80816137b4565b82525050565b612f8f816137c6565b82525050565b612f9e81613809565b82525050565b6000612faf82613683565b612fb9818561368e565b9350612fc981856020860161383f565b612fd2816139c2565b840191505092915050565b6000612fea60238361368e565b9150612ff5826139d3565b604082019050919050565b600061300d60128361368e565b915061301882613a22565b602082019050919050565b600061303060128361368e565b915061303b82613a4b565b602082019050919050565b600061305360228361368e565b915061305e82613a74565b604082019050919050565b600061307660268361368e565b915061308182613ac3565b604082019050919050565b600061309960228361368e565b91506130a482613b12565b604082019050919050565b60006130bc60268361368e565b91506130c782613b61565b604082019050919050565b60006130df60158361368e565b91506130ea82613bb0565b602082019050919050565b600061310260228361368e565b915061310d82613bd9565b604082019050919050565b6000613125601b8361368e565b915061313082613c28565b602082019050919050565b600061314860108361368e565b915061315382613c51565b602082019050919050565b600061316b60118361368e565b915061317682613c7a565b602082019050919050565b600061318e60288361368e565b915061319982613ca3565b604082019050919050565b60006131b160208361368e565b91506131bc82613cf2565b602082019050919050565b60006131d460198361368e565b91506131df82613d1b565b602082019050919050565b60006131f760218361368e565b915061320282613d44565b604082019050919050565b600061321a60258361368e565b915061322582613d93565b604082019050919050565b600061323d60248361368e565b915061324882613de2565b604082019050919050565b6000613260601f8361368e565b915061326b82613e31565b602082019050919050565b600061328360258361368e565b915061328e82613e5a565b604082019050919050565b60006132a6601f8361368e565b91506132b182613ea9565b602082019050919050565b6132c5816137f2565b82525050565b6132d4816137fc565b82525050565b60006020820190506132ef6000830184612f77565b92915050565b600060408201905061330a6000830185612f77565b6133176020830184612f77565b9392505050565b60006060820190506133336000830186612f77565b6133406020830185612f77565b61334d60408301846132bc565b949350505050565b600060208201905061336a6000830184612f86565b92915050565b60006020820190506133856000830184612f95565b92915050565b600060208201905081810360008301526133a58184612fa4565b905092915050565b600060208201905081810360008301526133c681612fdd565b9050919050565b600060208201905081810360008301526133e681613000565b9050919050565b6000602082019050818103600083015261340681613023565b9050919050565b6000602082019050818103600083015261342681613046565b9050919050565b6000602082019050818103600083015261344681613069565b9050919050565b600060208201905081810360008301526134668161308c565b9050919050565b60006020820190508181036000830152613486816130af565b9050919050565b600060208201905081810360008301526134a6816130d2565b9050919050565b600060208201905081810360008301526134c6816130f5565b9050919050565b600060208201905081810360008301526134e681613118565b9050919050565b600060208201905081810360008301526135068161313b565b9050919050565b600060208201905081810360008301526135268161315e565b9050919050565b6000602082019050818103600083015261354681613181565b9050919050565b60006020820190508181036000830152613566816131a4565b9050919050565b60006020820190508181036000830152613586816131c7565b9050919050565b600060208201905081810360008301526135a6816131ea565b9050919050565b600060208201905081810360008301526135c68161320d565b9050919050565b600060208201905081810360008301526135e681613230565b9050919050565b6000602082019050818103600083015261360681613253565b9050919050565b6000602082019050818103600083015261362681613276565b9050919050565b6000602082019050818103600083015261364681613299565b9050919050565b600060208201905061366260008301846132bc565b92915050565b600060208201905061367d60008301846132cb565b92915050565b600081519050919050565b600082825260208201905092915050565b60006136aa826137f2565b91506136b5836137f2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136ea576136e96138ed565b5b828201905092915050565b6000613700826137f2565b915061370b836137f2565b92508261371b5761371a61391c565b5b828204905092915050565b6000613731826137f2565b915061373c836137f2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613775576137746138ed565b5b828202905092915050565b600061378b826137f2565b9150613796836137f2565b9250828210156137a9576137a86138ed565b5b828203905092915050565b60006137bf826137d2565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006138148261381b565b9050919050565b60006138268261382d565b9050919050565b6000613838826137d2565b9050919050565b60005b8381101561385d578082015181840152602081019050613842565b8381111561386c576000848401525b50505050565b6000600282049050600182168061388a57607f821691505b6020821081141561389e5761389d61394b565b5b50919050565b60006138af826137f2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138e2576138e16138ed565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20746f6b656e732073656c65637465640000000000000000000000000000600082015250565b7f43616c6c6572206e6f7420616c6c6f7765640000000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206e6f7420617070726f7665640000000000000000000000600082015250565b7f45786365656473206d617820746f6b656e7320706572207472616e736163746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d617820737570706c7920686173206265656e20636c61696d65640000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616c6c6572206973206e6f7420746f6b656e206f776e657200000000000000600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613edb816137b4565b8114613ee657600080fd5b50565b613ef2816137c6565b8114613efd57600080fd5b50565b613f09816137f2565b8114613f1457600080fd5b5056fea2646970667358221220fe6db35379538b50de52d41566022dd0d22b4bac15536b7537c802b845f013b664736f6c63430008070033

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

000000000000000000000000b63ce3ac885a3318fc2e563fdb190e9a5dda5b33

-----Decoded View---------------
Arg [0] : nftNinjas (address): 0xb63cE3Ac885A3318fC2E563fdB190e9A5dda5B33

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


Deployed Bytecode Sourcemap

30264:6793:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30996:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17653:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19820:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34295:884;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18773:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30603:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33135:86;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20471:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32090:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18615:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35386:975;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30375:54;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21372:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36924:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30482:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34079:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14336:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31585:271;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18944:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30342:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29327:103;;;:::i;:::-;;30536:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28676:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17872:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36598:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30943:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22090:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32487:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30828:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19284:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30650:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30569:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31048:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19522:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30755:66;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30882:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29585:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30436:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30702:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30996:45;;;;;;;;;;;;;;;;;:::o;17653:100::-;17707:13;17740:5;17733:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17653:100;:::o;19820:169::-;19903:4;19920:39;19929:12;:10;:12::i;:::-;19943:7;19952:6;19920:8;:39::i;:::-;19977:4;19970:11;;19820:169;;;;:::o;34295:884::-;31455:9;;;;;;;;;;;:26;;;31482:10;31502:4;31455:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31433:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;14662:8:::1;:6;:8::i;:::-;14661:9;14653:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;30473:2:::2;34398:8;;:15;;:29;;34390:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;34479:19;34487:10;34479:7;:19::i;:::-;34516:9;34511:618;34535:8;;:15;;34531:1;:19;34511:618;;;34614:10;34580:44;;:9;;;;;;;;;;;:17;;;34598:8;;34607:1;34598:11;;;;;;;:::i;:::-;;;;;;;;34580:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;;34572:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;34671:15;34689:8;;34698:1;34689:11;;;;;;;:::i;:::-;;;;;;;;34671:29;;34720:13;:22;34734:7;34720:22;;;;;;;;;;;;;;;;;;;;;34717:98;;;34798:1;34763:19;:31;34783:10;34763:31;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;34717:98;34854:10;34831:11;:20;34843:7;34831:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;34901:12;:24;34914:10;34901:24;;;;;;;;;;;;;;;;34879:10;:19;34890:7;34879:19;;;;;;;;;;;:46;;;;34987:7;34940:11;:23;34952:10;34940:23;;;;;;;;;;;;;;;:44;34964:10;:19;34975:7;34964:19;;;;;;;;;;;;34940:44;;;;;;;;;;;:54;;;;35037:1;35009:12;:24;35022:10;35009:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;35055:9;;;;;;;;;;;:22;;;35078:10;35098:4;35105:8;;35114:1;35105:11;;;;;;;:::i;:::-;;;;;;;;35055:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;34557:572;34552:3;;;;;:::i;:::-;;;;34511:618;;;;35156:8;;:15;;35141:11;;:30;;;;;;;:::i;:::-;;;;;;;;34295:884:::0;;:::o;18773:108::-;18834:7;18861:12;;18854:19;;18773:108;:::o;30603:40::-;;;;;;;;;;;;;;;;;:::o;33135:86::-;1954:1;2552:7;;:19;;2544:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1954:1;2685:7;:18;;;;33198:15:::1;33205:7;33198:6;:15::i;:::-;1910:1:::0;2864:7;:22;;;;33135:86;:::o;20471:492::-;20611:4;20628:36;20638:6;20646:9;20657:6;20628:9;:36::i;:::-;20677:24;20704:11;:19;20716:6;20704:19;;;;;;;;;;;;;;;:33;20724:12;:10;:12::i;:::-;20704:33;;;;;;;;;;;;;;;;20677:60;;20776:6;20756:16;:26;;20748:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;20863:57;20872:6;20880:12;:10;:12::i;:::-;20913:6;20894:16;:25;20863:8;:57::i;:::-;20951:4;20944:11;;;20471:492;;;;;:::o;32090:212::-;32168:7;32204:12;:21;32217:7;32204:21;;;;;;;;;;;;;;;;32196:5;:29;32188:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;32267:11;:20;32279:7;32267:20;;;;;;;;;;;;;;;:27;32288:5;32267:27;;;;;;;;;;;;32260:34;;32090:212;;;;:::o;18615:93::-;18673:5;18698:2;18691:9;;18615:93;:::o;35386:975::-;1954:1;2552:7;;:19;;2544:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1954:1;2685:7;:18;;;;30473:2:::1;35491:8;;:15;;:29;;35483:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35576:11;35572:70;;;35589:18;35596:10;35589:6;:18::i;:::-;35572:70;;;35623:19;35631:10;35623:7;:19::i;:::-;35572:70;35660:9;35655:656;35679:8;;:15;;35675:1;:19;35655:656;;;35752:10;35724:38;;:11;:24;35736:8;;35745:1;35736:11;;;;;;;:::i;:::-;;;;;;;;35724:24;;;;;;;;;;;;;;;;;;;;;:38;;;35716:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35809:12;35824:11;:23;35836:10;35824:23;;;;;;;;;;;;;;;:53;35875:1;35848:12;:24;35861:10;35848:24;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;35824:53;;;;;;;;;;;;35809:68;;35897:13;:26;35911:8;;35920:1;35911:11;;;;;;;:::i;:::-;;;;;;;;35897:26;;;;;;;;;;;;;;;;;;;;;35894:102;;;35979:1;35944:19;:31;35964:10;35944:31;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;35894:102;36047:1;36012:11;:24;36024:8;;36033:1;36024:11;;;;;;;:::i;:::-;;;;;;;;36012:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;36083:10;:23;36094:8;;36103:1;36094:11;;;;;;;:::i;:::-;;;;;;;;36083:23;;;;;;;;;;;;36064:10;:16;36075:4;36064:16;;;;;;;;;;;:42;;;;36172:4;36121:11;:23;36133:10;36121:23;;;;;;;;;;;;;;;:48;36145:10;:23;36156:8;;36165:1;36156:11;;;;;;;:::i;:::-;;;;;;;;36145:23;;;;;;;;;;;;36121:48;;;;;;;;;;;:55;;;;36219:1;36191:12;:24;36204:10;36191:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;36237:9;;;;;;;;;;;:22;;;36268:4;36275:10;36287:8;;36296:1;36287:11;;;;;;;:::i;:::-;;;;;;;;36237:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35701:610;35696:3;;;;;:::i;:::-;;;;35655:656;;;;36338:8;;:15;;36323:11;;:30;;;;;;;:::i;:::-;;;;;;;;1910:1:::0;2864:7;:22;;;;35386:975;;;:::o;30375:54::-;30412:17;30375:54;:::o;21372:215::-;21460:4;21477:80;21486:12;:10;:12::i;:::-;21500:7;21546:10;21509:11;:25;21521:12;:10;:12::i;:::-;21509:25;;;;;;;;;;;;;;;:34;21535:7;21509:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;21477:8;:80::i;:::-;21575:4;21568:11;;21372:215;;;;:::o;36924:130::-;28907:12;:10;:12::i;:::-;28896:23;;:7;:5;:7::i;:::-;:23;;;28888:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36996:17:::1;37002:2;37006:6;36996:5;:17::i;:::-;37040:6;37024:12;;:22;;;;;;;:::i;:::-;;;;;;;;36924:130:::0;;:::o;30482:45::-;30518:9;30482:45;:::o;34079:119::-;28907:12;:10;:12::i;:::-;28896:23;;:7;:5;:7::i;:::-;:23;;;28888:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34181:9:::1;34162:7;:16;34170:7;34162:16;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;34079:119:::0;;:::o;14336:86::-;14383:4;14407:7;;;;;;;;;;;14400:14;;14336:86;:::o;31585:271::-;28907:12;:10;:12::i;:::-;28896:23;;:7;:5;:7::i;:::-;:23;;;28888:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31706:1:::1;31688:8;;:15;;:19;31680:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;31747:9;31743:106;31766:8;;:15;;31762:1;:19;31743:106;;;31832:5;31803:13;:26;31817:8;;31826:1;31817:11;;;;;;;:::i;:::-;;;;;;;;31803:26;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;31783:3;;;;;:::i;:::-;;;;31743:106;;;;31585:271:::0;;;:::o;18944:127::-;19018:7;19045:9;:18;19055:7;19045:18;;;;;;;;;;;;;;;;19038:25;;18944:127;;;:::o;30342:24::-;;;;;;;;;;;;;:::o;29327:103::-;28907:12;:10;:12::i;:::-;28896:23;;:7;:5;:7::i;:::-;:23;;;28888:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29392:30:::1;29419:1;29392:18;:30::i;:::-;29327:103::o:0;30536:26::-;;;;:::o;28676:87::-;28722:7;28749:6;;;;;;;;;;;28742:13;;28676:87;:::o;17872:104::-;17928:13;17961:7;17954:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17872:104;:::o;36598:103::-;31324:7;:19;31332:10;31324:19;;;;;;;;;;;;;;;;;;;;;;;;;31316:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;36674:19:::1;36680:4;36686:6;36674:5;:19::i;:::-;36598:103:::0;;:::o;30943:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;22090:413::-;22183:4;22200:24;22227:11;:25;22239:12;:10;:12::i;:::-;22227:25;;;;;;;;;;;;;;;:34;22253:7;22227:34;;;;;;;;;;;;;;;;22200:61;;22300:15;22280:16;:35;;22272:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;22393:67;22402:12;:10;:12::i;:::-;22416:7;22444:15;22425:16;:34;22393:8;:67::i;:::-;22491:4;22484:11;;;22090:413;;;;:::o;32487:132::-;32547:7;32591:20;32603:7;32591:11;:20::i;:::-;32574:5;:14;32580:7;32574:14;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;32567:44;;32487:132;;;:::o;30828:47::-;;;;;;;;;;;;;;;;;:::o;19284:175::-;19370:4;19387:42;19397:12;:10;:12::i;:::-;19411:9;19422:6;19387:9;:42::i;:::-;19447:4;19440:11;;19284:175;;;;:::o;30650:45::-;;;;;;;;;;;;;;;;;:::o;30569:27::-;;;;:::o;31048:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;19522:151::-;19611:7;19638:11;:18;19650:5;19638:18;;;;;;;;;;;;;;;:27;19657:7;19638:27;;;;;;;;;;;;;;;;19631:34;;19522:151;;;;:::o;30755:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30882:54::-;;;;;;;;;;;;;;;;;:::o;29585:201::-;28907:12;:10;:12::i;:::-;28896:23;;:7;:5;:7::i;:::-;:23;;;28888:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29694:1:::1;29674:22;;:8;:22;;;;29666:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29750:28;29769:8;29750:18;:28::i;:::-;29585:201:::0;:::o;30436:39::-;30473:2;30436:39;:::o;30702:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;12990:98::-;13043:7;13070:10;13063:17;;12990:98;:::o;25774:380::-;25927:1;25910:19;;:5;:19;;;;25902:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26008:1;25989:21;;:7;:21;;;;25981:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26092:6;26062:11;:18;26074:5;26062:18;;;;;;;;;;;;;;;:27;26081:7;26062:27;;;;;;;;;;;;;;;:36;;;;26130:7;26114:32;;26123:5;26114:32;;;26139:6;26114:32;;;;;;:::i;:::-;;;;;;;;25774:380;;;:::o;32875:148::-;32947:20;32959:7;32947:11;:20::i;:::-;32929:5;:14;32935:7;32929:14;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;33000:15;32978:10;:19;32989:7;32978:19;;;;;;;;;;;;;;;:37;;;;32875:148;:::o;33229:590::-;14662:8;:6;:8::i;:::-;14661:9;14653:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;33318:7:::1;33304:21;;:10;:21;;;:44;;;;33329:7;:19;33337:10;33329:19;;;;;;;;;;;;;;;;;;;;;;;;;33304:44;33296:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;30412:17;33390:12;;:25;33382:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;33479:17;33499:21;33512:7;33499:12;:21::i;:::-;33479:41;;33531:19;30412:17;33568:9;33553:12;;:24;;;;:::i;:::-;:37;:103;;33647:9;33553:103;;;33619:12;;30412:17;33606:25;;;;:::i;:::-;33553:103;33531:125;;33669:27;33675:7;33684:11;33669:5;:27::i;:::-;33724:1;33707:5;:14;33713:7;33707:14;;;;;;;;;;;;;;;:18;;;;33758:15;33736:10;:19;33747:7;33736:19;;;;;;;;;;;;;;;:37;;;;33800:11;33784:12;;:27;;;;;;;:::i;:::-;;;;;;;;33285:534;;33229:590:::0;:::o;22993:733::-;23151:1;23133:20;;:6;:20;;;;23125:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;23235:1;23214:23;;:9;:23;;;;23206:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23290:47;23311:6;23319:9;23330:6;23290:20;:47::i;:::-;23350:21;23374:9;:17;23384:6;23374:17;;;;;;;;;;;;;;;;23350:41;;23427:6;23410:13;:23;;23402:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23548:6;23532:13;:22;23512:9;:17;23522:6;23512:17;;;;;;;;;;;;;;;:42;;;;23600:6;23576:9;:20;23586:9;23576:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;23641:9;23624:35;;23633:6;23624:35;;;23652:6;23624:35;;;;;;:::i;:::-;;;;;;;;23672:46;23692:6;23700:9;23711:6;23672:19;:46::i;:::-;23114:612;22993:733;;;:::o;24013:399::-;24116:1;24097:21;;:7;:21;;;;24089:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;24167:49;24196:1;24200:7;24209:6;24167:20;:49::i;:::-;24245:6;24229:12;;:22;;;;;;;:::i;:::-;;;;;;;;24284:6;24262:9;:18;24272:7;24262:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;24327:7;24306:37;;24323:1;24306:37;;;24336:6;24306:37;;;;;;:::i;:::-;;;;;;;;24356:48;24384:1;24388:7;24397:6;24356:19;:48::i;:::-;24013:399;;:::o;29946:191::-;30020:16;30039:6;;;;;;;;;;;30020:25;;30065:8;30056:6;;:17;;;;;;;;;;;;;;;;;;30120:8;30089:40;;30110:8;30089:40;;;;;;;;;;;;30009:128;29946:191;:::o;24745:591::-;24848:1;24829:21;;:7;:21;;;;24821:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24901:49;24922:7;24939:1;24943:6;24901:20;:49::i;:::-;24963:22;24988:9;:18;24998:7;24988:18;;;;;;;;;;;;;;;;24963:43;;25043:6;25025:14;:24;;25017:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25162:6;25145:14;:23;25124:9;:18;25134:7;25124:18;;;;;;;;;;;;;;;:44;;;;25206:6;25190:12;;:22;;;;;;;:::i;:::-;;;;;;;;25256:1;25230:37;;25239:7;25230:37;;;25260:6;25230:37;;;;;;:::i;:::-;;;;;;;;25280:48;25300:7;25317:1;25321:6;25280:19;:48::i;:::-;24810:526;24745:591;;:::o;32627:240::-;32688:7;32853:6;32821:10;:19;32832:7;32821:19;;;;;;;;;;;;;;;;32803:15;:37;;;;:::i;:::-;30518:9;32740:19;:28;32760:7;32740:28;;;;;;;;;;;;;;;;32716:12;:21;32729:7;32716:21;;;;;;;;;;;;;;;;:52;;;;:::i;:::-;32715:75;;;;:::i;:::-;:126;;;;:::i;:::-;:144;;;;:::i;:::-;32708:151;;32627:240;;;:::o;26754:125::-;;;;:::o;27483:124::-;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;152:143;;;;:::o;318:568::-;391:8;401:6;451:3;444:4;436:6;432:17;428:27;418:122;;459:79;;:::i;:::-;418:122;572:6;559:20;549:30;;602:18;594:6;591:30;588:117;;;624:79;;:::i;:::-;588:117;738:4;730:6;726:17;714:29;;792:3;784:4;776:6;772:17;762:8;758:32;755:41;752:128;;;799:79;;:::i;:::-;752:128;318:568;;;;;:::o;892:133::-;935:5;973:6;960:20;951:29;;989:30;1013:5;989:30;:::i;:::-;892:133;;;;:::o;1031:137::-;1085:5;1116:6;1110:13;1101:22;;1132:30;1156:5;1132:30;:::i;:::-;1031:137;;;;:::o;1174:139::-;1220:5;1258:6;1245:20;1236:29;;1274:33;1301:5;1274:33;:::i;:::-;1174:139;;;;:::o;1319:329::-;1378:6;1427:2;1415:9;1406:7;1402:23;1398:32;1395:119;;;1433:79;;:::i;:::-;1395:119;1553:1;1578:53;1623:7;1614:6;1603:9;1599:22;1578:53;:::i;:::-;1568:63;;1524:117;1319:329;;;;:::o;1654:351::-;1724:6;1773:2;1761:9;1752:7;1748:23;1744:32;1741:119;;;1779:79;;:::i;:::-;1741:119;1899:1;1924:64;1980:7;1971:6;1960:9;1956:22;1924:64;:::i;:::-;1914:74;;1870:128;1654:351;;;;:::o;2011:474::-;2079:6;2087;2136:2;2124:9;2115:7;2111:23;2107:32;2104:119;;;2142:79;;:::i;:::-;2104:119;2262:1;2287:53;2332:7;2323:6;2312:9;2308:22;2287:53;:::i;:::-;2277:63;;2233:117;2389:2;2415:53;2460:7;2451:6;2440:9;2436:22;2415:53;:::i;:::-;2405:63;;2360:118;2011:474;;;;;:::o;2491:619::-;2568:6;2576;2584;2633:2;2621:9;2612:7;2608:23;2604:32;2601:119;;;2639:79;;:::i;:::-;2601:119;2759:1;2784:53;2829:7;2820:6;2809:9;2805:22;2784:53;:::i;:::-;2774:63;;2730:117;2886:2;2912:53;2957:7;2948:6;2937:9;2933:22;2912:53;:::i;:::-;2902:63;;2857:118;3014:2;3040:53;3085:7;3076:6;3065:9;3061:22;3040:53;:::i;:::-;3030:63;;2985:118;2491:619;;;;;:::o;3116:468::-;3181:6;3189;3238:2;3226:9;3217:7;3213:23;3209:32;3206:119;;;3244:79;;:::i;:::-;3206:119;3364:1;3389:53;3434:7;3425:6;3414:9;3410:22;3389:53;:::i;:::-;3379:63;;3335:117;3491:2;3517:50;3559:7;3550:6;3539:9;3535:22;3517:50;:::i;:::-;3507:60;;3462:115;3116:468;;;;;:::o;3590:474::-;3658:6;3666;3715:2;3703:9;3694:7;3690:23;3686:32;3683:119;;;3721:79;;:::i;:::-;3683:119;3841:1;3866:53;3911:7;3902:6;3891:9;3887:22;3866:53;:::i;:::-;3856:63;;3812:117;3968:2;3994:53;4039:7;4030:6;4019:9;4015:22;3994:53;:::i;:::-;3984:63;;3939:118;3590:474;;;;;:::o;4070:559::-;4156:6;4164;4213:2;4201:9;4192:7;4188:23;4184:32;4181:119;;;4219:79;;:::i;:::-;4181:119;4367:1;4356:9;4352:17;4339:31;4397:18;4389:6;4386:30;4383:117;;;4419:79;;:::i;:::-;4383:117;4532:80;4604:7;4595:6;4584:9;4580:22;4532:80;:::i;:::-;4514:98;;;;4310:312;4070:559;;;;;:::o;4635:698::-;4727:6;4735;4743;4792:2;4780:9;4771:7;4767:23;4763:32;4760:119;;;4798:79;;:::i;:::-;4760:119;4946:1;4935:9;4931:17;4918:31;4976:18;4968:6;4965:30;4962:117;;;4998:79;;:::i;:::-;4962:117;5111:80;5183:7;5174:6;5163:9;5159:22;5111:80;:::i;:::-;5093:98;;;;4889:312;5240:2;5266:50;5308:7;5299:6;5288:9;5284:22;5266:50;:::i;:::-;5256:60;;5211:115;4635:698;;;;;:::o;5339:345::-;5406:6;5455:2;5443:9;5434:7;5430:23;5426:32;5423:119;;;5461:79;;:::i;:::-;5423:119;5581:1;5606:61;5659:7;5650:6;5639:9;5635:22;5606:61;:::i;:::-;5596:71;;5552:125;5339:345;;;;:::o;5690:329::-;5749:6;5798:2;5786:9;5777:7;5773:23;5769:32;5766:119;;;5804:79;;:::i;:::-;5766:119;5924:1;5949:53;5994:7;5985:6;5974:9;5970:22;5949:53;:::i;:::-;5939:63;;5895:117;5690:329;;;;:::o;6025:118::-;6112:24;6130:5;6112:24;:::i;:::-;6107:3;6100:37;6025:118;;:::o;6149:109::-;6230:21;6245:5;6230:21;:::i;:::-;6225:3;6218:34;6149:109;;:::o;6264:161::-;6366:52;6412:5;6366:52;:::i;:::-;6361:3;6354:65;6264:161;;:::o;6431:364::-;6519:3;6547:39;6580:5;6547:39;:::i;:::-;6602:71;6666:6;6661:3;6602:71;:::i;:::-;6595:78;;6682:52;6727:6;6722:3;6715:4;6708:5;6704:16;6682:52;:::i;:::-;6759:29;6781:6;6759:29;:::i;:::-;6754:3;6750:39;6743:46;;6523:272;6431:364;;;;:::o;6801:366::-;6943:3;6964:67;7028:2;7023:3;6964:67;:::i;:::-;6957:74;;7040:93;7129:3;7040:93;:::i;:::-;7158:2;7153:3;7149:12;7142:19;;6801:366;;;:::o;7173:::-;7315:3;7336:67;7400:2;7395:3;7336:67;:::i;:::-;7329:74;;7412:93;7501:3;7412:93;:::i;:::-;7530:2;7525:3;7521:12;7514:19;;7173:366;;;:::o;7545:::-;7687:3;7708:67;7772:2;7767:3;7708:67;:::i;:::-;7701:74;;7784:93;7873:3;7784:93;:::i;:::-;7902:2;7897:3;7893:12;7886:19;;7545:366;;;:::o;7917:::-;8059:3;8080:67;8144:2;8139:3;8080:67;:::i;:::-;8073:74;;8156:93;8245:3;8156:93;:::i;:::-;8274:2;8269:3;8265:12;8258:19;;7917:366;;;:::o;8289:::-;8431:3;8452:67;8516:2;8511:3;8452:67;:::i;:::-;8445:74;;8528:93;8617:3;8528:93;:::i;:::-;8646:2;8641:3;8637:12;8630:19;;8289:366;;;:::o;8661:::-;8803:3;8824:67;8888:2;8883:3;8824:67;:::i;:::-;8817:74;;8900:93;8989:3;8900:93;:::i;:::-;9018:2;9013:3;9009:12;9002:19;;8661:366;;;:::o;9033:::-;9175:3;9196:67;9260:2;9255:3;9196:67;:::i;:::-;9189:74;;9272:93;9361:3;9272:93;:::i;:::-;9390:2;9385:3;9381:12;9374:19;;9033:366;;;:::o;9405:::-;9547:3;9568:67;9632:2;9627:3;9568:67;:::i;:::-;9561:74;;9644:93;9733:3;9644:93;:::i;:::-;9762:2;9757:3;9753:12;9746:19;;9405:366;;;:::o;9777:::-;9919:3;9940:67;10004:2;9999:3;9940:67;:::i;:::-;9933:74;;10016:93;10105:3;10016:93;:::i;:::-;10134:2;10129:3;10125:12;10118:19;;9777:366;;;:::o;10149:::-;10291:3;10312:67;10376:2;10371:3;10312:67;:::i;:::-;10305:74;;10388:93;10477:3;10388:93;:::i;:::-;10506:2;10501:3;10497:12;10490:19;;10149:366;;;:::o;10521:::-;10663:3;10684:67;10748:2;10743:3;10684:67;:::i;:::-;10677:74;;10760:93;10849:3;10760:93;:::i;:::-;10878:2;10873:3;10869:12;10862:19;;10521:366;;;:::o;10893:::-;11035:3;11056:67;11120:2;11115:3;11056:67;:::i;:::-;11049:74;;11132:93;11221:3;11132:93;:::i;:::-;11250:2;11245:3;11241:12;11234:19;;10893:366;;;:::o;11265:::-;11407:3;11428:67;11492:2;11487:3;11428:67;:::i;:::-;11421:74;;11504:93;11593:3;11504:93;:::i;:::-;11622:2;11617:3;11613:12;11606:19;;11265:366;;;:::o;11637:::-;11779:3;11800:67;11864:2;11859:3;11800:67;:::i;:::-;11793:74;;11876:93;11965:3;11876:93;:::i;:::-;11994:2;11989:3;11985:12;11978:19;;11637:366;;;:::o;12009:::-;12151:3;12172:67;12236:2;12231:3;12172:67;:::i;:::-;12165:74;;12248:93;12337:3;12248:93;:::i;:::-;12366:2;12361:3;12357:12;12350:19;;12009:366;;;:::o;12381:::-;12523:3;12544:67;12608:2;12603:3;12544:67;:::i;:::-;12537:74;;12620:93;12709:3;12620:93;:::i;:::-;12738:2;12733:3;12729:12;12722:19;;12381:366;;;:::o;12753:::-;12895:3;12916:67;12980:2;12975:3;12916:67;:::i;:::-;12909:74;;12992:93;13081:3;12992:93;:::i;:::-;13110:2;13105:3;13101:12;13094:19;;12753:366;;;:::o;13125:::-;13267:3;13288:67;13352:2;13347:3;13288:67;:::i;:::-;13281:74;;13364:93;13453:3;13364:93;:::i;:::-;13482:2;13477:3;13473:12;13466:19;;13125:366;;;:::o;13497:::-;13639:3;13660:67;13724:2;13719:3;13660:67;:::i;:::-;13653:74;;13736:93;13825:3;13736:93;:::i;:::-;13854:2;13849:3;13845:12;13838:19;;13497:366;;;:::o;13869:::-;14011:3;14032:67;14096:2;14091:3;14032:67;:::i;:::-;14025:74;;14108:93;14197:3;14108:93;:::i;:::-;14226:2;14221:3;14217:12;14210:19;;13869:366;;;:::o;14241:::-;14383:3;14404:67;14468:2;14463:3;14404:67;:::i;:::-;14397:74;;14480:93;14569:3;14480:93;:::i;:::-;14598:2;14593:3;14589:12;14582:19;;14241:366;;;:::o;14613:118::-;14700:24;14718:5;14700:24;:::i;:::-;14695:3;14688:37;14613:118;;:::o;14737:112::-;14820:22;14836:5;14820:22;:::i;:::-;14815:3;14808:35;14737:112;;:::o;14855:222::-;14948:4;14986:2;14975:9;14971:18;14963:26;;14999:71;15067:1;15056:9;15052:17;15043:6;14999:71;:::i;:::-;14855:222;;;;:::o;15083:332::-;15204:4;15242:2;15231:9;15227:18;15219:26;;15255:71;15323:1;15312:9;15308:17;15299:6;15255:71;:::i;:::-;15336:72;15404:2;15393:9;15389:18;15380:6;15336:72;:::i;:::-;15083:332;;;;;:::o;15421:442::-;15570:4;15608:2;15597:9;15593:18;15585:26;;15621:71;15689:1;15678:9;15674:17;15665:6;15621:71;:::i;:::-;15702:72;15770:2;15759:9;15755:18;15746:6;15702:72;:::i;:::-;15784;15852:2;15841:9;15837:18;15828:6;15784:72;:::i;:::-;15421:442;;;;;;:::o;15869:210::-;15956:4;15994:2;15983:9;15979:18;15971:26;;16007:65;16069:1;16058:9;16054:17;16045:6;16007:65;:::i;:::-;15869:210;;;;:::o;16085:252::-;16193:4;16231:2;16220:9;16216:18;16208:26;;16244:86;16327:1;16316:9;16312:17;16303:6;16244:86;:::i;:::-;16085:252;;;;:::o;16343:313::-;16456:4;16494:2;16483:9;16479:18;16471:26;;16543:9;16537:4;16533:20;16529:1;16518:9;16514:17;16507:47;16571:78;16644:4;16635:6;16571:78;:::i;:::-;16563:86;;16343:313;;;;:::o;16662:419::-;16828:4;16866:2;16855:9;16851:18;16843:26;;16915:9;16909:4;16905:20;16901:1;16890:9;16886:17;16879:47;16943:131;17069:4;16943:131;:::i;:::-;16935:139;;16662:419;;;:::o;17087:::-;17253:4;17291:2;17280:9;17276:18;17268:26;;17340:9;17334:4;17330:20;17326:1;17315:9;17311:17;17304:47;17368:131;17494:4;17368:131;:::i;:::-;17360:139;;17087:419;;;:::o;17512:::-;17678:4;17716:2;17705:9;17701:18;17693:26;;17765:9;17759:4;17755:20;17751:1;17740:9;17736:17;17729:47;17793:131;17919:4;17793:131;:::i;:::-;17785:139;;17512:419;;;:::o;17937:::-;18103:4;18141:2;18130:9;18126:18;18118:26;;18190:9;18184:4;18180:20;18176:1;18165:9;18161:17;18154:47;18218:131;18344:4;18218:131;:::i;:::-;18210:139;;17937:419;;;:::o;18362:::-;18528:4;18566:2;18555:9;18551:18;18543:26;;18615:9;18609:4;18605:20;18601:1;18590:9;18586:17;18579:47;18643:131;18769:4;18643:131;:::i;:::-;18635:139;;18362:419;;;:::o;18787:::-;18953:4;18991:2;18980:9;18976:18;18968:26;;19040:9;19034:4;19030:20;19026:1;19015:9;19011:17;19004:47;19068:131;19194:4;19068:131;:::i;:::-;19060:139;;18787:419;;;:::o;19212:::-;19378:4;19416:2;19405:9;19401:18;19393:26;;19465:9;19459:4;19455:20;19451:1;19440:9;19436:17;19429:47;19493:131;19619:4;19493:131;:::i;:::-;19485:139;;19212:419;;;:::o;19637:::-;19803:4;19841:2;19830:9;19826:18;19818:26;;19890:9;19884:4;19880:20;19876:1;19865:9;19861:17;19854:47;19918:131;20044:4;19918:131;:::i;:::-;19910:139;;19637:419;;;:::o;20062:::-;20228:4;20266:2;20255:9;20251:18;20243:26;;20315:9;20309:4;20305:20;20301:1;20290:9;20286:17;20279:47;20343:131;20469:4;20343:131;:::i;:::-;20335:139;;20062:419;;;:::o;20487:::-;20653:4;20691:2;20680:9;20676:18;20668:26;;20740:9;20734:4;20730:20;20726:1;20715:9;20711:17;20704:47;20768:131;20894:4;20768:131;:::i;:::-;20760:139;;20487:419;;;:::o;20912:::-;21078:4;21116:2;21105:9;21101:18;21093:26;;21165:9;21159:4;21155:20;21151:1;21140:9;21136:17;21129:47;21193:131;21319:4;21193:131;:::i;:::-;21185:139;;20912:419;;;:::o;21337:::-;21503:4;21541:2;21530:9;21526:18;21518:26;;21590:9;21584:4;21580:20;21576:1;21565:9;21561:17;21554:47;21618:131;21744:4;21618:131;:::i;:::-;21610:139;;21337:419;;;:::o;21762:::-;21928:4;21966:2;21955:9;21951:18;21943:26;;22015:9;22009:4;22005:20;22001:1;21990:9;21986:17;21979:47;22043:131;22169:4;22043:131;:::i;:::-;22035:139;;21762:419;;;:::o;22187:::-;22353:4;22391:2;22380:9;22376:18;22368:26;;22440:9;22434:4;22430:20;22426:1;22415:9;22411:17;22404:47;22468:131;22594:4;22468:131;:::i;:::-;22460:139;;22187:419;;;:::o;22612:::-;22778:4;22816:2;22805:9;22801:18;22793:26;;22865:9;22859:4;22855:20;22851:1;22840:9;22836:17;22829:47;22893:131;23019:4;22893:131;:::i;:::-;22885:139;;22612:419;;;:::o;23037:::-;23203:4;23241:2;23230:9;23226:18;23218:26;;23290:9;23284:4;23280:20;23276:1;23265:9;23261:17;23254:47;23318:131;23444:4;23318:131;:::i;:::-;23310:139;;23037:419;;;:::o;23462:::-;23628:4;23666:2;23655:9;23651:18;23643:26;;23715:9;23709:4;23705:20;23701:1;23690:9;23686:17;23679:47;23743:131;23869:4;23743:131;:::i;:::-;23735:139;;23462:419;;;:::o;23887:::-;24053:4;24091:2;24080:9;24076:18;24068:26;;24140:9;24134:4;24130:20;24126:1;24115:9;24111:17;24104:47;24168:131;24294:4;24168:131;:::i;:::-;24160:139;;23887:419;;;:::o;24312:::-;24478:4;24516:2;24505:9;24501:18;24493:26;;24565:9;24559:4;24555:20;24551:1;24540:9;24536:17;24529:47;24593:131;24719:4;24593:131;:::i;:::-;24585:139;;24312:419;;;:::o;24737:::-;24903:4;24941:2;24930:9;24926:18;24918:26;;24990:9;24984:4;24980:20;24976:1;24965:9;24961:17;24954:47;25018:131;25144:4;25018:131;:::i;:::-;25010:139;;24737:419;;;:::o;25162:::-;25328:4;25366:2;25355:9;25351:18;25343:26;;25415:9;25409:4;25405:20;25401:1;25390:9;25386:17;25379:47;25443:131;25569:4;25443:131;:::i;:::-;25435:139;;25162:419;;;:::o;25587:222::-;25680:4;25718:2;25707:9;25703:18;25695:26;;25731:71;25799:1;25788:9;25784:17;25775:6;25731:71;:::i;:::-;25587:222;;;;:::o;25815:214::-;25904:4;25942:2;25931:9;25927:18;25919:26;;25955:67;26019:1;26008:9;26004:17;25995:6;25955:67;:::i;:::-;25815:214;;;;:::o;26116:99::-;26168:6;26202:5;26196:12;26186:22;;26116:99;;;:::o;26221:169::-;26305:11;26339:6;26334:3;26327:19;26379:4;26374:3;26370:14;26355:29;;26221:169;;;;:::o;26396:305::-;26436:3;26455:20;26473:1;26455:20;:::i;:::-;26450:25;;26489:20;26507:1;26489:20;:::i;:::-;26484:25;;26643:1;26575:66;26571:74;26568:1;26565:81;26562:107;;;26649:18;;:::i;:::-;26562:107;26693:1;26690;26686:9;26679:16;;26396:305;;;;:::o;26707:185::-;26747:1;26764:20;26782:1;26764:20;:::i;:::-;26759:25;;26798:20;26816:1;26798:20;:::i;:::-;26793:25;;26837:1;26827:35;;26842:18;;:::i;:::-;26827:35;26884:1;26881;26877:9;26872:14;;26707:185;;;;:::o;26898:348::-;26938:7;26961:20;26979:1;26961:20;:::i;:::-;26956:25;;26995:20;27013:1;26995:20;:::i;:::-;26990:25;;27183:1;27115:66;27111:74;27108:1;27105:81;27100:1;27093:9;27086:17;27082:105;27079:131;;;27190:18;;:::i;:::-;27079:131;27238:1;27235;27231:9;27220:20;;26898:348;;;;:::o;27252:191::-;27292:4;27312:20;27330:1;27312:20;:::i;:::-;27307:25;;27346:20;27364:1;27346:20;:::i;:::-;27341:25;;27385:1;27382;27379:8;27376:34;;;27390:18;;:::i;:::-;27376:34;27435:1;27432;27428:9;27420:17;;27252:191;;;;:::o;27449:96::-;27486:7;27515:24;27533:5;27515:24;:::i;:::-;27504:35;;27449:96;;;:::o;27551:90::-;27585:7;27628:5;27621:13;27614:21;27603:32;;27551:90;;;:::o;27647:126::-;27684:7;27724:42;27717:5;27713:54;27702:65;;27647:126;;;:::o;27779:77::-;27816:7;27845:5;27834:16;;27779:77;;;:::o;27862:86::-;27897:7;27937:4;27930:5;27926:16;27915:27;;27862:86;;;:::o;27954:141::-;28019:9;28052:37;28083:5;28052:37;:::i;:::-;28039:50;;27954:141;;;:::o;28101:126::-;28151:9;28184:37;28215:5;28184:37;:::i;:::-;28171:50;;28101:126;;;:::o;28233:113::-;28283:9;28316:24;28334:5;28316:24;:::i;:::-;28303:37;;28233:113;;;:::o;28352:307::-;28420:1;28430:113;28444:6;28441:1;28438:13;28430:113;;;28529:1;28524:3;28520:11;28514:18;28510:1;28505:3;28501:11;28494:39;28466:2;28463:1;28459:10;28454:15;;28430:113;;;28561:6;28558:1;28555:13;28552:101;;;28641:1;28632:6;28627:3;28623:16;28616:27;28552:101;28401:258;28352:307;;;:::o;28665:320::-;28709:6;28746:1;28740:4;28736:12;28726:22;;28793:1;28787:4;28783:12;28814:18;28804:81;;28870:4;28862:6;28858:17;28848:27;;28804:81;28932:2;28924:6;28921:14;28901:18;28898:38;28895:84;;;28951:18;;:::i;:::-;28895:84;28716:269;28665:320;;;:::o;28991:233::-;29030:3;29053:24;29071:5;29053:24;:::i;:::-;29044:33;;29099:66;29092:5;29089:77;29086:103;;;29169:18;;:::i;:::-;29086:103;29216:1;29209:5;29205:13;29198:20;;28991:233;;;:::o;29230:180::-;29278:77;29275:1;29268:88;29375:4;29372:1;29365:15;29399:4;29396:1;29389:15;29416:180;29464:77;29461:1;29454:88;29561:4;29558:1;29551:15;29585:4;29582:1;29575:15;29602:180;29650:77;29647:1;29640:88;29747:4;29744:1;29737:15;29771:4;29768:1;29761:15;29788:180;29836:77;29833:1;29826:88;29933:4;29930:1;29923:15;29957:4;29954:1;29947:15;29974:117;30083:1;30080;30073:12;30097:117;30206:1;30203;30196:12;30220:117;30329:1;30326;30319:12;30343:117;30452:1;30449;30442:12;30466:117;30575:1;30572;30565:12;30589:102;30630:6;30681:2;30677:7;30672:2;30665:5;30661:14;30657:28;30647:38;;30589:102;;;:::o;30697:222::-;30837:34;30833:1;30825:6;30821:14;30814:58;30906:5;30901:2;30893:6;30889:15;30882:30;30697:222;:::o;30925:168::-;31065:20;31061:1;31053:6;31049:14;31042:44;30925:168;:::o;31099:::-;31239:20;31235:1;31227:6;31223:14;31216:44;31099:168;:::o;31273:221::-;31413:34;31409:1;31401:6;31397:14;31390:58;31482:4;31477:2;31469:6;31465:15;31458:29;31273:221;:::o;31500:225::-;31640:34;31636:1;31628:6;31624:14;31617:58;31709:8;31704:2;31696:6;31692:15;31685:33;31500:225;:::o;31731:221::-;31871:34;31867:1;31859:6;31855:14;31848:58;31940:4;31935:2;31927:6;31923:15;31916:29;31731:221;:::o;31958:225::-;32098:34;32094:1;32086:6;32082:14;32075:58;32167:8;32162:2;32154:6;32150:15;32143:33;31958:225;:::o;32189:171::-;32329:23;32325:1;32317:6;32313:14;32306:47;32189:171;:::o;32366:221::-;32506:34;32502:1;32494:6;32490:14;32483:58;32575:4;32570:2;32562:6;32558:15;32551:29;32366:221;:::o;32593:177::-;32733:29;32729:1;32721:6;32717:14;32710:53;32593:177;:::o;32776:166::-;32916:18;32912:1;32904:6;32900:14;32893:42;32776:166;:::o;32948:167::-;33088:19;33084:1;33076:6;33072:14;33065:43;32948:167;:::o;33121:227::-;33261:34;33257:1;33249:6;33245:14;33238:58;33330:10;33325:2;33317:6;33313:15;33306:35;33121:227;:::o;33354:182::-;33494:34;33490:1;33482:6;33478:14;33471:58;33354:182;:::o;33542:175::-;33682:27;33678:1;33670:6;33666:14;33659:51;33542:175;:::o;33723:220::-;33863:34;33859:1;33851:6;33847:14;33840:58;33932:3;33927:2;33919:6;33915:15;33908:28;33723:220;:::o;33949:224::-;34089:34;34085:1;34077:6;34073:14;34066:58;34158:7;34153:2;34145:6;34141:15;34134:32;33949:224;:::o;34179:223::-;34319:34;34315:1;34307:6;34303:14;34296:58;34388:6;34383:2;34375:6;34371:15;34364:31;34179:223;:::o;34408:181::-;34548:33;34544:1;34536:6;34532:14;34525:57;34408:181;:::o;34595:224::-;34735:34;34731:1;34723:6;34719:14;34712:58;34804:7;34799:2;34791:6;34787:15;34780:32;34595:224;:::o;34825:181::-;34965:33;34961:1;34953:6;34949:14;34942:57;34825:181;:::o;35012:122::-;35085:24;35103:5;35085:24;:::i;:::-;35078:5;35075:35;35065:63;;35124:1;35121;35114:12;35065:63;35012:122;:::o;35140:116::-;35210:21;35225:5;35210:21;:::i;:::-;35203:5;35200:32;35190:60;;35246:1;35243;35236:12;35190:60;35140:116;:::o;35262:122::-;35335:24;35353:5;35335:24;:::i;:::-;35328:5;35325:35;35315:63;;35374:1;35371;35364:12;35315:63;35262:122;:::o

Swarm Source

ipfs://fe6db35379538b50de52d41566022dd0d22b4bac15536b7537c802b845f013b6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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