ETH Price: $3,458.38 (+1.56%)
Gas: 8 Gwei

Token

FlippingClub Access Key (KEY)
 

Overview

Max Total Supply

5,810 KEY

Holders

58

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

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:
FlippingClubAccessKey

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// 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);
}

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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





// 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;
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

// 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;
    }
}

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

pragma solidity ^0.8.0;


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

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

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

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

pragma solidity ^0.8.0;

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



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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


//Open Edition NFT Access Key 
pragma solidity >=0.8.9;

contract FlippingClubAccessKey is ERC721, ERC721Enumerable, Ownable, Pausable {
    using Address for address payable;
    using Strings for uint256;
    using Counters for Counters.Counter;

    uint256 private pricePerToken = 0.4 ether;
    string private baseURI = "";
    Counters.Counter private nextTokenId;
    address payable public treasury;

    event GrantRole(bytes32 indexed role, address indexed account);
    event RevokeRole(bytes32 indexed role, address indexed account);
    event Claimed(uint256 indexed amount, address indexed payee);

    mapping(bytes32 => mapping(address => bool)) public roles;

    bytes32 private constant ADMIN = keccak256(abi.encodePacked("ADMIN"));
    bytes32 private constant EXEC = keccak256(abi.encodePacked("EXEC"));

    constructor() ERC721("FlippingClub Access Key", "KEY") {
        baseURI = "https://api.flippingclub.xyz/metadata/";
        treasury = payable(msg.sender);
        _grantRole(ADMIN, msg.sender);
    }

    
    function mintKeyCards(address to, uint256 amount) external payable whenNotPaused onlyRole(EXEC){
        require(msg.value >= getPrice() * amount, "Ether value sent is not correct");
        _mintKeyCards(to, amount);
        treasury.sendValue(getPrice() * amount);
    }

    
    function issueKeyCards(address to, uint256 amount) external onlyRole(ADMIN) {
        _mintKeyCards(to, amount);
    }

    
    function _mintKeyCards(address to, uint256 amount) private {
        uint256 startTokenId = nextTokenId.current();
        for (uint256 i = 0; i < amount; i++) {
        _safeMint(to, startTokenId + i);
        nextTokenId.increment();
        }
    }
    
    function setTreasury(address payable _beneficiary) public onlyRole(ADMIN) {
        treasury = _beneficiary;
    }

    
    function getPrice() public view returns (uint256) {
        return pricePerToken;
    }

    
    function setPrice(uint256 newPrice) public onlyRole(ADMIN) {
        pricePerToken = newPrice;
    }

    function pause() external onlyRole(ADMIN) {
        _pause();
    }

    function unpause() external onlyRole(ADMIN) {
        _unpause();
    }

    function totalSupply() public view override returns (uint256) {
        return nextTokenId.current();
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory){
        require(tokenId <= nextTokenId.current(),"ERC721Metadata: URI query for nonexistent token");
        string memory uri = _baseURI();
        return
        bytes(uri).length > 0 ? string(abi.encodePacked(uri, tokenId.toString())): "";
    }

    function getBaseURI() public view returns (string memory) {
        return baseURI;
    }

    function setBaseURI(string memory _uri) public onlyRole(ADMIN) {
        baseURI = _uri;
    }

    function _baseURI() internal view virtual override(ERC721) returns (string memory){
        return baseURI;
    }

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

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable) {
    return super._beforeTokenTransfer(from, to, tokenId);
    }
    modifier onlyRole(bytes32 _role) {
        require(roles[_role][msg.sender], "Only defined role can perform this operation.");
        _;
    }

    function _grantRole(bytes32 _role, address _account) internal {
        roles[_role][_account] = true;
        emit GrantRole(_role,_account);
    }

    function grantRole(bytes32 _role, address _account) external onlyRole(ADMIN) {
        _grantRole(_role, _account);
    }

    function getTokenIdsByOwner(address _owner) public view returns (uint[] memory) {
        uint[] memory _tokensOfOwner = new uint[](ERC721.balanceOf(_owner));
        uint i;

        for (i=0;i<ERC721.balanceOf(_owner);i++){
            _tokensOfOwner[i] = ERC721Enumerable.tokenOfOwnerByIndex(_owner, i);
        }
        return (_tokensOfOwner);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"payee","type":"address"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"GrantRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RevokeRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getTokenIdsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"issueKeyCards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintKeyCards","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"roles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_beneficiary","type":"address"}],"name":"setTreasury","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":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405267058d15e176280000600b5560405180602001604052806000815250600c90805190602001906200003792919062000351565b503480156200004557600080fd5b506040518060400160405280601781526020017f466c697070696e67436c756220416363657373204b65790000000000000000008152506040518060400160405280600381526020017f4b455900000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000ca92919062000351565b508060019080519060200190620000e392919062000351565b50505062000106620000fa620001d260201b60201c565b620001da60201b60201c565b6000600a60146101000a81548160ff021916908315150217905550604051806060016040528060268152602001620050a060269139600c90805190602001906200015292919062000351565b5033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001cc604051602001620001a9906200045c565b6040516020818303038152906040528051906020012033620002a060201b60201c565b620004d7565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600f600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff16827f5a06360d65acf95e98445dc834f205063424c636e65418d928cdfabc33a9539960405160405180910390a35050565b8280546200035f90620004a2565b90600052602060002090601f016020900481019282620003835760008555620003cf565b82601f106200039e57805160ff1916838001178555620003cf565b82800160010185558215620003cf579182015b82811115620003ce578251825591602001919060010190620003b1565b5b509050620003de9190620003e2565b5090565b5b80821115620003fd576000816000905550600101620003e3565b5090565b600081905092915050565b7f41444d494e000000000000000000000000000000000000000000000000000000600082015250565b60006200044460058362000401565b915062000451826200040c565b600582019050919050565b6000620004698262000435565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004bb57607f821691505b602082108103620004d157620004d062000473565b5b50919050565b614bb980620004e76000396000f3fe6080604052600436106101ee5760003560e01c80636970bb0a1161010d57806398d5fdca116100a0578063c87b56dd1161006f578063c87b56dd146106c8578063e985e9c514610705578063f0f4426014610742578063f2fde38b1461076b578063f8fc08b914610794576101ee565b806398d5fdca1461062f578063999065d31461065a578063a22cb46514610676578063b88d4fde1461069f576101ee565b80638456cb59116100dc5780638456cb59146105995780638da5cb5b146105b057806391b7f5ed146105db57806395d89b4114610604576101ee565b80636970bb0a146104dd57806370a082311461051a578063714c539814610557578063715018a614610582576101ee565b80633f4ba83a116101855780635c975abb116101545780635c975abb1461042157806361d027b31461044c5780636352211e1461047757806367d04105146104b4576101ee565b80633f4ba83a1461037b57806342842e0e146103925780634f6ccce7146103bb57806355f804b3146103f8576101ee565b806318160ddd116101c157806318160ddd146102c157806323b872dd146102ec5780632f2ff15d146103155780632f745c591461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906131e2565b6107d1565b604051610227919061322a565b60405180910390f35b34801561023c57600080fd5b506102456107e3565b60405161025291906132de565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613336565b610875565b60405161028f91906133a4565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba91906133eb565b6108fa565b005b3480156102cd57600080fd5b506102d6610a11565b6040516102e3919061343a565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190613455565b610a22565b005b34801561032157600080fd5b5061033c600480360381019061033791906134de565b610a82565b005b34801561034a57600080fd5b50610365600480360381019061036091906133eb565b610b53565b604051610372919061343a565b60405180910390f35b34801561038757600080fd5b50610390610bf8565b005b34801561039e57600080fd5b506103b960048036038101906103b49190613455565b610cc5565b005b3480156103c757600080fd5b506103e260048036038101906103dd9190613336565b610ce5565b6040516103ef919061343a565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a9190613653565b610d56565b005b34801561042d57600080fd5b50610436610e33565b604051610443919061322a565b60405180910390f35b34801561045857600080fd5b50610461610e4a565b60405161046e91906136bd565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190613336565b610e70565b6040516104ab91906133a4565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d691906133eb565b610f21565b005b3480156104e957600080fd5b5061050460048036038101906104ff91906136d8565b610ff2565b60405161051191906137c3565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c91906136d8565b6110a2565b60405161054e919061343a565b60405180910390f35b34801561056357600080fd5b5061056c611159565b60405161057991906132de565b60405180910390f35b34801561058e57600080fd5b506105976111eb565b005b3480156105a557600080fd5b506105ae611273565b005b3480156105bc57600080fd5b506105c5611340565b6040516105d291906133a4565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190613336565b61136a565b005b34801561061057600080fd5b50610619611437565b60405161062691906132de565b60405180910390f35b34801561063b57600080fd5b506106446114c9565b604051610651919061343a565b60405180910390f35b610674600480360381019061066f91906133eb565b6114d3565b005b34801561068257600080fd5b5061069d60048036038101906106989190613811565b61169e565b005b3480156106ab57600080fd5b506106c660048036038101906106c191906138f2565b6116b4565b005b3480156106d457600080fd5b506106ef60048036038101906106ea9190613336565b611716565b6040516106fc91906132de565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190613975565b6117c1565b604051610739919061322a565b60405180910390f35b34801561074e57600080fd5b50610769600480360381019061076491906139e1565b611855565b005b34801561077757600080fd5b50610792600480360381019061078d91906136d8565b61195c565b005b3480156107a057600080fd5b506107bb60048036038101906107b691906134de565b611a53565b6040516107c8919061322a565b60405180910390f35b60006107dc82611a82565b9050919050565b6060600080546107f290613a3d565b80601f016020809104026020016040519081016040528092919081815260200182805461081e90613a3d565b801561086b5780601f106108405761010080835404028352916020019161086b565b820191906000526020600020905b81548152906001019060200180831161084e57829003601f168201915b5050505050905090565b600061088082611afc565b6108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b690613ae0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061090582610e70565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096c90613b72565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610994611b68565b73ffffffffffffffffffffffffffffffffffffffff1614806109c357506109c2816109bd611b68565b6117c1565b5b610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f990613c04565b60405180910390fd5b610a0c8383611b70565b505050565b6000610a1d600d611c29565b905090565b610a33610a2d611b68565b82611c37565b610a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6990613c96565b60405180910390fd5b610a7d838383611d15565b505050565b604051602001610a9190613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613d94565b60405180910390fd5b610b4e8383611f7b565b505050565b6000610b5e836110a2565b8210610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9690613e26565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b604051602001610c0790613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb190613d94565b60405180910390fd5b610cc261202c565b50565b610ce0838383604051806020016040528060008152506116b4565b505050565b6000610cef6120ce565b8210610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790613eb8565b60405180910390fd5b60088281548110610d4457610d43613ed8565b5b90600052602060002001549050919050565b604051602001610d6590613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f90613d94565b60405180910390fd5b81600c9080519060200190610e2e9291906130d3565b505050565b6000600a60149054906101000a900460ff16905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90613f79565b60405180910390fd5b80915050919050565b604051602001610f3090613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda90613d94565b60405180910390fd5b610fed83836120db565b505050565b60606000610fff836110a2565b67ffffffffffffffff81111561101857611017613528565b5b6040519080825280602002602001820160405280156110465781602001602082028036833780820191505090505b50905060005b611055846110a2565b811015611098576110668482610b53565b82828151811061107957611078613ed8565b5b602002602001018181525050808061109090613fc8565b91505061104c565b8192505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110990614082565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600c805461116890613a3d565b80601f016020809104026020016040519081016040528092919081815260200182805461119490613a3d565b80156111e15780601f106111b6576101008083540402835291602001916111e1565b820191906000526020600020905b8154815290600101906020018083116111c457829003601f168201915b5050505050905090565b6111f3611b68565b73ffffffffffffffffffffffffffffffffffffffff16611211611340565b73ffffffffffffffffffffffffffffffffffffffff1614611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e906140ee565b60405180910390fd5b611271600061212c565b565b60405160200161128290613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c90613d94565b60405180910390fd5b61133d6121f2565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60405160200161137990613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142390613d94565b60405180910390fd5b81600b819055505050565b60606001805461144690613a3d565b80601f016020809104026020016040519081016040528092919081815260200182805461147290613a3d565b80156114bf5780601f10611494576101008083540402835291602001916114bf565b820191906000526020600020905b8154815290600101906020018083116114a257829003601f168201915b5050505050905090565b6000600b54905090565b6114db610e33565b1561151b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115129061415a565b60405180910390fd5b60405160200161152a906141c6565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d490613d94565b60405180910390fd5b816115e66114c9565b6115f091906141db565b341015611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990614281565b60405180910390fd5b61163c83836120db565b611699826116486114c9565b61165291906141db565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661229590919063ffffffff16565b505050565b6116b06116a9611b68565b8383612389565b5050565b6116c56116bf611b68565b83611c37565b611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb90613c96565b60405180910390fd5b611710848484846124f5565b50505050565b6060611722600d611c29565b821115611764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175b90614313565b60405180910390fd5b600061176e612551565b9050600081511161178e57604051806020016040528060008152506117b9565b80611798846125e3565b6040516020016117a9929190614364565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60405160200161186490613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90613d94565b60405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b611964611b68565b73ffffffffffffffffffffffffffffffffffffffff16611982611340565b73ffffffffffffffffffffffffffffffffffffffff16146119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cf906140ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e906143fa565b60405180910390fd5b611a508161212c565b50565b600f6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611af55750611af482612743565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be383610e70565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611c4282611afc565b611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c789061448c565b60405180910390fd5b6000611c8c83610e70565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cfb57508373ffffffffffffffffffffffffffffffffffffffff16611ce384610875565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d0c5750611d0b81856117c1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d3582610e70565b73ffffffffffffffffffffffffffffffffffffffff1614611d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d829061451e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df1906145b0565b60405180910390fd5b611e05838383612825565b611e10600082611b70565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e6091906145d0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb79190614604565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f76838383612835565b505050565b6001600f600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff16827f5a06360d65acf95e98445dc834f205063424c636e65418d928cdfabc33a9539960405160405180910390a35050565b612034610e33565b612073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206a906146a6565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6120b7611b68565b6040516120c491906133a4565b60405180910390a1565b6000600880549050905090565b60006120e7600d611c29565b905060005b82811015612126576121098482846121049190614604565b61283a565b612113600d612858565b808061211e90613fc8565b9150506120ec565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121fa610e33565b1561223a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122319061415a565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861227e611b68565b60405161228b91906133a4565b60405180910390a1565b804710156122d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cf90614712565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516122fe90614763565b60006040518083038185875af1925050503d806000811461233b576040519150601f19603f3d011682016040523d82523d6000602084013e612340565b606091505b5050905080612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237b906147ea565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ee90614856565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124e8919061322a565b60405180910390a3505050565b612500848484611d15565b61250c8484848461286e565b61254b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612542906148e8565b60405180910390fd5b50505050565b6060600c805461256090613a3d565b80601f016020809104026020016040519081016040528092919081815260200182805461258c90613a3d565b80156125d95780601f106125ae576101008083540402835291602001916125d9565b820191906000526020600020905b8154815290600101906020018083116125bc57829003601f168201915b5050505050905090565b60606000820361262a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061273e565b600082905060005b6000821461265c57808061264590613fc8565b915050600a826126559190614937565b9150612632565b60008167ffffffffffffffff81111561267857612677613528565b5b6040519080825280601f01601f1916602001820160405280156126aa5781602001600182028036833780820191505090505b5090505b60008514612737576001826126c391906145d0565b9150600a856126d29190614968565b60306126de9190614604565b60f81b8183815181106126f4576126f3613ed8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127309190614937565b94506126ae565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061280e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061281e575061281d826129f5565b5b9050919050565b612830838383612a5f565b505050565b505050565b612854828260405180602001604052806000815250612b71565b5050565b6001816000016000828254019250508190555050565b600061288f8473ffffffffffffffffffffffffffffffffffffffff16612bcc565b156129e8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128b8611b68565b8786866040518563ffffffff1660e01b81526004016128da94939291906149ee565b6020604051808303816000875af192505050801561291657506040513d601f19601f820116820180604052508101906129139190614a4f565b60015b612998573d8060008114612946576040519150601f19603f3d011682016040523d82523d6000602084013e61294b565b606091505b506000815103612990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612987906148e8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129ed565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a6a838383612bef565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612aac57612aa781612bf4565b612aeb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612aea57612ae98382612c3d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b2d57612b2881612daa565b612b6c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b6b57612b6a8282612e7b565b5b5b505050565b612b7b8383612efa565b612b88600084848461286e565b612bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbe906148e8565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c4a846110a2565b612c5491906145d0565b9050600060076000848152602001908152602001600020549050818114612d39576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612dbe91906145d0565b9050600060096000848152602001908152602001600020549050600060088381548110612dee57612ded613ed8565b5b906000526020600020015490508060088381548110612e1057612e0f613ed8565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e5f57612e5e614a7c565b5b6001900381819060005260206000200160009055905550505050565b6000612e86836110a2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6090614af7565b60405180910390fd5b612f7281611afc565b15612fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa990614b63565b60405180910390fd5b612fbe60008383612825565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461300e9190614604565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130cf60008383612835565b5050565b8280546130df90613a3d565b90600052602060002090601f0160209004810192826131015760008555613148565b82601f1061311a57805160ff1916838001178555613148565b82800160010185558215613148579182015b8281111561314757825182559160200191906001019061312c565b5b5090506131559190613159565b5090565b5b8082111561317257600081600090555060010161315a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131bf8161318a565b81146131ca57600080fd5b50565b6000813590506131dc816131b6565b92915050565b6000602082840312156131f8576131f7613180565b5b6000613206848285016131cd565b91505092915050565b60008115159050919050565b6132248161320f565b82525050565b600060208201905061323f600083018461321b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561327f578082015181840152602081019050613264565b8381111561328e576000848401525b50505050565b6000601f19601f8301169050919050565b60006132b082613245565b6132ba8185613250565b93506132ca818560208601613261565b6132d381613294565b840191505092915050565b600060208201905081810360008301526132f881846132a5565b905092915050565b6000819050919050565b61331381613300565b811461331e57600080fd5b50565b6000813590506133308161330a565b92915050565b60006020828403121561334c5761334b613180565b5b600061335a84828501613321565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061338e82613363565b9050919050565b61339e81613383565b82525050565b60006020820190506133b96000830184613395565b92915050565b6133c881613383565b81146133d357600080fd5b50565b6000813590506133e5816133bf565b92915050565b6000806040838503121561340257613401613180565b5b6000613410858286016133d6565b925050602061342185828601613321565b9150509250929050565b61343481613300565b82525050565b600060208201905061344f600083018461342b565b92915050565b60008060006060848603121561346e5761346d613180565b5b600061347c868287016133d6565b935050602061348d868287016133d6565b925050604061349e86828701613321565b9150509250925092565b6000819050919050565b6134bb816134a8565b81146134c657600080fd5b50565b6000813590506134d8816134b2565b92915050565b600080604083850312156134f5576134f4613180565b5b6000613503858286016134c9565b9250506020613514858286016133d6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61356082613294565b810181811067ffffffffffffffff8211171561357f5761357e613528565b5b80604052505050565b6000613592613176565b905061359e8282613557565b919050565b600067ffffffffffffffff8211156135be576135bd613528565b5b6135c782613294565b9050602081019050919050565b82818337600083830152505050565b60006135f66135f1846135a3565b613588565b90508281526020810184848401111561361257613611613523565b5b61361d8482856135d4565b509392505050565b600082601f83011261363a5761363961351e565b5b813561364a8482602086016135e3565b91505092915050565b60006020828403121561366957613668613180565b5b600082013567ffffffffffffffff81111561368757613686613185565b5b61369384828501613625565b91505092915050565b60006136a782613363565b9050919050565b6136b78161369c565b82525050565b60006020820190506136d260008301846136ae565b92915050565b6000602082840312156136ee576136ed613180565b5b60006136fc848285016133d6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61373a81613300565b82525050565b600061374c8383613731565b60208301905092915050565b6000602082019050919050565b600061377082613705565b61377a8185613710565b935061378583613721565b8060005b838110156137b657815161379d8882613740565b97506137a883613758565b925050600181019050613789565b5085935050505092915050565b600060208201905081810360008301526137dd8184613765565b905092915050565b6137ee8161320f565b81146137f957600080fd5b50565b60008135905061380b816137e5565b92915050565b6000806040838503121561382857613827613180565b5b6000613836858286016133d6565b9250506020613847858286016137fc565b9150509250929050565b600067ffffffffffffffff82111561386c5761386b613528565b5b61387582613294565b9050602081019050919050565b600061389561389084613851565b613588565b9050828152602081018484840111156138b1576138b0613523565b5b6138bc8482856135d4565b509392505050565b600082601f8301126138d9576138d861351e565b5b81356138e9848260208601613882565b91505092915050565b6000806000806080858703121561390c5761390b613180565b5b600061391a878288016133d6565b945050602061392b878288016133d6565b935050604061393c87828801613321565b925050606085013567ffffffffffffffff81111561395d5761395c613185565b5b613969878288016138c4565b91505092959194509250565b6000806040838503121561398c5761398b613180565b5b600061399a858286016133d6565b92505060206139ab858286016133d6565b9150509250929050565b6139be8161369c565b81146139c957600080fd5b50565b6000813590506139db816139b5565b92915050565b6000602082840312156139f7576139f6613180565b5b6000613a05848285016139cc565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a5557607f821691505b602082108103613a6857613a67613a0e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613aca602c83613250565b9150613ad582613a6e565b604082019050919050565b60006020820190508181036000830152613af981613abd565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b5c602183613250565b9150613b6782613b00565b604082019050919050565b60006020820190508181036000830152613b8b81613b4f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613bee603883613250565b9150613bf982613b92565b604082019050919050565b60006020820190508181036000830152613c1d81613be1565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613c80603183613250565b9150613c8b82613c24565b604082019050919050565b60006020820190508181036000830152613caf81613c73565b9050919050565b600081905092915050565b7f41444d494e000000000000000000000000000000000000000000000000000000600082015250565b6000613cf7600583613cb6565b9150613d0282613cc1565b600582019050919050565b6000613d1882613cea565b9150819050919050565b7f4f6e6c7920646566696e656420726f6c652063616e20706572666f726d20746860008201527f6973206f7065726174696f6e2e00000000000000000000000000000000000000602082015250565b6000613d7e602d83613250565b9150613d8982613d22565b604082019050919050565b60006020820190508181036000830152613dad81613d71565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613e10602b83613250565b9150613e1b82613db4565b604082019050919050565b60006020820190508181036000830152613e3f81613e03565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613ea2602c83613250565b9150613ead82613e46565b604082019050919050565b60006020820190508181036000830152613ed181613e95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613f63602983613250565b9150613f6e82613f07565b604082019050919050565b60006020820190508181036000830152613f9281613f56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fd382613300565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361400557614004613f99565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061406c602a83613250565b915061407782614010565b604082019050919050565b6000602082019050818103600083015261409b8161405f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006140d8602083613250565b91506140e3826140a2565b602082019050919050565b60006020820190508181036000830152614107816140cb565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614144601083613250565b915061414f8261410e565b602082019050919050565b6000602082019050818103600083015261417381614137565b9050919050565b7f4558454300000000000000000000000000000000000000000000000000000000600082015250565b60006141b0600483613cb6565b91506141bb8261417a565b600482019050919050565b60006141d1826141a3565b9150819050919050565b60006141e682613300565b91506141f183613300565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422a57614229613f99565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b600061426b601f83613250565b915061427682614235565b602082019050919050565b6000602082019050818103600083015261429a8161425e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142fd602f83613250565b9150614308826142a1565b604082019050919050565b6000602082019050818103600083015261432c816142f0565b9050919050565b600061433e82613245565b6143488185613cb6565b9350614358818560208601613261565b80840191505092915050565b60006143708285614333565b915061437c8284614333565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143e4602683613250565b91506143ef82614388565b604082019050919050565b60006020820190508181036000830152614413816143d7565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614476602c83613250565b91506144818261441a565b604082019050919050565b600060208201905081810360008301526144a581614469565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614508602583613250565b9150614513826144ac565b604082019050919050565b60006020820190508181036000830152614537816144fb565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061459a602483613250565b91506145a58261453e565b604082019050919050565b600060208201905081810360008301526145c98161458d565b9050919050565b60006145db82613300565b91506145e683613300565b9250828210156145f9576145f8613f99565b5b828203905092915050565b600061460f82613300565b915061461a83613300565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561464f5761464e613f99565b5b828201905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614690601483613250565b915061469b8261465a565b602082019050919050565b600060208201905081810360008301526146bf81614683565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006146fc601d83613250565b9150614707826146c6565b602082019050919050565b6000602082019050818103600083015261472b816146ef565b9050919050565b600081905092915050565b50565b600061474d600083614732565b91506147588261473d565b600082019050919050565b600061476e82614740565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006147d4603a83613250565b91506147df82614778565b604082019050919050565b60006020820190508181036000830152614803816147c7565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614840601983613250565b915061484b8261480a565b602082019050919050565b6000602082019050818103600083015261486f81614833565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006148d2603283613250565b91506148dd82614876565b604082019050919050565b60006020820190508181036000830152614901816148c5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061494282613300565b915061494d83613300565b92508261495d5761495c614908565b5b828204905092915050565b600061497382613300565b915061497e83613300565b92508261498e5761498d614908565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006149c082614999565b6149ca81856149a4565b93506149da818560208601613261565b6149e381613294565b840191505092915050565b6000608082019050614a036000830187613395565b614a106020830186613395565b614a1d604083018561342b565b8181036060830152614a2f81846149b5565b905095945050505050565b600081519050614a49816131b6565b92915050565b600060208284031215614a6557614a64613180565b5b6000614a7384828501614a3a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ae1602083613250565b9150614aec82614aab565b602082019050919050565b60006020820190508181036000830152614b1081614ad4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b4d601c83613250565b9150614b5882614b17565b602082019050919050565b60006020820190508181036000830152614b7c81614b40565b905091905056fea2646970667358221220384d8f149f4aadd7e088864fa6c4ac0025b8f8b4f2413cceedfb07678eb2450f64736f6c634300080e003368747470733a2f2f6170692e666c697070696e67636c75622e78797a2f6d657461646174612f

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c80636970bb0a1161010d57806398d5fdca116100a0578063c87b56dd1161006f578063c87b56dd146106c8578063e985e9c514610705578063f0f4426014610742578063f2fde38b1461076b578063f8fc08b914610794576101ee565b806398d5fdca1461062f578063999065d31461065a578063a22cb46514610676578063b88d4fde1461069f576101ee565b80638456cb59116100dc5780638456cb59146105995780638da5cb5b146105b057806391b7f5ed146105db57806395d89b4114610604576101ee565b80636970bb0a146104dd57806370a082311461051a578063714c539814610557578063715018a614610582576101ee565b80633f4ba83a116101855780635c975abb116101545780635c975abb1461042157806361d027b31461044c5780636352211e1461047757806367d04105146104b4576101ee565b80633f4ba83a1461037b57806342842e0e146103925780634f6ccce7146103bb57806355f804b3146103f8576101ee565b806318160ddd116101c157806318160ddd146102c157806323b872dd146102ec5780632f2ff15d146103155780632f745c591461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906131e2565b6107d1565b604051610227919061322a565b60405180910390f35b34801561023c57600080fd5b506102456107e3565b60405161025291906132de565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613336565b610875565b60405161028f91906133a4565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba91906133eb565b6108fa565b005b3480156102cd57600080fd5b506102d6610a11565b6040516102e3919061343a565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190613455565b610a22565b005b34801561032157600080fd5b5061033c600480360381019061033791906134de565b610a82565b005b34801561034a57600080fd5b50610365600480360381019061036091906133eb565b610b53565b604051610372919061343a565b60405180910390f35b34801561038757600080fd5b50610390610bf8565b005b34801561039e57600080fd5b506103b960048036038101906103b49190613455565b610cc5565b005b3480156103c757600080fd5b506103e260048036038101906103dd9190613336565b610ce5565b6040516103ef919061343a565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a9190613653565b610d56565b005b34801561042d57600080fd5b50610436610e33565b604051610443919061322a565b60405180910390f35b34801561045857600080fd5b50610461610e4a565b60405161046e91906136bd565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190613336565b610e70565b6040516104ab91906133a4565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d691906133eb565b610f21565b005b3480156104e957600080fd5b5061050460048036038101906104ff91906136d8565b610ff2565b60405161051191906137c3565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c91906136d8565b6110a2565b60405161054e919061343a565b60405180910390f35b34801561056357600080fd5b5061056c611159565b60405161057991906132de565b60405180910390f35b34801561058e57600080fd5b506105976111eb565b005b3480156105a557600080fd5b506105ae611273565b005b3480156105bc57600080fd5b506105c5611340565b6040516105d291906133a4565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190613336565b61136a565b005b34801561061057600080fd5b50610619611437565b60405161062691906132de565b60405180910390f35b34801561063b57600080fd5b506106446114c9565b604051610651919061343a565b60405180910390f35b610674600480360381019061066f91906133eb565b6114d3565b005b34801561068257600080fd5b5061069d60048036038101906106989190613811565b61169e565b005b3480156106ab57600080fd5b506106c660048036038101906106c191906138f2565b6116b4565b005b3480156106d457600080fd5b506106ef60048036038101906106ea9190613336565b611716565b6040516106fc91906132de565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190613975565b6117c1565b604051610739919061322a565b60405180910390f35b34801561074e57600080fd5b50610769600480360381019061076491906139e1565b611855565b005b34801561077757600080fd5b50610792600480360381019061078d91906136d8565b61195c565b005b3480156107a057600080fd5b506107bb60048036038101906107b691906134de565b611a53565b6040516107c8919061322a565b60405180910390f35b60006107dc82611a82565b9050919050565b6060600080546107f290613a3d565b80601f016020809104026020016040519081016040528092919081815260200182805461081e90613a3d565b801561086b5780601f106108405761010080835404028352916020019161086b565b820191906000526020600020905b81548152906001019060200180831161084e57829003601f168201915b5050505050905090565b600061088082611afc565b6108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b690613ae0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061090582610e70565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096c90613b72565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610994611b68565b73ffffffffffffffffffffffffffffffffffffffff1614806109c357506109c2816109bd611b68565b6117c1565b5b610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f990613c04565b60405180910390fd5b610a0c8383611b70565b505050565b6000610a1d600d611c29565b905090565b610a33610a2d611b68565b82611c37565b610a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6990613c96565b60405180910390fd5b610a7d838383611d15565b505050565b604051602001610a9190613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613d94565b60405180910390fd5b610b4e8383611f7b565b505050565b6000610b5e836110a2565b8210610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9690613e26565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b604051602001610c0790613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb190613d94565b60405180910390fd5b610cc261202c565b50565b610ce0838383604051806020016040528060008152506116b4565b505050565b6000610cef6120ce565b8210610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790613eb8565b60405180910390fd5b60088281548110610d4457610d43613ed8565b5b90600052602060002001549050919050565b604051602001610d6590613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f90613d94565b60405180910390fd5b81600c9080519060200190610e2e9291906130d3565b505050565b6000600a60149054906101000a900460ff16905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90613f79565b60405180910390fd5b80915050919050565b604051602001610f3090613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda90613d94565b60405180910390fd5b610fed83836120db565b505050565b60606000610fff836110a2565b67ffffffffffffffff81111561101857611017613528565b5b6040519080825280602002602001820160405280156110465781602001602082028036833780820191505090505b50905060005b611055846110a2565b811015611098576110668482610b53565b82828151811061107957611078613ed8565b5b602002602001018181525050808061109090613fc8565b91505061104c565b8192505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110990614082565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600c805461116890613a3d565b80601f016020809104026020016040519081016040528092919081815260200182805461119490613a3d565b80156111e15780601f106111b6576101008083540402835291602001916111e1565b820191906000526020600020905b8154815290600101906020018083116111c457829003601f168201915b5050505050905090565b6111f3611b68565b73ffffffffffffffffffffffffffffffffffffffff16611211611340565b73ffffffffffffffffffffffffffffffffffffffff1614611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e906140ee565b60405180910390fd5b611271600061212c565b565b60405160200161128290613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c90613d94565b60405180910390fd5b61133d6121f2565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60405160200161137990613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142390613d94565b60405180910390fd5b81600b819055505050565b60606001805461144690613a3d565b80601f016020809104026020016040519081016040528092919081815260200182805461147290613a3d565b80156114bf5780601f10611494576101008083540402835291602001916114bf565b820191906000526020600020905b8154815290600101906020018083116114a257829003601f168201915b5050505050905090565b6000600b54905090565b6114db610e33565b1561151b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115129061415a565b60405180910390fd5b60405160200161152a906141c6565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d490613d94565b60405180910390fd5b816115e66114c9565b6115f091906141db565b341015611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990614281565b60405180910390fd5b61163c83836120db565b611699826116486114c9565b61165291906141db565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661229590919063ffffffff16565b505050565b6116b06116a9611b68565b8383612389565b5050565b6116c56116bf611b68565b83611c37565b611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb90613c96565b60405180910390fd5b611710848484846124f5565b50505050565b6060611722600d611c29565b821115611764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175b90614313565b60405180910390fd5b600061176e612551565b9050600081511161178e57604051806020016040528060008152506117b9565b80611798846125e3565b6040516020016117a9929190614364565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60405160200161186490613d0d565b60405160208183030381529060405280519060200120600f600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90613d94565b60405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b611964611b68565b73ffffffffffffffffffffffffffffffffffffffff16611982611340565b73ffffffffffffffffffffffffffffffffffffffff16146119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cf906140ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e906143fa565b60405180910390fd5b611a508161212c565b50565b600f6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611af55750611af482612743565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be383610e70565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611c4282611afc565b611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c789061448c565b60405180910390fd5b6000611c8c83610e70565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cfb57508373ffffffffffffffffffffffffffffffffffffffff16611ce384610875565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d0c5750611d0b81856117c1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d3582610e70565b73ffffffffffffffffffffffffffffffffffffffff1614611d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d829061451e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df1906145b0565b60405180910390fd5b611e05838383612825565b611e10600082611b70565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e6091906145d0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb79190614604565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f76838383612835565b505050565b6001600f600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff16827f5a06360d65acf95e98445dc834f205063424c636e65418d928cdfabc33a9539960405160405180910390a35050565b612034610e33565b612073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206a906146a6565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6120b7611b68565b6040516120c491906133a4565b60405180910390a1565b6000600880549050905090565b60006120e7600d611c29565b905060005b82811015612126576121098482846121049190614604565b61283a565b612113600d612858565b808061211e90613fc8565b9150506120ec565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121fa610e33565b1561223a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122319061415a565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861227e611b68565b60405161228b91906133a4565b60405180910390a1565b804710156122d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cf90614712565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516122fe90614763565b60006040518083038185875af1925050503d806000811461233b576040519150601f19603f3d011682016040523d82523d6000602084013e612340565b606091505b5050905080612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237b906147ea565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ee90614856565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124e8919061322a565b60405180910390a3505050565b612500848484611d15565b61250c8484848461286e565b61254b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612542906148e8565b60405180910390fd5b50505050565b6060600c805461256090613a3d565b80601f016020809104026020016040519081016040528092919081815260200182805461258c90613a3d565b80156125d95780601f106125ae576101008083540402835291602001916125d9565b820191906000526020600020905b8154815290600101906020018083116125bc57829003601f168201915b5050505050905090565b60606000820361262a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061273e565b600082905060005b6000821461265c57808061264590613fc8565b915050600a826126559190614937565b9150612632565b60008167ffffffffffffffff81111561267857612677613528565b5b6040519080825280601f01601f1916602001820160405280156126aa5781602001600182028036833780820191505090505b5090505b60008514612737576001826126c391906145d0565b9150600a856126d29190614968565b60306126de9190614604565b60f81b8183815181106126f4576126f3613ed8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127309190614937565b94506126ae565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061280e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061281e575061281d826129f5565b5b9050919050565b612830838383612a5f565b505050565b505050565b612854828260405180602001604052806000815250612b71565b5050565b6001816000016000828254019250508190555050565b600061288f8473ffffffffffffffffffffffffffffffffffffffff16612bcc565b156129e8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128b8611b68565b8786866040518563ffffffff1660e01b81526004016128da94939291906149ee565b6020604051808303816000875af192505050801561291657506040513d601f19601f820116820180604052508101906129139190614a4f565b60015b612998573d8060008114612946576040519150601f19603f3d011682016040523d82523d6000602084013e61294b565b606091505b506000815103612990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612987906148e8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129ed565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a6a838383612bef565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612aac57612aa781612bf4565b612aeb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612aea57612ae98382612c3d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b2d57612b2881612daa565b612b6c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b6b57612b6a8282612e7b565b5b5b505050565b612b7b8383612efa565b612b88600084848461286e565b612bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbe906148e8565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c4a846110a2565b612c5491906145d0565b9050600060076000848152602001908152602001600020549050818114612d39576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612dbe91906145d0565b9050600060096000848152602001908152602001600020549050600060088381548110612dee57612ded613ed8565b5b906000526020600020015490508060088381548110612e1057612e0f613ed8565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e5f57612e5e614a7c565b5b6001900381819060005260206000200160009055905550505050565b6000612e86836110a2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6090614af7565b60405180910390fd5b612f7281611afc565b15612fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa990614b63565b60405180910390fd5b612fbe60008383612825565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461300e9190614604565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130cf60008383612835565b5050565b8280546130df90613a3d565b90600052602060002090601f0160209004810192826131015760008555613148565b82601f1061311a57805160ff1916838001178555613148565b82800160010185558215613148579182015b8281111561314757825182559160200191906001019061312c565b5b5090506131559190613159565b5090565b5b8082111561317257600081600090555060010161315a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131bf8161318a565b81146131ca57600080fd5b50565b6000813590506131dc816131b6565b92915050565b6000602082840312156131f8576131f7613180565b5b6000613206848285016131cd565b91505092915050565b60008115159050919050565b6132248161320f565b82525050565b600060208201905061323f600083018461321b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561327f578082015181840152602081019050613264565b8381111561328e576000848401525b50505050565b6000601f19601f8301169050919050565b60006132b082613245565b6132ba8185613250565b93506132ca818560208601613261565b6132d381613294565b840191505092915050565b600060208201905081810360008301526132f881846132a5565b905092915050565b6000819050919050565b61331381613300565b811461331e57600080fd5b50565b6000813590506133308161330a565b92915050565b60006020828403121561334c5761334b613180565b5b600061335a84828501613321565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061338e82613363565b9050919050565b61339e81613383565b82525050565b60006020820190506133b96000830184613395565b92915050565b6133c881613383565b81146133d357600080fd5b50565b6000813590506133e5816133bf565b92915050565b6000806040838503121561340257613401613180565b5b6000613410858286016133d6565b925050602061342185828601613321565b9150509250929050565b61343481613300565b82525050565b600060208201905061344f600083018461342b565b92915050565b60008060006060848603121561346e5761346d613180565b5b600061347c868287016133d6565b935050602061348d868287016133d6565b925050604061349e86828701613321565b9150509250925092565b6000819050919050565b6134bb816134a8565b81146134c657600080fd5b50565b6000813590506134d8816134b2565b92915050565b600080604083850312156134f5576134f4613180565b5b6000613503858286016134c9565b9250506020613514858286016133d6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61356082613294565b810181811067ffffffffffffffff8211171561357f5761357e613528565b5b80604052505050565b6000613592613176565b905061359e8282613557565b919050565b600067ffffffffffffffff8211156135be576135bd613528565b5b6135c782613294565b9050602081019050919050565b82818337600083830152505050565b60006135f66135f1846135a3565b613588565b90508281526020810184848401111561361257613611613523565b5b61361d8482856135d4565b509392505050565b600082601f83011261363a5761363961351e565b5b813561364a8482602086016135e3565b91505092915050565b60006020828403121561366957613668613180565b5b600082013567ffffffffffffffff81111561368757613686613185565b5b61369384828501613625565b91505092915050565b60006136a782613363565b9050919050565b6136b78161369c565b82525050565b60006020820190506136d260008301846136ae565b92915050565b6000602082840312156136ee576136ed613180565b5b60006136fc848285016133d6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61373a81613300565b82525050565b600061374c8383613731565b60208301905092915050565b6000602082019050919050565b600061377082613705565b61377a8185613710565b935061378583613721565b8060005b838110156137b657815161379d8882613740565b97506137a883613758565b925050600181019050613789565b5085935050505092915050565b600060208201905081810360008301526137dd8184613765565b905092915050565b6137ee8161320f565b81146137f957600080fd5b50565b60008135905061380b816137e5565b92915050565b6000806040838503121561382857613827613180565b5b6000613836858286016133d6565b9250506020613847858286016137fc565b9150509250929050565b600067ffffffffffffffff82111561386c5761386b613528565b5b61387582613294565b9050602081019050919050565b600061389561389084613851565b613588565b9050828152602081018484840111156138b1576138b0613523565b5b6138bc8482856135d4565b509392505050565b600082601f8301126138d9576138d861351e565b5b81356138e9848260208601613882565b91505092915050565b6000806000806080858703121561390c5761390b613180565b5b600061391a878288016133d6565b945050602061392b878288016133d6565b935050604061393c87828801613321565b925050606085013567ffffffffffffffff81111561395d5761395c613185565b5b613969878288016138c4565b91505092959194509250565b6000806040838503121561398c5761398b613180565b5b600061399a858286016133d6565b92505060206139ab858286016133d6565b9150509250929050565b6139be8161369c565b81146139c957600080fd5b50565b6000813590506139db816139b5565b92915050565b6000602082840312156139f7576139f6613180565b5b6000613a05848285016139cc565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a5557607f821691505b602082108103613a6857613a67613a0e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613aca602c83613250565b9150613ad582613a6e565b604082019050919050565b60006020820190508181036000830152613af981613abd565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b5c602183613250565b9150613b6782613b00565b604082019050919050565b60006020820190508181036000830152613b8b81613b4f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613bee603883613250565b9150613bf982613b92565b604082019050919050565b60006020820190508181036000830152613c1d81613be1565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613c80603183613250565b9150613c8b82613c24565b604082019050919050565b60006020820190508181036000830152613caf81613c73565b9050919050565b600081905092915050565b7f41444d494e000000000000000000000000000000000000000000000000000000600082015250565b6000613cf7600583613cb6565b9150613d0282613cc1565b600582019050919050565b6000613d1882613cea565b9150819050919050565b7f4f6e6c7920646566696e656420726f6c652063616e20706572666f726d20746860008201527f6973206f7065726174696f6e2e00000000000000000000000000000000000000602082015250565b6000613d7e602d83613250565b9150613d8982613d22565b604082019050919050565b60006020820190508181036000830152613dad81613d71565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613e10602b83613250565b9150613e1b82613db4565b604082019050919050565b60006020820190508181036000830152613e3f81613e03565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613ea2602c83613250565b9150613ead82613e46565b604082019050919050565b60006020820190508181036000830152613ed181613e95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613f63602983613250565b9150613f6e82613f07565b604082019050919050565b60006020820190508181036000830152613f9281613f56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fd382613300565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361400557614004613f99565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061406c602a83613250565b915061407782614010565b604082019050919050565b6000602082019050818103600083015261409b8161405f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006140d8602083613250565b91506140e3826140a2565b602082019050919050565b60006020820190508181036000830152614107816140cb565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614144601083613250565b915061414f8261410e565b602082019050919050565b6000602082019050818103600083015261417381614137565b9050919050565b7f4558454300000000000000000000000000000000000000000000000000000000600082015250565b60006141b0600483613cb6565b91506141bb8261417a565b600482019050919050565b60006141d1826141a3565b9150819050919050565b60006141e682613300565b91506141f183613300565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422a57614229613f99565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b600061426b601f83613250565b915061427682614235565b602082019050919050565b6000602082019050818103600083015261429a8161425e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142fd602f83613250565b9150614308826142a1565b604082019050919050565b6000602082019050818103600083015261432c816142f0565b9050919050565b600061433e82613245565b6143488185613cb6565b9350614358818560208601613261565b80840191505092915050565b60006143708285614333565b915061437c8284614333565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143e4602683613250565b91506143ef82614388565b604082019050919050565b60006020820190508181036000830152614413816143d7565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614476602c83613250565b91506144818261441a565b604082019050919050565b600060208201905081810360008301526144a581614469565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614508602583613250565b9150614513826144ac565b604082019050919050565b60006020820190508181036000830152614537816144fb565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061459a602483613250565b91506145a58261453e565b604082019050919050565b600060208201905081810360008301526145c98161458d565b9050919050565b60006145db82613300565b91506145e683613300565b9250828210156145f9576145f8613f99565b5b828203905092915050565b600061460f82613300565b915061461a83613300565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561464f5761464e613f99565b5b828201905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614690601483613250565b915061469b8261465a565b602082019050919050565b600060208201905081810360008301526146bf81614683565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006146fc601d83613250565b9150614707826146c6565b602082019050919050565b6000602082019050818103600083015261472b816146ef565b9050919050565b600081905092915050565b50565b600061474d600083614732565b91506147588261473d565b600082019050919050565b600061476e82614740565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006147d4603a83613250565b91506147df82614778565b604082019050919050565b60006020820190508181036000830152614803816147c7565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614840601983613250565b915061484b8261480a565b602082019050919050565b6000602082019050818103600083015261486f81614833565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006148d2603283613250565b91506148dd82614876565b604082019050919050565b60006020820190508181036000830152614901816148c5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061494282613300565b915061494d83613300565b92508261495d5761495c614908565b5b828204905092915050565b600061497382613300565b915061497e83613300565b92508261498e5761498d614908565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006149c082614999565b6149ca81856149a4565b93506149da818560208601613261565b6149e381613294565b840191505092915050565b6000608082019050614a036000830187613395565b614a106020830186613395565b614a1d604083018561342b565b8181036060830152614a2f81846149b5565b905095945050505050565b600081519050614a49816131b6565b92915050565b600060208284031215614a6557614a64613180565b5b6000614a7384828501614a3a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ae1602083613250565b9150614aec82614aab565b602082019050919050565b60006020820190508181036000830152614b1081614ad4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b4d601c83613250565b9150614b5882614b17565b602082019050919050565b60006020820190508181036000830152614b7c81614b40565b905091905056fea2646970667358221220384d8f149f4aadd7e088864fa6c4ac0025b8f8b4f2413cceedfb07678eb2450f64736f6c634300080e0033

Deployed Bytecode Sourcemap

48412:4193:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51410:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28113:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29672:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29195:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50617:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30422:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52106:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42510:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50536:73;;;;;;;;;;;;;:::i;:::-;;30832:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43032:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51183:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14794:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48738:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27807:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49713:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52237:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27537:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51084:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12905:103;;;;;;;;;;;;;:::i;:::-;;50459:69;;;;;;;;;;;;;:::i;:::-;;12254:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50349:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28282:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50246:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49423:276;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29965:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31088:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50734:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30191:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50116:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13163:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48986:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51410:177;51520:4;51543:36;51567:11;51543:23;:36::i;:::-;51536:43;;51410:177;;;:::o;28113:100::-;28167:13;28200:5;28193:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28113:100;:::o;29672:221::-;29748:7;29776:16;29784:7;29776;:16::i;:::-;29768:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29861:15;:24;29877:7;29861:24;;;;;;;;;;;;;;;;;;;;;29854:31;;29672:221;;;:::o;29195:411::-;29276:13;29292:23;29307:7;29292:14;:23::i;:::-;29276:39;;29340:5;29334:11;;:2;:11;;;29326:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29434:5;29418:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29443:37;29460:5;29467:12;:10;:12::i;:::-;29443:16;:37::i;:::-;29418:62;29396:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29577:21;29586:2;29590:7;29577:8;:21::i;:::-;29265:341;29195:411;;:::o;50617:109::-;50670:7;50697:21;:11;:19;:21::i;:::-;50690:28;;50617:109;:::o;30422:339::-;30617:41;30636:12;:10;:12::i;:::-;30650:7;30617:18;:41::i;:::-;30609:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30725:28;30735:4;30741:2;30745:7;30725:9;:28::i;:::-;30422:339;;;:::o;52106:123::-;49095:25;;;;;;;:::i;:::-;;;;;;;;;;;;;49085:36;;;;;;51845:5;:12;51851:5;51845:12;;;;;;;;;;;:24;51858:10;51845:24;;;;;;;;;;;;;;;;;;;;;;;;;51837:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;52194:27:::1;52205:5;52212:8;52194:10;:27::i;:::-;52106:123:::0;;;:::o;42510:256::-;42607:7;42643:23;42660:5;42643:16;:23::i;:::-;42635:5;:31;42627:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;42732:12;:19;42745:5;42732:19;;;;;;;;;;;;;;;:26;42752:5;42732:26;;;;;;;;;;;;42725:33;;42510:256;;;;:::o;50536:73::-;49095:25;;;;;;;:::i;:::-;;;;;;;;;;;;;49085:36;;;;;;51845:5;:12;51851:5;51845:12;;;;;;;;;;;:24;51858:10;51845:24;;;;;;;;;;;;;;;;;;;;;;;;;51837:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50591:10:::1;:8;:10::i;:::-;50536:73:::0;:::o;30832:185::-;30970:39;30987:4;30993:2;30997:7;30970:39;;;;;;;;;;;;:16;:39::i;:::-;30832:185;;;:::o;43032:233::-;43107:7;43143:30;:28;:30::i;:::-;43135:5;:38;43127:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43240:10;43251:5;43240:17;;;;;;;;:::i;:::-;;;;;;;;;;43233:24;;43032:233;;;:::o;51183:96::-;49095:25;;;;;;;:::i;:::-;;;;;;;;;;;;;49085:36;;;;;;51845:5;:12;51851:5;51845:12;;;;;;;;;;;:24;51858:10;51845:24;;;;;;;;;;;;;;;;;;;;;;;;;51837:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;51267:4:::1;51257:7;:14;;;;;;;;;;;;:::i;:::-;;51183:96:::0;;:::o;14794:86::-;14841:4;14865:7;;;;;;;;;;;14858:14;;14794:86;:::o;48738:31::-;;;;;;;;;;;;;:::o;27807:239::-;27879:7;27899:13;27915:7;:16;27923:7;27915:16;;;;;;;;;;;;;;;;;;;;;27899:32;;27967:1;27950:19;;:5;:19;;;27942:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28033:5;28026:12;;;27807:239;;;:::o;49713:120::-;49095:25;;;;;;;:::i;:::-;;;;;;;;;;;;;49085:36;;;;;;51845:5;:12;51851:5;51845:12;;;;;;;;;;;:24;51858:10;51845:24;;;;;;;;;;;;;;;;;;;;;;;;;51837:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;49800:25:::1;49814:2;49818:6;49800:13;:25::i;:::-;49713:120:::0;;;:::o;52237:363::-;52302:13;52328:28;52370:24;52387:6;52370:16;:24::i;:::-;52359:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52328:67;;52406:6;52425:134;52436:24;52453:6;52436:16;:24::i;:::-;52434:1;:26;52425:134;;;52500:47;52537:6;52545:1;52500:36;:47::i;:::-;52480:14;52495:1;52480:17;;;;;;;;:::i;:::-;;;;;;;:67;;;;;52461:3;;;;;:::i;:::-;;;;52425:134;;;52577:14;52569:23;;;;52237:363;;;:::o;27537:208::-;27609:7;27654:1;27637:19;;:5;:19;;;27629:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27721:9;:16;27731:5;27721:16;;;;;;;;;;;;;;;;27714:23;;27537:208;;;:::o;51084:91::-;51127:13;51160:7;51153:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51084:91;:::o;12905:103::-;12485:12;:10;:12::i;:::-;12474:23;;:7;:5;:7::i;:::-;:23;;;12466:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12970:30:::1;12997:1;12970:18;:30::i;:::-;12905:103::o:0;50459:69::-;49095:25;;;;;;;:::i;:::-;;;;;;;;;;;;;49085:36;;;;;;51845:5;:12;51851:5;51845:12;;;;;;;;;;;:24;51858:10;51845:24;;;;;;;;;;;;;;;;;;;;;;;;;51837:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50512:8:::1;:6;:8::i;:::-;50459:69:::0;:::o;12254:87::-;12300:7;12327:6;;;;;;;;;;;12320:13;;12254:87;:::o;50349:102::-;49095:25;;;;;;;:::i;:::-;;;;;;;;;;;;;49085:36;;;;;;51845:5;:12;51851:5;51845:12;;;;;;;;;;;:24;51858:10;51845:24;;;;;;;;;;;;;;;;;;;;;;;;;51837:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50435:8:::1;50419:13;:24;;;;50349:102:::0;;:::o;28282:104::-;28338:13;28371:7;28364:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28282:104;:::o;50246:89::-;50287:7;50314:13;;50307:20;;50246:89;:::o;49423:276::-;15120:8;:6;:8::i;:::-;15119:9;15111:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;49170:24:::1;;;;;;;:::i;:::-;;;;;;;;;;;;;49160:35;;;;;;51845:5;:12;51851:5;51845:12;;;;;;;;;;;:24;51858:10;51845:24;;;;;;;;;;;;;;;;;;;;;;;;;51837:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;49563:6:::2;49550:10;:8;:10::i;:::-;:19;;;;:::i;:::-;49537:9;:32;;49529:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;49616:25;49630:2;49634:6;49616:13;:25::i;:::-;49652:39;49684:6;49671:10;:8;:10::i;:::-;:19;;;;:::i;:::-;49652:8;;;;;;;;;;;:18;;;;:39;;;;:::i;:::-;15160:1:::1;49423:276:::0;;:::o;29965:155::-;30060:52;30079:12;:10;:12::i;:::-;30093:8;30103;30060:18;:52::i;:::-;29965:155;;:::o;31088:328::-;31263:41;31282:12;:10;:12::i;:::-;31296:7;31263:18;:41::i;:::-;31255:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31369:39;31383:4;31389:2;31393:7;31402:5;31369:13;:39::i;:::-;31088:328;;;;:::o;50734:342::-;50807:13;50851:21;:11;:19;:21::i;:::-;50840:7;:32;;50832:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;50934:17;50954:10;:8;:10::i;:::-;50934:30;;51011:1;50997:3;50991:17;:21;:77;;;;;;;;;;;;;;;;;51039:3;51044:18;:7;:16;:18::i;:::-;51022:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50991:77;50975:93;;;50734:342;;;:::o;30191:164::-;30288:4;30312:18;:25;30331:5;30312:25;;;;;;;;;;;;;;;:35;30338:8;30312:35;;;;;;;;;;;;;;;;;;;;;;;;;30305:42;;30191:164;;;;:::o;50116:116::-;49095:25;;;;;;;:::i;:::-;;;;;;;;;;;;;49085:36;;;;;;51845:5;:12;51851:5;51845:12;;;;;;;;;;;:24;51858:10;51845:24;;;;;;;;;;;;;;;;;;;;;;;;;51837:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50212:12:::1;50201:8;;:23;;;;;;;;;;;;;;;;;;50116:116:::0;;:::o;13163:201::-;12485:12;:10;:12::i;:::-;12474:23;;:7;:5;:7::i;:::-;:23;;;12466:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13272:1:::1;13252:22;;:8;:22;;::::0;13244:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;13328:28;13347:8;13328:18;:28::i;:::-;13163:201:::0;:::o;48986:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42202:224::-;42304:4;42343:35;42328:50;;;:11;:50;;;;:90;;;;42382:36;42406:11;42382:23;:36::i;:::-;42328:90;42321:97;;42202:224;;;:::o;32926:127::-;32991:4;33043:1;33015:30;;:7;:16;33023:7;33015:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33008:37;;32926:127;;;:::o;9340:98::-;9393:7;9420:10;9413:17;;9340:98;:::o;37072:174::-;37174:2;37147:15;:24;37163:7;37147:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37230:7;37226:2;37192:46;;37201:23;37216:7;37201:14;:23::i;:::-;37192:46;;;;;;;;;;;;37072:174;;:::o;16795:114::-;16860:7;16887;:14;;;16880:21;;16795:114;;;:::o;33220:348::-;33313:4;33338:16;33346:7;33338;:16::i;:::-;33330:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33414:13;33430:23;33445:7;33430:14;:23::i;:::-;33414:39;;33483:5;33472:16;;:7;:16;;;:51;;;;33516:7;33492:31;;:20;33504:7;33492:11;:20::i;:::-;:31;;;33472:51;:87;;;;33527:32;33544:5;33551:7;33527:16;:32::i;:::-;33472:87;33464:96;;;33220:348;;;;:::o;36329:625::-;36488:4;36461:31;;:23;36476:7;36461:14;:23::i;:::-;:31;;;36453:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;36567:1;36553:16;;:2;:16;;;36545:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36623:39;36644:4;36650:2;36654:7;36623:20;:39::i;:::-;36727:29;36744:1;36748:7;36727:8;:29::i;:::-;36788:1;36769:9;:15;36779:4;36769:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36817:1;36800:9;:13;36810:2;36800:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36848:2;36829:7;:16;36837:7;36829:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36887:7;36883:2;36868:27;;36877:4;36868:27;;;;;;;;;;;;36908:38;36928:4;36934:2;36938:7;36908:19;:38::i;:::-;36329:625;;;:::o;51947:151::-;52045:4;52020:5;:12;52026:5;52020:12;;;;;;;;;;;:22;52033:8;52020:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52081:8;52065:25;;52075:5;52065:25;;;;;;;;;;51947:151;;:::o;15853:120::-;15397:8;:6;:8::i;:::-;15389:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;15922:5:::1;15912:7;;:15;;;;;;;;;;;;;;;;;;15943:22;15952:12;:10;:12::i;:::-;15943:22;;;;;;:::i;:::-;;;;;;;;15853:120::o:0;42842:113::-;42903:7;42930:10;:17;;;;42923:24;;42842:113;:::o;49847:257::-;49917:20;49940:21;:11;:19;:21::i;:::-;49917:44;;49977:9;49972:125;49996:6;49992:1;:10;49972:125;;;50020:31;50030:2;50049:1;50034:12;:16;;;;:::i;:::-;50020:9;:31::i;:::-;50062:23;:11;:21;:23::i;:::-;50004:3;;;;;:::i;:::-;;;;49972:125;;;;49906:198;49847:257;;:::o;13524:191::-;13598:16;13617:6;;;;;;;;;;;13598:25;;13643:8;13634:6;;:17;;;;;;;;;;;;;;;;;;13698:8;13667:40;;13688:8;13667:40;;;;;;;;;;;;13587:128;13524:191;:::o;15594:118::-;15120:8;:6;:8::i;:::-;15119:9;15111:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;15664:4:::1;15654:7;;:14;;;;;;;;;;;;;;;;;;15684:20;15691:12;:10;:12::i;:::-;15684:20;;;;;;:::i;:::-;;;;;;;;15594:118::o:0;19826:317::-;19941:6;19916:21;:31;;19908:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19995:12;20013:9;:14;;20035:6;20013:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19994:52;;;20065:7;20057:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;19897:246;19826:317;;:::o;37388:315::-;37543:8;37534:17;;:5;:17;;;37526:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37630:8;37592:18;:25;37611:5;37592:25;;;;;;;;;;;;;;;:35;37618:8;37592:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37676:8;37654:41;;37669:5;37654:41;;;37686:8;37654:41;;;;;;:::i;:::-;;;;;;;;37388:315;;;:::o;32298:::-;32455:28;32465:4;32471:2;32475:7;32455:9;:28::i;:::-;32502:48;32525:4;32531:2;32535:7;32544:5;32502:22;:48::i;:::-;32494:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32298:315;;;;:::o;51287:115::-;51355:13;51387:7;51380:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51287:115;:::o;6958:723::-;7014:13;7244:1;7235:5;:10;7231:53;;7262:10;;;;;;;;;;;;;;;;;;;;;7231:53;7294:12;7309:5;7294:20;;7325:14;7350:78;7365:1;7357:4;:9;7350:78;;7383:8;;;;;:::i;:::-;;;;7414:2;7406:10;;;;;:::i;:::-;;;7350:78;;;7438:19;7470:6;7460:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7438:39;;7488:154;7504:1;7495:5;:10;7488:154;;7532:1;7522:11;;;;;:::i;:::-;;;7599:2;7591:5;:10;;;;:::i;:::-;7578:2;:24;;;;:::i;:::-;7565:39;;7548:6;7555;7548:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7628:2;7619:11;;;;;:::i;:::-;;;7488:154;;;7666:6;7652:21;;;;;6958:723;;;;:::o;27168:305::-;27270:4;27322:25;27307:40;;;:11;:40;;;;:105;;;;27379:33;27364:48;;;:11;:48;;;;27307:105;:158;;;;27429:36;27453:11;27429:23;:36::i;:::-;27307:158;27287:178;;27168:305;;;:::o;51595:192::-;51734:45;51761:4;51767:2;51771:7;51734:26;:45::i;:::-;51595:192;;;:::o;40150:125::-;;;;:::o;33910:110::-;33986:26;33996:2;34000:7;33986:26;;;;;;;;;;;;:9;:26::i;:::-;33910:110;;:::o;16917:127::-;17024:1;17006:7;:14;;;:19;;;;;;;;;;;16917:127;:::o;38268:799::-;38423:4;38444:15;:2;:13;;;:15::i;:::-;38440:620;;;38496:2;38480:36;;;38517:12;:10;:12::i;:::-;38531:4;38537:7;38546:5;38480:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38476:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38739:1;38722:6;:13;:18;38718:272;;38765:60;;;;;;;;;;:::i;:::-;;;;;;;;38718:272;38940:6;38934:13;38925:6;38921:2;38917:15;38910:38;38476:529;38613:41;;;38603:51;;;:6;:51;;;;38596:58;;;;;38440:620;39044:4;39037:11;;38268:799;;;;;;;:::o;6485:157::-;6570:4;6609:25;6594:40;;;:11;:40;;;;6587:47;;6485:157;;;:::o;43878:589::-;44022:45;44049:4;44055:2;44059:7;44022:26;:45::i;:::-;44100:1;44084:18;;:4;:18;;;44080:187;;44119:40;44151:7;44119:31;:40::i;:::-;44080:187;;;44189:2;44181:10;;:4;:10;;;44177:90;;44208:47;44241:4;44247:7;44208:32;:47::i;:::-;44177:90;44080:187;44295:1;44281:16;;:2;:16;;;44277:183;;44314:45;44351:7;44314:36;:45::i;:::-;44277:183;;;44387:4;44381:10;;:2;:10;;;44377:83;;44408:40;44436:2;44440:7;44408:27;:40::i;:::-;44377:83;44277:183;43878:589;;;:::o;34247:321::-;34377:18;34383:2;34387:7;34377:5;:18::i;:::-;34428:54;34459:1;34463:2;34467:7;34476:5;34428:22;:54::i;:::-;34406:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34247:321;;;:::o;18565:326::-;18625:4;18882:1;18860:7;:19;;;:23;18853:30;;18565:326;;;:::o;39639:126::-;;;;:::o;45190:164::-;45294:10;:17;;;;45267:15;:24;45283:7;45267:24;;;;;;;;;;;:44;;;;45322:10;45338:7;45322:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45190:164;:::o;45981:988::-;46247:22;46297:1;46272:22;46289:4;46272:16;:22::i;:::-;:26;;;;:::i;:::-;46247:51;;46309:18;46330:17;:26;46348:7;46330:26;;;;;;;;;;;;46309:47;;46477:14;46463:10;:28;46459:328;;46508:19;46530:12;:18;46543:4;46530:18;;;;;;;;;;;;;;;:34;46549:14;46530:34;;;;;;;;;;;;46508:56;;46614:11;46581:12;:18;46594:4;46581:18;;;;;;;;;;;;;;;:30;46600:10;46581:30;;;;;;;;;;;:44;;;;46731:10;46698:17;:30;46716:11;46698:30;;;;;;;;;;;:43;;;;46493:294;46459:328;46883:17;:26;46901:7;46883:26;;;;;;;;;;;46876:33;;;46927:12;:18;46940:4;46927:18;;;;;;;;;;;;;;;:34;46946:14;46927:34;;;;;;;;;;;46920:41;;;46062:907;;45981:988;;:::o;47264:1079::-;47517:22;47562:1;47542:10;:17;;;;:21;;;;:::i;:::-;47517:46;;47574:18;47595:15;:24;47611:7;47595:24;;;;;;;;;;;;47574:45;;47946:19;47968:10;47979:14;47968:26;;;;;;;;:::i;:::-;;;;;;;;;;47946:48;;48032:11;48007:10;48018;48007:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48143:10;48112:15;:28;48128:11;48112:28;;;;;;;;;;;:41;;;;48284:15;:24;48300:7;48284:24;;;;;;;;;;;48277:31;;;48319:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47335:1008;;;47264:1079;:::o;44768:221::-;44853:14;44870:20;44887:2;44870:16;:20::i;:::-;44853:37;;44928:7;44901:12;:16;44914:2;44901:16;;;;;;;;;;;;;;;:24;44918:6;44901:24;;;;;;;;;;;:34;;;;44975:6;44946:17;:26;44964:7;44946:26;;;;;;;;;;;:35;;;;44842:147;44768:221;;:::o;34904:439::-;34998:1;34984:16;;:2;:16;;;34976:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35057:16;35065:7;35057;:16::i;:::-;35056:17;35048:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35119:45;35148:1;35152:2;35156:7;35119:20;:45::i;:::-;35194:1;35177:9;:13;35187:2;35177:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35225:2;35206:7;:16;35214:7;35206:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35270:7;35266:2;35245:33;;35262:1;35245:33;;;;;;;;;;;;35291:44;35319:1;35323:2;35327:7;35291:19;:44::i;:::-;34904:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:122::-;6071:24;6089:5;6071:24;:::i;:::-;6064:5;6061:35;6051:63;;6110:1;6107;6100:12;6051:63;5998:122;:::o;6126:139::-;6172:5;6210:6;6197:20;6188:29;;6226:33;6253:5;6226:33;:::i;:::-;6126:139;;;;:::o;6271:474::-;6339:6;6347;6396:2;6384:9;6375:7;6371:23;6367:32;6364:119;;;6402:79;;:::i;:::-;6364:119;6522:1;6547:53;6592:7;6583:6;6572:9;6568:22;6547:53;:::i;:::-;6537:63;;6493:117;6649:2;6675:53;6720:7;6711:6;6700:9;6696:22;6675:53;:::i;:::-;6665:63;;6620:118;6271:474;;;;;:::o;6751:117::-;6860:1;6857;6850:12;6874:117;6983:1;6980;6973:12;6997:180;7045:77;7042:1;7035:88;7142:4;7139:1;7132:15;7166:4;7163:1;7156:15;7183:281;7266:27;7288:4;7266:27;:::i;:::-;7258:6;7254:40;7396:6;7384:10;7381:22;7360:18;7348:10;7345:34;7342:62;7339:88;;;7407:18;;:::i;:::-;7339:88;7447:10;7443:2;7436:22;7226:238;7183:281;;:::o;7470:129::-;7504:6;7531:20;;:::i;:::-;7521:30;;7560:33;7588:4;7580:6;7560:33;:::i;:::-;7470:129;;;:::o;7605:308::-;7667:4;7757:18;7749:6;7746:30;7743:56;;;7779:18;;:::i;:::-;7743:56;7817:29;7839:6;7817:29;:::i;:::-;7809:37;;7901:4;7895;7891:15;7883:23;;7605:308;;;:::o;7919:154::-;8003:6;7998:3;7993;7980:30;8065:1;8056:6;8051:3;8047:16;8040:27;7919:154;;;:::o;8079:412::-;8157:5;8182:66;8198:49;8240:6;8198:49;:::i;:::-;8182:66;:::i;:::-;8173:75;;8271:6;8264:5;8257:21;8309:4;8302:5;8298:16;8347:3;8338:6;8333:3;8329:16;8326:25;8323:112;;;8354:79;;:::i;:::-;8323:112;8444:41;8478:6;8473:3;8468;8444:41;:::i;:::-;8163:328;8079:412;;;;;:::o;8511:340::-;8567:5;8616:3;8609:4;8601:6;8597:17;8593:27;8583:122;;8624:79;;:::i;:::-;8583:122;8741:6;8728:20;8766:79;8841:3;8833:6;8826:4;8818:6;8814:17;8766:79;:::i;:::-;8757:88;;8573:278;8511:340;;;;:::o;8857:509::-;8926:6;8975:2;8963:9;8954:7;8950:23;8946:32;8943:119;;;8981:79;;:::i;:::-;8943:119;9129:1;9118:9;9114:17;9101:31;9159:18;9151:6;9148:30;9145:117;;;9181:79;;:::i;:::-;9145:117;9286:63;9341:7;9332:6;9321:9;9317:22;9286:63;:::i;:::-;9276:73;;9072:287;8857:509;;;;:::o;9372:104::-;9417:7;9446:24;9464:5;9446:24;:::i;:::-;9435:35;;9372:104;;;:::o;9482:142::-;9585:32;9611:5;9585:32;:::i;:::-;9580:3;9573:45;9482:142;;:::o;9630:254::-;9739:4;9777:2;9766:9;9762:18;9754:26;;9790:87;9874:1;9863:9;9859:17;9850:6;9790:87;:::i;:::-;9630:254;;;;:::o;9890:329::-;9949:6;9998:2;9986:9;9977:7;9973:23;9969:32;9966:119;;;10004:79;;:::i;:::-;9966:119;10124:1;10149:53;10194:7;10185:6;10174:9;10170:22;10149:53;:::i;:::-;10139:63;;10095:117;9890:329;;;;:::o;10225:114::-;10292:6;10326:5;10320:12;10310:22;;10225:114;;;:::o;10345:184::-;10444:11;10478:6;10473:3;10466:19;10518:4;10513:3;10509:14;10494:29;;10345:184;;;;:::o;10535:132::-;10602:4;10625:3;10617:11;;10655:4;10650:3;10646:14;10638:22;;10535:132;;;:::o;10673:108::-;10750:24;10768:5;10750:24;:::i;:::-;10745:3;10738:37;10673:108;;:::o;10787:179::-;10856:10;10877:46;10919:3;10911:6;10877:46;:::i;:::-;10955:4;10950:3;10946:14;10932:28;;10787:179;;;;:::o;10972:113::-;11042:4;11074;11069:3;11065:14;11057:22;;10972:113;;;:::o;11121:732::-;11240:3;11269:54;11317:5;11269:54;:::i;:::-;11339:86;11418:6;11413:3;11339:86;:::i;:::-;11332:93;;11449:56;11499:5;11449:56;:::i;:::-;11528:7;11559:1;11544:284;11569:6;11566:1;11563:13;11544:284;;;11645:6;11639:13;11672:63;11731:3;11716:13;11672:63;:::i;:::-;11665:70;;11758:60;11811:6;11758:60;:::i;:::-;11748:70;;11604:224;11591:1;11588;11584:9;11579:14;;11544:284;;;11548:14;11844:3;11837:10;;11245:608;;;11121:732;;;;:::o;11859:373::-;12002:4;12040:2;12029:9;12025:18;12017:26;;12089:9;12083:4;12079:20;12075:1;12064:9;12060:17;12053:47;12117:108;12220:4;12211:6;12117:108;:::i;:::-;12109:116;;11859:373;;;;:::o;12238:116::-;12308:21;12323:5;12308:21;:::i;:::-;12301:5;12298:32;12288:60;;12344:1;12341;12334:12;12288:60;12238:116;:::o;12360:133::-;12403:5;12441:6;12428:20;12419:29;;12457:30;12481:5;12457:30;:::i;:::-;12360:133;;;;:::o;12499:468::-;12564:6;12572;12621:2;12609:9;12600:7;12596:23;12592:32;12589:119;;;12627:79;;:::i;:::-;12589:119;12747:1;12772:53;12817:7;12808:6;12797:9;12793:22;12772:53;:::i;:::-;12762:63;;12718:117;12874:2;12900:50;12942:7;12933:6;12922:9;12918:22;12900:50;:::i;:::-;12890:60;;12845:115;12499:468;;;;;:::o;12973:307::-;13034:4;13124:18;13116:6;13113:30;13110:56;;;13146:18;;:::i;:::-;13110:56;13184:29;13206:6;13184:29;:::i;:::-;13176:37;;13268:4;13262;13258:15;13250:23;;12973:307;;;:::o;13286:410::-;13363:5;13388:65;13404:48;13445:6;13404:48;:::i;:::-;13388:65;:::i;:::-;13379:74;;13476:6;13469:5;13462:21;13514:4;13507:5;13503:16;13552:3;13543:6;13538:3;13534:16;13531:25;13528:112;;;13559:79;;:::i;:::-;13528:112;13649:41;13683:6;13678:3;13673;13649:41;:::i;:::-;13369:327;13286:410;;;;;:::o;13715:338::-;13770:5;13819:3;13812:4;13804:6;13800:17;13796:27;13786:122;;13827:79;;:::i;:::-;13786:122;13944:6;13931:20;13969:78;14043:3;14035:6;14028:4;14020:6;14016:17;13969:78;:::i;:::-;13960:87;;13776:277;13715:338;;;;:::o;14059:943::-;14154:6;14162;14170;14178;14227:3;14215:9;14206:7;14202:23;14198:33;14195:120;;;14234:79;;:::i;:::-;14195:120;14354:1;14379:53;14424:7;14415:6;14404:9;14400:22;14379:53;:::i;:::-;14369:63;;14325:117;14481:2;14507:53;14552:7;14543:6;14532:9;14528:22;14507:53;:::i;:::-;14497:63;;14452:118;14609:2;14635:53;14680:7;14671:6;14660:9;14656:22;14635:53;:::i;:::-;14625:63;;14580:118;14765:2;14754:9;14750:18;14737:32;14796:18;14788:6;14785:30;14782:117;;;14818:79;;:::i;:::-;14782:117;14923:62;14977:7;14968:6;14957:9;14953:22;14923:62;:::i;:::-;14913:72;;14708:287;14059:943;;;;;;;:::o;15008:474::-;15076:6;15084;15133:2;15121:9;15112:7;15108:23;15104:32;15101:119;;;15139:79;;:::i;:::-;15101:119;15259:1;15284:53;15329:7;15320:6;15309:9;15305:22;15284:53;:::i;:::-;15274:63;;15230:117;15386:2;15412:53;15457:7;15448:6;15437:9;15433:22;15412:53;:::i;:::-;15402:63;;15357:118;15008:474;;;;;:::o;15488:138::-;15569:32;15595:5;15569:32;:::i;:::-;15562:5;15559:43;15549:71;;15616:1;15613;15606:12;15549:71;15488:138;:::o;15632:155::-;15686:5;15724:6;15711:20;15702:29;;15740:41;15775:5;15740:41;:::i;:::-;15632:155;;;;:::o;15793:345::-;15860:6;15909:2;15897:9;15888:7;15884:23;15880:32;15877:119;;;15915:79;;:::i;:::-;15877:119;16035:1;16060:61;16113:7;16104:6;16093:9;16089:22;16060:61;:::i;:::-;16050:71;;16006:125;15793:345;;;;:::o;16144:180::-;16192:77;16189:1;16182:88;16289:4;16286:1;16279:15;16313:4;16310:1;16303:15;16330:320;16374:6;16411:1;16405:4;16401:12;16391:22;;16458:1;16452:4;16448:12;16479:18;16469:81;;16535:4;16527:6;16523:17;16513:27;;16469:81;16597:2;16589:6;16586:14;16566:18;16563:38;16560:84;;16616:18;;:::i;:::-;16560:84;16381:269;16330:320;;;:::o;16656:231::-;16796:34;16792:1;16784:6;16780:14;16773:58;16865:14;16860:2;16852:6;16848:15;16841:39;16656:231;:::o;16893:366::-;17035:3;17056:67;17120:2;17115:3;17056:67;:::i;:::-;17049:74;;17132:93;17221:3;17132:93;:::i;:::-;17250:2;17245:3;17241:12;17234:19;;16893:366;;;:::o;17265:419::-;17431:4;17469:2;17458:9;17454:18;17446:26;;17518:9;17512:4;17508:20;17504:1;17493:9;17489:17;17482:47;17546:131;17672:4;17546:131;:::i;:::-;17538:139;;17265:419;;;:::o;17690:220::-;17830:34;17826:1;17818:6;17814:14;17807:58;17899:3;17894:2;17886:6;17882:15;17875:28;17690:220;:::o;17916:366::-;18058:3;18079:67;18143:2;18138:3;18079:67;:::i;:::-;18072:74;;18155:93;18244:3;18155:93;:::i;:::-;18273:2;18268:3;18264:12;18257:19;;17916:366;;;:::o;18288:419::-;18454:4;18492:2;18481:9;18477:18;18469:26;;18541:9;18535:4;18531:20;18527:1;18516:9;18512:17;18505:47;18569:131;18695:4;18569:131;:::i;:::-;18561:139;;18288:419;;;:::o;18713:243::-;18853:34;18849:1;18841:6;18837:14;18830:58;18922:26;18917:2;18909:6;18905:15;18898:51;18713:243;:::o;18962:366::-;19104:3;19125:67;19189:2;19184:3;19125:67;:::i;:::-;19118:74;;19201:93;19290:3;19201:93;:::i;:::-;19319:2;19314:3;19310:12;19303:19;;18962:366;;;:::o;19334:419::-;19500:4;19538:2;19527:9;19523:18;19515:26;;19587:9;19581:4;19577:20;19573:1;19562:9;19558:17;19551:47;19615:131;19741:4;19615:131;:::i;:::-;19607:139;;19334:419;;;:::o;19759:236::-;19899:34;19895:1;19887:6;19883:14;19876:58;19968:19;19963:2;19955:6;19951:15;19944:44;19759:236;:::o;20001:366::-;20143:3;20164:67;20228:2;20223:3;20164:67;:::i;:::-;20157:74;;20240:93;20329:3;20240:93;:::i;:::-;20358:2;20353:3;20349:12;20342:19;;20001:366;;;:::o;20373:419::-;20539:4;20577:2;20566:9;20562:18;20554:26;;20626:9;20620:4;20616:20;20612:1;20601:9;20597:17;20590:47;20654:131;20780:4;20654:131;:::i;:::-;20646:139;;20373:419;;;:::o;20798:148::-;20900:11;20937:3;20922:18;;20798:148;;;;:::o;20952:155::-;21092:7;21088:1;21080:6;21076:14;21069:31;20952:155;:::o;21113:400::-;21273:3;21294:84;21376:1;21371:3;21294:84;:::i;:::-;21287:91;;21387:93;21476:3;21387:93;:::i;:::-;21505:1;21500:3;21496:11;21489:18;;21113:400;;;:::o;21519:381::-;21704:3;21726:148;21870:3;21726:148;:::i;:::-;21719:155;;21891:3;21884:10;;21519:381;;;:::o;21906:232::-;22046:34;22042:1;22034:6;22030:14;22023:58;22115:15;22110:2;22102:6;22098:15;22091:40;21906:232;:::o;22144:366::-;22286:3;22307:67;22371:2;22366:3;22307:67;:::i;:::-;22300:74;;22383:93;22472:3;22383:93;:::i;:::-;22501:2;22496:3;22492:12;22485:19;;22144:366;;;:::o;22516:419::-;22682:4;22720:2;22709:9;22705:18;22697:26;;22769:9;22763:4;22759:20;22755:1;22744:9;22740:17;22733:47;22797:131;22923:4;22797:131;:::i;:::-;22789:139;;22516:419;;;:::o;22941:230::-;23081:34;23077:1;23069:6;23065:14;23058:58;23150:13;23145:2;23137:6;23133:15;23126:38;22941:230;:::o;23177:366::-;23319:3;23340:67;23404:2;23399:3;23340:67;:::i;:::-;23333:74;;23416:93;23505:3;23416:93;:::i;:::-;23534:2;23529:3;23525:12;23518:19;;23177:366;;;:::o;23549:419::-;23715:4;23753:2;23742:9;23738:18;23730:26;;23802:9;23796:4;23792:20;23788:1;23777:9;23773:17;23766:47;23830:131;23956:4;23830:131;:::i;:::-;23822:139;;23549:419;;;:::o;23974:231::-;24114:34;24110:1;24102:6;24098:14;24091:58;24183:14;24178:2;24170:6;24166:15;24159:39;23974:231;:::o;24211:366::-;24353:3;24374:67;24438:2;24433:3;24374:67;:::i;:::-;24367:74;;24450:93;24539:3;24450:93;:::i;:::-;24568:2;24563:3;24559:12;24552:19;;24211:366;;;:::o;24583:419::-;24749:4;24787:2;24776:9;24772:18;24764:26;;24836:9;24830:4;24826:20;24822:1;24811:9;24807:17;24800:47;24864:131;24990:4;24864:131;:::i;:::-;24856:139;;24583:419;;;:::o;25008:180::-;25056:77;25053:1;25046:88;25153:4;25150:1;25143:15;25177:4;25174:1;25167:15;25194:228;25334:34;25330:1;25322:6;25318:14;25311:58;25403:11;25398:2;25390:6;25386:15;25379:36;25194:228;:::o;25428:366::-;25570:3;25591:67;25655:2;25650:3;25591:67;:::i;:::-;25584:74;;25667:93;25756:3;25667:93;:::i;:::-;25785:2;25780:3;25776:12;25769:19;;25428:366;;;:::o;25800:419::-;25966:4;26004:2;25993:9;25989:18;25981:26;;26053:9;26047:4;26043:20;26039:1;26028:9;26024:17;26017:47;26081:131;26207:4;26081:131;:::i;:::-;26073:139;;25800:419;;;:::o;26225:180::-;26273:77;26270:1;26263:88;26370:4;26367:1;26360:15;26394:4;26391:1;26384:15;26411:233;26450:3;26473:24;26491:5;26473:24;:::i;:::-;26464:33;;26519:66;26512:5;26509:77;26506:103;;26589:18;;:::i;:::-;26506:103;26636:1;26629:5;26625:13;26618:20;;26411:233;;;:::o;26650:229::-;26790:34;26786:1;26778:6;26774:14;26767:58;26859:12;26854:2;26846:6;26842:15;26835:37;26650:229;:::o;26885:366::-;27027:3;27048:67;27112:2;27107:3;27048:67;:::i;:::-;27041:74;;27124:93;27213:3;27124:93;:::i;:::-;27242:2;27237:3;27233:12;27226:19;;26885:366;;;:::o;27257:419::-;27423:4;27461:2;27450:9;27446:18;27438:26;;27510:9;27504:4;27500:20;27496:1;27485:9;27481:17;27474:47;27538:131;27664:4;27538:131;:::i;:::-;27530:139;;27257:419;;;:::o;27682:182::-;27822:34;27818:1;27810:6;27806:14;27799:58;27682:182;:::o;27870:366::-;28012:3;28033:67;28097:2;28092:3;28033:67;:::i;:::-;28026:74;;28109:93;28198:3;28109:93;:::i;:::-;28227:2;28222:3;28218:12;28211:19;;27870:366;;;:::o;28242:419::-;28408:4;28446:2;28435:9;28431:18;28423:26;;28495:9;28489:4;28485:20;28481:1;28470:9;28466:17;28459:47;28523:131;28649:4;28523:131;:::i;:::-;28515:139;;28242:419;;;:::o;28667:166::-;28807:18;28803:1;28795:6;28791:14;28784:42;28667:166;:::o;28839:366::-;28981:3;29002:67;29066:2;29061:3;29002:67;:::i;:::-;28995:74;;29078:93;29167:3;29078:93;:::i;:::-;29196:2;29191:3;29187:12;29180:19;;28839:366;;;:::o;29211:419::-;29377:4;29415:2;29404:9;29400:18;29392:26;;29464:9;29458:4;29454:20;29450:1;29439:9;29435:17;29428:47;29492:131;29618:4;29492:131;:::i;:::-;29484:139;;29211:419;;;:::o;29636:154::-;29776:6;29772:1;29764:6;29760:14;29753:30;29636:154;:::o;29796:400::-;29956:3;29977:84;30059:1;30054:3;29977:84;:::i;:::-;29970:91;;30070:93;30159:3;30070:93;:::i;:::-;30188:1;30183:3;30179:11;30172:18;;29796:400;;;:::o;30202:381::-;30387:3;30409:148;30553:3;30409:148;:::i;:::-;30402:155;;30574:3;30567:10;;30202:381;;;:::o;30589:348::-;30629:7;30652:20;30670:1;30652:20;:::i;:::-;30647:25;;30686:20;30704:1;30686:20;:::i;:::-;30681:25;;30874:1;30806:66;30802:74;30799:1;30796:81;30791:1;30784:9;30777:17;30773:105;30770:131;;;30881:18;;:::i;:::-;30770:131;30929:1;30926;30922:9;30911:20;;30589:348;;;;:::o;30943:181::-;31083:33;31079:1;31071:6;31067:14;31060:57;30943:181;:::o;31130:366::-;31272:3;31293:67;31357:2;31352:3;31293:67;:::i;:::-;31286:74;;31369:93;31458:3;31369:93;:::i;:::-;31487:2;31482:3;31478:12;31471:19;;31130:366;;;:::o;31502:419::-;31668:4;31706:2;31695:9;31691:18;31683:26;;31755:9;31749:4;31745:20;31741:1;31730:9;31726:17;31719:47;31783:131;31909:4;31783:131;:::i;:::-;31775:139;;31502:419;;;:::o;31927:234::-;32067:34;32063:1;32055:6;32051:14;32044:58;32136:17;32131:2;32123:6;32119:15;32112:42;31927:234;:::o;32167:366::-;32309:3;32330:67;32394:2;32389:3;32330:67;:::i;:::-;32323:74;;32406:93;32495:3;32406:93;:::i;:::-;32524:2;32519:3;32515:12;32508:19;;32167:366;;;:::o;32539:419::-;32705:4;32743:2;32732:9;32728:18;32720:26;;32792:9;32786:4;32782:20;32778:1;32767:9;32763:17;32756:47;32820:131;32946:4;32820:131;:::i;:::-;32812:139;;32539:419;;;:::o;32964:377::-;33070:3;33098:39;33131:5;33098:39;:::i;:::-;33153:89;33235:6;33230:3;33153:89;:::i;:::-;33146:96;;33251:52;33296:6;33291:3;33284:4;33277:5;33273:16;33251:52;:::i;:::-;33328:6;33323:3;33319:16;33312:23;;33074:267;32964:377;;;;:::o;33347:435::-;33527:3;33549:95;33640:3;33631:6;33549:95;:::i;:::-;33542:102;;33661:95;33752:3;33743:6;33661:95;:::i;:::-;33654:102;;33773:3;33766:10;;33347:435;;;;;:::o;33788:225::-;33928:34;33924:1;33916:6;33912:14;33905:58;33997:8;33992:2;33984:6;33980:15;33973:33;33788:225;:::o;34019:366::-;34161:3;34182:67;34246:2;34241:3;34182:67;:::i;:::-;34175:74;;34258:93;34347:3;34258:93;:::i;:::-;34376:2;34371:3;34367:12;34360:19;;34019:366;;;:::o;34391:419::-;34557:4;34595:2;34584:9;34580:18;34572:26;;34644:9;34638:4;34634:20;34630:1;34619:9;34615:17;34608:47;34672:131;34798:4;34672:131;:::i;:::-;34664:139;;34391:419;;;:::o;34816:231::-;34956:34;34952:1;34944:6;34940:14;34933:58;35025:14;35020:2;35012:6;35008:15;35001:39;34816:231;:::o;35053:366::-;35195:3;35216:67;35280:2;35275:3;35216:67;:::i;:::-;35209:74;;35292:93;35381:3;35292:93;:::i;:::-;35410:2;35405:3;35401:12;35394:19;;35053:366;;;:::o;35425:419::-;35591:4;35629:2;35618:9;35614:18;35606:26;;35678:9;35672:4;35668:20;35664:1;35653:9;35649:17;35642:47;35706:131;35832:4;35706:131;:::i;:::-;35698:139;;35425:419;;;:::o;35850:224::-;35990:34;35986:1;35978:6;35974:14;35967:58;36059:7;36054:2;36046:6;36042:15;36035:32;35850:224;:::o;36080:366::-;36222:3;36243:67;36307:2;36302:3;36243:67;:::i;:::-;36236:74;;36319:93;36408:3;36319:93;:::i;:::-;36437:2;36432:3;36428:12;36421:19;;36080:366;;;:::o;36452:419::-;36618:4;36656:2;36645:9;36641:18;36633:26;;36705:9;36699:4;36695:20;36691:1;36680:9;36676:17;36669:47;36733:131;36859:4;36733:131;:::i;:::-;36725:139;;36452:419;;;:::o;36877:223::-;37017:34;37013:1;37005:6;37001:14;36994:58;37086:6;37081:2;37073:6;37069:15;37062:31;36877:223;:::o;37106:366::-;37248:3;37269:67;37333:2;37328:3;37269:67;:::i;:::-;37262:74;;37345:93;37434:3;37345:93;:::i;:::-;37463:2;37458:3;37454:12;37447:19;;37106:366;;;:::o;37478:419::-;37644:4;37682:2;37671:9;37667:18;37659:26;;37731:9;37725:4;37721:20;37717:1;37706:9;37702:17;37695:47;37759:131;37885:4;37759:131;:::i;:::-;37751:139;;37478:419;;;:::o;37903:191::-;37943:4;37963:20;37981:1;37963:20;:::i;:::-;37958:25;;37997:20;38015:1;37997:20;:::i;:::-;37992:25;;38036:1;38033;38030:8;38027:34;;;38041:18;;:::i;:::-;38027:34;38086:1;38083;38079:9;38071:17;;37903:191;;;;:::o;38100:305::-;38140:3;38159:20;38177:1;38159:20;:::i;:::-;38154:25;;38193:20;38211:1;38193:20;:::i;:::-;38188:25;;38347:1;38279:66;38275:74;38272:1;38269:81;38266:107;;;38353:18;;:::i;:::-;38266:107;38397:1;38394;38390:9;38383:16;;38100:305;;;;:::o;38411:170::-;38551:22;38547:1;38539:6;38535:14;38528:46;38411:170;:::o;38587:366::-;38729:3;38750:67;38814:2;38809:3;38750:67;:::i;:::-;38743:74;;38826:93;38915:3;38826:93;:::i;:::-;38944:2;38939:3;38935:12;38928:19;;38587:366;;;:::o;38959:419::-;39125:4;39163:2;39152:9;39148:18;39140:26;;39212:9;39206:4;39202:20;39198:1;39187:9;39183:17;39176:47;39240:131;39366:4;39240:131;:::i;:::-;39232:139;;38959:419;;;:::o;39384:179::-;39524:31;39520:1;39512:6;39508:14;39501:55;39384:179;:::o;39569:366::-;39711:3;39732:67;39796:2;39791:3;39732:67;:::i;:::-;39725:74;;39808:93;39897:3;39808:93;:::i;:::-;39926:2;39921:3;39917:12;39910:19;;39569:366;;;:::o;39941:419::-;40107:4;40145:2;40134:9;40130:18;40122:26;;40194:9;40188:4;40184:20;40180:1;40169:9;40165:17;40158:47;40222:131;40348:4;40222:131;:::i;:::-;40214:139;;39941:419;;;:::o;40366:147::-;40467:11;40504:3;40489:18;;40366:147;;;;:::o;40519:114::-;;:::o;40639:398::-;40798:3;40819:83;40900:1;40895:3;40819:83;:::i;:::-;40812:90;;40911:93;41000:3;40911:93;:::i;:::-;41029:1;41024:3;41020:11;41013:18;;40639:398;;;:::o;41043:379::-;41227:3;41249:147;41392:3;41249:147;:::i;:::-;41242:154;;41413:3;41406:10;;41043:379;;;:::o;41428:245::-;41568:34;41564:1;41556:6;41552:14;41545:58;41637:28;41632:2;41624:6;41620:15;41613:53;41428:245;:::o;41679:366::-;41821:3;41842:67;41906:2;41901:3;41842:67;:::i;:::-;41835:74;;41918:93;42007:3;41918:93;:::i;:::-;42036:2;42031:3;42027:12;42020:19;;41679:366;;;:::o;42051:419::-;42217:4;42255:2;42244:9;42240:18;42232:26;;42304:9;42298:4;42294:20;42290:1;42279:9;42275:17;42268:47;42332:131;42458:4;42332:131;:::i;:::-;42324:139;;42051:419;;;:::o;42476:175::-;42616:27;42612:1;42604:6;42600:14;42593:51;42476:175;:::o;42657:366::-;42799:3;42820:67;42884:2;42879:3;42820:67;:::i;:::-;42813:74;;42896:93;42985:3;42896:93;:::i;:::-;43014:2;43009:3;43005:12;42998:19;;42657:366;;;:::o;43029:419::-;43195:4;43233:2;43222:9;43218:18;43210:26;;43282:9;43276:4;43272:20;43268:1;43257:9;43253:17;43246:47;43310:131;43436:4;43310:131;:::i;:::-;43302:139;;43029:419;;;:::o;43454:237::-;43594:34;43590:1;43582:6;43578:14;43571:58;43663:20;43658:2;43650:6;43646:15;43639:45;43454:237;:::o;43697:366::-;43839:3;43860:67;43924:2;43919:3;43860:67;:::i;:::-;43853:74;;43936:93;44025:3;43936:93;:::i;:::-;44054:2;44049:3;44045:12;44038:19;;43697:366;;;:::o;44069:419::-;44235:4;44273:2;44262:9;44258:18;44250:26;;44322:9;44316:4;44312:20;44308:1;44297:9;44293:17;44286:47;44350:131;44476:4;44350:131;:::i;:::-;44342:139;;44069:419;;;:::o;44494:180::-;44542:77;44539:1;44532:88;44639:4;44636:1;44629:15;44663:4;44660:1;44653:15;44680:185;44720:1;44737:20;44755:1;44737:20;:::i;:::-;44732:25;;44771:20;44789:1;44771:20;:::i;:::-;44766:25;;44810:1;44800:35;;44815:18;;:::i;:::-;44800:35;44857:1;44854;44850:9;44845:14;;44680:185;;;;:::o;44871:176::-;44903:1;44920:20;44938:1;44920:20;:::i;:::-;44915:25;;44954:20;44972:1;44954:20;:::i;:::-;44949:25;;44993:1;44983:35;;44998:18;;:::i;:::-;44983:35;45039:1;45036;45032:9;45027:14;;44871:176;;;;:::o;45053:98::-;45104:6;45138:5;45132:12;45122:22;;45053:98;;;:::o;45157:168::-;45240:11;45274:6;45269:3;45262:19;45314:4;45309:3;45305:14;45290:29;;45157:168;;;;:::o;45331:360::-;45417:3;45445:38;45477:5;45445:38;:::i;:::-;45499:70;45562:6;45557:3;45499:70;:::i;:::-;45492:77;;45578:52;45623:6;45618:3;45611:4;45604:5;45600:16;45578:52;:::i;:::-;45655:29;45677:6;45655:29;:::i;:::-;45650:3;45646:39;45639:46;;45421:270;45331:360;;;;:::o;45697:640::-;45892:4;45930:3;45919:9;45915:19;45907:27;;45944:71;46012:1;46001:9;45997:17;45988:6;45944:71;:::i;:::-;46025:72;46093:2;46082:9;46078:18;46069:6;46025:72;:::i;:::-;46107;46175:2;46164:9;46160:18;46151:6;46107:72;:::i;:::-;46226:9;46220:4;46216:20;46211:2;46200:9;46196:18;46189:48;46254:76;46325:4;46316:6;46254:76;:::i;:::-;46246:84;;45697:640;;;;;;;:::o;46343:141::-;46399:5;46430:6;46424:13;46415:22;;46446:32;46472:5;46446:32;:::i;:::-;46343:141;;;;:::o;46490:349::-;46559:6;46608:2;46596:9;46587:7;46583:23;46579:32;46576:119;;;46614:79;;:::i;:::-;46576:119;46734:1;46759:63;46814:7;46805:6;46794:9;46790:22;46759:63;:::i;:::-;46749:73;;46705:127;46490:349;;;;:::o;46845:180::-;46893:77;46890:1;46883:88;46990:4;46987:1;46980:15;47014:4;47011:1;47004:15;47031:182;47171:34;47167:1;47159:6;47155:14;47148:58;47031:182;:::o;47219:366::-;47361:3;47382:67;47446:2;47441:3;47382:67;:::i;:::-;47375:74;;47458:93;47547:3;47458:93;:::i;:::-;47576:2;47571:3;47567:12;47560:19;;47219:366;;;:::o;47591:419::-;47757:4;47795:2;47784:9;47780:18;47772:26;;47844:9;47838:4;47834:20;47830:1;47819:9;47815:17;47808:47;47872:131;47998:4;47872:131;:::i;:::-;47864:139;;47591:419;;;:::o;48016:178::-;48156:30;48152:1;48144:6;48140:14;48133:54;48016:178;:::o;48200:366::-;48342:3;48363:67;48427:2;48422:3;48363:67;:::i;:::-;48356:74;;48439:93;48528:3;48439:93;:::i;:::-;48557:2;48552:3;48548:12;48541:19;;48200:366;;;:::o;48572:419::-;48738:4;48776:2;48765:9;48761:18;48753:26;;48825:9;48819:4;48815:20;48811:1;48800:9;48796:17;48789:47;48853:131;48979:4;48853:131;:::i;:::-;48845:139;;48572:419;;;:::o

Swarm Source

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