ETH Price: $2,510.86 (-4.75%)

Token

Mutant Doodles (MDOODLE)
 

Overview

Max Total Supply

5,658 MDOODLE

Holders

1,740

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 MDOODLE
0x73865aB70431b874619AB8Fe36bb2c292A643B2f
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:
Mutant_Doodles

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                      +
+                                                                                                                      +
.                                                                                                                      .
.                                                                                                                      .
.                                                                                                                      .
.                                                                                                                      .
.                               ███╗░░░███╗██╗░░░██╗████████╗░█████╗░███╗░░██╗████████╗                                .
.                               ████╗░████║██║░░░██║╚══██╔══╝██╔══██╗████╗░██║╚══██╔══╝                                .
.                               ██╔████╔██║██║░░░██║░░░██║░░░███████║██╔██╗██║░░░██║░░░                                .
.                               ██║╚██╔╝██║██║░░░██║░░░██║░░░██╔══██║██║╚████║░░░██║░░░                                .
.                               ██║░╚═╝░██║╚██████╔╝░░░██║░░░██║░░██║██║░╚███║░░░██║░░░                                .
.                               ╚═╝░░░░░╚═╝░╚═════╝░░░░╚═╝░░░╚═╝░░╚═╝╚═╝░░╚══╝░░░╚═╝░░░                                .
.                                                                                                                      .
.                               ██████╗░░█████╗░░█████╗░██████╗░██╗░░░░░███████╗░██████╗                               .
.                               ██╔══██╗██╔══██╗██╔══██╗██╔══██╗██║░░░░░██╔════╝██╔════╝                               .
.                               ██║░░██║██║░░██║██║░░██║██║░░██║██║░░░░░█████╗░░╚█████╗░                               .
.                               ██║░░██║██║░░██║██║░░██║██║░░██║██║░░░░░██╔══╝░░░╚═══██╗                               .
.                               ██████╔╝╚█████╔╝╚█████╔╝██████╔╝███████╗███████╗██████╔╝                               .
.                               ╚═════╝░░╚════╝░░╚════╝░╚═════╝░╚══════╝╚══════╝╚═════╝░                               .
.                                                                                                                      .
.                                                                                                                      .
.                                                                                                                      .
.                                                                                                                      .
+                                                                                                                      +
+                                                                                                                      +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - ++ - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

// SPDX-License-Identifier: MIT

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

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

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

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
            }
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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(), ".json")) : "";
    }

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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 of token that is not own");
        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);
    }

    /**
     * @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 {}
}

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);
}

contract Mutant_Doodles is ERC721, Ownable, IERC721Enumerable {


    uint16 public counter = 1;
    uint public salePrice;
    uint public AllowListPrice;
    uint16 public maxSupply = 10000;
    uint8 public maxTokensPerWallet;
    uint8 public maxAllowListTokensPerWallet;

    bool public AllowListStatus;
    bool public saleStatus;

    string public baseURI;

    address public tokenForAllowList;

    mapping(address => uint8) public _maxTokensPerWallet;
    mapping(address => bool) public _allowListed;
    mapping(address => uint8) public _maxAllowListTokensPerWallet;

    constructor() ERC721("Mutant Doodles", "MDOODLE") {}

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

    function setBaseURI(string memory _newURI) external onlyOwner {
        baseURI = _newURI;
    }

    function addToAllowList(address[] memory wallets) external onlyOwner {
        for(uint8 i = 0; i<wallets.length; i++){
            _allowListed[wallets[i]] = !_allowListed[wallets[i]];
        }    
    }

    function setTokenForAllowList(address _token) external onlyOwner {
        tokenForAllowList = _token;
    }

    function setSalePrice(uint price) external onlyOwner {
        salePrice = price;
    }

    function setAllowListPrice(uint price) external onlyOwner {
        AllowListPrice = price;
    }

    function setMaxTokensPerWallet(uint8 max) external onlyOwner {
        maxTokensPerWallet = max;
    }

    function setMaxAllowListTokensPerWallet(uint8 max) external onlyOwner {
        maxAllowListTokensPerWallet = max;
    }

    function setAllowListSaleState() external onlyOwner {
        AllowListStatus = !AllowListStatus;
    }

    function setSaleStatus() external onlyOwner {
        saleStatus = !saleStatus;
    }

    function checkIfOwner(address owner) internal view returns(uint) {
        return IERC721(tokenForAllowList).balanceOf(owner);
    }

    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function totalSupply() public view virtual override returns (uint256) {
        return counter - 1;
    }

    function mintAllowList(uint8 amount) external payable {
        require(msg.value == AllowListPrice * amount, "Incorrect value!");
        require(AllowListStatus, "AllowList not active!");
        require(_maxAllowListTokensPerWallet[msg.sender] + amount <= maxAllowListTokensPerWallet, "Max tokens per wallet on AllowList!");
        require(checkIfOwner(msg.sender) > 0 || _allowListed[msg.sender], "Token from other contract not owned!");
        for(uint8 i = 0; i < amount; i++){
            _safeMint(msg.sender, counter);
            counter++;
            _maxAllowListTokensPerWallet[msg.sender]++;
        }
    }

    function mint(uint8 amount) external payable {
        require(msg.value == salePrice * amount, "Incorrect value!");
        require(counter + amount <= 10000, "Not enough tokens to sell!");
        require(saleStatus, "Sale not active!");
        require(_maxTokensPerWallet[msg.sender] + amount <= maxTokensPerWallet, "Max tokens per wallet on AllowList!");
        for(uint8 i = 0; i < amount; i++){
            _safeMint(msg.sender, counter);
            counter++;
            _maxTokensPerWallet[msg.sender]++;
        }
    }
}

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":[],"name":"AllowListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AllowListStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_allowListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_maxAllowListTokensPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_maxTokensPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addToAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"counter","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"maxAllowListTokensPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"mintAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setAllowListPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAllowListSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"max","type":"uint8"}],"name":"setMaxAllowListTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"max","type":"uint8"}],"name":"setMaxTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setTokenForAllowList","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":[],"name":"tokenForAllowList","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600660146101000a81548161ffff021916908361ffff160217905550612710600960006101000a81548161ffff021916908361ffff1602179055503480156200004e57600080fd5b506040518060400160405280600e81526020017f4d7574616e7420446f6f646c65730000000000000000000000000000000000008152506040518060400160405280600781526020017f4d444f4f444c45000000000000000000000000000000000000000000000000008152508160009080519060200190620000d3929190620001e3565b508060019080519060200190620000ec929190620001e3565b5050506200010f620001036200011560201b60201c565b6200011d60201b60201c565b620002f8565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f19062000293565b90600052602060002090601f01602090048101928262000215576000855562000261565b82601f106200023057805160ff191683800117855562000261565b8280016001018555821562000261579182015b828111156200026057825182559160200191906001019062000243565b5b50905062000270919062000274565b5090565b5b808211156200028f57600081600090555060010162000275565b5090565b60006002820490506001821680620002ac57607f821691505b60208210811415620002c357620002c2620002c9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6147ae80620003086000396000f3fe6080604052600436106102515760003560e01c806369669f9111610139578063a318ce13116100b6578063d5abeb011161007a578063d5abeb011461087b578063ddff5b1c146108a6578063e985e9c5146108c2578063f2fde38b146108ff578063f51f96dd14610928578063f9020e331461095357610251565b8063a318ce1314610796578063a62651f8146107ad578063b259aaf6146107ea578063b88d4fde14610815578063c87b56dd1461083e57610251565b8063715018a6116100fd578063715018a6146106d75780637263cfe2146106ee5780638da5cb5b1461071757806395d89b4114610742578063a22cb4651461076d57610251565b806369669f91146105ed5780636c0360eb1461062a5780636df9fa88146106555780636ecd23061461067e57806370a082311461069a57610251565b80633818294d116101d2578063502b33af11610196578063502b33af146104f157806355f804b3146105085780635d692a2b1461053157806361bc221a1461055c5780636352211e1461058757806367146718146105c457610251565b80633818294d1461041e5780633ccfd60b1461045b57806342842e0e1461047257806344bb25061461049b578063469132ce146104c657610251565b8063141129f911610219578063141129f91461034f57806318160ddd146103785780631919fed7146103a357806323b872dd146103cc5780632b59717b146103f557610251565b80630133b08d1461025657806301ffc9a71461028157806306fdde03146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061026b61097e565b6040516102789190613df9565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a391906133fa565b6109a4565b6040516102b59190613e60565b60405180910390f35b3480156102ca57600080fd5b506102d3610a86565b6040516102e09190613e7b565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b919061348d565b610b18565b60405161031d9190613df9565b60405180910390f35b34801561033257600080fd5b5061034d6004803603810190610348919061337d565b610b9d565b005b34801561035b57600080fd5b50610376600480360381019061037191906134df565b610cb5565b005b34801561038457600080fd5b5061038d610d4f565b60405161039a9190614178565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c5919061348d565b610d77565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613277565b610dfd565b005b34801561040157600080fd5b5061041c600480360381019061041791906134df565b610e5d565b005b34801561042a57600080fd5b5061044560048036038101906104409190613212565b610ef7565b6040516104529190614193565b60405180910390f35b34801561046757600080fd5b50610470610f17565b005b34801561047e57600080fd5b5061049960048036038101906104949190613277565b610fdc565b005b3480156104a757600080fd5b506104b0610ffc565b6040516104bd9190613e60565b60405180910390f35b3480156104d257600080fd5b506104db61100f565b6040516104e89190614193565b60405180910390f35b3480156104fd57600080fd5b50610506611022565b005b34801561051457600080fd5b5061052f600480360381019061052a919061344c565b6110ca565b005b34801561053d57600080fd5b50610546611160565b6040516105539190614193565b60405180910390f35b34801561056857600080fd5b50610571611173565b60405161057e919061415d565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a9919061348d565b611187565b6040516105bb9190613df9565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190613212565b611239565b005b3480156105f957600080fd5b50610614600480360381019061060f9190613212565b6112f9565b6040516106219190613e60565b60405180910390f35b34801561063657600080fd5b5061063f611319565b60405161064c9190613e7b565b60405180910390f35b34801561066157600080fd5b5061067c6004803603810190610677919061348d565b6113a7565b005b610698600480360381019061069391906134df565b61142d565b005b3480156106a657600080fd5b506106c160048036038101906106bc9190613212565b6116da565b6040516106ce9190614178565b60405180910390f35b3480156106e357600080fd5b506106ec611792565b005b3480156106fa57600080fd5b50610715600480360381019061071091906133b9565b61181a565b005b34801561072357600080fd5b5061072c6119e6565b6040516107399190613df9565b60405180910390f35b34801561074e57600080fd5b50610757611a10565b6040516107649190613e7b565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190613341565b611aa2565b005b3480156107a257600080fd5b506107ab611ab8565b005b3480156107b957600080fd5b506107d460048036038101906107cf9190613212565b611b60565b6040516107e19190614193565b60405180910390f35b3480156107f657600080fd5b506107ff611b80565b60405161080c9190614178565b60405180910390f35b34801561082157600080fd5b5061083c600480360381019061083791906132c6565b611b86565b005b34801561084a57600080fd5b506108656004803603810190610860919061348d565b611be8565b6040516108729190613e7b565b60405180910390f35b34801561088757600080fd5b50610890611c8f565b60405161089d919061415d565b60405180910390f35b6108c060048036038101906108bb91906134df565b611ca3565b005b3480156108ce57600080fd5b506108e960048036038101906108e4919061323b565b611f88565b6040516108f69190613e60565b60405180910390f35b34801561090b57600080fd5b5061092660048036038101906109219190613212565b61201c565b005b34801561093457600080fd5b5061093d612114565b60405161094a9190614178565b60405180910390f35b34801561095f57600080fd5b5061096861211a565b6040516109759190613e60565b60405180910390f35b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a7f5750610a7e8261212d565b5b9050919050565b606060008054610a9590614537565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac190614537565b8015610b0e5780601f10610ae357610100808354040283529160200191610b0e565b820191906000526020600020905b815481529060010190602001808311610af157829003601f168201915b5050505050905090565b6000610b2382612197565b610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b599061405d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ba882611187565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c10906140dd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c38612203565b73ffffffffffffffffffffffffffffffffffffffff161480610c675750610c6681610c61612203565b611f88565b5b610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90613fbd565b60405180910390fd5b610cb0838361220b565b505050565b610cbd612203565b73ffffffffffffffffffffffffffffffffffffffff16610cdb6119e6565b73ffffffffffffffffffffffffffffffffffffffff1614610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d289061407d565b60405180910390fd5b80600960026101000a81548160ff021916908360ff16021790555050565b60006001600660149054906101000a900461ffff16610d6e91906143fe565b61ffff16905090565b610d7f612203565b73ffffffffffffffffffffffffffffffffffffffff16610d9d6119e6565b73ffffffffffffffffffffffffffffffffffffffff1614610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea9061407d565b60405180910390fd5b8060078190555050565b610e0e610e08612203565b826122c4565b610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e449061413d565b60405180910390fd5b610e588383836123a2565b505050565b610e65612203565b73ffffffffffffffffffffffffffffffffffffffff16610e836119e6565b73ffffffffffffffffffffffffffffffffffffffff1614610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed09061407d565b60405180910390fd5b80600960036101000a81548160ff021916908360ff16021790555050565b600e6020528060005260406000206000915054906101000a900460ff1681565b610f1f612203565b73ffffffffffffffffffffffffffffffffffffffff16610f3d6119e6565b73ffffffffffffffffffffffffffffffffffffffff1614610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a9061407d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610fd9573d6000803e3d6000fd5b50565b610ff783838360405180602001604052806000815250611b86565b505050565b600960049054906101000a900460ff1681565b600960029054906101000a900460ff1681565b61102a612203565b73ffffffffffffffffffffffffffffffffffffffff166110486119e6565b73ffffffffffffffffffffffffffffffffffffffff161461109e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110959061407d565b60405180910390fd5b600960059054906101000a900460ff1615600960056101000a81548160ff021916908315150217905550565b6110d2612203565b73ffffffffffffffffffffffffffffffffffffffff166110f06119e6565b73ffffffffffffffffffffffffffffffffffffffff1614611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d9061407d565b60405180910390fd5b80600a908051906020019061115c929190612f76565b5050565b600960039054906101000a900460ff1681565b600660149054906101000a900461ffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611230576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112279061401d565b60405180910390fd5b80915050919050565b611241612203565b73ffffffffffffffffffffffffffffffffffffffff1661125f6119e6565b73ffffffffffffffffffffffffffffffffffffffff16146112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac9061407d565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d6020528060005260406000206000915054906101000a900460ff1681565b600a805461132690614537565b80601f016020809104026020016040519081016040528092919081815260200182805461135290614537565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b505050505081565b6113af612203565b73ffffffffffffffffffffffffffffffffffffffff166113cd6119e6565b73ffffffffffffffffffffffffffffffffffffffff1614611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a9061407d565b60405180910390fd5b8060088190555050565b8060ff1660075461143e91906143a4565b341461147f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114769061411d565b60405180910390fd5b6127108160ff16600660149054906101000a900461ffff166114a191906142ae565b61ffff1611156114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd90613f1d565b60405180910390fd5b600960059054906101000a900460ff16611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90613f7d565b60405180910390fd5b600960029054906101000a900460ff1660ff1681600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115a0919061433c565b60ff1611156115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db90613e9d565b60405180910390fd5b60005b8160ff168160ff1610156116d65761161333600660149054906101000a900461ffff1661ffff166125fe565b6006601481819054906101000a900461ffff168092919061163390614569565b91906101000a81548161ffff021916908361ffff16021790555050600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff16809291906116aa906145dd565b91906101000a81548160ff021916908360ff1602179055505080806116ce906145dd565b9150506115e7565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290613ffd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61179a612203565b73ffffffffffffffffffffffffffffffffffffffff166117b86119e6565b73ffffffffffffffffffffffffffffffffffffffff161461180e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118059061407d565b60405180910390fd5b611818600061261c565b565b611822612203565b73ffffffffffffffffffffffffffffffffffffffff166118406119e6565b73ffffffffffffffffffffffffffffffffffffffff1614611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d9061407d565b60405180910390fd5b60005b81518160ff1610156119e257600d6000838360ff16815181106118e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600d6000848460ff1681518110611976577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806119da906145dd565b915050611899565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611a1f90614537565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4b90614537565b8015611a985780601f10611a6d57610100808354040283529160200191611a98565b820191906000526020600020905b815481529060010190602001808311611a7b57829003601f168201915b5050505050905090565b611ab4611aad612203565b83836126e2565b5050565b611ac0612203565b73ffffffffffffffffffffffffffffffffffffffff16611ade6119e6565b73ffffffffffffffffffffffffffffffffffffffff1614611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b9061407d565b60405180910390fd5b600960049054906101000a900460ff1615600960046101000a81548160ff021916908315150217905550565b600c6020528060005260406000206000915054906101000a900460ff1681565b60085481565b611b97611b91612203565b836122c4565b611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd9061413d565b60405180910390fd5b611be28484848461284f565b50505050565b6060611bf382612197565b611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c29906140bd565b60405180910390fd5b6000611c3c6128ab565b90506000815111611c5c5760405180602001604052806000815250611c87565b80611c668461293d565b604051602001611c77929190613dca565b6040516020818303038152906040525b915050919050565b600960009054906101000a900461ffff1681565b8060ff16600854611cb491906143a4565b3414611cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cec9061411d565b60405180910390fd5b600960049054906101000a900460ff16611d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3b90613fdd565b60405180910390fd5b600960039054906101000a900460ff1660ff1681600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611daf919061433c565b60ff161115611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea90613e9d565b60405180910390fd5b6000611dfe33612aea565b1180611e535750600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e89906140fd565b60405180910390fd5b60005b8160ff168160ff161015611f8457611ec133600660149054906101000a900461ffff1661ffff166125fe565b6006601481819054906101000a900461ffff1680929190611ee190614569565b91906101000a81548161ffff021916908361ffff16021790555050600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff1680929190611f58906145dd565b91906101000a81548160ff021916908360ff160217905550508080611f7c906145dd565b915050611e95565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612024612203565b73ffffffffffffffffffffffffffffffffffffffff166120426119e6565b73ffffffffffffffffffffffffffffffffffffffff1614612098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208f9061407d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ff90613edd565b60405180910390fd5b6121118161261c565b50565b60075481565b600960059054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661227e83611187565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122cf82612197565b61230e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230590613f9d565b60405180910390fd5b600061231983611187565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061238857508373ffffffffffffffffffffffffffffffffffffffff1661237084610b18565b73ffffffffffffffffffffffffffffffffffffffff16145b8061239957506123988185611f88565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123c282611187565b73ffffffffffffffffffffffffffffffffffffffff1614612418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240f9061409d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247f90613f3d565b60405180910390fd5b612493838383612b9e565b61249e60008261220b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ee9190614432565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254591906142e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612618828260405180602001604052806000815250612ba3565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274890613f5d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128429190613e60565b60405180910390a3505050565b61285a8484846123a2565b61286684848484612bfe565b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90613ebd565b60405180910390fd5b50505050565b6060600a80546128ba90614537565b80601f01602080910402602001604051908101604052809291908181526020018280546128e690614537565b80156129335780601f1061290857610100808354040283529160200191612933565b820191906000526020600020905b81548152906001019060200180831161291657829003601f168201915b5050505050905090565b60606000821415612985576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ae5565b600082905060005b600082146129b75780806129a090614594565b915050600a826129b09190614373565b915061298d565b60008167ffffffffffffffff8111156129f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a2b5781602001600182028036833780820191505090505b5090505b60008514612ade57600182612a449190614432565b9150600a85612a539190614607565b6030612a5f91906142e6565b60f81b818381518110612a9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ad79190614373565b9450612a2f565b8093505050505b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401612b479190613df9565b60206040518083038186803b158015612b5f57600080fd5b505afa158015612b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9791906134b6565b9050919050565b505050565b612bad8383612d95565b612bba6000848484612bfe565b612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf090613ebd565b60405180910390fd5b505050565b6000612c1f8473ffffffffffffffffffffffffffffffffffffffff16612f63565b15612d88578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c48612203565b8786866040518563ffffffff1660e01b8152600401612c6a9493929190613e14565b602060405180830381600087803b158015612c8457600080fd5b505af1925050508015612cb557506040513d601f19601f82011682018060405250810190612cb29190613423565b60015b612d38573d8060008114612ce5576040519150601f19603f3d011682016040523d82523d6000602084013e612cea565b606091505b50600081511415612d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2790613ebd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d8d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfc9061403d565b60405180910390fd5b612e0e81612197565b15612e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4590613efd565b60405180910390fd5b612e5a60008383612b9e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eaa91906142e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612f8290614537565b90600052602060002090601f016020900481019282612fa45760008555612feb565b82601f10612fbd57805160ff1916838001178555612feb565b82800160010185558215612feb579182015b82811115612fea578251825591602001919060010190612fcf565b5b509050612ff89190612ffc565b5090565b5b80821115613015576000816000905550600101612ffd565b5090565b600061302c613027846141df565b6141ae565b9050808382526020820190508285602086028201111561304b57600080fd5b60005b8581101561307b57816130618882613101565b84526020840193506020830192505060018101905061304e565b5050509392505050565b60006130986130938461420b565b6141ae565b9050828152602081018484840111156130b057600080fd5b6130bb8482856144f5565b509392505050565b60006130d66130d18461423b565b6141ae565b9050828152602081018484840111156130ee57600080fd5b6130f98482856144f5565b509392505050565b60008135905061311081614705565b92915050565b600082601f83011261312757600080fd5b8135613137848260208601613019565b91505092915050565b60008135905061314f8161471c565b92915050565b60008135905061316481614733565b92915050565b60008151905061317981614733565b92915050565b600082601f83011261319057600080fd5b81356131a0848260208601613085565b91505092915050565b600082601f8301126131ba57600080fd5b81356131ca8482602086016130c3565b91505092915050565b6000813590506131e28161474a565b92915050565b6000815190506131f78161474a565b92915050565b60008135905061320c81614761565b92915050565b60006020828403121561322457600080fd5b600061323284828501613101565b91505092915050565b6000806040838503121561324e57600080fd5b600061325c85828601613101565b925050602061326d85828601613101565b9150509250929050565b60008060006060848603121561328c57600080fd5b600061329a86828701613101565b93505060206132ab86828701613101565b92505060406132bc868287016131d3565b9150509250925092565b600080600080608085870312156132dc57600080fd5b60006132ea87828801613101565b94505060206132fb87828801613101565b935050604061330c878288016131d3565b925050606085013567ffffffffffffffff81111561332957600080fd5b6133358782880161317f565b91505092959194509250565b6000806040838503121561335457600080fd5b600061336285828601613101565b925050602061337385828601613140565b9150509250929050565b6000806040838503121561339057600080fd5b600061339e85828601613101565b92505060206133af858286016131d3565b9150509250929050565b6000602082840312156133cb57600080fd5b600082013567ffffffffffffffff8111156133e557600080fd5b6133f184828501613116565b91505092915050565b60006020828403121561340c57600080fd5b600061341a84828501613155565b91505092915050565b60006020828403121561343557600080fd5b60006134438482850161316a565b91505092915050565b60006020828403121561345e57600080fd5b600082013567ffffffffffffffff81111561347857600080fd5b613484848285016131a9565b91505092915050565b60006020828403121561349f57600080fd5b60006134ad848285016131d3565b91505092915050565b6000602082840312156134c857600080fd5b60006134d6848285016131e8565b91505092915050565b6000602082840312156134f157600080fd5b60006134ff848285016131fd565b91505092915050565b61351181614466565b82525050565b61352081614478565b82525050565b60006135318261426b565b61353b8185614281565b935061354b818560208601614504565b613554816146f4565b840191505092915050565b600061356a82614276565b6135748185614292565b9350613584818560208601614504565b61358d816146f4565b840191505092915050565b60006135a382614276565b6135ad81856142a3565b93506135bd818560208601614504565b80840191505092915050565b60006135d6602383614292565b91507f4d617820746f6b656e73207065722077616c6c6574206f6e20416c6c6f774c6960008301527f73742100000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061363c603283614292565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006136a2602683614292565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613708601c83614292565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613748601a83614292565b91507f4e6f7420656e6f75676820746f6b656e7320746f2073656c6c210000000000006000830152602082019050919050565b6000613788602483614292565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137ee601983614292565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061382e601083614292565b91507f53616c65206e6f742061637469766521000000000000000000000000000000006000830152602082019050919050565b600061386e602c83614292565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006138d4603883614292565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061393a601583614292565b91507f416c6c6f774c697374206e6f74206163746976652100000000000000000000006000830152602082019050919050565b600061397a602a83614292565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006139e0602983614292565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a46602083614292565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613a86602c83614292565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613aec6005836142a3565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613b2c602083614292565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613b6c602983614292565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bd2602f83614292565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613c38602183614292565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c9e602483614292565b91507f546f6b656e2066726f6d206f7468657220636f6e7472616374206e6f74206f7760008301527f6e656421000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d04601083614292565b91507f496e636f72726563742076616c756521000000000000000000000000000000006000830152602082019050919050565b6000613d44603183614292565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b613da6816144b0565b82525050565b613db5816144de565b82525050565b613dc4816144e8565b82525050565b6000613dd68285613598565b9150613de28284613598565b9150613ded82613adf565b91508190509392505050565b6000602082019050613e0e6000830184613508565b92915050565b6000608082019050613e296000830187613508565b613e366020830186613508565b613e436040830185613dac565b8181036060830152613e558184613526565b905095945050505050565b6000602082019050613e756000830184613517565b92915050565b60006020820190508181036000830152613e95818461355f565b905092915050565b60006020820190508181036000830152613eb6816135c9565b9050919050565b60006020820190508181036000830152613ed68161362f565b9050919050565b60006020820190508181036000830152613ef681613695565b9050919050565b60006020820190508181036000830152613f16816136fb565b9050919050565b60006020820190508181036000830152613f368161373b565b9050919050565b60006020820190508181036000830152613f568161377b565b9050919050565b60006020820190508181036000830152613f76816137e1565b9050919050565b60006020820190508181036000830152613f9681613821565b9050919050565b60006020820190508181036000830152613fb681613861565b9050919050565b60006020820190508181036000830152613fd6816138c7565b9050919050565b60006020820190508181036000830152613ff68161392d565b9050919050565b600060208201905081810360008301526140168161396d565b9050919050565b60006020820190508181036000830152614036816139d3565b9050919050565b6000602082019050818103600083015261405681613a39565b9050919050565b6000602082019050818103600083015261407681613a79565b9050919050565b6000602082019050818103600083015261409681613b1f565b9050919050565b600060208201905081810360008301526140b681613b5f565b9050919050565b600060208201905081810360008301526140d681613bc5565b9050919050565b600060208201905081810360008301526140f681613c2b565b9050919050565b6000602082019050818103600083015261411681613c91565b9050919050565b6000602082019050818103600083015261413681613cf7565b9050919050565b6000602082019050818103600083015261415681613d37565b9050919050565b60006020820190506141726000830184613d9d565b92915050565b600060208201905061418d6000830184613dac565b92915050565b60006020820190506141a86000830184613dbb565b92915050565b6000604051905081810181811067ffffffffffffffff821117156141d5576141d46146c5565b5b8060405250919050565b600067ffffffffffffffff8211156141fa576141f96146c5565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614226576142256146c5565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614256576142556146c5565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142b9826144b0565b91506142c4836144b0565b92508261ffff038211156142db576142da614638565b5b828201905092915050565b60006142f1826144de565b91506142fc836144de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561433157614330614638565b5b828201905092915050565b6000614347826144e8565b9150614352836144e8565b92508260ff0382111561436857614367614638565b5b828201905092915050565b600061437e826144de565b9150614389836144de565b92508261439957614398614667565b5b828204905092915050565b60006143af826144de565b91506143ba836144de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143f3576143f2614638565b5b828202905092915050565b6000614409826144b0565b9150614414836144b0565b92508282101561442757614426614638565b5b828203905092915050565b600061443d826144de565b9150614448836144de565b92508282101561445b5761445a614638565b5b828203905092915050565b6000614471826144be565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614522578082015181840152602081019050614507565b83811115614531576000848401525b50505050565b6000600282049050600182168061454f57607f821691505b6020821081141561456357614562614696565b5b50919050565b6000614574826144b0565b915061ffff82141561458957614588614638565b5b600182019050919050565b600061459f826144de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145d2576145d1614638565b5b600182019050919050565b60006145e8826144e8565b915060ff8214156145fc576145fb614638565b5b600182019050919050565b6000614612826144de565b915061461d836144de565b92508261462d5761462c614667565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61470e81614466565b811461471957600080fd5b50565b61472581614478565b811461473057600080fd5b50565b61473c81614484565b811461474757600080fd5b50565b614753816144de565b811461475e57600080fd5b50565b61476a816144e8565b811461477557600080fd5b5056fea264697066735822122095a82d2764ddfa9b15b6c37e9b5f0d4ca71dd7be3b31c62bc7e4dd4aa7a3ed5164736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102515760003560e01c806369669f9111610139578063a318ce13116100b6578063d5abeb011161007a578063d5abeb011461087b578063ddff5b1c146108a6578063e985e9c5146108c2578063f2fde38b146108ff578063f51f96dd14610928578063f9020e331461095357610251565b8063a318ce1314610796578063a62651f8146107ad578063b259aaf6146107ea578063b88d4fde14610815578063c87b56dd1461083e57610251565b8063715018a6116100fd578063715018a6146106d75780637263cfe2146106ee5780638da5cb5b1461071757806395d89b4114610742578063a22cb4651461076d57610251565b806369669f91146105ed5780636c0360eb1461062a5780636df9fa88146106555780636ecd23061461067e57806370a082311461069a57610251565b80633818294d116101d2578063502b33af11610196578063502b33af146104f157806355f804b3146105085780635d692a2b1461053157806361bc221a1461055c5780636352211e1461058757806367146718146105c457610251565b80633818294d1461041e5780633ccfd60b1461045b57806342842e0e1461047257806344bb25061461049b578063469132ce146104c657610251565b8063141129f911610219578063141129f91461034f57806318160ddd146103785780631919fed7146103a357806323b872dd146103cc5780632b59717b146103f557610251565b80630133b08d1461025657806301ffc9a71461028157806306fdde03146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061026b61097e565b6040516102789190613df9565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a391906133fa565b6109a4565b6040516102b59190613e60565b60405180910390f35b3480156102ca57600080fd5b506102d3610a86565b6040516102e09190613e7b565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b919061348d565b610b18565b60405161031d9190613df9565b60405180910390f35b34801561033257600080fd5b5061034d6004803603810190610348919061337d565b610b9d565b005b34801561035b57600080fd5b50610376600480360381019061037191906134df565b610cb5565b005b34801561038457600080fd5b5061038d610d4f565b60405161039a9190614178565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c5919061348d565b610d77565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613277565b610dfd565b005b34801561040157600080fd5b5061041c600480360381019061041791906134df565b610e5d565b005b34801561042a57600080fd5b5061044560048036038101906104409190613212565b610ef7565b6040516104529190614193565b60405180910390f35b34801561046757600080fd5b50610470610f17565b005b34801561047e57600080fd5b5061049960048036038101906104949190613277565b610fdc565b005b3480156104a757600080fd5b506104b0610ffc565b6040516104bd9190613e60565b60405180910390f35b3480156104d257600080fd5b506104db61100f565b6040516104e89190614193565b60405180910390f35b3480156104fd57600080fd5b50610506611022565b005b34801561051457600080fd5b5061052f600480360381019061052a919061344c565b6110ca565b005b34801561053d57600080fd5b50610546611160565b6040516105539190614193565b60405180910390f35b34801561056857600080fd5b50610571611173565b60405161057e919061415d565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a9919061348d565b611187565b6040516105bb9190613df9565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190613212565b611239565b005b3480156105f957600080fd5b50610614600480360381019061060f9190613212565b6112f9565b6040516106219190613e60565b60405180910390f35b34801561063657600080fd5b5061063f611319565b60405161064c9190613e7b565b60405180910390f35b34801561066157600080fd5b5061067c6004803603810190610677919061348d565b6113a7565b005b610698600480360381019061069391906134df565b61142d565b005b3480156106a657600080fd5b506106c160048036038101906106bc9190613212565b6116da565b6040516106ce9190614178565b60405180910390f35b3480156106e357600080fd5b506106ec611792565b005b3480156106fa57600080fd5b50610715600480360381019061071091906133b9565b61181a565b005b34801561072357600080fd5b5061072c6119e6565b6040516107399190613df9565b60405180910390f35b34801561074e57600080fd5b50610757611a10565b6040516107649190613e7b565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190613341565b611aa2565b005b3480156107a257600080fd5b506107ab611ab8565b005b3480156107b957600080fd5b506107d460048036038101906107cf9190613212565b611b60565b6040516107e19190614193565b60405180910390f35b3480156107f657600080fd5b506107ff611b80565b60405161080c9190614178565b60405180910390f35b34801561082157600080fd5b5061083c600480360381019061083791906132c6565b611b86565b005b34801561084a57600080fd5b506108656004803603810190610860919061348d565b611be8565b6040516108729190613e7b565b60405180910390f35b34801561088757600080fd5b50610890611c8f565b60405161089d919061415d565b60405180910390f35b6108c060048036038101906108bb91906134df565b611ca3565b005b3480156108ce57600080fd5b506108e960048036038101906108e4919061323b565b611f88565b6040516108f69190613e60565b60405180910390f35b34801561090b57600080fd5b5061092660048036038101906109219190613212565b61201c565b005b34801561093457600080fd5b5061093d612114565b60405161094a9190614178565b60405180910390f35b34801561095f57600080fd5b5061096861211a565b6040516109759190613e60565b60405180910390f35b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a7f5750610a7e8261212d565b5b9050919050565b606060008054610a9590614537565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac190614537565b8015610b0e5780601f10610ae357610100808354040283529160200191610b0e565b820191906000526020600020905b815481529060010190602001808311610af157829003601f168201915b5050505050905090565b6000610b2382612197565b610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b599061405d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ba882611187565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c10906140dd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c38612203565b73ffffffffffffffffffffffffffffffffffffffff161480610c675750610c6681610c61612203565b611f88565b5b610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90613fbd565b60405180910390fd5b610cb0838361220b565b505050565b610cbd612203565b73ffffffffffffffffffffffffffffffffffffffff16610cdb6119e6565b73ffffffffffffffffffffffffffffffffffffffff1614610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d289061407d565b60405180910390fd5b80600960026101000a81548160ff021916908360ff16021790555050565b60006001600660149054906101000a900461ffff16610d6e91906143fe565b61ffff16905090565b610d7f612203565b73ffffffffffffffffffffffffffffffffffffffff16610d9d6119e6565b73ffffffffffffffffffffffffffffffffffffffff1614610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea9061407d565b60405180910390fd5b8060078190555050565b610e0e610e08612203565b826122c4565b610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e449061413d565b60405180910390fd5b610e588383836123a2565b505050565b610e65612203565b73ffffffffffffffffffffffffffffffffffffffff16610e836119e6565b73ffffffffffffffffffffffffffffffffffffffff1614610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed09061407d565b60405180910390fd5b80600960036101000a81548160ff021916908360ff16021790555050565b600e6020528060005260406000206000915054906101000a900460ff1681565b610f1f612203565b73ffffffffffffffffffffffffffffffffffffffff16610f3d6119e6565b73ffffffffffffffffffffffffffffffffffffffff1614610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a9061407d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610fd9573d6000803e3d6000fd5b50565b610ff783838360405180602001604052806000815250611b86565b505050565b600960049054906101000a900460ff1681565b600960029054906101000a900460ff1681565b61102a612203565b73ffffffffffffffffffffffffffffffffffffffff166110486119e6565b73ffffffffffffffffffffffffffffffffffffffff161461109e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110959061407d565b60405180910390fd5b600960059054906101000a900460ff1615600960056101000a81548160ff021916908315150217905550565b6110d2612203565b73ffffffffffffffffffffffffffffffffffffffff166110f06119e6565b73ffffffffffffffffffffffffffffffffffffffff1614611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d9061407d565b60405180910390fd5b80600a908051906020019061115c929190612f76565b5050565b600960039054906101000a900460ff1681565b600660149054906101000a900461ffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611230576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112279061401d565b60405180910390fd5b80915050919050565b611241612203565b73ffffffffffffffffffffffffffffffffffffffff1661125f6119e6565b73ffffffffffffffffffffffffffffffffffffffff16146112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac9061407d565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d6020528060005260406000206000915054906101000a900460ff1681565b600a805461132690614537565b80601f016020809104026020016040519081016040528092919081815260200182805461135290614537565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b505050505081565b6113af612203565b73ffffffffffffffffffffffffffffffffffffffff166113cd6119e6565b73ffffffffffffffffffffffffffffffffffffffff1614611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a9061407d565b60405180910390fd5b8060088190555050565b8060ff1660075461143e91906143a4565b341461147f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114769061411d565b60405180910390fd5b6127108160ff16600660149054906101000a900461ffff166114a191906142ae565b61ffff1611156114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd90613f1d565b60405180910390fd5b600960059054906101000a900460ff16611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90613f7d565b60405180910390fd5b600960029054906101000a900460ff1660ff1681600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115a0919061433c565b60ff1611156115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db90613e9d565b60405180910390fd5b60005b8160ff168160ff1610156116d65761161333600660149054906101000a900461ffff1661ffff166125fe565b6006601481819054906101000a900461ffff168092919061163390614569565b91906101000a81548161ffff021916908361ffff16021790555050600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff16809291906116aa906145dd565b91906101000a81548160ff021916908360ff1602179055505080806116ce906145dd565b9150506115e7565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290613ffd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61179a612203565b73ffffffffffffffffffffffffffffffffffffffff166117b86119e6565b73ffffffffffffffffffffffffffffffffffffffff161461180e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118059061407d565b60405180910390fd5b611818600061261c565b565b611822612203565b73ffffffffffffffffffffffffffffffffffffffff166118406119e6565b73ffffffffffffffffffffffffffffffffffffffff1614611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d9061407d565b60405180910390fd5b60005b81518160ff1610156119e257600d6000838360ff16815181106118e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600d6000848460ff1681518110611976577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806119da906145dd565b915050611899565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611a1f90614537565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4b90614537565b8015611a985780601f10611a6d57610100808354040283529160200191611a98565b820191906000526020600020905b815481529060010190602001808311611a7b57829003601f168201915b5050505050905090565b611ab4611aad612203565b83836126e2565b5050565b611ac0612203565b73ffffffffffffffffffffffffffffffffffffffff16611ade6119e6565b73ffffffffffffffffffffffffffffffffffffffff1614611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b9061407d565b60405180910390fd5b600960049054906101000a900460ff1615600960046101000a81548160ff021916908315150217905550565b600c6020528060005260406000206000915054906101000a900460ff1681565b60085481565b611b97611b91612203565b836122c4565b611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd9061413d565b60405180910390fd5b611be28484848461284f565b50505050565b6060611bf382612197565b611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c29906140bd565b60405180910390fd5b6000611c3c6128ab565b90506000815111611c5c5760405180602001604052806000815250611c87565b80611c668461293d565b604051602001611c77929190613dca565b6040516020818303038152906040525b915050919050565b600960009054906101000a900461ffff1681565b8060ff16600854611cb491906143a4565b3414611cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cec9061411d565b60405180910390fd5b600960049054906101000a900460ff16611d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3b90613fdd565b60405180910390fd5b600960039054906101000a900460ff1660ff1681600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611daf919061433c565b60ff161115611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea90613e9d565b60405180910390fd5b6000611dfe33612aea565b1180611e535750600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e89906140fd565b60405180910390fd5b60005b8160ff168160ff161015611f8457611ec133600660149054906101000a900461ffff1661ffff166125fe565b6006601481819054906101000a900461ffff1680929190611ee190614569565b91906101000a81548161ffff021916908361ffff16021790555050600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff1680929190611f58906145dd565b91906101000a81548160ff021916908360ff160217905550508080611f7c906145dd565b915050611e95565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612024612203565b73ffffffffffffffffffffffffffffffffffffffff166120426119e6565b73ffffffffffffffffffffffffffffffffffffffff1614612098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208f9061407d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ff90613edd565b60405180910390fd5b6121118161261c565b50565b60075481565b600960059054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661227e83611187565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122cf82612197565b61230e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230590613f9d565b60405180910390fd5b600061231983611187565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061238857508373ffffffffffffffffffffffffffffffffffffffff1661237084610b18565b73ffffffffffffffffffffffffffffffffffffffff16145b8061239957506123988185611f88565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123c282611187565b73ffffffffffffffffffffffffffffffffffffffff1614612418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240f9061409d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247f90613f3d565b60405180910390fd5b612493838383612b9e565b61249e60008261220b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ee9190614432565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254591906142e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612618828260405180602001604052806000815250612ba3565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274890613f5d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128429190613e60565b60405180910390a3505050565b61285a8484846123a2565b61286684848484612bfe565b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90613ebd565b60405180910390fd5b50505050565b6060600a80546128ba90614537565b80601f01602080910402602001604051908101604052809291908181526020018280546128e690614537565b80156129335780601f1061290857610100808354040283529160200191612933565b820191906000526020600020905b81548152906001019060200180831161291657829003601f168201915b5050505050905090565b60606000821415612985576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ae5565b600082905060005b600082146129b75780806129a090614594565b915050600a826129b09190614373565b915061298d565b60008167ffffffffffffffff8111156129f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a2b5781602001600182028036833780820191505090505b5090505b60008514612ade57600182612a449190614432565b9150600a85612a539190614607565b6030612a5f91906142e6565b60f81b818381518110612a9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ad79190614373565b9450612a2f565b8093505050505b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401612b479190613df9565b60206040518083038186803b158015612b5f57600080fd5b505afa158015612b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9791906134b6565b9050919050565b505050565b612bad8383612d95565b612bba6000848484612bfe565b612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf090613ebd565b60405180910390fd5b505050565b6000612c1f8473ffffffffffffffffffffffffffffffffffffffff16612f63565b15612d88578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c48612203565b8786866040518563ffffffff1660e01b8152600401612c6a9493929190613e14565b602060405180830381600087803b158015612c8457600080fd5b505af1925050508015612cb557506040513d601f19601f82011682018060405250810190612cb29190613423565b60015b612d38573d8060008114612ce5576040519150601f19603f3d011682016040523d82523d6000602084013e612cea565b606091505b50600081511415612d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2790613ebd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d8d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfc9061403d565b60405180910390fd5b612e0e81612197565b15612e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4590613efd565b60405180910390fd5b612e5a60008383612b9e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eaa91906142e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612f8290614537565b90600052602060002090601f016020900481019282612fa45760008555612feb565b82601f10612fbd57805160ff1916838001178555612feb565b82800160010185558215612feb579182015b82811115612fea578251825591602001919060010190612fcf565b5b509050612ff89190612ffc565b5090565b5b80821115613015576000816000905550600101612ffd565b5090565b600061302c613027846141df565b6141ae565b9050808382526020820190508285602086028201111561304b57600080fd5b60005b8581101561307b57816130618882613101565b84526020840193506020830192505060018101905061304e565b5050509392505050565b60006130986130938461420b565b6141ae565b9050828152602081018484840111156130b057600080fd5b6130bb8482856144f5565b509392505050565b60006130d66130d18461423b565b6141ae565b9050828152602081018484840111156130ee57600080fd5b6130f98482856144f5565b509392505050565b60008135905061311081614705565b92915050565b600082601f83011261312757600080fd5b8135613137848260208601613019565b91505092915050565b60008135905061314f8161471c565b92915050565b60008135905061316481614733565b92915050565b60008151905061317981614733565b92915050565b600082601f83011261319057600080fd5b81356131a0848260208601613085565b91505092915050565b600082601f8301126131ba57600080fd5b81356131ca8482602086016130c3565b91505092915050565b6000813590506131e28161474a565b92915050565b6000815190506131f78161474a565b92915050565b60008135905061320c81614761565b92915050565b60006020828403121561322457600080fd5b600061323284828501613101565b91505092915050565b6000806040838503121561324e57600080fd5b600061325c85828601613101565b925050602061326d85828601613101565b9150509250929050565b60008060006060848603121561328c57600080fd5b600061329a86828701613101565b93505060206132ab86828701613101565b92505060406132bc868287016131d3565b9150509250925092565b600080600080608085870312156132dc57600080fd5b60006132ea87828801613101565b94505060206132fb87828801613101565b935050604061330c878288016131d3565b925050606085013567ffffffffffffffff81111561332957600080fd5b6133358782880161317f565b91505092959194509250565b6000806040838503121561335457600080fd5b600061336285828601613101565b925050602061337385828601613140565b9150509250929050565b6000806040838503121561339057600080fd5b600061339e85828601613101565b92505060206133af858286016131d3565b9150509250929050565b6000602082840312156133cb57600080fd5b600082013567ffffffffffffffff8111156133e557600080fd5b6133f184828501613116565b91505092915050565b60006020828403121561340c57600080fd5b600061341a84828501613155565b91505092915050565b60006020828403121561343557600080fd5b60006134438482850161316a565b91505092915050565b60006020828403121561345e57600080fd5b600082013567ffffffffffffffff81111561347857600080fd5b613484848285016131a9565b91505092915050565b60006020828403121561349f57600080fd5b60006134ad848285016131d3565b91505092915050565b6000602082840312156134c857600080fd5b60006134d6848285016131e8565b91505092915050565b6000602082840312156134f157600080fd5b60006134ff848285016131fd565b91505092915050565b61351181614466565b82525050565b61352081614478565b82525050565b60006135318261426b565b61353b8185614281565b935061354b818560208601614504565b613554816146f4565b840191505092915050565b600061356a82614276565b6135748185614292565b9350613584818560208601614504565b61358d816146f4565b840191505092915050565b60006135a382614276565b6135ad81856142a3565b93506135bd818560208601614504565b80840191505092915050565b60006135d6602383614292565b91507f4d617820746f6b656e73207065722077616c6c6574206f6e20416c6c6f774c6960008301527f73742100000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061363c603283614292565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006136a2602683614292565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613708601c83614292565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613748601a83614292565b91507f4e6f7420656e6f75676820746f6b656e7320746f2073656c6c210000000000006000830152602082019050919050565b6000613788602483614292565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137ee601983614292565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061382e601083614292565b91507f53616c65206e6f742061637469766521000000000000000000000000000000006000830152602082019050919050565b600061386e602c83614292565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006138d4603883614292565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061393a601583614292565b91507f416c6c6f774c697374206e6f74206163746976652100000000000000000000006000830152602082019050919050565b600061397a602a83614292565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006139e0602983614292565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a46602083614292565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613a86602c83614292565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613aec6005836142a3565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613b2c602083614292565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613b6c602983614292565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bd2602f83614292565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613c38602183614292565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c9e602483614292565b91507f546f6b656e2066726f6d206f7468657220636f6e7472616374206e6f74206f7760008301527f6e656421000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d04601083614292565b91507f496e636f72726563742076616c756521000000000000000000000000000000006000830152602082019050919050565b6000613d44603183614292565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b613da6816144b0565b82525050565b613db5816144de565b82525050565b613dc4816144e8565b82525050565b6000613dd68285613598565b9150613de28284613598565b9150613ded82613adf565b91508190509392505050565b6000602082019050613e0e6000830184613508565b92915050565b6000608082019050613e296000830187613508565b613e366020830186613508565b613e436040830185613dac565b8181036060830152613e558184613526565b905095945050505050565b6000602082019050613e756000830184613517565b92915050565b60006020820190508181036000830152613e95818461355f565b905092915050565b60006020820190508181036000830152613eb6816135c9565b9050919050565b60006020820190508181036000830152613ed68161362f565b9050919050565b60006020820190508181036000830152613ef681613695565b9050919050565b60006020820190508181036000830152613f16816136fb565b9050919050565b60006020820190508181036000830152613f368161373b565b9050919050565b60006020820190508181036000830152613f568161377b565b9050919050565b60006020820190508181036000830152613f76816137e1565b9050919050565b60006020820190508181036000830152613f9681613821565b9050919050565b60006020820190508181036000830152613fb681613861565b9050919050565b60006020820190508181036000830152613fd6816138c7565b9050919050565b60006020820190508181036000830152613ff68161392d565b9050919050565b600060208201905081810360008301526140168161396d565b9050919050565b60006020820190508181036000830152614036816139d3565b9050919050565b6000602082019050818103600083015261405681613a39565b9050919050565b6000602082019050818103600083015261407681613a79565b9050919050565b6000602082019050818103600083015261409681613b1f565b9050919050565b600060208201905081810360008301526140b681613b5f565b9050919050565b600060208201905081810360008301526140d681613bc5565b9050919050565b600060208201905081810360008301526140f681613c2b565b9050919050565b6000602082019050818103600083015261411681613c91565b9050919050565b6000602082019050818103600083015261413681613cf7565b9050919050565b6000602082019050818103600083015261415681613d37565b9050919050565b60006020820190506141726000830184613d9d565b92915050565b600060208201905061418d6000830184613dac565b92915050565b60006020820190506141a86000830184613dbb565b92915050565b6000604051905081810181811067ffffffffffffffff821117156141d5576141d46146c5565b5b8060405250919050565b600067ffffffffffffffff8211156141fa576141f96146c5565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614226576142256146c5565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614256576142556146c5565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142b9826144b0565b91506142c4836144b0565b92508261ffff038211156142db576142da614638565b5b828201905092915050565b60006142f1826144de565b91506142fc836144de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561433157614330614638565b5b828201905092915050565b6000614347826144e8565b9150614352836144e8565b92508260ff0382111561436857614367614638565b5b828201905092915050565b600061437e826144de565b9150614389836144de565b92508261439957614398614667565b5b828204905092915050565b60006143af826144de565b91506143ba836144de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143f3576143f2614638565b5b828202905092915050565b6000614409826144b0565b9150614414836144b0565b92508282101561442757614426614638565b5b828203905092915050565b600061443d826144de565b9150614448836144de565b92508282101561445b5761445a614638565b5b828203905092915050565b6000614471826144be565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614522578082015181840152602081019050614507565b83811115614531576000848401525b50505050565b6000600282049050600182168061454f57607f821691505b6020821081141561456357614562614696565b5b50919050565b6000614574826144b0565b915061ffff82141561458957614588614638565b5b600182019050919050565b600061459f826144de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145d2576145d1614638565b5b600182019050919050565b60006145e8826144e8565b915060ff8214156145fc576145fb614638565b5b600182019050919050565b6000614612826144de565b915061461d836144de565b92508261462d5761462c614667565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61470e81614466565b811461471957600080fd5b50565b61472581614478565b811461473057600080fd5b50565b61473c81614484565b811461474757600080fd5b50565b614753816144de565b811461475e57600080fd5b50565b61476a816144e8565b811461477557600080fd5b5056fea264697066735822122095a82d2764ddfa9b15b6c37e9b5f0d4ca71dd7be3b31c62bc7e4dd4aa7a3ed5164736f6c63430008000033

Deployed Bytecode Sourcemap

40974:3431:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41360:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28327:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29272:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30840:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30363:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42394:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43103:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42190:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31590:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42506:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41511:61;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42986:109;;;;;;;;;;;;;:::i;:::-;;32000:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41265:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41178:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42749:87;;;;;;;;;;;;;:::i;:::-;;41749:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41216:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41047:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28966:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42072:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41460:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41330:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42287:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43860:542;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28696:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10470:103;;;;;;;;;;;;;:::i;:::-;;41855:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9819:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29441:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31133:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42636:105;;;;;;;;;;;;;:::i;:::-;;41401:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41107:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32256:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29616:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41140:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43218:634;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31359:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10728:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41079:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41299:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41360:32;;;;;;;;;;;;;:::o;28327:305::-;28429:4;28481:25;28466:40;;;:11;:40;;;;:105;;;;28538:33;28523:48;;;:11;:48;;;;28466:105;:158;;;;28588:36;28612:11;28588:23;:36::i;:::-;28466:158;28446:178;;28327:305;;;:::o;29272:100::-;29326:13;29359:5;29352:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29272:100;:::o;30840:221::-;30916:7;30944:16;30952:7;30944;:16::i;:::-;30936:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31029:15;:24;31045:7;31029:24;;;;;;;;;;;;;;;;;;;;;31022:31;;30840:221;;;:::o;30363:411::-;30444:13;30460:23;30475:7;30460:14;:23::i;:::-;30444:39;;30508:5;30502:11;;:2;:11;;;;30494:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30602:5;30586:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30611:37;30628:5;30635:12;:10;:12::i;:::-;30611:16;:37::i;:::-;30586:62;30564:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;30745:21;30754:2;30758:7;30745:8;:21::i;:::-;30363:411;;;:::o;42394:104::-;10050:12;:10;:12::i;:::-;10039:23;;:7;:5;:7::i;:::-;:23;;;10031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42487:3:::1;42466:18;;:24;;;;;;;;;;;;;;;;;;42394:104:::0;:::o;43103:107::-;43164:7;43201:1;43191:7;;;;;;;;;;;:11;;;;:::i;:::-;43184:18;;;;43103:107;:::o;42190:89::-;10050:12;:10;:12::i;:::-;10039:23;;:7;:5;:7::i;:::-;:23;;;10031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42266:5:::1;42254:9;:17;;;;42190:89:::0;:::o;31590:339::-;31785:41;31804:12;:10;:12::i;:::-;31818:7;31785:18;:41::i;:::-;31777:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31893:28;31903:4;31909:2;31913:7;31893:9;:28::i;:::-;31590:339;;;:::o;42506:122::-;10050:12;:10;:12::i;:::-;10039:23;;:7;:5;:7::i;:::-;:23;;;10031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42617:3:::1;42587:27;;:33;;;;;;;;;;;;;;;;;;42506:122:::0;:::o;41511:61::-;;;;;;;;;;;;;;;;;;;;;;:::o;42986:109::-;10050:12;:10;:12::i;:::-;10039:23;;:7;:5;:7::i;:::-;:23;;;10031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43044:10:::1;43036:28;;:51;43065:21;43036:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;42986:109::o:0;32000:185::-;32138:39;32155:4;32161:2;32165:7;32138:39;;;;;;;;;;;;:16;:39::i;:::-;32000:185;;;:::o;41265:27::-;;;;;;;;;;;;;:::o;41178:31::-;;;;;;;;;;;;;:::o;42749:87::-;10050:12;:10;:12::i;:::-;10039:23;;:7;:5;:7::i;:::-;:23;;;10031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42818:10:::1;;;;;;;;;;;42817:11;42804:10;;:24;;;;;;;;;;;;;;;;;;42749:87::o:0;41749:98::-;10050:12;:10;:12::i;:::-;10039:23;;:7;:5;:7::i;:::-;:23;;;10031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41832:7:::1;41822;:17;;;;;;;;;;;;:::i;:::-;;41749:98:::0;:::o;41216:40::-;;;;;;;;;;;;;:::o;41047:25::-;;;;;;;;;;;;;:::o;28966:239::-;29038:7;29058:13;29074:7;:16;29082:7;29074:16;;;;;;;;;;;;;;;;;;;;;29058:32;;29126:1;29109:19;;:5;:19;;;;29101:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29192:5;29185:12;;;28966:239;;;:::o;42072:110::-;10050:12;:10;:12::i;:::-;10039:23;;:7;:5;:7::i;:::-;:23;;;10031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42168:6:::1;42148:17;;:26;;;;;;;;;;;;;;;;;;42072:110:::0;:::o;41460:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;41330:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42287:99::-;10050:12;:10;:12::i;:::-;10039:23;;:7;:5;:7::i;:::-;:23;;;10031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42373:5:::1;42356:14;:22;;;;42287:99:::0;:::o;43860:542::-;43949:6;43937:18;;:9;;:18;;;;:::i;:::-;43924:9;:31;43916:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;44015:5;44005:6;43995:16;;:7;;;;;;;;;;;:16;;;;:::i;:::-;:25;;;;43987:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44070:10;;;;;;;;;;;44062:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;44164:18;;;;;;;;;;;44120:62;;44154:6;44120:19;:31;44140:10;44120:31;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:62;;;;44112:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;44237:7;44233:162;44254:6;44250:10;;:1;:10;;;44233:162;;;44281:30;44291:10;44303:7;;;;;;;;;;;44281:30;;:9;:30::i;:::-;44326:7;;:9;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;44350:19;:31;44370:10;44350:31;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;44262:3;;;;;:::i;:::-;;;;44233:162;;;;43860:542;:::o;28696:208::-;28768:7;28813:1;28796:19;;:5;:19;;;;28788:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28880:9;:16;28890:5;28880:16;;;;;;;;;;;;;;;;28873:23;;28696:208;;;:::o;10470:103::-;10050:12;:10;:12::i;:::-;10039:23;;:7;:5;:7::i;:::-;:23;;;10031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10535:30:::1;10562:1;10535:18;:30::i;:::-;10470:103::o:0;41855:209::-;10050:12;:10;:12::i;:::-;10039:23;;:7;:5;:7::i;:::-;:23;;;10031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41939:7:::1;41935:118;41954:7;:14;41952:1;:16;;;41935:118;;;42017:12;:24;42030:7;42038:1;42030:10;;;;;;;;;;;;;;;;;;;;;;;;42017:24;;;;;;;;;;;;;;;;;;;;;;;;;42016:25;41989:12;:24;42002:7;42010:1;42002:10;;;;;;;;;;;;;;;;;;;;;;;;41989:24;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;41970:3;;;;;:::i;:::-;;;;41935:118;;;;41855:209:::0;:::o;9819:87::-;9865:7;9892:6;;;;;;;;;;;9885:13;;9819:87;:::o;29441:104::-;29497:13;29530:7;29523:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29441:104;:::o;31133:155::-;31228:52;31247:12;:10;:12::i;:::-;31261:8;31271;31228:18;:52::i;:::-;31133:155;;:::o;42636:105::-;10050:12;:10;:12::i;:::-;10039:23;;:7;:5;:7::i;:::-;:23;;;10031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42718:15:::1;;;;;;;;;;;42717:16;42699:15;;:34;;;;;;;;;;;;;;;;;;42636:105::o:0;41401:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;41107:26::-;;;;:::o;32256:328::-;32431:41;32450:12;:10;:12::i;:::-;32464:7;32431:18;:41::i;:::-;32423:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32537:39;32551:4;32557:2;32561:7;32570:5;32537:13;:39::i;:::-;32256:328;;;;:::o;29616:343::-;29689:13;29723:16;29731:7;29723;:16::i;:::-;29715:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29804:21;29828:10;:8;:10::i;:::-;29804:34;;29880:1;29862:7;29856:21;:25;:95;;;;;;;;;;;;;;;;;29908:7;29917:18;:7;:16;:18::i;:::-;29891:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29856:95;29849:102;;;29616:343;;;:::o;41140:31::-;;;;;;;;;;;;;:::o;43218:634::-;43321:6;43304:23;;:14;;:23;;;;:::i;:::-;43291:9;:36;43283:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43367:15;;;;;;;;;;;43359:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;43480:27;;;;;;;;;;;43427:80;;43470:6;43427:28;:40;43456:10;43427:40;;;;;;;;;;;;;;;;;;;;;;;;;:49;;;;:::i;:::-;:80;;;;43419:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;43593:1;43566:24;43579:10;43566:12;:24::i;:::-;:28;:56;;;;43598:12;:24;43611:10;43598:24;;;;;;;;;;;;;;;;;;;;;;;;;43566:56;43558:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;43678:7;43674:171;43695:6;43691:10;;:1;:10;;;43674:171;;;43722:30;43732:10;43744:7;;;;;;;;;;;43722:30;;:9;:30::i;:::-;43767:7;;:9;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;43791:28;:40;43820:10;43791:40;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;43703:3;;;;;:::i;:::-;;;;43674:171;;;;43218:634;:::o;31359:164::-;31456:4;31480:18;:25;31499:5;31480:25;;;;;;;;;;;;;;;:35;31506:8;31480:35;;;;;;;;;;;;;;;;;;;;;;;;;31473:42;;31359:164;;;;:::o;10728:201::-;10050:12;:10;:12::i;:::-;10039:23;;:7;:5;:7::i;:::-;:23;;;10031:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10837:1:::1;10817:22;;:8;:22;;;;10809:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10893:28;10912:8;10893:18;:28::i;:::-;10728:201:::0;:::o;41079:21::-;;;;:::o;41299:22::-;;;;;;;;;;;;;:::o;21609:157::-;21694:4;21733:25;21718:40;;;:11;:40;;;;21711:47;;21609:157;;;:::o;34094:127::-;34159:4;34211:1;34183:30;;:7;:16;34191:7;34183:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34176:37;;34094:127;;;:::o;8686:98::-;8739:7;8766:10;8759:17;;8686:98;:::o;38076:174::-;38178:2;38151:15;:24;38167:7;38151:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38234:7;38230:2;38196:46;;38205:23;38220:7;38205:14;:23::i;:::-;38196:46;;;;;;;;;;;;38076:174;;:::o;34388:348::-;34481:4;34506:16;34514:7;34506;:16::i;:::-;34498:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34582:13;34598:23;34613:7;34598:14;:23::i;:::-;34582:39;;34651:5;34640:16;;:7;:16;;;:51;;;;34684:7;34660:31;;:20;34672:7;34660:11;:20::i;:::-;:31;;;34640:51;:87;;;;34695:32;34712:5;34719:7;34695:16;:32::i;:::-;34640:87;34632:96;;;34388:348;;;;:::o;37380:578::-;37539:4;37512:31;;:23;37527:7;37512:14;:23::i;:::-;:31;;;37504:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37622:1;37608:16;;:2;:16;;;;37600:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37678:39;37699:4;37705:2;37709:7;37678:20;:39::i;:::-;37782:29;37799:1;37803:7;37782:8;:29::i;:::-;37843:1;37824:9;:15;37834:4;37824:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37872:1;37855:9;:13;37865:2;37855:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37903:2;37884:7;:16;37892:7;37884:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37942:7;37938:2;37923:27;;37932:4;37923:27;;;;;;;;;;;;37380:578;;;:::o;35078:110::-;35154:26;35164:2;35168:7;35154:26;;;;;;;;;;;;:9;:26::i;:::-;35078:110;;:::o;11089:191::-;11163:16;11182:6;;;;;;;;;;;11163:25;;11208:8;11199:6;;:17;;;;;;;;;;;;;;;;;;11263:8;11232:40;;11253:8;11232:40;;;;;;;;;;;;11089:191;;:::o;38392:315::-;38547:8;38538:17;;:5;:17;;;;38530:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38634:8;38596:18;:25;38615:5;38596:25;;;;;;;;;;;;;;;:35;38622:8;38596:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38680:8;38658:41;;38673:5;38658:41;;;38690:8;38658:41;;;;;;:::i;:::-;;;;;;;;38392:315;;;:::o;33466:::-;33623:28;33633:4;33639:2;33643:7;33623:9;:28::i;:::-;33670:48;33693:4;33699:2;33703:7;33712:5;33670:22;:48::i;:::-;33662:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33466:315;;;;:::o;41641:100::-;41693:13;41726:7;41719:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41641:100;:::o;6387:723::-;6443:13;6673:1;6664:5;:10;6660:53;;;6691:10;;;;;;;;;;;;;;;;;;;;;6660:53;6723:12;6738:5;6723:20;;6754:14;6779:78;6794:1;6786:4;:9;6779:78;;6812:8;;;;;:::i;:::-;;;;6843:2;6835:10;;;;;:::i;:::-;;;6779:78;;;6867:19;6899:6;6889:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6867:39;;6917:154;6933:1;6924:5;:10;6917:154;;6961:1;6951:11;;;;;:::i;:::-;;;7028:2;7020:5;:10;;;;:::i;:::-;7007:2;:24;;;;:::i;:::-;6994:39;;6977:6;6984;6977:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7057:2;7048:11;;;;;:::i;:::-;;;6917:154;;;7095:6;7081:21;;;;;6387:723;;;;:::o;42844:134::-;42903:4;42935:17;;;;;;;;;;;42927:36;;;42964:5;42927:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42920:50;;42844:134;;;:::o;40643:126::-;;;;:::o;35415:321::-;35545:18;35551:2;35555:7;35545:5;:18::i;:::-;35596:54;35627:1;35631:2;35635:7;35644:5;35596:22;:54::i;:::-;35574:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;35415:321;;;:::o;39272:799::-;39427:4;39448:15;:2;:13;;;:15::i;:::-;39444:620;;;39500:2;39484:36;;;39521:12;:10;:12::i;:::-;39535:4;39541:7;39550:5;39484:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39480:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39743:1;39726:6;:13;:18;39722:272;;;39769:60;;;;;;;;;;:::i;:::-;;;;;;;;39722:272;39944:6;39938:13;39929:6;39925:2;39921:15;39914:38;39480:529;39617:41;;;39607:51;;;:6;:51;;;;39600:58;;;;;39444:620;40048:4;40041:11;;39272:799;;;;;;;:::o;36072:382::-;36166:1;36152:16;;:2;:16;;;;36144:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36225:16;36233:7;36225;:16::i;:::-;36224:17;36216:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36287:45;36316:1;36320:2;36324:7;36287:20;:45::i;:::-;36362:1;36345:9;:13;36355:2;36345:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36393:2;36374:7;:16;36382:7;36374:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36438:7;36434:2;36413:33;;36430:1;36413:33;;;;;;;;;;;;36072:382;;:::o;11968:387::-;12028:4;12236:12;12303:7;12291:20;12283:28;;12346:1;12339:4;:8;12332:15;;;11968:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1512:303::-;;1632:3;1625:4;1617:6;1613:17;1609:27;1599:2;;1650:1;1647;1640:12;1599:2;1690:6;1677:20;1715:94;1805:3;1797:6;1790:4;1782:6;1778:17;1715:94;:::i;:::-;1706:103;;1589:226;;;;;:::o;1821:133::-;;1902:6;1889:20;1880:29;;1918:30;1942:5;1918:30;:::i;:::-;1870:84;;;;:::o;1960:137::-;;2043:6;2030:20;2021:29;;2059:32;2085:5;2059:32;:::i;:::-;2011:86;;;;:::o;2103:141::-;;2190:6;2184:13;2175:22;;2206:32;2232:5;2206:32;:::i;:::-;2165:79;;;;:::o;2263:271::-;;2367:3;2360:4;2352:6;2348:17;2344:27;2334:2;;2385:1;2382;2375:12;2334:2;2425:6;2412:20;2450:78;2524:3;2516:6;2509:4;2501:6;2497:17;2450:78;:::i;:::-;2441:87;;2324:210;;;;;:::o;2554:273::-;;2659:3;2652:4;2644:6;2640:17;2636:27;2626:2;;2677:1;2674;2667:12;2626:2;2717:6;2704:20;2742:79;2817:3;2809:6;2802:4;2794:6;2790:17;2742:79;:::i;:::-;2733:88;;2616:211;;;;;:::o;2833:139::-;;2917:6;2904:20;2895:29;;2933:33;2960:5;2933:33;:::i;:::-;2885:87;;;;:::o;2978:143::-;;3066:6;3060:13;3051:22;;3082:33;3109:5;3082:33;:::i;:::-;3041:80;;;;:::o;3127:135::-;;3209:6;3196:20;3187:29;;3225:31;3250:5;3225:31;:::i;:::-;3177:85;;;;:::o;3268:262::-;;3376:2;3364:9;3355:7;3351:23;3347:32;3344:2;;;3392:1;3389;3382:12;3344:2;3435:1;3460:53;3505:7;3496:6;3485:9;3481:22;3460:53;:::i;:::-;3450:63;;3406:117;3334:196;;;;:::o;3536:407::-;;;3661:2;3649:9;3640:7;3636:23;3632:32;3629:2;;;3677:1;3674;3667:12;3629:2;3720:1;3745:53;3790:7;3781:6;3770:9;3766:22;3745:53;:::i;:::-;3735:63;;3691:117;3847:2;3873:53;3918:7;3909:6;3898:9;3894:22;3873:53;:::i;:::-;3863:63;;3818:118;3619:324;;;;;:::o;3949:552::-;;;;4091:2;4079:9;4070:7;4066:23;4062:32;4059:2;;;4107:1;4104;4097:12;4059:2;4150:1;4175:53;4220:7;4211:6;4200:9;4196:22;4175:53;:::i;:::-;4165:63;;4121:117;4277:2;4303:53;4348:7;4339:6;4328:9;4324:22;4303:53;:::i;:::-;4293:63;;4248:118;4405:2;4431:53;4476:7;4467:6;4456:9;4452:22;4431:53;:::i;:::-;4421:63;;4376:118;4049:452;;;;;:::o;4507:809::-;;;;;4675:3;4663:9;4654:7;4650:23;4646:33;4643:2;;;4692:1;4689;4682:12;4643:2;4735:1;4760:53;4805:7;4796:6;4785:9;4781:22;4760:53;:::i;:::-;4750:63;;4706:117;4862:2;4888:53;4933:7;4924:6;4913:9;4909:22;4888:53;:::i;:::-;4878:63;;4833:118;4990:2;5016:53;5061:7;5052:6;5041:9;5037:22;5016:53;:::i;:::-;5006:63;;4961:118;5146:2;5135:9;5131:18;5118:32;5177:18;5169:6;5166:30;5163:2;;;5209:1;5206;5199:12;5163:2;5237:62;5291:7;5282:6;5271:9;5267:22;5237:62;:::i;:::-;5227:72;;5089:220;4633:683;;;;;;;:::o;5322:401::-;;;5444:2;5432:9;5423:7;5419:23;5415:32;5412:2;;;5460:1;5457;5450:12;5412:2;5503:1;5528:53;5573:7;5564:6;5553:9;5549:22;5528:53;:::i;:::-;5518:63;;5474:117;5630:2;5656:50;5698:7;5689:6;5678:9;5674:22;5656:50;:::i;:::-;5646:60;;5601:115;5402:321;;;;;:::o;5729:407::-;;;5854:2;5842:9;5833:7;5829:23;5825:32;5822:2;;;5870:1;5867;5860:12;5822:2;5913:1;5938:53;5983:7;5974:6;5963:9;5959:22;5938:53;:::i;:::-;5928:63;;5884:117;6040:2;6066:53;6111:7;6102:6;6091:9;6087:22;6066:53;:::i;:::-;6056:63;;6011:118;5812:324;;;;;:::o;6142:405::-;;6275:2;6263:9;6254:7;6250:23;6246:32;6243:2;;;6291:1;6288;6281:12;6243:2;6362:1;6351:9;6347:17;6334:31;6392:18;6384:6;6381:30;6378:2;;;6424:1;6421;6414:12;6378:2;6452:78;6522:7;6513:6;6502:9;6498:22;6452:78;:::i;:::-;6442:88;;6305:235;6233:314;;;;:::o;6553:260::-;;6660:2;6648:9;6639:7;6635:23;6631:32;6628:2;;;6676:1;6673;6666:12;6628:2;6719:1;6744:52;6788:7;6779:6;6768:9;6764:22;6744:52;:::i;:::-;6734:62;;6690:116;6618:195;;;;:::o;6819:282::-;;6937:2;6925:9;6916:7;6912:23;6908:32;6905:2;;;6953:1;6950;6943:12;6905:2;6996:1;7021:63;7076:7;7067:6;7056:9;7052:22;7021:63;:::i;:::-;7011:73;;6967:127;6895:206;;;;:::o;7107:375::-;;7225:2;7213:9;7204:7;7200:23;7196:32;7193:2;;;7241:1;7238;7231:12;7193:2;7312:1;7301:9;7297:17;7284:31;7342:18;7334:6;7331:30;7328:2;;;7374:1;7371;7364:12;7328:2;7402:63;7457:7;7448:6;7437:9;7433:22;7402:63;:::i;:::-;7392:73;;7255:220;7183:299;;;;:::o;7488:262::-;;7596:2;7584:9;7575:7;7571:23;7567:32;7564:2;;;7612:1;7609;7602:12;7564:2;7655:1;7680:53;7725:7;7716:6;7705:9;7701:22;7680:53;:::i;:::-;7670:63;;7626:117;7554:196;;;;:::o;7756:284::-;;7875:2;7863:9;7854:7;7850:23;7846:32;7843:2;;;7891:1;7888;7881:12;7843:2;7934:1;7959:64;8015:7;8006:6;7995:9;7991:22;7959:64;:::i;:::-;7949:74;;7905:128;7833:207;;;;:::o;8046:258::-;;8152:2;8140:9;8131:7;8127:23;8123:32;8120:2;;;8168:1;8165;8158:12;8120:2;8211:1;8236:51;8279:7;8270:6;8259:9;8255:22;8236:51;:::i;:::-;8226:61;;8182:115;8110:194;;;;:::o;8310:118::-;8397:24;8415:5;8397:24;:::i;:::-;8392:3;8385:37;8375:53;;:::o;8434:109::-;8515:21;8530:5;8515:21;:::i;:::-;8510:3;8503:34;8493:50;;:::o;8549:360::-;;8663:38;8695:5;8663:38;:::i;:::-;8717:70;8780:6;8775:3;8717:70;:::i;:::-;8710:77;;8796:52;8841:6;8836:3;8829:4;8822:5;8818:16;8796:52;:::i;:::-;8873:29;8895:6;8873:29;:::i;:::-;8868:3;8864:39;8857:46;;8639:270;;;;;:::o;8915:364::-;;9031:39;9064:5;9031:39;:::i;:::-;9086:71;9150:6;9145:3;9086:71;:::i;:::-;9079:78;;9166:52;9211:6;9206:3;9199:4;9192:5;9188:16;9166:52;:::i;:::-;9243:29;9265:6;9243:29;:::i;:::-;9238:3;9234:39;9227:46;;9007:272;;;;;:::o;9285:377::-;;9419:39;9452:5;9419:39;:::i;:::-;9474:89;9556:6;9551:3;9474:89;:::i;:::-;9467:96;;9572:52;9617:6;9612:3;9605:4;9598:5;9594:16;9572:52;:::i;:::-;9649:6;9644:3;9640:16;9633:23;;9395:267;;;;;:::o;9668:367::-;;9831:67;9895:2;9890:3;9831:67;:::i;:::-;9824:74;;9928:34;9924:1;9919:3;9915:11;9908:55;9994:5;9989:2;9984:3;9980:12;9973:27;10026:2;10021:3;10017:12;10010:19;;9814:221;;;:::o;10041:382::-;;10204:67;10268:2;10263:3;10204:67;:::i;:::-;10197:74;;10301:34;10297:1;10292:3;10288:11;10281:55;10367:20;10362:2;10357:3;10353:12;10346:42;10414:2;10409:3;10405:12;10398:19;;10187:236;;;:::o;10429:370::-;;10592:67;10656:2;10651:3;10592:67;:::i;:::-;10585:74;;10689:34;10685:1;10680:3;10676:11;10669:55;10755:8;10750:2;10745:3;10741:12;10734:30;10790:2;10785:3;10781:12;10774:19;;10575:224;;;:::o;10805:326::-;;10968:67;11032:2;11027:3;10968:67;:::i;:::-;10961:74;;11065:30;11061:1;11056:3;11052:11;11045:51;11122:2;11117:3;11113:12;11106:19;;10951:180;;;:::o;11137:324::-;;11300:67;11364:2;11359:3;11300:67;:::i;:::-;11293:74;;11397:28;11393:1;11388:3;11384:11;11377:49;11452:2;11447:3;11443:12;11436:19;;11283:178;;;:::o;11467:368::-;;11630:67;11694:2;11689:3;11630:67;:::i;:::-;11623:74;;11727:34;11723:1;11718:3;11714:11;11707:55;11793:6;11788:2;11783:3;11779:12;11772:28;11826:2;11821:3;11817:12;11810:19;;11613:222;;;:::o;11841:323::-;;12004:67;12068:2;12063:3;12004:67;:::i;:::-;11997:74;;12101:27;12097:1;12092:3;12088:11;12081:48;12155:2;12150:3;12146:12;12139:19;;11987:177;;;:::o;12170:314::-;;12333:67;12397:2;12392:3;12333:67;:::i;:::-;12326:74;;12430:18;12426:1;12421:3;12417:11;12410:39;12475:2;12470:3;12466:12;12459:19;;12316:168;;;:::o;12490:376::-;;12653:67;12717:2;12712:3;12653:67;:::i;:::-;12646:74;;12750:34;12746:1;12741:3;12737:11;12730:55;12816:14;12811:2;12806:3;12802:12;12795:36;12857:2;12852:3;12848:12;12841:19;;12636:230;;;:::o;12872:388::-;;13035:67;13099:2;13094:3;13035:67;:::i;:::-;13028:74;;13132:34;13128:1;13123:3;13119:11;13112:55;13198:26;13193:2;13188:3;13184:12;13177:48;13251:2;13246:3;13242:12;13235:19;;13018:242;;;:::o;13266:319::-;;13429:67;13493:2;13488:3;13429:67;:::i;:::-;13422:74;;13526:23;13522:1;13517:3;13513:11;13506:44;13576:2;13571:3;13567:12;13560:19;;13412:173;;;:::o;13591:374::-;;13754:67;13818:2;13813:3;13754:67;:::i;:::-;13747:74;;13851:34;13847:1;13842:3;13838:11;13831:55;13917:12;13912:2;13907:3;13903:12;13896:34;13956:2;13951:3;13947:12;13940:19;;13737:228;;;:::o;13971:373::-;;14134:67;14198:2;14193:3;14134:67;:::i;:::-;14127:74;;14231:34;14227:1;14222:3;14218:11;14211:55;14297:11;14292:2;14287:3;14283:12;14276:33;14335:2;14330:3;14326:12;14319:19;;14117:227;;;:::o;14350:330::-;;14513:67;14577:2;14572:3;14513:67;:::i;:::-;14506:74;;14610:34;14606:1;14601:3;14597:11;14590:55;14671:2;14666:3;14662:12;14655:19;;14496:184;;;:::o;14686:376::-;;14849:67;14913:2;14908:3;14849:67;:::i;:::-;14842:74;;14946:34;14942:1;14937:3;14933:11;14926:55;15012:14;15007:2;15002:3;14998:12;14991:36;15053:2;15048:3;15044:12;15037:19;;14832:230;;;:::o;15068:337::-;;15249:84;15331:1;15326:3;15249:84;:::i;:::-;15242:91;;15363:7;15359:1;15354:3;15350:11;15343:28;15397:1;15392:3;15388:11;15381:18;;15232:173;;;:::o;15411:330::-;;15574:67;15638:2;15633:3;15574:67;:::i;:::-;15567:74;;15671:34;15667:1;15662:3;15658:11;15651:55;15732:2;15727:3;15723:12;15716:19;;15557:184;;;:::o;15747:373::-;;15910:67;15974:2;15969:3;15910:67;:::i;:::-;15903:74;;16007:34;16003:1;15998:3;15994:11;15987:55;16073:11;16068:2;16063:3;16059:12;16052:33;16111:2;16106:3;16102:12;16095:19;;15893:227;;;:::o;16126:379::-;;16289:67;16353:2;16348:3;16289:67;:::i;:::-;16282:74;;16386:34;16382:1;16377:3;16373:11;16366:55;16452:17;16447:2;16442:3;16438:12;16431:39;16496:2;16491:3;16487:12;16480:19;;16272:233;;;:::o;16511:365::-;;16674:67;16738:2;16733:3;16674:67;:::i;:::-;16667:74;;16771:34;16767:1;16762:3;16758:11;16751:55;16837:3;16832:2;16827:3;16823:12;16816:25;16867:2;16862:3;16858:12;16851:19;;16657:219;;;:::o;16882:368::-;;17045:67;17109:2;17104:3;17045:67;:::i;:::-;17038:74;;17142:34;17138:1;17133:3;17129:11;17122:55;17208:6;17203:2;17198:3;17194:12;17187:28;17241:2;17236:3;17232:12;17225:19;;17028:222;;;:::o;17256:314::-;;17419:67;17483:2;17478:3;17419:67;:::i;:::-;17412:74;;17516:18;17512:1;17507:3;17503:11;17496:39;17561:2;17556:3;17552:12;17545:19;;17402:168;;;:::o;17576:381::-;;17739:67;17803:2;17798:3;17739:67;:::i;:::-;17732:74;;17836:34;17832:1;17827:3;17823:11;17816:55;17902:19;17897:2;17892:3;17888:12;17881:41;17948:2;17943:3;17939:12;17932:19;;17722:235;;;:::o;17963:115::-;18048:23;18065:5;18048:23;:::i;:::-;18043:3;18036:36;18026:52;;:::o;18084:118::-;18171:24;18189:5;18171:24;:::i;:::-;18166:3;18159:37;18149:53;;:::o;18208:112::-;18291:22;18307:5;18291:22;:::i;:::-;18286:3;18279:35;18269:51;;:::o;18326:701::-;;18629:95;18720:3;18711:6;18629:95;:::i;:::-;18622:102;;18741:95;18832:3;18823:6;18741:95;:::i;:::-;18734:102;;18853:148;18997:3;18853:148;:::i;:::-;18846:155;;19018:3;19011:10;;18611:416;;;;;:::o;19033:222::-;;19164:2;19153:9;19149:18;19141:26;;19177:71;19245:1;19234:9;19230:17;19221:6;19177:71;:::i;:::-;19131:124;;;;:::o;19261:640::-;;19494:3;19483:9;19479:19;19471:27;;19508:71;19576:1;19565:9;19561:17;19552:6;19508:71;:::i;:::-;19589:72;19657:2;19646:9;19642:18;19633:6;19589:72;:::i;:::-;19671;19739:2;19728:9;19724:18;19715:6;19671:72;:::i;:::-;19790:9;19784:4;19780:20;19775:2;19764:9;19760:18;19753:48;19818:76;19889:4;19880:6;19818:76;:::i;:::-;19810:84;;19461:440;;;;;;;:::o;19907:210::-;;20032:2;20021:9;20017:18;20009:26;;20045:65;20107:1;20096:9;20092:17;20083:6;20045:65;:::i;:::-;19999:118;;;;:::o;20123:313::-;;20274:2;20263:9;20259:18;20251:26;;20323:9;20317:4;20313:20;20309:1;20298:9;20294:17;20287:47;20351:78;20424:4;20415:6;20351:78;:::i;:::-;20343:86;;20241:195;;;;:::o;20442:419::-;;20646:2;20635:9;20631:18;20623:26;;20695:9;20689:4;20685:20;20681:1;20670:9;20666:17;20659:47;20723:131;20849:4;20723:131;:::i;:::-;20715:139;;20613:248;;;:::o;20867:419::-;;21071:2;21060:9;21056:18;21048:26;;21120:9;21114:4;21110:20;21106:1;21095:9;21091:17;21084:47;21148:131;21274:4;21148:131;:::i;:::-;21140:139;;21038:248;;;:::o;21292:419::-;;21496:2;21485:9;21481:18;21473:26;;21545:9;21539:4;21535:20;21531:1;21520:9;21516:17;21509:47;21573:131;21699:4;21573:131;:::i;:::-;21565:139;;21463:248;;;:::o;21717:419::-;;21921:2;21910:9;21906:18;21898:26;;21970:9;21964:4;21960:20;21956:1;21945:9;21941:17;21934:47;21998:131;22124:4;21998:131;:::i;:::-;21990:139;;21888:248;;;:::o;22142:419::-;;22346:2;22335:9;22331:18;22323:26;;22395:9;22389:4;22385:20;22381:1;22370:9;22366:17;22359:47;22423:131;22549:4;22423:131;:::i;:::-;22415:139;;22313:248;;;:::o;22567:419::-;;22771:2;22760:9;22756:18;22748:26;;22820:9;22814:4;22810:20;22806:1;22795:9;22791:17;22784:47;22848:131;22974:4;22848:131;:::i;:::-;22840:139;;22738:248;;;:::o;22992:419::-;;23196:2;23185:9;23181:18;23173:26;;23245:9;23239:4;23235:20;23231:1;23220:9;23216:17;23209:47;23273:131;23399:4;23273:131;:::i;:::-;23265:139;;23163:248;;;:::o;23417:419::-;;23621:2;23610:9;23606:18;23598:26;;23670:9;23664:4;23660:20;23656:1;23645:9;23641:17;23634:47;23698:131;23824:4;23698:131;:::i;:::-;23690:139;;23588:248;;;:::o;23842:419::-;;24046:2;24035:9;24031:18;24023:26;;24095:9;24089:4;24085:20;24081:1;24070:9;24066:17;24059:47;24123:131;24249:4;24123:131;:::i;:::-;24115:139;;24013:248;;;:::o;24267:419::-;;24471:2;24460:9;24456:18;24448:26;;24520:9;24514:4;24510:20;24506:1;24495:9;24491:17;24484:47;24548:131;24674:4;24548:131;:::i;:::-;24540:139;;24438:248;;;:::o;24692:419::-;;24896:2;24885:9;24881:18;24873:26;;24945:9;24939:4;24935:20;24931:1;24920:9;24916:17;24909:47;24973:131;25099:4;24973:131;:::i;:::-;24965:139;;24863:248;;;:::o;25117:419::-;;25321:2;25310:9;25306:18;25298:26;;25370:9;25364:4;25360:20;25356:1;25345:9;25341:17;25334:47;25398:131;25524:4;25398:131;:::i;:::-;25390:139;;25288:248;;;:::o;25542:419::-;;25746:2;25735:9;25731:18;25723:26;;25795:9;25789:4;25785:20;25781:1;25770:9;25766:17;25759:47;25823:131;25949:4;25823:131;:::i;:::-;25815:139;;25713:248;;;:::o;25967:419::-;;26171:2;26160:9;26156:18;26148:26;;26220:9;26214:4;26210:20;26206:1;26195:9;26191:17;26184:47;26248:131;26374:4;26248:131;:::i;:::-;26240:139;;26138:248;;;:::o;26392:419::-;;26596:2;26585:9;26581:18;26573:26;;26645:9;26639:4;26635:20;26631:1;26620:9;26616:17;26609:47;26673:131;26799:4;26673:131;:::i;:::-;26665:139;;26563:248;;;:::o;26817:419::-;;27021:2;27010:9;27006:18;26998:26;;27070:9;27064:4;27060:20;27056:1;27045:9;27041:17;27034:47;27098:131;27224:4;27098:131;:::i;:::-;27090:139;;26988:248;;;:::o;27242:419::-;;27446:2;27435:9;27431:18;27423:26;;27495:9;27489:4;27485:20;27481:1;27470:9;27466:17;27459:47;27523:131;27649:4;27523:131;:::i;:::-;27515:139;;27413:248;;;:::o;27667:419::-;;27871:2;27860:9;27856:18;27848:26;;27920:9;27914:4;27910:20;27906:1;27895:9;27891:17;27884:47;27948:131;28074:4;27948:131;:::i;:::-;27940:139;;27838:248;;;:::o;28092:419::-;;28296:2;28285:9;28281:18;28273:26;;28345:9;28339:4;28335:20;28331:1;28320:9;28316:17;28309:47;28373:131;28499:4;28373:131;:::i;:::-;28365:139;;28263:248;;;:::o;28517:419::-;;28721:2;28710:9;28706:18;28698:26;;28770:9;28764:4;28760:20;28756:1;28745:9;28741:17;28734:47;28798:131;28924:4;28798:131;:::i;:::-;28790:139;;28688:248;;;:::o;28942:419::-;;29146:2;29135:9;29131:18;29123:26;;29195:9;29189:4;29185:20;29181:1;29170:9;29166:17;29159:47;29223:131;29349:4;29223:131;:::i;:::-;29215:139;;29113:248;;;:::o;29367:419::-;;29571:2;29560:9;29556:18;29548:26;;29620:9;29614:4;29610:20;29606:1;29595:9;29591:17;29584:47;29648:131;29774:4;29648:131;:::i;:::-;29640:139;;29538:248;;;:::o;29792:218::-;;29921:2;29910:9;29906:18;29898:26;;29934:69;30000:1;29989:9;29985:17;29976:6;29934:69;:::i;:::-;29888:122;;;;:::o;30016:222::-;;30147:2;30136:9;30132:18;30124:26;;30160:71;30228:1;30217:9;30213:17;30204:6;30160:71;:::i;:::-;30114:124;;;;:::o;30244:214::-;;30371:2;30360:9;30356:18;30348:26;;30384:67;30448:1;30437:9;30433:17;30424:6;30384:67;:::i;:::-;30338:120;;;;:::o;30464:283::-;;30530:2;30524:9;30514:19;;30572:4;30564:6;30560:17;30679:6;30667:10;30664:22;30643:18;30631:10;30628:34;30625:62;30622:2;;;30690:18;;:::i;:::-;30622:2;30730:10;30726:2;30719:22;30504:243;;;;:::o;30753:311::-;;30920:18;30912:6;30909:30;30906:2;;;30942:18;;:::i;:::-;30906:2;30992:4;30984:6;30980:17;30972:25;;31052:4;31046;31042:15;31034:23;;30835:229;;;:::o;31070:331::-;;31221:18;31213:6;31210:30;31207:2;;;31243:18;;:::i;:::-;31207:2;31328:4;31324:9;31317:4;31309:6;31305:17;31301:33;31293:41;;31389:4;31383;31379:15;31371:23;;31136:265;;;:::o;31407:332::-;;31559:18;31551:6;31548:30;31545:2;;;31581:18;;:::i;:::-;31545:2;31666:4;31662:9;31655:4;31647:6;31643:17;31639:33;31631:41;;31727:4;31721;31717:15;31709:23;;31474:265;;;:::o;31745:98::-;;31830:5;31824:12;31814:22;;31803:40;;;:::o;31849:99::-;;31935:5;31929:12;31919:22;;31908:40;;;:::o;31954:168::-;;32071:6;32066:3;32059:19;32111:4;32106:3;32102:14;32087:29;;32049:73;;;;:::o;32128:169::-;;32246:6;32241:3;32234:19;32286:4;32281:3;32277:14;32262:29;;32224:73;;;;:::o;32303:148::-;;32442:3;32427:18;;32417:34;;;;:::o;32457:242::-;;32515:19;32532:1;32515:19;:::i;:::-;32510:24;;32548:19;32565:1;32548:19;:::i;:::-;32543:24;;32641:1;32633:6;32629:14;32626:1;32623:21;32620:2;;;32647:18;;:::i;:::-;32620:2;32691:1;32688;32684:9;32677:16;;32500:199;;;;:::o;32705:305::-;;32764:20;32782:1;32764:20;:::i;:::-;32759:25;;32798:20;32816:1;32798:20;:::i;:::-;32793:25;;32952:1;32884:66;32880:74;32877:1;32874:81;32871:2;;;32958:18;;:::i;:::-;32871:2;33002:1;32999;32995:9;32988:16;;32749:261;;;;:::o;33016:237::-;;33073:18;33089:1;33073:18;:::i;:::-;33068:23;;33105:18;33121:1;33105:18;:::i;:::-;33100:23;;33195:1;33189:4;33185:12;33182:1;33179:19;33176:2;;;33201:18;;:::i;:::-;33176:2;33245:1;33242;33238:9;33231:16;;33058:195;;;;:::o;33259:185::-;;33316:20;33334:1;33316:20;:::i;:::-;33311:25;;33350:20;33368:1;33350:20;:::i;:::-;33345:25;;33389:1;33379:2;;33394:18;;:::i;:::-;33379:2;33436:1;33433;33429:9;33424:14;;33301:143;;;;:::o;33450:348::-;;33513:20;33531:1;33513:20;:::i;:::-;33508:25;;33547:20;33565:1;33547:20;:::i;:::-;33542:25;;33735:1;33667:66;33663:74;33660:1;33657:81;33652:1;33645:9;33638:17;33634:105;33631:2;;;33742:18;;:::i;:::-;33631:2;33790:1;33787;33783:9;33772:20;;33498:300;;;;:::o;33804:188::-;;33863:19;33880:1;33863:19;:::i;:::-;33858:24;;33896:19;33913:1;33896:19;:::i;:::-;33891:24;;33934:1;33931;33928:8;33925:2;;;33939:18;;:::i;:::-;33925:2;33984:1;33981;33977:9;33969:17;;33848:144;;;;:::o;33998:191::-;;34058:20;34076:1;34058:20;:::i;:::-;34053:25;;34092:20;34110:1;34092:20;:::i;:::-;34087:25;;34131:1;34128;34125:8;34122:2;;;34136:18;;:::i;:::-;34122:2;34181:1;34178;34174:9;34166:17;;34043:146;;;;:::o;34195:96::-;;34261:24;34279:5;34261:24;:::i;:::-;34250:35;;34240:51;;;:::o;34297:90::-;;34374:5;34367:13;34360:21;34349:32;;34339:48;;;:::o;34393:149::-;;34469:66;34462:5;34458:78;34447:89;;34437:105;;;:::o;34548:89::-;;34624:6;34617:5;34613:18;34602:29;;34592:45;;;:::o;34643:126::-;;34720:42;34713:5;34709:54;34698:65;;34688:81;;;:::o;34775:77::-;;34841:5;34830:16;;34820:32;;;:::o;34858:86::-;;34933:4;34926:5;34922:16;34911:27;;34901:43;;;:::o;34950:154::-;35034:6;35029:3;35024;35011:30;35096:1;35087:6;35082:3;35078:16;35071:27;35001:103;;;:::o;35110:307::-;35178:1;35188:113;35202:6;35199:1;35196:13;35188:113;;;35287:1;35282:3;35278:11;35272:18;35268:1;35263:3;35259:11;35252:39;35224:2;35221:1;35217:10;35212:15;;35188:113;;;35319:6;35316:1;35313:13;35310:2;;;35399:1;35390:6;35385:3;35381:16;35374:27;35310:2;35159:258;;;;:::o;35423:320::-;;35504:1;35498:4;35494:12;35484:22;;35551:1;35545:4;35541:12;35572:18;35562:2;;35628:4;35620:6;35616:17;35606:27;;35562:2;35690;35682:6;35679:14;35659:18;35656:38;35653:2;;;35709:18;;:::i;:::-;35653:2;35474:269;;;;:::o;35749:171::-;;35810:23;35827:5;35810:23;:::i;:::-;35801:32;;35855:6;35848:5;35845:17;35842:2;;;35865:18;;:::i;:::-;35842:2;35912:1;35905:5;35901:13;35894:20;;35791:129;;;:::o;35926:233::-;;35988:24;36006:5;35988:24;:::i;:::-;35979:33;;36034:66;36027:5;36024:77;36021:2;;;36104:18;;:::i;:::-;36021:2;36151:1;36144:5;36140:13;36133:20;;35969:190;;;:::o;36165:167::-;;36225:22;36241:5;36225:22;:::i;:::-;36216:31;;36269:4;36262:5;36259:15;36256:2;;;36277:18;;:::i;:::-;36256:2;36324:1;36317:5;36313:13;36306:20;;36206:126;;;:::o;36338:176::-;;36387:20;36405:1;36387:20;:::i;:::-;36382:25;;36421:20;36439:1;36421:20;:::i;:::-;36416:25;;36460:1;36450:2;;36465:18;;:::i;:::-;36450:2;36506:1;36503;36499:9;36494:14;;36372:142;;;;:::o;36520:180::-;36568:77;36565:1;36558:88;36665:4;36662:1;36655:15;36689:4;36686:1;36679:15;36706:180;36754:77;36751:1;36744:88;36851:4;36848:1;36841:15;36875:4;36872:1;36865:15;36892:180;36940:77;36937:1;36930:88;37037:4;37034:1;37027:15;37061:4;37058:1;37051:15;37078:180;37126:77;37123:1;37116:88;37223:4;37220:1;37213:15;37247:4;37244:1;37237:15;37264:102;;37356:2;37352:7;37347:2;37340:5;37336:14;37332:28;37322:38;;37312:54;;;:::o;37372:122::-;37445:24;37463:5;37445:24;:::i;:::-;37438:5;37435:35;37425:2;;37484:1;37481;37474:12;37425:2;37415:79;:::o;37500:116::-;37570:21;37585:5;37570:21;:::i;:::-;37563:5;37560:32;37550:2;;37606:1;37603;37596:12;37550:2;37540:76;:::o;37622:120::-;37694:23;37711:5;37694:23;:::i;:::-;37687:5;37684:34;37674:2;;37732:1;37729;37722:12;37674:2;37664:78;:::o;37748:122::-;37821:24;37839:5;37821:24;:::i;:::-;37814:5;37811:35;37801:2;;37860:1;37857;37850:12;37801:2;37791:79;:::o;37876:118::-;37947:22;37963:5;37947:22;:::i;:::-;37940:5;37937:33;37927:2;;37984:1;37981;37974:12;37927:2;37917:77;:::o

Swarm Source

ipfs://95a82d2764ddfa9b15b6c37e9b5f0d4ca71dd7be3b31c62bc7e4dd4aa7a3ed51
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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