ETH Price: $2,722.30 (+12.38%)
 

Overview

TokenID

2384

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-07
*/

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Counters.sol


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

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


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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits 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 {}
}

// File: contracts/xplodies.sol



//
/**
┏━┓┏━┳━━━┳┓╋╋┏━━━┳━━━┳━━┳━━━┳━━━┓
┗┓┗┛┏┫┏━┓┃┃╋╋┃┏━┓┣┓┏┓┣┫┣┫┏━━┫┏━┓┃
╋┗┓┏┛┃┗━┛┃┃╋╋┃┃╋┃┃┃┃┃┃┃┃┃┗━━┫┗━━┓
╋┏┛┗┓┃┏━━┫┃╋┏┫┃╋┃┃┃┃┃┃┃┃┃┏━━┻━━┓┃
┏┛┏┓┗┫┃╋╋┃┗━┛┃┗━┛┣┛┗┛┣┫┣┫┗━━┫┗━┛┃
┗━┛┗━┻┛╋╋┗━━━┻━━━┻━━━┻━━┻━━━┻━━━┛
WEN THE FUCK AM I GETTING MERCH?
*/

pragma solidity >=0.7.0 <0.9.0;




contract xplodies is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "";
  string public uriSuffix = ".json";
  string public hiddenMetadataUri;
  
  uint256 public cost = 0.0005 ether;
  uint256 public maxSupply = 3333;
  uint256 public maxMintAmountPerTx = 10;

  bool public paused = true;
  bool public revealed = false;

  constructor() ERC721("XPLODIES", "XPLD") {
    setHiddenMetadataUri("ipfs://QmW3UtLeREnipuNfqGMBV1jArtrAP4Cx9z531iP4fFmrqE/hidden.json");
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Wow!");
    require(supply.current() + _mintAmount <= maxSupply, "Sold out!");
    _;
  }

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

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "Smoke break, come back later!");
    require(msg.value >= cost * _mintAmount, "You're eth poor homie!");

    _mintLoop(msg.sender, _mintAmount);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _mintLoop(_receiver, _mintAmount);
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    if (revealed == false) {
      return hiddenMetadataUri;
    }

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

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

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

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function withdraw() public onlyOwner {
    // This will transfer the remaining contract balance to the owner.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    (bool os, ) = payable(0x09385f235280839b0f9f71cAf4A2519d0556eE57).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

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

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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","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":[],"name":"cost","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":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","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":"_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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600890805190602001906200002b92919062000367565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600990805190602001906200007992919062000367565b506601c6bf52634000600b55610d05600c55600a600d556001600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff021916908315150217905550348015620000d357600080fd5b506040518060400160405280600881526020017f58504c4f444945530000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f58504c440000000000000000000000000000000000000000000000000000000081525081600090805190602001906200015892919062000367565b5080600190805190602001906200017192919062000367565b5050506200019462000188620001c460201b60201c565b620001cc60201b60201c565b620001be60405180608001604052806041815260200162004717604191396200029260201b60201c565b620004ff565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a2620001c460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c86200033d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000318906200043e565b60405180910390fd5b80600a90805190602001906200033992919062000367565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003759062000471565b90600052602060002090601f016020900481019282620003995760008555620003e5565b82601f10620003b457805160ff1916838001178555620003e5565b82800160010185558215620003e5579182015b82811115620003e4578251825591602001919060010190620003c7565b5b509050620003f49190620003f8565b5090565b5b8082111562000413576000816000905550600101620003f9565b5090565b60006200042660208362000460565b91506200043382620004d6565b602082019050919050565b60006020820190508181036000830152620004598162000417565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200048a57607f821691505b60208210811415620004a157620004a0620004a7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614208806200050f6000396000f3fe60806040526004361061020f5760003560e01c80636352211e11610118578063a45ba8e7116100a0578063d5abeb011161006f578063d5abeb0114610768578063e0a8085314610793578063e985e9c5146107bc578063efbd73f4146107f9578063f2fde38b146108225761020f565b8063a45ba8e7146106ae578063b071401b146106d9578063b88d4fde14610702578063c87b56dd1461072b5761020f565b80638da5cb5b116100e75780638da5cb5b146105e857806394354fd01461061357806395d89b411461063e578063a0712d6814610669578063a22cb465146106855761020f565b80636352211e1461052e57806370a082311461056b578063715018a6146105a85780637ec4a659146105bf5761020f565b80633ccfd60b1161019b5780634fdd43cb1161016a5780634fdd43cb1461045957806351830227146104825780635503a0e8146104ad5780635c975abb146104d857806362b99ad4146105035761020f565b80633ccfd60b146103b357806342842e0e146103ca578063438b6300146103f357806344a0d68a146104305761020f565b806313faede6116101e257806313faede6146102e257806316ba10e01461030d57806316c38b3c1461033657806318160ddd1461035f57806323b872dd1461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612e32565b61084b565b60405161024891906134c4565b60405180910390f35b34801561025d57600080fd5b5061026661092d565b60405161027391906134df565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612ed5565b6109bf565b6040516102b0919061343b565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612dc5565b610a44565b005b3480156102ee57600080fd5b506102f7610b5c565b6040516103049190613781565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190612e8c565b610b62565b005b34801561034257600080fd5b5061035d60048036038101906103589190612e05565b610bf8565b005b34801561036b57600080fd5b50610374610c91565b6040516103819190613781565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac9190612caf565b610ca2565b005b3480156103bf57600080fd5b506103c8610d02565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190612caf565b610e0b565b005b3480156103ff57600080fd5b5061041a60048036038101906104159190612c42565b610e2b565b60405161042791906134a2565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190612ed5565b610f36565b005b34801561046557600080fd5b50610480600480360381019061047b9190612e8c565b610fbc565b005b34801561048e57600080fd5b50610497611052565b6040516104a491906134c4565b60405180910390f35b3480156104b957600080fd5b506104c2611065565b6040516104cf91906134df565b60405180910390f35b3480156104e457600080fd5b506104ed6110f3565b6040516104fa91906134c4565b60405180910390f35b34801561050f57600080fd5b50610518611106565b60405161052591906134df565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190612ed5565b611194565b604051610562919061343b565b60405180910390f35b34801561057757600080fd5b50610592600480360381019061058d9190612c42565b611246565b60405161059f9190613781565b60405180910390f35b3480156105b457600080fd5b506105bd6112fe565b005b3480156105cb57600080fd5b506105e660048036038101906105e19190612e8c565b611386565b005b3480156105f457600080fd5b506105fd61141c565b60405161060a919061343b565b60405180910390f35b34801561061f57600080fd5b50610628611446565b6040516106359190613781565b60405180910390f35b34801561064a57600080fd5b5061065361144c565b60405161066091906134df565b60405180910390f35b610683600480360381019061067e9190612ed5565b6114de565b005b34801561069157600080fd5b506106ac60048036038101906106a79190612d85565b611637565b005b3480156106ba57600080fd5b506106c361164d565b6040516106d091906134df565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190612ed5565b6116db565b005b34801561070e57600080fd5b5061072960048036038101906107249190612d02565b611761565b005b34801561073757600080fd5b50610752600480360381019061074d9190612ed5565b6117c3565b60405161075f91906134df565b60405180910390f35b34801561077457600080fd5b5061077d61191c565b60405161078a9190613781565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b59190612e05565b611922565b005b3480156107c857600080fd5b506107e360048036038101906107de9190612c6f565b6119bb565b6040516107f091906134c4565b60405180910390f35b34801561080557600080fd5b50610820600480360381019061081b9190612f02565b611a4f565b005b34801561082e57600080fd5b5061084960048036038101906108449190612c42565b611b85565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610926575061092582611c7d565b5b9050919050565b60606000805461093c90613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461096890613a8a565b80156109b55780601f1061098a576101008083540402835291602001916109b5565b820191906000526020600020905b81548152906001019060200180831161099857829003601f168201915b5050505050905090565b60006109ca82611ce7565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a00906136c1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4f82611194565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab790613721565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610adf611d53565b73ffffffffffffffffffffffffffffffffffffffff161480610b0e5750610b0d81610b08611d53565b6119bb565b5b610b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4490613621565b60405180910390fd5b610b578383611d5b565b505050565b600b5481565b610b6a611d53565b73ffffffffffffffffffffffffffffffffffffffff16610b8861141c565b73ffffffffffffffffffffffffffffffffffffffff1614610bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd5906136e1565b60405180910390fd5b8060099080519060200190610bf4929190612a56565b5050565b610c00611d53565b73ffffffffffffffffffffffffffffffffffffffff16610c1e61141c565b73ffffffffffffffffffffffffffffffffffffffff1614610c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6b906136e1565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6000610c9d6007611e14565b905090565b610cb3610cad611d53565b82611e22565b610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce990613741565b60405180910390fd5b610cfd838383611f00565b505050565b610d0a611d53565b73ffffffffffffffffffffffffffffffffffffffff16610d2861141c565b73ffffffffffffffffffffffffffffffffffffffff1614610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d75906136e1565b60405180910390fd5b60007309385f235280839b0f9f71caf4a2519d0556ee5773ffffffffffffffffffffffffffffffffffffffff1647604051610db890613426565b60006040518083038185875af1925050503d8060008114610df5576040519150601f19603f3d011682016040523d82523d6000602084013e610dfa565b606091505b5050905080610e0857600080fd5b50565b610e2683838360405180602001604052806000815250611761565b505050565b60606000610e3883611246565b905060008167ffffffffffffffff811115610e5657610e55613c23565b5b604051908082528060200260200182016040528015610e845781602001602082028036833780820191505090505b50905060006001905060005b8381108015610ea15750600c548211155b15610f2a576000610eb183611194565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f165782848381518110610efb57610efa613bf4565b5b6020026020010181815250508180610f1290613aed565b9250505b8280610f2190613aed565b93505050610e90565b82945050505050919050565b610f3e611d53565b73ffffffffffffffffffffffffffffffffffffffff16610f5c61141c565b73ffffffffffffffffffffffffffffffffffffffff1614610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa9906136e1565b60405180910390fd5b80600b8190555050565b610fc4611d53565b73ffffffffffffffffffffffffffffffffffffffff16610fe261141c565b73ffffffffffffffffffffffffffffffffffffffff1614611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f906136e1565b60405180910390fd5b80600a908051906020019061104e929190612a56565b5050565b600e60019054906101000a900460ff1681565b6009805461107290613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461109e90613a8a565b80156110eb5780601f106110c0576101008083540402835291602001916110eb565b820191906000526020600020905b8154815290600101906020018083116110ce57829003601f168201915b505050505081565b600e60009054906101000a900460ff1681565b6008805461111390613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461113f90613a8a565b801561118c5780601f106111615761010080835404028352916020019161118c565b820191906000526020600020905b81548152906001019060200180831161116f57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561123d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123490613661565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90613641565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611306611d53565b73ffffffffffffffffffffffffffffffffffffffff1661132461141c565b73ffffffffffffffffffffffffffffffffffffffff161461137a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611371906136e1565b60405180910390fd5b6113846000612167565b565b61138e611d53565b73ffffffffffffffffffffffffffffffffffffffff166113ac61141c565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f9906136e1565b60405180910390fd5b8060089080519060200190611418929190612a56565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b60606001805461145b90613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461148790613a8a565b80156114d45780601f106114a9576101008083540402835291602001916114d4565b820191906000526020600020905b8154815290600101906020018083116114b757829003601f168201915b5050505050905090565b806000811180156114f15750600d548111155b611530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152790613501565b60405180910390fd5b600c548161153e6007611e14565b61154891906138bf565b1115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090613761565b60405180910390fd5b600e60009054906101000a900460ff16156115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d0906135a1565b60405180910390fd5b81600b546115e79190613946565b341015611629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162090613681565b60405180910390fd5b611633338361222d565b5050565b611649611642611d53565b838361226d565b5050565b600a805461165a90613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461168690613a8a565b80156116d35780601f106116a8576101008083540402835291602001916116d3565b820191906000526020600020905b8154815290600101906020018083116116b657829003601f168201915b505050505081565b6116e3611d53565b73ffffffffffffffffffffffffffffffffffffffff1661170161141c565b73ffffffffffffffffffffffffffffffffffffffff1614611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e906136e1565b60405180910390fd5b80600d8190555050565b61177261176c611d53565b83611e22565b6117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a890613741565b60405180910390fd5b6117bd848484846123da565b50505050565b60606117ce82611ce7565b61180d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180490613701565b60405180910390fd5b60001515600e60019054906101000a900460ff16151514156118bb57600a805461183690613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461186290613a8a565b80156118af5780601f10611884576101008083540402835291602001916118af565b820191906000526020600020905b81548152906001019060200180831161189257829003601f168201915b50505050509050611917565b60006118c5612436565b905060008151116118e55760405180602001604052806000815250611913565b806118ef846124c8565b6009604051602001611903939291906133f5565b6040516020818303038152906040525b9150505b919050565b600c5481565b61192a611d53565b73ffffffffffffffffffffffffffffffffffffffff1661194861141c565b73ffffffffffffffffffffffffffffffffffffffff161461199e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611995906136e1565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611a625750600d548111155b611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890613501565b60405180910390fd5b600c5481611aaf6007611e14565b611ab991906138bf565b1115611afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af190613761565b60405180910390fd5b611b02611d53565b73ffffffffffffffffffffffffffffffffffffffff16611b2061141c565b73ffffffffffffffffffffffffffffffffffffffff1614611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d906136e1565b60405180910390fd5b611b80828461222d565b505050565b611b8d611d53565b73ffffffffffffffffffffffffffffffffffffffff16611bab61141c565b73ffffffffffffffffffffffffffffffffffffffff1614611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf8906136e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6890613541565b60405180910390fd5b611c7a81612167565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dce83611194565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611e2d82611ce7565b611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6390613601565b60405180910390fd5b6000611e7783611194565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611eb95750611eb881856119bb565b5b80611ef757508373ffffffffffffffffffffffffffffffffffffffff16611edf846109bf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f2082611194565b73ffffffffffffffffffffffffffffffffffffffff1614611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d90613561565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd906135c1565b60405180910390fd5b611ff1838383612629565b611ffc600082611d5b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204c91906139a0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a391906138bf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216283838361262e565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015612268576122426007612633565b612255836122506007611e14565b612649565b808061226090613aed565b915050612230565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d3906135e1565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123cd91906134c4565b60405180910390a3505050565b6123e5848484611f00565b6123f184848484612667565b612430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242790613521565b60405180910390fd5b50505050565b60606008805461244590613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461247190613a8a565b80156124be5780601f10612493576101008083540402835291602001916124be565b820191906000526020600020905b8154815290600101906020018083116124a157829003601f168201915b5050505050905090565b60606000821415612510576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612624565b600082905060005b6000821461254257808061252b90613aed565b915050600a8261253b9190613915565b9150612518565b60008167ffffffffffffffff81111561255e5761255d613c23565b5b6040519080825280601f01601f1916602001820160405280156125905781602001600182028036833780820191505090505b5090505b6000851461261d576001826125a991906139a0565b9150600a856125b89190613b36565b60306125c491906138bf565b60f81b8183815181106125da576125d9613bf4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126169190613915565b9450612594565b8093505050505b919050565b505050565b505050565b6001816000016000828254019250508190555050565b6126638282604051806020016040528060008152506127fe565b5050565b60006126888473ffffffffffffffffffffffffffffffffffffffff16612859565b156127f1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126b1611d53565b8786866040518563ffffffff1660e01b81526004016126d39493929190613456565b602060405180830381600087803b1580156126ed57600080fd5b505af192505050801561271e57506040513d601f19601f8201168201806040525081019061271b9190612e5f565b60015b6127a1573d806000811461274e576040519150601f19603f3d011682016040523d82523d6000602084013e612753565b606091505b50600081511415612799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279090613521565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f6565b600190505b949350505050565b612808838361287c565b6128156000848484612667565b612854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284b90613521565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e3906136a1565b60405180910390fd5b6128f581611ce7565b15612935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292c90613581565b60405180910390fd5b61294160008383612629565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461299191906138bf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a526000838361262e565b5050565b828054612a6290613a8a565b90600052602060002090601f016020900481019282612a845760008555612acb565b82601f10612a9d57805160ff1916838001178555612acb565b82800160010185558215612acb579182015b82811115612aca578251825591602001919060010190612aaf565b5b509050612ad89190612adc565b5090565b5b80821115612af5576000816000905550600101612add565b5090565b6000612b0c612b07846137c1565b61379c565b905082815260208101848484011115612b2857612b27613c57565b5b612b33848285613a48565b509392505050565b6000612b4e612b49846137f2565b61379c565b905082815260208101848484011115612b6a57612b69613c57565b5b612b75848285613a48565b509392505050565b600081359050612b8c81614176565b92915050565b600081359050612ba18161418d565b92915050565b600081359050612bb6816141a4565b92915050565b600081519050612bcb816141a4565b92915050565b600082601f830112612be657612be5613c52565b5b8135612bf6848260208601612af9565b91505092915050565b600082601f830112612c1457612c13613c52565b5b8135612c24848260208601612b3b565b91505092915050565b600081359050612c3c816141bb565b92915050565b600060208284031215612c5857612c57613c61565b5b6000612c6684828501612b7d565b91505092915050565b60008060408385031215612c8657612c85613c61565b5b6000612c9485828601612b7d565b9250506020612ca585828601612b7d565b9150509250929050565b600080600060608486031215612cc857612cc7613c61565b5b6000612cd686828701612b7d565b9350506020612ce786828701612b7d565b9250506040612cf886828701612c2d565b9150509250925092565b60008060008060808587031215612d1c57612d1b613c61565b5b6000612d2a87828801612b7d565b9450506020612d3b87828801612b7d565b9350506040612d4c87828801612c2d565b925050606085013567ffffffffffffffff811115612d6d57612d6c613c5c565b5b612d7987828801612bd1565b91505092959194509250565b60008060408385031215612d9c57612d9b613c61565b5b6000612daa85828601612b7d565b9250506020612dbb85828601612b92565b9150509250929050565b60008060408385031215612ddc57612ddb613c61565b5b6000612dea85828601612b7d565b9250506020612dfb85828601612c2d565b9150509250929050565b600060208284031215612e1b57612e1a613c61565b5b6000612e2984828501612b92565b91505092915050565b600060208284031215612e4857612e47613c61565b5b6000612e5684828501612ba7565b91505092915050565b600060208284031215612e7557612e74613c61565b5b6000612e8384828501612bbc565b91505092915050565b600060208284031215612ea257612ea1613c61565b5b600082013567ffffffffffffffff811115612ec057612ebf613c5c565b5b612ecc84828501612bff565b91505092915050565b600060208284031215612eeb57612eea613c61565b5b6000612ef984828501612c2d565b91505092915050565b60008060408385031215612f1957612f18613c61565b5b6000612f2785828601612c2d565b9250506020612f3885828601612b7d565b9150509250929050565b6000612f4e83836133d7565b60208301905092915050565b612f63816139d4565b82525050565b6000612f7482613848565b612f7e8185613876565b9350612f8983613823565b8060005b83811015612fba578151612fa18882612f42565b9750612fac83613869565b925050600181019050612f8d565b5085935050505092915050565b612fd0816139e6565b82525050565b6000612fe182613853565b612feb8185613887565b9350612ffb818560208601613a57565b61300481613c66565b840191505092915050565b600061301a8261385e565b61302481856138a3565b9350613034818560208601613a57565b61303d81613c66565b840191505092915050565b60006130538261385e565b61305d81856138b4565b935061306d818560208601613a57565b80840191505092915050565b6000815461308681613a8a565b61309081866138b4565b945060018216600081146130ab57600181146130bc576130ef565b60ff198316865281860193506130ef565b6130c585613833565b60005b838110156130e7578154818901526001820191506020810190506130c8565b838801955050505b50505092915050565b60006131056004836138a3565b915061311082613c77565b602082019050919050565b60006131286032836138a3565b915061313382613ca0565b604082019050919050565b600061314b6026836138a3565b915061315682613cef565b604082019050919050565b600061316e6025836138a3565b915061317982613d3e565b604082019050919050565b6000613191601c836138a3565b915061319c82613d8d565b602082019050919050565b60006131b4601d836138a3565b91506131bf82613db6565b602082019050919050565b60006131d76024836138a3565b91506131e282613ddf565b604082019050919050565b60006131fa6019836138a3565b915061320582613e2e565b602082019050919050565b600061321d602c836138a3565b915061322882613e57565b604082019050919050565b60006132406038836138a3565b915061324b82613ea6565b604082019050919050565b6000613263602a836138a3565b915061326e82613ef5565b604082019050919050565b60006132866029836138a3565b915061329182613f44565b604082019050919050565b60006132a96016836138a3565b91506132b482613f93565b602082019050919050565b60006132cc6020836138a3565b91506132d782613fbc565b602082019050919050565b60006132ef602c836138a3565b91506132fa82613fe5565b604082019050919050565b60006133126020836138a3565b915061331d82614034565b602082019050919050565b6000613335602f836138a3565b91506133408261405d565b604082019050919050565b60006133586021836138a3565b9150613363826140ac565b604082019050919050565b600061337b600083613898565b9150613386826140fb565b600082019050919050565b600061339e6031836138a3565b91506133a9826140fe565b604082019050919050565b60006133c16009836138a3565b91506133cc8261414d565b602082019050919050565b6133e081613a3e565b82525050565b6133ef81613a3e565b82525050565b60006134018286613048565b915061340d8285613048565b91506134198284613079565b9150819050949350505050565b60006134318261336e565b9150819050919050565b60006020820190506134506000830184612f5a565b92915050565b600060808201905061346b6000830187612f5a565b6134786020830186612f5a565b61348560408301856133e6565b81810360608301526134978184612fd6565b905095945050505050565b600060208201905081810360008301526134bc8184612f69565b905092915050565b60006020820190506134d96000830184612fc7565b92915050565b600060208201905081810360008301526134f9818461300f565b905092915050565b6000602082019050818103600083015261351a816130f8565b9050919050565b6000602082019050818103600083015261353a8161311b565b9050919050565b6000602082019050818103600083015261355a8161313e565b9050919050565b6000602082019050818103600083015261357a81613161565b9050919050565b6000602082019050818103600083015261359a81613184565b9050919050565b600060208201905081810360008301526135ba816131a7565b9050919050565b600060208201905081810360008301526135da816131ca565b9050919050565b600060208201905081810360008301526135fa816131ed565b9050919050565b6000602082019050818103600083015261361a81613210565b9050919050565b6000602082019050818103600083015261363a81613233565b9050919050565b6000602082019050818103600083015261365a81613256565b9050919050565b6000602082019050818103600083015261367a81613279565b9050919050565b6000602082019050818103600083015261369a8161329c565b9050919050565b600060208201905081810360008301526136ba816132bf565b9050919050565b600060208201905081810360008301526136da816132e2565b9050919050565b600060208201905081810360008301526136fa81613305565b9050919050565b6000602082019050818103600083015261371a81613328565b9050919050565b6000602082019050818103600083015261373a8161334b565b9050919050565b6000602082019050818103600083015261375a81613391565b9050919050565b6000602082019050818103600083015261377a816133b4565b9050919050565b600060208201905061379660008301846133e6565b92915050565b60006137a66137b7565b90506137b28282613abc565b919050565b6000604051905090565b600067ffffffffffffffff8211156137dc576137db613c23565b5b6137e582613c66565b9050602081019050919050565b600067ffffffffffffffff82111561380d5761380c613c23565b5b61381682613c66565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006138ca82613a3e565b91506138d583613a3e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561390a57613909613b67565b5b828201905092915050565b600061392082613a3e565b915061392b83613a3e565b92508261393b5761393a613b96565b5b828204905092915050565b600061395182613a3e565b915061395c83613a3e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561399557613994613b67565b5b828202905092915050565b60006139ab82613a3e565b91506139b683613a3e565b9250828210156139c9576139c8613b67565b5b828203905092915050565b60006139df82613a1e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a75578082015181840152602081019050613a5a565b83811115613a84576000848401525b50505050565b60006002820490506001821680613aa257607f821691505b60208210811415613ab657613ab5613bc5565b5b50919050565b613ac582613c66565b810181811067ffffffffffffffff82111715613ae457613ae3613c23565b5b80604052505050565b6000613af882613a3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b2b57613b2a613b67565b5b600182019050919050565b6000613b4182613a3e565b9150613b4c83613a3e565b925082613b5c57613b5b613b96565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f576f772100000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f536d6f6b6520627265616b2c20636f6d65206261636b206c6174657221000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f596f752772652065746820706f6f7220686f6d69652100000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b61417f816139d4565b811461418a57600080fd5b50565b614196816139e6565b81146141a157600080fd5b50565b6141ad816139f2565b81146141b857600080fd5b50565b6141c481613a3e565b81146141cf57600080fd5b5056fea2646970667358221220dd6dfc2d10c1a98b96e4a84f3e4e67926fe177f4bef9b448f2c84154a66f7bf664736f6c63430008070033697066733a2f2f516d573355744c6552456e6970754e6671474d4256316a417274724150344378397a35333169503466466d7271452f68696464656e2e6a736f6e

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80636352211e11610118578063a45ba8e7116100a0578063d5abeb011161006f578063d5abeb0114610768578063e0a8085314610793578063e985e9c5146107bc578063efbd73f4146107f9578063f2fde38b146108225761020f565b8063a45ba8e7146106ae578063b071401b146106d9578063b88d4fde14610702578063c87b56dd1461072b5761020f565b80638da5cb5b116100e75780638da5cb5b146105e857806394354fd01461061357806395d89b411461063e578063a0712d6814610669578063a22cb465146106855761020f565b80636352211e1461052e57806370a082311461056b578063715018a6146105a85780637ec4a659146105bf5761020f565b80633ccfd60b1161019b5780634fdd43cb1161016a5780634fdd43cb1461045957806351830227146104825780635503a0e8146104ad5780635c975abb146104d857806362b99ad4146105035761020f565b80633ccfd60b146103b357806342842e0e146103ca578063438b6300146103f357806344a0d68a146104305761020f565b806313faede6116101e257806313faede6146102e257806316ba10e01461030d57806316c38b3c1461033657806318160ddd1461035f57806323b872dd1461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612e32565b61084b565b60405161024891906134c4565b60405180910390f35b34801561025d57600080fd5b5061026661092d565b60405161027391906134df565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612ed5565b6109bf565b6040516102b0919061343b565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612dc5565b610a44565b005b3480156102ee57600080fd5b506102f7610b5c565b6040516103049190613781565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190612e8c565b610b62565b005b34801561034257600080fd5b5061035d60048036038101906103589190612e05565b610bf8565b005b34801561036b57600080fd5b50610374610c91565b6040516103819190613781565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac9190612caf565b610ca2565b005b3480156103bf57600080fd5b506103c8610d02565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190612caf565b610e0b565b005b3480156103ff57600080fd5b5061041a60048036038101906104159190612c42565b610e2b565b60405161042791906134a2565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190612ed5565b610f36565b005b34801561046557600080fd5b50610480600480360381019061047b9190612e8c565b610fbc565b005b34801561048e57600080fd5b50610497611052565b6040516104a491906134c4565b60405180910390f35b3480156104b957600080fd5b506104c2611065565b6040516104cf91906134df565b60405180910390f35b3480156104e457600080fd5b506104ed6110f3565b6040516104fa91906134c4565b60405180910390f35b34801561050f57600080fd5b50610518611106565b60405161052591906134df565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190612ed5565b611194565b604051610562919061343b565b60405180910390f35b34801561057757600080fd5b50610592600480360381019061058d9190612c42565b611246565b60405161059f9190613781565b60405180910390f35b3480156105b457600080fd5b506105bd6112fe565b005b3480156105cb57600080fd5b506105e660048036038101906105e19190612e8c565b611386565b005b3480156105f457600080fd5b506105fd61141c565b60405161060a919061343b565b60405180910390f35b34801561061f57600080fd5b50610628611446565b6040516106359190613781565b60405180910390f35b34801561064a57600080fd5b5061065361144c565b60405161066091906134df565b60405180910390f35b610683600480360381019061067e9190612ed5565b6114de565b005b34801561069157600080fd5b506106ac60048036038101906106a79190612d85565b611637565b005b3480156106ba57600080fd5b506106c361164d565b6040516106d091906134df565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190612ed5565b6116db565b005b34801561070e57600080fd5b5061072960048036038101906107249190612d02565b611761565b005b34801561073757600080fd5b50610752600480360381019061074d9190612ed5565b6117c3565b60405161075f91906134df565b60405180910390f35b34801561077457600080fd5b5061077d61191c565b60405161078a9190613781565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b59190612e05565b611922565b005b3480156107c857600080fd5b506107e360048036038101906107de9190612c6f565b6119bb565b6040516107f091906134c4565b60405180910390f35b34801561080557600080fd5b50610820600480360381019061081b9190612f02565b611a4f565b005b34801561082e57600080fd5b5061084960048036038101906108449190612c42565b611b85565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610926575061092582611c7d565b5b9050919050565b60606000805461093c90613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461096890613a8a565b80156109b55780601f1061098a576101008083540402835291602001916109b5565b820191906000526020600020905b81548152906001019060200180831161099857829003601f168201915b5050505050905090565b60006109ca82611ce7565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a00906136c1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4f82611194565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab790613721565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610adf611d53565b73ffffffffffffffffffffffffffffffffffffffff161480610b0e5750610b0d81610b08611d53565b6119bb565b5b610b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4490613621565b60405180910390fd5b610b578383611d5b565b505050565b600b5481565b610b6a611d53565b73ffffffffffffffffffffffffffffffffffffffff16610b8861141c565b73ffffffffffffffffffffffffffffffffffffffff1614610bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd5906136e1565b60405180910390fd5b8060099080519060200190610bf4929190612a56565b5050565b610c00611d53565b73ffffffffffffffffffffffffffffffffffffffff16610c1e61141c565b73ffffffffffffffffffffffffffffffffffffffff1614610c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6b906136e1565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6000610c9d6007611e14565b905090565b610cb3610cad611d53565b82611e22565b610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce990613741565b60405180910390fd5b610cfd838383611f00565b505050565b610d0a611d53565b73ffffffffffffffffffffffffffffffffffffffff16610d2861141c565b73ffffffffffffffffffffffffffffffffffffffff1614610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d75906136e1565b60405180910390fd5b60007309385f235280839b0f9f71caf4a2519d0556ee5773ffffffffffffffffffffffffffffffffffffffff1647604051610db890613426565b60006040518083038185875af1925050503d8060008114610df5576040519150601f19603f3d011682016040523d82523d6000602084013e610dfa565b606091505b5050905080610e0857600080fd5b50565b610e2683838360405180602001604052806000815250611761565b505050565b60606000610e3883611246565b905060008167ffffffffffffffff811115610e5657610e55613c23565b5b604051908082528060200260200182016040528015610e845781602001602082028036833780820191505090505b50905060006001905060005b8381108015610ea15750600c548211155b15610f2a576000610eb183611194565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f165782848381518110610efb57610efa613bf4565b5b6020026020010181815250508180610f1290613aed565b9250505b8280610f2190613aed565b93505050610e90565b82945050505050919050565b610f3e611d53565b73ffffffffffffffffffffffffffffffffffffffff16610f5c61141c565b73ffffffffffffffffffffffffffffffffffffffff1614610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa9906136e1565b60405180910390fd5b80600b8190555050565b610fc4611d53565b73ffffffffffffffffffffffffffffffffffffffff16610fe261141c565b73ffffffffffffffffffffffffffffffffffffffff1614611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f906136e1565b60405180910390fd5b80600a908051906020019061104e929190612a56565b5050565b600e60019054906101000a900460ff1681565b6009805461107290613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461109e90613a8a565b80156110eb5780601f106110c0576101008083540402835291602001916110eb565b820191906000526020600020905b8154815290600101906020018083116110ce57829003601f168201915b505050505081565b600e60009054906101000a900460ff1681565b6008805461111390613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461113f90613a8a565b801561118c5780601f106111615761010080835404028352916020019161118c565b820191906000526020600020905b81548152906001019060200180831161116f57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561123d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123490613661565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90613641565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611306611d53565b73ffffffffffffffffffffffffffffffffffffffff1661132461141c565b73ffffffffffffffffffffffffffffffffffffffff161461137a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611371906136e1565b60405180910390fd5b6113846000612167565b565b61138e611d53565b73ffffffffffffffffffffffffffffffffffffffff166113ac61141c565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f9906136e1565b60405180910390fd5b8060089080519060200190611418929190612a56565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b60606001805461145b90613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461148790613a8a565b80156114d45780601f106114a9576101008083540402835291602001916114d4565b820191906000526020600020905b8154815290600101906020018083116114b757829003601f168201915b5050505050905090565b806000811180156114f15750600d548111155b611530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152790613501565b60405180910390fd5b600c548161153e6007611e14565b61154891906138bf565b1115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090613761565b60405180910390fd5b600e60009054906101000a900460ff16156115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d0906135a1565b60405180910390fd5b81600b546115e79190613946565b341015611629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162090613681565b60405180910390fd5b611633338361222d565b5050565b611649611642611d53565b838361226d565b5050565b600a805461165a90613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461168690613a8a565b80156116d35780601f106116a8576101008083540402835291602001916116d3565b820191906000526020600020905b8154815290600101906020018083116116b657829003601f168201915b505050505081565b6116e3611d53565b73ffffffffffffffffffffffffffffffffffffffff1661170161141c565b73ffffffffffffffffffffffffffffffffffffffff1614611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e906136e1565b60405180910390fd5b80600d8190555050565b61177261176c611d53565b83611e22565b6117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a890613741565b60405180910390fd5b6117bd848484846123da565b50505050565b60606117ce82611ce7565b61180d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180490613701565b60405180910390fd5b60001515600e60019054906101000a900460ff16151514156118bb57600a805461183690613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461186290613a8a565b80156118af5780601f10611884576101008083540402835291602001916118af565b820191906000526020600020905b81548152906001019060200180831161189257829003601f168201915b50505050509050611917565b60006118c5612436565b905060008151116118e55760405180602001604052806000815250611913565b806118ef846124c8565b6009604051602001611903939291906133f5565b6040516020818303038152906040525b9150505b919050565b600c5481565b61192a611d53565b73ffffffffffffffffffffffffffffffffffffffff1661194861141c565b73ffffffffffffffffffffffffffffffffffffffff161461199e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611995906136e1565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611a625750600d548111155b611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890613501565b60405180910390fd5b600c5481611aaf6007611e14565b611ab991906138bf565b1115611afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af190613761565b60405180910390fd5b611b02611d53565b73ffffffffffffffffffffffffffffffffffffffff16611b2061141c565b73ffffffffffffffffffffffffffffffffffffffff1614611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d906136e1565b60405180910390fd5b611b80828461222d565b505050565b611b8d611d53565b73ffffffffffffffffffffffffffffffffffffffff16611bab61141c565b73ffffffffffffffffffffffffffffffffffffffff1614611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf8906136e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6890613541565b60405180910390fd5b611c7a81612167565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dce83611194565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611e2d82611ce7565b611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6390613601565b60405180910390fd5b6000611e7783611194565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611eb95750611eb881856119bb565b5b80611ef757508373ffffffffffffffffffffffffffffffffffffffff16611edf846109bf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f2082611194565b73ffffffffffffffffffffffffffffffffffffffff1614611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d90613561565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd906135c1565b60405180910390fd5b611ff1838383612629565b611ffc600082611d5b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204c91906139a0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a391906138bf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216283838361262e565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015612268576122426007612633565b612255836122506007611e14565b612649565b808061226090613aed565b915050612230565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d3906135e1565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123cd91906134c4565b60405180910390a3505050565b6123e5848484611f00565b6123f184848484612667565b612430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242790613521565b60405180910390fd5b50505050565b60606008805461244590613a8a565b80601f016020809104026020016040519081016040528092919081815260200182805461247190613a8a565b80156124be5780601f10612493576101008083540402835291602001916124be565b820191906000526020600020905b8154815290600101906020018083116124a157829003601f168201915b5050505050905090565b60606000821415612510576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612624565b600082905060005b6000821461254257808061252b90613aed565b915050600a8261253b9190613915565b9150612518565b60008167ffffffffffffffff81111561255e5761255d613c23565b5b6040519080825280601f01601f1916602001820160405280156125905781602001600182028036833780820191505090505b5090505b6000851461261d576001826125a991906139a0565b9150600a856125b89190613b36565b60306125c491906138bf565b60f81b8183815181106125da576125d9613bf4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126169190613915565b9450612594565b8093505050505b919050565b505050565b505050565b6001816000016000828254019250508190555050565b6126638282604051806020016040528060008152506127fe565b5050565b60006126888473ffffffffffffffffffffffffffffffffffffffff16612859565b156127f1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126b1611d53565b8786866040518563ffffffff1660e01b81526004016126d39493929190613456565b602060405180830381600087803b1580156126ed57600080fd5b505af192505050801561271e57506040513d601f19601f8201168201806040525081019061271b9190612e5f565b60015b6127a1573d806000811461274e576040519150601f19603f3d011682016040523d82523d6000602084013e612753565b606091505b50600081511415612799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279090613521565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f6565b600190505b949350505050565b612808838361287c565b6128156000848484612667565b612854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284b90613521565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e3906136a1565b60405180910390fd5b6128f581611ce7565b15612935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292c90613581565b60405180910390fd5b61294160008383612629565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461299191906138bf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a526000838361262e565b5050565b828054612a6290613a8a565b90600052602060002090601f016020900481019282612a845760008555612acb565b82601f10612a9d57805160ff1916838001178555612acb565b82800160010185558215612acb579182015b82811115612aca578251825591602001919060010190612aaf565b5b509050612ad89190612adc565b5090565b5b80821115612af5576000816000905550600101612add565b5090565b6000612b0c612b07846137c1565b61379c565b905082815260208101848484011115612b2857612b27613c57565b5b612b33848285613a48565b509392505050565b6000612b4e612b49846137f2565b61379c565b905082815260208101848484011115612b6a57612b69613c57565b5b612b75848285613a48565b509392505050565b600081359050612b8c81614176565b92915050565b600081359050612ba18161418d565b92915050565b600081359050612bb6816141a4565b92915050565b600081519050612bcb816141a4565b92915050565b600082601f830112612be657612be5613c52565b5b8135612bf6848260208601612af9565b91505092915050565b600082601f830112612c1457612c13613c52565b5b8135612c24848260208601612b3b565b91505092915050565b600081359050612c3c816141bb565b92915050565b600060208284031215612c5857612c57613c61565b5b6000612c6684828501612b7d565b91505092915050565b60008060408385031215612c8657612c85613c61565b5b6000612c9485828601612b7d565b9250506020612ca585828601612b7d565b9150509250929050565b600080600060608486031215612cc857612cc7613c61565b5b6000612cd686828701612b7d565b9350506020612ce786828701612b7d565b9250506040612cf886828701612c2d565b9150509250925092565b60008060008060808587031215612d1c57612d1b613c61565b5b6000612d2a87828801612b7d565b9450506020612d3b87828801612b7d565b9350506040612d4c87828801612c2d565b925050606085013567ffffffffffffffff811115612d6d57612d6c613c5c565b5b612d7987828801612bd1565b91505092959194509250565b60008060408385031215612d9c57612d9b613c61565b5b6000612daa85828601612b7d565b9250506020612dbb85828601612b92565b9150509250929050565b60008060408385031215612ddc57612ddb613c61565b5b6000612dea85828601612b7d565b9250506020612dfb85828601612c2d565b9150509250929050565b600060208284031215612e1b57612e1a613c61565b5b6000612e2984828501612b92565b91505092915050565b600060208284031215612e4857612e47613c61565b5b6000612e5684828501612ba7565b91505092915050565b600060208284031215612e7557612e74613c61565b5b6000612e8384828501612bbc565b91505092915050565b600060208284031215612ea257612ea1613c61565b5b600082013567ffffffffffffffff811115612ec057612ebf613c5c565b5b612ecc84828501612bff565b91505092915050565b600060208284031215612eeb57612eea613c61565b5b6000612ef984828501612c2d565b91505092915050565b60008060408385031215612f1957612f18613c61565b5b6000612f2785828601612c2d565b9250506020612f3885828601612b7d565b9150509250929050565b6000612f4e83836133d7565b60208301905092915050565b612f63816139d4565b82525050565b6000612f7482613848565b612f7e8185613876565b9350612f8983613823565b8060005b83811015612fba578151612fa18882612f42565b9750612fac83613869565b925050600181019050612f8d565b5085935050505092915050565b612fd0816139e6565b82525050565b6000612fe182613853565b612feb8185613887565b9350612ffb818560208601613a57565b61300481613c66565b840191505092915050565b600061301a8261385e565b61302481856138a3565b9350613034818560208601613a57565b61303d81613c66565b840191505092915050565b60006130538261385e565b61305d81856138b4565b935061306d818560208601613a57565b80840191505092915050565b6000815461308681613a8a565b61309081866138b4565b945060018216600081146130ab57600181146130bc576130ef565b60ff198316865281860193506130ef565b6130c585613833565b60005b838110156130e7578154818901526001820191506020810190506130c8565b838801955050505b50505092915050565b60006131056004836138a3565b915061311082613c77565b602082019050919050565b60006131286032836138a3565b915061313382613ca0565b604082019050919050565b600061314b6026836138a3565b915061315682613cef565b604082019050919050565b600061316e6025836138a3565b915061317982613d3e565b604082019050919050565b6000613191601c836138a3565b915061319c82613d8d565b602082019050919050565b60006131b4601d836138a3565b91506131bf82613db6565b602082019050919050565b60006131d76024836138a3565b91506131e282613ddf565b604082019050919050565b60006131fa6019836138a3565b915061320582613e2e565b602082019050919050565b600061321d602c836138a3565b915061322882613e57565b604082019050919050565b60006132406038836138a3565b915061324b82613ea6565b604082019050919050565b6000613263602a836138a3565b915061326e82613ef5565b604082019050919050565b60006132866029836138a3565b915061329182613f44565b604082019050919050565b60006132a96016836138a3565b91506132b482613f93565b602082019050919050565b60006132cc6020836138a3565b91506132d782613fbc565b602082019050919050565b60006132ef602c836138a3565b91506132fa82613fe5565b604082019050919050565b60006133126020836138a3565b915061331d82614034565b602082019050919050565b6000613335602f836138a3565b91506133408261405d565b604082019050919050565b60006133586021836138a3565b9150613363826140ac565b604082019050919050565b600061337b600083613898565b9150613386826140fb565b600082019050919050565b600061339e6031836138a3565b91506133a9826140fe565b604082019050919050565b60006133c16009836138a3565b91506133cc8261414d565b602082019050919050565b6133e081613a3e565b82525050565b6133ef81613a3e565b82525050565b60006134018286613048565b915061340d8285613048565b91506134198284613079565b9150819050949350505050565b60006134318261336e565b9150819050919050565b60006020820190506134506000830184612f5a565b92915050565b600060808201905061346b6000830187612f5a565b6134786020830186612f5a565b61348560408301856133e6565b81810360608301526134978184612fd6565b905095945050505050565b600060208201905081810360008301526134bc8184612f69565b905092915050565b60006020820190506134d96000830184612fc7565b92915050565b600060208201905081810360008301526134f9818461300f565b905092915050565b6000602082019050818103600083015261351a816130f8565b9050919050565b6000602082019050818103600083015261353a8161311b565b9050919050565b6000602082019050818103600083015261355a8161313e565b9050919050565b6000602082019050818103600083015261357a81613161565b9050919050565b6000602082019050818103600083015261359a81613184565b9050919050565b600060208201905081810360008301526135ba816131a7565b9050919050565b600060208201905081810360008301526135da816131ca565b9050919050565b600060208201905081810360008301526135fa816131ed565b9050919050565b6000602082019050818103600083015261361a81613210565b9050919050565b6000602082019050818103600083015261363a81613233565b9050919050565b6000602082019050818103600083015261365a81613256565b9050919050565b6000602082019050818103600083015261367a81613279565b9050919050565b6000602082019050818103600083015261369a8161329c565b9050919050565b600060208201905081810360008301526136ba816132bf565b9050919050565b600060208201905081810360008301526136da816132e2565b9050919050565b600060208201905081810360008301526136fa81613305565b9050919050565b6000602082019050818103600083015261371a81613328565b9050919050565b6000602082019050818103600083015261373a8161334b565b9050919050565b6000602082019050818103600083015261375a81613391565b9050919050565b6000602082019050818103600083015261377a816133b4565b9050919050565b600060208201905061379660008301846133e6565b92915050565b60006137a66137b7565b90506137b28282613abc565b919050565b6000604051905090565b600067ffffffffffffffff8211156137dc576137db613c23565b5b6137e582613c66565b9050602081019050919050565b600067ffffffffffffffff82111561380d5761380c613c23565b5b61381682613c66565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006138ca82613a3e565b91506138d583613a3e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561390a57613909613b67565b5b828201905092915050565b600061392082613a3e565b915061392b83613a3e565b92508261393b5761393a613b96565b5b828204905092915050565b600061395182613a3e565b915061395c83613a3e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561399557613994613b67565b5b828202905092915050565b60006139ab82613a3e565b91506139b683613a3e565b9250828210156139c9576139c8613b67565b5b828203905092915050565b60006139df82613a1e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a75578082015181840152602081019050613a5a565b83811115613a84576000848401525b50505050565b60006002820490506001821680613aa257607f821691505b60208210811415613ab657613ab5613bc5565b5b50919050565b613ac582613c66565b810181811067ffffffffffffffff82111715613ae457613ae3613c23565b5b80604052505050565b6000613af882613a3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b2b57613b2a613b67565b5b600182019050919050565b6000613b4182613a3e565b9150613b4c83613a3e565b925082613b5c57613b5b613b96565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f576f772100000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f536d6f6b6520627265616b2c20636f6d65206261636b206c6174657221000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f596f752772652065746820706f6f7220686f6d69652100000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b61417f816139d4565b811461418a57600080fd5b50565b614196816139e6565b81146141a157600080fd5b50565b6141ad816139f2565b81146141b857600080fd5b50565b6141c481613a3e565b81146141cf57600080fd5b5056fea2646970667358221220dd6dfc2d10c1a98b96e4a84f3e4e67926fe177f4bef9b448f2c84154a66f7bf664736f6c63430008070033

Deployed Bytecode Sourcemap

39566:4027:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25716:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26661:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28221:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27744:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39829:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42584:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42690:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40376:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28971:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42773:497;;;;;;;;;;;;;:::i;:::-;;29381:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40896:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42124:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42340:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39979:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39751:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39949:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39718:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26355:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26085:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6299:103;;;;;;;;;;;;;:::i;:::-;;42478:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5648:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39904:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26830:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40471:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28514:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39789:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42204:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29637:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41537:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39868:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42037:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28740:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40735:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6557:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25716:305;25818:4;25870:25;25855:40;;;:11;:40;;;;:105;;;;25927:33;25912:48;;;:11;:48;;;;25855:105;:158;;;;25977:36;26001:11;25977:23;:36::i;:::-;25855:158;25835:178;;25716:305;;;:::o;26661:100::-;26715:13;26748:5;26741:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26661:100;:::o;28221:221::-;28297:7;28325:16;28333:7;28325;:16::i;:::-;28317:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28410:15;:24;28426:7;28410:24;;;;;;;;;;;;;;;;;;;;;28403:31;;28221:221;;;:::o;27744:411::-;27825:13;27841:23;27856:7;27841:14;:23::i;:::-;27825:39;;27889:5;27883:11;;:2;:11;;;;27875:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27983:5;27967:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27992:37;28009:5;28016:12;:10;:12::i;:::-;27992:16;:37::i;:::-;27967:62;27945:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28126:21;28135:2;28139:7;28126:8;:21::i;:::-;27814:341;27744:411;;:::o;39829:34::-;;;;:::o;42584:100::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42668:10:::1;42656:9;:22;;;;;;;;;;;;:::i;:::-;;42584:100:::0;:::o;42690:77::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42755:6:::1;42746;;:15;;;;;;;;;;;;;;;;;;42690:77:::0;:::o;40376:89::-;40420:7;40443:16;:6;:14;:16::i;:::-;40436:23;;40376:89;:::o;28971:339::-;29166:41;29185:12;:10;:12::i;:::-;29199:7;29166:18;:41::i;:::-;29158:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29274:28;29284:4;29290:2;29294:7;29274:9;:28::i;:::-;28971:339;;;:::o;42773:497::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43057:7:::1;43078:42;43070:56;;43134:21;43070:90;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43056:104;;;43175:2;43167:11;;;::::0;::::1;;42810:460;42773:497::o:0;29381:185::-;29519:39;29536:4;29542:2;29546:7;29519:39;;;;;;;;;;;;:16;:39::i;:::-;29381:185;;;:::o;40896:635::-;40971:16;40999:23;41025:17;41035:6;41025:9;:17::i;:::-;40999:43;;41049:30;41096:15;41082:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41049:63;;41119:22;41144:1;41119:26;;41152:23;41188:309;41213:15;41195;:33;:64;;;;;41250:9;;41232:14;:27;;41195:64;41188:309;;;41270:25;41298:23;41306:14;41298:7;:23::i;:::-;41270:51;;41357:6;41336:27;;:17;:27;;;41332:131;;;41409:14;41376:13;41390:15;41376:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;41436:17;;;;;:::i;:::-;;;;41332:131;41473:16;;;;;:::i;:::-;;;;41261:236;41188:309;;;41512:13;41505:20;;;;;;40896:635;;;:::o;42124:74::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42187:5:::1;42180:4;:12;;;;42124:74:::0;:::o;42340:132::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42448:18:::1;42428:17;:38;;;;;;;;;;;;:::i;:::-;;42340:132:::0;:::o;39979:28::-;;;;;;;;;;;;;:::o;39751:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39949:25::-;;;;;;;;;;;;;:::o;39718:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26355:239::-;26427:7;26447:13;26463:7;:16;26471:7;26463:16;;;;;;;;;;;;;;;;;;;;;26447:32;;26515:1;26498:19;;:5;:19;;;;26490:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26581:5;26574:12;;;26355:239;;;:::o;26085:208::-;26157:7;26202:1;26185:19;;:5;:19;;;;26177:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26269:9;:16;26279:5;26269:16;;;;;;;;;;;;;;;;26262:23;;26085:208;;;:::o;6299:103::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6364:30:::1;6391:1;6364:18;:30::i;:::-;6299:103::o:0;42478:100::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42562:10:::1;42550:9;:22;;;;;;;;;;;;:::i;:::-;;42478:100:::0;:::o;5648:87::-;5694:7;5721:6;;;;;;;;;;;5714:13;;5648:87;:::o;39904:38::-;;;;:::o;26830:104::-;26886:13;26919:7;26912:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26830:104;:::o;40471:256::-;40536:11;40237:1;40223:11;:15;:52;;;;;40257:18;;40242:11;:33;;40223:52;40215:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40333:9;;40318:11;40299:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;40291:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40565:6:::1;;;;;;;;;;;40564:7;40556:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;40640:11;40633:4;;:18;;;;:::i;:::-;40620:9;:31;;40612:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;40687:34;40697:10;40709:11;40687:9;:34::i;:::-;40471:256:::0;;:::o;28514:155::-;28609:52;28628:12;:10;:12::i;:::-;28642:8;28652;28609:18;:52::i;:::-;28514:155;;:::o;39789:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42204:130::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42309:19:::1;42288:18;:40;;;;42204:130:::0;:::o;29637:328::-;29812:41;29831:12;:10;:12::i;:::-;29845:7;29812:18;:41::i;:::-;29804:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29918:39;29932:4;29938:2;29942:7;29951:5;29918:13;:39::i;:::-;29637:328;;;;:::o;41537:494::-;41636:13;41677:17;41685:8;41677:7;:17::i;:::-;41661:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;41784:5;41772:17;;:8;;;;;;;;;;;:17;;;41768:64;;;41807:17;41800:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41768:64;41840:28;41871:10;:8;:10::i;:::-;41840:41;;41926:1;41901:14;41895:28;:32;:130;;;;;;;;;;;;;;;;;41963:14;41979:19;:8;:17;:19::i;:::-;42000:9;41946:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41895:130;41888:137;;;41537:494;;;;:::o;39868:31::-;;;;:::o;42037:81::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42106:6:::1;42095:8;;:17;;;;;;;;;;;;;;;;;;42037:81:::0;:::o;28740:164::-;28837:4;28861:18;:25;28880:5;28861:25;;;;;;;;;;;;;;;:35;28887:8;28861:35;;;;;;;;;;;;;;;;;;;;;;;;;28854:42;;28740:164;;;;:::o;40735:155::-;40821:11;40237:1;40223:11;:15;:52;;;;;40257:18;;40242:11;:33;;40223:52;40215:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40333:9;;40318:11;40299:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;40291:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;5879:12:::1;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40851:33:::2;40861:9;40872:11;40851:9;:33::i;:::-;40735:155:::0;;;:::o;6557:201::-;5879:12;:10;:12::i;:::-;5868:23;;:7;:5;:7::i;:::-;:23;;;5860:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6666:1:::1;6646:22;;:8;:22;;;;6638:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6722:28;6741:8;6722:18;:28::i;:::-;6557:201:::0;:::o;18455:157::-;18540:4;18579:25;18564:40;;;:11;:40;;;;18557:47;;18455:157;;;:::o;31475:127::-;31540:4;31592:1;31564:30;;:7;:16;31572:7;31564:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31557:37;;31475:127;;;:::o;4372:98::-;4425:7;4452:10;4445:17;;4372:98;:::o;35621:174::-;35723:2;35696:15;:24;35712:7;35696:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35779:7;35775:2;35741:46;;35750:23;35765:7;35750:14;:23::i;:::-;35741:46;;;;;;;;;;;;35621:174;;:::o;976:114::-;1041:7;1068;:14;;;1061:21;;976:114;;;:::o;31769:348::-;31862:4;31887:16;31895:7;31887;:16::i;:::-;31879:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31963:13;31979:23;31994:7;31979:14;:23::i;:::-;31963:39;;32032:5;32021:16;;:7;:16;;;:52;;;;32041:32;32058:5;32065:7;32041:16;:32::i;:::-;32021:52;:87;;;;32101:7;32077:31;;:20;32089:7;32077:11;:20::i;:::-;:31;;;32021:87;32013:96;;;31769:348;;;;:::o;34878:625::-;35037:4;35010:31;;:23;35025:7;35010:14;:23::i;:::-;:31;;;35002:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35116:1;35102:16;;:2;:16;;;;35094:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35172:39;35193:4;35199:2;35203:7;35172:20;:39::i;:::-;35276:29;35293:1;35297:7;35276:8;:29::i;:::-;35337:1;35318:9;:15;35328:4;35318:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35366:1;35349:9;:13;35359:2;35349:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35397:2;35378:7;:16;35386:7;35378:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35436:7;35432:2;35417:27;;35426:4;35417:27;;;;;;;;;;;;35457:38;35477:4;35483:2;35487:7;35457:19;:38::i;:::-;34878:625;;;:::o;6918:191::-;6992:16;7011:6;;;;;;;;;;;6992:25;;7037:8;7028:6;;:17;;;;;;;;;;;;;;;;;;7092:8;7061:40;;7082:8;7061:40;;;;;;;;;;;;6981:128;6918:191;:::o;43276:204::-;43356:9;43351:124;43375:11;43371:1;:15;43351:124;;;43402:18;:6;:16;:18::i;:::-;43429:38;43439:9;43450:16;:6;:14;:16::i;:::-;43429:9;:38::i;:::-;43388:3;;;;;:::i;:::-;;;;43351:124;;;;43276:204;;:::o;35937:315::-;36092:8;36083:17;;:5;:17;;;;36075:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36179:8;36141:18;:25;36160:5;36141:25;;;;;;;;;;;;;;;:35;36167:8;36141:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36225:8;36203:41;;36218:5;36203:41;;;36235:8;36203:41;;;;;;:::i;:::-;;;;;;;;35937:315;;;:::o;30847:::-;31004:28;31014:4;31020:2;31024:7;31004:9;:28::i;:::-;31051:48;31074:4;31080:2;31084:7;31093:5;31051:22;:48::i;:::-;31043:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30847:315;;;;:::o;43486:104::-;43546:13;43575:9;43568:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43486:104;:::o;1934:723::-;1990:13;2220:1;2211:5;:10;2207:53;;;2238:10;;;;;;;;;;;;;;;;;;;;;2207:53;2270:12;2285:5;2270:20;;2301:14;2326:78;2341:1;2333:4;:9;2326:78;;2359:8;;;;;:::i;:::-;;;;2390:2;2382:10;;;;;:::i;:::-;;;2326:78;;;2414:19;2446:6;2436:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:39;;2464:154;2480:1;2471:5;:10;2464:154;;2508:1;2498:11;;;;;:::i;:::-;;;2575:2;2567:5;:10;;;;:::i;:::-;2554:2;:24;;;;:::i;:::-;2541:39;;2524:6;2531;2524:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2604:2;2595:11;;;;;:::i;:::-;;;2464:154;;;2642:6;2628:21;;;;;1934:723;;;;:::o;38188:126::-;;;;:::o;38699:125::-;;;;:::o;1098:127::-;1205:1;1187:7;:14;;;:19;;;;;;;;;;;1098:127;:::o;32459:110::-;32535:26;32545:2;32549:7;32535:26;;;;;;;;;;;;:9;:26::i;:::-;32459:110;;:::o;36817:799::-;36972:4;36993:15;:2;:13;;;:15::i;:::-;36989:620;;;37045:2;37029:36;;;37066:12;:10;:12::i;:::-;37080:4;37086:7;37095:5;37029:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37025:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37288:1;37271:6;:13;:18;37267:272;;;37314:60;;;;;;;;;;:::i;:::-;;;;;;;;37267:272;37489:6;37483:13;37474:6;37470:2;37466:15;37459:38;37025:529;37162:41;;;37152:51;;;:6;:51;;;;37145:58;;;;;36989:620;37593:4;37586:11;;36817:799;;;;;;;:::o;32796:321::-;32926:18;32932:2;32936:7;32926:5;:18::i;:::-;32977:54;33008:1;33012:2;33016:7;33025:5;32977:22;:54::i;:::-;32955:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32796:321;;;:::o;8349:326::-;8409:4;8666:1;8644:7;:19;;;:23;8637:30;;8349:326;;;:::o;33453:439::-;33547:1;33533:16;;:2;:16;;;;33525:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33606:16;33614:7;33606;:16::i;:::-;33605:17;33597:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33668:45;33697:1;33701:2;33705:7;33668:20;:45::i;:::-;33743:1;33726:9;:13;33736:2;33726:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33774:2;33755:7;:16;33763:7;33755:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33819:7;33815:2;33794:33;;33811:1;33794:33;;;;;;;;;;;;33840:44;33868:1;33872:2;33876:7;33840:19;:44::i;:::-;33453:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:474::-;7555:6;7563;7612:2;7600:9;7591:7;7587:23;7583:32;7580:119;;;7618:79;;:::i;:::-;7580:119;7738:1;7763:53;7808:7;7799:6;7788:9;7784:22;7763:53;:::i;:::-;7753:63;;7709:117;7865:2;7891:53;7936:7;7927:6;7916:9;7912:22;7891:53;:::i;:::-;7881:63;;7836:118;7487:474;;;;;:::o;7967:179::-;8036:10;8057:46;8099:3;8091:6;8057:46;:::i;:::-;8135:4;8130:3;8126:14;8112:28;;7967:179;;;;:::o;8152:118::-;8239:24;8257:5;8239:24;:::i;:::-;8234:3;8227:37;8152:118;;:::o;8306:732::-;8425:3;8454:54;8502:5;8454:54;:::i;:::-;8524:86;8603:6;8598:3;8524:86;:::i;:::-;8517:93;;8634:56;8684:5;8634:56;:::i;:::-;8713:7;8744:1;8729:284;8754:6;8751:1;8748:13;8729:284;;;8830:6;8824:13;8857:63;8916:3;8901:13;8857:63;:::i;:::-;8850:70;;8943:60;8996:6;8943:60;:::i;:::-;8933:70;;8789:224;8776:1;8773;8769:9;8764:14;;8729:284;;;8733:14;9029:3;9022:10;;8430:608;;;8306:732;;;;:::o;9044:109::-;9125:21;9140:5;9125:21;:::i;:::-;9120:3;9113:34;9044:109;;:::o;9159:360::-;9245:3;9273:38;9305:5;9273:38;:::i;:::-;9327:70;9390:6;9385:3;9327:70;:::i;:::-;9320:77;;9406:52;9451:6;9446:3;9439:4;9432:5;9428:16;9406:52;:::i;:::-;9483:29;9505:6;9483:29;:::i;:::-;9478:3;9474:39;9467:46;;9249:270;9159:360;;;;:::o;9525:364::-;9613:3;9641:39;9674:5;9641:39;:::i;:::-;9696:71;9760:6;9755:3;9696:71;:::i;:::-;9689:78;;9776:52;9821:6;9816:3;9809:4;9802:5;9798:16;9776:52;:::i;:::-;9853:29;9875:6;9853:29;:::i;:::-;9848:3;9844:39;9837:46;;9617:272;9525:364;;;;:::o;9895:377::-;10001:3;10029:39;10062:5;10029:39;:::i;:::-;10084:89;10166:6;10161:3;10084:89;:::i;:::-;10077:96;;10182:52;10227:6;10222:3;10215:4;10208:5;10204:16;10182:52;:::i;:::-;10259:6;10254:3;10250:16;10243:23;;10005:267;9895:377;;;;:::o;10302:845::-;10405:3;10442:5;10436:12;10471:36;10497:9;10471:36;:::i;:::-;10523:89;10605:6;10600:3;10523:89;:::i;:::-;10516:96;;10643:1;10632:9;10628:17;10659:1;10654:137;;;;10805:1;10800:341;;;;10621:520;;10654:137;10738:4;10734:9;10723;10719:25;10714:3;10707:38;10774:6;10769:3;10765:16;10758:23;;10654:137;;10800:341;10867:38;10899:5;10867:38;:::i;:::-;10927:1;10941:154;10955:6;10952:1;10949:13;10941:154;;;11029:7;11023:14;11019:1;11014:3;11010:11;11003:35;11079:1;11070:7;11066:15;11055:26;;10977:4;10974:1;10970:12;10965:17;;10941:154;;;11124:6;11119:3;11115:16;11108:23;;10807:334;;10621:520;;10409:738;;10302:845;;;;:::o;11153:365::-;11295:3;11316:66;11380:1;11375:3;11316:66;:::i;:::-;11309:73;;11391:93;11480:3;11391:93;:::i;:::-;11509:2;11504:3;11500:12;11493:19;;11153:365;;;:::o;11524:366::-;11666:3;11687:67;11751:2;11746:3;11687:67;:::i;:::-;11680:74;;11763:93;11852:3;11763:93;:::i;:::-;11881:2;11876:3;11872:12;11865:19;;11524:366;;;:::o;11896:::-;12038:3;12059:67;12123:2;12118:3;12059:67;:::i;:::-;12052:74;;12135:93;12224:3;12135:93;:::i;:::-;12253:2;12248:3;12244:12;12237:19;;11896:366;;;:::o;12268:::-;12410:3;12431:67;12495:2;12490:3;12431:67;:::i;:::-;12424:74;;12507:93;12596:3;12507:93;:::i;:::-;12625:2;12620:3;12616:12;12609:19;;12268:366;;;:::o;12640:::-;12782:3;12803:67;12867:2;12862:3;12803:67;:::i;:::-;12796:74;;12879:93;12968:3;12879:93;:::i;:::-;12997:2;12992:3;12988:12;12981:19;;12640:366;;;:::o;13012:::-;13154:3;13175:67;13239:2;13234:3;13175:67;:::i;:::-;13168:74;;13251:93;13340:3;13251:93;:::i;:::-;13369:2;13364:3;13360:12;13353:19;;13012:366;;;:::o;13384:::-;13526:3;13547:67;13611:2;13606:3;13547:67;:::i;:::-;13540:74;;13623:93;13712:3;13623:93;:::i;:::-;13741:2;13736:3;13732:12;13725:19;;13384:366;;;:::o;13756:::-;13898:3;13919:67;13983:2;13978:3;13919:67;:::i;:::-;13912:74;;13995:93;14084:3;13995:93;:::i;:::-;14113:2;14108:3;14104:12;14097:19;;13756:366;;;:::o;14128:::-;14270:3;14291:67;14355:2;14350:3;14291:67;:::i;:::-;14284:74;;14367:93;14456:3;14367:93;:::i;:::-;14485:2;14480:3;14476:12;14469:19;;14128:366;;;:::o;14500:::-;14642:3;14663:67;14727:2;14722:3;14663:67;:::i;:::-;14656:74;;14739:93;14828:3;14739:93;:::i;:::-;14857:2;14852:3;14848:12;14841:19;;14500:366;;;:::o;14872:::-;15014:3;15035:67;15099:2;15094:3;15035:67;:::i;:::-;15028:74;;15111:93;15200:3;15111:93;:::i;:::-;15229:2;15224:3;15220:12;15213:19;;14872:366;;;:::o;15244:::-;15386:3;15407:67;15471:2;15466:3;15407:67;:::i;:::-;15400:74;;15483:93;15572:3;15483:93;:::i;:::-;15601:2;15596:3;15592:12;15585:19;;15244:366;;;:::o;15616:::-;15758:3;15779:67;15843:2;15838:3;15779:67;:::i;:::-;15772:74;;15855:93;15944:3;15855:93;:::i;:::-;15973:2;15968:3;15964:12;15957:19;;15616:366;;;:::o;15988:::-;16130:3;16151:67;16215:2;16210:3;16151:67;:::i;:::-;16144:74;;16227:93;16316:3;16227:93;:::i;:::-;16345:2;16340:3;16336:12;16329:19;;15988:366;;;:::o;16360:::-;16502:3;16523:67;16587:2;16582:3;16523:67;:::i;:::-;16516:74;;16599:93;16688:3;16599:93;:::i;:::-;16717:2;16712:3;16708:12;16701:19;;16360:366;;;:::o;16732:::-;16874:3;16895:67;16959:2;16954:3;16895:67;:::i;:::-;16888:74;;16971:93;17060:3;16971:93;:::i;:::-;17089:2;17084:3;17080:12;17073:19;;16732:366;;;:::o;17104:::-;17246:3;17267:67;17331:2;17326:3;17267:67;:::i;:::-;17260:74;;17343:93;17432:3;17343:93;:::i;:::-;17461:2;17456:3;17452:12;17445:19;;17104:366;;;:::o;17476:::-;17618:3;17639:67;17703:2;17698:3;17639:67;:::i;:::-;17632:74;;17715:93;17804:3;17715:93;:::i;:::-;17833:2;17828:3;17824:12;17817:19;;17476:366;;;:::o;17848:398::-;18007:3;18028:83;18109:1;18104:3;18028:83;:::i;:::-;18021:90;;18120:93;18209:3;18120:93;:::i;:::-;18238:1;18233:3;18229:11;18222:18;;17848:398;;;:::o;18252:366::-;18394:3;18415:67;18479:2;18474:3;18415:67;:::i;:::-;18408:74;;18491:93;18580:3;18491:93;:::i;:::-;18609:2;18604:3;18600:12;18593:19;;18252:366;;;:::o;18624:365::-;18766:3;18787:66;18851:1;18846:3;18787:66;:::i;:::-;18780:73;;18862:93;18951:3;18862:93;:::i;:::-;18980:2;18975:3;18971:12;18964:19;;18624:365;;;:::o;18995:108::-;19072:24;19090:5;19072:24;:::i;:::-;19067:3;19060:37;18995:108;;:::o;19109:118::-;19196:24;19214:5;19196:24;:::i;:::-;19191:3;19184:37;19109:118;;:::o;19233:589::-;19458:3;19480:95;19571:3;19562:6;19480:95;:::i;:::-;19473:102;;19592:95;19683:3;19674:6;19592:95;:::i;:::-;19585:102;;19704:92;19792:3;19783:6;19704:92;:::i;:::-;19697:99;;19813:3;19806:10;;19233:589;;;;;;:::o;19828:379::-;20012:3;20034:147;20177:3;20034:147;:::i;:::-;20027:154;;20198:3;20191:10;;19828:379;;;:::o;20213:222::-;20306:4;20344:2;20333:9;20329:18;20321:26;;20357:71;20425:1;20414:9;20410:17;20401:6;20357:71;:::i;:::-;20213:222;;;;:::o;20441:640::-;20636:4;20674:3;20663:9;20659:19;20651:27;;20688:71;20756:1;20745:9;20741:17;20732:6;20688:71;:::i;:::-;20769:72;20837:2;20826:9;20822:18;20813:6;20769:72;:::i;:::-;20851;20919:2;20908:9;20904:18;20895:6;20851:72;:::i;:::-;20970:9;20964:4;20960:20;20955:2;20944:9;20940:18;20933:48;20998:76;21069:4;21060:6;20998:76;:::i;:::-;20990:84;;20441:640;;;;;;;:::o;21087:373::-;21230:4;21268:2;21257:9;21253:18;21245:26;;21317:9;21311:4;21307:20;21303:1;21292:9;21288:17;21281:47;21345:108;21448:4;21439:6;21345:108;:::i;:::-;21337:116;;21087:373;;;;:::o;21466:210::-;21553:4;21591:2;21580:9;21576:18;21568:26;;21604:65;21666:1;21655:9;21651:17;21642:6;21604:65;:::i;:::-;21466:210;;;;:::o;21682:313::-;21795:4;21833:2;21822:9;21818:18;21810:26;;21882:9;21876:4;21872:20;21868:1;21857:9;21853:17;21846:47;21910:78;21983:4;21974:6;21910:78;:::i;:::-;21902:86;;21682:313;;;;:::o;22001:419::-;22167:4;22205:2;22194:9;22190:18;22182:26;;22254:9;22248:4;22244:20;22240:1;22229:9;22225:17;22218:47;22282:131;22408:4;22282:131;:::i;:::-;22274:139;;22001:419;;;:::o;22426:::-;22592:4;22630:2;22619:9;22615:18;22607:26;;22679:9;22673:4;22669:20;22665:1;22654:9;22650:17;22643:47;22707:131;22833:4;22707:131;:::i;:::-;22699:139;;22426:419;;;:::o;22851:::-;23017:4;23055:2;23044:9;23040:18;23032:26;;23104:9;23098:4;23094:20;23090:1;23079:9;23075:17;23068:47;23132:131;23258:4;23132:131;:::i;:::-;23124:139;;22851:419;;;:::o;23276:::-;23442:4;23480:2;23469:9;23465:18;23457:26;;23529:9;23523:4;23519:20;23515:1;23504:9;23500:17;23493:47;23557:131;23683:4;23557:131;:::i;:::-;23549:139;;23276:419;;;:::o;23701:::-;23867:4;23905:2;23894:9;23890:18;23882:26;;23954:9;23948:4;23944:20;23940:1;23929:9;23925:17;23918:47;23982:131;24108:4;23982:131;:::i;:::-;23974:139;;23701:419;;;:::o;24126:::-;24292:4;24330:2;24319:9;24315:18;24307:26;;24379:9;24373:4;24369:20;24365:1;24354:9;24350:17;24343:47;24407:131;24533:4;24407:131;:::i;:::-;24399:139;;24126:419;;;:::o;24551:::-;24717:4;24755:2;24744:9;24740:18;24732:26;;24804:9;24798:4;24794:20;24790:1;24779:9;24775:17;24768:47;24832:131;24958:4;24832:131;:::i;:::-;24824:139;;24551:419;;;:::o;24976:::-;25142:4;25180:2;25169:9;25165:18;25157:26;;25229:9;25223:4;25219:20;25215:1;25204:9;25200:17;25193:47;25257:131;25383:4;25257:131;:::i;:::-;25249:139;;24976:419;;;:::o;25401:::-;25567:4;25605:2;25594:9;25590:18;25582:26;;25654:9;25648:4;25644:20;25640:1;25629:9;25625:17;25618:47;25682:131;25808:4;25682:131;:::i;:::-;25674:139;;25401:419;;;:::o;25826:::-;25992:4;26030:2;26019:9;26015:18;26007:26;;26079:9;26073:4;26069:20;26065:1;26054:9;26050:17;26043:47;26107:131;26233:4;26107:131;:::i;:::-;26099:139;;25826:419;;;:::o;26251:::-;26417:4;26455:2;26444:9;26440:18;26432:26;;26504:9;26498:4;26494:20;26490:1;26479:9;26475:17;26468:47;26532:131;26658:4;26532:131;:::i;:::-;26524:139;;26251:419;;;:::o;26676:::-;26842:4;26880:2;26869:9;26865:18;26857:26;;26929:9;26923:4;26919:20;26915:1;26904:9;26900:17;26893:47;26957:131;27083:4;26957:131;:::i;:::-;26949:139;;26676:419;;;:::o;27101:::-;27267:4;27305:2;27294:9;27290:18;27282:26;;27354:9;27348:4;27344:20;27340:1;27329:9;27325:17;27318:47;27382:131;27508:4;27382:131;:::i;:::-;27374:139;;27101:419;;;:::o;27526:::-;27692:4;27730:2;27719:9;27715:18;27707:26;;27779:9;27773:4;27769:20;27765:1;27754:9;27750:17;27743:47;27807:131;27933:4;27807:131;:::i;:::-;27799:139;;27526:419;;;:::o;27951:::-;28117:4;28155:2;28144:9;28140:18;28132:26;;28204:9;28198:4;28194:20;28190:1;28179:9;28175:17;28168:47;28232:131;28358:4;28232:131;:::i;:::-;28224:139;;27951:419;;;:::o;28376:::-;28542:4;28580:2;28569:9;28565:18;28557:26;;28629:9;28623:4;28619:20;28615:1;28604:9;28600:17;28593:47;28657:131;28783:4;28657:131;:::i;:::-;28649:139;;28376:419;;;:::o;28801:::-;28967:4;29005:2;28994:9;28990:18;28982:26;;29054:9;29048:4;29044:20;29040:1;29029:9;29025:17;29018:47;29082:131;29208:4;29082:131;:::i;:::-;29074:139;;28801:419;;;:::o;29226:::-;29392:4;29430:2;29419:9;29415:18;29407:26;;29479:9;29473:4;29469:20;29465:1;29454:9;29450:17;29443:47;29507:131;29633:4;29507:131;:::i;:::-;29499:139;;29226:419;;;:::o;29651:::-;29817:4;29855:2;29844:9;29840:18;29832:26;;29904:9;29898:4;29894:20;29890:1;29879:9;29875:17;29868:47;29932:131;30058:4;29932:131;:::i;:::-;29924:139;;29651:419;;;:::o;30076:::-;30242:4;30280:2;30269:9;30265:18;30257:26;;30329:9;30323:4;30319:20;30315:1;30304:9;30300:17;30293:47;30357:131;30483:4;30357:131;:::i;:::-;30349:139;;30076:419;;;:::o;30501:222::-;30594:4;30632:2;30621:9;30617:18;30609:26;;30645:71;30713:1;30702:9;30698:17;30689:6;30645:71;:::i;:::-;30501:222;;;;:::o;30729:129::-;30763:6;30790:20;;:::i;:::-;30780:30;;30819:33;30847:4;30839:6;30819:33;:::i;:::-;30729:129;;;:::o;30864:75::-;30897:6;30930:2;30924:9;30914:19;;30864:75;:::o;30945:307::-;31006:4;31096:18;31088:6;31085:30;31082:56;;;31118:18;;:::i;:::-;31082:56;31156:29;31178:6;31156:29;:::i;:::-;31148:37;;31240:4;31234;31230:15;31222:23;;30945:307;;;:::o;31258:308::-;31320:4;31410:18;31402:6;31399:30;31396:56;;;31432:18;;:::i;:::-;31396:56;31470:29;31492:6;31470:29;:::i;:::-;31462:37;;31554:4;31548;31544:15;31536:23;;31258:308;;;:::o;31572:132::-;31639:4;31662:3;31654:11;;31692:4;31687:3;31683:14;31675:22;;31572:132;;;:::o;31710:141::-;31759:4;31782:3;31774:11;;31805:3;31802:1;31795:14;31839:4;31836:1;31826:18;31818:26;;31710:141;;;:::o;31857:114::-;31924:6;31958:5;31952:12;31942:22;;31857:114;;;:::o;31977:98::-;32028:6;32062:5;32056:12;32046:22;;31977:98;;;:::o;32081:99::-;32133:6;32167:5;32161:12;32151:22;;32081:99;;;:::o;32186:113::-;32256:4;32288;32283:3;32279:14;32271:22;;32186:113;;;:::o;32305:184::-;32404:11;32438:6;32433:3;32426:19;32478:4;32473:3;32469:14;32454:29;;32305:184;;;;:::o;32495:168::-;32578:11;32612:6;32607:3;32600:19;32652:4;32647:3;32643:14;32628:29;;32495:168;;;;:::o;32669:147::-;32770:11;32807:3;32792:18;;32669:147;;;;:::o;32822:169::-;32906:11;32940:6;32935:3;32928:19;32980:4;32975:3;32971:14;32956:29;;32822:169;;;;:::o;32997:148::-;33099:11;33136:3;33121:18;;32997:148;;;;:::o;33151:305::-;33191:3;33210:20;33228:1;33210:20;:::i;:::-;33205:25;;33244:20;33262:1;33244:20;:::i;:::-;33239:25;;33398:1;33330:66;33326:74;33323:1;33320:81;33317:107;;;33404:18;;:::i;:::-;33317:107;33448:1;33445;33441:9;33434:16;;33151:305;;;;:::o;33462:185::-;33502:1;33519:20;33537:1;33519:20;:::i;:::-;33514:25;;33553:20;33571:1;33553:20;:::i;:::-;33548:25;;33592:1;33582:35;;33597:18;;:::i;:::-;33582:35;33639:1;33636;33632:9;33627:14;;33462:185;;;;:::o;33653:348::-;33693:7;33716:20;33734:1;33716:20;:::i;:::-;33711:25;;33750:20;33768:1;33750:20;:::i;:::-;33745:25;;33938:1;33870:66;33866:74;33863:1;33860:81;33855:1;33848:9;33841:17;33837:105;33834:131;;;33945:18;;:::i;:::-;33834:131;33993:1;33990;33986:9;33975:20;;33653:348;;;;:::o;34007:191::-;34047:4;34067:20;34085:1;34067:20;:::i;:::-;34062:25;;34101:20;34119:1;34101:20;:::i;:::-;34096:25;;34140:1;34137;34134:8;34131:34;;;34145:18;;:::i;:::-;34131:34;34190:1;34187;34183:9;34175:17;;34007:191;;;;:::o;34204:96::-;34241:7;34270:24;34288:5;34270:24;:::i;:::-;34259:35;;34204:96;;;:::o;34306:90::-;34340:7;34383:5;34376:13;34369:21;34358:32;;34306:90;;;:::o;34402:149::-;34438:7;34478:66;34471:5;34467:78;34456:89;;34402:149;;;:::o;34557:126::-;34594:7;34634:42;34627:5;34623:54;34612:65;;34557:126;;;:::o;34689:77::-;34726:7;34755:5;34744:16;;34689:77;;;:::o;34772:154::-;34856:6;34851:3;34846;34833:30;34918:1;34909:6;34904:3;34900:16;34893:27;34772:154;;;:::o;34932:307::-;35000:1;35010:113;35024:6;35021:1;35018:13;35010:113;;;35109:1;35104:3;35100:11;35094:18;35090:1;35085:3;35081:11;35074:39;35046:2;35043:1;35039:10;35034:15;;35010:113;;;35141:6;35138:1;35135:13;35132:101;;;35221:1;35212:6;35207:3;35203:16;35196:27;35132:101;34981:258;34932:307;;;:::o;35245:320::-;35289:6;35326:1;35320:4;35316:12;35306:22;;35373:1;35367:4;35363:12;35394:18;35384:81;;35450:4;35442:6;35438:17;35428:27;;35384:81;35512:2;35504:6;35501:14;35481:18;35478:38;35475:84;;;35531:18;;:::i;:::-;35475:84;35296:269;35245:320;;;:::o;35571:281::-;35654:27;35676:4;35654:27;:::i;:::-;35646:6;35642:40;35784:6;35772:10;35769:22;35748:18;35736:10;35733:34;35730:62;35727:88;;;35795:18;;:::i;:::-;35727:88;35835:10;35831:2;35824:22;35614:238;35571:281;;:::o;35858:233::-;35897:3;35920:24;35938:5;35920:24;:::i;:::-;35911:33;;35966:66;35959:5;35956:77;35953:103;;;36036:18;;:::i;:::-;35953:103;36083:1;36076:5;36072:13;36065:20;;35858:233;;;:::o;36097:176::-;36129:1;36146:20;36164:1;36146:20;:::i;:::-;36141:25;;36180:20;36198:1;36180:20;:::i;:::-;36175:25;;36219:1;36209:35;;36224:18;;:::i;:::-;36209:35;36265:1;36262;36258:9;36253:14;;36097:176;;;;:::o;36279:180::-;36327:77;36324:1;36317:88;36424:4;36421:1;36414:15;36448:4;36445:1;36438:15;36465:180;36513:77;36510:1;36503:88;36610:4;36607:1;36600:15;36634:4;36631:1;36624:15;36651:180;36699:77;36696:1;36689:88;36796:4;36793:1;36786:15;36820:4;36817:1;36810:15;36837:180;36885:77;36882:1;36875:88;36982:4;36979:1;36972:15;37006:4;37003:1;36996:15;37023:180;37071:77;37068:1;37061:88;37168:4;37165:1;37158:15;37192:4;37189:1;37182:15;37209:117;37318:1;37315;37308:12;37332:117;37441:1;37438;37431:12;37455:117;37564:1;37561;37554:12;37578:117;37687:1;37684;37677:12;37701:102;37742:6;37793:2;37789:7;37784:2;37777:5;37773:14;37769:28;37759:38;;37701:102;;;:::o;37809:154::-;37949:6;37945:1;37937:6;37933:14;37926:30;37809:154;:::o;37969:237::-;38109:34;38105:1;38097:6;38093:14;38086:58;38178:20;38173:2;38165:6;38161:15;38154:45;37969:237;:::o;38212:225::-;38352:34;38348:1;38340:6;38336:14;38329:58;38421:8;38416:2;38408:6;38404:15;38397:33;38212:225;:::o;38443:224::-;38583:34;38579:1;38571:6;38567:14;38560:58;38652:7;38647:2;38639:6;38635:15;38628:32;38443:224;:::o;38673:178::-;38813:30;38809:1;38801:6;38797:14;38790:54;38673:178;:::o;38857:179::-;38997:31;38993:1;38985:6;38981:14;38974:55;38857:179;:::o;39042:223::-;39182:34;39178:1;39170:6;39166:14;39159:58;39251:6;39246:2;39238:6;39234:15;39227:31;39042:223;:::o;39271:175::-;39411:27;39407:1;39399:6;39395:14;39388:51;39271:175;:::o;39452:231::-;39592:34;39588:1;39580:6;39576:14;39569:58;39661:14;39656:2;39648:6;39644:15;39637:39;39452:231;:::o;39689:243::-;39829:34;39825:1;39817:6;39813:14;39806:58;39898:26;39893:2;39885:6;39881:15;39874:51;39689:243;:::o;39938:229::-;40078:34;40074:1;40066:6;40062:14;40055:58;40147:12;40142:2;40134:6;40130:15;40123:37;39938:229;:::o;40173:228::-;40313:34;40309:1;40301:6;40297:14;40290:58;40382:11;40377:2;40369:6;40365:15;40358:36;40173:228;:::o;40407:172::-;40547:24;40543:1;40535:6;40531:14;40524:48;40407:172;:::o;40585:182::-;40725:34;40721:1;40713:6;40709:14;40702:58;40585:182;:::o;40773:231::-;40913:34;40909:1;40901:6;40897:14;40890:58;40982:14;40977:2;40969:6;40965:15;40958:39;40773:231;:::o;41010:182::-;41150:34;41146:1;41138:6;41134:14;41127:58;41010:182;:::o;41198:234::-;41338:34;41334:1;41326:6;41322:14;41315:58;41407:17;41402:2;41394:6;41390:15;41383:42;41198:234;:::o;41438:220::-;41578:34;41574:1;41566:6;41562:14;41555:58;41647:3;41642:2;41634:6;41630:15;41623:28;41438:220;:::o;41664:114::-;;:::o;41784:236::-;41924:34;41920:1;41912:6;41908:14;41901:58;41993:19;41988:2;41980:6;41976:15;41969:44;41784:236;:::o;42026:159::-;42166:11;42162:1;42154:6;42150:14;42143:35;42026:159;:::o;42191:122::-;42264:24;42282:5;42264:24;:::i;:::-;42257:5;42254:35;42244:63;;42303:1;42300;42293:12;42244:63;42191:122;:::o;42319:116::-;42389:21;42404:5;42389:21;:::i;:::-;42382:5;42379:32;42369:60;;42425:1;42422;42415:12;42369:60;42319:116;:::o;42441:120::-;42513:23;42530:5;42513:23;:::i;:::-;42506:5;42503:34;42493:62;;42551:1;42548;42541:12;42493:62;42441:120;:::o;42567:122::-;42640:24;42658:5;42640:24;:::i;:::-;42633:5;42630:35;42620:63;;42679:1;42676;42669:12;42620:63;42567:122;:::o

Swarm Source

ipfs://dd6dfc2d10c1a98b96e4a84f3e4e67926fe177f4bef9b448f2c84154a66f7bf6
Loading...
Loading
Loading...
Loading
[ 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.