ETH Price: $3,527.93 (+5.17%)

Token

Last Call (FINS)
 

Overview

Max Total Supply

11,494 FINS

Holders

1,794

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x58331fcb44c5e19fb18db211b4d7e764d7000e80
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:
LastCall

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-23
*/

// File: contracts/IDelegationRegistry.sol


pragma solidity ^0.8.17;

/**
 * @title An immutable registry contract to be deployed as a standalone primitive
 * @dev See EIP-5639, new project launches can read previous cold wallet -> hot wallet delegations
 * from here and integrate those permissions into their flow
 */
interface IDelegationRegistry {
    /// @notice Delegation type
    enum DelegationType {
        NONE,
        ALL,
        CONTRACT,
        TOKEN
    }

    /// @notice Info about a single delegation, used for onchain enumeration
    struct DelegationInfo {
        DelegationType type_;
        address vault;
        address delegate;
        address contract_;
        uint256 tokenId;
    }

    /// @notice Info about a single contract-level delegation
    struct ContractDelegation {
        address contract_;
        address delegate;
    }

    /// @notice Info about a single token-level delegation
    struct TokenDelegation {
        address contract_;
        uint256 tokenId;
        address delegate;
    }

    /// @notice Emitted when a user delegates their entire wallet
    event DelegateForAll(address vault, address delegate, bool value);

    /// @notice Emitted when a user delegates a specific contract
    event DelegateForContract(address vault, address delegate, address contract_, bool value);

    /// @notice Emitted when a user delegates a specific token
    event DelegateForToken(address vault, address delegate, address contract_, uint256 tokenId, bool value);

    /// @notice Emitted when a user revokes all delegations
    event RevokeAllDelegates(address vault);

    /// @notice Emitted when a user revoes all delegations for a given delegate
    event RevokeDelegate(address vault, address delegate);

    /**
     * -----------  WRITE -----------
     */

    /**
     * @notice Allow the delegate to act on your behalf for all contracts
     * @param delegate The hotwallet to act on your behalf
     * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking
     */
    function delegateForAll(address delegate, bool value) external;

    /**
     * @notice Allow the delegate to act on your behalf for a specific contract
     * @param delegate The hotwallet to act on your behalf
     * @param contract_ The address for the contract you're delegating
     * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking
     */
    function delegateForContract(address delegate, address contract_, bool value) external;

    /**
     * @notice Allow the delegate to act on your behalf for a specific token
     * @param delegate The hotwallet to act on your behalf
     * @param contract_ The address for the contract you're delegating
     * @param tokenId The token id for the token you're delegating
     * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking
     */
    function delegateForToken(address delegate, address contract_, uint256 tokenId, bool value) external;

    /**
     * @notice Revoke all delegates
     */
    function revokeAllDelegates() external;

    /**
     * @notice Revoke a specific delegate for all their permissions
     * @param delegate The hotwallet to revoke
     */
    function revokeDelegate(address delegate) external;

    /**
     * @notice Remove yourself as a delegate for a specific vault
     * @param vault The vault which delegated to the msg.sender, and should be removed
     */
    function revokeSelf(address vault) external;

    /**
     * -----------  READ -----------
     */

    /**
     * @notice Returns all active delegations a given delegate is able to claim on behalf of
     * @param delegate The delegate that you would like to retrieve delegations for
     * @return info Array of DelegationInfo structs
     */
    function getDelegationsByDelegate(address delegate) external view returns (DelegationInfo[] memory);

    /**
     * @notice Returns an array of wallet-level delegates for a given vault
     * @param vault The cold wallet who issued the delegation
     * @return addresses Array of wallet-level delegates for a given vault
     */
    function getDelegatesForAll(address vault) external view returns (address[] memory);

    /**
     * @notice Returns an array of contract-level delegates for a given vault and contract
     * @param vault The cold wallet who issued the delegation
     * @param contract_ The address for the contract you're delegating
     * @return addresses Array of contract-level delegates for a given vault and contract
     */
    function getDelegatesForContract(address vault, address contract_) external view returns (address[] memory);

    /**
     * @notice Returns an array of contract-level delegates for a given vault's token
     * @param vault The cold wallet who issued the delegation
     * @param contract_ The address for the contract holding the token
     * @param tokenId The token id for the token you're delegating
     * @return addresses Array of contract-level delegates for a given vault's token
     */
    function getDelegatesForToken(address vault, address contract_, uint256 tokenId)
        external
        view
        returns (address[] memory);

    /**
     * @notice Returns all contract-level delegations for a given vault
     * @param vault The cold wallet who issued the delegations
     * @return delegations Array of ContractDelegation structs
     */
    function getContractLevelDelegations(address vault)
        external
        view
        returns (ContractDelegation[] memory delegations);

    /**
     * @notice Returns all token-level delegations for a given vault
     * @param vault The cold wallet who issued the delegations
     * @return delegations Array of TokenDelegation structs
     */
    function getTokenLevelDelegations(address vault) external view returns (TokenDelegation[] memory delegations);

    /**
     * @notice Returns true if the address is delegated to act on the entire vault
     * @param delegate The hotwallet to act on your behalf
     * @param vault The cold wallet who issued the delegation
     */
    function checkDelegateForAll(address delegate, address vault) external view returns (bool);

    /**
     * @notice Returns true if the address is delegated to act on your behalf for a token contract or an entire vault
     * @param delegate The hotwallet to act on your behalf
     * @param contract_ The address for the contract you're delegating
     * @param vault The cold wallet who issued the delegation
     */
    function checkDelegateForContract(address delegate, address vault, address contract_)
        external
        view
        returns (bool);

    /**
     * @notice Returns true if the address is delegated to act on your behalf for a specific token, the token's contract or an entire vault
     * @param delegate The hotwallet to act on your behalf
     * @param contract_ The address for the contract you're delegating
     * @param tokenId The token id for the token you're delegating
     * @param vault The cold wallet who issued the delegation
     */
    function checkDelegateForToken(address delegate, address vault, address contract_, uint256 tokenId)
        external
        view
        returns (bool);
}

// File: contracts/filter/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}
// File: contracts/filter/OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}
// File: contracts/filter/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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


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

pragma solidity ^0.8.0;







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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }
}

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


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

pragma solidity ^0.8.0;


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

        _burn(account, id, value);
    }

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

        _burnBatch(account, ids, values);
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: contracts/LastCall.sol


pragma solidity ^0.8.17;






interface IFinsBeachBar {
    function balanceOf(address _address, uint256 tokenID) external returns (uint256);
    function supportsInterface(bytes4 interfaceId) external returns (bool);
}

interface IDoodlesOG {
    function balanceOf(address _address) external returns (uint256);
    function supportsInterface(bytes4 interfaceId) external returns (bool);
}

contract LastCall is DefaultOperatorFilterer, ERC1155, ERC1155Supply, ERC1155Burnable, Ownable {
    
    string public name = "Last Call";
    string public symbol = "FINS";
    uint256 public constant MAX_FINS_BEACH_BAR_TOKEN = 26; /// The highest eligible token from the OG contract we'll check for
    uint256 public constant FINS_BEACH_BAR_VIP_TOKEN_ID = 10; /// VIP Fin's Token ID
    uint256 public constant FINS_BEACH_BAR_HOLOCAT_TOKEN_ID = 69; /// ooooh, shiny! 
    uint256 public constant DOODLE_DRINK = 16; /// Put it on Poopie's Tab
    uint256 public constant IYKYK = 17; /// IYKYK
    uint256 public constant REDEEMABLE_DRINK_ID = 19; // burn 15 unique tokens to have this token id
    uint256 public constant GENEROUS_TIPPER_ODDS = 20; /// a 1 in 20 chance to roll a random token if tipping generously
    uint256 public constant FINS_VIP_ODDS = 40; /// a 1 in 40 chance to roll on every VIP mint
    uint256 public constant DOODLE_HOLDER_ODDS = 16; /// a 1 in 16 chance to roll a rare prize - doodle holders only
    uint256 public constant DRINK_18_PRICE = 69 ether; /// the game's only 1:1

    /// Fin's Beach Bar contract so we can interface with it
    address public finsContractAddress;

    /// Doodles contract address so we can interface with it
    address public doodlesContractAddress;
    
    /// delegate.cash registry
    address public delegationContractAddress;

    /// is the bar open? 
    bool public barIsOpen;

    /// Require VIP membership to call a function
    bool public onlyVIP; 

    /// Require membership to call a function
    bool public onlyFins;

    /// See if token 18 has been minted
    bool public drink18Minted;

    /// Keep track of the last block a token was minted
    uint256 public lastMintBlock = block.number;

    /// We will set the timer to 75 blocks (15 minutes in block time) 
    uint256 public DURATION = 74; 

    uint256 public gameStartBlock = 0;

    uint256 public generousTip = 0.05 ether;

    uint256 private nonce;

    /**
    * The _duration param specifies the number of blocks until the timer counts down to zero
    */
    constructor(string memory _uri) ERC1155(_uri) {
        _setURI(_uri);

        /// mint an initial set of tokens to the contract creator
        for (uint256 i = 1; i <= 17; ++i) {
            _mint(msg.sender, i, 1, "");
        }
        _mint(msg.sender, 19, 1, "");
    }

    /// @dev set the URI to your base URI here, don't forget the {id} param.
    function setURI(string memory newuri) external onlyOwner {
        _setURI(newuri);
    }

    /// @dev update the amount of ether we consider a "generous tip" 
    function setGenerousTip(uint256 _amount) external onlyOwner {
        generousTip = _amount;
    }

    function setFinsBeachBarContract(address _address) external onlyOwner {
        /// Validate that the candidate contract is 1155
        require(
            IFinsBeachBar(_address).supportsInterface(0xd9b67a26),
            "Does not support IERC1155 interface."
        );

        // Set the new contract address
        finsContractAddress = _address;
    }

    function setDoodlesContract(address _address) external onlyOwner {

        require(
            IDoodlesOG(_address).supportsInterface(0x780e9d63),
            "Does not support IERC721 interface"
        );

        // Set the new contract address
        doodlesContractAddress = _address;
    }

    function setDelegationContract(address _address) external onlyOwner {

        // Set the new contract address
        delegationContractAddress = _address;
    }

    function setVIPRequirement(bool _require) external onlyOwner {
        onlyVIP = _require;
    }

    function setOnlyFinsRequirement(bool _require) external onlyOwner {
        onlyFins = _require;
    }

    function setBarStatus(bool _isOpen, bool _isPublic) external onlyOwner {
        /// once the bar is opened to the public, it can't be opened again
        require(gameStartBlock == 0, "The bar cannot be opened again");
        
        barIsOpen = _isOpen;

        if (_isPublic) {
            gameStartBlock = block.number;
        }

        if (_isOpen) {
            _resetTimer();
        }
    }

    function _resetTimer() internal {
        lastMintBlock = block.number;
    }

    /// check to see if the address is a Fin's member
    function isFinsMember(address _vault) public returns (bool) {
        address mintAddress = msg.sender;

        if (_vault != address(0)) { 
            bool isDelegateValid = IDelegationRegistry(delegationContractAddress).checkDelegateForContract(msg.sender, _vault, finsContractAddress);
            require(isDelegateValid, "invalid delegate-vault pairing");
            mintAddress = _vault;
        }

        if (IFinsBeachBar(finsContractAddress).balanceOf(mintAddress, FINS_BEACH_BAR_HOLOCAT_TOKEN_ID) > 0) { 
            return true;
        }

        for (uint256 i; i <= MAX_FINS_BEACH_BAR_TOKEN; ++i) {
            if (IFinsBeachBar(finsContractAddress).balanceOf(mintAddress, i) > 0) {
                return true;
            }
        }
        return false;
    }

    /// check to see if the address is a Fin's VIP
    function isFinsVIP(address _vault) public returns (bool) {
        
        address mintAddress = msg.sender;

        if (_vault != address(0)) { 
            bool isDelegateValid = IDelegationRegistry(delegationContractAddress).checkDelegateForContract(msg.sender, _vault, finsContractAddress);
            require(isDelegateValid, "invalid delegate-vault pairing");
            mintAddress = _vault;
        }

        return IFinsBeachBar(finsContractAddress).balanceOf(mintAddress, FINS_BEACH_BAR_VIP_TOKEN_ID) > 0;
    }

    /// check to see if the address has an OG Doodle
    function ownsADoodle(address _vault) public returns (bool) {

        address mintAddress = msg.sender;

        if (_vault != address(0)) { 
            bool isDelegateValid = IDelegationRegistry(delegationContractAddress).checkDelegateForContract(msg.sender, _vault, doodlesContractAddress);
            require(isDelegateValid, "invalid delegate-vault pairing");
            mintAddress = _vault;
        }

        return IDoodlesOG(doodlesContractAddress).balanceOf(mintAddress) > 0;
    }

    /**
    * @notice it's free to buy a round of drinks at the bar. 
    * The closer a drink is minted to the timer going to zero, the rarer it will be
    * Split into three function calls to skip unnecessary gas spend on most mints for non-holders
    */
    function _kindaRandom(uint256 _max) internal returns (uint256) {
        uint256 kindaRandomnumber = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, nonce))) % _max;
        nonce++;
        return kindaRandomnumber;
    }

    function tendBar(address _toAddress) public onlyOwner {
        _mintDrink(_toAddress, IYKYK);
    }

    function mintDrink18() external payable {
        require(msg.value >= DRINK_18_PRICE, "Must send at least 69 ETH");
        require(!drink18Minted, "No Remaining Supply");

        /// mark the drink as minted... this can only be done once 
        drink18Minted = true;

        /// serve the only 1:1 in the collection
        _mintDrink(msg.sender, 18);
    }

 
    function mintAsVIP(address _vault) external payable {
        /// add a required min to deter spam
        require(msg.value >= 0.0001 ether, "Must send at least 0.0001 eth");

        require(isFinsVIP(_vault), "Not a VIP");

        uint256 idToMint = _idToMint();
        
        /// for Fin's VIPs, there's a 1 in 40 chance of minting a random token
        if (_kindaRandom(FINS_VIP_ODDS) == 20){
            idToMint  = _kindaRandom(15) + 1;
        }

        _mintDrink(msg.sender, idToMint);
    }

    function mintAsDoodle(address _vault) external payable {
        /// add a required min to deter spam
        require(msg.value >= 0.0001 ether, "Must send at least 0.0001 eth");

        if (onlyFins){
            require(isFinsMember(_vault), "Not a Fin's Holder");
        }
        
        if (onlyVIP){
            require(isFinsVIP(_vault), "Not a VIP");
        }

        uint256 idToMint = _idToMint();

        if (ownsADoodle(_vault)){
            if (_kindaRandom(DOODLE_HOLDER_ODDS) == 5){
                idToMint = DOODLE_DRINK;
            }
        }

        _mintDrink(msg.sender, idToMint);
    }

    function mint(address _vault) external payable {
        /// add a required min to deter spam
        require(msg.value >= 0.0001 ether, "Must send at least 0.0001 eth");

        if (onlyFins){
            require(isFinsMember(_vault), "Not a Fin's Holder");
        }

        if (onlyVIP){
            require(isFinsVIP(_vault), "Not a VIP");
        }

        _mintDrink(msg.sender, _idToMint());
    }

    function _mintDrink(address _toAddress, uint256 _id) internal {
        /// ensure the game is active
        require(barIsOpen, "Fin's Beach Bar is Closed");

        /// reset the timer
        _resetTimer();

        /// mint the token
        _mint(_toAddress, _id, 1, "");
    }

    function _idToMint() internal returns (uint256) {
        uint256 id = 15 - (currentRound()/5);

        /// for paid mints, there's a 1 in 20 chance of minting a random token
        if (msg.value >= generousTip && _kindaRandom(GENEROUS_TIPPER_ODDS) == 10){
            id = _kindaRandom(15) + 1;
        }

        return id;
    }

    function currentRound() public view returns (uint256) {
        /// calculate how much time has passed since the last mint
        uint256 elapsed = block.number - lastMintBlock;

        require(DURATION > elapsed, "The timer has expired");

        return DURATION - elapsed;
    }

    function burnToRedeem(uint256[] calldata ids) external {
        /// ensure that exactly the required number of items (15) are submitted to burn
        require(ids.length == 15, "Wrong number of tokens submitted");

        /// keep track of which tokens were submitted to prevent dupes
        /// all tokens are eligible but only 15 are needed
        uint256[] memory tokens = new uint256[](19);
        uint256[] memory values = new uint256[](15);

        /// loop over each of the 15 ids submitted to burn
        for (uint256 i; i <= 14; ++i) {

            /// ensure the token id is between 1 and 17
            require(ids[i] >= 1 && ids[i] <= 18, "Token not eligible");

            /// ensure that the token is not already in the list
            require(tokens[ids[i]] == 0, "Each token must be unique");

            /// mark the token as "used" so we prevent duplicates from being used
            tokens[ids[i]] = 1;

            /// tell the burn function to burn 1 of this specific id
            values[i] = 1;
        }

        /// burn the set of tokens and exchange them for a new one
        _burnBatch(msg.sender, ids, values);
        _mint(msg.sender, REDEEMABLE_DRINK_ID, 1, "");
    }

    /// @dev allows the owner to withdraw the funds in this contract
    function withdrawBalance(address payable _address) external onlyOwner {
        (bool success, ) = _address.call{value: address(this).balance}("");
        require(success, "Withdraw failed");
    }

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, uint256 amount, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, amount, data);
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DOODLE_DRINK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOODLE_HOLDER_ODDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DRINK_18_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FINS_BEACH_BAR_HOLOCAT_TOKEN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FINS_BEACH_BAR_VIP_TOKEN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FINS_VIP_ODDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GENEROUS_TIPPER_ODDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IYKYK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FINS_BEACH_BAR_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REDEEMABLE_DRINK_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"barIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"burnToRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegationContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doodlesContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"drink18Minted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finsContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generousTip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"isFinsMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"isFinsVIP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastMintBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"mintAsDoodle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"mintAsVIP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintDrink18","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyFins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyVIP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"ownsADoodle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOpen","type":"bool"},{"internalType":"bool","name":"_isPublic","type":"bool"}],"name":"setBarStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setDelegationContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setDoodlesContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setFinsBeachBarContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setGenerousTip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_require","type":"bool"}],"name":"setOnlyFinsRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_require","type":"bool"}],"name":"setVIPRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddress","type":"address"}],"name":"tendBar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_address","type":"address"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600960809081526813185cdd0810d85b1b60ba1b60a0526005906200002a9082620008c3565b5060408051808201909152600481526346494e5360e01b6020820152600690620000559082620008c3565b5043600a55604a600b556000600c5566b1a2bc2ec50000600d553480156200007c57600080fd5b5060405162004546380380620045468339810160408190526200009f91620009e4565b80733cc6cdda760b79bafa08df41ecfa224f810dceb660016daaeb6d7670e522a718067333cd4e3b15620001fc5780156200014a57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200012b57600080fd5b505af115801562000140573d6000803e3d6000fd5b50505050620001fc565b6001600160a01b038216156200019b5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000110565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001e257600080fd5b505af1158015620001f7573d6000803e3d6000fd5b505050505b506200020a90508162000291565b506200021633620002a3565b620002218162000291565b60015b601181116200026457620002513382600160405180602001604052806000815250620002f560201b60201c565b6200025c8162000a9c565b905062000224565b506200028a336013600160405180602001604052806000815250620002f560201b60201c565b5062000c53565b60026200029f8282620008c3565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166200035b5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084015b60405180910390fd5b336000620003698562000428565b90506000620003788562000428565b90506200038b8360008985858962000476565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290620003bd90849062000ab8565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46200041f8360008989898962000499565b50505050505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811062000465576200046562000ad4565b602090810291909101015292915050565b620004918686868686866200066560201b62001cce1760201c565b505050505050565b620004b8846001600160a01b03166200081360201b62001e501760201c565b15620004915760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190620004f4908990899088908890889060040162000b18565b6020604051808303816000875af192505050801562000532575060408051601f3d908101601f191682019092526200052f9181019062000b5f565b60015b620005f2576200054162000b92565b806308c379a0036200058157506200055862000baf565b8062000565575062000583565b8060405162461bcd60e51b815260040162000352919062000c3e565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840162000352565b6001600160e01b0319811663f23a6e6160e01b146200041f5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840162000352565b620006808686868686866200049160201b62000f0f1760201c565b6001600160a01b038516620007145760005b83518110156200071257828181518110620006b157620006b162000ad4565b602002602001015160036000868481518110620006d257620006d262000ad4565b602002602001015181526020019081526020016000206000828254620006f9919062000ab8565b909155506200070a90508162000a9c565b905062000692565b505b6001600160a01b038416620004915760005b83518110156200041f57600084828151811062000747576200074762000ad4565b60200260200101519050600084838151811062000768576200076862000ad4565b6020026020010151905060006003600084815260200190815260200160002054905081811015620007ed5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b606482015260840162000352565b600092835260036020526040909220910390556200080b8162000a9c565b905062000726565b6001600160a01b03163b151590565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200084d57607f821691505b6020821081036200086e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620008be57600081815260208120601f850160051c810160208610156200089d5750805b601f850160051c820191505b818110156200049157828155600101620008a9565b505050565b81516001600160401b03811115620008df57620008df62000822565b620008f781620008f0845462000838565b8462000874565b602080601f8311600181146200092f5760008415620009165750858301515b600019600386901b1c1916600185901b17855562000491565b600085815260208120601f198616915b8281101562000960578886015182559484019460019091019084016200093f565b50858210156200097f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b601f8201601f191681016001600160401b0381118282101715620009b757620009b762000822565b6040525050565b60005b83811015620009db578181015183820152602001620009c1565b50506000910152565b600060208284031215620009f757600080fd5b81516001600160401b038082111562000a0f57600080fd5b818401915084601f83011262000a2457600080fd5b81518181111562000a395762000a3962000822565b604051915062000a54601f8201601f1916602001836200098f565b80825285602082850101111562000a6a57600080fd5b62000a7d816020840160208601620009be565b50949350505050565b634e487b7160e01b600052601160045260246000fd5b60006001820162000ab15762000ab162000a86565b5060010190565b8082018082111562000ace5762000ace62000a86565b92915050565b634e487b7160e01b600052603260045260246000fd5b6000815180845262000b04816020860160208601620009be565b601f01601f19169290920160200192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009062000b549083018462000aea565b979650505050505050565b60006020828403121562000b7257600080fd5b81516001600160e01b03198116811462000b8b57600080fd5b9392505050565b600060033d111562000bac5760046000803e5060005160e01c5b90565b600060443d101562000bbe5790565b6040516003193d81016004833e81513d6001600160401b03808311602484018310171562000bee57505050505090565b828501915081518181111562000c075750505050505090565b843d870101602082850101111562000c225750505050505090565b62000c33602082860101876200098f565b509095945050505050565b60208152600062000b8b602083018462000aea565b6138e38062000c636000396000f3fe6080604052600436106103805760003560e01c8063715018a6116101d1578063bd144af611610102578063d8816dc7116100a0578063f242432a1161006f578063f242432a146109e4578063f2fde38b14610a04578063f5298aca14610a24578063f990afb314610a4457600080fd5b8063d8816dc71461093b578063d907227c1461095b578063e50543011461097b578063e985e9c51461099b57600080fd5b8063c8d6054f116100dc578063c8d6054f146108d1578063c8fae30f146108f1578063c9b6b30214610906578063d28ce57f1461092657600080fd5b8063bd144af61461087c578063bd85b03914610884578063c1b3433c146108b157600080fd5b8063983bbca51161016f578063a22cb46511610149578063a22cb46514610812578063a2e9a00114610832578063aa1de1c414610847578063aae279dd1461085c57600080fd5b8063983bbca5146107155780639a2895a2146107e75780639cf5c3f5146107fc57600080fd5b80638a19c8bc116101ab5780638a19c8bc1461077f5780638a3e0f12146107945780638da5cb5b146107b457806395d89b41146107d257600080fd5b8063715018a61461072a578063756af45f1461073f5780637a3c4e1f1461075f57600080fd5b80632eb2c2d6116102b65780634f558e79116102545780636a627842116102235780636a627842146106c25780636b20c454146106d55780636b68a70a146106f55780636c4b40a21461071557600080fd5b80634f558e791461063c5780635a9566c11461066b5780635fdda2521461068157806365f9cfad146106a157600080fd5b80633b6c3816116102905780633b6c3816146105ac57806341f43434146105cc578063431e78fc146105ee5780634e1273f41461060f57600080fd5b80632eb2c2d61461056157806335c4faf2146105815780633804c73d1461059657600080fd5b8063105c8822116103235780631ebc4499116102fd5780631ebc4499146104f757806326d8b26e1461050c578063291d3baf1461051f5780632b5858211461054057600080fd5b8063105c8822146104a1578063162664cb146104c15780631be05289146104e157600080fd5b80630681dcbd1161035f5780630681dcbd1461040a57806306fdde03146104425780630884a825146104645780630e89341c1461048157600080fd5b8062fdd58e1461038557806301ffc9a7146103b857806302fe5305146103e8575b600080fd5b34801561039157600080fd5b506103a56103a0366004612bd6565b610a57565b6040519081526020015b60405180910390f35b3480156103c457600080fd5b506103d86103d3366004612c18565b610af0565b60405190151581526020016103af565b3480156103f457600080fd5b50610408610403366004612cdd565b610b40565b005b34801561041657600080fd5b5060085461042a906001600160a01b031681565b6040516001600160a01b0390911681526020016103af565b34801561044e57600080fd5b50610457610b54565b6040516103af9190612d74565b34801561047057600080fd5b506103a56803bd913e6c1df4000081565b34801561048d57600080fd5b5061045761049c366004612d87565b610be2565b3480156104ad57600080fd5b506104086104bc366004612dae565b610c76565b3480156104cd57600080fd5b506104086104dc366004612de7565b610d03565b3480156104ed57600080fd5b506103a5600b5481565b34801561050357600080fd5b506103a5601181565b61040861051a366004612de7565b610df6565b34801561052b57600080fd5b506009546103d890600160b81b900460ff1681565b34801561054c57600080fd5b506009546103d890600160a01b900460ff1681565b34801561056d57600080fd5b5061040861057c366004612eb9565b610ee8565b34801561058d57600080fd5b506103a5604581565b3480156105a257600080fd5b506103a5600c5481565b3480156105b857600080fd5b506103d86105c7366004612de7565b610f17565b3480156105d857600080fd5b5061042a6daaeb6d7670e522a718067333cd4e81565b3480156105fa57600080fd5b506009546103d890600160b01b900460ff1681565b34801561061b57600080fd5b5061062f61062a366004612f67565b61104a565b6040516103af919061306f565b34801561064857600080fd5b506103d8610657366004612d87565b600090815260036020526040902054151590565b34801561067757600080fd5b506103a5600d5481565b34801561068d57600080fd5b5060075461042a906001600160a01b031681565b3480156106ad57600080fd5b506009546103d890600160a81b900460ff1681565b6104086106d0366004612de7565b611174565b3480156106e157600080fd5b506104086106f0366004613082565b61123e565b34801561070157600080fd5b50610408610710366004612de7565b611286565b34801561072157600080fd5b506103a5601081565b34801561073657600080fd5b50610408611299565b34801561074b57600080fd5b5061040861075a366004612de7565b6112ad565b34801561076b57600080fd5b5061040861077a3660046130f8565b61134a565b34801561078b57600080fd5b506103a5611370565b3480156107a057600080fd5b5060095461042a906001600160a01b031681565b3480156107c057600080fd5b506004546001600160a01b031661042a565b3480156107de57600080fd5b506104576113e0565b3480156107f357600080fd5b506103a5601a81565b34801561080857600080fd5b506103a5600a5481565b34801561081e57600080fd5b5061040861082d366004613115565b6113ed565b34801561083e57600080fd5b506103a5601381565b34801561085357600080fd5b506103a5600a81565b34801561086857600080fd5b506103d8610877366004612de7565b611401565b6104086114f2565b34801561089057600080fd5b506103a561089f366004612d87565b60009081526003602052604090205490565b3480156108bd57600080fd5b506104086108cc366004612d87565b6115b9565b3480156108dd57600080fd5b506104086108ec366004613133565b6115c6565b3480156108fd57600080fd5b506103a5602881565b34801561091257600080fd5b50610408610921366004612de7565b61183a565b34801561093257600080fd5b506103a5601481565b34801561094757600080fd5b50610408610956366004612de7565b61192c565b34801561096757600080fd5b506103d8610976366004612de7565b611956565b34801561098757600080fd5b506104086109963660046130f8565b611b3f565b3480156109a757600080fd5b506103d86109b63660046131a8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156109f057600080fd5b506104086109ff3660046131d6565b611b65565b348015610a1057600080fd5b50610408610a1f366004612de7565b611b8c565b348015610a3057600080fd5b50610408610a3f36600461323f565b611c02565b610408610a52366004612de7565b611c45565b60006001600160a01b038316610ac75760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610b2157506001600160e01b031982166303a24d0760e21b145b80610aea57506301ffc9a760e01b6001600160e01b0319831614610aea565b610b48611e5f565b610b5181611eb9565b50565b60058054610b6190613274565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d90613274565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b505050505081565b606060028054610bf190613274565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1d90613274565b8015610c6a5780601f10610c3f57610100808354040283529160200191610c6a565b820191906000526020600020905b815481529060010190602001808311610c4d57829003601f168201915b50505050509050919050565b610c7e611e5f565b600c5415610cce5760405162461bcd60e51b815260206004820152601e60248201527f546865206261722063616e6e6f74206265206f70656e656420616761696e00006044820152606401610abe565b6009805460ff60a01b1916600160a01b841515021790558015610cf05743600c555b8115610cff57610cff43600a55565b5050565b610d0b611e5f565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038216906301ffc9a7906024016020604051808303816000875af1158015610d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7c91906132ae565b610dd45760405162461bcd60e51b8152602060048201526024808201527f446f6573206e6f7420737570706f727420494552433131353520696e7465726660448201526330b1b29760e11b6064820152608401610abe565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b655af3107a4000341015610e1c5760405162461bcd60e51b8152600401610abe906132cb565b600954600160b01b900460ff1615610e7857610e3781611956565b610e785760405162461bcd60e51b81526020600482015260126024820152712737ba1030902334b713b9902437b63232b960711b6044820152606401610abe565b600954600160a81b900460ff1615610eaf57610e9381611401565b610eaf5760405162461bcd60e51b8152600401610abe90613302565b6000610eb9611ec5565b9050610ec482610f17565b15610ede57610ed36010611f26565b600503610ede575060105b610cff3382611fa5565b846001600160a01b0381163314610f0257610f0233612023565b610f0f86868686866120dc565b505050505050565b6000336001600160a01b03831615610fd05760095460085460405163090c9a2d60e41b81523360048201526001600160a01b038681166024830152918216604482015260009291909116906390c9a2d090606401602060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fac91906132ae565b905080610fcb5760405162461bcd60e51b8152600401610abe90613325565b839150505b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b6020604051808303816000875af115801561101e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611042919061335c565b119392505050565b606081518351146110af5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610abe565b6000835167ffffffffffffffff8111156110cb576110cb612c3c565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b50905060005b845181101561116c5761113f85828151811061111857611118613375565b602002602001015185838151811061113257611132613375565b6020026020010151610a57565b82828151811061115157611151613375565b6020908102919091010152611165816133a1565b90506110fa565b509392505050565b655af3107a400034101561119a5760405162461bcd60e51b8152600401610abe906132cb565b600954600160b01b900460ff16156111f6576111b581611956565b6111f65760405162461bcd60e51b81526020600482015260126024820152712737ba1030902334b713b9902437b63232b960711b6044820152606401610abe565b600954600160a81b900460ff161561122d5761121181611401565b61122d5760405162461bcd60e51b8152600401610abe90613302565b610b5133611239611ec5565b611fa5565b6001600160a01b03831633148061125a575061125a83336109b6565b6112765760405162461bcd60e51b8152600401610abe906133ba565b611281838383612128565b505050565b61128e611e5f565b610b51816011611fa5565b6112a1611e5f565b6112ab60006122c4565b565b6112b5611e5f565b6000816001600160a01b03164760405160006040518083038185875af1925050503d8060008114611302576040519150601f19603f3d011682016040523d82523d6000602084013e611307565b606091505b5050905080610cff5760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b6044820152606401610abe565b611352611e5f565b60098054911515600160b01b0260ff60b01b19909216919091179055565b600080600a54436113819190613409565b905080600b54116113cc5760405162461bcd60e51b8152602060048201526015602482015274151a19481d1a5b595c881a185cc8195e1c1a5c9959605a1b6044820152606401610abe565b80600b546113da9190613409565b91505090565b60068054610b6190613274565b816113f781612023565b6112818383612316565b6000336001600160a01b038316156114ba5760095460075460405163090c9a2d60e41b81523360048201526001600160a01b038681166024830152918216604482015260009291909116906390c9a2d090606401602060405180830381865afa158015611472573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149691906132ae565b9050806114b55760405162461bcd60e51b8152600401610abe90613325565b839150505b600754604051627eeac760e11b81526001600160a01b038381166004830152600a6024830152600092169062fdd58e90604401610fff565b6803bd913e6c1df4000034101561154b5760405162461bcd60e51b815260206004820152601960248201527f4d7573742073656e64206174206c6561737420363920455448000000000000006044820152606401610abe565b600954600160b81b900460ff161561159b5760405162461bcd60e51b81526020600482015260136024820152724e6f2052656d61696e696e6720537570706c7960681b6044820152606401610abe565b6009805460ff60b81b1916600160b81b1790556112ab336012611fa5565b6115c1611e5f565b600d55565b600f81146116165760405162461bcd60e51b815260206004820181905260248201527f57726f6e67206e756d626572206f6620746f6b656e73207375626d69747465646044820152606401610abe565b60408051601380825261028082019092526000916020820161026080368337505060408051600f80825261020082019092529293506000929150602082016101e08036833701905050905060005b600e81116117d757600185858381811061168057611680613375565b90506020020135101580156116ae575060128585838181106116a4576116a4613375565b9050602002013511155b6116ef5760405162461bcd60e51b8152602060048201526012602482015271546f6b656e206e6f7420656c696769626c6560701b6044820152606401610abe565b8285858381811061170257611702613375565b905060200201358151811061171957611719613375565b60200260200101516000146117705760405162461bcd60e51b815260206004820152601960248201527f4561636820746f6b656e206d75737420626520756e69717565000000000000006044820152606401610abe565b60018386868481811061178557611785613375565b905060200201358151811061179c5761179c613375565b60200260200101818152505060018282815181106117bc576117bc613375565b60209081029190910101526117d0816133a1565b9050611664565b5061181733858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250612128915050565b611834336013600160405180602001604052806000815250612321565b50505050565b611842611e5f565b6040516301ffc9a760e01b815263780e9d6360e01b60048201526001600160a01b038216906301ffc9a7906024016020604051808303816000875af115801561188f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b391906132ae565b61190a5760405162461bcd60e51b815260206004820152602260248201527f446f6573206e6f7420737570706f7274204945524337323120696e7465726661604482015261636560f01b6064820152608401610abe565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b611934611e5f565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000336001600160a01b03831615611a0f5760095460075460405163090c9a2d60e41b81523360048201526001600160a01b038681166024830152918216604482015260009291909116906390c9a2d090606401602060405180830381865afa1580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119eb91906132ae565b905080611a0a5760405162461bcd60e51b8152600401610abe90613325565b839150505b600754604051627eeac760e11b81526001600160a01b03838116600483015260456024830152600092169062fdd58e906044016020604051808303816000875af1158015611a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a85919061335c565b1115611a945750600192915050565b60005b601a8111611b3557600754604051627eeac760e11b81526001600160a01b03848116600483015260248201849052600092169062fdd58e906044016020604051808303816000875af1158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b15919061335c565b1115611b25575060019392505050565b611b2e816133a1565b9050611a97565b5060009392505050565b611b47611e5f565b60098054911515600160a81b0260ff60a81b19909216919091179055565b846001600160a01b0381163314611b7f57611b7f33612023565b610f0f868686868661243b565b611b94611e5f565b6001600160a01b038116611bf95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abe565b610b51816122c4565b6001600160a01b038316331480611c1e5750611c1e83336109b6565b611c3a5760405162461bcd60e51b8152600401610abe906133ba565b611281838383612480565b655af3107a4000341015611c6b5760405162461bcd60e51b8152600401610abe906132cb565b611c7481611401565b611c905760405162461bcd60e51b8152600401610abe90613302565b6000611c9a611ec5565b9050611ca66028611f26565b601403610ede57611cb7600f611f26565b611cc290600161341c565b9050610cff3382611fa5565b6001600160a01b038516611d555760005b8351811015611d5357828181518110611cfa57611cfa613375565b602002602001015160036000868481518110611d1857611d18613375565b602002602001015181526020019081526020016000206000828254611d3d919061341c565b90915550611d4c9050816133a1565b9050611cdf565b505b6001600160a01b038416610f0f5760005b8351811015611e47576000848281518110611d8357611d83613375565b602002602001015190506000848381518110611da157611da1613375565b6020026020010151905060006003600084815260200190815260200160002054905081811015611e245760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610abe565b60009283526003602052604090922091039055611e40816133a1565b9050611d66565b50505050505050565b6001600160a01b03163b151590565b6004546001600160a01b031633146112ab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abe565b6002610cff8282613475565b6000806005611ed2611370565b611edc919061354b565b611ee790600f613409565b9050600d543410158015611f045750611f006014611f26565b600a145b15611f2157611f13600f611f26565b611f1e90600161341c565b90505b919050565b600080824233600e54604051602001611f649392919092835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6040516020818303038152906040528051906020012060001c611f87919061355f565b600e80549192506000611f99836133a1565b90915550909392505050565b600954600160a01b900460ff16611ffe5760405162461bcd60e51b815260206004820152601960248201527f46696e27732042656163682042617220697320436c6f736564000000000000006044820152606401610abe565b61200743600a55565b610cff8282600160405180602001604052806000815250612321565b6daaeb6d7670e522a718067333cd4e3b15610b5157604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b491906132ae565b610b5157604051633b79c77360e21b81526001600160a01b0382166004820152602401610abe565b6001600160a01b0385163314806120f857506120f885336109b6565b6121145760405162461bcd60e51b8152600401610abe906133ba565b6121218585858585612598565b5050505050565b6001600160a01b03831661214e5760405162461bcd60e51b8152600401610abe90613573565b805182511461216f5760405162461bcd60e51b8152600401610abe906135b6565b60003390506121928185600086866040518060200160405280600081525061273a565b60005b83518110156122575760008482815181106121b2576121b2613375565b6020026020010151905060008483815181106121d0576121d0613375565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156122205760405162461bcd60e51b8152600401610abe906135fe565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061224f816133a1565b915050612195565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516122a8929190613642565b60405180910390a4604080516020810190915260009052611834565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610cff338383612748565b6001600160a01b0384166123815760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610abe565b33600061238d85612828565b9050600061239a85612828565b90506123ab8360008985858961273a565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906123db90849061341c565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e4783600089898989612873565b6001600160a01b038516331480612457575061245785336109b6565b6124735760405162461bcd60e51b8152600401610abe906133ba565b61212185858585856129ce565b6001600160a01b0383166124a65760405162461bcd60e51b8152600401610abe90613573565b3360006124b284612828565b905060006124bf84612828565b90506124df8387600085856040518060200160405280600081525061273a565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156125205760405162461bcd60e51b8152600401610abe906135fe565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611e47565b81518351146125b95760405162461bcd60e51b8152600401610abe906135b6565b6001600160a01b0384166125df5760405162461bcd60e51b8152600401610abe90613670565b336125ee81878787878761273a565b60005b84518110156126d457600085828151811061260e5761260e613375565b60200260200101519050600085838151811061262c5761262c613375565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561267c5760405162461bcd60e51b8152600401610abe906136b5565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906126b990849061341c565b92505081905550505050806126cd906133a1565b90506125f1565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612724929190613642565b60405180910390a4610f0f818787878787612b06565b610f0f868686868686611cce565b816001600160a01b0316836001600160a01b0316036127bb5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610abe565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061286257612862613375565b602090810291909101015292915050565b6001600160a01b0384163b15610f0f5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906128b790899089908890889088906004016136ff565b6020604051808303816000875af19250505080156128f2575060408051601f3d908101601f191682019092526128ef91810190613744565b60015b61299e576128fe613761565b806308c379a003612937575061291261377d565b8061291d5750612939565b8060405162461bcd60e51b8152600401610abe9190612d74565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610abe565b6001600160e01b0319811663f23a6e6160e01b14611e475760405162461bcd60e51b8152600401610abe90613807565b6001600160a01b0384166129f45760405162461bcd60e51b8152600401610abe90613670565b336000612a0085612828565b90506000612a0d85612828565b9050612a1d83898985858961273a565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015612a5e5760405162461bcd60e51b8152600401610abe906136b5565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612a9b90849061341c565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612afb848a8a8a8a8a612873565b505050505050505050565b6001600160a01b0384163b15610f0f5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612b4a908990899088908890889060040161384f565b6020604051808303816000875af1925050508015612b85575060408051601f3d908101601f19168201909252612b8291810190613744565b60015b612b91576128fe613761565b6001600160e01b0319811663bc197c8160e01b14611e475760405162461bcd60e51b8152600401610abe90613807565b6001600160a01b0381168114610b5157600080fd5b60008060408385031215612be957600080fd5b8235612bf481612bc1565b946020939093013593505050565b6001600160e01b031981168114610b5157600080fd5b600060208284031215612c2a57600080fd5b8135612c3581612c02565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715612c7857612c78612c3c565b6040525050565b600067ffffffffffffffff831115612c9957612c99612c3c565b604051612cb0601f8501601f191660200182612c52565b809150838152848484011115612cc557600080fd5b83836020830137600060208583010152509392505050565b600060208284031215612cef57600080fd5b813567ffffffffffffffff811115612d0657600080fd5b8201601f81018413612d1757600080fd5b612d2684823560208401612c7f565b949350505050565b6000815180845260005b81811015612d5457602081850181015186830182015201612d38565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612c356020830184612d2e565b600060208284031215612d9957600080fd5b5035919050565b8015158114610b5157600080fd5b60008060408385031215612dc157600080fd5b8235612dcc81612da0565b91506020830135612ddc81612da0565b809150509250929050565b600060208284031215612df957600080fd5b8135612c3581612bc1565b600067ffffffffffffffff821115612e1e57612e1e612c3c565b5060051b60200190565b600082601f830112612e3957600080fd5b81356020612e4682612e04565b604051612e538282612c52565b83815260059390931b8501820192828101915086841115612e7357600080fd5b8286015b84811015612e8e5780358352918301918301612e77565b509695505050505050565b600082601f830112612eaa57600080fd5b612c3583833560208501612c7f565b600080600080600060a08688031215612ed157600080fd5b8535612edc81612bc1565b94506020860135612eec81612bc1565b9350604086013567ffffffffffffffff80821115612f0957600080fd5b612f1589838a01612e28565b94506060880135915080821115612f2b57600080fd5b612f3789838a01612e28565b93506080880135915080821115612f4d57600080fd5b50612f5a88828901612e99565b9150509295509295909350565b60008060408385031215612f7a57600080fd5b823567ffffffffffffffff80821115612f9257600080fd5b818501915085601f830112612fa657600080fd5b81356020612fb382612e04565b604051612fc08282612c52565b83815260059390931b8501820192828101915089841115612fe057600080fd5b948201945b83861015613007578535612ff881612bc1565b82529482019490820190612fe5565b9650508601359250508082111561301d57600080fd5b5061302a85828601612e28565b9150509250929050565b600081518084526020808501945080840160005b8381101561306457815187529582019590820190600101613048565b509495945050505050565b602081526000612c356020830184613034565b60008060006060848603121561309757600080fd5b83356130a281612bc1565b9250602084013567ffffffffffffffff808211156130bf57600080fd5b6130cb87838801612e28565b935060408601359150808211156130e157600080fd5b506130ee86828701612e28565b9150509250925092565b60006020828403121561310a57600080fd5b8135612c3581612da0565b6000806040838503121561312857600080fd5b8235612dcc81612bc1565b6000806020838503121561314657600080fd5b823567ffffffffffffffff8082111561315e57600080fd5b818501915085601f83011261317257600080fd5b81358181111561318157600080fd5b8660208260051b850101111561319657600080fd5b60209290920196919550909350505050565b600080604083850312156131bb57600080fd5b82356131c681612bc1565b91506020830135612ddc81612bc1565b600080600080600060a086880312156131ee57600080fd5b85356131f981612bc1565b9450602086013561320981612bc1565b93506040860135925060608601359150608086013567ffffffffffffffff81111561323357600080fd5b612f5a88828901612e99565b60008060006060848603121561325457600080fd5b833561325f81612bc1565b95602085013595506040909401359392505050565b600181811c9082168061328857607f821691505b6020821081036132a857634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156132c057600080fd5b8151612c3581612da0565b6020808252601d908201527f4d7573742073656e64206174206c6561737420302e3030303120657468000000604082015260600190565b60208082526009908201526804e6f742061205649560bc1b604082015260600190565b6020808252601e908201527f696e76616c69642064656c65676174652d7661756c742070616972696e670000604082015260600190565b60006020828403121561336e57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016133b3576133b361338b565b5060010190565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b81810381811115610aea57610aea61338b565b80820180821115610aea57610aea61338b565b601f82111561128157600081815260208120601f850160051c810160208610156134565750805b601f850160051c820191505b81811015610f0f57828155600101613462565b815167ffffffffffffffff81111561348f5761348f612c3c565b6134a38161349d8454613274565b8461342f565b602080601f8311600181146134d857600084156134c05750858301515b600019600386901b1c1916600185901b178555610f0f565b600085815260208120601f198616915b82811015613507578886015182559484019460019091019084016134e8565b50858210156135255787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b60008261355a5761355a613535565b500490565b60008261356e5761356e613535565b500690565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6040815260006136556040830185613034565b82810360208401526136678185613034565b95945050505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061373990830184612d2e565b979650505050505050565b60006020828403121561375657600080fd5b8151612c3581612c02565b600060033d111561377a5760046000803e5060005160e01c5b90565b600060443d101561378b5790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156137bb57505050505090565b82850191508151818111156137d35750505050505090565b843d87010160208285010111156137ed5750505050505090565b6137fc60208286010187612c52565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061387b90830186613034565b828103606084015261388d8186613034565b905082810360808401526138a18185612d2e565b9897505050505050505056fea264697066735822122079da36112144505c365c753e5fa6aabce66dced158ea5e111b396996ed7ea2eb64736f6c634300081100330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f6d657461646174612e6172746c61622e78797a2f30313835326466622d333836372d383331352d396133332d3234656531623461383766382f7b69647d000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103805760003560e01c8063715018a6116101d1578063bd144af611610102578063d8816dc7116100a0578063f242432a1161006f578063f242432a146109e4578063f2fde38b14610a04578063f5298aca14610a24578063f990afb314610a4457600080fd5b8063d8816dc71461093b578063d907227c1461095b578063e50543011461097b578063e985e9c51461099b57600080fd5b8063c8d6054f116100dc578063c8d6054f146108d1578063c8fae30f146108f1578063c9b6b30214610906578063d28ce57f1461092657600080fd5b8063bd144af61461087c578063bd85b03914610884578063c1b3433c146108b157600080fd5b8063983bbca51161016f578063a22cb46511610149578063a22cb46514610812578063a2e9a00114610832578063aa1de1c414610847578063aae279dd1461085c57600080fd5b8063983bbca5146107155780639a2895a2146107e75780639cf5c3f5146107fc57600080fd5b80638a19c8bc116101ab5780638a19c8bc1461077f5780638a3e0f12146107945780638da5cb5b146107b457806395d89b41146107d257600080fd5b8063715018a61461072a578063756af45f1461073f5780637a3c4e1f1461075f57600080fd5b80632eb2c2d6116102b65780634f558e79116102545780636a627842116102235780636a627842146106c25780636b20c454146106d55780636b68a70a146106f55780636c4b40a21461071557600080fd5b80634f558e791461063c5780635a9566c11461066b5780635fdda2521461068157806365f9cfad146106a157600080fd5b80633b6c3816116102905780633b6c3816146105ac57806341f43434146105cc578063431e78fc146105ee5780634e1273f41461060f57600080fd5b80632eb2c2d61461056157806335c4faf2146105815780633804c73d1461059657600080fd5b8063105c8822116103235780631ebc4499116102fd5780631ebc4499146104f757806326d8b26e1461050c578063291d3baf1461051f5780632b5858211461054057600080fd5b8063105c8822146104a1578063162664cb146104c15780631be05289146104e157600080fd5b80630681dcbd1161035f5780630681dcbd1461040a57806306fdde03146104425780630884a825146104645780630e89341c1461048157600080fd5b8062fdd58e1461038557806301ffc9a7146103b857806302fe5305146103e8575b600080fd5b34801561039157600080fd5b506103a56103a0366004612bd6565b610a57565b6040519081526020015b60405180910390f35b3480156103c457600080fd5b506103d86103d3366004612c18565b610af0565b60405190151581526020016103af565b3480156103f457600080fd5b50610408610403366004612cdd565b610b40565b005b34801561041657600080fd5b5060085461042a906001600160a01b031681565b6040516001600160a01b0390911681526020016103af565b34801561044e57600080fd5b50610457610b54565b6040516103af9190612d74565b34801561047057600080fd5b506103a56803bd913e6c1df4000081565b34801561048d57600080fd5b5061045761049c366004612d87565b610be2565b3480156104ad57600080fd5b506104086104bc366004612dae565b610c76565b3480156104cd57600080fd5b506104086104dc366004612de7565b610d03565b3480156104ed57600080fd5b506103a5600b5481565b34801561050357600080fd5b506103a5601181565b61040861051a366004612de7565b610df6565b34801561052b57600080fd5b506009546103d890600160b81b900460ff1681565b34801561054c57600080fd5b506009546103d890600160a01b900460ff1681565b34801561056d57600080fd5b5061040861057c366004612eb9565b610ee8565b34801561058d57600080fd5b506103a5604581565b3480156105a257600080fd5b506103a5600c5481565b3480156105b857600080fd5b506103d86105c7366004612de7565b610f17565b3480156105d857600080fd5b5061042a6daaeb6d7670e522a718067333cd4e81565b3480156105fa57600080fd5b506009546103d890600160b01b900460ff1681565b34801561061b57600080fd5b5061062f61062a366004612f67565b61104a565b6040516103af919061306f565b34801561064857600080fd5b506103d8610657366004612d87565b600090815260036020526040902054151590565b34801561067757600080fd5b506103a5600d5481565b34801561068d57600080fd5b5060075461042a906001600160a01b031681565b3480156106ad57600080fd5b506009546103d890600160a81b900460ff1681565b6104086106d0366004612de7565b611174565b3480156106e157600080fd5b506104086106f0366004613082565b61123e565b34801561070157600080fd5b50610408610710366004612de7565b611286565b34801561072157600080fd5b506103a5601081565b34801561073657600080fd5b50610408611299565b34801561074b57600080fd5b5061040861075a366004612de7565b6112ad565b34801561076b57600080fd5b5061040861077a3660046130f8565b61134a565b34801561078b57600080fd5b506103a5611370565b3480156107a057600080fd5b5060095461042a906001600160a01b031681565b3480156107c057600080fd5b506004546001600160a01b031661042a565b3480156107de57600080fd5b506104576113e0565b3480156107f357600080fd5b506103a5601a81565b34801561080857600080fd5b506103a5600a5481565b34801561081e57600080fd5b5061040861082d366004613115565b6113ed565b34801561083e57600080fd5b506103a5601381565b34801561085357600080fd5b506103a5600a81565b34801561086857600080fd5b506103d8610877366004612de7565b611401565b6104086114f2565b34801561089057600080fd5b506103a561089f366004612d87565b60009081526003602052604090205490565b3480156108bd57600080fd5b506104086108cc366004612d87565b6115b9565b3480156108dd57600080fd5b506104086108ec366004613133565b6115c6565b3480156108fd57600080fd5b506103a5602881565b34801561091257600080fd5b50610408610921366004612de7565b61183a565b34801561093257600080fd5b506103a5601481565b34801561094757600080fd5b50610408610956366004612de7565b61192c565b34801561096757600080fd5b506103d8610976366004612de7565b611956565b34801561098757600080fd5b506104086109963660046130f8565b611b3f565b3480156109a757600080fd5b506103d86109b63660046131a8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156109f057600080fd5b506104086109ff3660046131d6565b611b65565b348015610a1057600080fd5b50610408610a1f366004612de7565b611b8c565b348015610a3057600080fd5b50610408610a3f36600461323f565b611c02565b610408610a52366004612de7565b611c45565b60006001600160a01b038316610ac75760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610b2157506001600160e01b031982166303a24d0760e21b145b80610aea57506301ffc9a760e01b6001600160e01b0319831614610aea565b610b48611e5f565b610b5181611eb9565b50565b60058054610b6190613274565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d90613274565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b505050505081565b606060028054610bf190613274565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1d90613274565b8015610c6a5780601f10610c3f57610100808354040283529160200191610c6a565b820191906000526020600020905b815481529060010190602001808311610c4d57829003601f168201915b50505050509050919050565b610c7e611e5f565b600c5415610cce5760405162461bcd60e51b815260206004820152601e60248201527f546865206261722063616e6e6f74206265206f70656e656420616761696e00006044820152606401610abe565b6009805460ff60a01b1916600160a01b841515021790558015610cf05743600c555b8115610cff57610cff43600a55565b5050565b610d0b611e5f565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038216906301ffc9a7906024016020604051808303816000875af1158015610d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7c91906132ae565b610dd45760405162461bcd60e51b8152602060048201526024808201527f446f6573206e6f7420737570706f727420494552433131353520696e7465726660448201526330b1b29760e11b6064820152608401610abe565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b655af3107a4000341015610e1c5760405162461bcd60e51b8152600401610abe906132cb565b600954600160b01b900460ff1615610e7857610e3781611956565b610e785760405162461bcd60e51b81526020600482015260126024820152712737ba1030902334b713b9902437b63232b960711b6044820152606401610abe565b600954600160a81b900460ff1615610eaf57610e9381611401565b610eaf5760405162461bcd60e51b8152600401610abe90613302565b6000610eb9611ec5565b9050610ec482610f17565b15610ede57610ed36010611f26565b600503610ede575060105b610cff3382611fa5565b846001600160a01b0381163314610f0257610f0233612023565b610f0f86868686866120dc565b505050505050565b6000336001600160a01b03831615610fd05760095460085460405163090c9a2d60e41b81523360048201526001600160a01b038681166024830152918216604482015260009291909116906390c9a2d090606401602060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fac91906132ae565b905080610fcb5760405162461bcd60e51b8152600401610abe90613325565b839150505b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b6020604051808303816000875af115801561101e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611042919061335c565b119392505050565b606081518351146110af5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610abe565b6000835167ffffffffffffffff8111156110cb576110cb612c3c565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b50905060005b845181101561116c5761113f85828151811061111857611118613375565b602002602001015185838151811061113257611132613375565b6020026020010151610a57565b82828151811061115157611151613375565b6020908102919091010152611165816133a1565b90506110fa565b509392505050565b655af3107a400034101561119a5760405162461bcd60e51b8152600401610abe906132cb565b600954600160b01b900460ff16156111f6576111b581611956565b6111f65760405162461bcd60e51b81526020600482015260126024820152712737ba1030902334b713b9902437b63232b960711b6044820152606401610abe565b600954600160a81b900460ff161561122d5761121181611401565b61122d5760405162461bcd60e51b8152600401610abe90613302565b610b5133611239611ec5565b611fa5565b6001600160a01b03831633148061125a575061125a83336109b6565b6112765760405162461bcd60e51b8152600401610abe906133ba565b611281838383612128565b505050565b61128e611e5f565b610b51816011611fa5565b6112a1611e5f565b6112ab60006122c4565b565b6112b5611e5f565b6000816001600160a01b03164760405160006040518083038185875af1925050503d8060008114611302576040519150601f19603f3d011682016040523d82523d6000602084013e611307565b606091505b5050905080610cff5760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b6044820152606401610abe565b611352611e5f565b60098054911515600160b01b0260ff60b01b19909216919091179055565b600080600a54436113819190613409565b905080600b54116113cc5760405162461bcd60e51b8152602060048201526015602482015274151a19481d1a5b595c881a185cc8195e1c1a5c9959605a1b6044820152606401610abe565b80600b546113da9190613409565b91505090565b60068054610b6190613274565b816113f781612023565b6112818383612316565b6000336001600160a01b038316156114ba5760095460075460405163090c9a2d60e41b81523360048201526001600160a01b038681166024830152918216604482015260009291909116906390c9a2d090606401602060405180830381865afa158015611472573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149691906132ae565b9050806114b55760405162461bcd60e51b8152600401610abe90613325565b839150505b600754604051627eeac760e11b81526001600160a01b038381166004830152600a6024830152600092169062fdd58e90604401610fff565b6803bd913e6c1df4000034101561154b5760405162461bcd60e51b815260206004820152601960248201527f4d7573742073656e64206174206c6561737420363920455448000000000000006044820152606401610abe565b600954600160b81b900460ff161561159b5760405162461bcd60e51b81526020600482015260136024820152724e6f2052656d61696e696e6720537570706c7960681b6044820152606401610abe565b6009805460ff60b81b1916600160b81b1790556112ab336012611fa5565b6115c1611e5f565b600d55565b600f81146116165760405162461bcd60e51b815260206004820181905260248201527f57726f6e67206e756d626572206f6620746f6b656e73207375626d69747465646044820152606401610abe565b60408051601380825261028082019092526000916020820161026080368337505060408051600f80825261020082019092529293506000929150602082016101e08036833701905050905060005b600e81116117d757600185858381811061168057611680613375565b90506020020135101580156116ae575060128585838181106116a4576116a4613375565b9050602002013511155b6116ef5760405162461bcd60e51b8152602060048201526012602482015271546f6b656e206e6f7420656c696769626c6560701b6044820152606401610abe565b8285858381811061170257611702613375565b905060200201358151811061171957611719613375565b60200260200101516000146117705760405162461bcd60e51b815260206004820152601960248201527f4561636820746f6b656e206d75737420626520756e69717565000000000000006044820152606401610abe565b60018386868481811061178557611785613375565b905060200201358151811061179c5761179c613375565b60200260200101818152505060018282815181106117bc576117bc613375565b60209081029190910101526117d0816133a1565b9050611664565b5061181733858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250612128915050565b611834336013600160405180602001604052806000815250612321565b50505050565b611842611e5f565b6040516301ffc9a760e01b815263780e9d6360e01b60048201526001600160a01b038216906301ffc9a7906024016020604051808303816000875af115801561188f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b391906132ae565b61190a5760405162461bcd60e51b815260206004820152602260248201527f446f6573206e6f7420737570706f7274204945524337323120696e7465726661604482015261636560f01b6064820152608401610abe565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b611934611e5f565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000336001600160a01b03831615611a0f5760095460075460405163090c9a2d60e41b81523360048201526001600160a01b038681166024830152918216604482015260009291909116906390c9a2d090606401602060405180830381865afa1580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119eb91906132ae565b905080611a0a5760405162461bcd60e51b8152600401610abe90613325565b839150505b600754604051627eeac760e11b81526001600160a01b03838116600483015260456024830152600092169062fdd58e906044016020604051808303816000875af1158015611a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a85919061335c565b1115611a945750600192915050565b60005b601a8111611b3557600754604051627eeac760e11b81526001600160a01b03848116600483015260248201849052600092169062fdd58e906044016020604051808303816000875af1158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b15919061335c565b1115611b25575060019392505050565b611b2e816133a1565b9050611a97565b5060009392505050565b611b47611e5f565b60098054911515600160a81b0260ff60a81b19909216919091179055565b846001600160a01b0381163314611b7f57611b7f33612023565b610f0f868686868661243b565b611b94611e5f565b6001600160a01b038116611bf95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abe565b610b51816122c4565b6001600160a01b038316331480611c1e5750611c1e83336109b6565b611c3a5760405162461bcd60e51b8152600401610abe906133ba565b611281838383612480565b655af3107a4000341015611c6b5760405162461bcd60e51b8152600401610abe906132cb565b611c7481611401565b611c905760405162461bcd60e51b8152600401610abe90613302565b6000611c9a611ec5565b9050611ca66028611f26565b601403610ede57611cb7600f611f26565b611cc290600161341c565b9050610cff3382611fa5565b6001600160a01b038516611d555760005b8351811015611d5357828181518110611cfa57611cfa613375565b602002602001015160036000868481518110611d1857611d18613375565b602002602001015181526020019081526020016000206000828254611d3d919061341c565b90915550611d4c9050816133a1565b9050611cdf565b505b6001600160a01b038416610f0f5760005b8351811015611e47576000848281518110611d8357611d83613375565b602002602001015190506000848381518110611da157611da1613375565b6020026020010151905060006003600084815260200190815260200160002054905081811015611e245760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610abe565b60009283526003602052604090922091039055611e40816133a1565b9050611d66565b50505050505050565b6001600160a01b03163b151590565b6004546001600160a01b031633146112ab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abe565b6002610cff8282613475565b6000806005611ed2611370565b611edc919061354b565b611ee790600f613409565b9050600d543410158015611f045750611f006014611f26565b600a145b15611f2157611f13600f611f26565b611f1e90600161341c565b90505b919050565b600080824233600e54604051602001611f649392919092835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6040516020818303038152906040528051906020012060001c611f87919061355f565b600e80549192506000611f99836133a1565b90915550909392505050565b600954600160a01b900460ff16611ffe5760405162461bcd60e51b815260206004820152601960248201527f46696e27732042656163682042617220697320436c6f736564000000000000006044820152606401610abe565b61200743600a55565b610cff8282600160405180602001604052806000815250612321565b6daaeb6d7670e522a718067333cd4e3b15610b5157604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b491906132ae565b610b5157604051633b79c77360e21b81526001600160a01b0382166004820152602401610abe565b6001600160a01b0385163314806120f857506120f885336109b6565b6121145760405162461bcd60e51b8152600401610abe906133ba565b6121218585858585612598565b5050505050565b6001600160a01b03831661214e5760405162461bcd60e51b8152600401610abe90613573565b805182511461216f5760405162461bcd60e51b8152600401610abe906135b6565b60003390506121928185600086866040518060200160405280600081525061273a565b60005b83518110156122575760008482815181106121b2576121b2613375565b6020026020010151905060008483815181106121d0576121d0613375565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156122205760405162461bcd60e51b8152600401610abe906135fe565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061224f816133a1565b915050612195565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516122a8929190613642565b60405180910390a4604080516020810190915260009052611834565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610cff338383612748565b6001600160a01b0384166123815760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610abe565b33600061238d85612828565b9050600061239a85612828565b90506123ab8360008985858961273a565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906123db90849061341c565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e4783600089898989612873565b6001600160a01b038516331480612457575061245785336109b6565b6124735760405162461bcd60e51b8152600401610abe906133ba565b61212185858585856129ce565b6001600160a01b0383166124a65760405162461bcd60e51b8152600401610abe90613573565b3360006124b284612828565b905060006124bf84612828565b90506124df8387600085856040518060200160405280600081525061273a565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156125205760405162461bcd60e51b8152600401610abe906135fe565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611e47565b81518351146125b95760405162461bcd60e51b8152600401610abe906135b6565b6001600160a01b0384166125df5760405162461bcd60e51b8152600401610abe90613670565b336125ee81878787878761273a565b60005b84518110156126d457600085828151811061260e5761260e613375565b60200260200101519050600085838151811061262c5761262c613375565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561267c5760405162461bcd60e51b8152600401610abe906136b5565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906126b990849061341c565b92505081905550505050806126cd906133a1565b90506125f1565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612724929190613642565b60405180910390a4610f0f818787878787612b06565b610f0f868686868686611cce565b816001600160a01b0316836001600160a01b0316036127bb5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610abe565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061286257612862613375565b602090810291909101015292915050565b6001600160a01b0384163b15610f0f5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906128b790899089908890889088906004016136ff565b6020604051808303816000875af19250505080156128f2575060408051601f3d908101601f191682019092526128ef91810190613744565b60015b61299e576128fe613761565b806308c379a003612937575061291261377d565b8061291d5750612939565b8060405162461bcd60e51b8152600401610abe9190612d74565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610abe565b6001600160e01b0319811663f23a6e6160e01b14611e475760405162461bcd60e51b8152600401610abe90613807565b6001600160a01b0384166129f45760405162461bcd60e51b8152600401610abe90613670565b336000612a0085612828565b90506000612a0d85612828565b9050612a1d83898985858961273a565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015612a5e5760405162461bcd60e51b8152600401610abe906136b5565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612a9b90849061341c565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612afb848a8a8a8a8a612873565b505050505050505050565b6001600160a01b0384163b15610f0f5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612b4a908990899088908890889060040161384f565b6020604051808303816000875af1925050508015612b85575060408051601f3d908101601f19168201909252612b8291810190613744565b60015b612b91576128fe613761565b6001600160e01b0319811663bc197c8160e01b14611e475760405162461bcd60e51b8152600401610abe90613807565b6001600160a01b0381168114610b5157600080fd5b60008060408385031215612be957600080fd5b8235612bf481612bc1565b946020939093013593505050565b6001600160e01b031981168114610b5157600080fd5b600060208284031215612c2a57600080fd5b8135612c3581612c02565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715612c7857612c78612c3c565b6040525050565b600067ffffffffffffffff831115612c9957612c99612c3c565b604051612cb0601f8501601f191660200182612c52565b809150838152848484011115612cc557600080fd5b83836020830137600060208583010152509392505050565b600060208284031215612cef57600080fd5b813567ffffffffffffffff811115612d0657600080fd5b8201601f81018413612d1757600080fd5b612d2684823560208401612c7f565b949350505050565b6000815180845260005b81811015612d5457602081850181015186830182015201612d38565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612c356020830184612d2e565b600060208284031215612d9957600080fd5b5035919050565b8015158114610b5157600080fd5b60008060408385031215612dc157600080fd5b8235612dcc81612da0565b91506020830135612ddc81612da0565b809150509250929050565b600060208284031215612df957600080fd5b8135612c3581612bc1565b600067ffffffffffffffff821115612e1e57612e1e612c3c565b5060051b60200190565b600082601f830112612e3957600080fd5b81356020612e4682612e04565b604051612e538282612c52565b83815260059390931b8501820192828101915086841115612e7357600080fd5b8286015b84811015612e8e5780358352918301918301612e77565b509695505050505050565b600082601f830112612eaa57600080fd5b612c3583833560208501612c7f565b600080600080600060a08688031215612ed157600080fd5b8535612edc81612bc1565b94506020860135612eec81612bc1565b9350604086013567ffffffffffffffff80821115612f0957600080fd5b612f1589838a01612e28565b94506060880135915080821115612f2b57600080fd5b612f3789838a01612e28565b93506080880135915080821115612f4d57600080fd5b50612f5a88828901612e99565b9150509295509295909350565b60008060408385031215612f7a57600080fd5b823567ffffffffffffffff80821115612f9257600080fd5b818501915085601f830112612fa657600080fd5b81356020612fb382612e04565b604051612fc08282612c52565b83815260059390931b8501820192828101915089841115612fe057600080fd5b948201945b83861015613007578535612ff881612bc1565b82529482019490820190612fe5565b9650508601359250508082111561301d57600080fd5b5061302a85828601612e28565b9150509250929050565b600081518084526020808501945080840160005b8381101561306457815187529582019590820190600101613048565b509495945050505050565b602081526000612c356020830184613034565b60008060006060848603121561309757600080fd5b83356130a281612bc1565b9250602084013567ffffffffffffffff808211156130bf57600080fd5b6130cb87838801612e28565b935060408601359150808211156130e157600080fd5b506130ee86828701612e28565b9150509250925092565b60006020828403121561310a57600080fd5b8135612c3581612da0565b6000806040838503121561312857600080fd5b8235612dcc81612bc1565b6000806020838503121561314657600080fd5b823567ffffffffffffffff8082111561315e57600080fd5b818501915085601f83011261317257600080fd5b81358181111561318157600080fd5b8660208260051b850101111561319657600080fd5b60209290920196919550909350505050565b600080604083850312156131bb57600080fd5b82356131c681612bc1565b91506020830135612ddc81612bc1565b600080600080600060a086880312156131ee57600080fd5b85356131f981612bc1565b9450602086013561320981612bc1565b93506040860135925060608601359150608086013567ffffffffffffffff81111561323357600080fd5b612f5a88828901612e99565b60008060006060848603121561325457600080fd5b833561325f81612bc1565b95602085013595506040909401359392505050565b600181811c9082168061328857607f821691505b6020821081036132a857634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156132c057600080fd5b8151612c3581612da0565b6020808252601d908201527f4d7573742073656e64206174206c6561737420302e3030303120657468000000604082015260600190565b60208082526009908201526804e6f742061205649560bc1b604082015260600190565b6020808252601e908201527f696e76616c69642064656c65676174652d7661756c742070616972696e670000604082015260600190565b60006020828403121561336e57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016133b3576133b361338b565b5060010190565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b81810381811115610aea57610aea61338b565b80820180821115610aea57610aea61338b565b601f82111561128157600081815260208120601f850160051c810160208610156134565750805b601f850160051c820191505b81811015610f0f57828155600101613462565b815167ffffffffffffffff81111561348f5761348f612c3c565b6134a38161349d8454613274565b8461342f565b602080601f8311600181146134d857600084156134c05750858301515b600019600386901b1c1916600185901b178555610f0f565b600085815260208120601f198616915b82811015613507578886015182559484019460019091019084016134e8565b50858210156135255787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b60008261355a5761355a613535565b500490565b60008261356e5761356e613535565b500690565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6040815260006136556040830185613034565b82810360208401526136678185613034565b95945050505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061373990830184612d2e565b979650505050505050565b60006020828403121561375657600080fd5b8151612c3581612c02565b600060033d111561377a5760046000803e5060005160e01c5b90565b600060443d101561378b5790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156137bb57505050505090565b82850191508151818111156137d35750505050505090565b843d87010160208285010111156137ed5750505050505090565b6137fc60208286010187612c52565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061387b90830186613034565b828103606084015261388d8186613034565b905082810360808401526138a18185612d2e565b9897505050505050505056fea264697066735822122079da36112144505c365c753e5fa6aabce66dced158ea5e111b396996ed7ea2eb64736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f6d657461646174612e6172746c61622e78797a2f30313835326466622d333836372d383331352d396133332d3234656531623461383766382f7b69647d000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): https://metadata.artlab.xyz/01852dfb-3867-8315-9a33-24ee1b4a87f8/{id}

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000045
Arg [2] : 68747470733a2f2f6d657461646174612e6172746c61622e78797a2f30313835
Arg [3] : 326466622d333836372d383331352d396133332d323465653162346138376638
Arg [4] : 2f7b69647d000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55769:12609:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33862:230;;;;;;;;;;-1:-1:-1;33862:230:0;;;;;:::i;:::-;;:::i;:::-;;;616:25:1;;;604:2;589:18;33862:230:0;;;;;;;;32885:310;;;;;;;;;;-1:-1:-1;32885:310:0;;;;;:::i;:::-;;:::i;:::-;;;1203:14:1;;1196:22;1178:41;;1166:2;1151:18;32885:310:0;1038:187:1;58304:91:0;;;;;;;;;;-1:-1:-1;58304:91:0;;;;;:::i;:::-;;:::i;:::-;;57065:37;;;;;;;;;;-1:-1:-1;57065:37:0;;;;-1:-1:-1;;;;;57065:37:0;;;;;;-1:-1:-1;;;;;2710:32:1;;;2692:51;;2680:2;2665:18;57065:37:0;2546:203:1;55877:32:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;56816:49::-;;;;;;;;;;;;56857:8;56816:49;;33606:105;;;;;;;;;;-1:-1:-1;33606:105:0;;;;;:::i;:::-;;:::i;59667:416::-;;;;;;;;;;-1:-1:-1;59667:416:0;;;;;:::i;:::-;;:::i;58582:370::-;;;;;;;;;;-1:-1:-1;58582:370:0;;;;;:::i;:::-;;:::i;57665:28::-;;;;;;;;;;;;;;;;56327:34;;;;;;;;;;;;56359:2;56327:34;;63741:638;;;;;;:::i;:::-;;:::i;57450:25::-;;;;;;;;;;-1:-1:-1;57450:25:0;;;;-1:-1:-1;;;57450:25:0;;;;;;57223:21;;;;;;;;;;-1:-1:-1;57223:21:0;;;;-1:-1:-1;;;57223:21:0;;;;;;67736:302;;;;;;;;;;-1:-1:-1;67736:302:0;;;;;:::i;:::-;;:::i;56166:60::-;;;;;;;;;;;;56224:2;56166:60;;57703:33;;;;;;;;;;;;;;;;61692:505;;;;;;;;;;-1:-1:-1;61692:505:0;;;;;:::i;:::-;;:::i;10456:143::-;;;;;;;;;;;;10556:42;10456:143;;57380:20;;;;;;;;;;-1:-1:-1;57380:20:0;;;;-1:-1:-1;;;57380:20:0;;;;;;34258:524;;;;;;;;;;-1:-1:-1;34258:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51487:122::-;;;;;;;;;;-1:-1:-1;51487:122:0;;;;;:::i;:::-;51544:4;51365:16;;;:12;:16;;;;;;-1:-1:-1;;;51487:122:0;57745:39;;;;;;;;;;;;;;;;56960:34;;;;;;;;;;-1:-1:-1;56960:34:0;;;;-1:-1:-1;;;;;56960:34:0;;;57304:19;;;;;;;;;;-1:-1:-1;57304:19:0;;;;-1:-1:-1;;;57304:19:0;;;;;;64387:420;;;;;;:::i;:::-;;:::i;50170:359::-;;;;;;;;;;-1:-1:-1;50170:359:0;;;;;:::i;:::-;;:::i;62719:102::-;;;;;;;;;;-1:-1:-1;62719:102:0;;;;;:::i;:::-;;:::i;56252:41::-;;;;;;;;;;;;56291:2;56252:41;;54505:103;;;;;;;;;;;;;:::i;67083:201::-;;;;;;;;;;-1:-1:-1;67083:201:0;;;;;:::i;:::-;;:::i;59555:104::-;;;;;;;;;;-1:-1:-1;59555:104:0;;;;;:::i;:::-;;:::i;65465:290::-;;;;;;;;;;;;;:::i;57147:40::-;;;;;;;;;;-1:-1:-1;57147:40:0;;;;-1:-1:-1;;;;;57147:40:0;;;53857:87;;;;;;;;;;-1:-1:-1;53930:6:0;;-1:-1:-1;;;;;53930:6:0;53857:87;;55916:29;;;;;;;;;;;;;:::i;55952:53::-;;;;;;;;;;;;56003:2;55952:53;;57541:43;;;;;;;;;;;;;;;;67292:176;;;;;;;;;;-1:-1:-1;67292:176:0;;;;;:::i;:::-;;:::i;56378:48::-;;;;;;;;;;;;56424:2;56378:48;;56080:56;;;;;;;;;;;;56134:2;56080:56;;61093:537;;;;;;;;;;-1:-1:-1;61093:537:0;;;;;:::i;:::-;;:::i;62829:372::-;;;:::i;51276:113::-;;;;;;;;;;-1:-1:-1;51276:113:0;;;;;:::i;:::-;51338:7;51365:16;;;:12;:16;;;;;;;51276:113;58474:100;;;;;;;;;;-1:-1:-1;58474:100:0;;;;;:::i;:::-;;:::i;65763:1242::-;;;;;;;;;;-1:-1:-1;65763:1242:0;;;;;:::i;:::-;;:::i;56602:42::-;;;;;;;;;;;;56642:2;56602:42;;58960:307;;;;;;;;;;-1:-1:-1;58960:307:0;;;;;:::i;:::-;;:::i;56480:49::-;;;;;;;;;;;;56527:2;56480:49;;59275:166;;;;;;;;;;-1:-1:-1;59275:166:0;;;;;:::i;:::-;;:::i;60233:800::-;;;;;;;;;;-1:-1:-1;60233:800:0;;;;;:::i;:::-;;:::i;59449:98::-;;;;;;;;;;-1:-1:-1;59449:98:0;;;;;:::i;:::-;;:::i;35082:168::-;;;;;;;;;;-1:-1:-1;35082:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;35205:27:0;;;35181:4;35205:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;35082:168;67476:252;;;;;;;;;;-1:-1:-1;67476:252:0;;;;;:::i;:::-;;:::i;54763:201::-;;;;;;;;;;-1:-1:-1;54763:201:0;;;;;:::i;:::-;;:::i;49835:327::-;;;;;;;;;;-1:-1:-1;49835:327:0;;;;;:::i;:::-;;:::i;63212:521::-;;;;;;:::i;:::-;;:::i;33862:230::-;33948:7;-1:-1:-1;;;;;33976:21:0;;33968:76;;;;-1:-1:-1;;;33968:76:0;;12764:2:1;33968:76:0;;;12746:21:1;12803:2;12783:18;;;12776:30;12842:34;12822:18;;;12815:62;-1:-1:-1;;;12893:18:1;;;12886:40;12943:19;;33968:76:0;;;;;;;;;-1:-1:-1;34062:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;34062:22:0;;;;;;;;;;33862:230;;;;;:::o;32885:310::-;32987:4;-1:-1:-1;;;;;;33024:41:0;;-1:-1:-1;;;33024:41:0;;:110;;-1:-1:-1;;;;;;;33082:52:0;;-1:-1:-1;;;33082:52:0;33024:110;:163;;;-1:-1:-1;;;;;;;;;;23382:40:0;;;33151:36;23273:157;58304:91;53743:13;:11;:13::i;:::-;58372:15:::1;58380:6;58372:7;:15::i;:::-;58304:91:::0;:::o;55877:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33606:105::-;33666:13;33699:4;33692:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33606:105;;;:::o;59667:416::-;53743:13;:11;:13::i;:::-;59833:14:::1;::::0;:19;59825:62:::1;;;::::0;-1:-1:-1;;;59825:62:0;;13560:2:1;59825:62:0::1;::::0;::::1;13542:21:1::0;13599:2;13579:18;;;13572:30;13638:32;13618:18;;;13611:60;13688:18;;59825:62:0::1;13358:354:1::0;59825:62:0::1;59908:9;:19:::0;;-1:-1:-1;;;;59908:19:0::1;-1:-1:-1::0;;;59908:19:0;::::1;;;;::::0;;59940:71;::::1;;;59987:12;59970:14;:29:::0;59940:71:::1;60027:7;60023:53;;;60051:13;60150:12:::0;60134:13;:28;60091:79;60051:13:::1;59667:416:::0;;:::o;58582:370::-;53743:13;:11;:13::i;:::-;58743:53:::1;::::0;-1:-1:-1;;;58743:53:0;;-1:-1:-1;;;58743:53:0::1;::::0;::::1;13879:62:1::0;-1:-1:-1;;;;;58743:41:0;::::1;::::0;::::1;::::0;13852:18:1;;58743:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58721:139;;;::::0;-1:-1:-1;;;58721:139:0;;14404:2:1;58721:139:0::1;::::0;::::1;14386:21:1::0;14443:2;14423:18;;;14416:30;14482:34;14462:18;;;14455:62;-1:-1:-1;;;14533:18:1;;;14526:34;14577:19;;58721:139:0::1;14202:400:1::0;58721:139:0::1;58914:19;:30:::0;;-1:-1:-1;;;;;;58914:30:0::1;-1:-1:-1::0;;;;;58914:30:0;;;::::1;::::0;;;::::1;::::0;;58582:370::o;63741:638::-;63874:12;63861:9;:25;;63853:67;;;;-1:-1:-1;;;63853:67:0;;;;;;;:::i;:::-;63937:8;;-1:-1:-1;;;63937:8:0;;;;63933:91;;;63969:20;63982:6;63969:12;:20::i;:::-;63961:51;;;;-1:-1:-1;;;63961:51:0;;15167:2:1;63961:51:0;;;15149:21:1;15206:2;15186:18;;;15179:30;-1:-1:-1;;;15225:18:1;;;15218:48;15283:18;;63961:51:0;14965:342:1;63961:51:0;64048:7;;-1:-1:-1;;;64048:7:0;;;;64044:78;;;64079:17;64089:6;64079:9;:17::i;:::-;64071:39;;;;-1:-1:-1;;;64071:39:0;;;;;;;:::i;:::-;64134:16;64153:11;:9;:11::i;:::-;64134:30;;64181:19;64193:6;64181:11;:19::i;:::-;64177:150;;;64220:32;56743:2;64220:12;:32::i;:::-;64256:1;64220:37;64216:100;;-1:-1:-1;56291:2:0;64216:100;64339:32;64350:10;64362:8;64339:10;:32::i;67736:302::-;67956:4;-1:-1:-1;;;;;11797:18:0;;11805:10;11797:18;11793:83;;11832:32;11853:10;11832:20;:32::i;:::-;67973:57:::1;68001:4;68007:2;68011:3;68016:7;68025:4;67973:27;:57::i;:::-;67736:302:::0;;;;;;:::o;61692:505::-;61745:4;61786:10;-1:-1:-1;;;;;61813:20:0;;;61809:300;;61894:25;;61966:22;;61874:115;;-1:-1:-1;;;61874:115:0;;61946:10;61874:115;;;15889:34:1;-1:-1:-1;;;;;15959:15:1;;;15939:18;;;15932:43;61966:22:0;;;15991:18:1;;;15984:43;61851:20:0;;61894:25;;;;;61874:71;;15824:18:1;;61874:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61851:138;;62012:15;62004:58;;;;-1:-1:-1;;;62004:58:0;;;;;;;:::i;:::-;62091:6;62077:20;;61835:274;61809:300;62139:22;;62128:57;;-1:-1:-1;;;62128:57:0;;-1:-1:-1;;;;;2710:32:1;;;62128:57:0;;;2692:51:1;62188:1:0;;62139:22;;62128:44;;2665:18:1;;62128:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;61692:505;-1:-1:-1;;;61692:505:0:o;34258:524::-;34414:16;34475:3;:10;34456:8;:15;:29;34448:83;;;;-1:-1:-1;;;34448:83:0;;16788:2:1;34448:83:0;;;16770:21:1;16827:2;16807:18;;;16800:30;16866:34;16846:18;;;16839:62;-1:-1:-1;;;16917:18:1;;;16910:39;16966:19;;34448:83:0;16586:405:1;34448:83:0;34544:30;34591:8;:15;34577:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34577:30:0;;34544:63;;34625:9;34620:122;34644:8;:15;34640:1;:19;34620:122;;;34700:30;34710:8;34719:1;34710:11;;;;;;;;:::i;:::-;;;;;;;34723:3;34727:1;34723:6;;;;;;;;:::i;:::-;;;;;;;34700:9;:30::i;:::-;34681:13;34695:1;34681:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;34661:3;;;:::i;:::-;;;34620:122;;;-1:-1:-1;34761:13:0;34258:524;-1:-1:-1;;;34258:524:0:o;64387:420::-;64512:12;64499:9;:25;;64491:67;;;;-1:-1:-1;;;64491:67:0;;;;;;;:::i;:::-;64575:8;;-1:-1:-1;;;64575:8:0;;;;64571:91;;;64607:20;64620:6;64607:12;:20::i;:::-;64599:51;;;;-1:-1:-1;;;64599:51:0;;15167:2:1;64599:51:0;;;15149:21:1;15206:2;15186:18;;;15179:30;-1:-1:-1;;;15225:18:1;;;15218:48;15283:18;;64599:51:0;14965:342:1;64599:51:0;64678:7;;-1:-1:-1;;;64678:7:0;;;;64674:78;;;64709:17;64719:6;64709:9;:17::i;:::-;64701:39;;;;-1:-1:-1;;;64701:39:0;;;;;;;:::i;:::-;64764:35;64775:10;64787:11;:9;:11::i;:::-;64764:10;:35::i;50170:359::-;-1:-1:-1;;;;;50335:23:0;;31659:10;50335:23;;:66;;-1:-1:-1;50362:39:0;50379:7;31659:10;35082:168;:::i;50362:39::-;50313:163;;;;-1:-1:-1;;;50313:163:0;;;;;;;:::i;:::-;50489:32;50500:7;50509:3;50514:6;50489:10;:32::i;:::-;50170:359;;;:::o;62719:102::-;53743:13;:11;:13::i;:::-;62784:29:::1;62795:10;56359:2;62784:10;:29::i;54505:103::-:0;53743:13;:11;:13::i;:::-;54570:30:::1;54597:1;54570:18;:30::i;:::-;54505:103::o:0;67083:201::-;53743:13;:11;:13::i;:::-;67165:12:::1;67183:8;-1:-1:-1::0;;;;;67183:13:0::1;67204:21;67183:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67164:66;;;67249:7;67241:35;;;::::0;-1:-1:-1;;;67241:35:0;;18228:2:1;67241:35:0::1;::::0;::::1;18210:21:1::0;18267:2;18247:18;;;18240:30;-1:-1:-1;;;18286:18:1;;;18279:45;18341:18;;67241:35:0::1;18026:339:1::0;59555:104:0;53743:13;:11;:13::i;:::-;59632:8:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;59632:19:0::1;-1:-1:-1::0;;;;59632:19:0;;::::1;::::0;;;::::1;::::0;;59555:104::o;65465:290::-;65510:7;65598:15;65631:13;;65616:12;:28;;;;:::i;:::-;65598:46;;65676:7;65665:8;;:18;65657:52;;;;-1:-1:-1;;;65657:52:0;;18705:2:1;65657:52:0;;;18687:21:1;18744:2;18724:18;;;18717:30;-1:-1:-1;;;18763:18:1;;;18756:51;18824:18;;65657:52:0;18503:345:1;65657:52:0;65740:7;65729:8;;:18;;;;:::i;:::-;65722:25;;;65465:290;:::o;55916:29::-;;;;;;;:::i;67292:176::-;67396:8;11977:30;11998:8;11977:20;:30::i;:::-;67417:43:::1;67441:8;67451;67417:23;:43::i;61093:537::-:0;61144:4;61193:10;-1:-1:-1;;;;;61220:20:0;;;61216:297;;61301:25;;61373:19;;61281:112;;-1:-1:-1;;;61281:112:0;;61353:10;61281:112;;;15889:34:1;-1:-1:-1;;;;;15959:15:1;;;15939:18;;;15932:43;61373:19:0;;;15991:18:1;;;15984:43;61258:20:0;;61301:25;;;;;61281:71;;15824:18:1;;61281:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61258:135;;61416:15;61408:58;;;;-1:-1:-1;;;61408:58:0;;;;;;;:::i;:::-;61495:6;61481:20;;61242:271;61216:297;61546:19;;61532:86;;-1:-1:-1;;;61532:86:0;;-1:-1:-1;;;;;19045:32:1;;;61532:86:0;;;19027:51:1;56134:2:0;19094:18:1;;;19087:34;61621:1:0;;61546:19;;61532:44;;19000:18:1;;61532:86:0;18853:274:1;62829:372:0;56857:8;62888:9;:27;;62880:65;;;;-1:-1:-1;;;62880:65:0;;19334:2:1;62880:65:0;;;19316:21:1;19373:2;19353:18;;;19346:30;19412:27;19392:18;;;19385:55;19457:18;;62880:65:0;19132:349:1;62880:65:0;62965:13;;-1:-1:-1;;;62965:13:0;;;;62964:14;62956:46;;;;-1:-1:-1;;;62956:46:0;;19688:2:1;62956:46:0;;;19670:21:1;19727:2;19707:18;;;19700:30;-1:-1:-1;;;19746:18:1;;;19739:49;19805:18;;62956:46:0;19486:343:1;62956:46:0;63084:13;:20;;-1:-1:-1;;;;63084:20:0;-1:-1:-1;;;63084:20:0;;;63167:26;63178:10;63190:2;63167:10;:26::i;58474:100::-;53743:13;:11;:13::i;:::-;58545:11:::1;:21:::0;58474:100::o;65763:1242::-;65940:2;65926:16;;65918:61;;;;-1:-1:-1;;;65918:61:0;;20036:2:1;65918:61:0;;;20018:21:1;;;20055:18;;;20048:30;20114:34;20094:18;;;20087:62;20166:18;;65918:61:0;19834:356:1;65918:61:0;66150:17;;;66164:2;66150:17;;;;;;;;;66124:23;;66150:17;;;;;;;;-1:-1:-1;;66204:17:0;;;66218:2;66204:17;;;;;;;;;66124:43;;-1:-1:-1;66178:23:0;;66204:17;-1:-1:-1;66204:17:0;;;;;;;;;;-1:-1:-1;66204:17:0;66178:43;;66299:9;66294:532;66315:2;66310:1;:7;66294:532;;66416:1;66406:3;;66410:1;66406:6;;;;;;;:::i;:::-;;;;;;;:11;;:27;;;;;66431:2;66421:3;;66425:1;66421:6;;;;;;;:::i;:::-;;;;;;;:12;;66406:27;66398:58;;;;-1:-1:-1;;;66398:58:0;;20397:2:1;66398:58:0;;;20379:21:1;20436:2;20416:18;;;20409:30;-1:-1:-1;;;20455:18:1;;;20448:48;20513:18;;66398:58:0;20195:342:1;66398:58:0;66547:6;66554:3;;66558:1;66554:6;;;;;;;:::i;:::-;;;;;;;66547:14;;;;;;;;:::i;:::-;;;;;;;66565:1;66547:19;66539:57;;;;-1:-1:-1;;;66539:57:0;;20744:2:1;66539:57:0;;;20726:21:1;20783:2;20763:18;;;20756:30;20822:27;20802:18;;;20795:55;20867:18;;66539:57:0;20542:349:1;66539:57:0;66713:1;66696:6;66703:3;;66707:1;66703:6;;;;;;;:::i;:::-;;;;;;;66696:14;;;;;;;;:::i;:::-;;;;;;:18;;;;;66813:1;66801:6;66808:1;66801:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;66319:3;;;:::i;:::-;;;66294:532;;;;66906:35;66917:10;66929:3;;66906:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66934:6:0;;-1:-1:-1;66906:10:0;;-1:-1:-1;;66906:35:0:i;:::-;66952:45;66958:10;56424:2;66991:1;66952:45;;;;;;;;;;;;:5;:45::i;:::-;65818:1187;;65763:1242;;:::o;58960:307::-;53743:13;:11;:13::i;:::-;59060:50:::1;::::0;-1:-1:-1;;;59060:50:0;;-1:-1:-1;;;59060:50:0::1;::::0;::::1;13879:62:1::0;-1:-1:-1;;;;;59060:38:0;::::1;::::0;::::1;::::0;13852:18:1;;59060:50:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59038:134;;;::::0;-1:-1:-1;;;59038:134:0;;21333:2:1;59038:134:0::1;::::0;::::1;21315:21:1::0;21372:2;21352:18;;;21345:30;21411:34;21391:18;;;21384:62;-1:-1:-1;;;21462:18:1;;;21455:32;21504:19;;59038:134:0::1;21131:398:1::0;59038:134:0::1;59226:22;:33:::0;;-1:-1:-1;;;;;;59226:33:0::1;-1:-1:-1::0;;;;;59226:33:0;;;::::1;::::0;;;::::1;::::0;;58960:307::o;59275:166::-;53743:13;:11;:13::i;:::-;59397:25:::1;:36:::0;;-1:-1:-1;;;;;;59397:36:0::1;-1:-1:-1::0;;;;;59397:36:0;;;::::1;::::0;;;::::1;::::0;;59275:166::o;60233:800::-;60287:4;60326:10;-1:-1:-1;;;;;60353:20:0;;;60349:297;;60434:25;;60506:19;;60414:112;;-1:-1:-1;;;60414:112:0;;60486:10;60414:112;;;15889:34:1;-1:-1:-1;;;;;15959:15:1;;;15939:18;;;15932:43;60506:19:0;;;15991:18:1;;;15984:43;60391:20:0;;60434:25;;;;;60414:71;;15824:18:1;;60414:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60391:135;;60549:15;60541:58;;;;-1:-1:-1;;;60541:58:0;;;;;;;:::i;:::-;60628:6;60614:20;;60375:271;60349:297;60676:19;;60662:90;;-1:-1:-1;;;60662:90:0;;-1:-1:-1;;;;;19045:32:1;;;60662:90:0;;;19027:51:1;56224:2:0;19094:18:1;;;19087:34;60755:1:0;;60676:19;;60662:44;;19000:18:1;;60662:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:94;60658:139;;;-1:-1:-1;60781:4:0;;60233:800;-1:-1:-1;;60233:800:0:o;60658:139::-;60814:9;60809:194;56003:2;60825:1;:29;60809:194;;60894:19;;60880:60;;-1:-1:-1;;;60880:60:0;;-1:-1:-1;;;;;19045:32:1;;;60880:60:0;;;19027:51:1;19094:18;;;19087:34;;;60943:1:0;;60894:19;;60880:44;;19000:18:1;;60880:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;60876:116;;;-1:-1:-1;60972:4:0;;60233:800;-1:-1:-1;;;60233:800:0:o;60876:116::-;60856:3;;;:::i;:::-;;;60809:194;;;-1:-1:-1;61020:5:0;;60233:800;-1:-1:-1;;;60233:800:0:o;59449:98::-;53743:13;:11;:13::i;:::-;59521:7:::1;:18:::0;;;::::1;;-1:-1:-1::0;;;59521:18:0::1;-1:-1:-1::0;;;;59521:18:0;;::::1;::::0;;;::::1;::::0;;59449:98::o;67476:252::-;67643:4;-1:-1:-1;;;;;11797:18:0;;11805:10;11797:18;11793:83;;11832:32;11853:10;11832:20;:32::i;:::-;67665:55:::1;67688:4;67694:2;67698:7;67707:6;67715:4;67665:22;:55::i;54763:201::-:0;53743:13;:11;:13::i;:::-;-1:-1:-1;;;;;54852:22:0;::::1;54844:73;;;::::0;-1:-1:-1;;;54844:73:0;;21736:2:1;54844:73:0::1;::::0;::::1;21718:21:1::0;21775:2;21755:18;;;21748:30;21814:34;21794:18;;;21787:62;-1:-1:-1;;;21865:18:1;;;21858:36;21911:19;;54844:73:0::1;21534:402:1::0;54844:73:0::1;54928:28;54947:8;54928:18;:28::i;49835:327::-:0;-1:-1:-1;;;;;49975:23:0;;31659:10;49975:23;;:66;;-1:-1:-1;50002:39:0;50019:7;31659:10;35082:168;:::i;50002:39::-;49953:163;;;;-1:-1:-1;;;49953:163:0;;;;;;;:::i;:::-;50129:25;50135:7;50144:2;50148:5;50129;:25::i;63212:521::-;63342:12;63329:9;:25;;63321:67;;;;-1:-1:-1;;;63321:67:0;;;;;;;:::i;:::-;63409:17;63419:6;63409:9;:17::i;:::-;63401:39;;;;-1:-1:-1;;;63401:39:0;;;;;;;:::i;:::-;63453:16;63472:11;:9;:11::i;:::-;63453:30;;63588:27;56642:2;63588:12;:27::i;:::-;63619:2;63588:33;63584:97;;63649:16;63662:2;63649:12;:16::i;:::-;:20;;63668:1;63649:20;:::i;:::-;63637:32;;63693;63704:10;63716:8;63693:10;:32::i;51684:931::-;-1:-1:-1;;;;;52006:18:0;;52002:160;;52046:9;52041:110;52065:3;:10;52061:1;:14;52041:110;;;52125:7;52133:1;52125:10;;;;;;;;:::i;:::-;;;;;;;52101:12;:20;52114:3;52118:1;52114:6;;;;;;;;:::i;:::-;;;;;;;52101:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;52077:3:0;;-1:-1:-1;52077:3:0;;:::i;:::-;;;52041:110;;;;52002:160;-1:-1:-1;;;;;52178:16:0;;52174:434;;52216:9;52211:386;52235:3;:10;52231:1;:14;52211:386;;;52271:10;52284:3;52288:1;52284:6;;;;;;;;:::i;:::-;;;;;;;52271:19;;52309:14;52326:7;52334:1;52326:10;;;;;;;;:::i;:::-;;;;;;;52309:27;;52355:14;52372:12;:16;52385:2;52372:16;;;;;;;;;;;;52355:33;;52425:6;52415;:16;;52407:69;;;;-1:-1:-1;;;52407:69:0;;22273:2:1;52407:69:0;;;22255:21:1;22312:2;22292:18;;;22285:30;22351:34;22331:18;;;22324:62;-1:-1:-1;;;22402:18:1;;;22395:38;22450:19;;52407:69:0;22071:404:1;52407:69:0;52528:16;;;;:12;:16;;;;;;52547:15;;52528:34;;52247:3;;;:::i;:::-;;;52211:386;;;;51684:931;;;;;;:::o;14171:326::-;-1:-1:-1;;;;;14466:19:0;;:23;;;14171:326::o;54022:132::-;53930:6;;-1:-1:-1;;;;;53930:6:0;31659:10;54086:23;54078:68;;;;-1:-1:-1;;;54078:68:0;;22682:2:1;54078:68:0;;;22664:21:1;;;22701:18;;;22694:30;22760:34;22740:18;;;22733:62;22812:18;;54078:68:0;22480:356:1;40031:88:0;40098:4;:13;40105:6;40098:4;:13;:::i;65115:342::-;65154:7;65174:10;65208:1;65193:14;:12;:14::i;:::-;:16;;;;:::i;:::-;65187:23;;:2;:23;:::i;:::-;65174:36;;65320:11;;65307:9;:24;;:68;;;;;65335:34;56527:2;65335:12;:34::i;:::-;65373:2;65335:40;65307:68;65303:125;;;65396:16;65409:2;65396:12;:16::i;:::-;:20;;65415:1;65396:20;:::i;:::-;65391:25;;65303:125;65447:2;65115:342;-1:-1:-1;65115:342:0:o;62469:242::-;62523:7;62543:25;62646:4;62606:15;62623:10;62635:5;;62589:52;;;;;;;;;25487:19:1;;;25544:2;25540:15;;;;-1:-1:-1;;25536:53:1;25531:2;25522:12;;25515:75;25615:2;25606:12;;25599:28;25652:2;25643:12;;25302:359;62589:52:0;;;;;;;;;;;;;62579:63;;;;;;62571:72;;:79;;;;:::i;:::-;62661:5;:7;;62543:107;;-1:-1:-1;62661:5:0;:7;;;:::i;:::-;;;;-1:-1:-1;62686:17:0;;62469:242;-1:-1:-1;;;62469:242:0:o;64815:292::-;64935:9;;-1:-1:-1;;;64935:9:0;;;;64927:47;;;;-1:-1:-1;;;64927:47:0;;25985:2:1;64927:47:0;;;25967:21:1;26024:2;26004:18;;;25997:30;26063:27;26043:18;;;26036:55;26108:18;;64927:47:0;25783:349:1;64927:47:0;65016:13;60150:12;60134:13;:28;60091:79;65016:13;65070:29;65076:10;65088:3;65093:1;65070:29;;;;;;;;;;;;:5;:29::i;12035:419::-;10556:42;12226:45;:49;12222:225;;12297:67;;-1:-1:-1;;;12297:67:0;;12348:4;12297:67;;;26349:34:1;-1:-1:-1;;;;;26419:15:1;;26399:18;;;26392:43;10556:42:0;;12297;;26284:18:1;;12297:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12292:144;;12392:28;;-1:-1:-1;;;12392:28:0;;-1:-1:-1;;;;;2710:32:1;;12392:28:0;;;2692:51:1;2665:18;;12392:28:0;2546:203:1;35806:439:0;-1:-1:-1;;;;;36039:20:0;;31659:10;36039:20;;:60;;-1:-1:-1;36063:36:0;36080:4;31659:10;35082:168;:::i;36063:36::-;36017:157;;;;-1:-1:-1;;;36017:157:0;;;;;;;:::i;:::-;36185:52;36208:4;36214:2;36218:3;36223:7;36232:4;36185:22;:52::i;:::-;35806:439;;;;;:::o;43806:969::-;-1:-1:-1;;;;;43958:18:0;;43950:66;;;;-1:-1:-1;;;43950:66:0;;;;;;;:::i;:::-;44049:7;:14;44035:3;:10;:28;44027:81;;;;-1:-1:-1;;;44027:81:0;;;;;;;:::i;:::-;44121:16;31659:10;44121:31;;44165:66;44186:8;44196:4;44210:1;44214:3;44219:7;44165:66;;;;;;;;;;;;:20;:66::i;:::-;44249:9;44244:373;44268:3;:10;44264:1;:14;44244:373;;;44300:10;44313:3;44317:1;44313:6;;;;;;;;:::i;:::-;;;;;;;44300:19;;44334:14;44351:7;44359:1;44351:10;;;;;;;;:::i;:::-;;;;;;;;;;;;44378:19;44400:13;;;;;;;;;;-1:-1:-1;;;;;44400:19:0;;;;;;;;;;;;44351:10;;-1:-1:-1;44442:21:0;;;;44434:70;;;;-1:-1:-1;;;44434:70:0;;;;;;;:::i;:::-;44548:9;:13;;;;;;;;;;;-1:-1:-1;;;;;44548:19:0;;;;;;;;;;44570:20;;44548:42;;44280:3;;;;:::i;:::-;;;;44244:373;;;;44672:1;-1:-1:-1;;;;;44634:55:0;44658:4;-1:-1:-1;;;;;44634:55:0;44648:8;-1:-1:-1;;;;;44634:55:0;;44676:3;44681:7;44634:55;;;;;;;:::i;:::-;;;;;;;;44702:65;;;;;;;;;44746:1;44702:65;;;67736:302;55124:191;55217:6;;;-1:-1:-1;;;;;55234:17:0;;;-1:-1:-1;;;;;;55234:17:0;;;;;;;55267:40;;55217:6;;;55234:17;55217:6;;55267:40;;55198:16;;55267:40;55187:128;55124:191;:::o;34855:155::-;34950:52;31659:10;34983:8;34993;34950:18;:52::i;40505:729::-;-1:-1:-1;;;;;40658:16:0;;40650:62;;;;-1:-1:-1;;;40650:62:0;;28336:2:1;40650:62:0;;;28318:21:1;28375:2;28355:18;;;28348:30;28414:34;28394:18;;;28387:62;-1:-1:-1;;;28465:18:1;;;28458:31;28506:19;;40650:62:0;28134:397:1;40650:62:0;31659:10;40725:16;40790:21;40808:2;40790:17;:21::i;:::-;40767:44;;40822:24;40849:25;40867:6;40849:17;:25::i;:::-;40822:52;;40887:66;40908:8;40926:1;40930:2;40934:3;40939:7;40948:4;40887:20;:66::i;:::-;40966:9;:13;;;;;;;;;;;-1:-1:-1;;;;;40966:17:0;;;;;;;;;:27;;40987:6;;40966:9;:27;;40987:6;;40966:27;:::i;:::-;;;;-1:-1:-1;;41009:52:0;;;28710:25:1;;;28766:2;28751:18;;28744:34;;;-1:-1:-1;;;;;41009:52:0;;;;41042:1;;41009:52;;;;;;28683:18:1;41009:52:0;;;;;;;41152:74;41183:8;41201:1;41205:2;41209;41213:6;41221:4;41152:30;:74::i;35322:407::-;-1:-1:-1;;;;;35530:20:0;;31659:10;35530:20;;:60;;-1:-1:-1;35554:36:0;35571:4;31659:10;35082:168;:::i;35554:36::-;35508:157;;;;-1:-1:-1;;;35508:157:0;;;;;;;:::i;:::-;35676:45;35694:4;35700:2;35704;35708:6;35716:4;35676:17;:45::i;42748:808::-;-1:-1:-1;;;;;42875:18:0;;42867:66;;;;-1:-1:-1;;;42867:66:0;;;;;;;:::i;:::-;31659:10;42946:16;43011:21;43029:2;43011:17;:21::i;:::-;42988:44;;43043:24;43070:25;43088:6;43070:17;:25::i;:::-;43043:52;;43108:66;43129:8;43139:4;43153:1;43157:3;43162:7;43108:66;;;;;;;;;;;;:20;:66::i;:::-;43187:19;43209:13;;;;;;;;;;;-1:-1:-1;;;;;43209:19:0;;;;;;;;;;43247:21;;;;43239:70;;;;-1:-1:-1;;;43239:70:0;;;;;;;:::i;:::-;43345:9;:13;;;;;;;;;;;-1:-1:-1;;;;;43345:19:0;;;;;;;;;;;;43367:20;;;43345:42;;43416:54;;28710:25:1;;;28751:18;;;28744:34;;;43345:19:0;;43416:54;;;;;;28683:18:1;43416:54:0;;;;;;;43483:65;;;;;;;;;43527:1;43483:65;;;67736:302;38041:1146;38268:7;:14;38254:3;:10;:28;38246:81;;;;-1:-1:-1;;;38246:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38346:16:0;;38338:66;;;;-1:-1:-1;;;38338:66:0;;;;;;;:::i;:::-;31659:10;38461:60;31659:10;38492:4;38498:2;38502:3;38507:7;38516:4;38461:20;:60::i;:::-;38539:9;38534:421;38558:3;:10;38554:1;:14;38534:421;;;38590:10;38603:3;38607:1;38603:6;;;;;;;;:::i;:::-;;;;;;;38590:19;;38624:14;38641:7;38649:1;38641:10;;;;;;;;:::i;:::-;;;;;;;;;;;;38668:19;38690:13;;;;;;;;;;-1:-1:-1;;;;;38690:19:0;;;;;;;;;;;;38641:10;;-1:-1:-1;38732:21:0;;;;38724:76;;;;-1:-1:-1;;;38724:76:0;;;;;;;:::i;:::-;38844:9;:13;;;;;;;;;;;-1:-1:-1;;;;;38844:19:0;;;;;;;;;;38866:20;;;38844:42;;38916:17;;;;;;;:27;;38866:20;;38844:9;38916:27;;38866:20;;38916:27;:::i;:::-;;;;;;;;38575:380;;;38570:3;;;;:::i;:::-;;;38534:421;;;;39002:2;-1:-1:-1;;;;;38972:47:0;38996:4;-1:-1:-1;;;;;38972:47:0;38986:8;-1:-1:-1;;;;;38972:47:0;;39006:3;39011:7;38972:47;;;;;;;:::i;:::-;;;;;;;;39104:75;39140:8;39150:4;39156:2;39160:3;39165:7;39174:4;39104:35;:75::i;68046:329::-;68301:66;68328:8;68338:4;68344:2;68348:3;68353:7;68362:4;68301:26;:66::i;44918:331::-;45073:8;-1:-1:-1;;;;;45064:17:0;:5;-1:-1:-1;;;;;45064:17:0;;45056:71;;;;-1:-1:-1;;;45056:71:0;;29808:2:1;45056:71:0;;;29790:21:1;29847:2;29827:18;;;29820:30;29886:34;29866:18;;;29859:62;-1:-1:-1;;;29937:18:1;;;29930:39;29986:19;;45056:71:0;29606:405:1;45056:71:0;-1:-1:-1;;;;;45138:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;45138:46:0;;;;;;;;;;45200:41;;1178::1;;;45200::0;;1151:18:1;45200:41:0;;;;;;;44918:331;;;:::o;49184:198::-;49304:16;;;49318:1;49304:16;;;;;;;;;49250;;49279:22;;49304:16;;;;;;;;;;;;-1:-1:-1;49304:16:0;49279:41;;49342:7;49331:5;49337:1;49331:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;49369:5;49184:198;-1:-1:-1;;49184:198:0:o;47611:744::-;-1:-1:-1;;;;;47826:13:0;;14466:19;:23;47822:526;;47862:72;;-1:-1:-1;;;47862:72:0;;-1:-1:-1;;;;;47862:38:0;;;;;:72;;47901:8;;47911:4;;47917:2;;47921:6;;47929:4;;47862:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47862:72:0;;;;;;;;-1:-1:-1;;47862:72:0;;;;;;;;;;;;:::i;:::-;;;47858:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;48210:6;48203:14;;-1:-1:-1;;;48203:14:0;;;;;;;;:::i;47858:479::-;;;48259:62;;-1:-1:-1;;;48259:62:0;;31898:2:1;48259:62:0;;;31880:21:1;31937:2;31917:18;;;31910:30;31976:34;31956:18;;;31949:62;-1:-1:-1;;;32027:18:1;;;32020:50;32087:19;;48259:62:0;31696:416:1;47858:479:0;-1:-1:-1;;;;;;47984:55:0;;-1:-1:-1;;;47984:55:0;47980:154;;48064:50;;-1:-1:-1;;;48064:50:0;;;;;;;:::i;36709:974::-;-1:-1:-1;;;;;36897:16:0;;36889:66;;;;-1:-1:-1;;;36889:66:0;;;;;;;:::i;:::-;31659:10;36968:16;37033:21;37051:2;37033:17;:21::i;:::-;37010:44;;37065:24;37092:25;37110:6;37092:17;:25::i;:::-;37065:52;;37130:60;37151:8;37161:4;37167:2;37171:3;37176:7;37185:4;37130:20;:60::i;:::-;37203:19;37225:13;;;;;;;;;;;-1:-1:-1;;;;;37225:19:0;;;;;;;;;;37263:21;;;;37255:76;;;;-1:-1:-1;;;37255:76:0;;;;;;;:::i;:::-;37367:9;:13;;;;;;;;;;;-1:-1:-1;;;;;37367:19:0;;;;;;;;;;37389:20;;;37367:42;;37431:17;;;;;;;:27;;37389:20;;37367:9;37431:27;;37389:20;;37431:27;:::i;:::-;;;;-1:-1:-1;;37476:46:0;;;28710:25:1;;;28766:2;28751:18;;28744:34;;;-1:-1:-1;;;;;37476:46:0;;;;;;;;;;;;;;28683:18:1;37476:46:0;;;;;;;37607:68;37638:8;37648:4;37654:2;37658;37662:6;37670:4;37607:30;:68::i;:::-;36878:805;;;;36709:974;;;;;:::o;48363:813::-;-1:-1:-1;;;;;48603:13:0;;14466:19;:23;48599:570;;48639:79;;-1:-1:-1;;;48639:79:0;;-1:-1:-1;;;;;48639:43:0;;;;;:79;;48683:8;;48693:4;;48699:3;;48704:7;;48713:4;;48639:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48639:79:0;;;;;;;;-1:-1:-1;;48639:79:0;;;;;;;;;;;;:::i;:::-;;;48635:523;;;;:::i;:::-;-1:-1:-1;;;;;;48800:60:0;;-1:-1:-1;;;48800:60:0;48796:159;;48885:50;;-1:-1:-1;;;48885:50:0;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:1:o;652:131::-;-1:-1:-1;;;;;;726:32:1;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;:::-;1022:5;788:245;-1:-1:-1;;;788:245:1:o;1230:127::-;1291:10;1286:3;1282:20;1279:1;1272:31;1322:4;1319:1;1312:15;1346:4;1343:1;1336:15;1362:249;1472:2;1453:13;;-1:-1:-1;;1449:27:1;1437:40;;1507:18;1492:34;;1528:22;;;1489:62;1486:88;;;1554:18;;:::i;:::-;1590:2;1583:22;-1:-1:-1;;1362:249:1:o;1616:469::-;1681:5;1715:18;1707:6;1704:30;1701:56;;;1737:18;;:::i;:::-;1786:2;1780:9;1798:69;1855:2;1834:15;;-1:-1:-1;;1830:29:1;1861:4;1826:40;1780:9;1798:69;:::i;:::-;1885:6;1876:15;;1915:6;1907;1900:22;1955:3;1946:6;1941:3;1937:16;1934:25;1931:45;;;1972:1;1969;1962:12;1931:45;2022:6;2017:3;2010:4;2002:6;1998:17;1985:44;2077:1;2070:4;2061:6;2053;2049:19;2045:30;2038:41;;1616:469;;;;;:::o;2090:451::-;2159:6;2212:2;2200:9;2191:7;2187:23;2183:32;2180:52;;;2228:1;2225;2218:12;2180:52;2268:9;2255:23;2301:18;2293:6;2290:30;2287:50;;;2333:1;2330;2323:12;2287:50;2356:22;;2409:4;2401:13;;2397:27;-1:-1:-1;2387:55:1;;2438:1;2435;2428:12;2387:55;2461:74;2527:7;2522:2;2509:16;2504:2;2500;2496:11;2461:74;:::i;:::-;2451:84;2090:451;-1:-1:-1;;;;2090:451:1:o;2754:423::-;2796:3;2834:5;2828:12;2861:6;2856:3;2849:19;2886:1;2896:162;2910:6;2907:1;2904:13;2896:162;;;2972:4;3028:13;;;3024:22;;3018:29;3000:11;;;2996:20;;2989:59;2925:12;2896:162;;;2900:3;3103:1;3096:4;3087:6;3082:3;3078:16;3074:27;3067:38;3166:4;3159:2;3155:7;3150:2;3142:6;3138:15;3134:29;3129:3;3125:39;3121:50;3114:57;;;2754:423;;;;:::o;3182:220::-;3331:2;3320:9;3313:21;3294:4;3351:45;3392:2;3381:9;3377:18;3369:6;3351:45;:::i;3407:180::-;3466:6;3519:2;3507:9;3498:7;3494:23;3490:32;3487:52;;;3535:1;3532;3525:12;3487:52;-1:-1:-1;3558:23:1;;3407:180;-1:-1:-1;3407:180:1:o;3592:118::-;3678:5;3671:13;3664:21;3657:5;3654:32;3644:60;;3700:1;3697;3690:12;3715:376;3777:6;3785;3838:2;3826:9;3817:7;3813:23;3809:32;3806:52;;;3854:1;3851;3844:12;3806:52;3893:9;3880:23;3912:28;3934:5;3912:28;:::i;:::-;3959:5;-1:-1:-1;4016:2:1;4001:18;;3988:32;4029:30;3988:32;4029:30;:::i;:::-;4078:7;4068:17;;;3715:376;;;;;:::o;4096:247::-;4155:6;4208:2;4196:9;4187:7;4183:23;4179:32;4176:52;;;4224:1;4221;4214:12;4176:52;4263:9;4250:23;4282:31;4307:5;4282:31;:::i;4348:183::-;4408:4;4441:18;4433:6;4430:30;4427:56;;;4463:18;;:::i;:::-;-1:-1:-1;4508:1:1;4504:14;4520:4;4500:25;;4348:183::o;4536:724::-;4590:5;4643:3;4636:4;4628:6;4624:17;4620:27;4610:55;;4661:1;4658;4651:12;4610:55;4697:6;4684:20;4723:4;4746:43;4786:2;4746:43;:::i;:::-;4818:2;4812:9;4830:31;4858:2;4850:6;4830:31;:::i;:::-;4896:18;;;4988:1;4984:10;;;;4972:23;;4968:32;;;4930:15;;;;-1:-1:-1;5012:15:1;;;5009:35;;;5040:1;5037;5030:12;5009:35;5076:2;5068:6;5064:15;5088:142;5104:6;5099:3;5096:15;5088:142;;;5170:17;;5158:30;;5208:12;;;;5121;;5088:142;;;-1:-1:-1;5248:6:1;4536:724;-1:-1:-1;;;;;;4536:724:1:o;5265:221::-;5307:5;5360:3;5353:4;5345:6;5341:17;5337:27;5327:55;;5378:1;5375;5368:12;5327:55;5400:80;5476:3;5467:6;5454:20;5447:4;5439:6;5435:17;5400:80;:::i;5491:1071::-;5645:6;5653;5661;5669;5677;5730:3;5718:9;5709:7;5705:23;5701:33;5698:53;;;5747:1;5744;5737:12;5698:53;5786:9;5773:23;5805:31;5830:5;5805:31;:::i;:::-;5855:5;-1:-1:-1;5912:2:1;5897:18;;5884:32;5925:33;5884:32;5925:33;:::i;:::-;5977:7;-1:-1:-1;6035:2:1;6020:18;;6007:32;6058:18;6088:14;;;6085:34;;;6115:1;6112;6105:12;6085:34;6138:61;6191:7;6182:6;6171:9;6167:22;6138:61;:::i;:::-;6128:71;;6252:2;6241:9;6237:18;6224:32;6208:48;;6281:2;6271:8;6268:16;6265:36;;;6297:1;6294;6287:12;6265:36;6320:63;6375:7;6364:8;6353:9;6349:24;6320:63;:::i;:::-;6310:73;;6436:3;6425:9;6421:19;6408:33;6392:49;;6466:2;6456:8;6453:16;6450:36;;;6482:1;6479;6472:12;6450:36;;6505:51;6548:7;6537:8;6526:9;6522:24;6505:51;:::i;:::-;6495:61;;;5491:1071;;;;;;;;:::o;6806:1277::-;6924:6;6932;6985:2;6973:9;6964:7;6960:23;6956:32;6953:52;;;7001:1;6998;6991:12;6953:52;7041:9;7028:23;7070:18;7111:2;7103:6;7100:14;7097:34;;;7127:1;7124;7117:12;7097:34;7165:6;7154:9;7150:22;7140:32;;7210:7;7203:4;7199:2;7195:13;7191:27;7181:55;;7232:1;7229;7222:12;7181:55;7268:2;7255:16;7290:4;7313:43;7353:2;7313:43;:::i;:::-;7385:2;7379:9;7397:31;7425:2;7417:6;7397:31;:::i;:::-;7463:18;;;7551:1;7547:10;;;;7539:19;;7535:28;;;7497:15;;;;-1:-1:-1;7575:19:1;;;7572:39;;;7607:1;7604;7597:12;7572:39;7631:11;;;;7651:217;7667:6;7662:3;7659:15;7651:217;;;7747:3;7734:17;7764:31;7789:5;7764:31;:::i;:::-;7808:18;;7684:12;;;;7846;;;;7651:217;;;7887:6;-1:-1:-1;;7931:18:1;;7918:32;;-1:-1:-1;;7962:16:1;;;7959:36;;;7991:1;7988;7981:12;7959:36;;8014:63;8069:7;8058:8;8047:9;8043:24;8014:63;:::i;:::-;8004:73;;;6806:1277;;;;;:::o;8088:435::-;8141:3;8179:5;8173:12;8206:6;8201:3;8194:19;8232:4;8261:2;8256:3;8252:12;8245:19;;8298:2;8291:5;8287:14;8319:1;8329:169;8343:6;8340:1;8337:13;8329:169;;;8404:13;;8392:26;;8438:12;;;;8473:15;;;;8365:1;8358:9;8329:169;;;-1:-1:-1;8514:3:1;;8088:435;-1:-1:-1;;;;;8088:435:1:o;8528:261::-;8707:2;8696:9;8689:21;8670:4;8727:56;8779:2;8768:9;8764:18;8756:6;8727:56;:::i;8794:730::-;8921:6;8929;8937;8990:2;8978:9;8969:7;8965:23;8961:32;8958:52;;;9006:1;9003;8996:12;8958:52;9045:9;9032:23;9064:31;9089:5;9064:31;:::i;:::-;9114:5;-1:-1:-1;9170:2:1;9155:18;;9142:32;9193:18;9223:14;;;9220:34;;;9250:1;9247;9240:12;9220:34;9273:61;9326:7;9317:6;9306:9;9302:22;9273:61;:::i;:::-;9263:71;;9387:2;9376:9;9372:18;9359:32;9343:48;;9416:2;9406:8;9403:16;9400:36;;;9432:1;9429;9422:12;9400:36;;9455:63;9510:7;9499:8;9488:9;9484:24;9455:63;:::i;:::-;9445:73;;;8794:730;;;;;:::o;9789:241::-;9845:6;9898:2;9886:9;9877:7;9873:23;9869:32;9866:52;;;9914:1;9911;9904:12;9866:52;9953:9;9940:23;9972:28;9994:5;9972:28;:::i;10035:382::-;10100:6;10108;10161:2;10149:9;10140:7;10136:23;10132:32;10129:52;;;10177:1;10174;10167:12;10129:52;10216:9;10203:23;10235:31;10260:5;10235:31;:::i;10422:615::-;10508:6;10516;10569:2;10557:9;10548:7;10544:23;10540:32;10537:52;;;10585:1;10582;10575:12;10537:52;10625:9;10612:23;10654:18;10695:2;10687:6;10684:14;10681:34;;;10711:1;10708;10701:12;10681:34;10749:6;10738:9;10734:22;10724:32;;10794:7;10787:4;10783:2;10779:13;10775:27;10765:55;;10816:1;10813;10806:12;10765:55;10856:2;10843:16;10882:2;10874:6;10871:14;10868:34;;;10898:1;10895;10888:12;10868:34;10951:7;10946:2;10936:6;10933:1;10929:14;10925:2;10921:23;10917:32;10914:45;10911:65;;;10972:1;10969;10962:12;10911:65;11003:2;10995:11;;;;;11025:6;;-1:-1:-1;10422:615:1;;-1:-1:-1;;;;10422:615:1:o;11042:388::-;11110:6;11118;11171:2;11159:9;11150:7;11146:23;11142:32;11139:52;;;11187:1;11184;11177:12;11139:52;11226:9;11213:23;11245:31;11270:5;11245:31;:::i;:::-;11295:5;-1:-1:-1;11352:2:1;11337:18;;11324:32;11365:33;11324:32;11365:33;:::i;11435:734::-;11539:6;11547;11555;11563;11571;11624:3;11612:9;11603:7;11599:23;11595:33;11592:53;;;11641:1;11638;11631:12;11592:53;11680:9;11667:23;11699:31;11724:5;11699:31;:::i;:::-;11749:5;-1:-1:-1;11806:2:1;11791:18;;11778:32;11819:33;11778:32;11819:33;:::i;:::-;11871:7;-1:-1:-1;11925:2:1;11910:18;;11897:32;;-1:-1:-1;11976:2:1;11961:18;;11948:32;;-1:-1:-1;12031:3:1;12016:19;;12003:33;12059:18;12048:30;;12045:50;;;12091:1;12088;12081:12;12045:50;12114:49;12155:7;12146:6;12135:9;12131:22;12114:49;:::i;12174:383::-;12251:6;12259;12267;12320:2;12308:9;12299:7;12295:23;12291:32;12288:52;;;12336:1;12333;12326:12;12288:52;12375:9;12362:23;12394:31;12419:5;12394:31;:::i;:::-;12444:5;12496:2;12481:18;;12468:32;;-1:-1:-1;12547:2:1;12532:18;;;12519:32;;12174:383;-1:-1:-1;;;12174:383:1:o;12973:380::-;13052:1;13048:12;;;;13095;;;13116:61;;13170:4;13162:6;13158:17;13148:27;;13116:61;13223:2;13215:6;13212:14;13192:18;13189:38;13186:161;;13269:10;13264:3;13260:20;13257:1;13250:31;13304:4;13301:1;13294:15;13332:4;13329:1;13322:15;13186:161;;12973:380;;;:::o;13952:245::-;14019:6;14072:2;14060:9;14051:7;14047:23;14043:32;14040:52;;;14088:1;14085;14078:12;14040:52;14120:9;14114:16;14139:28;14161:5;14139:28;:::i;14607:353::-;14809:2;14791:21;;;14848:2;14828:18;;;14821:30;14887:31;14882:2;14867:18;;14860:59;14951:2;14936:18;;14607:353::o;15312:332::-;15514:2;15496:21;;;15553:1;15533:18;;;15526:29;-1:-1:-1;;;15586:2:1;15571:18;;15564:39;15635:2;15620:18;;15312:332::o;16038:354::-;16240:2;16222:21;;;16279:2;16259:18;;;16252:30;16318:32;16313:2;16298:18;;16291:60;16383:2;16368:18;;16038:354::o;16397:184::-;16467:6;16520:2;16508:9;16499:7;16495:23;16491:32;16488:52;;;16536:1;16533;16526:12;16488:52;-1:-1:-1;16559:16:1;;16397:184;-1:-1:-1;16397:184:1:o;16996:127::-;17057:10;17052:3;17048:20;17045:1;17038:31;17088:4;17085:1;17078:15;17112:4;17109:1;17102:15;17128:127;17189:10;17184:3;17180:20;17177:1;17170:31;17220:4;17217:1;17210:15;17244:4;17241:1;17234:15;17260:135;17299:3;17320:17;;;17317:43;;17340:18;;:::i;:::-;-1:-1:-1;17387:1:1;17376:13;;17260:135::o;17400:411::-;17602:2;17584:21;;;17641:2;17621:18;;;17614:30;17680:34;17675:2;17660:18;;17653:62;-1:-1:-1;;;17746:2:1;17731:18;;17724:45;17801:3;17786:19;;17400:411::o;18370:128::-;18437:9;;;18458:11;;;18455:37;;;18472:18;;:::i;21941:125::-;22006:9;;;22027:10;;;22024:36;;;22040:18;;:::i;22967:545::-;23069:2;23064:3;23061:11;23058:448;;;23105:1;23130:5;23126:2;23119:17;23175:4;23171:2;23161:19;23245:2;23233:10;23229:19;23226:1;23222:27;23216:4;23212:38;23281:4;23269:10;23266:20;23263:47;;;-1:-1:-1;23304:4:1;23263:47;23359:2;23354:3;23350:12;23347:1;23343:20;23337:4;23333:31;23323:41;;23414:82;23432:2;23425:5;23422:13;23414:82;;;23477:17;;;23458:1;23447:13;23414:82;;23688:1352;23814:3;23808:10;23841:18;23833:6;23830:30;23827:56;;;23863:18;;:::i;:::-;23892:97;23982:6;23942:38;23974:4;23968:11;23942:38;:::i;:::-;23936:4;23892:97;:::i;:::-;24044:4;;24108:2;24097:14;;24125:1;24120:663;;;;24827:1;24844:6;24841:89;;;-1:-1:-1;24896:19:1;;;24890:26;24841:89;-1:-1:-1;;23645:1:1;23641:11;;;23637:24;23633:29;23623:40;23669:1;23665:11;;;23620:57;24943:81;;24090:944;;24120:663;22914:1;22907:14;;;22951:4;22938:18;;-1:-1:-1;;24156:20:1;;;24274:236;24288:7;24285:1;24282:14;24274:236;;;24377:19;;;24371:26;24356:42;;24469:27;;;;24437:1;24425:14;;;;24304:19;;24274:236;;;24278:3;24538:6;24529:7;24526:19;24523:201;;;24599:19;;;24593:26;-1:-1:-1;;24682:1:1;24678:14;;;24694:3;24674:24;24670:37;24666:42;24651:58;24636:74;;24523:201;-1:-1:-1;;;;;24770:1:1;24754:14;;;24750:22;24737:36;;-1:-1:-1;23688:1352:1:o;25045:127::-;25106:10;25101:3;25097:20;25094:1;25087:31;25137:4;25134:1;25127:15;25161:4;25158:1;25151:15;25177:120;25217:1;25243;25233:35;;25248:18;;:::i;:::-;-1:-1:-1;25282:9:1;;25177:120::o;25666:112::-;25698:1;25724;25714:35;;25729:18;;:::i;:::-;-1:-1:-1;25763:9:1;;25666:112::o;26446:399::-;26648:2;26630:21;;;26687:2;26667:18;;;26660:30;26726:34;26721:2;26706:18;;26699:62;-1:-1:-1;;;26792:2:1;26777:18;;26770:33;26835:3;26820:19;;26446:399::o;26850:404::-;27052:2;27034:21;;;27091:2;27071:18;;;27064:30;27130:34;27125:2;27110:18;;27103:62;-1:-1:-1;;;27196:2:1;27181:18;;27174:38;27244:3;27229:19;;26850:404::o;27259:400::-;27461:2;27443:21;;;27500:2;27480:18;;;27473:30;27539:34;27534:2;27519:18;;27512:62;-1:-1:-1;;;27605:2:1;27590:18;;27583:34;27649:3;27634:19;;27259:400::o;27664:465::-;27921:2;27910:9;27903:21;27884:4;27947:56;27999:2;27988:9;27984:18;27976:6;27947:56;:::i;:::-;28051:9;28043:6;28039:22;28034:2;28023:9;28019:18;28012:50;28079:44;28116:6;28108;28079:44;:::i;:::-;28071:52;27664:465;-1:-1:-1;;;;;27664:465:1:o;28789:401::-;28991:2;28973:21;;;29030:2;29010:18;;;29003:30;29069:34;29064:2;29049:18;;29042:62;-1:-1:-1;;;29135:2:1;29120:18;;29113:35;29180:3;29165:19;;28789:401::o;29195:406::-;29397:2;29379:21;;;29436:2;29416:18;;;29409:30;29475:34;29470:2;29455:18;;29448:62;-1:-1:-1;;;29541:2:1;29526:18;;29519:40;29591:3;29576:19;;29195:406::o;30016:561::-;-1:-1:-1;;;;;30313:15:1;;;30295:34;;30365:15;;30360:2;30345:18;;30338:43;30412:2;30397:18;;30390:34;;;30455:2;30440:18;;30433:34;;;30275:3;30498;30483:19;;30476:32;;;30238:4;;30525:46;;30551:19;;30543:6;30525:46;:::i;:::-;30517:54;30016:561;-1:-1:-1;;;;;;;30016:561:1:o;30582:249::-;30651:6;30704:2;30692:9;30683:7;30679:23;30675:32;30672:52;;;30720:1;30717;30710:12;30672:52;30752:9;30746:16;30771:30;30795:5;30771:30;:::i;30836:179::-;30871:3;30913:1;30895:16;30892:23;30889:120;;;30959:1;30956;30953;30938:23;-1:-1:-1;30996:1:1;30990:8;30985:3;30981:18;30889:120;30836:179;:::o;31020:671::-;31059:3;31101:4;31083:16;31080:26;31077:39;;;31020:671;:::o;31077:39::-;31143:2;31137:9;-1:-1:-1;;31208:16:1;31204:25;;31201:1;31137:9;31180:50;31259:4;31253:11;31283:16;31318:18;31389:2;31382:4;31374:6;31370:17;31367:25;31362:2;31354:6;31351:14;31348:45;31345:58;;;31396:5;;;;;31020:671;:::o;31345:58::-;31433:6;31427:4;31423:17;31412:28;;31469:3;31463:10;31496:2;31488:6;31485:14;31482:27;;;31502:5;;;;;;31020:671;:::o;31482:27::-;31586:2;31567:16;31561:4;31557:27;31553:36;31546:4;31537:6;31532:3;31528:16;31524:27;31521:69;31518:82;;;31593:5;;;;;;31020:671;:::o;31518:82::-;31609:57;31660:4;31651:6;31643;31639:19;31635:30;31629:4;31609:57;:::i;:::-;-1:-1:-1;31682:3:1;;31020:671;-1:-1:-1;;;;;31020:671:1:o;32117:404::-;32319:2;32301:21;;;32358:2;32338:18;;;32331:30;32397:34;32392:2;32377:18;;32370:62;-1:-1:-1;;;32463:2:1;32448:18;;32441:38;32511:3;32496:19;;32117:404::o;32526:827::-;-1:-1:-1;;;;;32923:15:1;;;32905:34;;32975:15;;32970:2;32955:18;;32948:43;32885:3;33022:2;33007:18;;33000:31;;;32848:4;;33054:57;;33091:19;;33083:6;33054:57;:::i;:::-;33159:9;33151:6;33147:22;33142:2;33131:9;33127:18;33120:50;33193:44;33230:6;33222;33193:44;:::i;:::-;33179:58;;33286:9;33278:6;33274:22;33268:3;33257:9;33253:19;33246:51;33314:33;33340:6;33332;33314:33;:::i;:::-;33306:41;32526:827;-1:-1:-1;;;;;;;;32526:827:1:o

Swarm Source

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