ETH Price: $2,517.85 (+2.26%)

Token

IntegrityofJosephChambers (BSHJ)
 

Overview

Max Total Supply

32 BSHJ

Holders

13

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BSHJ
0x6c1cc019559b5682d627953d08a91c94a80df1a5
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:
IntegrityofJosephChambers

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-09-20
*/

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


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

// 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/utils/[email protected]

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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


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

// OpenZeppelin Contracts (last updated v4.7.0) (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. The distribution of shares is set at the
 * time of contract deployment and can't be updated thereafter.
 *
 * `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 Getter for the amount of payee's releasable Ether.
     */
    function releasable(address account) public view returns (uint256) {
        uint256 totalReceived = address(this).balance + totalReleased();
        return _pendingPayment(account, totalReceived, released(account));
    }

    /**
     * @dev Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an
     * IERC20 contract.
     */
    function releasable(IERC20 token, address account) public view returns (uint256) {
        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        return _pendingPayment(account, totalReceived, released(token, account));
    }

    /**
     * @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 payment = releasable(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 payment = releasable(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/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}


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

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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}


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

// 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/[email protected]

// 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/access/[email protected]

// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


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

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

pragma solidity ^0.8.0;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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


// File contracts/IntegrityofJosephChambers.sol


pragma solidity ^0.8.0;
/*
* @title ERC721 token for Integrity of Joseph Chambers
* @author Digitizing.io
*/
contract IntegrityofJosephChambers is AccessControl, ReentrancyGuard, PaymentSplitter, IERC721Metadata, ERC721 {

    bytes32 public constant RESERVE_ROLE = keccak256("RESERVE_ROLE");

    uint256 public totalSupply = 0;
    uint256 public constant MAX_SUPPLY = 5000;
    uint256 public remainingReserve = 100;
    uint256 public salePrice = 0.12 ether;

    uint256 public saleActiveTimestamp = type(uint256).max;

    uint256 public constant MAX_NFTS_PER_TX = 5;

    string private _baseTokenURI;

    constructor(
        string memory baseURI, 
        address[] memory payees, 
        uint256[] memory shares
    )ERC721("IntegrityofJosephChambers", "BSHJ") PaymentSplitter(payees, shares){
        _baseTokenURI = baseURI;
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }

    /// ---------------------------
    /// ------ Public Views -------
    /// ---------------------------

    /**
    * @notice returns the start date of the mint
    */
    function saleIsActive() public view returns(bool) {
        return block.timestamp > saleActiveTimestamp;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override(ERC721,IERC721Metadata) returns (string memory) {
        require(_exists(tokenId), 'token doesnt exist');
        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), '.json')) : '';
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, AccessControl, IERC165) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /// ---------------------------
    /// -------- Internal ---------
    /// ---------------------------

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }

    /// ---------------------------
    /// --------- Public ----------
    /// ---------------------------

    /**
    * @notice mint function for front end public mint, this function calls publicMintTo
    *
    * @param numberOfTokens the amount of tokens to purchase 
    */
    function publicMint(uint256 numberOfTokens) public payable {
        publicMintTo(msg.sender, numberOfTokens);
    }

    /**
    * @notice mint function for public mint
    *
    * @param _to address who you are minting to  
    * @param numberOfTokens the amount of tokens to purchase 
    */
    function publicMintTo(address _to, uint256 numberOfTokens) nonReentrant public payable {
        require(saleIsActive(), "Sale must be active!");
        require(numberOfTokens > 0 && numberOfTokens <= MAX_NFTS_PER_TX, "Greater than 0 and less than equal max tx"); 
        require(salePrice * numberOfTokens == msg.value, "Not enough ETH sent");

        uint256 supply = totalSupply;
        totalSupply += numberOfTokens;
        require(totalSupply + remainingReserve <= MAX_SUPPLY, "Purchase would exceed max supply"); 

        for (uint256 i; i < numberOfTokens; i++) {
            _safeMint(_to, supply + i);
        }
    }

    /// ---------------------------
    /// --------- Admin -----------
    /// ---------------------------

    /**
    * @notice mint function to obtain the reserved tokens, can only be called by correct role
    *
    * @param _to address who you are minting to  
    * @param numberOfTokens the amount of tokens from the reserce to be minted
    */
    function reserveTokens(address _to, uint256 numberOfTokens) public onlyRole(RESERVE_ROLE) {
        uint256 supply = totalSupply;
        totalSupply += numberOfTokens;
        require(numberOfTokens <= remainingReserve, "Exceeded reserve amount");
        for (uint i = 0; i < numberOfTokens; i++) {
            _safeMint(_to, supply + i);
        }
        remainingReserve -= numberOfTokens;
    }

    /**
     * @dev Set the base token URI
     */
    function setBaseTokenURI(string memory baseURI) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _baseTokenURI = baseURI;
    }

    /**
     * @dev Set the mint start time.
     */
    function setSaleActiveTimestamp(uint256 _saleActiveTimestamp) public onlyRole(DEFAULT_ADMIN_ROLE) {
        saleActiveTimestamp = _saleActiveTimestamp;
    }

    /**
     * @dev Set the mint price.
     */
    function setPrice(uint256 _salePrice) public onlyRole(DEFAULT_ADMIN_ROLE) {
        salePrice = _salePrice;
    }

    /**
    * @notice withdraw all funds
    */
    function withdrawAll() public onlyRole(DEFAULT_ADMIN_ROLE) {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFTS_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"publicMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"remainingReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActiveTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"baseURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleActiveTimestamp","type":"uint256"}],"name":"setSaleActiveTimestamp","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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600f5560646010556701aa535d3d0c00006011556000196012553480156200002d57600080fd5b5060405162003302380380620033028339810160408190526200005091620006d9565b6040518060400160405280601981526020017f496e746567726974796f664a6f736570684368616d6265727300000000000000815250604051806040016040528060048152602001632129a42560e11b81525083836001808190555080518251146200011e5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620001715760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000115565b60005b8251811015620001dd57620001c8838281518110620001975762000197620007e5565b6020026020010151838381518110620001b457620001b4620007e5565b60200260200101516200023a60201b60201c565b80620001d48162000811565b91505062000174565b50508251620001f591506009906020850190620004d8565b5080516200020b90600a906020840190620004d8565b505083516200022391506013906020860190620004d8565b506200023160003362000428565b50505062000884565b6001600160a01b038216620002a75760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000115565b60008111620002f95760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000115565b6001600160a01b03821660009081526004602052604090205415620003755760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000115565b60068054600181019091557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0384169081179091556000908152600460205260409020819055600254620003df9082906200082d565b600255604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b62000434828262000438565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000434576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620004943390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b828054620004e69062000848565b90600052602060002090601f0160209004810192826200050a576000855562000555565b82601f106200052557805160ff191683800117855562000555565b8280016001018555821562000555579182015b828111156200055557825182559160200191906001019062000538565b506200056392915062000567565b5090565b5b8082111562000563576000815560010162000568565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620005bf57620005bf6200057e565b604052919050565b60006001600160401b03821115620005e357620005e36200057e565b5060051b60200190565b600082601f830112620005ff57600080fd5b81516020620006186200061283620005c7565b62000594565b82815260059290921b840181019181810190868411156200063857600080fd5b8286015b848110156200066c5780516001600160a01b03811681146200065e5760008081fd5b83529183019183016200063c565b509695505050505050565b600082601f8301126200068957600080fd5b815160206200069c6200061283620005c7565b82815260059290921b84018101918181019086841115620006bc57600080fd5b8286015b848110156200066c5780518352918301918301620006c0565b600080600060608486031215620006ef57600080fd5b83516001600160401b03808211156200070757600080fd5b818601915086601f8301126200071c57600080fd5b8151818111156200073157620007316200057e565b602062000747601f8301601f1916820162000594565b82815289828487010111156200075c57600080fd5b60005b838110156200077c5785810183015182820184015282016200075f565b838111156200078e5760008385840101525b509088015190965092505080821115620007a757600080fd5b620007b587838801620005ed565b93506040860151915080821115620007cc57600080fd5b50620007db8682870162000677565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620008265762000826620007fb565b5060010190565b60008219821115620008435762000843620007fb565b500190565b600181811c908216806200085d57607f821691505b6020821081036200087e57634e487b7160e01b600052602260045260246000fd5b50919050565b612a6e80620008946000396000f3fe6080604052600436106102765760003560e01c806370a082311161014f578063a3f8eace116100c1578063d79779b21161007a578063d79779b2146107e0578063e33b7de314610816578063e985e9c51461082b578063eb8d244414610874578063f51f96dd1461088b578063f88ca86b146108a157600080fd5b8063a3f8eace1461070a578063b88d4fde1461072a578063c45ac0501461074a578063c87b56dd1461076a578063ce7c2ac21461078a578063d547741f146107c057600080fd5b806391d148541161011357806391d148541461065457806395d89b41146106745780639852595c14610689578063a060ae18146106bf578063a217fddf146106d5578063a22cb465146106ea57600080fd5b806370a08231146105bf57806378cf19e9146105df578063853828b6146105ff5780638b83209b1461061457806391b7f5ed1461063457600080fd5b80632db11544116101e85780633a98ef39116101ac5780633a98ef39146104f1578063406072a91461050657806342842e0e1461054c57806348b750441461056c5780635b06d8531461058c5780636352211e1461059f57600080fd5b80632db11544146104685780632f2ff15d1461047b57806330176e131461049b57806332cb6b0c146104bb57806336568abe146104d157600080fd5b80631608b47b1161023a5780631608b47b1461039857806318160ddd146103ae57806319165587146103c4578063191fd57d146103e457806323b872dd14610418578063248a9ca31461043857600080fd5b806301ffc9a7146102c457806306fdde03146102f9578063081812fc1461031b578063095ea7b3146103535780631168a6311461037557600080fd5b366102bf577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156102d057600080fd5b506102e46102df366004612372565b6108c1565b60405190151581526020015b60405180910390f35b34801561030557600080fd5b5061030e6108d2565b6040516102f091906123e7565b34801561032757600080fd5b5061033b6103363660046123fa565b610964565b6040516001600160a01b0390911681526020016102f0565b34801561035f57600080fd5b5061037361036e366004612428565b61098b565b005b34801561038157600080fd5b5061038a600581565b6040519081526020016102f0565b3480156103a457600080fd5b5061038a60125481565b3480156103ba57600080fd5b5061038a600f5481565b3480156103d057600080fd5b506103736103df366004612454565b610aa5565b3480156103f057600080fd5b5061038a7fbf575aa07286781f90c1bdc8f4940c6c29874a0c25a1f1fe7661650b409c01ff81565b34801561042457600080fd5b50610373610433366004612471565b610b9e565b34801561044457600080fd5b5061038a6104533660046123fa565b60009081526020819052604090206001015490565b6103736104763660046123fa565b610bcf565b34801561048757600080fd5b506103736104963660046124b2565b610bdc565b3480156104a757600080fd5b506103736104b636600461256e565b610c01565b3480156104c757600080fd5b5061038a61138881565b3480156104dd57600080fd5b506103736104ec3660046124b2565b610c1f565b3480156104fd57600080fd5b5060025461038a565b34801561051257600080fd5b5061038a6105213660046125b7565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561055857600080fd5b50610373610567366004612471565b610c9d565b34801561057857600080fd5b506103736105873660046125b7565b610cb8565b61037361059a366004612428565b610ddb565b3480156105ab57600080fd5b5061033b6105ba3660046123fa565b610fee565b3480156105cb57600080fd5b5061038a6105da366004612454565b61104e565b3480156105eb57600080fd5b506103736105fa366004612428565b6110d4565b34801561060b57600080fd5b506103736111b1565b34801561062057600080fd5b5061033b61062f3660046123fa565b6111e0565b34801561064057600080fd5b5061037361064f3660046123fa565b611210565b34801561066057600080fd5b506102e461066f3660046124b2565b611221565b34801561068057600080fd5b5061030e61124a565b34801561069557600080fd5b5061038a6106a4366004612454565b6001600160a01b031660009081526005602052604090205490565b3480156106cb57600080fd5b5061038a60105481565b3480156106e157600080fd5b5061038a600081565b3480156106f657600080fd5b506103736107053660046125f3565b611259565b34801561071657600080fd5b5061038a610725366004612454565b611264565b34801561073657600080fd5b50610373610745366004612621565b6112ac565b34801561075657600080fd5b5061038a6107653660046125b7565b6112e4565b34801561077657600080fd5b5061030e6107853660046123fa565b6113af565b34801561079657600080fd5b5061038a6107a5366004612454565b6001600160a01b031660009081526004602052604090205490565b3480156107cc57600080fd5b506103736107db3660046124b2565b611466565b3480156107ec57600080fd5b5061038a6107fb366004612454565b6001600160a01b031660009081526007602052604090205490565b34801561082257600080fd5b5060035461038a565b34801561083757600080fd5b506102e46108463660046125b7565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205460ff1690565b34801561088057600080fd5b5060125442116102e4565b34801561089757600080fd5b5061038a60115481565b3480156108ad57600080fd5b506103736108bc3660046123fa565b61148b565b60006108cc8261149c565b92915050565b6060600980546108e1906126a1565b80601f016020809104026020016040519081016040528092919081815260200182805461090d906126a1565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b5050505050905090565b600061096f826114dc565b506000908152600d60205260409020546001600160a01b031690565b600061099682610fee565b9050806001600160a01b0316836001600160a01b031603610a085760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a245750610a248133610846565b610a965760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016109ff565b610aa0838361153b565b505050565b6001600160a01b038116600090815260046020526040902054610ada5760405162461bcd60e51b81526004016109ff906126db565b6000610ae582611264565b905080600003610b075760405162461bcd60e51b81526004016109ff90612721565b6001600160a01b03821660009081526005602052604081208054839290610b2f908490612782565b925050819055508060036000828254610b489190612782565b90915550610b58905082826115a9565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b610ba833826116c2565b610bc45760405162461bcd60e51b81526004016109ff9061279a565b610aa0838383611740565b610bd93382610ddb565b50565b600082815260208190526040902060010154610bf7816118dc565b610aa083836118e6565b6000610c0c816118dc565b8151610aa09060139060208501906122c3565b6001600160a01b0381163314610c8f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016109ff565b610c99828261196a565b5050565b610aa0838383604051806020016040528060008152506112ac565b6001600160a01b038116600090815260046020526040902054610ced5760405162461bcd60e51b81526004016109ff906126db565b6000610cf983836112e4565b905080600003610d1b5760405162461bcd60e51b81526004016109ff90612721565b6001600160a01b03808416600090815260086020908152604080832093861683529290529081208054839290610d52908490612782565b90915550506001600160a01b03831660009081526007602052604081208054839290610d7f908490612782565b90915550610d9090508383836119cf565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b600260015403610e2d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ff565b60026001556012544211610e7a5760405162461bcd60e51b815260206004820152601460248201527353616c65206d757374206265206163746976652160601b60448201526064016109ff565b600081118015610e8b575060058111155b610ee95760405162461bcd60e51b815260206004820152602960248201527f47726561746572207468616e203020616e64206c657373207468616e206571756044820152680c2d840dac2f040e8f60bb1b60648201526084016109ff565b3481601154610ef891906127e8565b14610f3b5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b60448201526064016109ff565b600f80549082906000610f4e8385612782565b9091555050601054600f5461138891610f6691612782565b1115610fb45760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201526064016109ff565b60005b82811015610fe457610fd284610fcd8385612782565b611a21565b80610fdc81612807565b915050610fb7565b5050600180555050565b6000818152600b60205260408120546001600160a01b0316806108cc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109ff565b60006001600160a01b0382166110b85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016109ff565b506001600160a01b03166000908152600c602052604090205490565b7fbf575aa07286781f90c1bdc8f4940c6c29874a0c25a1f1fe7661650b409c01ff6110fe816118dc565b600f805490839060006111118385612782565b90915550506010548311156111685760405162461bcd60e51b815260206004820152601760248201527f4578636565646564207265736572766520616d6f756e7400000000000000000060448201526064016109ff565b60005b838110156111935761118185610fcd8385612782565b8061118b81612807565b91505061116b565b5082601060008282546111a69190612820565b909155505050505050565b60006111bc816118dc565b60405133904780156108fc02916000818181858888f19350505050610bd957600080fd5b6000600682815481106111f5576111f5612837565b6000918252602090912001546001600160a01b031692915050565b600061121b816118dc565b50601155565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600a80546108e1906126a1565b610c99338383611a3b565b60008061127060035490565b61127a9047612782565b90506112a583826112a0866001600160a01b031660009081526005602052604090205490565b611b09565b9392505050565b6112b633836116c2565b6112d25760405162461bcd60e51b81526004016109ff9061279a565b6112de84848484611b47565b50505050565b6001600160a01b03821660009081526007602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa158015611343573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611367919061284d565b6113719190612782565b6001600160a01b038086166000908152600860209081526040808320938816835292905220549091506113a79084908390611b09565b949350505050565b6000818152600b60205260409020546060906001600160a01b031661140b5760405162461bcd60e51b81526020600482015260126024820152711d1bdad95b88191bd95cdb9d08195e1a5cdd60721b60448201526064016109ff565b6000611415611b7a565b9050805160000361143557604051806020016040528060008152506112a5565b8061143f84611b89565b604051602001611450929190612866565b6040516020818303038152906040529392505050565b600082815260208190526040902060010154611481816118dc565b610aa0838361196a565b6000611496816118dc565b50601255565b60006001600160e01b031982166380ac58cd60e01b14806114cd57506001600160e01b03198216635b5e139f60e01b145b806108cc57506108cc82611bcd565b6000818152600b60205260409020546001600160a01b0316610bd95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109ff565b6000818152600d6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061157082610fee565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156115f95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109ff565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611646576040519150601f19603f3d011682016040523d82523d6000602084013e61164b565b606091505b5050905080610aa05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109ff565b6000806116ce83610fee565b9050806001600160a01b0316846001600160a01b0316148061171557506001600160a01b038082166000908152600e602090815260408083209388168352929052205460ff165b806113a75750836001600160a01b031661172e84610964565b6001600160a01b031614949350505050565b826001600160a01b031661175382610fee565b6001600160a01b0316146117b75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109ff565b6001600160a01b0382166118195760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109ff565b61182460008261153b565b6001600160a01b0383166000908152600c6020526040812080546001929061184d908490612820565b90915550506001600160a01b0382166000908152600c6020526040812080546001929061187b908490612782565b90915550506000818152600b602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610bd98133611c02565b6118f08282611221565b610c99576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556119263390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6119748282611221565b15610c99576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610aa0908490611c66565b610c99828260405180602001604052806000815250611d38565b816001600160a01b0316836001600160a01b031603611a9c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109ff565b6001600160a01b038381166000818152600e6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6002546001600160a01b03841660009081526004602052604081205490918391611b3390866127e8565b611b3d91906128a5565b6113a79190612820565b611b52848484611740565b611b5e84848484611d6b565b6112de5760405162461bcd60e51b81526004016109ff906128c7565b6060601380546108e1906126a1565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611ba35750819003601f19909101908152919050565b60006001600160e01b03198216637965db0b60e01b14806108cc57506301ffc9a760e01b6001600160e01b03198316146108cc565b611c0c8282611221565b610c9957611c24816001600160a01b03166014611e6c565b611c2f836020611e6c565b604051602001611c40929190612919565b60408051601f198184030181529082905262461bcd60e51b82526109ff916004016123e7565b6000611cbb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120089092919063ffffffff16565b805190915015610aa05780806020019051810190611cd9919061298e565b610aa05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109ff565b611d428383612017565b611d4f6000848484611d6b565b610aa05760405162461bcd60e51b81526004016109ff906128c7565b60006001600160a01b0384163b15611e6157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611daf9033908990889088906004016129ab565b6020604051808303816000875af1925050508015611dea575060408051601f3d908101601f19168201909252611de7918101906129e8565b60015b611e47573d808015611e18576040519150601f19603f3d011682016040523d82523d6000602084013e611e1d565b606091505b508051600003611e3f5760405162461bcd60e51b81526004016109ff906128c7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113a7565b506001949350505050565b60606000611e7b8360026127e8565b611e86906002612782565b67ffffffffffffffff811115611e9e57611e9e6124e2565b6040519080825280601f01601f191660200182016040528015611ec8576020820181803683370190505b509050600360fc1b81600081518110611ee357611ee3612837565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611f1257611f12612837565b60200101906001600160f81b031916908160001a9053506000611f368460026127e8565b611f41906001612782565b90505b6001811115611fb9576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611f7557611f75612837565b1a60f81b828281518110611f8b57611f8b612837565b60200101906001600160f81b031916908160001a90535060049490941c93611fb281612a05565b9050611f44565b5083156112a55760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ff565b60606113a78484600085612159565b6001600160a01b03821661206d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109ff565b6000818152600b60205260409020546001600160a01b0316156120d25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109ff565b6001600160a01b0382166000908152600c602052604081208054600192906120fb908490612782565b90915550506000818152600b602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060824710156121ba5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109ff565b6001600160a01b0385163b6122115760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ff565b600080866001600160a01b0316858760405161222d9190612a1c565b60006040518083038185875af1925050503d806000811461226a576040519150601f19603f3d011682016040523d82523d6000602084013e61226f565b606091505b509150915061227f82828661228a565b979650505050505050565b606083156122995750816112a5565b8251156122a95782518084602001fd5b8160405162461bcd60e51b81526004016109ff91906123e7565b8280546122cf906126a1565b90600052602060002090601f0160209004810192826122f15760008555612337565b82601f1061230a57805160ff1916838001178555612337565b82800160010185558215612337579182015b8281111561233757825182559160200191906001019061231c565b50612343929150612347565b5090565b5b808211156123435760008155600101612348565b6001600160e01b031981168114610bd957600080fd5b60006020828403121561238457600080fd5b81356112a58161235c565b60005b838110156123aa578181015183820152602001612392565b838111156112de5750506000910152565b600081518084526123d381602086016020860161238f565b601f01601f19169290920160200192915050565b6020815260006112a560208301846123bb565b60006020828403121561240c57600080fd5b5035919050565b6001600160a01b0381168114610bd957600080fd5b6000806040838503121561243b57600080fd5b823561244681612413565b946020939093013593505050565b60006020828403121561246657600080fd5b81356112a581612413565b60008060006060848603121561248657600080fd5b833561249181612413565b925060208401356124a181612413565b929592945050506040919091013590565b600080604083850312156124c557600080fd5b8235915060208301356124d781612413565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612513576125136124e2565b604051601f8501601f19908116603f0116810190828211818310171561253b5761253b6124e2565b8160405280935085815286868601111561255457600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561258057600080fd5b813567ffffffffffffffff81111561259757600080fd5b8201601f810184136125a857600080fd5b6113a7848235602084016124f8565b600080604083850312156125ca57600080fd5b82356125d581612413565b915060208301356124d781612413565b8015158114610bd957600080fd5b6000806040838503121561260657600080fd5b823561261181612413565b915060208301356124d7816125e5565b6000806000806080858703121561263757600080fd5b843561264281612413565b9350602085013561265281612413565b925060408501359150606085013567ffffffffffffffff81111561267557600080fd5b8501601f8101871361268657600080fd5b612695878235602084016124f8565b91505092959194509250565b600181811c908216806126b557607f821691505b6020821081036126d557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156127955761279561276c565b500190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008160001904831182151516156128025761280261276c565b500290565b6000600182016128195761281961276c565b5060010190565b6000828210156128325761283261276c565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561285f57600080fd5b5051919050565b6000835161287881846020880161238f565b83519083019061288c81836020880161238f565b64173539b7b760d91b9101908152600501949350505050565b6000826128c257634e487b7160e01b600052601260045260246000fd5b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161295181601785016020880161238f565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161298281602884016020880161238f565b01602801949350505050565b6000602082840312156129a057600080fd5b81516112a5816125e5565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129de908301846123bb565b9695505050505050565b6000602082840312156129fa57600080fd5b81516112a58161235c565b600081612a1457612a1461276c565b506000190190565b60008251612a2e81846020870161238f565b919091019291505056fea26469706673582212207ed9428a195c9317f4cfaaeb43f1458913f34da993ebc8ab98f57eae3f76381a64736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d534b48353242585a546b6d7667506f3747706a6a6b326e6b3546684475774e76314b755a46457436634b62442f000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000459f1b1ee38f6e1380bdc25f12dfef033cf3475e0000000000000000000000004ece314198318b9353c3b38cd98bff143ad38f31000000000000000000000000fc7520744d21068af77e15a69fd52753ab816611000000000000000000000000544b14fb19262a19fd3304bbedbc1a149eb416f0000000000000000000000000623191609d54d2779fd9cdcfb336539ed183e66d0000000000000000000000005e8a883a366afba4a44788587fe27c759d282c80000000000000000000000000cc2c9a3a33f1dddaba47d71c80f81e808a5910ed0000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000119400000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000271

Deployed Bytecode

0x6080604052600436106102765760003560e01c806370a082311161014f578063a3f8eace116100c1578063d79779b21161007a578063d79779b2146107e0578063e33b7de314610816578063e985e9c51461082b578063eb8d244414610874578063f51f96dd1461088b578063f88ca86b146108a157600080fd5b8063a3f8eace1461070a578063b88d4fde1461072a578063c45ac0501461074a578063c87b56dd1461076a578063ce7c2ac21461078a578063d547741f146107c057600080fd5b806391d148541161011357806391d148541461065457806395d89b41146106745780639852595c14610689578063a060ae18146106bf578063a217fddf146106d5578063a22cb465146106ea57600080fd5b806370a08231146105bf57806378cf19e9146105df578063853828b6146105ff5780638b83209b1461061457806391b7f5ed1461063457600080fd5b80632db11544116101e85780633a98ef39116101ac5780633a98ef39146104f1578063406072a91461050657806342842e0e1461054c57806348b750441461056c5780635b06d8531461058c5780636352211e1461059f57600080fd5b80632db11544146104685780632f2ff15d1461047b57806330176e131461049b57806332cb6b0c146104bb57806336568abe146104d157600080fd5b80631608b47b1161023a5780631608b47b1461039857806318160ddd146103ae57806319165587146103c4578063191fd57d146103e457806323b872dd14610418578063248a9ca31461043857600080fd5b806301ffc9a7146102c457806306fdde03146102f9578063081812fc1461031b578063095ea7b3146103535780631168a6311461037557600080fd5b366102bf577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156102d057600080fd5b506102e46102df366004612372565b6108c1565b60405190151581526020015b60405180910390f35b34801561030557600080fd5b5061030e6108d2565b6040516102f091906123e7565b34801561032757600080fd5b5061033b6103363660046123fa565b610964565b6040516001600160a01b0390911681526020016102f0565b34801561035f57600080fd5b5061037361036e366004612428565b61098b565b005b34801561038157600080fd5b5061038a600581565b6040519081526020016102f0565b3480156103a457600080fd5b5061038a60125481565b3480156103ba57600080fd5b5061038a600f5481565b3480156103d057600080fd5b506103736103df366004612454565b610aa5565b3480156103f057600080fd5b5061038a7fbf575aa07286781f90c1bdc8f4940c6c29874a0c25a1f1fe7661650b409c01ff81565b34801561042457600080fd5b50610373610433366004612471565b610b9e565b34801561044457600080fd5b5061038a6104533660046123fa565b60009081526020819052604090206001015490565b6103736104763660046123fa565b610bcf565b34801561048757600080fd5b506103736104963660046124b2565b610bdc565b3480156104a757600080fd5b506103736104b636600461256e565b610c01565b3480156104c757600080fd5b5061038a61138881565b3480156104dd57600080fd5b506103736104ec3660046124b2565b610c1f565b3480156104fd57600080fd5b5060025461038a565b34801561051257600080fd5b5061038a6105213660046125b7565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561055857600080fd5b50610373610567366004612471565b610c9d565b34801561057857600080fd5b506103736105873660046125b7565b610cb8565b61037361059a366004612428565b610ddb565b3480156105ab57600080fd5b5061033b6105ba3660046123fa565b610fee565b3480156105cb57600080fd5b5061038a6105da366004612454565b61104e565b3480156105eb57600080fd5b506103736105fa366004612428565b6110d4565b34801561060b57600080fd5b506103736111b1565b34801561062057600080fd5b5061033b61062f3660046123fa565b6111e0565b34801561064057600080fd5b5061037361064f3660046123fa565b611210565b34801561066057600080fd5b506102e461066f3660046124b2565b611221565b34801561068057600080fd5b5061030e61124a565b34801561069557600080fd5b5061038a6106a4366004612454565b6001600160a01b031660009081526005602052604090205490565b3480156106cb57600080fd5b5061038a60105481565b3480156106e157600080fd5b5061038a600081565b3480156106f657600080fd5b506103736107053660046125f3565b611259565b34801561071657600080fd5b5061038a610725366004612454565b611264565b34801561073657600080fd5b50610373610745366004612621565b6112ac565b34801561075657600080fd5b5061038a6107653660046125b7565b6112e4565b34801561077657600080fd5b5061030e6107853660046123fa565b6113af565b34801561079657600080fd5b5061038a6107a5366004612454565b6001600160a01b031660009081526004602052604090205490565b3480156107cc57600080fd5b506103736107db3660046124b2565b611466565b3480156107ec57600080fd5b5061038a6107fb366004612454565b6001600160a01b031660009081526007602052604090205490565b34801561082257600080fd5b5060035461038a565b34801561083757600080fd5b506102e46108463660046125b7565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205460ff1690565b34801561088057600080fd5b5060125442116102e4565b34801561089757600080fd5b5061038a60115481565b3480156108ad57600080fd5b506103736108bc3660046123fa565b61148b565b60006108cc8261149c565b92915050565b6060600980546108e1906126a1565b80601f016020809104026020016040519081016040528092919081815260200182805461090d906126a1565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b5050505050905090565b600061096f826114dc565b506000908152600d60205260409020546001600160a01b031690565b600061099682610fee565b9050806001600160a01b0316836001600160a01b031603610a085760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a245750610a248133610846565b610a965760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016109ff565b610aa0838361153b565b505050565b6001600160a01b038116600090815260046020526040902054610ada5760405162461bcd60e51b81526004016109ff906126db565b6000610ae582611264565b905080600003610b075760405162461bcd60e51b81526004016109ff90612721565b6001600160a01b03821660009081526005602052604081208054839290610b2f908490612782565b925050819055508060036000828254610b489190612782565b90915550610b58905082826115a9565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b610ba833826116c2565b610bc45760405162461bcd60e51b81526004016109ff9061279a565b610aa0838383611740565b610bd93382610ddb565b50565b600082815260208190526040902060010154610bf7816118dc565b610aa083836118e6565b6000610c0c816118dc565b8151610aa09060139060208501906122c3565b6001600160a01b0381163314610c8f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016109ff565b610c99828261196a565b5050565b610aa0838383604051806020016040528060008152506112ac565b6001600160a01b038116600090815260046020526040902054610ced5760405162461bcd60e51b81526004016109ff906126db565b6000610cf983836112e4565b905080600003610d1b5760405162461bcd60e51b81526004016109ff90612721565b6001600160a01b03808416600090815260086020908152604080832093861683529290529081208054839290610d52908490612782565b90915550506001600160a01b03831660009081526007602052604081208054839290610d7f908490612782565b90915550610d9090508383836119cf565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b600260015403610e2d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ff565b60026001556012544211610e7a5760405162461bcd60e51b815260206004820152601460248201527353616c65206d757374206265206163746976652160601b60448201526064016109ff565b600081118015610e8b575060058111155b610ee95760405162461bcd60e51b815260206004820152602960248201527f47726561746572207468616e203020616e64206c657373207468616e206571756044820152680c2d840dac2f040e8f60bb1b60648201526084016109ff565b3481601154610ef891906127e8565b14610f3b5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b60448201526064016109ff565b600f80549082906000610f4e8385612782565b9091555050601054600f5461138891610f6691612782565b1115610fb45760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201526064016109ff565b60005b82811015610fe457610fd284610fcd8385612782565b611a21565b80610fdc81612807565b915050610fb7565b5050600180555050565b6000818152600b60205260408120546001600160a01b0316806108cc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109ff565b60006001600160a01b0382166110b85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016109ff565b506001600160a01b03166000908152600c602052604090205490565b7fbf575aa07286781f90c1bdc8f4940c6c29874a0c25a1f1fe7661650b409c01ff6110fe816118dc565b600f805490839060006111118385612782565b90915550506010548311156111685760405162461bcd60e51b815260206004820152601760248201527f4578636565646564207265736572766520616d6f756e7400000000000000000060448201526064016109ff565b60005b838110156111935761118185610fcd8385612782565b8061118b81612807565b91505061116b565b5082601060008282546111a69190612820565b909155505050505050565b60006111bc816118dc565b60405133904780156108fc02916000818181858888f19350505050610bd957600080fd5b6000600682815481106111f5576111f5612837565b6000918252602090912001546001600160a01b031692915050565b600061121b816118dc565b50601155565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600a80546108e1906126a1565b610c99338383611a3b565b60008061127060035490565b61127a9047612782565b90506112a583826112a0866001600160a01b031660009081526005602052604090205490565b611b09565b9392505050565b6112b633836116c2565b6112d25760405162461bcd60e51b81526004016109ff9061279a565b6112de84848484611b47565b50505050565b6001600160a01b03821660009081526007602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa158015611343573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611367919061284d565b6113719190612782565b6001600160a01b038086166000908152600860209081526040808320938816835292905220549091506113a79084908390611b09565b949350505050565b6000818152600b60205260409020546060906001600160a01b031661140b5760405162461bcd60e51b81526020600482015260126024820152711d1bdad95b88191bd95cdb9d08195e1a5cdd60721b60448201526064016109ff565b6000611415611b7a565b9050805160000361143557604051806020016040528060008152506112a5565b8061143f84611b89565b604051602001611450929190612866565b6040516020818303038152906040529392505050565b600082815260208190526040902060010154611481816118dc565b610aa0838361196a565b6000611496816118dc565b50601255565b60006001600160e01b031982166380ac58cd60e01b14806114cd57506001600160e01b03198216635b5e139f60e01b145b806108cc57506108cc82611bcd565b6000818152600b60205260409020546001600160a01b0316610bd95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109ff565b6000818152600d6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061157082610fee565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156115f95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109ff565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611646576040519150601f19603f3d011682016040523d82523d6000602084013e61164b565b606091505b5050905080610aa05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109ff565b6000806116ce83610fee565b9050806001600160a01b0316846001600160a01b0316148061171557506001600160a01b038082166000908152600e602090815260408083209388168352929052205460ff165b806113a75750836001600160a01b031661172e84610964565b6001600160a01b031614949350505050565b826001600160a01b031661175382610fee565b6001600160a01b0316146117b75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109ff565b6001600160a01b0382166118195760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109ff565b61182460008261153b565b6001600160a01b0383166000908152600c6020526040812080546001929061184d908490612820565b90915550506001600160a01b0382166000908152600c6020526040812080546001929061187b908490612782565b90915550506000818152600b602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610bd98133611c02565b6118f08282611221565b610c99576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556119263390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6119748282611221565b15610c99576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610aa0908490611c66565b610c99828260405180602001604052806000815250611d38565b816001600160a01b0316836001600160a01b031603611a9c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109ff565b6001600160a01b038381166000818152600e6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6002546001600160a01b03841660009081526004602052604081205490918391611b3390866127e8565b611b3d91906128a5565b6113a79190612820565b611b52848484611740565b611b5e84848484611d6b565b6112de5760405162461bcd60e51b81526004016109ff906128c7565b6060601380546108e1906126a1565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611ba35750819003601f19909101908152919050565b60006001600160e01b03198216637965db0b60e01b14806108cc57506301ffc9a760e01b6001600160e01b03198316146108cc565b611c0c8282611221565b610c9957611c24816001600160a01b03166014611e6c565b611c2f836020611e6c565b604051602001611c40929190612919565b60408051601f198184030181529082905262461bcd60e51b82526109ff916004016123e7565b6000611cbb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120089092919063ffffffff16565b805190915015610aa05780806020019051810190611cd9919061298e565b610aa05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109ff565b611d428383612017565b611d4f6000848484611d6b565b610aa05760405162461bcd60e51b81526004016109ff906128c7565b60006001600160a01b0384163b15611e6157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611daf9033908990889088906004016129ab565b6020604051808303816000875af1925050508015611dea575060408051601f3d908101601f19168201909252611de7918101906129e8565b60015b611e47573d808015611e18576040519150601f19603f3d011682016040523d82523d6000602084013e611e1d565b606091505b508051600003611e3f5760405162461bcd60e51b81526004016109ff906128c7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113a7565b506001949350505050565b60606000611e7b8360026127e8565b611e86906002612782565b67ffffffffffffffff811115611e9e57611e9e6124e2565b6040519080825280601f01601f191660200182016040528015611ec8576020820181803683370190505b509050600360fc1b81600081518110611ee357611ee3612837565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611f1257611f12612837565b60200101906001600160f81b031916908160001a9053506000611f368460026127e8565b611f41906001612782565b90505b6001811115611fb9576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611f7557611f75612837565b1a60f81b828281518110611f8b57611f8b612837565b60200101906001600160f81b031916908160001a90535060049490941c93611fb281612a05565b9050611f44565b5083156112a55760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ff565b60606113a78484600085612159565b6001600160a01b03821661206d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109ff565b6000818152600b60205260409020546001600160a01b0316156120d25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109ff565b6001600160a01b0382166000908152600c602052604081208054600192906120fb908490612782565b90915550506000818152600b602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060824710156121ba5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109ff565b6001600160a01b0385163b6122115760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ff565b600080866001600160a01b0316858760405161222d9190612a1c565b60006040518083038185875af1925050503d806000811461226a576040519150601f19603f3d011682016040523d82523d6000602084013e61226f565b606091505b509150915061227f82828661228a565b979650505050505050565b606083156122995750816112a5565b8251156122a95782518084602001fd5b8160405162461bcd60e51b81526004016109ff91906123e7565b8280546122cf906126a1565b90600052602060002090601f0160209004810192826122f15760008555612337565b82601f1061230a57805160ff1916838001178555612337565b82800160010185558215612337579182015b8281111561233757825182559160200191906001019061231c565b50612343929150612347565b5090565b5b808211156123435760008155600101612348565b6001600160e01b031981168114610bd957600080fd5b60006020828403121561238457600080fd5b81356112a58161235c565b60005b838110156123aa578181015183820152602001612392565b838111156112de5750506000910152565b600081518084526123d381602086016020860161238f565b601f01601f19169290920160200192915050565b6020815260006112a560208301846123bb565b60006020828403121561240c57600080fd5b5035919050565b6001600160a01b0381168114610bd957600080fd5b6000806040838503121561243b57600080fd5b823561244681612413565b946020939093013593505050565b60006020828403121561246657600080fd5b81356112a581612413565b60008060006060848603121561248657600080fd5b833561249181612413565b925060208401356124a181612413565b929592945050506040919091013590565b600080604083850312156124c557600080fd5b8235915060208301356124d781612413565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612513576125136124e2565b604051601f8501601f19908116603f0116810190828211818310171561253b5761253b6124e2565b8160405280935085815286868601111561255457600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561258057600080fd5b813567ffffffffffffffff81111561259757600080fd5b8201601f810184136125a857600080fd5b6113a7848235602084016124f8565b600080604083850312156125ca57600080fd5b82356125d581612413565b915060208301356124d781612413565b8015158114610bd957600080fd5b6000806040838503121561260657600080fd5b823561261181612413565b915060208301356124d7816125e5565b6000806000806080858703121561263757600080fd5b843561264281612413565b9350602085013561265281612413565b925060408501359150606085013567ffffffffffffffff81111561267557600080fd5b8501601f8101871361268657600080fd5b612695878235602084016124f8565b91505092959194509250565b600181811c908216806126b557607f821691505b6020821081036126d557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156127955761279561276c565b500190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008160001904831182151516156128025761280261276c565b500290565b6000600182016128195761281961276c565b5060010190565b6000828210156128325761283261276c565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561285f57600080fd5b5051919050565b6000835161287881846020880161238f565b83519083019061288c81836020880161238f565b64173539b7b760d91b9101908152600501949350505050565b6000826128c257634e487b7160e01b600052601260045260246000fd5b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161295181601785016020880161238f565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161298281602884016020880161238f565b01602801949350505050565b6000602082840312156129a057600080fd5b81516112a5816125e5565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129de908301846123bb565b9695505050505050565b6000602082840312156129fa57600080fd5b81516112a58161235c565b600081612a1457612a1461276c565b506000190190565b60008251612a2e81846020870161238f565b919091019291505056fea26469706673582212207ed9428a195c9317f4cfaaeb43f1458913f34da993ebc8ab98f57eae3f76381a64736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d534b48353242585a546b6d7667506f3747706a6a6b326e6b3546684475774e76314b755a46457436634b62442f000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000459f1b1ee38f6e1380bdc25f12dfef033cf3475e0000000000000000000000004ece314198318b9353c3b38cd98bff143ad38f31000000000000000000000000fc7520744d21068af77e15a69fd52753ab816611000000000000000000000000544b14fb19262a19fd3304bbedbc1a149eb416f0000000000000000000000000623191609d54d2779fd9cdcfb336539ed183e66d0000000000000000000000005e8a883a366afba4a44788587fe27c759d282c80000000000000000000000000cc2c9a3a33f1dddaba47d71c80f81e808a5910ed0000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000119400000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000271

-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://QmSKH52BXZTkmvgPo7Gpjjk2nk5FhDuwNv1KuZFEt6cKbD/
Arg [1] : payees (address[]): 0x459F1b1ee38F6e1380bDC25f12DfeF033cF3475E,0x4Ece314198318b9353c3B38cd98BFF143ad38F31,0xfC7520744d21068aF77E15a69fd52753AB816611,0x544b14FB19262a19fD3304bbeDbc1A149eb416f0,0x623191609D54D2779FD9CdCFb336539ED183E66d,0x5e8A883a366aFBA4a44788587Fe27c759D282C80,0xcc2C9a3a33f1Dddaba47D71c80f81e808a5910eD
Arg [2] : shares (uint256[]): 4500,2000,1000,625,625,625,625

-----Encoded View---------------
22 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [4] : 697066733a2f2f516d534b48353242585a546b6d7667506f3747706a6a6b326e
Arg [5] : 6b3546684475774e76314b755a46457436634b62442f00000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [7] : 000000000000000000000000459f1b1ee38f6e1380bdc25f12dfef033cf3475e
Arg [8] : 0000000000000000000000004ece314198318b9353c3b38cd98bff143ad38f31
Arg [9] : 000000000000000000000000fc7520744d21068af77e15a69fd52753ab816611
Arg [10] : 000000000000000000000000544b14fb19262a19fd3304bbedbc1a149eb416f0
Arg [11] : 000000000000000000000000623191609d54d2779fd9cdcfb336539ed183e66d
Arg [12] : 0000000000000000000000005e8a883a366afba4a44788587fe27c759d282c80
Arg [13] : 000000000000000000000000cc2c9a3a33f1dddaba47d71c80f81e808a5910ed
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [15] : 0000000000000000000000000000000000000000000000000000000000001194
Arg [16] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [17] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000271
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000271
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000271
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000271


Deployed Bytecode Sourcemap

67592:6879:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25452:40;3626:10;25452:40;;;-1:-1:-1;;;;;206:32:1;;;188:51;;25482:9:0;270:2:1;255:18;;248:34;161:18;25452:40:0;;;;;;;67592:6879;;;;;69154:185;;;;;;;;;;-1:-1:-1;69154:185:0;;;;;:::i;:::-;;:::i;:::-;;;844:14:1;;837:22;819:41;;807:2;792:18;69154:185:0;;;;;;;;55168:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;56681:171::-;;;;;;;;;;-1:-1:-1;56681:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1971:32:1;;;1953:51;;1941:2;1926:18;56681:171:0;1807:203:1;56198:417:0;;;;;;;;;;-1:-1:-1;56198:417:0;;;;;:::i;:::-;;:::i;:::-;;68023:43;;;;;;;;;;;;68065:1;68023:43;;;;;2617:25:1;;;2605:2;2590:18;68023:43:0;2471:177:1;67960:54:0;;;;;;;;;;;;;;;;67785:30;;;;;;;;;;;;;;;;27973:453;;;;;;;;;;-1:-1:-1;27973:453:0;;;;;:::i;:::-;;:::i;67712:64::-;;;;;;;;;;;;67751:25;67712:64;;57381:336;;;;;;;;;;-1:-1:-1;57381:336:0;;;;;:::i;:::-;;:::i;42229:131::-;;;;;;;;;;-1:-1:-1;42229:131:0;;;;;:::i;:::-;42303:7;42330:12;;;;;;;;;;:22;;;;42229:131;71958:118;;;;;;:::i;:::-;;:::i;42670:147::-;;;;;;;;;;-1:-1:-1;42670:147:0;;;;;:::i;:::-;;:::i;73752:126::-;;;;;;;;;;-1:-1:-1;73752:126:0;;;;;:::i;:::-;;:::i;67822:41::-;;;;;;;;;;;;67859:4;67822:41;;43814:218;;;;;;;;;;-1:-1:-1;43814:218:0;;;;;:::i;:::-;;:::i;25583:91::-;;;;;;;;;;-1:-1:-1;25654:12:0;;25583:91;;26712:135;;;;;;;;;;-1:-1:-1;26712:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;26809:21:0;;;26782:7;26809:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;26712:135;57788:185;;;;;;;;;;-1:-1:-1;57788:185:0;;;;;:::i;:::-;;:::i;28694:514::-;;;;;;;;;;-1:-1:-1;28694:514:0;;;;;:::i;:::-;;:::i;72267:644::-;;;;;;:::i;:::-;;:::i;54879:222::-;;;;;;;;;;-1:-1:-1;54879:222:0;;;;;:::i;:::-;;:::i;54610:207::-;;;;;;;;;;-1:-1:-1;54610:207:0;;;;;:::i;:::-;;:::i;73282:408::-;;;;;;;;;;-1:-1:-1;73282:408:0;;;;;:::i;:::-;;:::i;74334:134::-;;;;;;;;;;;;;:::i;26938:100::-;;;;;;;;;;-1:-1:-1;26938:100:0;;;;;:::i;:::-;;:::i;74160:115::-;;;;;;;;;;-1:-1:-1;74160:115:0;;;;;:::i;:::-;;:::i;40689:147::-;;;;;;;;;;-1:-1:-1;40689:147:0;;;;;:::i;:::-;;:::i;55337:104::-;;;;;;;;;;;;;:::i;26434:109::-;;;;;;;;;;-1:-1:-1;26434:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;26517:18:0;26490:7;26517:18;;;:9;:18;;;;;;;26434:109;67870:37;;;;;;;;;;;;;;;;39794:49;;;;;;;;;;-1:-1:-1;39794:49:0;39839:4;39794:49;;56924:155;;;;;;;;;;-1:-1:-1;56924:155:0;;;;;:::i;:::-;;:::i;27128:225::-;;;;;;;;;;-1:-1:-1;27128:225:0;;;;;:::i;:::-;;:::i;58044:323::-;;;;;;;;;;-1:-1:-1;58044:323:0;;;;;:::i;:::-;;:::i;27513:260::-;;;;;;;;;;-1:-1:-1;27513:260:0;;;;;:::i;:::-;;:::i;68809:337::-;;;;;;;;;;-1:-1:-1;68809:337:0;;;;;:::i;:::-;;:::i;26230:105::-;;;;;;;;;;-1:-1:-1;26230:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;26311:16:0;26284:7;26311:16;;;:7;:16;;;;;;;26230:105;43110:149;;;;;;;;;;-1:-1:-1;43110:149:0;;;;;:::i;:::-;;:::i;26020:119::-;;;;;;;;;;-1:-1:-1;26020:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;26105:26:0;26078:7;26105:26;;;:19;:26;;;;;;;26020:119;25768:95;;;;;;;;;;-1:-1:-1;25841:14:0;;25768:95;;57150:164;;;;;;;;;;-1:-1:-1;57150:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;57271:25:0;;;57247:4;57271:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;57150:164;68590:113;;;;;;;;;;-1:-1:-1;68676:19:0;;68658:15;:37;68590:113;;67914:37;;;;;;;;;;;;;;;;73942:159;;;;;;;;;;-1:-1:-1;73942:159:0;;;;;:::i;:::-;;:::i;69154:185::-;69271:4;69295:36;69319:11;69295:23;:36::i;:::-;69288:43;69154:185;-1:-1:-1;;69154:185:0:o;55168:100::-;55222:13;55255:5;55248:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55168:100;:::o;56681:171::-;56757:7;56777:23;56792:7;56777:14;:23::i;:::-;-1:-1:-1;56820:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;56820:24:0;;56681:171::o;56198:417::-;56279:13;56295:23;56310:7;56295:14;:23::i;:::-;56279:39;;56343:5;-1:-1:-1;;;;;56337:11:0;:2;-1:-1:-1;;;;;56337:11:0;;56329:57;;;;-1:-1:-1;;;56329:57:0;;8501:2:1;56329:57:0;;;8483:21:1;8540:2;8520:18;;;8513:30;8579:34;8559:18;;;8552:62;-1:-1:-1;;;8630:18:1;;;8623:31;8671:19;;56329:57:0;;;;;;;;;3626:10;-1:-1:-1;;;;;56421:21:0;;;;:62;;-1:-1:-1;56446:37:0;56463:5;3626:10;57150:164;:::i;56446:37::-;56399:174;;;;-1:-1:-1;;;56399:174:0;;8903:2:1;56399:174:0;;;8885:21:1;8942:2;8922:18;;;8915:30;8981:34;8961:18;;;8954:62;9052:32;9032:18;;;9025:60;9102:19;;56399:174:0;8701:426:1;56399:174:0;56586:21;56595:2;56599:7;56586:8;:21::i;:::-;56268:347;56198:417;;:::o;27973:453::-;-1:-1:-1;;;;;28049:16:0;;28068:1;28049:16;;;:7;:16;;;;;;28041:71;;;;-1:-1:-1;;;28041:71:0;;;;;;;:::i;:::-;28125:15;28143:19;28154:7;28143:10;:19::i;:::-;28125:37;;28183:7;28194:1;28183:12;28175:68;;;;-1:-1:-1;;;28175:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28256:18:0;;;;;;:9;:18;;;;;:29;;28278:7;;28256:18;:29;;28278:7;;28256:29;:::i;:::-;;;;;;;;28314:7;28296:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;28334:35:0;;-1:-1:-1;28352:7:0;28361;28334:17;:35::i;:::-;28385:33;;;-1:-1:-1;;;;;206:32:1;;188:51;;270:2;255:18;;248:34;;;28385:33:0;;161:18:1;28385:33:0;;;;;;;28030:396;27973:453;:::o;57381:336::-;57576:41;3626:10;57609:7;57576:18;:41::i;:::-;57568:100;;;;-1:-1:-1;;;57568:100:0;;;;;;;:::i;:::-;57681:28;57691:4;57697:2;57701:7;57681:9;:28::i;71958:118::-;72028:40;72041:10;72053:14;72028:12;:40::i;:::-;71958:118;:::o;42670:147::-;42303:7;42330:12;;;;;;;;;;:22;;;40285:16;40296:4;40285:10;:16::i;:::-;42784:25:::1;42795:4;42801:7;42784:10;:25::i;73752:126::-:0;39839:4;40285:16;39839:4;40285:10;:16::i;:::-;73847:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;43814:218::-:0;-1:-1:-1;;;;;43910:23:0;;3626:10;43910:23;43902:83;;;;-1:-1:-1;;;43902:83:0;;11120:2:1;43902:83:0;;;11102:21:1;11159:2;11139:18;;;11132:30;11198:34;11178:18;;;11171:62;-1:-1:-1;;;11249:18:1;;;11242:45;11304:19;;43902:83:0;10918:411:1;43902:83:0;43998:26;44010:4;44016:7;43998:11;:26::i;:::-;43814:218;;:::o;57788:185::-;57926:39;57943:4;57949:2;57953:7;57926:39;;;;;;;;;;;;:16;:39::i;28694:514::-;-1:-1:-1;;;;;28776:16:0;;28795:1;28776:16;;;:7;:16;;;;;;28768:71;;;;-1:-1:-1;;;28768:71:0;;;;;;;:::i;:::-;28852:15;28870:26;28881:5;28888:7;28870:10;:26::i;:::-;28852:44;;28917:7;28928:1;28917:12;28909:68;;;;-1:-1:-1;;;28909:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28990:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;29024:7;;28990:21;:41;;29024:7;;28990:41;:::i;:::-;;;;-1:-1:-1;;;;;;;29042:26:0;;;;;;:19;:26;;;;;:37;;29072:7;;29042:26;:37;;29072:7;;29042:37;:::i;:::-;;;;-1:-1:-1;29092:47:0;;-1:-1:-1;29115:5:0;29122:7;29131;29092:22;:47::i;:::-;29155:45;;;-1:-1:-1;;;;;206:32:1;;;188:51;;270:2;255:18;;248:34;;;29155:45:0;;;;;161:18:1;29155:45:0;;;;;;;28757:451;28694:514;;:::o;72267:644::-;1914:1;2512:7;;:19;2504:63;;;;-1:-1:-1;;;2504:63:0;;11536:2:1;2504:63:0;;;11518:21:1;11575:2;11555:18;;;11548:30;11614:33;11594:18;;;11587:61;11665:18;;2504:63:0;11334:355:1;2504:63:0;1914:1;2645:7;:18;68676:19;;68658:15;:37;72365:47:::1;;;::::0;-1:-1:-1;;;72365:47:0;;11896:2:1;72365:47:0::1;::::0;::::1;11878:21:1::0;11935:2;11915:18;;;11908:30;-1:-1:-1;;;11954:18:1;;;11947:50;12014:18;;72365:47:0::1;11694:344:1::0;72365:47:0::1;72448:1;72431:14;:18;:55;;;;;68065:1;72453:14;:33;;72431:55;72423:109;;;::::0;-1:-1:-1;;;72423:109:0;;12245:2:1;72423:109:0::1;::::0;::::1;12227:21:1::0;12284:2;12264:18;;;12257:30;12323:34;12303:18;;;12296:62;-1:-1:-1;;;12374:18:1;;;12367:39;12423:19;;72423:109:0::1;12043:405:1::0;72423:109:0::1;72582:9;72564:14;72552:9;;:26;;;;:::i;:::-;:39;72544:71;;;::::0;-1:-1:-1;;;72544:71:0;;12828:2:1;72544:71:0::1;::::0;::::1;12810:21:1::0;12867:2;12847:18;;;12840:30;-1:-1:-1;;;12886:18:1;;;12879:49;12945:18;;72544:71:0::1;12626:343:1::0;72544:71:0::1;72645:11;::::0;;;72682:14;;72628::::1;72667:29;72682:14:::0;72645:11;72667:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;72729:16:0::1;::::0;72715:11:::1;::::0;67859:4:::1;::::0;72715:30:::1;::::0;::::1;:::i;:::-;:44;;72707:89;;;::::0;-1:-1:-1;;;72707:89:0;;13176:2:1;72707:89:0::1;::::0;::::1;13158:21:1::0;;;13195:18;;;13188:30;13254:34;13234:18;;;13227:62;13306:18;;72707:89:0::1;12974:356:1::0;72707:89:0::1;72815:9;72810:94;72830:14;72826:1;:18;72810:94;;;72866:26;72876:3:::0;72881:10:::1;72890:1:::0;72881:6;:10:::1;:::i;:::-;72866:9;:26::i;:::-;72846:3:::0;::::1;::::0;::::1;:::i;:::-;;;;72810:94;;;-1:-1:-1::0;;1870:1:0;2824:22;;-1:-1:-1;;72267:644:0:o;54879:222::-;54951:7;54987:16;;;:7;:16;;;;;;-1:-1:-1;;;;;54987:16:0;;55014:56;;;;-1:-1:-1;;;55014:56:0;;13677:2:1;55014:56:0;;;13659:21:1;13716:2;13696:18;;;13689:30;-1:-1:-1;;;13735:18:1;;;13728:54;13799:18;;55014:56:0;13475:348:1;54610:207:0;54682:7;-1:-1:-1;;;;;54710:19:0;;54702:73;;;;-1:-1:-1;;;54702:73:0;;14030:2:1;54702:73:0;;;14012:21:1;14069:2;14049:18;;;14042:30;14108:34;14088:18;;;14081:62;-1:-1:-1;;;14159:18:1;;;14152:39;14208:19;;54702:73:0;13828:405:1;54702:73:0;-1:-1:-1;;;;;;54793:16:0;;;;;:9;:16;;;;;;;54610:207::o;73282:408::-;67751:25;40285:16;40296:4;40285:10;:16::i;:::-;73400:11:::1;::::0;;;73437:14;;73383::::1;73422:29;73437:14:::0;73400:11;73422:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;73488:16:0::1;::::0;73470:34;::::1;;73462:70;;;::::0;-1:-1:-1;;;73462:70:0;;14440:2:1;73462:70:0::1;::::0;::::1;14422:21:1::0;14479:2;14459:18;;;14452:30;14518:25;14498:18;;;14491:53;14561:18;;73462:70:0::1;14238:347:1::0;73462:70:0::1;73548:6;73543:95;73564:14;73560:1;:18;73543:95;;;73600:26;73610:3:::0;73615:10:::1;73624:1:::0;73615:6;:10:::1;:::i;73600:26::-;73580:3:::0;::::1;::::0;::::1;:::i;:::-;;;;73543:95;;;;73668:14;73648:16;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;73282:408:0:o;74334:134::-;39839:4;40285:16;39839:4;40285:10;:16::i;:::-;74412:47:::1;::::0;74420:10:::1;::::0;74437:21:::1;74412:47:::0;::::1;;;::::0;::::1;::::0;;;74437:21;74420:10;74412:47;::::1;;;;;;74404:56;;;::::0;::::1;26938:100:::0;26989:7;27016;27024:5;27016:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;27016:14:0;;26938:100;-1:-1:-1;;26938:100:0:o;74160:115::-;39839:4;40285:16;39839:4;40285:10;:16::i;:::-;-1:-1:-1;74245:9:0::1;:22:::0;74160:115::o;40689:147::-;40775:4;40799:12;;;;;;;;;;;-1:-1:-1;;;;;40799:29:0;;;;;;;;;;;;;;;40689:147::o;55337:104::-;55393:13;55426:7;55419:14;;;;;:::i;56924:155::-;57019:52;3626:10;57052:8;57062;57019:18;:52::i;27128:225::-;27186:7;27206:21;27254:15;25841:14;;;25768:95;27254:15;27230:39;;:21;:39;:::i;:::-;27206:63;;27287:58;27303:7;27312:13;27327:17;27336:7;-1:-1:-1;;;;;26517:18:0;26490:7;26517:18;;;:9;:18;;;;;;;26434:109;27327:17;27287:15;:58::i;:::-;27280:65;27128:225;-1:-1:-1;;;27128:225:0:o;58044:323::-;58218:41;3626:10;58251:7;58218:18;:41::i;:::-;58210:100;;;;-1:-1:-1;;;58210:100:0;;;;;;;:::i;:::-;58321:38;58335:4;58341:2;58345:7;58354:4;58321:13;:38::i;:::-;58044:323;;;;:::o;27513:260::-;-1:-1:-1;;;;;26105:26:0;;27585:7;26105:26;;;:19;:26;;;;;;27585:7;;27629:30;;-1:-1:-1;;;27629:30:0;;27653:4;27629:30;;;1953:51:1;-1:-1:-1;;;;;27629:15:0;;;;;1926:18:1;;27629:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;-1:-1:-1;;;;;26809:21:0;;;26782:7;26809:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;27605:77;;-1:-1:-1;27700:65:0;;27716:7;;27605:77;;27287:15;:58::i;27700:65::-;27693:72;27513:260;-1:-1:-1;;;;27513:260:0:o;68809:337::-;59939:4;59963:16;;;:7;:16;;;;;;68906:13;;-1:-1:-1;;;;;59963:16:0;68932:47;;;;-1:-1:-1;;;68932:47:0;;15243:2:1;68932:47:0;;;15225:21:1;15282:2;15262:18;;;15255:30;-1:-1:-1;;;15301:18:1;;;15294:48;15359:18;;68932:47:0;15041:342:1;68932:47:0;68990:21;69014:10;:8;:10::i;:::-;68990:34;;69048:7;69042:21;69067:1;69042:26;:96;;;;;;;;;;;;;;;;;69095:7;69104:18;69114:7;69104:9;:18::i;:::-;69078:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69035:103;68809:337;-1:-1:-1;;;68809:337:0:o;43110:149::-;42303:7;42330:12;;;;;;;;;;:22;;;40285:16;40296:4;40285:10;:16::i;:::-;43225:26:::1;43237:4;43243:7;43225:11;:26::i;73942:159::-:0;39839:4;40285:16;39839:4;40285:10;:16::i;:::-;-1:-1:-1;74051:19:0::1;:42:::0;73942:159::o;54241:305::-;54343:4;-1:-1:-1;;;;;;54380:40:0;;-1:-1:-1;;;54380:40:0;;:105;;-1:-1:-1;;;;;;;54437:48:0;;-1:-1:-1;;;54437:48:0;54380:105;:158;;;;54502:36;54526:11;54502:23;:36::i;64656:135::-;59939:4;59963:16;;;:7;:16;;;;;;-1:-1:-1;;;;;59963:16:0;64730:53;;;;-1:-1:-1;;;64730:53:0;;13677:2:1;64730:53:0;;;13659:21:1;13716:2;13696:18;;;13689:30;-1:-1:-1;;;13735:18:1;;;13728:54;13799:18;;64730:53:0;13475:348:1;63935:174:0;64010:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;64010:29:0;-1:-1:-1;;;;;64010:29:0;;;;;;;;:24;;64064:23;64010:24;64064:14;:23::i;:::-;-1:-1:-1;;;;;64055:46:0;;;;;;;;;;;63935:174;;:::o;6260:317::-;6375:6;6350:21;:31;;6342:73;;;;-1:-1:-1;;;6342:73:0;;16232:2:1;6342:73:0;;;16214:21:1;16271:2;16251:18;;;16244:30;16310:31;16290:18;;;16283:59;16359:18;;6342:73:0;16030:353:1;6342:73:0;6429:12;6447:9;-1:-1:-1;;;;;6447:14:0;6469:6;6447:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6428:52;;;6499:7;6491:78;;;;-1:-1:-1;;;6491:78:0;;16800:2:1;6491:78:0;;;16782:21:1;16839:2;16819:18;;;16812:30;16878:34;16858:18;;;16851:62;16949:28;16929:18;;;16922:56;16995:19;;6491:78:0;16598:422:1;60168:264:0;60261:4;60278:13;60294:23;60309:7;60294:14;:23::i;:::-;60278:39;;60347:5;-1:-1:-1;;;;;60336:16:0;:7;-1:-1:-1;;;;;60336:16:0;;:52;;;-1:-1:-1;;;;;;57271:25:0;;;57247:4;57271:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;60356:32;60336:87;;;;60416:7;-1:-1:-1;;;;;60392:31:0;:20;60404:7;60392:11;:20::i;:::-;-1:-1:-1;;;;;60392:31:0;;;60168:264;-1:-1:-1;;;;60168:264:0:o;63191:625::-;63350:4;-1:-1:-1;;;;;63323:31:0;:23;63338:7;63323:14;:23::i;:::-;-1:-1:-1;;;;;63323:31:0;;63315:81;;;;-1:-1:-1;;;63315:81:0;;17227:2:1;63315:81:0;;;17209:21:1;17266:2;17246:18;;;17239:30;17305:34;17285:18;;;17278:62;-1:-1:-1;;;17356:18:1;;;17349:35;17401:19;;63315:81:0;17025:401:1;63315:81:0;-1:-1:-1;;;;;63415:16:0;;63407:65;;;;-1:-1:-1;;;63407:65:0;;17633:2:1;63407:65:0;;;17615:21:1;17672:2;17652:18;;;17645:30;17711:34;17691:18;;;17684:62;-1:-1:-1;;;17762:18:1;;;17755:34;17806:19;;63407:65:0;17431:400:1;63407:65:0;63589:29;63606:1;63610:7;63589:8;:29::i;:::-;-1:-1:-1;;;;;63631:15:0;;;;;;:9;:15;;;;;:20;;63650:1;;63631:15;:20;;63650:1;;63631:20;:::i;:::-;;;;-1:-1:-1;;;;;;;63662:13:0;;;;;;:9;:13;;;;;:18;;63679:1;;63662:13;:18;;63679:1;;63662:18;:::i;:::-;;;;-1:-1:-1;;63691:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;63691:21:0;-1:-1:-1;;;;;63691:21:0;;;;;;;;;63730:27;;63691:16;;63730:27;;;;;;;56268:347;56198:417;;:::o;41140:105::-;41207:30;41218:4;3626:10;41207;:30::i;45411:238::-;45495:22;45503:4;45509:7;45495;:22::i;:::-;45490:152;;45534:6;:12;;;;;;;;;;;-1:-1:-1;;;;;45534:29:0;;;;;;;;;:36;;-1:-1:-1;;45534:36:0;45566:4;45534:36;;;45617:12;3626:10;;3546:98;45617:12;-1:-1:-1;;;;;45590:40:0;45608:7;-1:-1:-1;;;;;45590:40:0;45602:4;45590:40;;;;;;;;;;45411:238;;:::o;45829:239::-;45913:22;45921:4;45927:7;45913;:22::i;:::-;45909:152;;;45984:5;45952:12;;;;;;;;;;;-1:-1:-1;;;;;45952:29:0;;;;;;;;;;:37;;-1:-1:-1;;45952:37:0;;;46009:40;3626:10;;45952:12;;46009:40;;45984:5;46009:40;45829:239;;:::o;18293:211::-;18437:58;;;-1:-1:-1;;;;;206:32:1;;18437:58:0;;;188:51:1;255:18;;;;248:34;;;18437:58:0;;;;;;;;;;161:18:1;;;;18437:58:0;;;;;;;;-1:-1:-1;;;;;18437:58:0;-1:-1:-1;;;18437:58:0;;;18410:86;;18430:5;;18410:19;:86::i;60774:110::-;60850:26;60860:2;60864:7;60850:26;;;;;;;;;;;;:9;:26::i;64252:315::-;64407:8;-1:-1:-1;;;;;64398:17:0;:5;-1:-1:-1;;;;;64398:17:0;;64390:55;;;;-1:-1:-1;;;64390:55:0;;18038:2:1;64390:55:0;;;18020:21:1;18077:2;18057:18;;;18050:30;18116:27;18096:18;;;18089:55;18161:18;;64390:55:0;17836:349:1;64390:55:0;-1:-1:-1;;;;;64456:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;64456:46:0;;;;;;;;;;64518:41;;819::1;;;64518::0;;792:18:1;64518:41:0;;;;;;;64252:315;;;:::o;29386:248::-;29596:12;;-1:-1:-1;;;;;29576:16:0;;29532:7;29576:16;;;:7;:16;;;;;;29532:7;;29611:15;;29560:32;;:13;:32;:::i;:::-;29559:49;;;;:::i;:::-;:67;;;;:::i;59248:313::-;59404:28;59414:4;59420:2;59424:7;59404:9;:28::i;:::-;59451:47;59474:4;59480:2;59484:7;59493:4;59451:22;:47::i;:::-;59443:110;;;;-1:-1:-1;;;59443:110:0;;;;;;;:::i;69700:114::-;69760:13;69793;69786:20;;;;;:::i;69916:1745::-;69981:17;70415:4;70408;70402:11;70398:22;70507:1;70501:4;70494:15;70582:4;70579:1;70575:12;70568:19;;;70664:1;70659:3;70652:14;70768:3;71007:5;70989:428;71055:1;71050:3;71046:11;71039:18;;71226:2;71220:4;71216:13;71212:2;71208:22;71203:3;71195:36;71320:2;71310:13;;71377:25;70989:428;71377:25;-1:-1:-1;71447:13:0;;;-1:-1:-1;;71562:14:0;;;71624:19;;;71562:14;69916:1745;-1:-1:-1;69916:1745:0:o;40393:204::-;40478:4;-1:-1:-1;;;;;;40502:47:0;;-1:-1:-1;;;40502:47:0;;:87;;-1:-1:-1;;;;;;;;;;37757:40:0;;;40553:36;37648:157;41535:505;41624:22;41632:4;41638:7;41624;:22::i;:::-;41619:414;;41812:41;41840:7;-1:-1:-1;;;;;41812:41:0;41850:2;41812:19;:41::i;:::-;41926:38;41954:4;41961:2;41926:19;:38::i;:::-;41717:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;41717:270:0;;;;;;;;;;-1:-1:-1;;;41663:358:0;;;;;;;:::i;21360:716::-;21784:23;21810:69;21838:4;21810:69;;;;;;;;;;;;;;;;;21818:5;-1:-1:-1;;;;;21810:27:0;;;:69;;;;;:::i;:::-;21894:17;;21784:95;;-1:-1:-1;21894:21:0;21890:179;;21991:10;21980:30;;;;;;;;;;;;:::i;:::-;21972:85;;;;-1:-1:-1;;;21972:85:0;;20074:2:1;21972:85:0;;;20056:21:1;20113:2;20093:18;;;20086:30;20152:34;20132:18;;;20125:62;-1:-1:-1;;;20203:18:1;;;20196:40;20253:19;;21972:85:0;19872:406:1;61111:319:0;61240:18;61246:2;61250:7;61240:5;:18::i;:::-;61291:53;61322:1;61326:2;61330:7;61339:4;61291:22;:53::i;:::-;61269:153;;;;-1:-1:-1;;;61269:153:0;;;;;;;:::i;65355:853::-;65509:4;-1:-1:-1;;;;;65530:13:0;;5294:19;:23;65526:675;;65566:71;;-1:-1:-1;;;65566:71:0;;-1:-1:-1;;;;;65566:36:0;;;;;:71;;3626:10;;65617:4;;65623:7;;65632:4;;65566:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65566:71:0;;;;;;;;-1:-1:-1;;65566:71:0;;;;;;;;;;;;:::i;:::-;;;65562:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65807:6;:13;65824:1;65807:18;65803:328;;65850:60;;-1:-1:-1;;;65850:60:0;;;;;;;:::i;65803:328::-;66081:6;66075:13;66066:6;66062:2;66058:15;66051:38;65562:584;-1:-1:-1;;;;;;65688:51:0;-1:-1:-1;;;65688:51:0;;-1:-1:-1;65681:58:0;;65526:675;-1:-1:-1;66185:4:0;65355:853;;;;;;:::o;32043:451::-;32118:13;32144:19;32176:10;32180:6;32176:1;:10;:::i;:::-;:14;;32189:1;32176:14;:::i;:::-;32166:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32166:25:0;;32144:47;;-1:-1:-1;;;32202:6:0;32209:1;32202:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;32202:15:0;;;;;;;;;-1:-1:-1;;;32228:6:0;32235:1;32228:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;32228:15:0;;;;;;;;-1:-1:-1;32259:9:0;32271:10;32275:6;32271:1;:10;:::i;:::-;:14;;32284:1;32271:14;:::i;:::-;32259:26;;32254:135;32291:1;32287;:5;32254:135;;;-1:-1:-1;;;32339:5:0;32347:3;32339:11;32326:25;;;;;;;:::i;:::-;;;;32314:6;32321:1;32314:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;32314:37:0;;;;;;;;-1:-1:-1;32376:1:0;32366:11;;;;;32294:3;;;:::i;:::-;;;32254:135;;;-1:-1:-1;32407:10:0;;32399:55;;;;-1:-1:-1;;;32399:55:0;;21374:2:1;32399:55:0;;;21356:21:1;;;21393:18;;;21386:30;21452:34;21432:18;;;21425:62;21504:18;;32399:55:0;21172:356:1;7744:229:0;7881:12;7913:52;7935:6;7943:4;7949:1;7952:12;7913:21;:52::i;61766:439::-;-1:-1:-1;;;;;61846:16:0;;61838:61;;;;-1:-1:-1;;;61838:61:0;;21735:2:1;61838:61:0;;;21717:21:1;;;21754:18;;;21747:30;21813:34;21793:18;;;21786:62;21865:18;;61838:61:0;21533:356:1;61838:61:0;59939:4;59963:16;;;:7;:16;;;;;;-1:-1:-1;;;;;59963:16:0;:30;61910:58;;;;-1:-1:-1;;;61910:58:0;;22096:2:1;61910:58:0;;;22078:21:1;22135:2;22115:18;;;22108:30;22174;22154:18;;;22147:58;22222:18;;61910:58:0;21894:352:1;61910:58:0;-1:-1:-1;;;;;62039:13:0;;;;;;:9;:13;;;;;:18;;62056:1;;62039:13;:18;;62056:1;;62039:18;:::i;:::-;;;;-1:-1:-1;;62068:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;62068:21:0;-1:-1:-1;;;;;62068:21:0;;;;;;;;62107:33;;62068:16;;;62107:33;;62068:16;;62107:33;43814:218;;:::o;8864:510::-;9034:12;9092:5;9067:21;:30;;9059:81;;;;-1:-1:-1;;;9059:81:0;;22453:2:1;9059:81:0;;;22435:21:1;22492:2;22472:18;;;22465:30;22531:34;22511:18;;;22504:62;-1:-1:-1;;;22582:18:1;;;22575:36;22628:19;;9059:81:0;22251:402:1;9059:81:0;-1:-1:-1;;;;;5294:19:0;;;9151:60;;;;-1:-1:-1;;;9151:60:0;;22860:2:1;9151:60:0;;;22842:21:1;22899:2;22879:18;;;22872:30;22938:31;22918:18;;;22911:59;22987:18;;9151:60:0;22658:353:1;9151:60:0;9225:12;9239:23;9266:6;-1:-1:-1;;;;;9266:11:0;9285:5;9292:4;9266:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9224:73;;;;9315:51;9332:7;9341:10;9353:12;9315:16;:51::i;:::-;9308:58;8864:510;-1:-1:-1;;;;;;;8864:510:0:o;11550:762::-;11700:12;11729:7;11725:580;;;-1:-1:-1;11760:10:0;11753:17;;11725:580;11874:17;;:21;11870:424;;12122:10;12116:17;12183:15;12170:10;12166:2;12162:19;12155:44;11870:424;12265:12;12258:20;;-1:-1:-1;;;12258:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;293:131:1;-1:-1:-1;;;;;;367:32:1;;357:43;;347:71;;414:1;411;404:12;429:245;487:6;540:2;528:9;519:7;515:23;511:32;508:52;;;556:1;553;546:12;508:52;595:9;582:23;614:30;638:5;614:30;:::i;871:258::-;943:1;953:113;967:6;964:1;961:13;953:113;;;1043:11;;;1037:18;1024:11;;;1017:39;989:2;982:10;953:113;;;1084:6;1081:1;1078:13;1075:48;;;-1:-1:-1;;1119:1:1;1101:16;;1094:27;871:258::o;1134:::-;1176:3;1214:5;1208:12;1241:6;1236:3;1229:19;1257:63;1313:6;1306:4;1301:3;1297:14;1290:4;1283:5;1279:16;1257:63;:::i;:::-;1374:2;1353:15;-1:-1:-1;;1349:29:1;1340:39;;;;1381:4;1336:50;;1134:258;-1:-1:-1;;1134:258:1:o;1397:220::-;1546:2;1535:9;1528:21;1509:4;1566:45;1607:2;1596:9;1592:18;1584:6;1566:45;:::i;1622:180::-;1681:6;1734:2;1722:9;1713:7;1709:23;1705:32;1702:52;;;1750:1;1747;1740:12;1702:52;-1:-1:-1;1773:23:1;;1622:180;-1:-1:-1;1622:180:1:o;2015:131::-;-1:-1:-1;;;;;2090:31:1;;2080:42;;2070:70;;2136:1;2133;2126:12;2151:315;2219:6;2227;2280:2;2268:9;2259:7;2255:23;2251:32;2248:52;;;2296:1;2293;2286:12;2248:52;2335:9;2322:23;2354:31;2379:5;2354:31;:::i;:::-;2404:5;2456:2;2441:18;;;;2428:32;;-1:-1:-1;;;2151:315:1:o;2653:255::-;2720:6;2773:2;2761:9;2752:7;2748:23;2744:32;2741:52;;;2789:1;2786;2779:12;2741:52;2828:9;2815:23;2847:31;2872:5;2847:31;:::i;3095:456::-;3172:6;3180;3188;3241:2;3229:9;3220:7;3216:23;3212:32;3209:52;;;3257:1;3254;3247:12;3209:52;3296:9;3283:23;3315:31;3340:5;3315:31;:::i;:::-;3365:5;-1:-1:-1;3422:2:1;3407:18;;3394:32;3435:33;3394:32;3435:33;:::i;:::-;3095:456;;3487:7;;-1:-1:-1;;;3541:2:1;3526:18;;;;3513:32;;3095:456::o;3741:315::-;3809:6;3817;3870:2;3858:9;3849:7;3845:23;3841:32;3838:52;;;3886:1;3883;3876:12;3838:52;3922:9;3909:23;3899:33;;3982:2;3971:9;3967:18;3954:32;3995:31;4020:5;3995:31;:::i;:::-;4045:5;4035:15;;;3741:315;;;;;:::o;4061:127::-;4122:10;4117:3;4113:20;4110:1;4103:31;4153:4;4150:1;4143:15;4177:4;4174:1;4167:15;4193:632;4258:5;4288:18;4329:2;4321:6;4318:14;4315:40;;;4335:18;;:::i;:::-;4410:2;4404:9;4378:2;4464:15;;-1:-1:-1;;4460:24:1;;;4486:2;4456:33;4452:42;4440:55;;;4510:18;;;4530:22;;;4507:46;4504:72;;;4556:18;;:::i;:::-;4596:10;4592:2;4585:22;4625:6;4616:15;;4655:6;4647;4640:22;4695:3;4686:6;4681:3;4677:16;4674:25;4671:45;;;4712:1;4709;4702:12;4671:45;4762:6;4757:3;4750:4;4742:6;4738:17;4725:44;4817:1;4810:4;4801:6;4793;4789:19;4785:30;4778:41;;;;4193:632;;;;;:::o;4830:451::-;4899:6;4952:2;4940:9;4931:7;4927:23;4923:32;4920:52;;;4968:1;4965;4958:12;4920:52;5008:9;4995:23;5041:18;5033:6;5030:30;5027:50;;;5073:1;5070;5063:12;5027:50;5096:22;;5149:4;5141:13;;5137:27;-1:-1:-1;5127:55:1;;5178:1;5175;5168:12;5127:55;5201:74;5267:7;5262:2;5249:16;5244:2;5240;5236:11;5201:74;:::i;5286:402::-;5368:6;5376;5429:2;5417:9;5408:7;5404:23;5400:32;5397:52;;;5445:1;5442;5435:12;5397:52;5484:9;5471:23;5503:31;5528:5;5503:31;:::i;:::-;5553:5;-1:-1:-1;5610:2:1;5595:18;;5582:32;5623:33;5582:32;5623:33;:::i;5945:118::-;6031:5;6024:13;6017:21;6010:5;6007:32;5997:60;;6053:1;6050;6043:12;6068:382;6133:6;6141;6194:2;6182:9;6173:7;6169:23;6165:32;6162:52;;;6210:1;6207;6200:12;6162:52;6249:9;6236:23;6268:31;6293:5;6268:31;:::i;:::-;6318:5;-1:-1:-1;6375:2:1;6360:18;;6347:32;6388:30;6347:32;6388:30;:::i;6455:795::-;6550:6;6558;6566;6574;6627:3;6615:9;6606:7;6602:23;6598:33;6595:53;;;6644:1;6641;6634:12;6595:53;6683:9;6670:23;6702:31;6727:5;6702:31;:::i;:::-;6752:5;-1:-1:-1;6809:2:1;6794:18;;6781:32;6822:33;6781:32;6822:33;:::i;:::-;6874:7;-1:-1:-1;6928:2:1;6913:18;;6900:32;;-1:-1:-1;6983:2:1;6968:18;;6955:32;7010:18;6999:30;;6996:50;;;7042:1;7039;7032:12;6996:50;7065:22;;7118:4;7110:13;;7106:27;-1:-1:-1;7096:55:1;;7147:1;7144;7137:12;7096:55;7170:74;7236:7;7231:2;7218:16;7213:2;7209;7205:11;7170:74;:::i;:::-;7160:84;;;6455:795;;;;;;;:::o;7914:380::-;7993:1;7989:12;;;;8036;;;8057:61;;8111:4;8103:6;8099:17;8089:27;;8057:61;8164:2;8156:6;8153:14;8133:18;8130:38;8127:161;;8210:10;8205:3;8201:20;8198:1;8191:31;8245:4;8242:1;8235:15;8273:4;8270:1;8263:15;8127:161;;7914:380;;;:::o;9132:402::-;9334:2;9316:21;;;9373:2;9353:18;;;9346:30;9412:34;9407:2;9392:18;;9385:62;-1:-1:-1;;;9478:2:1;9463:18;;9456:36;9524:3;9509:19;;9132:402::o;9539:407::-;9741:2;9723:21;;;9780:2;9760:18;;;9753:30;9819:34;9814:2;9799:18;;9792:62;-1:-1:-1;;;9885:2:1;9870:18;;9863:41;9936:3;9921:19;;9539:407::o;9951:127::-;10012:10;10007:3;10003:20;10000:1;9993:31;10043:4;10040:1;10033:15;10067:4;10064:1;10057:15;10083:128;10123:3;10154:1;10150:6;10147:1;10144:13;10141:39;;;10160:18;;:::i;:::-;-1:-1:-1;10196:9:1;;10083:128::o;10503:410::-;10705:2;10687:21;;;10744:2;10724:18;;;10717:30;10783:34;10778:2;10763:18;;10756:62;-1:-1:-1;;;10849:2:1;10834:18;;10827:44;10903:3;10888:19;;10503:410::o;12453:168::-;12493:7;12559:1;12555;12551:6;12547:14;12544:1;12541:21;12536:1;12529:9;12522:17;12518:45;12515:71;;;12566:18;;:::i;:::-;-1:-1:-1;12606:9:1;;12453:168::o;13335:135::-;13374:3;13395:17;;;13392:43;;13415:18;;:::i;:::-;-1:-1:-1;13462:1:1;13451:13;;13335:135::o;14590:125::-;14630:4;14658:1;14655;14652:8;14649:34;;;14663:18;;:::i;:::-;-1:-1:-1;14700:9:1;;14590:125::o;14720:127::-;14781:10;14776:3;14772:20;14769:1;14762:31;14812:4;14809:1;14802:15;14836:4;14833:1;14826:15;14852:184;14922:6;14975:2;14963:9;14954:7;14950:23;14946:32;14943:52;;;14991:1;14988;14981:12;14943:52;-1:-1:-1;15014:16:1;;14852:184;-1:-1:-1;14852:184:1:o;15388:637::-;15668:3;15706:6;15700:13;15722:53;15768:6;15763:3;15756:4;15748:6;15744:17;15722:53;:::i;:::-;15838:13;;15797:16;;;;15860:57;15838:13;15797:16;15894:4;15882:17;;15860:57;:::i;:::-;-1:-1:-1;;;15939:20:1;;15968:22;;;16017:1;16006:13;;15388:637;-1:-1:-1;;;;15388:637:1:o;18190:217::-;18230:1;18256;18246:132;;18300:10;18295:3;18291:20;18288:1;18281:31;18335:4;18332:1;18325:15;18363:4;18360:1;18353:15;18246:132;-1:-1:-1;18392:9:1;;18190:217::o;18412:414::-;18614:2;18596:21;;;18653:2;18633:18;;;18626:30;18692:34;18687:2;18672:18;;18665:62;-1:-1:-1;;;18758:2:1;18743:18;;18736:48;18816:3;18801:19;;18412:414::o;18831:786::-;19242:25;19237:3;19230:38;19212:3;19297:6;19291:13;19313:62;19368:6;19363:2;19358:3;19354:12;19347:4;19339:6;19335:17;19313:62;:::i;:::-;-1:-1:-1;;;19434:2:1;19394:16;;;19426:11;;;19419:40;19484:13;;19506:63;19484:13;19555:2;19547:11;;19540:4;19528:17;;19506:63;:::i;:::-;19589:17;19608:2;19585:26;;18831:786;-1:-1:-1;;;;18831:786:1:o;19622:245::-;19689:6;19742:2;19730:9;19721:7;19717:23;19713:32;19710:52;;;19758:1;19755;19748:12;19710:52;19790:9;19784:16;19809:28;19831:5;19809:28;:::i;20283:489::-;-1:-1:-1;;;;;20552:15:1;;;20534:34;;20604:15;;20599:2;20584:18;;20577:43;20651:2;20636:18;;20629:34;;;20699:3;20694:2;20679:18;;20672:31;;;20477:4;;20720:46;;20746:19;;20738:6;20720:46;:::i;:::-;20712:54;20283:489;-1:-1:-1;;;;;;20283:489:1:o;20777:249::-;20846:6;20899:2;20887:9;20878:7;20874:23;20870:32;20867:52;;;20915:1;20912;20905:12;20867:52;20947:9;20941:16;20966:30;20990:5;20966:30;:::i;21031:136::-;21070:3;21098:5;21088:39;;21107:18;;:::i;:::-;-1:-1:-1;;;21143:18:1;;21031:136::o;23016:274::-;23145:3;23183:6;23177:13;23199:53;23245:6;23240:3;23233:4;23225:6;23221:17;23199:53;:::i;:::-;23268:16;;;;;23016:274;-1:-1:-1;;23016:274:1:o

Swarm Source

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