Token

 

Overview ERC-1155

Total Supply:
0 N/A

Holders:
2 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MWSWORDS1155

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-20
*/

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


// OpenZeppelin Contracts (last updated v4.8.0) (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() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

    function _nonReentrantAfter() private {
        // 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/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/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 (last updated v4.7.0) (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 Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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: @openzeppelin/contracts/token/ERC20/ERC20.sol


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

pragma solidity ^0.8.0;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/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/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

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

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

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

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );

        _burnBatch(account, ids, values);
    }
}

// File: contracts/1_Storage.sol


pragma solidity ^0.8.4;









contract MWSWORDS1155 is ERC1155, Ownable, Pausable, ERC1155Burnable, ERC1155Supply, ReentrancyGuard {
            uint256 public cost = 50 ether;
            IERC20 public token;

    // Mapping for setting our string as URI
    mapping (uint256 => string) private _tokenUri;


    constructor(address _token) ERC1155("MWSWORDS, MWSRD") {token = IERC20(_token);}

        // Function to mint our NFTs
        function mint(address account, uint256 id, uint256 amount, bytes memory data) public nonReentrant()
         {
            address sender = _msgSender();
            uint256 _totalCost = cost;

            if (sender != owner()) {
            require(token.balanceOf(sender) >= _totalCost, "BAL TOO LOW");
            token.transferFrom(_msgSender(), address(this), _totalCost);
            _mint(account, id, amount, data);
         }

         }
        function uri (uint256 tokenId) override public view returns (string memory) {
            return (_tokenUri[tokenId]);
        }

        // We can use this function to manually set the URIs for NFTs
        function setTokenUri(uint256 tokenId, string memory uri) public onlyOwner {
            _tokenUri[tokenId] = uri;
        }

        function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
        }

        function pause() public onlyOwner {
        _pause();
        }

        function withdrawTokens(
            IERC20 _token,
            uint256 _amount,
            address _to
        ) external onlyOwner {
            _token.transfer(_to, _amount);
        }

        function unpause() public onlyOwner {
        _unpause();
        }

        function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        internal
        whenNotPaused
        override(ERC1155, ERC1155Supply)
        {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
        }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526802b5e3af16b18800006006553480156200001e57600080fd5b50604051620026f9380380620026f983398101604081905262000041916200011a565b60408051808201909152600f81526e1355d4d5d3d49114cb081355d4d491608a1b60208201526200007281620000b6565b506200007e33620000c8565b6003805460ff60a01b191690556001600555600780546001600160a01b0319166001600160a01b0392909216919091179055620002bd565b6002620000c48282620001f1565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000602082840312156200012d57600080fd5b81516001600160a01b03811681146200014557600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200017757607f821691505b6020821081036200019857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001ec57600081815260208120601f850160051c81016020861015620001c75750805b601f850160051c820191505b81811015620001e857828155600101620001d3565b5050505b505050565b81516001600160401b038111156200020d576200020d6200014c565b62000225816200021e845462000162565b846200019e565b602080601f8311600181146200025d5760008415620002445750858301515b600019600386901b1c1916600185901b178555620001e8565b600085815260208120601f198616915b828110156200028e578886015182559484019460019091019084016200026d565b5085821015620002ad5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61242c80620002cd6000396000f3fe608060405234801561001057600080fd5b50600436106101575760003560e01c8063715018a6116100c3578063bd85b0391161007c578063bd85b039146102e6578063e985e9c514610306578063f242432a14610342578063f2fde38b14610355578063f5298aca14610368578063fc0c546a1461037b57600080fd5b8063715018a614610278578063731133e9146102805780638456cb59146102935780638da5cb5b1461029b5780639bc5c509146102c0578063a22cb465146102d357600080fd5b806344a0d68a1161011557806344a0d68a146101eb5780634e1273f4146101fe5780634f558e791461021e57806357f7789e146102405780635c975abb146102535780636b20c4541461026557600080fd5b8062fdd58e1461015c57806301ffc9a7146101825780630e89341c146101a557806313faede6146101c55780632eb2c2d6146101ce5780633f4ba83a146101e3575b600080fd5b61016f61016a36600461180d565b61038e565b6040519081526020015b60405180910390f35b61019561019036600461184f565b610427565b6040519015158152602001610179565b6101b86101b3366004611873565b610477565b60405161017991906118d2565b61016f60065481565b6101e16101dc366004611a3b565b610519565b005b6101e1610565565b6101e16101f9366004611873565b610577565b61021161020c366004611ae9565b610584565b6040516101799190611bf1565b61019561022c366004611873565b600090815260046020526040902054151590565b6101e161024e366004611c04565b6106ae565b600354600160a01b900460ff16610195565b6101e1610273366004611c55565b6106d3565b6101e1610716565b6101e161028e366004611ccb565b610728565b6101e161089a565b6003546001600160a01b03165b6040516001600160a01b039091168152602001610179565b6101e16102ce366004611d2e565b6108aa565b6101e16102e1366004611d7e565b610925565b61016f6102f4366004611873565b60009081526004602052604090205490565b610195610314366004611db7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101e1610350366004611de5565b610934565b6101e1610363366004611e4e565b610979565b6101e1610376366004611e6b565b6109f2565b6007546102a8906001600160a01b031681565b60006001600160a01b0383166103fe5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061045857506001600160e01b031982166303a24d0760e21b145b8061042157506301ffc9a760e01b6001600160e01b0319831614610421565b600081815260086020526040902080546060919061049490611ea0565b80601f01602080910402602001604051908101604052809291908181526020018280546104c090611ea0565b801561050d5780601f106104e25761010080835404028352916020019161050d565b820191906000526020600020905b8154815290600101906020018083116104f057829003601f168201915b50505050509050919050565b6001600160a01b03851633148061053557506105358533610314565b6105515760405162461bcd60e51b81526004016103f590611eda565b61055e8585858585610a35565b5050505050565b61056d610bdf565b610575610c39565b565b61057f610bdf565b600655565b606081518351146105e95760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103f5565b6000835167ffffffffffffffff811115610605576106056118e5565b60405190808252806020026020018201604052801561062e578160200160208202803683370190505b50905060005b84518110156106a65761067985828151811061065257610652611f28565b602002602001015185838151811061066c5761066c611f28565b602002602001015161038e565b82828151811061068b5761068b611f28565b602090810291909101015261069f81611f54565b9050610634565b509392505050565b6106b6610bdf565b60008281526008602052604090206106ce8282611fb3565b505050565b6001600160a01b0383163314806106ef57506106ef8333610314565b61070b5760405162461bcd60e51b81526004016103f590611eda565b6106ce838383610c8e565b61071e610bdf565b6105756000610e2a565b610730610e7c565b6006546003543391906001600160a01b03168214610888576007546040516370a0823160e01b81526001600160a01b038481166004830152839216906370a0823190602401602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b69190612073565b10156107f25760405162461bcd60e51b815260206004820152600b60248201526a42414c20544f4f204c4f5760a81b60448201526064016103f5565b6007546001600160a01b03166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018490526064016020604051808303816000875af1158015610857573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087b919061208c565b5061088886868686610ed5565b50506108946001600555565b50505050565b6108a2610bdf565b610575610ff8565b6108b2610bdf565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284169063a9059cbb906044016020604051808303816000875af1158015610901573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610894919061208c565b61093033838361103b565b5050565b6001600160a01b03851633148061095057506109508533610314565b61096c5760405162461bcd60e51b81526004016103f590611eda565b61055e858585858561111b565b610981610bdf565b6001600160a01b0381166109e65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f5565b6109ef81610e2a565b50565b6001600160a01b038316331480610a0e5750610a0e8333610314565b610a2a5760405162461bcd60e51b81526004016103f590611eda565b6106ce838383611253565b8151835114610a565760405162461bcd60e51b81526004016103f5906120a9565b6001600160a01b038416610a7c5760405162461bcd60e51b81526004016103f5906120f1565b33610a8b81878787878761136b565b60005b8451811015610b71576000858281518110610aab57610aab611f28565b602002602001015190506000858381518110610ac957610ac9611f28565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610b195760405162461bcd60e51b81526004016103f590612136565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610b56908490612180565b9250508190555050505080610b6a90611f54565b9050610a8e565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610bc1929190612193565b60405180910390a4610bd7818787878787611381565b505050505050565b6003546001600160a01b031633146105755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103f5565b610c416114dc565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038316610cb45760405162461bcd60e51b81526004016103f5906121c1565b8051825114610cd55760405162461bcd60e51b81526004016103f5906120a9565b6000339050610cf88185600086866040518060200160405280600081525061136b565b60005b8351811015610dbd576000848281518110610d1857610d18611f28565b602002602001015190506000848381518110610d3657610d36611f28565b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015610d865760405162461bcd60e51b81526004016103f590612204565b6000928352602083815260408085206001600160a01b038b1686529091529092209103905580610db581611f54565b915050610cfb565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051610e0e929190612193565b60405180910390a4604080516020810190915260009052610894565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600260055403610ece5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103f5565b6002600555565b6001600160a01b038416610f355760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016103f5565b336000610f418561152c565b90506000610f4e8561152c565b9050610f5f8360008985858961136b565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290610f8f908490612180565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610fef83600089898989611577565b50505050505050565b611000611632565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610c713390565b816001600160a01b0316836001600160a01b0316036110ae5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103f5565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166111415760405162461bcd60e51b81526004016103f5906120f1565b33600061114d8561152c565b9050600061115a8561152c565b905061116a83898985858961136b565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156111ab5760405162461bcd60e51b81526004016103f590612136565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906111e8908490612180565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611248848a8a8a8a8a611577565b505050505050505050565b6001600160a01b0383166112795760405162461bcd60e51b81526004016103f5906121c1565b3360006112858461152c565b905060006112928461152c565b90506112b28387600085856040518060200160405280600081525061136b565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156112f35760405162461bcd60e51b81526004016103f590612204565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052610fef565b611373611632565b610bd786868686868661167f565b6001600160a01b0384163b15610bd75760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906113c59089908990889088908890600401612248565b6020604051808303816000875af1925050508015611400575060408051601f3d908101601f191682019092526113fd918101906122a6565b60015b6114ac5761140c6122c3565b806308c379a00361144557506114206122df565b8061142b5750611447565b8060405162461bcd60e51b81526004016103f591906118d2565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103f5565b6001600160e01b0319811663bc197c8160e01b14610fef5760405162461bcd60e51b81526004016103f590612369565b600354600160a01b900460ff166105755760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103f5565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061156657611566611f28565b602090810291909101015292915050565b6001600160a01b0384163b15610bd75760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906115bb90899089908890889088906004016123b1565b6020604051808303816000875af19250505080156115f6575060408051601f3d908101601f191682019092526115f3918101906122a6565b60015b6116025761140c6122c3565b6001600160e01b0319811663f23a6e6160e01b14610fef5760405162461bcd60e51b81526004016103f590612369565b600354600160a01b900460ff16156105755760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103f5565b6001600160a01b0385166117065760005b8351811015611704578281815181106116ab576116ab611f28565b6020026020010151600460008684815181106116c9576116c9611f28565b6020026020010151815260200190815260200160002060008282546116ee9190612180565b909155506116fd905081611f54565b9050611690565b505b6001600160a01b038416610bd75760005b8351811015610fef57600084828151811061173457611734611f28565b60200260200101519050600084838151811061175257611752611f28565b60200260200101519050600060046000848152602001908152602001600020549050818110156117d55760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b60648201526084016103f5565b600092835260046020526040909220910390556117f181611f54565b9050611717565b6001600160a01b03811681146109ef57600080fd5b6000806040838503121561182057600080fd5b823561182b816117f8565b946020939093013593505050565b6001600160e01b0319811681146109ef57600080fd5b60006020828403121561186157600080fd5b813561186c81611839565b9392505050565b60006020828403121561188557600080fd5b5035919050565b6000815180845260005b818110156118b257602081850181015186830182015201611896565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061186c602083018461188c565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611921576119216118e5565b6040525050565b600067ffffffffffffffff821115611942576119426118e5565b5060051b60200190565b600082601f83011261195d57600080fd5b8135602061196a82611928565b60405161197782826118fb565b83815260059390931b850182019282810191508684111561199757600080fd5b8286015b848110156119b2578035835291830191830161199b565b509695505050505050565b600067ffffffffffffffff8311156119d7576119d76118e5565b6040516119ee601f8501601f1916602001826118fb565b809150838152848484011115611a0357600080fd5b83836020830137600060208583010152509392505050565b600082601f830112611a2c57600080fd5b61186c838335602085016119bd565b600080600080600060a08688031215611a5357600080fd5b8535611a5e816117f8565b94506020860135611a6e816117f8565b9350604086013567ffffffffffffffff80821115611a8b57600080fd5b611a9789838a0161194c565b94506060880135915080821115611aad57600080fd5b611ab989838a0161194c565b93506080880135915080821115611acf57600080fd5b50611adc88828901611a1b565b9150509295509295909350565b60008060408385031215611afc57600080fd5b823567ffffffffffffffff80821115611b1457600080fd5b818501915085601f830112611b2857600080fd5b81356020611b3582611928565b604051611b4282826118fb565b83815260059390931b8501820192828101915089841115611b6257600080fd5b948201945b83861015611b89578535611b7a816117f8565b82529482019490820190611b67565b96505086013592505080821115611b9f57600080fd5b50611bac8582860161194c565b9150509250929050565b600081518084526020808501945080840160005b83811015611be657815187529582019590820190600101611bca565b509495945050505050565b60208152600061186c6020830184611bb6565b60008060408385031215611c1757600080fd5b82359150602083013567ffffffffffffffff811115611c3557600080fd5b8301601f81018513611c4657600080fd5b611bac858235602084016119bd565b600080600060608486031215611c6a57600080fd5b8335611c75816117f8565b9250602084013567ffffffffffffffff80821115611c9257600080fd5b611c9e8783880161194c565b93506040860135915080821115611cb457600080fd5b50611cc18682870161194c565b9150509250925092565b60008060008060808587031215611ce157600080fd5b8435611cec816117f8565b93506020850135925060408501359150606085013567ffffffffffffffff811115611d1657600080fd5b611d2287828801611a1b565b91505092959194509250565b600080600060608486031215611d4357600080fd5b8335611d4e816117f8565b9250602084013591506040840135611d65816117f8565b809150509250925092565b80151581146109ef57600080fd5b60008060408385031215611d9157600080fd5b8235611d9c816117f8565b91506020830135611dac81611d70565b809150509250929050565b60008060408385031215611dca57600080fd5b8235611dd5816117f8565b91506020830135611dac816117f8565b600080600080600060a08688031215611dfd57600080fd5b8535611e08816117f8565b94506020860135611e18816117f8565b93506040860135925060608601359150608086013567ffffffffffffffff811115611e4257600080fd5b611adc88828901611a1b565b600060208284031215611e6057600080fd5b813561186c816117f8565b600080600060608486031215611e8057600080fd5b8335611e8b816117f8565b95602085013595506040909401359392505050565b600181811c90821680611eb457607f821691505b602082108103611ed457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611f6657611f66611f3e565b5060010190565b601f8211156106ce57600081815260208120601f850160051c81016020861015611f945750805b601f850160051c820191505b81811015610bd757828155600101611fa0565b815167ffffffffffffffff811115611fcd57611fcd6118e5565b611fe181611fdb8454611ea0565b84611f6d565b602080601f8311600181146120165760008415611ffe5750858301515b600019600386901b1c1916600185901b178555610bd7565b600085815260208120601f198616915b8281101561204557888601518255948401946001909101908401612026565b50858210156120635787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561208557600080fd5b5051919050565b60006020828403121561209e57600080fd5b815161186c81611d70565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b8082018082111561042157610421611f3e565b6040815260006121a66040830185611bb6565b82810360208401526121b88185611bb6565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061227490830186611bb6565b82810360608401526122868186611bb6565b9050828103608084015261229a818561188c565b98975050505050505050565b6000602082840312156122b857600080fd5b815161186c81611839565b600060033d11156122dc5760046000803e5060005160e01c5b90565b600060443d10156122ed5790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561231d57505050505090565b82850191508151818111156123355750505050505090565b843d870101602082850101111561234f5750505050505090565b61235e602082860101876118fb565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906123eb9083018461188c565b97965050505050505056fea2646970667358221220c69ce09832ff52f9ce227f6c5a173de88fa7df30fe44c9ef54df13e0cb9cf39064736f6c6343000811003300000000000000000000000087a5c9b60a3aaf1064006fe64285018e50e0d020

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

00000000000000000000000087a5c9b60a3aaf1064006fe64285018e50e0d020

-----Decoded View---------------
Arg [0] : _token (address): 0x87a5c9b60a3aaf1064006fe64285018e50e0d020

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000087a5c9b60a3aaf1064006fe64285018e50e0d020


Deployed ByteCode Sourcemap

65883:2030:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47046:230;;;;;;:::i;:::-;;:::i;:::-;;;616:25:1;;;604:2;589:18;47046:230:0;;;;;;;;46069:310;;;;;;:::i;:::-;;:::i;:::-;;;1203:14:1;;1196:22;1178:41;;1166:2;1151:18;46069:310:0;1038:187:1;66772:130:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65999:30::-;;;;;;48989:438;;;;;;:::i;:::-;;:::i;:::-;;67507:69;;;:::i;67122:90::-;;;;;;:::i;:::-;;:::i;47442:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63522:122::-;;;;;;:::i;:::-;63579:4;63400:16;;;:12;:16;;;;;;-1:-1:-1;;;63522:122:0;66985:125;;;;;;:::i;:::-;;:::i;9126:86::-;9197:7;;-1:-1:-1;;;9197:7:0;;;;9126:86;;65437:358;;;;;;:::i;:::-;;:::i;11991:103::-;;;:::i;66304:458::-;;;;;;:::i;:::-;;:::i;67224:65::-;;;:::i;11343:87::-;11416:6;;-1:-1:-1;;;;;11416:6:0;11343:87;;;-1:-1:-1;;;;;9152:32:1;;;9134:51;;9122:2;9107:18;11343:87:0;8988:203:1;67301:194:0;;;;;;:::i;:::-;;:::i;48039:155::-;;;;;;:::i;:::-;;:::i;63311:113::-;;;;;;:::i;:::-;63373:7;63400:16;;;:12;:16;;;;;;;63311:113;48266:168;;;;;;:::i;:::-;-1:-1:-1;;;;;48389:27:0;;;48365:4;48389:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;48266:168;48506:406;;;;;;:::i;:::-;;:::i;12249:201::-;;;;;;:::i;:::-;;:::i;65103:326::-;;;;;;:::i;:::-;;:::i;66044:19::-;;;;;-1:-1:-1;;;;;66044:19:0;;;47046:230;47132:7;-1:-1:-1;;;;;47160:21:0;;47152:76;;;;-1:-1:-1;;;47152:76:0;;12377:2:1;47152:76:0;;;12359:21:1;12416:2;12396:18;;;12389:30;12455:34;12435:18;;;12428:62;-1:-1:-1;;;12506:18:1;;;12499:40;12556:19;;47152:76:0;;;;;;;;;-1:-1:-1;47246:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;47246:22:0;;;;;;;;;;47046:230;;;;;:::o;46069:310::-;46171:4;-1:-1:-1;;;;;;46208:41:0;;-1:-1:-1;;;46208:41:0;;:110;;-1:-1:-1;;;;;;;46266:52:0;;-1:-1:-1;;;46266:52:0;46208:110;:163;;;-1:-1:-1;;;;;;;;;;37459:40:0;;;46335:36;37350:157;66772:130;66871:18;;;;:9;:18;;;;;66863:27;;66833:13;;66871:18;66863:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66772:130;;;:::o;48989:438::-;-1:-1:-1;;;;;49222:20:0;;7319:10;49222:20;;:60;;-1:-1:-1;49246:36:0;49263:4;7319:10;48266:168;:::i;49246:36::-;49200:156;;;;-1:-1:-1;;;49200:156:0;;;;;;;:::i;:::-;49367:52;49390:4;49396:2;49400:3;49405:7;49414:4;49367:22;:52::i;:::-;48989:438;;;;;:::o;67507:69::-;11229:13;:11;:13::i;:::-;67554:10:::1;:8;:10::i;:::-;67507:69::o:0;67122:90::-;11229:13;:11;:13::i;:::-;67185:4:::1;:15:::0;67122:90::o;47442:524::-;47598:16;47659:3;:10;47640:8;:15;:29;47632:83;;;;-1:-1:-1;;;47632:83:0;;13588:2:1;47632:83:0;;;13570:21:1;13627:2;13607:18;;;13600:30;13666:34;13646:18;;;13639:62;-1:-1:-1;;;13717:18:1;;;13710:39;13766:19;;47632:83:0;13386:405:1;47632:83:0;47728:30;47775:8;:15;47761:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47761:30:0;;47728:63;;47809:9;47804:122;47828:8;:15;47824:1;:19;47804:122;;;47884:30;47894:8;47903:1;47894:11;;;;;;;;:::i;:::-;;;;;;;47907:3;47911:1;47907:6;;;;;;;;:::i;:::-;;;;;;;47884:9;:30::i;:::-;47865:13;47879:1;47865:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;47845:3;;;:::i;:::-;;;47804:122;;;-1:-1:-1;47945:13:0;47442:524;-1:-1:-1;;;47442:524:0:o;66985:125::-;11229:13;:11;:13::i;:::-;67074:18:::1;::::0;;;:9:::1;:18;::::0;;;;:24:::1;67095:3:::0;67074:18;:24:::1;:::i;:::-;;66985:125:::0;;:::o;65437:358::-;-1:-1:-1;;;;;65602:23:0;;7319:10;65602:23;;:66;;-1:-1:-1;65629:39:0;65646:7;7319:10;48266:168;:::i;65629:39::-;65580:162;;;;-1:-1:-1;;;65580:162:0;;;;;;;:::i;:::-;65755:32;65766:7;65775:3;65780:6;65755:10;:32::i;11991:103::-;11229:13;:11;:13::i;:::-;12056:30:::1;12083:1;12056:18;:30::i;66304:458::-:0;2345:21;:19;:21::i;:::-;66494:4:::1;::::0;11416:6;;7319:10;;66494:4;-1:-1:-1;;;;;11416:6:0;66519:17;::::1;66515:233;;66561:5;::::0;:23:::1;::::0;-1:-1:-1;;;66561:23:0;;-1:-1:-1;;;;;9152:32:1;;;66561:23:0::1;::::0;::::1;9134:51:1::0;66588:10:0;;66561:5:::1;::::0;:15:::1;::::0;9107:18:1;;66561:23:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;66553:61;;;::::0;-1:-1:-1;;;66553:61:0;;16795:2:1;66553:61:0::1;::::0;::::1;16777:21:1::0;16834:2;16814:18;;;16807:30;-1:-1:-1;;;16853:18:1;;;16846:41;16904:18;;66553:61:0::1;16593:335:1::0;66553:61:0::1;66629:5;::::0;-1:-1:-1;;;;;66629:5:0::1;:18;7319:10:::0;66629:59:::1;::::0;-1:-1:-1;;;;;;66629:59:0::1;::::0;;;;;;-1:-1:-1;;;;;17191:15:1;;;66629:59:0::1;::::0;::::1;17173:34:1::0;66670:4:0::1;17223:18:1::0;;;17216:43;17275:18;;;17268:34;;;17108:18;;66629:59:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66703:32;66709:7;66718:2;66722:6;66730:4;66703:5;:32::i;:::-;66414:348;;2389:20:::0;1783:1;2909:7;:22;2726:213;2389:20;66304:458;;;;:::o;67224:65::-;11229:13;:11;:13::i;:::-;67269:8:::1;:6;:8::i;67301:194::-:0;11229:13;:11;:13::i;:::-;67454:29:::1;::::0;-1:-1:-1;;;67454:29:0;;-1:-1:-1;;;;;17755:32:1;;;67454:29:0::1;::::0;::::1;17737:51:1::0;17804:18;;;17797:34;;;67454:15:0;::::1;::::0;::::1;::::0;17710:18:1;;67454:29:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48039:155::-:0;48134:52;7319:10;48167:8;48177;48134:18;:52::i;:::-;48039:155;;:::o;48506:406::-;-1:-1:-1;;;;;48714:20:0;;7319:10;48714:20;;:60;;-1:-1:-1;48738:36:0;48755:4;7319:10;48266:168;:::i;48738:36::-;48692:156;;;;-1:-1:-1;;;48692:156:0;;;;;;;:::i;:::-;48859:45;48877:4;48883:2;48887;48891:6;48899:4;48859:17;:45::i;12249:201::-;11229:13;:11;:13::i;:::-;-1:-1:-1;;;;;12338:22:0;::::1;12330:73;;;::::0;-1:-1:-1;;;12330:73:0;;18044:2:1;12330:73:0::1;::::0;::::1;18026:21:1::0;18083:2;18063:18;;;18056:30;18122:34;18102:18;;;18095:62;-1:-1:-1;;;18173:18:1;;;18166:36;18219:19;;12330:73:0::1;17842:402:1::0;12330:73:0::1;12414:28;12433:8;12414:18;:28::i;:::-;12249:201:::0;:::o;65103:326::-;-1:-1:-1;;;;;65243:23:0;;7319:10;65243:23;;:66;;-1:-1:-1;65270:39:0;65287:7;7319:10;48266:168;:::i;65270:39::-;65221:162;;;;-1:-1:-1;;;65221:162:0;;;;;;;:::i;:::-;65396:25;65402:7;65411:2;65415:5;65396;:25::i;51223:1146::-;51450:7;:14;51436:3;:10;:28;51428:81;;;;-1:-1:-1;;;51428:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51528:16:0;;51520:66;;;;-1:-1:-1;;;51520:66:0;;;;;;;:::i;:::-;7319:10;51643:60;7319:10;51674:4;51680:2;51684:3;51689:7;51698:4;51643:20;:60::i;:::-;51721:9;51716:421;51740:3;:10;51736:1;:14;51716:421;;;51772:10;51785:3;51789:1;51785:6;;;;;;;;:::i;:::-;;;;;;;51772:19;;51806:14;51823:7;51831:1;51823:10;;;;;;;;:::i;:::-;;;;;;;;;;;;51850:19;51872:13;;;;;;;;;;-1:-1:-1;;;;;51872:19:0;;;;;;;;;;;;51823:10;;-1:-1:-1;51914:21:0;;;;51906:76;;;;-1:-1:-1;;;51906:76:0;;;;;;;:::i;:::-;52026:9;:13;;;;;;;;;;;-1:-1:-1;;;;;52026:19:0;;;;;;;;;;52048:20;;;52026:42;;52098:17;;;;;;;:27;;52048:20;;52026:9;52098:27;;52048:20;;52098:27;:::i;:::-;;;;;;;;51757:380;;;51752:3;;;;:::i;:::-;;;51716:421;;;;52184:2;-1:-1:-1;;;;;52154:47:0;52178:4;-1:-1:-1;;;;;52154:47:0;52168:8;-1:-1:-1;;;;;52154:47:0;;52188:3;52193:7;52154:47;;;;;;;:::i;:::-;;;;;;;;52286:75;52322:8;52332:4;52338:2;52342:3;52347:7;52356:4;52286:35;:75::i;:::-;51417:952;51223:1146;;;;;:::o;11508:132::-;11416:6;;-1:-1:-1;;;;;11416:6:0;7319:10;11572:23;11564:68;;;;-1:-1:-1;;;11564:68:0;;20277:2:1;11564:68:0;;;20259:21:1;;;20296:18;;;20289:30;20355:34;20335:18;;;20328:62;20407:18;;11564:68:0;20075:356:1;9981:120:0;8990:16;:14;:16::i;:::-;10040:7:::1;:15:::0;;-1:-1:-1;;;;10040:15:0::1;::::0;;10071:22:::1;7319:10:::0;10080:12:::1;10071:22;::::0;-1:-1:-1;;;;;9152:32:1;;;9134:51;;9122:2;9107:18;10071:22:0::1;;;;;;;9981:120::o:0;56988:969::-;-1:-1:-1;;;;;57140:18:0;;57132:66;;;;-1:-1:-1;;;57132:66:0;;;;;;;:::i;:::-;57231:7;:14;57217:3;:10;:28;57209:81;;;;-1:-1:-1;;;57209:81:0;;;;;;;:::i;:::-;57303:16;7319:10;57303:31;;57347:66;57368:8;57378:4;57392:1;57396:3;57401:7;57347:66;;;;;;;;;;;;:20;:66::i;:::-;57431:9;57426:373;57450:3;:10;57446:1;:14;57426:373;;;57482:10;57495:3;57499:1;57495:6;;;;;;;;:::i;:::-;;;;;;;57482:19;;57516:14;57533:7;57541:1;57533:10;;;;;;;;:::i;:::-;;;;;;;;;;;;57560:19;57582:13;;;;;;;;;;-1:-1:-1;;;;;57582:19:0;;;;;;;;;;;;57533:10;;-1:-1:-1;57624:21:0;;;;57616:70;;;;-1:-1:-1;;;57616:70:0;;;;;;;:::i;:::-;57730:9;:13;;;;;;;;;;;-1:-1:-1;;;;;57730:19:0;;;;;;;;;;57752:20;;57730:42;;57462:3;;;;:::i;:::-;;;;57426:373;;;;57854:1;-1:-1:-1;;;;;57816:55:0;57840:4;-1:-1:-1;;;;;57816:55:0;57830:8;-1:-1:-1;;;;;57816:55:0;;57858:3;57863:7;57816:55;;;;;;;:::i;:::-;;;;;;;;57884:65;;;;;;;;;57928:1;57884:65;;;51223:1146;12610:191;12703:6;;;-1:-1:-1;;;;;12720:17:0;;;-1:-1:-1;;;;;;12720:17:0;;;;;;;12753:40;;12703:6;;;12720:17;12703:6;;12753:40;;12684:16;;12753:40;12673:128;12610:191;:::o;2425:293::-;1827:1;2559:7;;:19;2551:63;;;;-1:-1:-1;;;2551:63:0;;21447:2:1;2551:63:0;;;21429:21:1;21486:2;21466:18;;;21459:30;21525:33;21505:18;;;21498:61;21576:18;;2551:63:0;21245:355:1;2551:63:0;1827:1;2692:7;:18;2425:293::o;53687:729::-;-1:-1:-1;;;;;53840:16:0;;53832:62;;;;-1:-1:-1;;;53832:62:0;;21807:2:1;53832:62:0;;;21789:21:1;21846:2;21826:18;;;21819:30;21885:34;21865:18;;;21858:62;-1:-1:-1;;;21936:18:1;;;21929:31;21977:19;;53832:62:0;21605:397:1;53832:62:0;7319:10;53907:16;53972:21;53990:2;53972:17;:21::i;:::-;53949:44;;54004:24;54031:25;54049:6;54031:17;:25::i;:::-;54004:52;;54069:66;54090:8;54108:1;54112:2;54116:3;54121:7;54130:4;54069:20;:66::i;:::-;54148:9;:13;;;;;;;;;;;-1:-1:-1;;;;;54148:17:0;;;;;;;;;:27;;54169:6;;54148:9;:27;;54169:6;;54148:27;:::i;:::-;;;;-1:-1:-1;;54191:52:0;;;22181:25:1;;;22237:2;22222:18;;22215:34;;;-1:-1:-1;;;;;54191:52:0;;;;54224:1;;54191:52;;;;;;22154:18:1;54191:52:0;;;;;;;54334:74;54365:8;54383:1;54387:2;54391;54395:6;54403:4;54334:30;:74::i;:::-;53821:595;;;53687:729;;;;:::o;9722:118::-;8731:19;:17;:19::i;:::-;9782:7:::1;:14:::0;;-1:-1:-1;;;;9782:14:0::1;-1:-1:-1::0;;;9782:14:0::1;::::0;;9812:20:::1;9819:12;7319:10:::0;;7239:98;58100:331;58255:8;-1:-1:-1;;;;;58246:17:0;:5;-1:-1:-1;;;;;58246:17:0;;58238:71;;;;-1:-1:-1;;;58238:71:0;;22462:2:1;58238:71:0;;;22444:21:1;22501:2;22481:18;;;22474:30;22540:34;22520:18;;;22513:62;-1:-1:-1;;;22591:18:1;;;22584:39;22640:19;;58238:71:0;22260:405:1;58238:71:0;-1:-1:-1;;;;;58320:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;58320:46:0;;;;;;;;;;58382:41;;1178::1;;;58382::0;;1151:18:1;58382:41:0;;;;;;;58100:331;;;:::o;49891:974::-;-1:-1:-1;;;;;50079:16:0;;50071:66;;;;-1:-1:-1;;;50071:66:0;;;;;;;:::i;:::-;7319:10;50150:16;50215:21;50233:2;50215:17;:21::i;:::-;50192:44;;50247:24;50274:25;50292:6;50274:17;:25::i;:::-;50247:52;;50312:60;50333:8;50343:4;50349:2;50353:3;50358:7;50367:4;50312:20;:60::i;:::-;50385:19;50407:13;;;;;;;;;;;-1:-1:-1;;;;;50407:19:0;;;;;;;;;;50445:21;;;;50437:76;;;;-1:-1:-1;;;50437:76:0;;;;;;;:::i;:::-;50549:9;:13;;;;;;;;;;;-1:-1:-1;;;;;50549:19:0;;;;;;;;;;50571:20;;;50549:42;;50613:17;;;;;;;:27;;50571:20;;50549:9;50613:27;;50571:20;;50613:27;:::i;:::-;;;;-1:-1:-1;;50658:46:0;;;22181:25:1;;;22237:2;22222:18;;22215:34;;;-1:-1:-1;;;;;50658:46:0;;;;;;;;;;;;;;22154:18:1;50658:46:0;;;;;;;50789:68;50820:8;50830:4;50836:2;50840;50844:6;50852:4;50789:30;:68::i;:::-;50060:805;;;;49891:974;;;;;:::o;55930:808::-;-1:-1:-1;;;;;56057:18:0;;56049:66;;;;-1:-1:-1;;;56049:66:0;;;;;;;:::i;:::-;7319:10;56128:16;56193:21;56211:2;56193:17;:21::i;:::-;56170:44;;56225:24;56252:25;56270:6;56252:17;:25::i;:::-;56225:52;;56290:66;56311:8;56321:4;56335:1;56339:3;56344:7;56290:66;;;;;;;;;;;;:20;:66::i;:::-;56369:19;56391:13;;;;;;;;;;;-1:-1:-1;;;;;56391:19:0;;;;;;;;;;56429:21;;;;56421:70;;;;-1:-1:-1;;;56421:70:0;;;;;;;:::i;:::-;56527:9;:13;;;;;;;;;;;-1:-1:-1;;;;;56527:19:0;;;;;;;;;;;;56549:20;;;56527:42;;56598:54;;22181:25:1;;;22222:18;;;22215:34;;;56527:19:0;;56598:54;;;;;;22154:18:1;56598:54:0;;;;;;;56665:65;;;;;;;;;56709:1;56665:65;;;51223:1146;67588:322;8731:19;:17;:19::i;:::-;67832:66:::1;67859:8;67869:4;67875:2;67879:3;67884:7;67893:4;67832:26;:66::i;61545:813::-:0;-1:-1:-1;;;;;61785:13:0;;27668:19;:23;61781:570;;61821:79;;-1:-1:-1;;;61821:79:0;;-1:-1:-1;;;;;61821:43:0;;;;;:79;;61865:8;;61875:4;;61881:3;;61886:7;;61895:4;;61821:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61821:79:0;;;;;;;;-1:-1:-1;;61821:79:0;;;;;;;;;;;;:::i;:::-;;;61817:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;62213:6;62206:14;;-1:-1:-1;;;62206:14:0;;;;;;;;:::i;61817:523::-;;;62262:62;;-1:-1:-1;;;62262:62:0;;24818:2:1;62262:62:0;;;24800:21:1;24857:2;24837:18;;;24830:30;24896:34;24876:18;;;24869:62;-1:-1:-1;;;24947:18:1;;;24940:50;25007:19;;62262:62:0;24616:416:1;61817:523:0;-1:-1:-1;;;;;;61982:60:0;;-1:-1:-1;;;61982:60:0;61978:159;;62067:50;;-1:-1:-1;;;62067:50:0;;;;;;;:::i;9470:108::-;9197:7;;-1:-1:-1;;;9197:7:0;;;;9529:41;;;;-1:-1:-1;;;9529:41:0;;25648:2:1;9529:41:0;;;25630:21:1;25687:2;25667:18;;;25660:30;-1:-1:-1;;;25706:18:1;;;25699:50;25766:18;;9529:41:0;25446:344:1;62366:198:0;62486:16;;;62500:1;62486:16;;;;;;;;;62432;;62461:22;;62486:16;;;;;;;;;;;;-1:-1:-1;62486:16:0;62461:41;;62524:7;62513:5;62519:1;62513:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;62551:5;62366:198;-1:-1:-1;;62366:198:0:o;60793:744::-;-1:-1:-1;;;;;61008:13:0;;27668:19;:23;61004:526;;61044:72;;-1:-1:-1;;;61044:72:0;;-1:-1:-1;;;;;61044:38:0;;;;;:72;;61083:8;;61093:4;;61099:2;;61103:6;;61111:4;;61044:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61044:72:0;;;;;;;;-1:-1:-1;;61044:72:0;;;;;;;;;;;;:::i;:::-;;;61040:479;;;;:::i;:::-;-1:-1:-1;;;;;;61166:55:0;;-1:-1:-1;;;61166:55:0;61162:154;;61246:50;;-1:-1:-1;;;61246:50:0;;;;;;;:::i;9285:108::-;9197:7;;-1:-1:-1;;;9197:7:0;;;;9355:9;9347:38;;;;-1:-1:-1;;;9347:38:0;;26563:2:1;9347:38:0;;;26545:21:1;26602:2;26582:18;;;26575:30;-1:-1:-1;;;26621:18:1;;;26614:46;26677:18;;9347:38:0;26361:340:1;63719:931:0;-1:-1:-1;;;;;64041:18:0;;64037:160;;64081:9;64076:110;64100:3;:10;64096:1;:14;64076:110;;;64160:7;64168:1;64160:10;;;;;;;;:::i;:::-;;;;;;;64136:12;:20;64149:3;64153:1;64149:6;;;;;;;;:::i;:::-;;;;;;;64136:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;64112:3:0;;-1:-1:-1;64112:3:0;;:::i;:::-;;;64076:110;;;;64037:160;-1:-1:-1;;;;;64213:16:0;;64209:434;;64251:9;64246:386;64270:3;:10;64266:1;:14;64246:386;;;64306:10;64319:3;64323:1;64319:6;;;;;;;;:::i;:::-;;;;;;;64306:19;;64344:14;64361:7;64369:1;64361:10;;;;;;;;:::i;:::-;;;;;;;64344:27;;64390:14;64407:12;:16;64420:2;64407:16;;;;;;;;;;;;64390:33;;64460:6;64450;:16;;64442:69;;;;-1:-1:-1;;;64442:69:0;;26908:2:1;64442:69:0;;;26890:21:1;26947:2;26927:18;;;26920:30;26986:34;26966:18;;;26959:62;-1:-1:-1;;;27037:18:1;;;27030:38;27085:19;;64442:69:0;26706:404:1;64442:69:0;64563:16;;;;:12;:16;;;;;;64582:15;;64563:34;;64282:3;;;:::i;:::-;;;64246:386;;14:131:1;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:1:o;652:131::-;-1:-1:-1;;;;;;726:32:1;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;:::-;1022:5;788:245;-1:-1:-1;;;788:245:1:o;1230:180::-;1289:6;1342:2;1330:9;1321:7;1317:23;1313:32;1310:52;;;1358:1;1355;1348:12;1310:52;-1:-1:-1;1381:23:1;;1230:180;-1:-1:-1;1230:180:1:o;1415:423::-;1457:3;1495:5;1489:12;1522:6;1517:3;1510:19;1547:1;1557:162;1571:6;1568:1;1565:13;1557:162;;;1633:4;1689:13;;;1685:22;;1679:29;1661:11;;;1657:20;;1650:59;1586:12;1557:162;;;1561:3;1764:1;1757:4;1748:6;1743:3;1739:16;1735:27;1728:38;1827:4;1820:2;1816:7;1811:2;1803:6;1799:15;1795:29;1790:3;1786:39;1782:50;1775:57;;;1415:423;;;;:::o;1843:220::-;1992:2;1981:9;1974:21;1955:4;2012:45;2053:2;2042:9;2038:18;2030:6;2012:45;:::i;2068:127::-;2129:10;2124:3;2120:20;2117:1;2110:31;2160:4;2157:1;2150:15;2184:4;2181:1;2174:15;2200:249;2310:2;2291:13;;-1:-1:-1;;2287:27:1;2275:40;;2345:18;2330:34;;2366:22;;;2327:62;2324:88;;;2392:18;;:::i;:::-;2428:2;2421:22;-1:-1:-1;;2200:249:1:o;2454:183::-;2514:4;2547:18;2539:6;2536:30;2533:56;;;2569:18;;:::i;:::-;-1:-1:-1;2614:1:1;2610:14;2626:4;2606:25;;2454:183::o;2642:724::-;2696:5;2749:3;2742:4;2734:6;2730:17;2726:27;2716:55;;2767:1;2764;2757:12;2716:55;2803:6;2790:20;2829:4;2852:43;2892:2;2852:43;:::i;:::-;2924:2;2918:9;2936:31;2964:2;2956:6;2936:31;:::i;:::-;3002:18;;;3094:1;3090:10;;;;3078:23;;3074:32;;;3036:15;;;;-1:-1:-1;3118:15:1;;;3115:35;;;3146:1;3143;3136:12;3115:35;3182:2;3174:6;3170:15;3194:142;3210:6;3205:3;3202:15;3194:142;;;3276:17;;3264:30;;3314:12;;;;3227;;3194:142;;;-1:-1:-1;3354:6:1;2642:724;-1:-1:-1;;;;;;2642:724:1:o;3371:468::-;3435:5;3469:18;3461:6;3458:30;3455:56;;;3491:18;;:::i;:::-;3540:2;3534:9;3552:69;3609:2;3588:15;;-1:-1:-1;;3584:29:1;3615:4;3580:40;3534:9;3552:69;:::i;:::-;3639:6;3630:15;;3669:6;3661;3654:22;3709:3;3700:6;3695:3;3691:16;3688:25;3685:45;;;3726:1;3723;3716:12;3685:45;3776:6;3771:3;3764:4;3756:6;3752:17;3739:44;3831:1;3824:4;3815:6;3807;3803:19;3799:30;3792:41;;3371:468;;;;;:::o;3844:220::-;3886:5;3939:3;3932:4;3924:6;3920:17;3916:27;3906:55;;3957:1;3954;3947:12;3906:55;3979:79;4054:3;4045:6;4032:20;4025:4;4017:6;4013:17;3979:79;:::i;4069:1071::-;4223:6;4231;4239;4247;4255;4308:3;4296:9;4287:7;4283:23;4279:33;4276:53;;;4325:1;4322;4315:12;4276:53;4364:9;4351:23;4383:31;4408:5;4383:31;:::i;:::-;4433:5;-1:-1:-1;4490:2:1;4475:18;;4462:32;4503:33;4462:32;4503:33;:::i;:::-;4555:7;-1:-1:-1;4613:2:1;4598:18;;4585:32;4636:18;4666:14;;;4663:34;;;4693:1;4690;4683:12;4663:34;4716:61;4769:7;4760:6;4749:9;4745:22;4716:61;:::i;:::-;4706:71;;4830:2;4819:9;4815:18;4802:32;4786:48;;4859:2;4849:8;4846:16;4843:36;;;4875:1;4872;4865:12;4843:36;4898:63;4953:7;4942:8;4931:9;4927:24;4898:63;:::i;:::-;4888:73;;5014:3;5003:9;4999:19;4986:33;4970:49;;5044:2;5034:8;5031:16;5028:36;;;5060:1;5057;5050:12;5028:36;;5083:51;5126:7;5115:8;5104:9;5100:24;5083:51;:::i;:::-;5073:61;;;4069:1071;;;;;;;;:::o;5145:1277::-;5263:6;5271;5324:2;5312:9;5303:7;5299:23;5295:32;5292:52;;;5340:1;5337;5330:12;5292:52;5380:9;5367:23;5409:18;5450:2;5442:6;5439:14;5436:34;;;5466:1;5463;5456:12;5436:34;5504:6;5493:9;5489:22;5479:32;;5549:7;5542:4;5538:2;5534:13;5530:27;5520:55;;5571:1;5568;5561:12;5520:55;5607:2;5594:16;5629:4;5652:43;5692:2;5652:43;:::i;:::-;5724:2;5718:9;5736:31;5764:2;5756:6;5736:31;:::i;:::-;5802:18;;;5890:1;5886:10;;;;5878:19;;5874:28;;;5836:15;;;;-1:-1:-1;5914:19:1;;;5911:39;;;5946:1;5943;5936:12;5911:39;5970:11;;;;5990:217;6006:6;6001:3;5998:15;5990:217;;;6086:3;6073:17;6103:31;6128:5;6103:31;:::i;:::-;6147:18;;6023:12;;;;6185;;;;5990:217;;;6226:6;-1:-1:-1;;6270:18:1;;6257:32;;-1:-1:-1;;6301:16:1;;;6298:36;;;6330:1;6327;6320:12;6298:36;;6353:63;6408:7;6397:8;6386:9;6382:24;6353:63;:::i;:::-;6343:73;;;5145:1277;;;;;:::o;6427:435::-;6480:3;6518:5;6512:12;6545:6;6540:3;6533:19;6571:4;6600:2;6595:3;6591:12;6584:19;;6637:2;6630:5;6626:14;6658:1;6668:169;6682:6;6679:1;6676:13;6668:169;;;6743:13;;6731:26;;6777:12;;;;6812:15;;;;6704:1;6697:9;6668:169;;;-1:-1:-1;6853:3:1;;6427:435;-1:-1:-1;;;;;6427:435:1:o;6867:261::-;7046:2;7035:9;7028:21;7009:4;7066:56;7118:2;7107:9;7103:18;7095:6;7066:56;:::i;7133:518::-;7211:6;7219;7272:2;7260:9;7251:7;7247:23;7243:32;7240:52;;;7288:1;7285;7278:12;7240:52;7324:9;7311:23;7301:33;;7385:2;7374:9;7370:18;7357:32;7412:18;7404:6;7401:30;7398:50;;;7444:1;7441;7434:12;7398:50;7467:22;;7520:4;7512:13;;7508:27;-1:-1:-1;7498:55:1;;7549:1;7546;7539:12;7498:55;7572:73;7637:7;7632:2;7619:16;7614:2;7610;7606:11;7572:73;:::i;7656:730::-;7783:6;7791;7799;7852:2;7840:9;7831:7;7827:23;7823:32;7820:52;;;7868:1;7865;7858:12;7820:52;7907:9;7894:23;7926:31;7951:5;7926:31;:::i;:::-;7976:5;-1:-1:-1;8032:2:1;8017:18;;8004:32;8055:18;8085:14;;;8082:34;;;8112:1;8109;8102:12;8082:34;8135:61;8188:7;8179:6;8168:9;8164:22;8135:61;:::i;:::-;8125:71;;8249:2;8238:9;8234:18;8221:32;8205:48;;8278:2;8268:8;8265:16;8262:36;;;8294:1;8291;8284:12;8262:36;;8317:63;8372:7;8361:8;8350:9;8346:24;8317:63;:::i;:::-;8307:73;;;7656:730;;;;;:::o;8391:592::-;8486:6;8494;8502;8510;8563:3;8551:9;8542:7;8538:23;8534:33;8531:53;;;8580:1;8577;8570:12;8531:53;8619:9;8606:23;8638:31;8663:5;8638:31;:::i;:::-;8688:5;-1:-1:-1;8740:2:1;8725:18;;8712:32;;-1:-1:-1;8791:2:1;8776:18;;8763:32;;-1:-1:-1;8846:2:1;8831:18;;8818:32;8873:18;8862:30;;8859:50;;;8905:1;8902;8895:12;8859:50;8928:49;8969:7;8960:6;8949:9;8945:22;8928:49;:::i;:::-;8918:59;;;8391:592;;;;;;;:::o;9196:470::-;9287:6;9295;9303;9356:2;9344:9;9335:7;9331:23;9327:32;9324:52;;;9372:1;9369;9362:12;9324:52;9411:9;9398:23;9430:31;9455:5;9430:31;:::i;:::-;9480:5;-1:-1:-1;9532:2:1;9517:18;;9504:32;;-1:-1:-1;9588:2:1;9573:18;;9560:32;9601:33;9560:32;9601:33;:::i;:::-;9653:7;9643:17;;;9196:470;;;;;:::o;9671:118::-;9757:5;9750:13;9743:21;9736:5;9733:32;9723:60;;9779:1;9776;9769:12;9794:382;9859:6;9867;9920:2;9908:9;9899:7;9895:23;9891:32;9888:52;;;9936:1;9933;9926:12;9888:52;9975:9;9962:23;9994:31;10019:5;9994:31;:::i;:::-;10044:5;-1:-1:-1;10101:2:1;10086:18;;10073:32;10114:30;10073:32;10114:30;:::i;:::-;10163:7;10153:17;;;9794:382;;;;;:::o;10181:388::-;10249:6;10257;10310:2;10298:9;10289:7;10285:23;10281:32;10278:52;;;10326:1;10323;10316:12;10278:52;10365:9;10352:23;10384:31;10409:5;10384:31;:::i;:::-;10434:5;-1:-1:-1;10491:2:1;10476:18;;10463:32;10504:33;10463:32;10504:33;:::i;10574:734::-;10678:6;10686;10694;10702;10710;10763:3;10751:9;10742:7;10738:23;10734:33;10731:53;;;10780:1;10777;10770:12;10731:53;10819:9;10806:23;10838:31;10863:5;10838:31;:::i;:::-;10888:5;-1:-1:-1;10945:2:1;10930:18;;10917:32;10958:33;10917:32;10958:33;:::i;:::-;11010:7;-1:-1:-1;11064:2:1;11049:18;;11036:32;;-1:-1:-1;11115:2:1;11100:18;;11087:32;;-1:-1:-1;11170:3:1;11155:19;;11142:33;11198:18;11187:30;;11184:50;;;11230:1;11227;11220:12;11184:50;11253:49;11294:7;11285:6;11274:9;11270:22;11253:49;:::i;11313:247::-;11372:6;11425:2;11413:9;11404:7;11400:23;11396:32;11393:52;;;11441:1;11438;11431:12;11393:52;11480:9;11467:23;11499:31;11524:5;11499:31;:::i;11565:383::-;11642:6;11650;11658;11711:2;11699:9;11690:7;11686:23;11682:32;11679:52;;;11727:1;11724;11717:12;11679:52;11766:9;11753:23;11785:31;11810:5;11785:31;:::i;:::-;11835:5;11887:2;11872:18;;11859:32;;-1:-1:-1;11938:2:1;11923:18;;;11910:32;;11565:383;-1:-1:-1;;;11565:383:1:o;12586:380::-;12665:1;12661:12;;;;12708;;;12729:61;;12783:4;12775:6;12771:17;12761:27;;12729:61;12836:2;12828:6;12825:14;12805:18;12802:38;12799:161;;12882:10;12877:3;12873:20;12870:1;12863:31;12917:4;12914:1;12907:15;12945:4;12942:1;12935:15;12799:161;;12586:380;;;:::o;12971:410::-;13173:2;13155:21;;;13212:2;13192:18;;;13185:30;13251:34;13246:2;13231:18;;13224:62;-1:-1:-1;;;13317:2:1;13302:18;;13295:44;13371:3;13356:19;;12971:410::o;13796:127::-;13857:10;13852:3;13848:20;13845:1;13838:31;13888:4;13885:1;13878:15;13912:4;13909:1;13902:15;13928:127;13989:10;13984:3;13980:20;13977:1;13970:31;14020:4;14017:1;14010:15;14044:4;14041:1;14034:15;14060:135;14099:3;14120:17;;;14117:43;;14140:18;;:::i;:::-;-1:-1:-1;14187:1:1;14176:13;;14060:135::o;14326:545::-;14428:2;14423:3;14420:11;14417:448;;;14464:1;14489:5;14485:2;14478:17;14534:4;14530:2;14520:19;14604:2;14592:10;14588:19;14585:1;14581:27;14575:4;14571:38;14640:4;14628:10;14625:20;14622:47;;;-1:-1:-1;14663:4:1;14622:47;14718:2;14713:3;14709:12;14706:1;14702:20;14696:4;14692:31;14682:41;;14773:82;14791:2;14784:5;14781:13;14773:82;;;14836:17;;;14817:1;14806:13;14773:82;;15047:1352;15173:3;15167:10;15200:18;15192:6;15189:30;15186:56;;;15222:18;;:::i;:::-;15251:97;15341:6;15301:38;15333:4;15327:11;15301:38;:::i;:::-;15295:4;15251:97;:::i;:::-;15403:4;;15467:2;15456:14;;15484:1;15479:663;;;;16186:1;16203:6;16200:89;;;-1:-1:-1;16255:19:1;;;16249:26;16200:89;-1:-1:-1;;15004:1:1;15000:11;;;14996:24;14992:29;14982:40;15028:1;15024:11;;;14979:57;16302:81;;15449:944;;15479:663;14273:1;14266:14;;;14310:4;14297:18;;-1:-1:-1;;15515:20:1;;;15633:236;15647:7;15644:1;15641:14;15633:236;;;15736:19;;;15730:26;15715:42;;15828:27;;;;15796:1;15784:14;;;;15663:19;;15633:236;;;15637:3;15897:6;15888:7;15885:19;15882:201;;;15958:19;;;15952:26;-1:-1:-1;;16041:1:1;16037:14;;;16053:3;16033:24;16029:37;16025:42;16010:58;15995:74;;15882:201;-1:-1:-1;;;;;16129:1:1;16113:14;;;16109:22;16096:36;;-1:-1:-1;15047:1352:1:o;16404:184::-;16474:6;16527:2;16515:9;16506:7;16502:23;16498:32;16495:52;;;16543:1;16540;16533:12;16495:52;-1:-1:-1;16566:16:1;;16404:184;-1:-1:-1;16404:184:1:o;17313:245::-;17380:6;17433:2;17421:9;17412:7;17408:23;17404:32;17401:52;;;17449:1;17446;17439:12;17401:52;17481:9;17475:16;17500:28;17522:5;17500:28;:::i;18249:404::-;18451:2;18433:21;;;18490:2;18470:18;;;18463:30;18529:34;18524:2;18509:18;;18502:62;-1:-1:-1;;;18595:2:1;18580:18;;18573:38;18643:3;18628:19;;18249:404::o;18658:401::-;18860:2;18842:21;;;18899:2;18879:18;;;18872:30;18938:34;18933:2;18918:18;;18911:62;-1:-1:-1;;;19004:2:1;18989:18;;18982:35;19049:3;19034:19;;18658:401::o;19064:406::-;19266:2;19248:21;;;19305:2;19285:18;;;19278:30;19344:34;19339:2;19324:18;;19317:62;-1:-1:-1;;;19410:2:1;19395:18;;19388:40;19460:3;19445:19;;19064:406::o;19475:125::-;19540:9;;;19561:10;;;19558:36;;;19574:18;;:::i;19605:465::-;19862:2;19851:9;19844:21;19825:4;19888:56;19940:2;19929:9;19925:18;19917:6;19888:56;:::i;:::-;19992:9;19984:6;19980:22;19975:2;19964:9;19960:18;19953:50;20020:44;20057:6;20049;20020:44;:::i;:::-;20012:52;19605:465;-1:-1:-1;;;;;19605:465:1:o;20436:399::-;20638:2;20620:21;;;20677:2;20657:18;;;20650:30;20716:34;20711:2;20696:18;;20689:62;-1:-1:-1;;;20782:2:1;20767:18;;20760:33;20825:3;20810:19;;20436:399::o;20840:400::-;21042:2;21024:21;;;21081:2;21061:18;;;21054:30;21120:34;21115:2;21100:18;;21093:62;-1:-1:-1;;;21186:2:1;21171:18;;21164:34;21230:3;21215:19;;20840:400::o;22670:827::-;-1:-1:-1;;;;;23067:15:1;;;23049:34;;23119:15;;23114:2;23099:18;;23092:43;23029:3;23166:2;23151:18;;23144:31;;;22992:4;;23198:57;;23235:19;;23227:6;23198:57;:::i;:::-;23303:9;23295:6;23291:22;23286:2;23275:9;23271:18;23264:50;23337:44;23374:6;23366;23337:44;:::i;:::-;23323:58;;23430:9;23422:6;23418:22;23412:3;23401:9;23397:19;23390:51;23458:33;23484:6;23476;23458:33;:::i;:::-;23450:41;22670:827;-1:-1:-1;;;;;;;;22670:827:1:o;23502:249::-;23571:6;23624:2;23612:9;23603:7;23599:23;23595:32;23592:52;;;23640:1;23637;23630:12;23592:52;23672:9;23666:16;23691:30;23715:5;23691:30;:::i;23756:179::-;23791:3;23833:1;23815:16;23812:23;23809:120;;;23879:1;23876;23873;23858:23;-1:-1:-1;23916:1:1;23910:8;23905:3;23901:18;23809:120;23756:179;:::o;23940:671::-;23979:3;24021:4;24003:16;24000:26;23997:39;;;23940:671;:::o;23997:39::-;24063:2;24057:9;-1:-1:-1;;24128:16:1;24124:25;;24121:1;24057:9;24100:50;24179:4;24173:11;24203:16;24238:18;24309:2;24302:4;24294:6;24290:17;24287:25;24282:2;24274:6;24271:14;24268:45;24265:58;;;24316:5;;;;;23940:671;:::o;24265:58::-;24353:6;24347:4;24343:17;24332:28;;24389:3;24383:10;24416:2;24408:6;24405:14;24402:27;;;24422:5;;;;;;23940:671;:::o;24402:27::-;24506:2;24487:16;24481:4;24477:27;24473:36;24466:4;24457:6;24452:3;24448:16;24444:27;24441:69;24438:82;;;24513:5;;;;;;23940:671;:::o;24438:82::-;24529:57;24580:4;24571:6;24563;24559:19;24555:30;24549:4;24529:57;:::i;:::-;-1:-1:-1;24602:3:1;;23940:671;-1:-1:-1;;;;;23940:671:1:o;25037:404::-;25239:2;25221:21;;;25278:2;25258:18;;;25251:30;25317:34;25312:2;25297:18;;25290:62;-1:-1:-1;;;25383:2:1;25368:18;;25361:38;25431:3;25416:19;;25037:404::o;25795:561::-;-1:-1:-1;;;;;26092:15:1;;;26074:34;;26144:15;;26139:2;26124:18;;26117:43;26191:2;26176:18;;26169:34;;;26234:2;26219:18;;26212:34;;;26054:3;26277;26262:19;;26255:32;;;26017:4;;26304:46;;26330:19;;26322:6;26304:46;:::i;:::-;26296:54;25795:561;-1:-1:-1;;;;;;;25795:561:1:o

Swarm Source

ipfs://c69ce09832ff52f9ce227f6c5a173de88fa7df30fe44c9ef54df13e0cb9cf390
Loading