ETH Price: $2,603.40 (+0.43%)

Token

 

Overview

Max Total Supply

79

Holders

66

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
eter.eth
0xf2631a852ea862bd6fb0cf004059d0e9312a9be5
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Otherfunding

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `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);

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/finance/PaymentSplitter.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;




/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

// 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 v4.4.1 (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 be 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.6.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: balance query for the zero address");
        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 owner nor 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: transfer caller is not owner nor 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}.
     *
     * 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`
     *
     * 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}.
     *
     * 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 a {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 `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 _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: contracts/Otherfunding.sol



pragma solidity ^0.8.13;




contract Otherfunding is ERC1155Supply, Ownable, PaymentSplitter {
    string private baseURI;

    bool public didOwnerMint;
    bool public isSaleActive;

    uint256 public maxPerTx = 20;
    uint256 public maxSupply = 2500;
    uint256 public salePrice = 0.01 ether;
    uint256 public tokenId;

    address[] private _teamPayees = [
        0x1eED87a0D4B7F55f099c36B8b1d78b127F6C4534
    ];

    uint256[] private _teamShares = [100];

    constructor() ERC1155("") PaymentSplitter(_teamPayees, _teamShares) {}

    function mint(uint256 _amount) external payable {
        require(isSaleActive, "Sale not active");
        require(_amount <= maxPerTx, "Can not exceed max mint amount");
        require(msg.value >= _amount * salePrice, "Insufficient Ether sent");
        require(
            totalSupply(tokenId) + _amount <= maxSupply,
            "Not enough supply"
        );
        _mint(msg.sender, tokenId, _amount, "");
    }

    function ownerMint() external onlyOwner {
        require(!didOwnerMint, "Already minted");
        require(totalSupply(tokenId) + 10 <= maxSupply, "Not enough supply");
        _mint(msg.sender, tokenId, 10, "");
        didOwnerMint = true;
    }

    function toggleSale() external onlyOwner {
        isSaleActive = !isSaleActive;
    }

    function setURI(string memory _uri) external onlyOwner {
        _setURI(_uri);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","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"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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"},{"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":[],"name":"didOwnerMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6014600e556109c4600f55662386f26fc1000060105560a0604052731eed87a0d4b7f55f099c36b8b1d78b127f6c4534608090815262000044906012906001620004e3565b50604080516020810190915260648152620000649060139060016200054d565b503480156200007257600080fd5b506012805480602002602001604051908101604052809291908181526020018280548015620000cb57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620000ac575b505050505060138054806020026020016040519081016040528092919081815260200182805480156200011e57602002820191906000526020600020905b81548152602001906001019080831162000109575b50505050506040518060200160405280600081525062000144816200028a60201b60201c565b506200015033620002a3565b8051825114620001c25760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620002155760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620001b9565b60005b825181101562000281576200026c8382815181106200023b576200023b62000624565b602002602001015183838151811062000258576200025862000624565b6020026020010151620002f560201b60201c565b80620002788162000650565b91505062000218565b505050620006c3565b80516200029f90600290602084019062000590565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620003625760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401620001b9565b60008111620003b45760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401620001b9565b6001600160a01b03821660009081526007602052604090205415620004305760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401620001b9565b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319166001600160a01b03841690811790915560009081526007602052604090208190556005546200049a9082906200066c565b600555604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b8280548282559060005260206000209081019282156200053b579160200282015b828111156200053b57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000504565b50620005499291506200060d565b5090565b8280548282559060005260206000209081019282156200053b579160200282015b828111156200053b578251829060ff169055916020019190600101906200056e565b8280546200059e9062000687565b90600052602060002090601f016020900481019282620005c257600085556200053b565b82601f10620005dd57805160ff19168380011785556200053b565b828001600101855582156200053b579182015b828111156200053b578251825591602001919060010190620005f0565b5b808211156200054957600081556001016200060e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200066557620006656200063a565b5060010190565b600082198211156200068257620006826200063a565b500190565b600181811c908216806200069c57607f821691505b602082108103620006bd57634e487b7160e01b600052602260045260246000fd5b50919050565b61293880620006d36000396000f3fe6080604052600436106101e65760003560e01c80638b83209b11610102578063d5abeb0111610095578063f242432a11610064578063f242432a14610657578063f2fde38b14610677578063f51f96dd14610697578063f968adbe146106ad57600080fd5b8063d5abeb01146105ad578063d79779b2146105c3578063e33b7de3146105f9578063e985e9c51461060e57600080fd5b8063a22cb465116100d1578063a22cb46514610515578063b12dc99114610535578063bd85b0391461054a578063ce7c2ac21461057757600080fd5b80638b83209b146104765780638da5cb5b146104ae5780639852595c146104cc578063a0712d681461050257600080fd5b8063406072a91161017a578063564566a811610149578063564566a8146104135780635b487a4f14610432578063715018a61461044c5780637d8966e41461046157600080fd5b8063406072a91461035157806348b75044146103975780634e1273f4146103b75780634f558e79146103e457600080fd5b806317d70f7c116101b657806317d70f7c146102e657806319165587146102fc5780632eb2c2d61461031c5780633a98ef391461033c57600080fd5b8062fdd58e1461023457806301ffc9a71461026757806302fe5305146102975780630e89341c146102b957600080fd5b3661022f577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561024057600080fd5b5061025461024f366004611f49565b6106c3565b6040519081526020015b60405180910390f35b34801561027357600080fd5b50610287610282366004611f8b565b61075a565b604051901515815260200161025e565b3480156102a357600080fd5b506102b76102b2366004612049565b6107ac565b005b3480156102c557600080fd5b506102d96102d436600461209a565b6107e2565b60405161025e919061210f565b3480156102f257600080fd5b5061025460115481565b34801561030857600080fd5b506102b7610317366004612122565b610876565b34801561032857600080fd5b506102b76103373660046121f4565b6109a7565b34801561034857600080fd5b50600554610254565b34801561035d57600080fd5b5061025461036c3660046122a2565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b3480156103a357600080fd5b506102b76103b23660046122a2565b610a3e565b3480156103c357600080fd5b506103d76103d23660046122db565b610c1a565b60405161025e91906123e3565b3480156103f057600080fd5b506102876103ff36600461209a565b600090815260036020526040902054151590565b34801561041f57600080fd5b50600d5461028790610100900460ff1681565b34801561043e57600080fd5b50600d546102879060ff1681565b34801561045857600080fd5b506102b7610d44565b34801561046d57600080fd5b506102b7610d7a565b34801561048257600080fd5b5061049661049136600461209a565b610dc1565b6040516001600160a01b03909116815260200161025e565b3480156104ba57600080fd5b506004546001600160a01b0316610496565b3480156104d857600080fd5b506102546104e7366004612122565b6001600160a01b031660009081526008602052604090205490565b6102b761051036600461209a565b610df1565b34801561052157600080fd5b506102b7610530366004612404565b610f6d565b34801561054157600080fd5b506102b7610f7c565b34801561055657600080fd5b5061025461056536600461209a565b60009081526003602052604090205490565b34801561058357600080fd5b50610254610592366004612122565b6001600160a01b031660009081526007602052604090205490565b3480156105b957600080fd5b50610254600f5481565b3480156105cf57600080fd5b506102546105de366004612122565b6001600160a01b03166000908152600a602052604090205490565b34801561060557600080fd5b50600654610254565b34801561061a57600080fd5b506102876106293660046122a2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561066357600080fd5b506102b7610672366004612432565b611079565b34801561068357600080fd5b506102b7610692366004612122565b611100565b3480156106a357600080fd5b5061025460105481565b3480156106b957600080fd5b50610254600e5481565b60006001600160a01b0383166107345760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061078b57506001600160e01b031982166303a24d0760e21b145b806107a657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6004546001600160a01b031633146107d65760405162461bcd60e51b815260040161072b9061249b565b6107df81611198565b50565b6060600280546107f1906124d0565b80601f016020809104026020016040519081016040528092919081815260200182805461081d906124d0565b801561086a5780601f1061083f5761010080835404028352916020019161086a565b820191906000526020600020905b81548152906001019060200180831161084d57829003601f168201915b50505050509050919050565b6001600160a01b0381166000908152600760205260409020546108ab5760405162461bcd60e51b815260040161072b9061250a565b60006108b660065490565b6108c09047612566565b905060006108ed83836108e8866001600160a01b031660009081526008602052604090205490565b6111ab565b90508060000361090f5760405162461bcd60e51b815260040161072b9061257e565b6001600160a01b03831660009081526008602052604081208054839290610937908490612566565b9250508190555080600660008282546109509190612566565b90915550610960905083826111f3565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6001600160a01b0385163314806109c357506109c38533610629565b610a2a5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161072b565b610a378585858585611311565b5050505050565b6001600160a01b038116600090815260076020526040902054610a735760405162461bcd60e51b815260040161072b9061250a565b6001600160a01b0382166000908152600a60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af491906125c9565b610afe9190612566565b90506000610b3783836108e887876001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b905080600003610b595760405162461bcd60e51b815260040161072b9061257e565b6001600160a01b038085166000908152600b6020908152604080832093871683529290529081208054839290610b90908490612566565b90915550506001600160a01b0384166000908152600a602052604081208054839290610bbd908490612566565b90915550610bce90508484836114fc565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60608151835114610c7f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161072b565b6000835167ffffffffffffffff811115610c9b57610c9b611fa8565b604051908082528060200260200182016040528015610cc4578160200160208202803683370190505b50905060005b8451811015610d3c57610d0f858281518110610ce857610ce86125e2565b6020026020010151858381518110610d0257610d026125e2565b60200260200101516106c3565b828281518110610d2157610d216125e2565b6020908102919091010152610d35816125f8565b9050610cca565b509392505050565b6004546001600160a01b03163314610d6e5760405162461bcd60e51b815260040161072b9061249b565b610d78600061154e565b565b6004546001600160a01b03163314610da45760405162461bcd60e51b815260040161072b9061249b565b600d805461ff001981166101009182900460ff1615909102179055565b600060098281548110610dd657610dd66125e2565b6000918252602090912001546001600160a01b031692915050565b600d54610100900460ff16610e3a5760405162461bcd60e51b815260206004820152600f60248201526e53616c65206e6f742061637469766560881b604482015260640161072b565b600e54811115610e8c5760405162461bcd60e51b815260206004820152601e60248201527f43616e206e6f7420657863656564206d6178206d696e7420616d6f756e740000604482015260640161072b565b601054610e999082612611565b341015610ee85760405162461bcd60e51b815260206004820152601760248201527f496e73756666696369656e742045746865722073656e74000000000000000000604482015260640161072b565b600f5481610f0460115460009081526003602052604090205490565b610f0e9190612566565b1115610f505760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820737570706c7960781b604482015260640161072b565b6107df3360115483604051806020016040528060008152506115a0565b610f783383836116c3565b5050565b6004546001600160a01b03163314610fa65760405162461bcd60e51b815260040161072b9061249b565b600d5460ff1615610fea5760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b604482015260640161072b565b600f5460115460009081526003602052604090205461100a90600a612566565b111561104c5760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820737570706c7960781b604482015260640161072b565b61106a33601154600a604051806020016040528060008152506115a0565b600d805460ff19166001179055565b6001600160a01b03851633148061109557506110958533610629565b6110f35760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161072b565b610a3785858585856117a3565b6004546001600160a01b0316331461112a5760405162461bcd60e51b815260040161072b9061249b565b6001600160a01b03811661118f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161072b565b6107df8161154e565b8051610f78906002906020840190611e9b565b6005546001600160a01b038416600090815260076020526040812054909183916111d59086612611565b6111df9190612630565b6111e99190612652565b90505b9392505050565b804710156112435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161072b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611290576040519150601f19603f3d011682016040523d82523d6000602084013e611295565b606091505b505090508061130c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161072b565b505050565b81518351146113735760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161072b565b6001600160a01b0384166113995760405162461bcd60e51b815260040161072b90612669565b336113a88187878787876118db565b60005b845181101561148e5760008582815181106113c8576113c86125e2565b6020026020010151905060008583815181106113e6576113e66125e2565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156114365760405162461bcd60e51b815260040161072b906126ae565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611473908490612566565b9250508190555050505080611487906125f8565b90506113ab565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516114de9291906126f8565b60405180910390a46114f4818787878787611a54565b505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261130c908490611baf565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166116005760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161072b565b33600061160c85611c81565b9050600061161985611c81565b905061162a836000898585896118db565b6000868152602081815260408083206001600160a01b038b1684529091528120805487929061165a908490612566565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46116ba83600089898989611ccc565b50505050505050565b816001600160a01b0316836001600160a01b0316036117365760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161072b565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166117c95760405162461bcd60e51b815260040161072b90612669565b3360006117d585611c81565b905060006117e285611c81565b90506117f28389898585896118db565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156118335760405162461bcd60e51b815260040161072b906126ae565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611870908490612566565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46118d0848a8a8a8a8a611ccc565b505050505050505050565b6001600160a01b0385166119625760005b835181101561196057828181518110611907576119076125e2565b602002602001015160036000868481518110611925576119256125e2565b60200260200101518152602001908152602001600020600082825461194a9190612566565b909155506119599050816125f8565b90506118ec565b505b6001600160a01b0384166114f45760005b83518110156116ba576000848281518110611990576119906125e2565b6020026020010151905060008483815181106119ae576119ae6125e2565b6020026020010151905060006003600084815260200190815260200160002054905081811015611a315760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b606482015260840161072b565b60009283526003602052604090922091039055611a4d816125f8565b9050611973565b6001600160a01b0384163b156114f45760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611a989089908990889088908890600401612726565b6020604051808303816000875af1925050508015611ad3575060408051601f3d908101601f19168201909252611ad091810190612784565b60015b611b7f57611adf6127a1565b806308c379a003611b185750611af36127bd565b80611afe5750611b1a565b8060405162461bcd60e51b815260040161072b919061210f565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161072b565b6001600160e01b0319811663bc197c8160e01b146116ba5760405162461bcd60e51b815260040161072b90612847565b6000611c04826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d879092919063ffffffff16565b80519091501561130c5780806020019051810190611c22919061288f565b61130c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161072b565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611cbb57611cbb6125e2565b602090810291909101015292915050565b6001600160a01b0384163b156114f45760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611d1090899089908890889088906004016128ac565b6020604051808303816000875af1925050508015611d4b575060408051601f3d908101601f19168201909252611d4891810190612784565b60015b611d5757611adf6127a1565b6001600160e01b0319811663f23a6e6160e01b146116ba5760405162461bcd60e51b815260040161072b90612847565b60606111e98484600085856001600160a01b0385163b611de95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161072b565b600080866001600160a01b03168587604051611e0591906128e6565b60006040518083038185875af1925050503d8060008114611e42576040519150601f19603f3d011682016040523d82523d6000602084013e611e47565b606091505b5091509150611e57828286611e62565b979650505050505050565b60608315611e715750816111ec565b825115611e815782518084602001fd5b8160405162461bcd60e51b815260040161072b919061210f565b828054611ea7906124d0565b90600052602060002090601f016020900481019282611ec95760008555611f0f565b82601f10611ee257805160ff1916838001178555611f0f565b82800160010185558215611f0f579182015b82811115611f0f578251825591602001919060010190611ef4565b50611f1b929150611f1f565b5090565b5b80821115611f1b5760008155600101611f20565b6001600160a01b03811681146107df57600080fd5b60008060408385031215611f5c57600080fd5b8235611f6781611f34565b946020939093013593505050565b6001600160e01b0319811681146107df57600080fd5b600060208284031215611f9d57600080fd5b81356111ec81611f75565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611fe457611fe4611fa8565b6040525050565b600067ffffffffffffffff83111561200557612005611fa8565b60405161201c601f8501601f191660200182611fbe565b80915083815284848401111561203157600080fd5b83836020830137600060208583010152509392505050565b60006020828403121561205b57600080fd5b813567ffffffffffffffff81111561207257600080fd5b8201601f8101841361208357600080fd5b61209284823560208401611feb565b949350505050565b6000602082840312156120ac57600080fd5b5035919050565b60005b838110156120ce5781810151838201526020016120b6565b838111156120dd576000848401525b50505050565b600081518084526120fb8160208601602086016120b3565b601f01601f19169290920160200192915050565b6020815260006111ec60208301846120e3565b60006020828403121561213457600080fd5b81356111ec81611f34565b600067ffffffffffffffff82111561215957612159611fa8565b5060051b60200190565b600082601f83011261217457600080fd5b813560206121818261213f565b60405161218e8282611fbe565b83815260059390931b85018201928281019150868411156121ae57600080fd5b8286015b848110156121c957803583529183019183016121b2565b509695505050505050565b600082601f8301126121e557600080fd5b6111ec83833560208501611feb565b600080600080600060a0868803121561220c57600080fd5b853561221781611f34565b9450602086013561222781611f34565b9350604086013567ffffffffffffffff8082111561224457600080fd5b61225089838a01612163565b9450606088013591508082111561226657600080fd5b61227289838a01612163565b9350608088013591508082111561228857600080fd5b50612295888289016121d4565b9150509295509295909350565b600080604083850312156122b557600080fd5b82356122c081611f34565b915060208301356122d081611f34565b809150509250929050565b600080604083850312156122ee57600080fd5b823567ffffffffffffffff8082111561230657600080fd5b818501915085601f83011261231a57600080fd5b813560206123278261213f565b6040516123348282611fbe565b83815260059390931b850182019282810191508984111561235457600080fd5b948201945b8386101561237b57853561236c81611f34565b82529482019490820190612359565b9650508601359250508082111561239157600080fd5b5061239e85828601612163565b9150509250929050565b600081518084526020808501945080840160005b838110156123d8578151875295820195908201906001016123bc565b509495945050505050565b6020815260006111ec60208301846123a8565b80151581146107df57600080fd5b6000806040838503121561241757600080fd5b823561242281611f34565b915060208301356122d0816123f6565b600080600080600060a0868803121561244a57600080fd5b853561245581611f34565b9450602086013561246581611f34565b93506040860135925060608601359150608086013567ffffffffffffffff81111561248f57600080fd5b612295888289016121d4565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806124e457607f821691505b60208210810361250457634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561257957612579612550565b500190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6000602082840312156125db57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161260a5761260a612550565b5060010190565b600081600019048311821515161561262b5761262b612550565b500290565b60008261264d57634e487b7160e01b600052601260045260246000fd5b500490565b60008282101561266457612664612550565b500390565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061270b60408301856123a8565b828103602084015261271d81856123a8565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612752908301866123a8565b828103606084015261276481866123a8565b9050828103608084015261277881856120e3565b98975050505050505050565b60006020828403121561279657600080fd5b81516111ec81611f75565b600060033d11156127ba5760046000803e5060005160e01c5b90565b600060443d10156127cb5790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156127fb57505050505090565b82850191508151818111156128135750505050505090565b843d870101602082850101111561282d5750505050505090565b61283c60208286010187611fbe565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6000602082840312156128a157600080fd5b81516111ec816123f6565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611e57908301846120e3565b600082516128f88184602087016120b3565b919091019291505056fea26469706673582212201c57861425ab949051904a0cbe725122f4edb5ab8059c6d8d2ea9f47c8b898dd64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106101e65760003560e01c80638b83209b11610102578063d5abeb0111610095578063f242432a11610064578063f242432a14610657578063f2fde38b14610677578063f51f96dd14610697578063f968adbe146106ad57600080fd5b8063d5abeb01146105ad578063d79779b2146105c3578063e33b7de3146105f9578063e985e9c51461060e57600080fd5b8063a22cb465116100d1578063a22cb46514610515578063b12dc99114610535578063bd85b0391461054a578063ce7c2ac21461057757600080fd5b80638b83209b146104765780638da5cb5b146104ae5780639852595c146104cc578063a0712d681461050257600080fd5b8063406072a91161017a578063564566a811610149578063564566a8146104135780635b487a4f14610432578063715018a61461044c5780637d8966e41461046157600080fd5b8063406072a91461035157806348b75044146103975780634e1273f4146103b75780634f558e79146103e457600080fd5b806317d70f7c116101b657806317d70f7c146102e657806319165587146102fc5780632eb2c2d61461031c5780633a98ef391461033c57600080fd5b8062fdd58e1461023457806301ffc9a71461026757806302fe5305146102975780630e89341c146102b957600080fd5b3661022f577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561024057600080fd5b5061025461024f366004611f49565b6106c3565b6040519081526020015b60405180910390f35b34801561027357600080fd5b50610287610282366004611f8b565b61075a565b604051901515815260200161025e565b3480156102a357600080fd5b506102b76102b2366004612049565b6107ac565b005b3480156102c557600080fd5b506102d96102d436600461209a565b6107e2565b60405161025e919061210f565b3480156102f257600080fd5b5061025460115481565b34801561030857600080fd5b506102b7610317366004612122565b610876565b34801561032857600080fd5b506102b76103373660046121f4565b6109a7565b34801561034857600080fd5b50600554610254565b34801561035d57600080fd5b5061025461036c3660046122a2565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b3480156103a357600080fd5b506102b76103b23660046122a2565b610a3e565b3480156103c357600080fd5b506103d76103d23660046122db565b610c1a565b60405161025e91906123e3565b3480156103f057600080fd5b506102876103ff36600461209a565b600090815260036020526040902054151590565b34801561041f57600080fd5b50600d5461028790610100900460ff1681565b34801561043e57600080fd5b50600d546102879060ff1681565b34801561045857600080fd5b506102b7610d44565b34801561046d57600080fd5b506102b7610d7a565b34801561048257600080fd5b5061049661049136600461209a565b610dc1565b6040516001600160a01b03909116815260200161025e565b3480156104ba57600080fd5b506004546001600160a01b0316610496565b3480156104d857600080fd5b506102546104e7366004612122565b6001600160a01b031660009081526008602052604090205490565b6102b761051036600461209a565b610df1565b34801561052157600080fd5b506102b7610530366004612404565b610f6d565b34801561054157600080fd5b506102b7610f7c565b34801561055657600080fd5b5061025461056536600461209a565b60009081526003602052604090205490565b34801561058357600080fd5b50610254610592366004612122565b6001600160a01b031660009081526007602052604090205490565b3480156105b957600080fd5b50610254600f5481565b3480156105cf57600080fd5b506102546105de366004612122565b6001600160a01b03166000908152600a602052604090205490565b34801561060557600080fd5b50600654610254565b34801561061a57600080fd5b506102876106293660046122a2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561066357600080fd5b506102b7610672366004612432565b611079565b34801561068357600080fd5b506102b7610692366004612122565b611100565b3480156106a357600080fd5b5061025460105481565b3480156106b957600080fd5b50610254600e5481565b60006001600160a01b0383166107345760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061078b57506001600160e01b031982166303a24d0760e21b145b806107a657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6004546001600160a01b031633146107d65760405162461bcd60e51b815260040161072b9061249b565b6107df81611198565b50565b6060600280546107f1906124d0565b80601f016020809104026020016040519081016040528092919081815260200182805461081d906124d0565b801561086a5780601f1061083f5761010080835404028352916020019161086a565b820191906000526020600020905b81548152906001019060200180831161084d57829003601f168201915b50505050509050919050565b6001600160a01b0381166000908152600760205260409020546108ab5760405162461bcd60e51b815260040161072b9061250a565b60006108b660065490565b6108c09047612566565b905060006108ed83836108e8866001600160a01b031660009081526008602052604090205490565b6111ab565b90508060000361090f5760405162461bcd60e51b815260040161072b9061257e565b6001600160a01b03831660009081526008602052604081208054839290610937908490612566565b9250508190555080600660008282546109509190612566565b90915550610960905083826111f3565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6001600160a01b0385163314806109c357506109c38533610629565b610a2a5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161072b565b610a378585858585611311565b5050505050565b6001600160a01b038116600090815260076020526040902054610a735760405162461bcd60e51b815260040161072b9061250a565b6001600160a01b0382166000908152600a60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af491906125c9565b610afe9190612566565b90506000610b3783836108e887876001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b905080600003610b595760405162461bcd60e51b815260040161072b9061257e565b6001600160a01b038085166000908152600b6020908152604080832093871683529290529081208054839290610b90908490612566565b90915550506001600160a01b0384166000908152600a602052604081208054839290610bbd908490612566565b90915550610bce90508484836114fc565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60608151835114610c7f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161072b565b6000835167ffffffffffffffff811115610c9b57610c9b611fa8565b604051908082528060200260200182016040528015610cc4578160200160208202803683370190505b50905060005b8451811015610d3c57610d0f858281518110610ce857610ce86125e2565b6020026020010151858381518110610d0257610d026125e2565b60200260200101516106c3565b828281518110610d2157610d216125e2565b6020908102919091010152610d35816125f8565b9050610cca565b509392505050565b6004546001600160a01b03163314610d6e5760405162461bcd60e51b815260040161072b9061249b565b610d78600061154e565b565b6004546001600160a01b03163314610da45760405162461bcd60e51b815260040161072b9061249b565b600d805461ff001981166101009182900460ff1615909102179055565b600060098281548110610dd657610dd66125e2565b6000918252602090912001546001600160a01b031692915050565b600d54610100900460ff16610e3a5760405162461bcd60e51b815260206004820152600f60248201526e53616c65206e6f742061637469766560881b604482015260640161072b565b600e54811115610e8c5760405162461bcd60e51b815260206004820152601e60248201527f43616e206e6f7420657863656564206d6178206d696e7420616d6f756e740000604482015260640161072b565b601054610e999082612611565b341015610ee85760405162461bcd60e51b815260206004820152601760248201527f496e73756666696369656e742045746865722073656e74000000000000000000604482015260640161072b565b600f5481610f0460115460009081526003602052604090205490565b610f0e9190612566565b1115610f505760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820737570706c7960781b604482015260640161072b565b6107df3360115483604051806020016040528060008152506115a0565b610f783383836116c3565b5050565b6004546001600160a01b03163314610fa65760405162461bcd60e51b815260040161072b9061249b565b600d5460ff1615610fea5760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b604482015260640161072b565b600f5460115460009081526003602052604090205461100a90600a612566565b111561104c5760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820737570706c7960781b604482015260640161072b565b61106a33601154600a604051806020016040528060008152506115a0565b600d805460ff19166001179055565b6001600160a01b03851633148061109557506110958533610629565b6110f35760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161072b565b610a3785858585856117a3565b6004546001600160a01b0316331461112a5760405162461bcd60e51b815260040161072b9061249b565b6001600160a01b03811661118f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161072b565b6107df8161154e565b8051610f78906002906020840190611e9b565b6005546001600160a01b038416600090815260076020526040812054909183916111d59086612611565b6111df9190612630565b6111e99190612652565b90505b9392505050565b804710156112435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161072b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611290576040519150601f19603f3d011682016040523d82523d6000602084013e611295565b606091505b505090508061130c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161072b565b505050565b81518351146113735760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161072b565b6001600160a01b0384166113995760405162461bcd60e51b815260040161072b90612669565b336113a88187878787876118db565b60005b845181101561148e5760008582815181106113c8576113c86125e2565b6020026020010151905060008583815181106113e6576113e66125e2565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156114365760405162461bcd60e51b815260040161072b906126ae565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611473908490612566565b9250508190555050505080611487906125f8565b90506113ab565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516114de9291906126f8565b60405180910390a46114f4818787878787611a54565b505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261130c908490611baf565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166116005760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161072b565b33600061160c85611c81565b9050600061161985611c81565b905061162a836000898585896118db565b6000868152602081815260408083206001600160a01b038b1684529091528120805487929061165a908490612566565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46116ba83600089898989611ccc565b50505050505050565b816001600160a01b0316836001600160a01b0316036117365760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161072b565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166117c95760405162461bcd60e51b815260040161072b90612669565b3360006117d585611c81565b905060006117e285611c81565b90506117f28389898585896118db565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156118335760405162461bcd60e51b815260040161072b906126ae565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611870908490612566565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46118d0848a8a8a8a8a611ccc565b505050505050505050565b6001600160a01b0385166119625760005b835181101561196057828181518110611907576119076125e2565b602002602001015160036000868481518110611925576119256125e2565b60200260200101518152602001908152602001600020600082825461194a9190612566565b909155506119599050816125f8565b90506118ec565b505b6001600160a01b0384166114f45760005b83518110156116ba576000848281518110611990576119906125e2565b6020026020010151905060008483815181106119ae576119ae6125e2565b6020026020010151905060006003600084815260200190815260200160002054905081811015611a315760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b606482015260840161072b565b60009283526003602052604090922091039055611a4d816125f8565b9050611973565b6001600160a01b0384163b156114f45760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611a989089908990889088908890600401612726565b6020604051808303816000875af1925050508015611ad3575060408051601f3d908101601f19168201909252611ad091810190612784565b60015b611b7f57611adf6127a1565b806308c379a003611b185750611af36127bd565b80611afe5750611b1a565b8060405162461bcd60e51b815260040161072b919061210f565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161072b565b6001600160e01b0319811663bc197c8160e01b146116ba5760405162461bcd60e51b815260040161072b90612847565b6000611c04826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d879092919063ffffffff16565b80519091501561130c5780806020019051810190611c22919061288f565b61130c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161072b565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611cbb57611cbb6125e2565b602090810291909101015292915050565b6001600160a01b0384163b156114f45760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611d1090899089908890889088906004016128ac565b6020604051808303816000875af1925050508015611d4b575060408051601f3d908101601f19168201909252611d4891810190612784565b60015b611d5757611adf6127a1565b6001600160e01b0319811663f23a6e6160e01b146116ba5760405162461bcd60e51b815260040161072b90612847565b60606111e98484600085856001600160a01b0385163b611de95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161072b565b600080866001600160a01b03168587604051611e0591906128e6565b60006040518083038185875af1925050503d8060008114611e42576040519150601f19603f3d011682016040523d82523d6000602084013e611e47565b606091505b5091509150611e57828286611e62565b979650505050505050565b60608315611e715750816111ec565b825115611e815782518084602001fd5b8160405162461bcd60e51b815260040161072b919061210f565b828054611ea7906124d0565b90600052602060002090601f016020900481019282611ec95760008555611f0f565b82601f10611ee257805160ff1916838001178555611f0f565b82800160010185558215611f0f579182015b82811115611f0f578251825591602001919060010190611ef4565b50611f1b929150611f1f565b5090565b5b80821115611f1b5760008155600101611f20565b6001600160a01b03811681146107df57600080fd5b60008060408385031215611f5c57600080fd5b8235611f6781611f34565b946020939093013593505050565b6001600160e01b0319811681146107df57600080fd5b600060208284031215611f9d57600080fd5b81356111ec81611f75565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611fe457611fe4611fa8565b6040525050565b600067ffffffffffffffff83111561200557612005611fa8565b60405161201c601f8501601f191660200182611fbe565b80915083815284848401111561203157600080fd5b83836020830137600060208583010152509392505050565b60006020828403121561205b57600080fd5b813567ffffffffffffffff81111561207257600080fd5b8201601f8101841361208357600080fd5b61209284823560208401611feb565b949350505050565b6000602082840312156120ac57600080fd5b5035919050565b60005b838110156120ce5781810151838201526020016120b6565b838111156120dd576000848401525b50505050565b600081518084526120fb8160208601602086016120b3565b601f01601f19169290920160200192915050565b6020815260006111ec60208301846120e3565b60006020828403121561213457600080fd5b81356111ec81611f34565b600067ffffffffffffffff82111561215957612159611fa8565b5060051b60200190565b600082601f83011261217457600080fd5b813560206121818261213f565b60405161218e8282611fbe565b83815260059390931b85018201928281019150868411156121ae57600080fd5b8286015b848110156121c957803583529183019183016121b2565b509695505050505050565b600082601f8301126121e557600080fd5b6111ec83833560208501611feb565b600080600080600060a0868803121561220c57600080fd5b853561221781611f34565b9450602086013561222781611f34565b9350604086013567ffffffffffffffff8082111561224457600080fd5b61225089838a01612163565b9450606088013591508082111561226657600080fd5b61227289838a01612163565b9350608088013591508082111561228857600080fd5b50612295888289016121d4565b9150509295509295909350565b600080604083850312156122b557600080fd5b82356122c081611f34565b915060208301356122d081611f34565b809150509250929050565b600080604083850312156122ee57600080fd5b823567ffffffffffffffff8082111561230657600080fd5b818501915085601f83011261231a57600080fd5b813560206123278261213f565b6040516123348282611fbe565b83815260059390931b850182019282810191508984111561235457600080fd5b948201945b8386101561237b57853561236c81611f34565b82529482019490820190612359565b9650508601359250508082111561239157600080fd5b5061239e85828601612163565b9150509250929050565b600081518084526020808501945080840160005b838110156123d8578151875295820195908201906001016123bc565b509495945050505050565b6020815260006111ec60208301846123a8565b80151581146107df57600080fd5b6000806040838503121561241757600080fd5b823561242281611f34565b915060208301356122d0816123f6565b600080600080600060a0868803121561244a57600080fd5b853561245581611f34565b9450602086013561246581611f34565b93506040860135925060608601359150608086013567ffffffffffffffff81111561248f57600080fd5b612295888289016121d4565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806124e457607f821691505b60208210810361250457634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561257957612579612550565b500190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6000602082840312156125db57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161260a5761260a612550565b5060010190565b600081600019048311821515161561262b5761262b612550565b500290565b60008261264d57634e487b7160e01b600052601260045260246000fd5b500490565b60008282101561266457612664612550565b500390565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061270b60408301856123a8565b828103602084015261271d81856123a8565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612752908301866123a8565b828103606084015261276481866123a8565b9050828103608084015261277881856120e3565b98975050505050505050565b60006020828403121561279657600080fd5b81516111ec81611f75565b600060033d11156127ba5760046000803e5060005160e01c5b90565b600060443d10156127cb5790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156127fb57505050505090565b82850191508151818111156128135750505050505090565b843d870101602082850101111561282d5750505050505090565b61283c60208286010187611fbe565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6000602082840312156128a157600080fd5b81516111ec816123f6565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611e57908301846120e3565b600082516128f88184602087016120b3565b919091019291505056fea26469706673582212201c57861425ab949051904a0cbe725122f4edb5ab8059c6d8d2ea9f47c8b898dd64736f6c634300080d0033

Deployed Bytecode Sourcemap

55410:1427:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22042:40;3638:10;22042:40;;;-1:-1:-1;;;;;206:32:1;;;188:51;;22072:9:0;270:2:1;255:18;;248:34;161:18;22042:40:0;;;;;;;55410:1427;;;;;37867:231;;;;;;;;;;-1:-1:-1;37867:231:0;;;;;:::i;:::-;;:::i;:::-;;;895:25:1;;;883:2;868:18;37867:231:0;;;;;;;;36890:310;;;;;;;;;;-1:-1:-1;36890:310:0;;;;;:::i;:::-;;:::i;:::-;;;1482:14:1;;1475:22;1457:41;;1445:2;1430:18;36890:310:0;1317:187:1;56745:87:0;;;;;;;;;;-1:-1:-1;56745:87:0;;;;;:::i;:::-;;:::i;:::-;;37611:105;;;;;;;;;;-1:-1:-1;37611:105:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55694:22::-;;;;;;;;;;;;;;;;23828:566;;;;;;;;;;-1:-1:-1;23828:566:0;;;;;:::i;:::-;;:::i;39806:442::-;;;;;;;;;;-1:-1:-1;39806:442:0;;;;;:::i;:::-;;:::i;22173:91::-;;;;;;;;;;-1:-1:-1;22244:12:0;;22173:91;;23302:135;;;;;;;;;;-1:-1:-1;23302:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;23399:21:0;;;23372:7;23399:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;23302:135;24662:641;;;;;;;;;;-1:-1:-1;24662:641:0;;;;;:::i;:::-;;:::i;38264:524::-;;;;;;;;;;-1:-1:-1;38264:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;54198:122::-;;;;;;;;;;-1:-1:-1;54198:122:0;;;;;:::i;:::-;54255:4;54076:16;;;:12;:16;;;;;;-1:-1:-1;;;54198:122:0;55544:24;;;;;;;;;;-1:-1:-1;55544:24:0;;;;;;;;;;;55513;;;;;;;;;;-1:-1:-1;55513:24:0;;;;;;;;5485:103;;;;;;;;;;;;;:::i;56649:88::-;;;;;;;;;;;;;:::i;23528:100::-;;;;;;;;;;-1:-1:-1;23528:100:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8798:32:1;;;8780:51;;8768:2;8753:18;23528:100:0;8634:203:1;4834:87:0;;;;;;;;;;-1:-1:-1;4907:6:0;;-1:-1:-1;;;;;4907:6:0;4834:87;;23024:109;;;;;;;;;;-1:-1:-1;23024:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;23107:18:0;23080:7;23107:18;;;:9;:18;;;;;;;23024:109;55950:430;;;;;;:::i;:::-;;:::i;38861:155::-;;;;;;;;;;-1:-1:-1;38861:155:0;;;;;:::i;:::-;;:::i;56388:253::-;;;;;;;;;;;;;:::i;53987:113::-;;;;;;;;;;-1:-1:-1;53987:113:0;;;;;:::i;:::-;54049:7;54076:16;;;:12;:16;;;;;;;53987:113;22820:105;;;;;;;;;;-1:-1:-1;22820:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;22901:16:0;22874:7;22901:16;;;:7;:16;;;;;;;22820:105;55612:31;;;;;;;;;;;;;;;;22610:119;;;;;;;;;;-1:-1:-1;22610:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;22695:26:0;22668:7;22695:26;;;:19;:26;;;;;;;22610:119;22358:95;;;;;;;;;;-1:-1:-1;22431:14:0;;22358:95;;39088:168;;;;;;;;;;-1:-1:-1;39088:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;39211:27:0;;;39187:4;39211:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;39088:168;39328:401;;;;;;;;;;-1:-1:-1;39328:401:0;;;;;:::i;:::-;;:::i;5743:201::-;;;;;;;;;;-1:-1:-1;5743:201:0;;;;;:::i;:::-;;:::i;55650:37::-;;;;;;;;;;;;;;;;55577:28;;;;;;;;;;;;;;;;37867:231;37953:7;-1:-1:-1;;;;;37981:21:0;;37973:77;;;;-1:-1:-1;;;37973:77:0;;11203:2:1;37973:77:0;;;11185:21:1;11242:2;11222:18;;;11215:30;11281:34;11261:18;;;11254:62;-1:-1:-1;;;11332:18:1;;;11325:41;11383:19;;37973:77:0;;;;;;;;;-1:-1:-1;38068:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;38068:22:0;;;;;;;;;;;;37867:231::o;36890:310::-;36992:4;-1:-1:-1;;;;;;37029:41:0;;-1:-1:-1;;;37029:41:0;;:110;;-1:-1:-1;;;;;;;37087:52:0;;-1:-1:-1;;;37087:52:0;37029:110;:163;;;-1:-1:-1;;;;;;;;;;28292:40:0;;;37156:36;37009:183;36890:310;-1:-1:-1;;36890:310:0:o;56745:87::-;4907:6;;-1:-1:-1;;;;;4907:6:0;3638:10;5054:23;5046:68;;;;-1:-1:-1;;;5046:68:0;;;;;;;:::i;:::-;56811:13:::1;56819:4;56811:7;:13::i;:::-;56745:87:::0;:::o;37611:105::-;37671:13;37704:4;37697:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37611:105;;;:::o;23828:566::-;-1:-1:-1;;;;;23904:16:0;;23923:1;23904:16;;;:7;:16;;;;;;23896:71;;;;-1:-1:-1;;;23896:71:0;;;;;;;:::i;:::-;23980:21;24028:15;22431:14;;;22358:95;24028:15;24004:39;;:21;:39;:::i;:::-;23980:63;;24054:15;24072:58;24088:7;24097:13;24112:17;24121:7;-1:-1:-1;;;;;23107:18:0;23080:7;23107:18;;;:9;:18;;;;;;;23024:109;24112:17;24072:15;:58::i;:::-;24054:76;;24151:7;24162:1;24151:12;24143:68;;;;-1:-1:-1;;;24143:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24224:18:0;;;;;;:9;:18;;;;;:29;;24246:7;;24224:18;:29;;24246:7;;24224:29;:::i;:::-;;;;;;;;24282:7;24264:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;24302:35:0;;-1:-1:-1;24320:7:0;24329;24302:17;:35::i;:::-;24353:33;;;-1:-1:-1;;;;;206:32:1;;188:51;;270:2;255:18;;248:34;;;24353:33:0;;161:18:1;24353:33:0;;;;;;;23885:509;;23828:566;:::o;39806:442::-;-1:-1:-1;;;;;40039:20:0;;3638:10;40039:20;;:60;;-1:-1:-1;40063:36:0;40080:4;3638:10;39088:168;:::i;40063:36::-;40017:160;;;;-1:-1:-1;;;40017:160:0;;13732:2:1;40017:160:0;;;13714:21:1;13771:2;13751:18;;;13744:30;13810:34;13790:18;;;13783:62;-1:-1:-1;;;13861:18:1;;;13854:48;13919:19;;40017:160:0;13530:414:1;40017:160:0;40188:52;40211:4;40217:2;40221:3;40226:7;40235:4;40188:22;:52::i;:::-;39806:442;;;;;:::o;24662:641::-;-1:-1:-1;;;;;24744:16:0;;24763:1;24744:16;;;:7;:16;;;;;;24736:71;;;;-1:-1:-1;;;24736:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22695:26:0;;24820:21;22695:26;;;:19;:26;;;;;;24844:30;;-1:-1:-1;;;24844:30:0;;24868:4;24844:30;;;8780:51:1;-1:-1:-1;;;;;24844:15:0;;;;;8753:18:1;;24844:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;24820:77;;24908:15;24926:65;24942:7;24951:13;24966:24;24975:5;24982:7;-1:-1:-1;;;;;23399:21:0;;;23372:7;23399:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;23302:135;24926:65;24908:83;;25012:7;25023:1;25012:12;25004:68;;;;-1:-1:-1;;;25004:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25085:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;25119:7;;25085:21;:41;;25119:7;;25085:41;:::i;:::-;;;;-1:-1:-1;;;;;;;25137:26:0;;;;;;:19;:26;;;;;:37;;25167:7;;25137:26;:37;;25167:7;;25137:37;:::i;:::-;;;;-1:-1:-1;25187:47:0;;-1:-1:-1;25210:5:0;25217:7;25226;25187:22;:47::i;:::-;25250:45;;;-1:-1:-1;;;;;206:32:1;;;188:51;;270:2;255:18;;248:34;;;25250:45:0;;;;;161:18:1;25250:45:0;;;;;;;24725:578;;24662:641;;:::o;38264:524::-;38420:16;38481:3;:10;38462:8;:15;:29;38454:83;;;;-1:-1:-1;;;38454:83:0;;14340:2:1;38454:83:0;;;14322:21:1;14379:2;14359:18;;;14352:30;14418:34;14398:18;;;14391:62;-1:-1:-1;;;14469:18:1;;;14462:39;14518:19;;38454:83:0;14138:405:1;38454:83:0;38550:30;38597:8;:15;38583:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38583:30:0;;38550:63;;38631:9;38626:122;38650:8;:15;38646:1;:19;38626:122;;;38706:30;38716:8;38725:1;38716:11;;;;;;;;:::i;:::-;;;;;;;38729:3;38733:1;38729:6;;;;;;;;:::i;:::-;;;;;;;38706:9;:30::i;:::-;38687:13;38701:1;38687:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;38667:3;;;:::i;:::-;;;38626:122;;;-1:-1:-1;38767:13:0;38264:524;-1:-1:-1;;;38264:524:0:o;5485:103::-;4907:6;;-1:-1:-1;;;;;4907:6:0;3638:10;5054:23;5046:68;;;;-1:-1:-1;;;5046:68:0;;;;;;;:::i;:::-;5550:30:::1;5577:1;5550:18;:30::i;:::-;5485:103::o:0;56649:88::-;4907:6;;-1:-1:-1;;;;;4907:6:0;3638:10;5054:23;5046:68;;;;-1:-1:-1;;;5046:68:0;;;;;;;:::i;:::-;56717:12:::1;::::0;;-1:-1:-1;;56701:28:0;::::1;56717:12;::::0;;;::::1;;;56716:13;56701:28:::0;;::::1;;::::0;;56649:88::o;23528:100::-;23579:7;23606;23614:5;23606:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23606:14:0;;23528:100;-1:-1:-1;;23528:100:0:o;55950:430::-;56017:12;;;;;;;56009:40;;;;-1:-1:-1;;;56009:40:0;;15022:2:1;56009:40:0;;;15004:21:1;15061:2;15041:18;;;15034:30;-1:-1:-1;;;15080:18:1;;;15073:45;15135:18;;56009:40:0;14820:339:1;56009:40:0;56079:8;;56068:7;:19;;56060:62;;;;-1:-1:-1;;;56060:62:0;;15366:2:1;56060:62:0;;;15348:21:1;15405:2;15385:18;;;15378:30;15444:32;15424:18;;;15417:60;15494:18;;56060:62:0;15164:354:1;56060:62:0;56164:9;;56154:19;;:7;:19;:::i;:::-;56141:9;:32;;56133:68;;;;-1:-1:-1;;;56133:68:0;;15898:2:1;56133:68:0;;;15880:21:1;15937:2;15917:18;;;15910:30;15976:25;15956:18;;;15949:53;16019:18;;56133:68:0;15696:347:1;56133:68:0;56268:9;;56257:7;56234:20;56246:7;;54049;54076:16;;;:12;:16;;;;;;;53987:113;56234:20;:30;;;;:::i;:::-;:43;;56212:110;;;;-1:-1:-1;;;56212:110:0;;16250:2:1;56212:110:0;;;16232:21:1;16289:2;16269:18;;;16262:30;-1:-1:-1;;;16308:18:1;;;16301:47;16365:18;;56212:110:0;16048:341:1;56212:110:0;56333:39;56339:10;56351:7;;56360;56333:39;;;;;;;;;;;;:5;:39::i;38861:155::-;38956:52;3638:10;38989:8;38999;38956:18;:52::i;:::-;38861:155;;:::o;56388:253::-;4907:6;;-1:-1:-1;;;;;4907:6:0;3638:10;5054:23;5046:68;;;;-1:-1:-1;;;5046:68:0;;;;;;;:::i;:::-;56448:12:::1;::::0;::::1;;56447:13;56439:40;;;::::0;-1:-1:-1;;;56439:40:0;;16596:2:1;56439:40:0::1;::::0;::::1;16578:21:1::0;16635:2;16615:18;;;16608:30;-1:-1:-1;;;16654:18:1;;;16647:44;16708:18;;56439:40:0::1;16394:338:1::0;56439:40:0::1;56527:9;::::0;56510:7:::1;::::0;54049;54076:16;;;:12;:16;;;;;;56498:25:::1;::::0;56521:2:::1;56498:25;:::i;:::-;:38;;56490:68;;;::::0;-1:-1:-1;;;56490:68:0;;16250:2:1;56490:68:0::1;::::0;::::1;16232:21:1::0;16289:2;16269:18;;;16262:30;-1:-1:-1;;;16308:18:1;;;16301:47;16365:18;;56490:68:0::1;16048:341:1::0;56490:68:0::1;56569:34;56575:10;56587:7;;56596:2;56569:34;;;;;;;;;;;::::0;:5:::1;:34::i;:::-;56614:12;:19:::0;;-1:-1:-1;;56614:19:0::1;56629:4;56614:19;::::0;;56388:253::o;39328:401::-;-1:-1:-1;;;;;39536:20:0;;3638:10;39536:20;;:60;;-1:-1:-1;39560:36:0;39577:4;3638:10;39088:168;:::i;39560:36::-;39514:151;;;;-1:-1:-1;;;39514:151:0;;16939:2:1;39514:151:0;;;16921:21:1;16978:2;16958:18;;;16951:30;17017:34;16997:18;;;16990:62;-1:-1:-1;;;17068:18:1;;;17061:39;17117:19;;39514:151:0;16737:405:1;39514:151:0;39676:45;39694:4;39700:2;39704;39708:6;39716:4;39676:17;:45::i;5743:201::-;4907:6;;-1:-1:-1;;;;;4907:6:0;3638:10;5054:23;5046:68;;;;-1:-1:-1;;;5046:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5832:22:0;::::1;5824:73;;;::::0;-1:-1:-1;;;5824:73:0;;17349:2:1;5824:73:0::1;::::0;::::1;17331:21:1::0;17388:2;17368:18;;;17361:30;17427:34;17407:18;;;17400:62;-1:-1:-1;;;17478:18:1;;;17471:36;17524:19;;5824:73:0::1;17147:402:1::0;5824:73:0::1;5908:28;5927:8;5908:18;:28::i;44034:88::-:0;44101:13;;;;:4;;:13;;;;;:::i;25481:248::-;25691:12;;-1:-1:-1;;;;;25671:16:0;;25627:7;25671:16;;;:7;:16;;;;;;25627:7;;25706:15;;25655:32;;:13;:32;:::i;:::-;25654:49;;;;:::i;:::-;:67;;;;:::i;:::-;25647:74;;25481:248;;;;;;:::o;8796:317::-;8911:6;8886:21;:31;;8878:73;;;;-1:-1:-1;;;8878:73:0;;18108:2:1;8878:73:0;;;18090:21:1;18147:2;18127:18;;;18120:30;18186:31;18166:18;;;18159:59;18235:18;;8878:73:0;17906:353:1;8878:73:0;8965:12;8983:9;-1:-1:-1;;;;;8983:14:0;9005:6;8983:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8964:52;;;9035:7;9027:78;;;;-1:-1:-1;;;9027:78:0;;18676:2:1;9027:78:0;;;18658:21:1;18715:2;18695:18;;;18688:30;18754:34;18734:18;;;18727:62;18825:28;18805:18;;;18798:56;18871:19;;9027:78:0;18474:422:1;9027:78:0;8867:246;8796:317;;:::o;42044:1146::-;42271:7;:14;42257:3;:10;:28;42249:81;;;;-1:-1:-1;;;42249:81:0;;19103:2:1;42249:81:0;;;19085:21:1;19142:2;19122:18;;;19115:30;19181:34;19161:18;;;19154:62;-1:-1:-1;;;19232:18:1;;;19225:38;19280:19;;42249:81:0;18901:404:1;42249:81:0;-1:-1:-1;;;;;42349:16:0;;42341:66;;;;-1:-1:-1;;;42341:66:0;;;;;;;:::i;:::-;3638:10;42464:60;3638:10;42495:4;42501:2;42505:3;42510:7;42519:4;42464:20;:60::i;:::-;42542:9;42537:421;42561:3;:10;42557:1;:14;42537:421;;;42593:10;42606:3;42610:1;42606:6;;;;;;;;:::i;:::-;;;;;;;42593:19;;42627:14;42644:7;42652:1;42644:10;;;;;;;;:::i;:::-;;;;;;;;;;;;42671:19;42693:13;;;;;;;;;;-1:-1:-1;;;;;42693:19:0;;;;;;;;;;;;42644:10;;-1:-1:-1;42735:21:0;;;;42727:76;;;;-1:-1:-1;;;42727:76:0;;;;;;;:::i;:::-;42847:9;:13;;;;;;;;;;;-1:-1:-1;;;;;42847:19:0;;;;;;;;;;42869:20;;;42847:42;;42919:17;;;;;;;:27;;42869:20;;42847:9;42919:27;;42869:20;;42919:27;:::i;:::-;;;;;;;;42578:380;;;42573:3;;;;:::i;:::-;;;42537:421;;;;43005:2;-1:-1:-1;;;;;42975:47:0;42999:4;-1:-1:-1;;;;;42975:47:0;42989:8;-1:-1:-1;;;;;42975:47:0;;43009:3;43014:7;42975:47;;;;;;;:::i;:::-;;;;;;;;43107:75;43143:8;43153:4;43159:2;43163:3;43168:7;43177:4;43107:35;:75::i;:::-;42238:952;42044:1146;;;;;:::o;15502:211::-;15646:58;;;-1:-1:-1;;;;;206:32:1;;15646:58:0;;;188:51:1;255:18;;;;248:34;;;15646:58:0;;;;;;;;;;161:18:1;;;;15646:58:0;;;;;;;;-1:-1:-1;;;;;15646:58:0;-1:-1:-1;;;15646:58:0;;;15619:86;;15639:5;;15619:19;:86::i;6104:191::-;6197:6;;;-1:-1:-1;;;;;6214:17:0;;;-1:-1:-1;;;;;;6214:17:0;;;;;;;6247:40;;6197:6;;;6214:17;6197:6;;6247:40;;6178:16;;6247:40;6167:128;6104:191;:::o;44508:729::-;-1:-1:-1;;;;;44661:16:0;;44653:62;;;;-1:-1:-1;;;44653:62:0;;20799:2:1;44653:62:0;;;20781:21:1;20838:2;20818:18;;;20811:30;20877:34;20857:18;;;20850:62;-1:-1:-1;;;20928:18:1;;;20921:31;20969:19;;44653:62:0;20597:397:1;44653:62:0;3638:10;44728:16;44793:21;44811:2;44793:17;:21::i;:::-;44770:44;;44825:24;44852:25;44870:6;44852:17;:25::i;:::-;44825:52;;44890:66;44911:8;44929:1;44933:2;44937:3;44942:7;44951:4;44890:20;:66::i;:::-;44969:9;:13;;;;;;;;;;;-1:-1:-1;;;;;44969:17:0;;;;;;;;;:27;;44990:6;;44969:9;:27;;44990:6;;44969:27;:::i;:::-;;;;-1:-1:-1;;45012:52:0;;;21173:25:1;;;21229:2;21214:18;;21207:34;;;-1:-1:-1;;;;;45012:52:0;;;;45045:1;;45012:52;;;;;;21146:18:1;45012:52:0;;;;;;;45155:74;45186:8;45204:1;45208:2;45212;45216:6;45224:4;45155:30;:74::i;:::-;44642:595;;;44508:729;;;;:::o;48778:331::-;48933:8;-1:-1:-1;;;;;48924:17:0;:5;-1:-1:-1;;;;;48924:17:0;;48916:71;;;;-1:-1:-1;;;48916:71:0;;21454:2:1;48916:71:0;;;21436:21:1;21493:2;21473:18;;;21466:30;21532:34;21512:18;;;21505:62;-1:-1:-1;;;21583:18:1;;;21576:39;21632:19;;48916:71:0;21252:405:1;48916:71:0;-1:-1:-1;;;;;48998:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;48998:46:0;;;;;;;;;;49060:41;;1457::1;;;49060::0;;1430:18:1;49060:41:0;;;;;;;48778:331;;;:::o;40712:974::-;-1:-1:-1;;;;;40900:16:0;;40892:66;;;;-1:-1:-1;;;40892:66:0;;;;;;;:::i;:::-;3638:10;40971:16;41036:21;41054:2;41036:17;:21::i;:::-;41013:44;;41068:24;41095:25;41113:6;41095:17;:25::i;:::-;41068:52;;41133:60;41154:8;41164:4;41170:2;41174:3;41179:7;41188:4;41133:20;:60::i;:::-;41206:19;41228:13;;;;;;;;;;;-1:-1:-1;;;;;41228:19:0;;;;;;;;;;41266:21;;;;41258:76;;;;-1:-1:-1;;;41258:76:0;;;;;;;:::i;:::-;41370:9;:13;;;;;;;;;;;-1:-1:-1;;;;;41370:19:0;;;;;;;;;;41392:20;;;41370:42;;41434:17;;;;;;;:27;;41392:20;;41370:9;41434:27;;41392:20;;41434:27;:::i;:::-;;;;-1:-1:-1;;41479:46:0;;;21173:25:1;;;21229:2;21214:18;;21207:34;;;-1:-1:-1;;;;;41479:46:0;;;;;;;;;;;;;;21146:18:1;41479:46:0;;;;;;;41610:68;41641:8;41651:4;41657:2;41661;41665:6;41673:4;41610:30;:68::i;:::-;40881:805;;;;40712:974;;;;;:::o;54395:931::-;-1:-1:-1;;;;;54717:18:0;;54713:160;;54757:9;54752:110;54776:3;:10;54772:1;:14;54752:110;;;54836:7;54844:1;54836:10;;;;;;;;:::i;:::-;;;;;;;54812:12;:20;54825:3;54829:1;54825:6;;;;;;;;:::i;:::-;;;;;;;54812:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;54788:3:0;;-1:-1:-1;54788:3:0;;:::i;:::-;;;54752:110;;;;54713:160;-1:-1:-1;;;;;54889:16:0;;54885:434;;54927:9;54922:386;54946:3;:10;54942:1;:14;54922:386;;;54982:10;54995:3;54999:1;54995:6;;;;;;;;:::i;:::-;;;;;;;54982:19;;55020:14;55037:7;55045:1;55037:10;;;;;;;;:::i;:::-;;;;;;;55020:27;;55066:14;55083:12;:16;55096:2;55083:16;;;;;;;;;;;;55066:33;;55136:6;55126;:16;;55118:69;;;;-1:-1:-1;;;55118:69:0;;21864:2:1;55118:69:0;;;21846:21:1;21903:2;21883:18;;;21876:30;21942:34;21922:18;;;21915:62;-1:-1:-1;;;21993:18:1;;;21986:38;22041:19;;55118:69:0;21662:404:1;55118:69:0;55239:16;;;;:12;:16;;;;;;55258:15;;55239:34;;54958:3;;;:::i;:::-;;;54922:386;;52221:813;-1:-1:-1;;;;;52461:13:0;;7830:19;:23;52457:570;;52497:79;;-1:-1:-1;;;52497:79:0;;-1:-1:-1;;;;;52497:43:0;;;;;:79;;52541:8;;52551:4;;52557:3;;52562:7;;52571:4;;52497:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52497:79:0;;;;;;;;-1:-1:-1;;52497:79:0;;;;;;;;;;;;:::i;:::-;;;52493:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;52889:6;52882:14;;-1:-1:-1;;;52882:14:0;;;;;;;;:::i;52493:523::-;;;52938:62;;-1:-1:-1;;;52938:62:0;;24219:2:1;52938:62:0;;;24201:21:1;24258:2;24238:18;;;24231:30;24297:34;24277:18;;;24270:62;-1:-1:-1;;;24348:18:1;;;24341:50;24408:19;;52938:62:0;24017:416:1;52493:523:0;-1:-1:-1;;;;;;52658:60:0;;-1:-1:-1;;;52658:60:0;52654:159;;52743:50;;-1:-1:-1;;;52743:50:0;;;;;;;:::i;18075:716::-;18499:23;18525:69;18553:4;18525:69;;;;;;;;;;;;;;;;;18533:5;-1:-1:-1;;;;;18525:27:0;;;:69;;;;;:::i;:::-;18609:17;;18499:95;;-1:-1:-1;18609:21:0;18605:179;;18706:10;18695:30;;;;;;;;;;;;:::i;:::-;18687:85;;;;-1:-1:-1;;;18687:85:0;;25299:2:1;18687:85:0;;;25281:21:1;25338:2;25318:18;;;25311:30;25377:34;25357:18;;;25350:62;-1:-1:-1;;;25428:18:1;;;25421:40;25478:19;;18687:85:0;25097:406:1;53042:198:0;53162:16;;;53176:1;53162:16;;;;;;;;;53108;;53137:22;;53162:16;;;;;;;;;;;;-1:-1:-1;53162:16:0;53137:41;;53200:7;53189:5;53195:1;53189:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;53227:5;53042:198;-1:-1:-1;;53042:198:0:o;51469:744::-;-1:-1:-1;;;;;51684:13:0;;7830:19;:23;51680:526;;51720:72;;-1:-1:-1;;;51720:72:0;;-1:-1:-1;;;;;51720:38:0;;;;;:72;;51759:8;;51769:4;;51775:2;;51779:6;;51787:4;;51720:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51720:72:0;;;;;;;;-1:-1:-1;;51720:72:0;;;;;;;;;;;;:::i;:::-;;;51716:479;;;;:::i;:::-;-1:-1:-1;;;;;;51842:55:0;;-1:-1:-1;;;51842:55:0;51838:154;;51922:50;;-1:-1:-1;;;51922:50:0;;;;;;;:::i;10280:229::-;10417:12;10449:52;10471:6;10479:4;10485:1;10488:12;10417;-1:-1:-1;;;;;7830:19:0;;;11687:60;;;;-1:-1:-1;;;11687:60:0;;26683:2:1;11687:60:0;;;26665:21:1;26722:2;26702:18;;;26695:30;26761:31;26741:18;;;26734:59;26810:18;;11687:60:0;26481:353:1;11687:60:0;11761:12;11775:23;11802:6;-1:-1:-1;;;;;11802:11:0;11821:5;11828:4;11802:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11760:73;;;;11851:51;11868:7;11877:10;11889:12;11851:16;:51::i;:::-;11844:58;11400:510;-1:-1:-1;;;;;;;11400:510:0:o;14086:712::-;14236:12;14265:7;14261:530;;;-1:-1:-1;14296:10:0;14289:17;;14261:530;14410:17;;:21;14406:374;;14608:10;14602:17;14669:15;14656:10;14652:2;14648:19;14641:44;14406:374;14751:12;14744:20;;-1:-1:-1;;;14744:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;293:131:1;-1:-1:-1;;;;;368:31:1;;358:42;;348:70;;414:1;411;404:12;429:315;497:6;505;558:2;546:9;537:7;533:23;529:32;526:52;;;574:1;571;564:12;526:52;613:9;600:23;632:31;657:5;632:31;:::i;:::-;682:5;734:2;719:18;;;;706:32;;-1:-1:-1;;;429:315:1:o;931:131::-;-1:-1:-1;;;;;;1005:32:1;;995:43;;985:71;;1052:1;1049;1042:12;1067:245;1125:6;1178:2;1166:9;1157:7;1153:23;1149:32;1146:52;;;1194:1;1191;1184:12;1146:52;1233:9;1220:23;1252:30;1276:5;1252:30;:::i;1509:127::-;1570:10;1565:3;1561:20;1558:1;1551:31;1601:4;1598:1;1591:15;1625:4;1622:1;1615:15;1641:249;1751:2;1732:13;;-1:-1:-1;;1728:27:1;1716:40;;1786:18;1771:34;;1807:22;;;1768:62;1765:88;;;1833:18;;:::i;:::-;1869:2;1862:22;-1:-1:-1;;1641:249:1:o;1895:469::-;1960:5;1994:18;1986:6;1983:30;1980:56;;;2016:18;;:::i;:::-;2065:2;2059:9;2077:69;2134:2;2113:15;;-1:-1:-1;;2109:29:1;2140:4;2105:40;2059:9;2077:69;:::i;:::-;2164:6;2155:15;;2194:6;2186;2179:22;2234:3;2225:6;2220:3;2216:16;2213:25;2210:45;;;2251:1;2248;2241:12;2210:45;2301:6;2296:3;2289:4;2281:6;2277:17;2264:44;2356:1;2349:4;2340:6;2332;2328:19;2324:30;2317:41;;1895:469;;;;;:::o;2369:451::-;2438:6;2491:2;2479:9;2470:7;2466:23;2462:32;2459:52;;;2507:1;2504;2497:12;2459:52;2547:9;2534:23;2580:18;2572:6;2569:30;2566:50;;;2612:1;2609;2602:12;2566:50;2635:22;;2688:4;2680:13;;2676:27;-1:-1:-1;2666:55:1;;2717:1;2714;2707:12;2666:55;2740:74;2806:7;2801:2;2788:16;2783:2;2779;2775:11;2740:74;:::i;:::-;2730:84;2369:451;-1:-1:-1;;;;2369:451:1:o;2825:180::-;2884:6;2937:2;2925:9;2916:7;2912:23;2908:32;2905:52;;;2953:1;2950;2943:12;2905:52;-1:-1:-1;2976:23:1;;2825:180;-1:-1:-1;2825:180:1:o;3010:258::-;3082:1;3092:113;3106:6;3103:1;3100:13;3092:113;;;3182:11;;;3176:18;3163:11;;;3156:39;3128:2;3121:10;3092:113;;;3223:6;3220:1;3217:13;3214:48;;;3258:1;3249:6;3244:3;3240:16;3233:27;3214:48;;3010:258;;;:::o;3273:::-;3315:3;3353:5;3347:12;3380:6;3375:3;3368:19;3396:63;3452:6;3445:4;3440:3;3436:14;3429:4;3422:5;3418:16;3396:63;:::i;:::-;3513:2;3492:15;-1:-1:-1;;3488:29:1;3479:39;;;;3520:4;3475:50;;3273:258;-1:-1:-1;;3273:258:1:o;3536:220::-;3685:2;3674:9;3667:21;3648:4;3705:45;3746:2;3735:9;3731:18;3723:6;3705:45;:::i;3761:255::-;3828:6;3881:2;3869:9;3860:7;3856:23;3852:32;3849:52;;;3897:1;3894;3887:12;3849:52;3936:9;3923:23;3955:31;3980:5;3955:31;:::i;4021:183::-;4081:4;4114:18;4106:6;4103:30;4100:56;;;4136:18;;:::i;:::-;-1:-1:-1;4181:1:1;4177:14;4193:4;4173:25;;4021:183::o;4209:724::-;4263:5;4316:3;4309:4;4301:6;4297:17;4293:27;4283:55;;4334:1;4331;4324:12;4283:55;4370:6;4357:20;4396:4;4419:43;4459:2;4419:43;:::i;:::-;4491:2;4485:9;4503:31;4531:2;4523:6;4503:31;:::i;:::-;4569:18;;;4661:1;4657:10;;;;4645:23;;4641:32;;;4603:15;;;;-1:-1:-1;4685:15:1;;;4682:35;;;4713:1;4710;4703:12;4682:35;4749:2;4741:6;4737:15;4761:142;4777:6;4772:3;4769:15;4761:142;;;4843:17;;4831:30;;4881:12;;;;4794;;4761:142;;;-1:-1:-1;4921:6:1;4209:724;-1:-1:-1;;;;;;4209:724:1:o;4938:221::-;4980:5;5033:3;5026:4;5018:6;5014:17;5010:27;5000:55;;5051:1;5048;5041:12;5000:55;5073:80;5149:3;5140:6;5127:20;5120:4;5112:6;5108:17;5073:80;:::i;5164:1071::-;5318:6;5326;5334;5342;5350;5403:3;5391:9;5382:7;5378:23;5374:33;5371:53;;;5420:1;5417;5410:12;5371:53;5459:9;5446:23;5478:31;5503:5;5478:31;:::i;:::-;5528:5;-1:-1:-1;5585:2:1;5570:18;;5557:32;5598:33;5557:32;5598:33;:::i;:::-;5650:7;-1:-1:-1;5708:2:1;5693:18;;5680:32;5731:18;5761:14;;;5758:34;;;5788:1;5785;5778:12;5758:34;5811:61;5864:7;5855:6;5844:9;5840:22;5811:61;:::i;:::-;5801:71;;5925:2;5914:9;5910:18;5897:32;5881:48;;5954:2;5944:8;5941:16;5938:36;;;5970:1;5967;5960:12;5938:36;5993:63;6048:7;6037:8;6026:9;6022:24;5993:63;:::i;:::-;5983:73;;6109:3;6098:9;6094:19;6081:33;6065:49;;6139:2;6129:8;6126:16;6123:36;;;6155:1;6152;6145:12;6123:36;;6178:51;6221:7;6210:8;6199:9;6195:24;6178:51;:::i;:::-;6168:61;;;5164:1071;;;;;;;;:::o;6240:401::-;6321:6;6329;6382:2;6370:9;6361:7;6357:23;6353:32;6350:52;;;6398:1;6395;6388:12;6350:52;6437:9;6424:23;6456:31;6481:5;6456:31;:::i;:::-;6506:5;-1:-1:-1;6563:2:1;6548:18;;6535:32;6576:33;6535:32;6576:33;:::i;:::-;6628:7;6618:17;;;6240:401;;;;;:::o;6646:1277::-;6764:6;6772;6825:2;6813:9;6804:7;6800:23;6796:32;6793:52;;;6841:1;6838;6831:12;6793:52;6881:9;6868:23;6910:18;6951:2;6943:6;6940:14;6937:34;;;6967:1;6964;6957:12;6937:34;7005:6;6994:9;6990:22;6980:32;;7050:7;7043:4;7039:2;7035:13;7031:27;7021:55;;7072:1;7069;7062:12;7021:55;7108:2;7095:16;7130:4;7153:43;7193:2;7153:43;:::i;:::-;7225:2;7219:9;7237:31;7265:2;7257:6;7237:31;:::i;:::-;7303:18;;;7391:1;7387:10;;;;7379:19;;7375:28;;;7337:15;;;;-1:-1:-1;7415:19:1;;;7412:39;;;7447:1;7444;7437:12;7412:39;7471:11;;;;7491:217;7507:6;7502:3;7499:15;7491:217;;;7587:3;7574:17;7604:31;7629:5;7604:31;:::i;:::-;7648:18;;7524:12;;;;7686;;;;7491:217;;;7727:6;-1:-1:-1;;7771:18:1;;7758:32;;-1:-1:-1;;7802:16:1;;;7799:36;;;7831:1;7828;7821:12;7799:36;;7854:63;7909:7;7898:8;7887:9;7883:24;7854:63;:::i;:::-;7844:73;;;6646:1277;;;;;:::o;7928:435::-;7981:3;8019:5;8013:12;8046:6;8041:3;8034:19;8072:4;8101:2;8096:3;8092:12;8085:19;;8138:2;8131:5;8127:14;8159:1;8169:169;8183:6;8180:1;8177:13;8169:169;;;8244:13;;8232:26;;8278:12;;;;8313:15;;;;8205:1;8198:9;8169:169;;;-1:-1:-1;8354:3:1;;7928:435;-1:-1:-1;;;;;7928:435:1:o;8368:261::-;8547:2;8536:9;8529:21;8510:4;8567:56;8619:2;8608:9;8604:18;8596:6;8567:56;:::i;9094:118::-;9180:5;9173:13;9166:21;9159:5;9156:32;9146:60;;9202:1;9199;9192:12;9217:382;9282:6;9290;9343:2;9331:9;9322:7;9318:23;9314:32;9311:52;;;9359:1;9356;9349:12;9311:52;9398:9;9385:23;9417:31;9442:5;9417:31;:::i;:::-;9467:5;-1:-1:-1;9524:2:1;9509:18;;9496:32;9537:30;9496:32;9537:30;:::i;10262:734::-;10366:6;10374;10382;10390;10398;10451:3;10439:9;10430:7;10426:23;10422:33;10419:53;;;10468:1;10465;10458:12;10419:53;10507:9;10494:23;10526:31;10551:5;10526:31;:::i;:::-;10576:5;-1:-1:-1;10633:2:1;10618:18;;10605:32;10646:33;10605:32;10646:33;:::i;:::-;10698:7;-1:-1:-1;10752:2:1;10737:18;;10724:32;;-1:-1:-1;10803:2:1;10788:18;;10775:32;;-1:-1:-1;10858:3:1;10843:19;;10830:33;10886:18;10875:30;;10872:50;;;10918:1;10915;10908:12;10872:50;10941:49;10982:7;10973:6;10962:9;10958:22;10941:49;:::i;11413:356::-;11615:2;11597:21;;;11634:18;;;11627:30;11693:34;11688:2;11673:18;;11666:62;11760:2;11745:18;;11413:356::o;11774:380::-;11853:1;11849:12;;;;11896;;;11917:61;;11971:4;11963:6;11959:17;11949:27;;11917:61;12024:2;12016:6;12013:14;11993:18;11990:38;11987:161;;12070:10;12065:3;12061:20;12058:1;12051:31;12105:4;12102:1;12095:15;12133:4;12130:1;12123:15;11987:161;;11774:380;;;:::o;12159:402::-;12361:2;12343:21;;;12400:2;12380:18;;;12373:30;12439:34;12434:2;12419:18;;12412:62;-1:-1:-1;;;12505:2:1;12490:18;;12483:36;12551:3;12536:19;;12159:402::o;12566:127::-;12627:10;12622:3;12618:20;12615:1;12608:31;12658:4;12655:1;12648:15;12682:4;12679:1;12672:15;12698:128;12738:3;12769:1;12765:6;12762:1;12759:13;12756:39;;;12775:18;;:::i;:::-;-1:-1:-1;12811:9:1;;12698:128::o;12831:407::-;13033:2;13015:21;;;13072:2;13052:18;;;13045:30;13111:34;13106:2;13091:18;;13084:62;-1:-1:-1;;;13177:2:1;13162:18;;13155:41;13228:3;13213:19;;12831:407::o;13949:184::-;14019:6;14072:2;14060:9;14051:7;14047:23;14043:32;14040:52;;;14088:1;14085;14078:12;14040:52;-1:-1:-1;14111:16:1;;13949:184;-1:-1:-1;13949:184:1:o;14548:127::-;14609:10;14604:3;14600:20;14597:1;14590:31;14640:4;14637:1;14630:15;14664:4;14661:1;14654:15;14680:135;14719:3;14740:17;;;14737:43;;14760:18;;:::i;:::-;-1:-1:-1;14807:1:1;14796:13;;14680:135::o;15523:168::-;15563:7;15629:1;15625;15621:6;15617:14;15614:1;15611:21;15606:1;15599:9;15592:17;15588:45;15585:71;;;15636:18;;:::i;:::-;-1:-1:-1;15676:9:1;;15523:168::o;17554:217::-;17594:1;17620;17610:132;;17664:10;17659:3;17655:20;17652:1;17645:31;17699:4;17696:1;17689:15;17727:4;17724:1;17717:15;17610:132;-1:-1:-1;17756:9:1;;17554:217::o;17776:125::-;17816:4;17844:1;17841;17838:8;17835:34;;;17849:18;;:::i;:::-;-1:-1:-1;17886:9:1;;17776:125::o;19310:401::-;19512:2;19494:21;;;19551:2;19531:18;;;19524:30;19590:34;19585:2;19570:18;;19563:62;-1:-1:-1;;;19656:2:1;19641:18;;19634:35;19701:3;19686:19;;19310:401::o;19716:406::-;19918:2;19900:21;;;19957:2;19937:18;;;19930:30;19996:34;19991:2;19976:18;;19969:62;-1:-1:-1;;;20062:2:1;20047:18;;20040:40;20112:3;20097:19;;19716:406::o;20127:465::-;20384:2;20373:9;20366:21;20347:4;20410:56;20462:2;20451:9;20447:18;20439:6;20410:56;:::i;:::-;20514:9;20506:6;20502:22;20497:2;20486:9;20482:18;20475:50;20542:44;20579:6;20571;20542:44;:::i;:::-;20534:52;20127:465;-1:-1:-1;;;;;20127:465:1:o;22071:827::-;-1:-1:-1;;;;;22468:15:1;;;22450:34;;22520:15;;22515:2;22500:18;;22493:43;22430:3;22567:2;22552:18;;22545:31;;;22393:4;;22599:57;;22636:19;;22628:6;22599:57;:::i;:::-;22704:9;22696:6;22692:22;22687:2;22676:9;22672:18;22665:50;22738:44;22775:6;22767;22738:44;:::i;:::-;22724:58;;22831:9;22823:6;22819:22;22813:3;22802:9;22798:19;22791:51;22859:33;22885:6;22877;22859:33;:::i;:::-;22851:41;22071:827;-1:-1:-1;;;;;;;;22071:827:1:o;22903:249::-;22972:6;23025:2;23013:9;23004:7;23000:23;22996:32;22993:52;;;23041:1;23038;23031:12;22993:52;23073:9;23067:16;23092:30;23116:5;23092:30;:::i;23157:179::-;23192:3;23234:1;23216:16;23213:23;23210:120;;;23280:1;23277;23274;23259:23;-1:-1:-1;23317:1:1;23311:8;23306:3;23302:18;23210:120;23157:179;:::o;23341:671::-;23380:3;23422:4;23404:16;23401:26;23398:39;;;23341:671;:::o;23398:39::-;23464:2;23458:9;-1:-1:-1;;23529:16:1;23525:25;;23522:1;23458:9;23501:50;23580:4;23574:11;23604:16;23639:18;23710:2;23703:4;23695:6;23691:17;23688:25;23683:2;23675:6;23672:14;23669:45;23666:58;;;23717:5;;;;;23341:671;:::o;23666:58::-;23754:6;23748:4;23744:17;23733:28;;23790:3;23784:10;23817:2;23809:6;23806:14;23803:27;;;23823:5;;;;;;23341:671;:::o;23803:27::-;23907:2;23888:16;23882:4;23878:27;23874:36;23867:4;23858:6;23853:3;23849:16;23845:27;23842:69;23839:82;;;23914:5;;;;;;23341:671;:::o;23839:82::-;23930:57;23981:4;23972:6;23964;23960:19;23956:30;23950:4;23930:57;:::i;:::-;-1:-1:-1;24003:3:1;;23341:671;-1:-1:-1;;;;;23341:671:1:o;24438:404::-;24640:2;24622:21;;;24679:2;24659:18;;;24652:30;24718:34;24713:2;24698:18;;24691:62;-1:-1:-1;;;24784:2:1;24769:18;;24762:38;24832:3;24817:19;;24438:404::o;24847:245::-;24914:6;24967:2;24955:9;24946:7;24942:23;24938:32;24935:52;;;24983:1;24980;24973:12;24935:52;25015:9;25009:16;25034:28;25056:5;25034:28;:::i;25508:561::-;-1:-1:-1;;;;;25805:15:1;;;25787:34;;25857:15;;25852:2;25837:18;;25830:43;25904:2;25889:18;;25882:34;;;25947:2;25932:18;;25925:34;;;25767:3;25990;25975:19;;25968:32;;;25730:4;;26017:46;;26043:19;;26035:6;26017:46;:::i;26839:274::-;26968:3;27006:6;27000:13;27022:53;27068:6;27063:3;27056:4;27048:6;27044:17;27022:53;:::i;:::-;27091:16;;;;;26839:274;-1:-1:-1;;26839:274:1:o

Swarm Source

ipfs://1c57861425ab949051904a0cbe725122f4edb5ab8059c6d8d2ea9f47c8b898dd
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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