ETH Price: $3,105.48 (+1.08%)
Gas: 7 Gwei

Token

TexasChainsawMassacre (TCM)
 

Overview

Max Total Supply

905 TCM

Holders

362

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
coolbeets.eth
Balance
2 TCM
0x6c94692b916acd06595d9d44cd97b1d255442c11
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:
TCM

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-10
*/

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 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 {}
}


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts-upgradeable/utils/math/[email protected]



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMathUpgradeable {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


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



pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File contracts/extends/Salable.sol

pragma solidity ^0.8.0;
// ,--. ,--.,--.  ,--.                 ,------.
// |  | |  ||  |,-'  '-.,--.--. ,--,--.|  .--. ' ,--,--.,--.--. ,---.
// |  | |  ||  |'-.  .-'|  .--'' ,-.  ||  '--'.'' ,-.  ||  .--'| .-. :
// '  '-'  '|  |  |  |  |  |   \ '-'  ||  |\  \ \ '-'  ||  |   \   --.
//  `-----' `--'  `--'  `--'    `--`--'`--' '--' `--`--'`--'    `----'
//
//Common functionality for whitelisting, presales and sales
abstract contract Salable is ERC721Enumerable, Ownable {

    uint256 public maxNFTCirculation;
    bool public isWhitelistSaleActive;
    bool public isPublicSaleActive;
    bool public isPreSaleActive;

    mapping(address => bool) public whitelist;

    modifier onlyWhenPublicSaleIsActive {
        require(isPublicSaleActive, "TCM: Public Sale Is Inactive");
        _;
    }

    modifier onlyWhenWhitelistSaleIsActive {
        require(isWhitelistSaleActive, "TCM: Whitelist Sale Is Inactive");
        _;
    }

    modifier onlyWhenPreSaleIsActive {
        require(isPreSaleActive, "TCM: Presale Is Inactive");
        _;
    }

    //Toggle states
    function setSaleActiveState(bool state) external onlyOwner {

        if (state == true) {
            require(isWhitelistSaleActive == false && isPreSaleActive == false, "Other sales not inactive");
        }
        isPublicSaleActive = state;
    }

    function setWhitelistSaleState(bool state) external onlyOwner {

        if (state == true) {
            require(isPublicSaleActive == false && isPreSaleActive == false, "Other sales not inactive");
        }
        isWhitelistSaleActive = state;
    }

    function setPreSaleState(bool state) external onlyOwner {

        if (state == true) {
            require(isPublicSaleActive == false && isWhitelistSaleActive == false, "Other sales not inactive");
        }
        isPreSaleActive = state;
    }
    //End Toggle states

    //Allow us to whitelist in bulk
    function addToWhitelistBulk(address[] memory addresses) external onlyOwner {
        for(uint i = 0; i < addresses.length; i++) {
            whitelist[addresses[i]] = true;
        }
    }

    //Add an address to our whitelist
    function addToWhitelist(address newAdd) external onlyOwner {
        whitelist[newAdd] = true;
    }

    //Remove an address from our whitelist
    function removeFromWhitelist(address remove) external onlyOwner {
        whitelist[remove] = false;
    }

    //Allow the owner to mint a set of NFTs to airdrop
    function mintForAirdrop(uint256 numberToMint) external onlyOwner {
        require(totalSupply() + numberToMint <= maxNFTCirculation, "TCM: Cap exceeded");

        for (uint256 i = 0; i < numberToMint; i++) {
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }
}


// File contracts/URMintPass.sol

pragma solidity ^0.8.0;
// ,--. ,--.,--.  ,--.                 ,------.
// |  | |  ||  |,-'  '-.,--.--. ,--,--.|  .--. ' ,--,--.,--.--. ,---.
// |  | |  ||  |'-.  .-'|  .--'' ,-.  ||  '--'.'' ,-.  ||  .--'| .-. :
// '  '-'  '|  |  |  |  |  |   \ '-'  ||  |\  \ \ '-'  ||  |   \   --.
// `-----'  `--'  `--'  `--'    `--`--'`--' '--' `--`--'`--'    `----'
//
// Ultra Rare Mint Pass - https://www.ultrarare.uk
contract URMintPass is ERC721, ERC721Enumerable, Ownable, Salable {

    using SafeMathUpgradeable for uint256;

    string public baseUri;
    uint256 public mintCost;

    address payable public urWallet;
    mapping(address => bool) public hasBought;


    constructor() ERC721("UltraRareMintPass", "URMP") {
        isPublicSaleActive = false;
        isWhitelistSaleActive = false;
        //0.13 Ethereum
        mintCost = 130000000000000000;
        maxNFTCirculation = 666;
    }

    //Start overrides
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal virtual override(ERC721) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId) public view virtual override(ERC721) returns (string memory) {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }
    //End overrides

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

    //Set this, will eventually land on the IPFS once all is complete
    function setBaseUri(string memory _baseUri) external onlyOwner {
        baseUri = _baseUri;
    }

    //Withdraw to the UR defined wallet
    function withdraw() external onlyOwner {

        require(urWallet != address(0), "UR Empty");
        urWallet.transfer(address(this).balance);
    }

    //Allows one mint pass per wallet to be minted in the public sale
    function mintInPublic() external payable onlyWhenPublicSaleIsActive {
        require(totalSupply() + 1 <= maxNFTCirculation, "TCM: Cap exceeded");
        require(mintCost <= msg.value, "TCM: Incorrect Ether Value");
        require(hasBought[msg.sender] == false, "TCM: User may only buy one pass");

        hasBought[msg.sender] = true; //ensure user cannot purchase more than 1 mint pass
        _safeMint(msg.sender, totalSupply() + 1);
    }

    //Allows an NFT to be whitelisted in the whitelist sale
    function mintInWhitelist() external payable onlyWhenWhitelistSaleIsActive {
        require(totalSupply() + 1 <= maxNFTCirculation, "TCM: Cap exceeded");
        require(mintCost <= msg.value, "TCM: Incorrect Ether Value");
        require(whitelist[msg.sender] == true, "User not in whitelist");
        require(hasBought[msg.sender] == false, "TCM: User may only buy one pass");

        hasBought[msg.sender] = true;  //ensure user cannot purchase more than 1 mint pass
        whitelist[msg.sender] = false; //remove from the whitelist so this person can't buy again
        _safeMint(msg.sender, totalSupply() + 1);
    }

    //Sets our wallets to their initial values
    function setWallets(address payable _urWallet) external onlyOwner {
        urWallet = _urWallet;
    }
}


// File contracts/TCM.sol

pragma solidity ^0.8.0;
// ,--. ,--.,--.  ,--.                 ,------.
// |  | |  ||  |,-'  '-.,--.--. ,--,--.|  .--. ' ,--,--.,--.--. ,---.
// |  | |  ||  |'-.  .-'|  .--'' ,-.  ||  '--'.'' ,-.  ||  .--'| .-. :
// '  '-'  '|  |  |  |  |  |   \ '-'  ||  |\  \ \ '-'  ||  |   \   --.
//  `-----' `--'  `--'  `--'    `--`--'`--' '--' `--`--'`--'    `----'
//
// Texas Chainsaw Massacre NFT - https://leatherfaces.io
contract TCM is ERC721, ERC721Enumerable, Ownable, Salable {

    using SafeMathUpgradeable for uint256;

    string public baseUri;
    string public provenanceHash;
    uint256 public mintCost;
    uint256 public maxBuyAtOncePublic;
    uint256 public maxBuyAtOncePresale;

    address payable public urWallet;
    address payable public tcmWallet;
    address payable public jWallet;

    mapping(uint256 => bool) public tokensUsedByMintPass;

    address public mintPassAddress;
    URMintPass private mintPass;

    constructor(address newMintPassAddress) ERC721("TexasChainsawMassacre", "TCM") {
        isPublicSaleActive = false;
        isWhitelistSaleActive = false;
        maxBuyAtOncePublic = 5;
        maxBuyAtOncePresale = 3;

        //0.0666 Ethereum
        mintCost = 66600000000000000;
        maxNFTCirculation = 1732;

        mintPassAddress = newMintPassAddress;
        mintPass = URMintPass(mintPassAddress);
    }

    //Start overrides
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal virtual override(ERC721) {
        super._burn(tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }
    //End overrides

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

    //Set this, will eventually land on the IPFS once all is complete
    function setBaseUri(string memory _baseUri) external onlyOwner {
        baseUri = _baseUri;
    }

    function setProvenanceHash(string memory _provenanceHash) external onlyOwner {
        require(bytes(provenanceHash).length == 0, "PH already set");
        provenanceHash = _provenanceHash;
    }

    //Sets our wallets to their initial values
    function setWallets(
        address payable _urWallet,
        address payable _tcmWallet,
        address payable _jWallet) external onlyOwner {
        urWallet = _urWallet;
        tcmWallet = _tcmWallet;
        jWallet = _jWallet;
    }

    //Splits withdraw amongst 3 parties
    function withdraw() external onlyOwner {

        require(urWallet != address(0), "UR Empty");
        require(tcmWallet != address(0), "TCM Empty");
        require(jWallet != address(0), "J Empty");

        uint256 amount45 = address(this).balance.mul(450).div(1000);
        // 45%
        uint256 amount10 = address(this).balance.mul(100).div(1000);
        // 10%
        urWallet.transfer(amount45);
        tcmWallet.transfer(amount45);
        jWallet.transfer(amount10);
    }

    //Allows NFTs to be minted in the main sale
    function mintInPublic(uint256 numberToMint) external payable onlyWhenPublicSaleIsActive {
        require(numberToMint <= maxBuyAtOncePublic, "TCM: Requested too many");
        require(totalSupply() + numberToMint <= maxNFTCirculation, "TCM: Cap exceeded");
        require(mintCost * numberToMint <= msg.value, "TCM: Incorrect Ether Value");

        for (uint256 i = 0; i < numberToMint; i++) {
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

    //Allows an NFT to be bought in the whitelist sale
    function mintInWhitelist() external payable onlyWhenWhitelistSaleIsActive {
        require(totalSupply() + 1 <= maxNFTCirculation, "TCM: Cap exceeded");
        require(mintCost <= msg.value, "TCM: Incorrect Ether Value");
        require(whitelist[msg.sender] == true, "User not in whitelist");

        whitelist[msg.sender] = false; //remove from the whitelist so this person can't buy again
        _safeMint(msg.sender, totalSupply() + 1);
    }

    //Allows an NFT to be bought in the presale, by users with a mint pass
    function mintInPresale(uint256 numberToBuy) external payable onlyWhenPreSaleIsActive {

        uint256 numberToMint = numberToBuy + 1;

        require(numberToBuy <= maxBuyAtOncePresale, "TCM: Requested too many");
        require(totalSupply() + numberToMint <= maxNFTCirculation, "TCM: Cap exceeded");
        require(mintCost * numberToBuy <= msg.value, "TCM: Incorrect Ether Value");

        uint256 balanceOf = mintPass.balanceOf(msg.sender);
        require(balanceOf > 0, "MP not owned");

        bool minted = false;

        //Loop through mint passes user owns, and find the first they have not used to purchase
        for(uint256 bPos = 0; bPos < balanceOf; bPos++){

            uint256 mintPassTokenIndex = mintPass.tokenOfOwnerByIndex(msg.sender, bPos);
            if(tokensUsedByMintPass[mintPassTokenIndex] == false){
                //Negate token, and mint
                tokensUsedByMintPass[mintPassTokenIndex] = true;
                for (uint256 i = 0; i < numberToMint; i++) {
                    _safeMint(msg.sender, totalSupply() + 1);
                }
                minted = true;
                break; //used this mint pass, peace out!
            }
        }
        require(minted == true, "MP already used");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"newMintPassAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"newAdd","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelistBulk","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":[{"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":"isPreSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAtOncePresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAtOncePublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFTCirculation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberToMint","type":"uint256"}],"name":"mintForAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberToBuy","type":"uint256"}],"name":"mintInPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberToMint","type":"uint256"}],"name":"mintInPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintInWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPassAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"remove","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setSaleActiveState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_urWallet","type":"address"},{"internalType":"address payable","name":"_tcmWallet","type":"address"},{"internalType":"address payable","name":"_jWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelistSaleState","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":"tcmWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensUsedByMintPass","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"urWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200610238038062006102833981810160405281019062000037919062000394565b6040518060400160405280601581526020017f5465786173436861696e7361774d6173736163726500000000000000000000008152506040518060400160405280600381526020017f54434d00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb929190620002cd565b508060019080519060200190620000d4929190620002cd565b505050620000f7620000eb620001ff60201b60201c565b6200020760201b60201c565b6000600c60016101000a81548160ff0219169083151502179055506000600c60006101000a81548160ff0219169083151502179055506005601181905550600360128190555066ec9c58de0a80006010819055506106c4600b8190555080601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000473565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002db90620003f4565b90600052602060002090601f016020900481019282620002ff57600085556200034b565b82601f106200031a57805160ff19168380011785556200034b565b828001600101855582156200034b579182015b828111156200034a5782518255916020019190600101906200032d565b5b5090506200035a91906200035e565b5090565b5b80821115620003795760008160009055506001016200035f565b5090565b6000815190506200038e8162000459565b92915050565b600060208284031215620003a757600080fd5b6000620003b7848285016200037d565b91505092915050565b6000620003cd82620003d4565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200040d57607f821691505b602082108114156200042457620004236200042a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6200046481620003c0565b81146200047057600080fd5b50565b615c7f80620004836000396000f3fe6080604052600436106102935760003560e01c8063715018a61161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd146109b5578063cb689f43146109f2578063e43252d714610a1b578063e985e9c514610a44578063f2fde38b14610a81578063fa3cf93514610aaa57610293565b8063a22cb465146108b9578063a81c804e146108e2578063b88d4fde1461090b578063b98451cf14610934578063bdb4b8481461095f578063c6ab67a31461098a57610293565b8063939b2c3911610113578063939b2c39146107a757806395d89b41146107d25780639abc8320146107fd5780639b19251a146108285780639d044ed314610865578063a0bcfc7f1461089057610293565b8063715018a6146106ed57806375cb1bd1146107045780637a6833e21461072d5780637bfb748b146107495780638ab1d681146107535780638da5cb5b1461077c57610293565b80633ccfd60b116101fe5780635977cdcd116101b75780635977cdcd146105b75780636352211e146105e25780636d98174f1461061f5780637046f3401461065c57806370a0823114610685578063710614b6146106c257610293565b80633ccfd60b146104c857806342842e0e146104df5780634968d38e146105085780634f6ccce71461052457806356fc8ed514610561578063570152d31461058c57610293565b806318160ddd1161025057806318160ddd146103b85780631a09d922146103e35780631e84c4131461040e57806323b872dd146104395780632f745c59146104625780633ca6fb8c1461049f57610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063095ea7b31461033d5780630c4dc29c14610366578063109695231461038f575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba91906144da565b610ad5565b6040516102cc9190614bcd565b60405180910390f35b3480156102e157600080fd5b506102ea610b4f565b6040516102f79190614be8565b60405180910390f35b34801561030c57600080fd5b506103276004803603810190610322919061456d565b610be1565b6040516103349190614b22565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f9190614434565b610c66565b005b34801561037257600080fd5b5061038d600480360381019061038891906144b1565b610d7e565b005b34801561039b57600080fd5b506103b660048036038101906103b1919061452c565b610e9a565b005b3480156103c457600080fd5b506103cd610f81565b6040516103da919061500a565b60405180910390f35b3480156103ef57600080fd5b506103f8610f8e565b6040516104059190614b3d565b60405180910390f35b34801561041a57600080fd5b50610423610fb4565b6040516104309190614bcd565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b919061432e565b610fc7565b005b34801561046e57600080fd5b5061048960048036038101906104849190614434565b611027565b604051610496919061500a565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c191906144b1565b6110cc565b005b3480156104d457600080fd5b506104dd6111e8565b005b3480156104eb57600080fd5b506105066004803603810190610501919061432e565b6115b2565b005b610522600480360381019061051d919061456d565b6115d2565b005b34801561053057600080fd5b5061054b6004803603810190610546919061456d565b6119ce565b604051610558919061500a565b60405180910390f35b34801561056d57600080fd5b50610576611a65565b604051610583919061500a565b60405180910390f35b34801561059857600080fd5b506105a1611a6b565b6040516105ae9190614b22565b60405180910390f35b3480156105c357600080fd5b506105cc611a91565b6040516105d9919061500a565b60405180910390f35b3480156105ee57600080fd5b506106096004803603810190610604919061456d565b611a97565b6040516106169190614b22565b60405180910390f35b34801561062b57600080fd5b506106466004803603810190610641919061456d565b611b49565b6040516106539190614bcd565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e91906144b1565b611b69565b005b34801561069157600080fd5b506106ac60048036038101906106a7919061427a565b611c85565b6040516106b9919061500a565b60405180910390f35b3480156106ce57600080fd5b506106d7611d3d565b6040516106e49190614b3d565b60405180910390f35b3480156106f957600080fd5b50610702611d63565b005b34801561071057600080fd5b5061072b600480360381019061072691906142a3565b611deb565b005b6107476004803603810190610742919061456d565b611f2f565b005b6107516120a9565b005b34801561075f57600080fd5b5061077a6004803603810190610775919061427a565b61229f565b005b34801561078857600080fd5b50610791612376565b60405161079e9190614b22565b60405180910390f35b3480156107b357600080fd5b506107bc6123a0565b6040516107c99190614b3d565b60405180910390f35b3480156107de57600080fd5b506107e76123c6565b6040516107f49190614be8565b60405180910390f35b34801561080957600080fd5b50610812612458565b60405161081f9190614be8565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a919061427a565b6124e6565b60405161085c9190614bcd565b60405180910390f35b34801561087157600080fd5b5061087a612506565b6040516108879190614bcd565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b2919061452c565b612519565b005b3480156108c557600080fd5b506108e060048036038101906108db91906143f8565b6125af565b005b3480156108ee57600080fd5b5061090960048036038101906109049190614470565b612730565b005b34801561091757600080fd5b50610932600480360381019061092d919061437d565b612867565b005b34801561094057600080fd5b506109496128c9565b6040516109569190614bcd565b60405180910390f35b34801561096b57600080fd5b506109746128dc565b604051610981919061500a565b60405180910390f35b34801561099657600080fd5b5061099f6128e2565b6040516109ac9190614be8565b60405180910390f35b3480156109c157600080fd5b506109dc60048036038101906109d7919061456d565b612970565b6040516109e99190614be8565b60405180910390f35b3480156109fe57600080fd5b50610a196004803603810190610a14919061456d565b612a17565b005b348015610a2757600080fd5b50610a426004803603810190610a3d919061427a565b612b29565b005b348015610a5057600080fd5b50610a6b6004803603810190610a6691906142f2565b612c00565b604051610a789190614bcd565b60405180910390f35b348015610a8d57600080fd5b50610aa86004803603810190610aa3919061427a565b612c94565b005b348015610ab657600080fd5b50610abf612d8c565b604051610acc919061500a565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b485750610b4782612d92565b5b9050919050565b606060008054610b5e906152f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8a906152f8565b8015610bd75780601f10610bac57610100808354040283529160200191610bd7565b820191906000526020600020905b815481529060010190602001808311610bba57829003601f168201915b5050505050905090565b6000610bec82612e0c565b610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2290614eca565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7182611a97565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990614f8a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d01612e78565b73ffffffffffffffffffffffffffffffffffffffff161480610d305750610d2f81610d2a612e78565b612c00565b5b610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690614e4a565b60405180910390fd5b610d798383612e80565b505050565b610d86612e78565b73ffffffffffffffffffffffffffffffffffffffff16610da4612376565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190614eea565b60405180910390fd5b600115158115151415610e7d5760001515600c60019054906101000a900460ff161515148015610e3d575060001515600c60029054906101000a900460ff161515145b610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7390614d6a565b60405180910390fd5b5b80600c60006101000a81548160ff02191690831515021790555050565b610ea2612e78565b73ffffffffffffffffffffffffffffffffffffffff16610ec0612376565b73ffffffffffffffffffffffffffffffffffffffff1614610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90614eea565b60405180910390fd5b6000600f8054610f25906152f8565b905014610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90614c2a565b60405180910390fd5b80600f9080519060200190610f7d929190613fde565b5050565b6000600880549050905090565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60019054906101000a900460ff1681565b610fd8610fd2612e78565b82612f39565b611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90614faa565b60405180910390fd5b611022838383613017565b505050565b600061103283611c85565b8210611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a90614c4a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110d4612e78565b73ffffffffffffffffffffffffffffffffffffffff166110f2612376565b73ffffffffffffffffffffffffffffffffffffffff1614611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90614eea565b60405180910390fd5b6001151581151514156111cb5760001515600c60019054906101000a900460ff16151514801561118b575060001515600c60009054906101000a900460ff161515145b6111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c190614d6a565b60405180910390fd5b5b80600c60026101000a81548160ff02191690831515021790555050565b6111f0612e78565b73ffffffffffffffffffffffffffffffffffffffff1661120e612376565b73ffffffffffffffffffffffffffffffffffffffff1614611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b90614eea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed90614dca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f90614dea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190614c0a565b60405180910390fd5b60006114456103e86114376101c24761327390919063ffffffff16565b61328990919063ffffffff16565b905060006114716103e861146360644761327390919063ffffffff16565b61328990919063ffffffff16565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156114db573d6000803e3d6000fd5b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611544573d6000803e3d6000fd5b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115ad573d6000803e3d6000fd5b505050565b6115cd83838360405180602001604052806000815250612867565b505050565b600c60029054906101000a900460ff16611621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161890614fea565b60405180910390fd5b6000600182611630919061511b565b9050601254821115611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e90614d2a565b60405180910390fd5b600b5481611683610f81565b61168d919061511b565b11156116ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c590614e2a565b60405180910390fd5b34826010546116dd91906151a2565b111561171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590614f6a565b60405180910390fd5b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161177b9190614b22565b60206040518083038186803b15801561179357600080fd5b505afa1580156117a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cb9190614596565b905060008111611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790614c8a565b60405180910390fd5b6000805b82811015611980576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b815260040161187b929190614ba4565b60206040518083038186803b15801561189357600080fd5b505afa1580156118a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cb9190614596565b9050600015156016600083815260200190815260200160002060009054906101000a900460ff161515141561196c5760016016600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b858110156119615761194e33600161193f610f81565b611949919061511b565b61329f565b80806119599061535b565b915050611929565b506001925050611980565b5080806119789061535b565b915050611814565b5060011515811515146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf90614f4a565b60405180910390fd5b50505050565b60006119d8610f81565b8210611a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1090614fca565b60405180910390fd5b60088281548110611a53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b60115481565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614e8a565b60405180910390fd5b80915050919050565b60166020528060005260406000206000915054906101000a900460ff1681565b611b71612e78565b73ffffffffffffffffffffffffffffffffffffffff16611b8f612376565b73ffffffffffffffffffffffffffffffffffffffff1614611be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdc90614eea565b60405180910390fd5b600115158115151415611c685760001515600c60009054906101000a900460ff161515148015611c28575060001515600c60029054906101000a900460ff161515145b611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90614d6a565b60405180910390fd5b5b80600c60016101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ced90614e6a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d6b612e78565b73ffffffffffffffffffffffffffffffffffffffff16611d89612376565b73ffffffffffffffffffffffffffffffffffffffff1614611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd690614eea565b60405180910390fd5b611de960006132bd565b565b611df3612e78565b73ffffffffffffffffffffffffffffffffffffffff16611e11612376565b73ffffffffffffffffffffffffffffffffffffffff1614611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e90614eea565b60405180910390fd5b82601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600c60019054906101000a900460ff16611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590614d0a565b60405180910390fd5b601154811115611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba90614d2a565b60405180910390fd5b600b5481611fcf610f81565b611fd9919061511b565b111561201a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201190614e2a565b60405180910390fd5b348160105461202991906151a2565b111561206a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206190614f6a565b60405180910390fd5b60005b818110156120a557612092336001612083610f81565b61208d919061511b565b61329f565b808061209d9061535b565b91505061206d565b5050565b600c60009054906101000a900460ff166120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef90614cea565b60405180910390fd5b600b546001612105610f81565b61210f919061511b565b1115612150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214790614e2a565b60405180910390fd5b346010541115612195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218c90614f6a565b60405180910390fd5b60011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f90614d4a565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061229d33600161228e610f81565b612298919061511b565b61329f565b565b6122a7612e78565b73ffffffffffffffffffffffffffffffffffffffff166122c5612376565b73ffffffffffffffffffffffffffffffffffffffff161461231b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231290614eea565b60405180910390fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600180546123d5906152f8565b80601f0160208091040260200160405190810160405280929190818152602001828054612401906152f8565b801561244e5780601f106124235761010080835404028352916020019161244e565b820191906000526020600020905b81548152906001019060200180831161243157829003601f168201915b5050505050905090565b600e8054612465906152f8565b80601f0160208091040260200160405190810160405280929190818152602001828054612491906152f8565b80156124de5780601f106124b3576101008083540402835291602001916124de565b820191906000526020600020905b8154815290600101906020018083116124c157829003601f168201915b505050505081565b600d6020528060005260406000206000915054906101000a900460ff1681565b600c60029054906101000a900460ff1681565b612521612e78565b73ffffffffffffffffffffffffffffffffffffffff1661253f612376565b73ffffffffffffffffffffffffffffffffffffffff1614612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258c90614eea565b60405180910390fd5b80600e90805190602001906125ab929190613fde565b5050565b6125b7612e78565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261c90614daa565b60405180910390fd5b8060056000612632612e78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166126df612e78565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127249190614bcd565b60405180910390a35050565b612738612e78565b73ffffffffffffffffffffffffffffffffffffffff16612756612376565b73ffffffffffffffffffffffffffffffffffffffff16146127ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a390614eea565b60405180910390fd5b60005b8151811015612863576001600d60008484815181106127f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061285b9061535b565b9150506127af565b5050565b612878612872612e78565b83612f39565b6128b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae90614faa565b60405180910390fd5b6128c384848484613383565b50505050565b600c60009054906101000a900460ff1681565b60105481565b600f80546128ef906152f8565b80601f016020809104026020016040519081016040528092919081815260200182805461291b906152f8565b80156129685780601f1061293d57610100808354040283529160200191612968565b820191906000526020600020905b81548152906001019060200180831161294b57829003601f168201915b505050505081565b606061297b82612e0c565b6129ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b190614f2a565b60405180910390fd5b60006129c46133df565b905060008151116129e45760405180602001604052806000815250612a0f565b806129ee84613471565b6040516020016129ff929190614afe565b6040516020818303038152906040525b915050919050565b612a1f612e78565b73ffffffffffffffffffffffffffffffffffffffff16612a3d612376565b73ffffffffffffffffffffffffffffffffffffffff1614612a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8a90614eea565b60405180910390fd5b600b5481612a9f610f81565b612aa9919061511b565b1115612aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae190614e2a565b60405180910390fd5b60005b81811015612b2557612b12336001612b03610f81565b612b0d919061511b565b61329f565b8080612b1d9061535b565b915050612aed565b5050565b612b31612e78565b73ffffffffffffffffffffffffffffffffffffffff16612b4f612376565b73ffffffffffffffffffffffffffffffffffffffff1614612ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9c90614eea565b60405180910390fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612c9c612e78565b73ffffffffffffffffffffffffffffffffffffffff16612cba612376565b73ffffffffffffffffffffffffffffffffffffffff1614612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614eea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7790614caa565b60405180910390fd5b612d89816132bd565b50565b600b5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e055750612e048261361e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612ef383611a97565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612f4482612e0c565b612f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7a90614e0a565b60405180910390fd5b6000612f8e83611a97565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ffd57508373ffffffffffffffffffffffffffffffffffffffff16612fe584610be1565b73ffffffffffffffffffffffffffffffffffffffff16145b8061300e575061300d8185612c00565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661303782611a97565b73ffffffffffffffffffffffffffffffffffffffff161461308d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308490614f0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f490614d8a565b60405180910390fd5b613108838383613700565b613113600082612e80565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461316391906151fc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131ba919061511b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361328191906151a2565b905092915050565b600081836132979190615171565b905092915050565b6132b9828260405180602001604052806000815250613710565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61338e848484613017565b61339a8484848461376b565b6133d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d090614c6a565b60405180910390fd5b50505050565b6060600e80546133ee906152f8565b80601f016020809104026020016040519081016040528092919081815260200182805461341a906152f8565b80156134675780601f1061343c57610100808354040283529160200191613467565b820191906000526020600020905b81548152906001019060200180831161344a57829003601f168201915b5050505050905090565b606060008214156134b9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613619565b600082905060005b600082146134eb5780806134d49061535b565b915050600a826134e49190615171565b91506134c1565b60008167ffffffffffffffff81111561352d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561355f5781602001600182028036833780820191505090505b5090505b600085146136125760018261357891906151fc565b9150600a8561358791906153a4565b6030613593919061511b565b60f81b8183815181106135cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561360b9190615171565b9450613563565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806136e957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806136f957506136f882613902565b5b9050919050565b61370b83838361396c565b505050565b61371a8383613a80565b613727600084848461376b565b613766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375d90614c6a565b60405180910390fd5b505050565b600061378c8473ffffffffffffffffffffffffffffffffffffffff16613c4e565b156138f5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026137b5612e78565b8786866040518563ffffffff1660e01b81526004016137d79493929190614b58565b602060405180830381600087803b1580156137f157600080fd5b505af192505050801561382257506040513d601f19601f8201168201806040525081019061381f9190614503565b60015b6138a5573d8060008114613852576040519150601f19603f3d011682016040523d82523d6000602084013e613857565b606091505b5060008151141561389d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389490614c6a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506138fa565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613977838383613c61565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156139ba576139b581613c66565b6139f9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146139f8576139f78382613caf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a3c57613a3781613e1c565b613a7b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613a7a57613a798282613f5f565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae790614eaa565b60405180910390fd5b613af981612e0c565b15613b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b3090614cca565b60405180910390fd5b613b4560008383613700565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b95919061511b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613cbc84611c85565b613cc691906151fc565b9050600060076000848152602001908152602001600020549050818114613dab576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613e3091906151fc565b9050600060096000848152602001908152602001600020549050600060088381548110613e86577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613ece577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613f43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613f6a83611c85565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613fea906152f8565b90600052602060002090601f01602090048101928261400c5760008555614053565b82601f1061402557805160ff1916838001178555614053565b82800160010185558215614053579182015b82811115614052578251825591602001919060010190614037565b5b5090506140609190614064565b5090565b5b8082111561407d576000816000905550600101614065565b5090565b600061409461408f8461504a565b615025565b905080838252602082019050828560208602820111156140b357600080fd5b60005b858110156140e357816140c98882614169565b8452602084019350602083019250506001810190506140b6565b5050509392505050565b60006141006140fb84615076565b615025565b90508281526020810184848401111561411857600080fd5b6141238482856152b6565b509392505050565b600061413e614139846150a7565b615025565b90508281526020810184848401111561415657600080fd5b6141618482856152b6565b509392505050565b60008135905061417881615bd6565b92915050565b60008135905061418d81615bed565b92915050565b600082601f8301126141a457600080fd5b81356141b4848260208601614081565b91505092915050565b6000813590506141cc81615c04565b92915050565b6000813590506141e181615c1b565b92915050565b6000815190506141f681615c1b565b92915050565b600082601f83011261420d57600080fd5b813561421d8482602086016140ed565b91505092915050565b600082601f83011261423757600080fd5b813561424784826020860161412b565b91505092915050565b60008135905061425f81615c32565b92915050565b60008151905061427481615c32565b92915050565b60006020828403121561428c57600080fd5b600061429a84828501614169565b91505092915050565b6000806000606084860312156142b857600080fd5b60006142c68682870161417e565b93505060206142d78682870161417e565b92505060406142e88682870161417e565b9150509250925092565b6000806040838503121561430557600080fd5b600061431385828601614169565b925050602061432485828601614169565b9150509250929050565b60008060006060848603121561434357600080fd5b600061435186828701614169565b935050602061436286828701614169565b925050604061437386828701614250565b9150509250925092565b6000806000806080858703121561439357600080fd5b60006143a187828801614169565b94505060206143b287828801614169565b93505060406143c387828801614250565b925050606085013567ffffffffffffffff8111156143e057600080fd5b6143ec878288016141fc565b91505092959194509250565b6000806040838503121561440b57600080fd5b600061441985828601614169565b925050602061442a858286016141bd565b9150509250929050565b6000806040838503121561444757600080fd5b600061445585828601614169565b925050602061446685828601614250565b9150509250929050565b60006020828403121561448257600080fd5b600082013567ffffffffffffffff81111561449c57600080fd5b6144a884828501614193565b91505092915050565b6000602082840312156144c357600080fd5b60006144d1848285016141bd565b91505092915050565b6000602082840312156144ec57600080fd5b60006144fa848285016141d2565b91505092915050565b60006020828403121561451557600080fd5b6000614523848285016141e7565b91505092915050565b60006020828403121561453e57600080fd5b600082013567ffffffffffffffff81111561455857600080fd5b61456484828501614226565b91505092915050565b60006020828403121561457f57600080fd5b600061458d84828501614250565b91505092915050565b6000602082840312156145a857600080fd5b60006145b684828501614265565b91505092915050565b6145c881615242565b82525050565b6145d781615230565b82525050565b6145e681615254565b82525050565b60006145f7826150d8565b61460181856150ee565b93506146118185602086016152c5565b61461a81615491565b840191505092915050565b6000614630826150e3565b61463a81856150ff565b935061464a8185602086016152c5565b61465381615491565b840191505092915050565b6000614669826150e3565b6146738185615110565b93506146838185602086016152c5565b80840191505092915050565b600061469c6007836150ff565b91506146a7826154a2565b602082019050919050565b60006146bf600e836150ff565b91506146ca826154cb565b602082019050919050565b60006146e2602b836150ff565b91506146ed826154f4565b604082019050919050565b60006147056032836150ff565b915061471082615543565b604082019050919050565b6000614728600c836150ff565b915061473382615592565b602082019050919050565b600061474b6026836150ff565b9150614756826155bb565b604082019050919050565b600061476e601c836150ff565b91506147798261560a565b602082019050919050565b6000614791601f836150ff565b915061479c82615633565b602082019050919050565b60006147b4601c836150ff565b91506147bf8261565c565b602082019050919050565b60006147d76017836150ff565b91506147e282615685565b602082019050919050565b60006147fa6015836150ff565b9150614805826156ae565b602082019050919050565b600061481d6018836150ff565b9150614828826156d7565b602082019050919050565b60006148406024836150ff565b915061484b82615700565b604082019050919050565b60006148636019836150ff565b915061486e8261574f565b602082019050919050565b60006148866008836150ff565b915061489182615778565b602082019050919050565b60006148a96009836150ff565b91506148b4826157a1565b602082019050919050565b60006148cc602c836150ff565b91506148d7826157ca565b604082019050919050565b60006148ef6011836150ff565b91506148fa82615819565b602082019050919050565b60006149126038836150ff565b915061491d82615842565b604082019050919050565b6000614935602a836150ff565b915061494082615891565b604082019050919050565b60006149586029836150ff565b9150614963826158e0565b604082019050919050565b600061497b6020836150ff565b91506149868261592f565b602082019050919050565b600061499e602c836150ff565b91506149a982615958565b604082019050919050565b60006149c16020836150ff565b91506149cc826159a7565b602082019050919050565b60006149e46029836150ff565b91506149ef826159d0565b604082019050919050565b6000614a07602f836150ff565b9150614a1282615a1f565b604082019050919050565b6000614a2a600f836150ff565b9150614a3582615a6e565b602082019050919050565b6000614a4d601a836150ff565b9150614a5882615a97565b602082019050919050565b6000614a706021836150ff565b9150614a7b82615ac0565b604082019050919050565b6000614a936031836150ff565b9150614a9e82615b0f565b604082019050919050565b6000614ab6602c836150ff565b9150614ac182615b5e565b604082019050919050565b6000614ad96018836150ff565b9150614ae482615bad565b602082019050919050565b614af8816152ac565b82525050565b6000614b0a828561465e565b9150614b16828461465e565b91508190509392505050565b6000602082019050614b3760008301846145ce565b92915050565b6000602082019050614b5260008301846145bf565b92915050565b6000608082019050614b6d60008301876145ce565b614b7a60208301866145ce565b614b876040830185614aef565b8181036060830152614b9981846145ec565b905095945050505050565b6000604082019050614bb960008301856145ce565b614bc66020830184614aef565b9392505050565b6000602082019050614be260008301846145dd565b92915050565b60006020820190508181036000830152614c028184614625565b905092915050565b60006020820190508181036000830152614c238161468f565b9050919050565b60006020820190508181036000830152614c43816146b2565b9050919050565b60006020820190508181036000830152614c63816146d5565b9050919050565b60006020820190508181036000830152614c83816146f8565b9050919050565b60006020820190508181036000830152614ca38161471b565b9050919050565b60006020820190508181036000830152614cc38161473e565b9050919050565b60006020820190508181036000830152614ce381614761565b9050919050565b60006020820190508181036000830152614d0381614784565b9050919050565b60006020820190508181036000830152614d23816147a7565b9050919050565b60006020820190508181036000830152614d43816147ca565b9050919050565b60006020820190508181036000830152614d63816147ed565b9050919050565b60006020820190508181036000830152614d8381614810565b9050919050565b60006020820190508181036000830152614da381614833565b9050919050565b60006020820190508181036000830152614dc381614856565b9050919050565b60006020820190508181036000830152614de381614879565b9050919050565b60006020820190508181036000830152614e038161489c565b9050919050565b60006020820190508181036000830152614e23816148bf565b9050919050565b60006020820190508181036000830152614e43816148e2565b9050919050565b60006020820190508181036000830152614e6381614905565b9050919050565b60006020820190508181036000830152614e8381614928565b9050919050565b60006020820190508181036000830152614ea38161494b565b9050919050565b60006020820190508181036000830152614ec38161496e565b9050919050565b60006020820190508181036000830152614ee381614991565b9050919050565b60006020820190508181036000830152614f03816149b4565b9050919050565b60006020820190508181036000830152614f23816149d7565b9050919050565b60006020820190508181036000830152614f43816149fa565b9050919050565b60006020820190508181036000830152614f6381614a1d565b9050919050565b60006020820190508181036000830152614f8381614a40565b9050919050565b60006020820190508181036000830152614fa381614a63565b9050919050565b60006020820190508181036000830152614fc381614a86565b9050919050565b60006020820190508181036000830152614fe381614aa9565b9050919050565b6000602082019050818103600083015261500381614acc565b9050919050565b600060208201905061501f6000830184614aef565b92915050565b600061502f615040565b905061503b828261532a565b919050565b6000604051905090565b600067ffffffffffffffff82111561506557615064615462565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561509157615090615462565b5b61509a82615491565b9050602081019050919050565b600067ffffffffffffffff8211156150c2576150c1615462565b5b6150cb82615491565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615126826152ac565b9150615131836152ac565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615166576151656153d5565b5b828201905092915050565b600061517c826152ac565b9150615187836152ac565b92508261519757615196615404565b5b828204905092915050565b60006151ad826152ac565b91506151b8836152ac565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151f1576151f06153d5565b5b828202905092915050565b6000615207826152ac565b9150615212836152ac565b925082821015615225576152246153d5565b5b828203905092915050565b600061523b8261528c565b9050919050565b600061524d8261528c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152e35780820151818401526020810190506152c8565b838111156152f2576000848401525b50505050565b6000600282049050600182168061531057607f821691505b6020821081141561532457615323615433565b5b50919050565b61533382615491565b810181811067ffffffffffffffff8211171561535257615351615462565b5b80604052505050565b6000615366826152ac565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615399576153986153d5565b5b600182019050919050565b60006153af826152ac565b91506153ba836152ac565b9250826153ca576153c9615404565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4a20456d70747900000000000000000000000000000000000000000000000000600082015250565b7f504820616c726561647920736574000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d50206e6f74206f776e65640000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f54434d3a2057686974656c6973742053616c6520497320496e61637469766500600082015250565b7f54434d3a205075626c69632053616c6520497320496e61637469766500000000600082015250565b7f54434d3a2052657175657374656420746f6f206d616e79000000000000000000600082015250565b7f55736572206e6f7420696e2077686974656c6973740000000000000000000000600082015250565b7f4f746865722073616c6573206e6f7420696e6163746976650000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f555220456d707479000000000000000000000000000000000000000000000000600082015250565b7f54434d20456d7074790000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f54434d3a20436170206578636565646564000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d5020616c726561647920757365640000000000000000000000000000000000600082015250565b7f54434d3a20496e636f72726563742045746865722056616c7565000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f54434d3a2050726573616c6520497320496e6163746976650000000000000000600082015250565b615bdf81615230565b8114615bea57600080fd5b50565b615bf681615242565b8114615c0157600080fd5b50565b615c0d81615254565b8114615c1857600080fd5b50565b615c2481615260565b8114615c2f57600080fd5b50565b615c3b816152ac565b8114615c4657600080fd5b5056fea26469706673582212205d2e2c0a86165f103e094992f380806a227ea5d3c7afb7fea607512349b01b3d64736f6c6343000804003300000000000000000000000002eac394763be809efdc3ec86cb89b8967c50d89

Deployed Bytecode

0x6080604052600436106102935760003560e01c8063715018a61161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd146109b5578063cb689f43146109f2578063e43252d714610a1b578063e985e9c514610a44578063f2fde38b14610a81578063fa3cf93514610aaa57610293565b8063a22cb465146108b9578063a81c804e146108e2578063b88d4fde1461090b578063b98451cf14610934578063bdb4b8481461095f578063c6ab67a31461098a57610293565b8063939b2c3911610113578063939b2c39146107a757806395d89b41146107d25780639abc8320146107fd5780639b19251a146108285780639d044ed314610865578063a0bcfc7f1461089057610293565b8063715018a6146106ed57806375cb1bd1146107045780637a6833e21461072d5780637bfb748b146107495780638ab1d681146107535780638da5cb5b1461077c57610293565b80633ccfd60b116101fe5780635977cdcd116101b75780635977cdcd146105b75780636352211e146105e25780636d98174f1461061f5780637046f3401461065c57806370a0823114610685578063710614b6146106c257610293565b80633ccfd60b146104c857806342842e0e146104df5780634968d38e146105085780634f6ccce71461052457806356fc8ed514610561578063570152d31461058c57610293565b806318160ddd1161025057806318160ddd146103b85780631a09d922146103e35780631e84c4131461040e57806323b872dd146104395780632f745c59146104625780633ca6fb8c1461049f57610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063095ea7b31461033d5780630c4dc29c14610366578063109695231461038f575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba91906144da565b610ad5565b6040516102cc9190614bcd565b60405180910390f35b3480156102e157600080fd5b506102ea610b4f565b6040516102f79190614be8565b60405180910390f35b34801561030c57600080fd5b506103276004803603810190610322919061456d565b610be1565b6040516103349190614b22565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f9190614434565b610c66565b005b34801561037257600080fd5b5061038d600480360381019061038891906144b1565b610d7e565b005b34801561039b57600080fd5b506103b660048036038101906103b1919061452c565b610e9a565b005b3480156103c457600080fd5b506103cd610f81565b6040516103da919061500a565b60405180910390f35b3480156103ef57600080fd5b506103f8610f8e565b6040516104059190614b3d565b60405180910390f35b34801561041a57600080fd5b50610423610fb4565b6040516104309190614bcd565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b919061432e565b610fc7565b005b34801561046e57600080fd5b5061048960048036038101906104849190614434565b611027565b604051610496919061500a565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c191906144b1565b6110cc565b005b3480156104d457600080fd5b506104dd6111e8565b005b3480156104eb57600080fd5b506105066004803603810190610501919061432e565b6115b2565b005b610522600480360381019061051d919061456d565b6115d2565b005b34801561053057600080fd5b5061054b6004803603810190610546919061456d565b6119ce565b604051610558919061500a565b60405180910390f35b34801561056d57600080fd5b50610576611a65565b604051610583919061500a565b60405180910390f35b34801561059857600080fd5b506105a1611a6b565b6040516105ae9190614b22565b60405180910390f35b3480156105c357600080fd5b506105cc611a91565b6040516105d9919061500a565b60405180910390f35b3480156105ee57600080fd5b506106096004803603810190610604919061456d565b611a97565b6040516106169190614b22565b60405180910390f35b34801561062b57600080fd5b506106466004803603810190610641919061456d565b611b49565b6040516106539190614bcd565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e91906144b1565b611b69565b005b34801561069157600080fd5b506106ac60048036038101906106a7919061427a565b611c85565b6040516106b9919061500a565b60405180910390f35b3480156106ce57600080fd5b506106d7611d3d565b6040516106e49190614b3d565b60405180910390f35b3480156106f957600080fd5b50610702611d63565b005b34801561071057600080fd5b5061072b600480360381019061072691906142a3565b611deb565b005b6107476004803603810190610742919061456d565b611f2f565b005b6107516120a9565b005b34801561075f57600080fd5b5061077a6004803603810190610775919061427a565b61229f565b005b34801561078857600080fd5b50610791612376565b60405161079e9190614b22565b60405180910390f35b3480156107b357600080fd5b506107bc6123a0565b6040516107c99190614b3d565b60405180910390f35b3480156107de57600080fd5b506107e76123c6565b6040516107f49190614be8565b60405180910390f35b34801561080957600080fd5b50610812612458565b60405161081f9190614be8565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a919061427a565b6124e6565b60405161085c9190614bcd565b60405180910390f35b34801561087157600080fd5b5061087a612506565b6040516108879190614bcd565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b2919061452c565b612519565b005b3480156108c557600080fd5b506108e060048036038101906108db91906143f8565b6125af565b005b3480156108ee57600080fd5b5061090960048036038101906109049190614470565b612730565b005b34801561091757600080fd5b50610932600480360381019061092d919061437d565b612867565b005b34801561094057600080fd5b506109496128c9565b6040516109569190614bcd565b60405180910390f35b34801561096b57600080fd5b506109746128dc565b604051610981919061500a565b60405180910390f35b34801561099657600080fd5b5061099f6128e2565b6040516109ac9190614be8565b60405180910390f35b3480156109c157600080fd5b506109dc60048036038101906109d7919061456d565b612970565b6040516109e99190614be8565b60405180910390f35b3480156109fe57600080fd5b50610a196004803603810190610a14919061456d565b612a17565b005b348015610a2757600080fd5b50610a426004803603810190610a3d919061427a565b612b29565b005b348015610a5057600080fd5b50610a6b6004803603810190610a6691906142f2565b612c00565b604051610a789190614bcd565b60405180910390f35b348015610a8d57600080fd5b50610aa86004803603810190610aa3919061427a565b612c94565b005b348015610ab657600080fd5b50610abf612d8c565b604051610acc919061500a565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b485750610b4782612d92565b5b9050919050565b606060008054610b5e906152f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8a906152f8565b8015610bd75780601f10610bac57610100808354040283529160200191610bd7565b820191906000526020600020905b815481529060010190602001808311610bba57829003601f168201915b5050505050905090565b6000610bec82612e0c565b610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2290614eca565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7182611a97565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990614f8a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d01612e78565b73ffffffffffffffffffffffffffffffffffffffff161480610d305750610d2f81610d2a612e78565b612c00565b5b610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690614e4a565b60405180910390fd5b610d798383612e80565b505050565b610d86612e78565b73ffffffffffffffffffffffffffffffffffffffff16610da4612376565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190614eea565b60405180910390fd5b600115158115151415610e7d5760001515600c60019054906101000a900460ff161515148015610e3d575060001515600c60029054906101000a900460ff161515145b610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7390614d6a565b60405180910390fd5b5b80600c60006101000a81548160ff02191690831515021790555050565b610ea2612e78565b73ffffffffffffffffffffffffffffffffffffffff16610ec0612376565b73ffffffffffffffffffffffffffffffffffffffff1614610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90614eea565b60405180910390fd5b6000600f8054610f25906152f8565b905014610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90614c2a565b60405180910390fd5b80600f9080519060200190610f7d929190613fde565b5050565b6000600880549050905090565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60019054906101000a900460ff1681565b610fd8610fd2612e78565b82612f39565b611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90614faa565b60405180910390fd5b611022838383613017565b505050565b600061103283611c85565b8210611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a90614c4a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110d4612e78565b73ffffffffffffffffffffffffffffffffffffffff166110f2612376565b73ffffffffffffffffffffffffffffffffffffffff1614611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90614eea565b60405180910390fd5b6001151581151514156111cb5760001515600c60019054906101000a900460ff16151514801561118b575060001515600c60009054906101000a900460ff161515145b6111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c190614d6a565b60405180910390fd5b5b80600c60026101000a81548160ff02191690831515021790555050565b6111f0612e78565b73ffffffffffffffffffffffffffffffffffffffff1661120e612376565b73ffffffffffffffffffffffffffffffffffffffff1614611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b90614eea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed90614dca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f90614dea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190614c0a565b60405180910390fd5b60006114456103e86114376101c24761327390919063ffffffff16565b61328990919063ffffffff16565b905060006114716103e861146360644761327390919063ffffffff16565b61328990919063ffffffff16565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156114db573d6000803e3d6000fd5b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611544573d6000803e3d6000fd5b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115ad573d6000803e3d6000fd5b505050565b6115cd83838360405180602001604052806000815250612867565b505050565b600c60029054906101000a900460ff16611621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161890614fea565b60405180910390fd5b6000600182611630919061511b565b9050601254821115611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e90614d2a565b60405180910390fd5b600b5481611683610f81565b61168d919061511b565b11156116ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c590614e2a565b60405180910390fd5b34826010546116dd91906151a2565b111561171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590614f6a565b60405180910390fd5b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161177b9190614b22565b60206040518083038186803b15801561179357600080fd5b505afa1580156117a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cb9190614596565b905060008111611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790614c8a565b60405180910390fd5b6000805b82811015611980576000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b815260040161187b929190614ba4565b60206040518083038186803b15801561189357600080fd5b505afa1580156118a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cb9190614596565b9050600015156016600083815260200190815260200160002060009054906101000a900460ff161515141561196c5760016016600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b858110156119615761194e33600161193f610f81565b611949919061511b565b61329f565b80806119599061535b565b915050611929565b506001925050611980565b5080806119789061535b565b915050611814565b5060011515811515146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf90614f4a565b60405180910390fd5b50505050565b60006119d8610f81565b8210611a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1090614fca565b60405180910390fd5b60088281548110611a53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b60115481565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614e8a565b60405180910390fd5b80915050919050565b60166020528060005260406000206000915054906101000a900460ff1681565b611b71612e78565b73ffffffffffffffffffffffffffffffffffffffff16611b8f612376565b73ffffffffffffffffffffffffffffffffffffffff1614611be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdc90614eea565b60405180910390fd5b600115158115151415611c685760001515600c60009054906101000a900460ff161515148015611c28575060001515600c60029054906101000a900460ff161515145b611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90614d6a565b60405180910390fd5b5b80600c60016101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ced90614e6a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d6b612e78565b73ffffffffffffffffffffffffffffffffffffffff16611d89612376565b73ffffffffffffffffffffffffffffffffffffffff1614611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd690614eea565b60405180910390fd5b611de960006132bd565b565b611df3612e78565b73ffffffffffffffffffffffffffffffffffffffff16611e11612376565b73ffffffffffffffffffffffffffffffffffffffff1614611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e90614eea565b60405180910390fd5b82601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600c60019054906101000a900460ff16611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590614d0a565b60405180910390fd5b601154811115611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba90614d2a565b60405180910390fd5b600b5481611fcf610f81565b611fd9919061511b565b111561201a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201190614e2a565b60405180910390fd5b348160105461202991906151a2565b111561206a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206190614f6a565b60405180910390fd5b60005b818110156120a557612092336001612083610f81565b61208d919061511b565b61329f565b808061209d9061535b565b91505061206d565b5050565b600c60009054906101000a900460ff166120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef90614cea565b60405180910390fd5b600b546001612105610f81565b61210f919061511b565b1115612150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214790614e2a565b60405180910390fd5b346010541115612195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218c90614f6a565b60405180910390fd5b60011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f90614d4a565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061229d33600161228e610f81565b612298919061511b565b61329f565b565b6122a7612e78565b73ffffffffffffffffffffffffffffffffffffffff166122c5612376565b73ffffffffffffffffffffffffffffffffffffffff161461231b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231290614eea565b60405180910390fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600180546123d5906152f8565b80601f0160208091040260200160405190810160405280929190818152602001828054612401906152f8565b801561244e5780601f106124235761010080835404028352916020019161244e565b820191906000526020600020905b81548152906001019060200180831161243157829003601f168201915b5050505050905090565b600e8054612465906152f8565b80601f0160208091040260200160405190810160405280929190818152602001828054612491906152f8565b80156124de5780601f106124b3576101008083540402835291602001916124de565b820191906000526020600020905b8154815290600101906020018083116124c157829003601f168201915b505050505081565b600d6020528060005260406000206000915054906101000a900460ff1681565b600c60029054906101000a900460ff1681565b612521612e78565b73ffffffffffffffffffffffffffffffffffffffff1661253f612376565b73ffffffffffffffffffffffffffffffffffffffff1614612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258c90614eea565b60405180910390fd5b80600e90805190602001906125ab929190613fde565b5050565b6125b7612e78565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261c90614daa565b60405180910390fd5b8060056000612632612e78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166126df612e78565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127249190614bcd565b60405180910390a35050565b612738612e78565b73ffffffffffffffffffffffffffffffffffffffff16612756612376565b73ffffffffffffffffffffffffffffffffffffffff16146127ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a390614eea565b60405180910390fd5b60005b8151811015612863576001600d60008484815181106127f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061285b9061535b565b9150506127af565b5050565b612878612872612e78565b83612f39565b6128b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae90614faa565b60405180910390fd5b6128c384848484613383565b50505050565b600c60009054906101000a900460ff1681565b60105481565b600f80546128ef906152f8565b80601f016020809104026020016040519081016040528092919081815260200182805461291b906152f8565b80156129685780601f1061293d57610100808354040283529160200191612968565b820191906000526020600020905b81548152906001019060200180831161294b57829003601f168201915b505050505081565b606061297b82612e0c565b6129ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b190614f2a565b60405180910390fd5b60006129c46133df565b905060008151116129e45760405180602001604052806000815250612a0f565b806129ee84613471565b6040516020016129ff929190614afe565b6040516020818303038152906040525b915050919050565b612a1f612e78565b73ffffffffffffffffffffffffffffffffffffffff16612a3d612376565b73ffffffffffffffffffffffffffffffffffffffff1614612a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8a90614eea565b60405180910390fd5b600b5481612a9f610f81565b612aa9919061511b565b1115612aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae190614e2a565b60405180910390fd5b60005b81811015612b2557612b12336001612b03610f81565b612b0d919061511b565b61329f565b8080612b1d9061535b565b915050612aed565b5050565b612b31612e78565b73ffffffffffffffffffffffffffffffffffffffff16612b4f612376565b73ffffffffffffffffffffffffffffffffffffffff1614612ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9c90614eea565b60405180910390fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612c9c612e78565b73ffffffffffffffffffffffffffffffffffffffff16612cba612376565b73ffffffffffffffffffffffffffffffffffffffff1614612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614eea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7790614caa565b60405180910390fd5b612d89816132bd565b50565b600b5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e055750612e048261361e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612ef383611a97565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612f4482612e0c565b612f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7a90614e0a565b60405180910390fd5b6000612f8e83611a97565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ffd57508373ffffffffffffffffffffffffffffffffffffffff16612fe584610be1565b73ffffffffffffffffffffffffffffffffffffffff16145b8061300e575061300d8185612c00565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661303782611a97565b73ffffffffffffffffffffffffffffffffffffffff161461308d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308490614f0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f490614d8a565b60405180910390fd5b613108838383613700565b613113600082612e80565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461316391906151fc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131ba919061511b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361328191906151a2565b905092915050565b600081836132979190615171565b905092915050565b6132b9828260405180602001604052806000815250613710565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61338e848484613017565b61339a8484848461376b565b6133d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d090614c6a565b60405180910390fd5b50505050565b6060600e80546133ee906152f8565b80601f016020809104026020016040519081016040528092919081815260200182805461341a906152f8565b80156134675780601f1061343c57610100808354040283529160200191613467565b820191906000526020600020905b81548152906001019060200180831161344a57829003601f168201915b5050505050905090565b606060008214156134b9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613619565b600082905060005b600082146134eb5780806134d49061535b565b915050600a826134e49190615171565b91506134c1565b60008167ffffffffffffffff81111561352d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561355f5781602001600182028036833780820191505090505b5090505b600085146136125760018261357891906151fc565b9150600a8561358791906153a4565b6030613593919061511b565b60f81b8183815181106135cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561360b9190615171565b9450613563565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806136e957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806136f957506136f882613902565b5b9050919050565b61370b83838361396c565b505050565b61371a8383613a80565b613727600084848461376b565b613766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375d90614c6a565b60405180910390fd5b505050565b600061378c8473ffffffffffffffffffffffffffffffffffffffff16613c4e565b156138f5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026137b5612e78565b8786866040518563ffffffff1660e01b81526004016137d79493929190614b58565b602060405180830381600087803b1580156137f157600080fd5b505af192505050801561382257506040513d601f19601f8201168201806040525081019061381f9190614503565b60015b6138a5573d8060008114613852576040519150601f19603f3d011682016040523d82523d6000602084013e613857565b606091505b5060008151141561389d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389490614c6a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506138fa565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613977838383613c61565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156139ba576139b581613c66565b6139f9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146139f8576139f78382613caf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a3c57613a3781613e1c565b613a7b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613a7a57613a798282613f5f565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae790614eaa565b60405180910390fd5b613af981612e0c565b15613b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b3090614cca565b60405180910390fd5b613b4560008383613700565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b95919061511b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613cbc84611c85565b613cc691906151fc565b9050600060076000848152602001908152602001600020549050818114613dab576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613e3091906151fc565b9050600060096000848152602001908152602001600020549050600060088381548110613e86577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613ece577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613f43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613f6a83611c85565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613fea906152f8565b90600052602060002090601f01602090048101928261400c5760008555614053565b82601f1061402557805160ff1916838001178555614053565b82800160010185558215614053579182015b82811115614052578251825591602001919060010190614037565b5b5090506140609190614064565b5090565b5b8082111561407d576000816000905550600101614065565b5090565b600061409461408f8461504a565b615025565b905080838252602082019050828560208602820111156140b357600080fd5b60005b858110156140e357816140c98882614169565b8452602084019350602083019250506001810190506140b6565b5050509392505050565b60006141006140fb84615076565b615025565b90508281526020810184848401111561411857600080fd5b6141238482856152b6565b509392505050565b600061413e614139846150a7565b615025565b90508281526020810184848401111561415657600080fd5b6141618482856152b6565b509392505050565b60008135905061417881615bd6565b92915050565b60008135905061418d81615bed565b92915050565b600082601f8301126141a457600080fd5b81356141b4848260208601614081565b91505092915050565b6000813590506141cc81615c04565b92915050565b6000813590506141e181615c1b565b92915050565b6000815190506141f681615c1b565b92915050565b600082601f83011261420d57600080fd5b813561421d8482602086016140ed565b91505092915050565b600082601f83011261423757600080fd5b813561424784826020860161412b565b91505092915050565b60008135905061425f81615c32565b92915050565b60008151905061427481615c32565b92915050565b60006020828403121561428c57600080fd5b600061429a84828501614169565b91505092915050565b6000806000606084860312156142b857600080fd5b60006142c68682870161417e565b93505060206142d78682870161417e565b92505060406142e88682870161417e565b9150509250925092565b6000806040838503121561430557600080fd5b600061431385828601614169565b925050602061432485828601614169565b9150509250929050565b60008060006060848603121561434357600080fd5b600061435186828701614169565b935050602061436286828701614169565b925050604061437386828701614250565b9150509250925092565b6000806000806080858703121561439357600080fd5b60006143a187828801614169565b94505060206143b287828801614169565b93505060406143c387828801614250565b925050606085013567ffffffffffffffff8111156143e057600080fd5b6143ec878288016141fc565b91505092959194509250565b6000806040838503121561440b57600080fd5b600061441985828601614169565b925050602061442a858286016141bd565b9150509250929050565b6000806040838503121561444757600080fd5b600061445585828601614169565b925050602061446685828601614250565b9150509250929050565b60006020828403121561448257600080fd5b600082013567ffffffffffffffff81111561449c57600080fd5b6144a884828501614193565b91505092915050565b6000602082840312156144c357600080fd5b60006144d1848285016141bd565b91505092915050565b6000602082840312156144ec57600080fd5b60006144fa848285016141d2565b91505092915050565b60006020828403121561451557600080fd5b6000614523848285016141e7565b91505092915050565b60006020828403121561453e57600080fd5b600082013567ffffffffffffffff81111561455857600080fd5b61456484828501614226565b91505092915050565b60006020828403121561457f57600080fd5b600061458d84828501614250565b91505092915050565b6000602082840312156145a857600080fd5b60006145b684828501614265565b91505092915050565b6145c881615242565b82525050565b6145d781615230565b82525050565b6145e681615254565b82525050565b60006145f7826150d8565b61460181856150ee565b93506146118185602086016152c5565b61461a81615491565b840191505092915050565b6000614630826150e3565b61463a81856150ff565b935061464a8185602086016152c5565b61465381615491565b840191505092915050565b6000614669826150e3565b6146738185615110565b93506146838185602086016152c5565b80840191505092915050565b600061469c6007836150ff565b91506146a7826154a2565b602082019050919050565b60006146bf600e836150ff565b91506146ca826154cb565b602082019050919050565b60006146e2602b836150ff565b91506146ed826154f4565b604082019050919050565b60006147056032836150ff565b915061471082615543565b604082019050919050565b6000614728600c836150ff565b915061473382615592565b602082019050919050565b600061474b6026836150ff565b9150614756826155bb565b604082019050919050565b600061476e601c836150ff565b91506147798261560a565b602082019050919050565b6000614791601f836150ff565b915061479c82615633565b602082019050919050565b60006147b4601c836150ff565b91506147bf8261565c565b602082019050919050565b60006147d76017836150ff565b91506147e282615685565b602082019050919050565b60006147fa6015836150ff565b9150614805826156ae565b602082019050919050565b600061481d6018836150ff565b9150614828826156d7565b602082019050919050565b60006148406024836150ff565b915061484b82615700565b604082019050919050565b60006148636019836150ff565b915061486e8261574f565b602082019050919050565b60006148866008836150ff565b915061489182615778565b602082019050919050565b60006148a96009836150ff565b91506148b4826157a1565b602082019050919050565b60006148cc602c836150ff565b91506148d7826157ca565b604082019050919050565b60006148ef6011836150ff565b91506148fa82615819565b602082019050919050565b60006149126038836150ff565b915061491d82615842565b604082019050919050565b6000614935602a836150ff565b915061494082615891565b604082019050919050565b60006149586029836150ff565b9150614963826158e0565b604082019050919050565b600061497b6020836150ff565b91506149868261592f565b602082019050919050565b600061499e602c836150ff565b91506149a982615958565b604082019050919050565b60006149c16020836150ff565b91506149cc826159a7565b602082019050919050565b60006149e46029836150ff565b91506149ef826159d0565b604082019050919050565b6000614a07602f836150ff565b9150614a1282615a1f565b604082019050919050565b6000614a2a600f836150ff565b9150614a3582615a6e565b602082019050919050565b6000614a4d601a836150ff565b9150614a5882615a97565b602082019050919050565b6000614a706021836150ff565b9150614a7b82615ac0565b604082019050919050565b6000614a936031836150ff565b9150614a9e82615b0f565b604082019050919050565b6000614ab6602c836150ff565b9150614ac182615b5e565b604082019050919050565b6000614ad96018836150ff565b9150614ae482615bad565b602082019050919050565b614af8816152ac565b82525050565b6000614b0a828561465e565b9150614b16828461465e565b91508190509392505050565b6000602082019050614b3760008301846145ce565b92915050565b6000602082019050614b5260008301846145bf565b92915050565b6000608082019050614b6d60008301876145ce565b614b7a60208301866145ce565b614b876040830185614aef565b8181036060830152614b9981846145ec565b905095945050505050565b6000604082019050614bb960008301856145ce565b614bc66020830184614aef565b9392505050565b6000602082019050614be260008301846145dd565b92915050565b60006020820190508181036000830152614c028184614625565b905092915050565b60006020820190508181036000830152614c238161468f565b9050919050565b60006020820190508181036000830152614c43816146b2565b9050919050565b60006020820190508181036000830152614c63816146d5565b9050919050565b60006020820190508181036000830152614c83816146f8565b9050919050565b60006020820190508181036000830152614ca38161471b565b9050919050565b60006020820190508181036000830152614cc38161473e565b9050919050565b60006020820190508181036000830152614ce381614761565b9050919050565b60006020820190508181036000830152614d0381614784565b9050919050565b60006020820190508181036000830152614d23816147a7565b9050919050565b60006020820190508181036000830152614d43816147ca565b9050919050565b60006020820190508181036000830152614d63816147ed565b9050919050565b60006020820190508181036000830152614d8381614810565b9050919050565b60006020820190508181036000830152614da381614833565b9050919050565b60006020820190508181036000830152614dc381614856565b9050919050565b60006020820190508181036000830152614de381614879565b9050919050565b60006020820190508181036000830152614e038161489c565b9050919050565b60006020820190508181036000830152614e23816148bf565b9050919050565b60006020820190508181036000830152614e43816148e2565b9050919050565b60006020820190508181036000830152614e6381614905565b9050919050565b60006020820190508181036000830152614e8381614928565b9050919050565b60006020820190508181036000830152614ea38161494b565b9050919050565b60006020820190508181036000830152614ec38161496e565b9050919050565b60006020820190508181036000830152614ee381614991565b9050919050565b60006020820190508181036000830152614f03816149b4565b9050919050565b60006020820190508181036000830152614f23816149d7565b9050919050565b60006020820190508181036000830152614f43816149fa565b9050919050565b60006020820190508181036000830152614f6381614a1d565b9050919050565b60006020820190508181036000830152614f8381614a40565b9050919050565b60006020820190508181036000830152614fa381614a63565b9050919050565b60006020820190508181036000830152614fc381614a86565b9050919050565b60006020820190508181036000830152614fe381614aa9565b9050919050565b6000602082019050818103600083015261500381614acc565b9050919050565b600060208201905061501f6000830184614aef565b92915050565b600061502f615040565b905061503b828261532a565b919050565b6000604051905090565b600067ffffffffffffffff82111561506557615064615462565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561509157615090615462565b5b61509a82615491565b9050602081019050919050565b600067ffffffffffffffff8211156150c2576150c1615462565b5b6150cb82615491565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615126826152ac565b9150615131836152ac565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615166576151656153d5565b5b828201905092915050565b600061517c826152ac565b9150615187836152ac565b92508261519757615196615404565b5b828204905092915050565b60006151ad826152ac565b91506151b8836152ac565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151f1576151f06153d5565b5b828202905092915050565b6000615207826152ac565b9150615212836152ac565b925082821015615225576152246153d5565b5b828203905092915050565b600061523b8261528c565b9050919050565b600061524d8261528c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152e35780820151818401526020810190506152c8565b838111156152f2576000848401525b50505050565b6000600282049050600182168061531057607f821691505b6020821081141561532457615323615433565b5b50919050565b61533382615491565b810181811067ffffffffffffffff8211171561535257615351615462565b5b80604052505050565b6000615366826152ac565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615399576153986153d5565b5b600182019050919050565b60006153af826152ac565b91506153ba836152ac565b9250826153ca576153c9615404565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4a20456d70747900000000000000000000000000000000000000000000000000600082015250565b7f504820616c726561647920736574000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d50206e6f74206f776e65640000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f54434d3a2057686974656c6973742053616c6520497320496e61637469766500600082015250565b7f54434d3a205075626c69632053616c6520497320496e61637469766500000000600082015250565b7f54434d3a2052657175657374656420746f6f206d616e79000000000000000000600082015250565b7f55736572206e6f7420696e2077686974656c6973740000000000000000000000600082015250565b7f4f746865722073616c6573206e6f7420696e6163746976650000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f555220456d707479000000000000000000000000000000000000000000000000600082015250565b7f54434d20456d7074790000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f54434d3a20436170206578636565646564000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d5020616c726561647920757365640000000000000000000000000000000000600082015250565b7f54434d3a20496e636f72726563742045746865722056616c7565000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f54434d3a2050726573616c6520497320496e6163746976650000000000000000600082015250565b615bdf81615230565b8114615bea57600080fd5b50565b615bf681615242565b8114615c0157600080fd5b50565b615c0d81615254565b8114615c1857600080fd5b50565b615c2481615260565b8114615c2f57600080fd5b50565b615c3b816152ac565b8114615c4657600080fd5b5056fea26469706673582212205d2e2c0a86165f103e094992f380806a227ea5d3c7afb7fea607512349b01b3d64736f6c63430008040033

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

00000000000000000000000002eac394763be809efdc3ec86cb89b8967c50d89

-----Decoded View---------------
Arg [0] : newMintPassAddress (address): 0x02eac394763be809efdc3eC86Cb89b8967c50d89

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000002eac394763be809efdc3ec86cb89b8967c50d89


Deployed Bytecode Sourcemap

57219:5339:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58532:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21747:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23306:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22829:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51711:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59081:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35498:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57586:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50901;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24196:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35166:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51979:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59634:499;;;;;;;;;;;;;:::i;:::-;;24606:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61271:1284;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35688:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57426:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57686:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57466:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21441:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57625:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51446:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21171:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57547:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49660:94;;;;;;;;;;;;;:::i;:::-;;59336:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60190:475;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60729:458;;;:::i;:::-;;52697:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49009:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57509:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21916:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57333:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50974:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50938:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58973:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23599:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52303:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24862:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50861:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57396:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57361:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22091:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52869:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52543:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23965:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49909:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50822:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58532:233;58643:4;58682:35;58667:50;;;:11;:50;;;;:90;;;;58721:36;58745:11;58721:23;:36::i;:::-;58667:90;58660:97;;58532:233;;;:::o;21747:100::-;21801:13;21834:5;21827:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21747:100;:::o;23306:221::-;23382:7;23410:16;23418:7;23410;:16::i;:::-;23402:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23495:15;:24;23511:7;23495:24;;;;;;;;;;;;;;;;;;;;;23488:31;;23306:221;;;:::o;22829:411::-;22910:13;22926:23;22941:7;22926:14;:23::i;:::-;22910:39;;22974:5;22968:11;;:2;:11;;;;22960:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23068:5;23052:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23077:37;23094:5;23101:12;:10;:12::i;:::-;23077:16;:37::i;:::-;23052:62;23030:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23211:21;23220:2;23224:7;23211:8;:21::i;:::-;22829:411;;;:::o;51711:260::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51799:4:::1;51790:13;;:5;:13;;;51786:138;;;51850:5;51828:27;;:18;;;;;;;;;;;:27;;;:55;;;;;51878:5;51859:24;;:15;;;;;;;;;;;:24;;;51828:55;51820:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;51786:138;51958:5;51934:21;;:29;;;;;;;;;;;;;;;;;;51711:260:::0;:::o;59081:199::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59209:1:::1;59183:14;59177:28;;;;;:::i;:::-;;;:33;59169:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59257:15;59240:14;:32;;;;;;;;;;;;:::i;:::-;;59081:199:::0;:::o;35498:113::-;35559:7;35586:10;:17;;;;35579:24;;35498:113;:::o;57586:30::-;;;;;;;;;;;;;:::o;50901:::-;;;;;;;;;;;;;:::o;24196:339::-;24391:41;24410:12;:10;:12::i;:::-;24424:7;24391:18;:41::i;:::-;24383:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24499:28;24509:4;24515:2;24519:7;24499:9;:28::i;:::-;24196:339;;;:::o;35166:256::-;35263:7;35299:23;35316:5;35299:16;:23::i;:::-;35291:5;:31;35283:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35388:12;:19;35401:5;35388:19;;;;;;;;;;;;;;;:26;35408:5;35388:26;;;;;;;;;;;;35381:33;;35166:256;;;;:::o;51979:254::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52061:4:::1;52052:13;;:5;:13;;;52048:144;;;52112:5;52090:27;;:18;;;;;;;;;;;:27;;;:61;;;;;52146:5;52121:30;;:21;;;;;;;;;;;:30;;;52090:61;52082:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;52048:144;52220:5;52202:15;;:23;;;;;;;;;;;;;;;;;;51979:254:::0;:::o;59634:499::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59714:1:::1;59694:22;;:8;;;;;;;;;;;:22;;;;59686:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;59769:1;59748:23;;:9;;;;;;;;;;;:23;;;;59740:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;59823:1;59804:21;;:7;;;;;;;;;;;:21;;;;59796:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;59850:16;59869:40;59904:4;59869:30;59895:3;59869:21;:25;;:30;;;;:::i;:::-;:34;;:40;;;;:::i;:::-;59850:59;;59936:16;59955:40;59990:4;59955:30;59981:3;59955:21;:25;;:30;;;;:::i;:::-;:34;;:40;;;;:::i;:::-;59936:59;;60022:8;;;;;;;;;;;:17;;:27;60040:8;60022:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60060:9;;;;;;;;;;;:18;;:28;60079:8;60060:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60099:7;;;;;;;;;;;:16;;:26;60116:8;60099:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49300:1;;59634:499::o:0;24606:185::-;24744:39;24761:4;24767:2;24771:7;24744:39;;;;;;;;;;;;:16;:39::i;:::-;24606:185;;;:::o;61271:1284::-;51353:15;;;;;;;;;;;51345:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;61369:20:::1;61406:1;61392:11;:15;;;;:::i;:::-;61369:38;;61443:19;;61428:11;:34;;61420:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;61541:17;;61525:12;61509:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:49;;61501:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;61625:9;61610:11;61599:8;;:22;;;;:::i;:::-;:35;;61591:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;61678:17;61698:8;;;;;;;;;;;:18;;;61717:10;61698:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61678:50;;61759:1;61747:9;:13;61739:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;61790:11;61923:12:::0;61919:576:::1;61948:9;61941:4;:16;61919:576;;;61983:26;62012:8;;;;;;;;;;;:28;;;62041:10;62053:4;62012:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61983:75;;62120:5;62076:49;;:20;:40;62097:18;62076:40;;;;;;;;;;;;;;;;;;;;;:49;;;62073:411;;;62230:4;62187:20;:40;62208:18;62187:40;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;62258:9;62253:126;62277:12;62273:1;:16;62253:126;;;62319:40;62329:10;62357:1;62341:13;:11;:13::i;:::-;:17;;;;:::i;:::-;62319:9;:40::i;:::-;62291:3;;;;;:::i;:::-;;;;62253:126;;;;62406:4;62397:13;;62429:5;;;62073:411;61919:576;61959:6;;;;;:::i;:::-;;;;61919:576;;;;62523:4;62513:14;;:6;:14;;;62505:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;51408:1;;;61271:1284:::0;:::o;35688:233::-;35763:7;35799:30;:28;:30::i;:::-;35791:5;:38;35783:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35896:10;35907:5;35896:17;;;;;;;;;;;;;;;;;;;;;;;;35889:24;;35688:233;;;:::o;57426:33::-;;;;:::o;57686:30::-;;;;;;;;;;;;;:::o;57466:34::-;;;;:::o;21441:239::-;21513:7;21533:13;21549:7;:16;21557:7;21549:16;;;;;;;;;;;;;;;;;;;;;21533:32;;21601:1;21584:19;;:5;:19;;;;21576:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21667:5;21660:12;;;21441:239;;;:::o;57625:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;51446:257::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51531:4:::1;51522:13;;:5;:13;;;51518:141;;;51585:5;51560:30;;:21;;;;;;;;;;;:30;;;:58;;;;;51613:5;51594:24;;:15;;;;;;;;;;;:24;;;51560:58;51552:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;51518:141;51690:5;51669:18;;:26;;;;;;;;;;;;;;;;;;51446:257:::0;:::o;21171:208::-;21243:7;21288:1;21271:19;;:5;:19;;;;21263:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21355:9;:16;21365:5;21355:16;;;;;;;;;;;;;;;;21348:23;;21171:208;;;:::o;57547:32::-;;;;;;;;;;;;;:::o;49660:94::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49725:21:::1;49743:1;49725:9;:21::i;:::-;49660:94::o:0;59336:249::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59506:9:::1;59495:8;;:20;;;;;;;;;;;;;;;;;;59538:10;59526:9;;:22;;;;;;;;;;;;;;;;;;59569:8;59559:7;;:18;;;;;;;;;;;;;;;;;;59336:249:::0;;;:::o;60190:475::-;51079:18;;;;;;;;;;;51071:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60313:18:::1;;60297:12;:34;;60289:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;60410:17;;60394:12;60378:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:49;;60370:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;60495:9;60479:12;60468:8;;:23;;;;:::i;:::-;:36;;60460:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;60553:9;60548:110;60572:12;60568:1;:16;60548:110;;;60606:40;60616:10;60644:1;60628:13;:11;:13::i;:::-;:17;;;;:::i;:::-;60606:9;:40::i;:::-;60586:3;;;;;:::i;:::-;;;;60548:110;;;;60190:475:::0;:::o;60729:458::-;51216:21;;;;;;;;;;;51208:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;60843:17:::1;;60838:1;60822:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:38;;60814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60913:9;60901:8;;:21;;60893:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;60997:4;60972:29;;:9;:21;60982:10;60972:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;60964:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;61064:5;61040:9;:21;61050:10;61040:21;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;61139:40;61149:10;61177:1;61161:13;:11;:13::i;:::-;:17;;;;:::i;:::-;61139:9;:40::i;:::-;60729:458::o:0;52697:108::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52792:5:::1;52772:9;:17;52782:6;52772:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;52697:108:::0;:::o;49009:87::-;49055:7;49082:6;;;;;;;;;;;49075:13;;49009:87;:::o;57509:31::-;;;;;;;;;;;;;:::o;21916:104::-;21972:13;22005:7;21998:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21916:104;:::o;57333:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50974:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;50938:27::-;;;;;;;;;;;;;:::o;58973:100::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59057:8:::1;59047:7;:18;;;;;;;;;;;;:::i;:::-;;58973:100:::0;:::o;23599:295::-;23714:12;:10;:12::i;:::-;23702:24;;:8;:24;;;;23694:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23814:8;23769:18;:32;23788:12;:10;:12::i;:::-;23769:32;;;;;;;;;;;;;;;:42;23802:8;23769:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23867:8;23838:48;;23853:12;:10;:12::i;:::-;23838:48;;;23877:8;23838:48;;;;;;:::i;:::-;;;;;;;;23599:295;;:::o;52303:193::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52393:6:::1;52389:100;52409:9;:16;52405:1;:20;52389:100;;;52473:4;52447:9;:23;52457:9;52467:1;52457:12;;;;;;;;;;;;;;;;;;;;;;52447:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;52427:3;;;;;:::i;:::-;;;;52389:100;;;;52303:193:::0;:::o;24862:328::-;25037:41;25056:12;:10;:12::i;:::-;25070:7;25037:18;:41::i;:::-;25029:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25143:39;25157:4;25163:2;25167:7;25176:5;25143:13;:39::i;:::-;24862:328;;;;:::o;50861:33::-;;;;;;;;;;;;;:::o;57396:23::-;;;;:::o;57361:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22091:334::-;22164:13;22198:16;22206:7;22198;:16::i;:::-;22190:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22279:21;22303:10;:8;:10::i;:::-;22279:34;;22355:1;22337:7;22331:21;:25;:86;;;;;;;;;;;;;;;;;22383:7;22392:18;:7;:16;:18::i;:::-;22366:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22331:86;22324:93;;;22091:334;;;:::o;52869:285::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52985:17:::1;;52969:12;52953:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:49;;52945:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;53042:9;53037:110;53061:12;53057:1;:16;53037:110;;;53095:40;53105:10;53133:1;53117:13;:11;:13::i;:::-;:17;;;;:::i;:::-;53095:9;:40::i;:::-;53075:3;;;;;:::i;:::-;;;;53037:110;;;;52869:285:::0;:::o;52543:102::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52633:4:::1;52613:9;:17;52623:6;52613:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;52543:102:::0;:::o;23965:164::-;24062:4;24086:18;:25;24105:5;24086:25;;;;;;;;;;;;;;;:35;24112:8;24086:35;;;;;;;;;;;;;;;;;;;;;;;;;24079:42;;23965:164;;;;:::o;49909:192::-;49240:12;:10;:12::i;:::-;49229:23;;:7;:5;:7::i;:::-;:23;;;49221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50018:1:::1;49998:22;;:8;:22;;;;49990:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50074:19;50084:8;50074:9;:19::i;:::-;49909:192:::0;:::o;50822:32::-;;;;:::o;34858:224::-;34960:4;34999:35;34984:50;;;:11;:50;;;;:90;;;;35038:36;35062:11;35038:23;:36::i;:::-;34984:90;34977:97;;34858:224;;;:::o;26700:127::-;26765:4;26817:1;26789:30;;:7;:16;26797:7;26789:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26782:37;;26700:127;;;:::o;16204:98::-;16257:7;16284:10;16277:17;;16204:98;:::o;30682:174::-;30784:2;30757:15;:24;30773:7;30757:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30840:7;30836:2;30802:46;;30811:23;30826:7;30811:14;:23::i;:::-;30802:46;;;;;;;;;;;;30682:174;;:::o;26994:348::-;27087:4;27112:16;27120:7;27112;:16::i;:::-;27104:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27188:13;27204:23;27219:7;27204:14;:23::i;:::-;27188:39;;27257:5;27246:16;;:7;:16;;;:51;;;;27290:7;27266:31;;:20;27278:7;27266:11;:20::i;:::-;:31;;;27246:51;:87;;;;27301:32;27318:5;27325:7;27301:16;:32::i;:::-;27246:87;27238:96;;;26994:348;;;;:::o;29986:578::-;30145:4;30118:31;;:23;30133:7;30118:14;:23::i;:::-;:31;;;30110:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30228:1;30214:16;;:2;:16;;;;30206:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30284:39;30305:4;30311:2;30315:7;30284:20;:39::i;:::-;30388:29;30405:1;30409:7;30388:8;:29::i;:::-;30449:1;30430:9;:15;30440:4;30430:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30478:1;30461:9;:13;30471:2;30461:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30509:2;30490:7;:16;30498:7;30490:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30548:7;30544:2;30529:27;;30538:4;30529:27;;;;;;;;;;;;29986:578;;;:::o;44578:98::-;44636:7;44667:1;44663;:5;;;;:::i;:::-;44656:12;;44578:98;;;;:::o;44977:::-;45035:7;45066:1;45062;:5;;;;:::i;:::-;45055:12;;44977:98;;;;:::o;27684:110::-;27760:26;27770:2;27774:7;27760:26;;;;;;;;;;;;:9;:26::i;:::-;27684:110;;:::o;50109:173::-;50165:16;50184:6;;;;;;;;;;;50165:25;;50210:8;50201:6;;:17;;;;;;;;;;;;;;;;;;50265:8;50234:40;;50255:8;50234:40;;;;;;;;;;;;50109:173;;:::o;26072:315::-;26229:28;26239:4;26245:2;26249:7;26229:9;:28::i;:::-;26276:48;26299:4;26305:2;26309:7;26318:5;26276:22;:48::i;:::-;26268:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26072:315;;;;:::o;58794:100::-;58846:13;58879:7;58872:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58794:100;:::o;16737:723::-;16793:13;17023:1;17014:5;:10;17010:53;;;17041:10;;;;;;;;;;;;;;;;;;;;;17010:53;17073:12;17088:5;17073:20;;17104:14;17129:78;17144:1;17136:4;:9;17129:78;;17162:8;;;;;:::i;:::-;;;;17193:2;17185:10;;;;;:::i;:::-;;;17129:78;;;17217:19;17249:6;17239:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17217:39;;17267:154;17283:1;17274:5;:10;17267:154;;17311:1;17301:11;;;;;:::i;:::-;;;17378:2;17370:5;:10;;;;:::i;:::-;17357:2;:24;;;;:::i;:::-;17344:39;;17327:6;17334;17327:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17407:2;17398:11;;;;;:::i;:::-;;;17267:154;;;17445:6;17431:21;;;;;16737:723;;;;:::o;20802:305::-;20904:4;20956:25;20941:40;;;:11;:40;;;;:105;;;;21013:33;20998:48;;;:11;:48;;;;20941:105;:158;;;;21063:36;21087:11;21063:23;:36::i;:::-;20941:158;20921:178;;20802:305;;;:::o;58222:189::-;58358:45;58385:4;58391:2;58395:7;58358:26;:45::i;:::-;58222:189;;;:::o;28021:321::-;28151:18;28157:2;28161:7;28151:5;:18::i;:::-;28202:54;28233:1;28237:2;28241:7;28250:5;28202:22;:54::i;:::-;28180:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28021:321;;;:::o;31421:799::-;31576:4;31597:15;:2;:13;;;:15::i;:::-;31593:620;;;31649:2;31633:36;;;31670:12;:10;:12::i;:::-;31684:4;31690:7;31699:5;31633:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31629:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31892:1;31875:6;:13;:18;31871:272;;;31918:60;;;;;;;;;;:::i;:::-;;;;;;;;31871:272;32093:6;32087:13;32078:6;32074:2;32070:15;32063:38;31629:529;31766:41;;;31756:51;;;:6;:51;;;;31749:58;;;;;31593:620;32197:4;32190:11;;31421:799;;;;;;;:::o;19300:157::-;19385:4;19424:25;19409:40;;;:11;:40;;;;19402:47;;19300:157;;;:::o;36534:589::-;36678:45;36705:4;36711:2;36715:7;36678:26;:45::i;:::-;36756:1;36740:18;;:4;:18;;;36736:187;;;36775:40;36807:7;36775:31;:40::i;:::-;36736:187;;;36845:2;36837:10;;:4;:10;;;36833:90;;36864:47;36897:4;36903:7;36864:32;:47::i;:::-;36833:90;36736:187;36951:1;36937:16;;:2;:16;;;36933:183;;;36970:45;37007:7;36970:36;:45::i;:::-;36933:183;;;37043:4;37037:10;;:2;:10;;;37033:83;;37064:40;37092:2;37096:7;37064:27;:40::i;:::-;37033:83;36933:183;36534:589;;;:::o;28678:382::-;28772:1;28758:16;;:2;:16;;;;28750:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28831:16;28839:7;28831;:16::i;:::-;28830:17;28822:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28893:45;28922:1;28926:2;28930:7;28893:20;:45::i;:::-;28968:1;28951:9;:13;28961:2;28951:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28999:2;28980:7;:16;28988:7;28980:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29044:7;29040:2;29019:33;;29036:1;29019:33;;;;;;;;;;;;28678:382;;:::o;8240:387::-;8300:4;8508:12;8575:7;8563:20;8555:28;;8618:1;8611:4;:8;8604:15;;;8240:387;;;:::o;32792:126::-;;;;:::o;37846:164::-;37950:10;:17;;;;37923:15;:24;37939:7;37923:24;;;;;;;;;;;:44;;;;37978:10;37994:7;37978:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37846:164;:::o;38637:988::-;38903:22;38953:1;38928:22;38945:4;38928:16;:22::i;:::-;:26;;;;:::i;:::-;38903:51;;38965:18;38986:17;:26;39004:7;38986:26;;;;;;;;;;;;38965:47;;39133:14;39119:10;:28;39115:328;;39164:19;39186:12;:18;39199:4;39186:18;;;;;;;;;;;;;;;:34;39205:14;39186:34;;;;;;;;;;;;39164:56;;39270:11;39237:12;:18;39250:4;39237:18;;;;;;;;;;;;;;;:30;39256:10;39237:30;;;;;;;;;;;:44;;;;39387:10;39354:17;:30;39372:11;39354:30;;;;;;;;;;;:43;;;;39115:328;;39539:17;:26;39557:7;39539:26;;;;;;;;;;;39532:33;;;39583:12;:18;39596:4;39583:18;;;;;;;;;;;;;;;:34;39602:14;39583:34;;;;;;;;;;;39576:41;;;38637:988;;;;:::o;39920:1079::-;40173:22;40218:1;40198:10;:17;;;;:21;;;;:::i;:::-;40173:46;;40230:18;40251:15;:24;40267:7;40251:24;;;;;;;;;;;;40230:45;;40602:19;40624:10;40635:14;40624:26;;;;;;;;;;;;;;;;;;;;;;;;40602:48;;40688:11;40663:10;40674;40663:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40799:10;40768:15;:28;40784:11;40768:28;;;;;;;;;;;:41;;;;40940:15;:24;40956:7;40940:24;;;;;;;;;;;40933:31;;;40975:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39920:1079;;;;:::o;37424:221::-;37509:14;37526:20;37543:2;37526:16;:20::i;:::-;37509:37;;37584:7;37557:12;:16;37570:2;37557:16;;;;;;;;;;;;;;;:24;37574:6;37557:24;;;;;;;;;;;:34;;;;37631:6;37602:17;:26;37620:7;37602:26;;;;;;;;;;;:35;;;;37424:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1530:155::-;1584:5;1622:6;1609:20;1600:29;;1638:41;1673:5;1638:41;:::i;:::-;1590:95;;;;:::o;1708:303::-;1779:5;1828:3;1821:4;1813:6;1809:17;1805:27;1795:2;;1846:1;1843;1836:12;1795:2;1886:6;1873:20;1911:94;2001:3;1993:6;1986:4;1978:6;1974:17;1911:94;:::i;:::-;1902:103;;1785:226;;;;;:::o;2017:133::-;2060:5;2098:6;2085:20;2076:29;;2114:30;2138:5;2114:30;:::i;:::-;2066:84;;;;:::o;2156:137::-;2201:5;2239:6;2226:20;2217:29;;2255:32;2281:5;2255:32;:::i;:::-;2207:86;;;;:::o;2299:141::-;2355:5;2386:6;2380:13;2371:22;;2402:32;2428:5;2402:32;:::i;:::-;2361:79;;;;:::o;2459:271::-;2514:5;2563:3;2556:4;2548:6;2544:17;2540:27;2530:2;;2581:1;2578;2571:12;2530:2;2621:6;2608:20;2646:78;2720:3;2712:6;2705:4;2697:6;2693:17;2646:78;:::i;:::-;2637:87;;2520:210;;;;;:::o;2750:273::-;2806:5;2855:3;2848:4;2840:6;2836:17;2832:27;2822:2;;2873:1;2870;2863:12;2822:2;2913:6;2900:20;2938:79;3013:3;3005:6;2998:4;2990:6;2986:17;2938:79;:::i;:::-;2929:88;;2812:211;;;;;:::o;3029:139::-;3075:5;3113:6;3100:20;3091:29;;3129:33;3156:5;3129:33;:::i;:::-;3081:87;;;;:::o;3174:143::-;3231:5;3262:6;3256:13;3247:22;;3278:33;3305:5;3278:33;:::i;:::-;3237:80;;;;:::o;3323:262::-;3382:6;3431:2;3419:9;3410:7;3406:23;3402:32;3399:2;;;3447:1;3444;3437:12;3399:2;3490:1;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3461:117;3389:196;;;;:::o;3591:600::-;3692:6;3700;3708;3757:2;3745:9;3736:7;3732:23;3728:32;3725:2;;;3773:1;3770;3763:12;3725:2;3816:1;3841:61;3894:7;3885:6;3874:9;3870:22;3841:61;:::i;:::-;3831:71;;3787:125;3951:2;3977:61;4030:7;4021:6;4010:9;4006:22;3977:61;:::i;:::-;3967:71;;3922:126;4087:2;4113:61;4166:7;4157:6;4146:9;4142:22;4113:61;:::i;:::-;4103:71;;4058:126;3715:476;;;;;:::o;4197:407::-;4265:6;4273;4322:2;4310:9;4301:7;4297:23;4293:32;4290:2;;;4338:1;4335;4328:12;4290:2;4381:1;4406:53;4451:7;4442:6;4431:9;4427:22;4406:53;:::i;:::-;4396:63;;4352:117;4508:2;4534:53;4579:7;4570:6;4559:9;4555:22;4534:53;:::i;:::-;4524:63;;4479:118;4280:324;;;;;:::o;4610:552::-;4687:6;4695;4703;4752:2;4740:9;4731:7;4727:23;4723:32;4720:2;;;4768:1;4765;4758:12;4720:2;4811:1;4836:53;4881:7;4872:6;4861:9;4857:22;4836:53;:::i;:::-;4826:63;;4782:117;4938:2;4964:53;5009:7;5000:6;4989:9;4985:22;4964:53;:::i;:::-;4954:63;;4909:118;5066:2;5092:53;5137:7;5128:6;5117:9;5113:22;5092:53;:::i;:::-;5082:63;;5037:118;4710:452;;;;;:::o;5168:809::-;5263:6;5271;5279;5287;5336:3;5324:9;5315:7;5311:23;5307:33;5304:2;;;5353:1;5350;5343:12;5304:2;5396:1;5421:53;5466:7;5457:6;5446:9;5442:22;5421:53;:::i;:::-;5411:63;;5367:117;5523:2;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5494:118;5651:2;5677:53;5722:7;5713:6;5702:9;5698:22;5677:53;:::i;:::-;5667:63;;5622:118;5807:2;5796:9;5792:18;5779:32;5838:18;5830:6;5827:30;5824:2;;;5870:1;5867;5860:12;5824:2;5898:62;5952:7;5943:6;5932:9;5928:22;5898:62;:::i;:::-;5888:72;;5750:220;5294:683;;;;;;;:::o;5983:401::-;6048:6;6056;6105:2;6093:9;6084:7;6080:23;6076:32;6073:2;;;6121:1;6118;6111:12;6073:2;6164:1;6189:53;6234:7;6225:6;6214:9;6210:22;6189:53;:::i;:::-;6179:63;;6135:117;6291:2;6317:50;6359:7;6350:6;6339:9;6335:22;6317:50;:::i;:::-;6307:60;;6262:115;6063:321;;;;;:::o;6390:407::-;6458:6;6466;6515:2;6503:9;6494:7;6490:23;6486:32;6483:2;;;6531:1;6528;6521:12;6483:2;6574:1;6599:53;6644:7;6635:6;6624:9;6620:22;6599:53;:::i;:::-;6589:63;;6545:117;6701:2;6727:53;6772:7;6763:6;6752:9;6748:22;6727:53;:::i;:::-;6717:63;;6672:118;6473:324;;;;;:::o;6803:405::-;6887:6;6936:2;6924:9;6915:7;6911:23;6907:32;6904:2;;;6952:1;6949;6942:12;6904:2;7023:1;7012:9;7008:17;6995:31;7053:18;7045:6;7042:30;7039:2;;;7085:1;7082;7075:12;7039:2;7113:78;7183:7;7174:6;7163:9;7159:22;7113:78;:::i;:::-;7103:88;;6966:235;6894:314;;;;:::o;7214:256::-;7270:6;7319:2;7307:9;7298:7;7294:23;7290:32;7287:2;;;7335:1;7332;7325:12;7287:2;7378:1;7403:50;7445:7;7436:6;7425:9;7421:22;7403:50;:::i;:::-;7393:60;;7349:114;7277:193;;;;:::o;7476:260::-;7534:6;7583:2;7571:9;7562:7;7558:23;7554:32;7551:2;;;7599:1;7596;7589:12;7551:2;7642:1;7667:52;7711:7;7702:6;7691:9;7687:22;7667:52;:::i;:::-;7657:62;;7613:116;7541:195;;;;:::o;7742:282::-;7811:6;7860:2;7848:9;7839:7;7835:23;7831:32;7828:2;;;7876:1;7873;7866:12;7828:2;7919:1;7944:63;7999:7;7990:6;7979:9;7975:22;7944:63;:::i;:::-;7934:73;;7890:127;7818:206;;;;:::o;8030:375::-;8099:6;8148:2;8136:9;8127:7;8123:23;8119:32;8116:2;;;8164:1;8161;8154:12;8116:2;8235:1;8224:9;8220:17;8207:31;8265:18;8257:6;8254:30;8251:2;;;8297:1;8294;8287:12;8251:2;8325:63;8380:7;8371:6;8360:9;8356:22;8325:63;:::i;:::-;8315:73;;8178:220;8106:299;;;;:::o;8411:262::-;8470:6;8519:2;8507:9;8498:7;8494:23;8490:32;8487:2;;;8535:1;8532;8525:12;8487:2;8578:1;8603:53;8648:7;8639:6;8628:9;8624:22;8603:53;:::i;:::-;8593:63;;8549:117;8477:196;;;;:::o;8679:284::-;8749:6;8798:2;8786:9;8777:7;8773:23;8769:32;8766:2;;;8814:1;8811;8804:12;8766:2;8857:1;8882:64;8938:7;8929:6;8918:9;8914:22;8882:64;:::i;:::-;8872:74;;8828:128;8756:207;;;;:::o;8969:142::-;9072:32;9098:5;9072:32;:::i;:::-;9067:3;9060:45;9050:61;;:::o;9117:118::-;9204:24;9222:5;9204:24;:::i;:::-;9199:3;9192:37;9182:53;;:::o;9241:109::-;9322:21;9337:5;9322:21;:::i;:::-;9317:3;9310:34;9300:50;;:::o;9356:360::-;9442:3;9470:38;9502:5;9470:38;:::i;:::-;9524:70;9587:6;9582:3;9524:70;:::i;:::-;9517:77;;9603:52;9648:6;9643:3;9636:4;9629:5;9625:16;9603:52;:::i;:::-;9680:29;9702:6;9680:29;:::i;:::-;9675:3;9671:39;9664:46;;9446:270;;;;;:::o;9722:364::-;9810:3;9838:39;9871:5;9838:39;:::i;:::-;9893:71;9957:6;9952:3;9893:71;:::i;:::-;9886:78;;9973:52;10018:6;10013:3;10006:4;9999:5;9995:16;9973:52;:::i;:::-;10050:29;10072:6;10050:29;:::i;:::-;10045:3;10041:39;10034:46;;9814:272;;;;;:::o;10092:377::-;10198:3;10226:39;10259:5;10226:39;:::i;:::-;10281:89;10363:6;10358:3;10281:89;:::i;:::-;10274:96;;10379:52;10424:6;10419:3;10412:4;10405:5;10401:16;10379:52;:::i;:::-;10456:6;10451:3;10447:16;10440:23;;10202:267;;;;;:::o;10475:365::-;10617:3;10638:66;10702:1;10697:3;10638:66;:::i;:::-;10631:73;;10713:93;10802:3;10713:93;:::i;:::-;10831:2;10826:3;10822:12;10815:19;;10621:219;;;:::o;10846:366::-;10988:3;11009:67;11073:2;11068:3;11009:67;:::i;:::-;11002:74;;11085:93;11174:3;11085:93;:::i;:::-;11203:2;11198:3;11194:12;11187:19;;10992:220;;;:::o;11218:366::-;11360:3;11381:67;11445:2;11440:3;11381:67;:::i;:::-;11374:74;;11457:93;11546:3;11457:93;:::i;:::-;11575:2;11570:3;11566:12;11559:19;;11364:220;;;:::o;11590:366::-;11732:3;11753:67;11817:2;11812:3;11753:67;:::i;:::-;11746:74;;11829:93;11918:3;11829:93;:::i;:::-;11947:2;11942:3;11938:12;11931:19;;11736:220;;;:::o;11962:366::-;12104:3;12125:67;12189:2;12184:3;12125:67;:::i;:::-;12118:74;;12201:93;12290:3;12201:93;:::i;:::-;12319:2;12314:3;12310:12;12303:19;;12108:220;;;:::o;12334:366::-;12476:3;12497:67;12561:2;12556:3;12497:67;:::i;:::-;12490:74;;12573:93;12662:3;12573:93;:::i;:::-;12691:2;12686:3;12682:12;12675:19;;12480:220;;;:::o;12706:366::-;12848:3;12869:67;12933:2;12928:3;12869:67;:::i;:::-;12862:74;;12945:93;13034:3;12945:93;:::i;:::-;13063:2;13058:3;13054:12;13047:19;;12852:220;;;:::o;13078:366::-;13220:3;13241:67;13305:2;13300:3;13241:67;:::i;:::-;13234:74;;13317:93;13406:3;13317:93;:::i;:::-;13435:2;13430:3;13426:12;13419:19;;13224:220;;;:::o;13450:366::-;13592:3;13613:67;13677:2;13672:3;13613:67;:::i;:::-;13606:74;;13689:93;13778:3;13689:93;:::i;:::-;13807:2;13802:3;13798:12;13791:19;;13596:220;;;:::o;13822:366::-;13964:3;13985:67;14049:2;14044:3;13985:67;:::i;:::-;13978:74;;14061:93;14150:3;14061:93;:::i;:::-;14179:2;14174:3;14170:12;14163:19;;13968:220;;;:::o;14194:366::-;14336:3;14357:67;14421:2;14416:3;14357:67;:::i;:::-;14350:74;;14433:93;14522:3;14433:93;:::i;:::-;14551:2;14546:3;14542:12;14535:19;;14340:220;;;:::o;14566:366::-;14708:3;14729:67;14793:2;14788:3;14729:67;:::i;:::-;14722:74;;14805:93;14894:3;14805:93;:::i;:::-;14923:2;14918:3;14914:12;14907:19;;14712:220;;;:::o;14938:366::-;15080:3;15101:67;15165:2;15160:3;15101:67;:::i;:::-;15094:74;;15177:93;15266:3;15177:93;:::i;:::-;15295:2;15290:3;15286:12;15279:19;;15084:220;;;:::o;15310:366::-;15452:3;15473:67;15537:2;15532:3;15473:67;:::i;:::-;15466:74;;15549:93;15638:3;15549:93;:::i;:::-;15667:2;15662:3;15658:12;15651:19;;15456:220;;;:::o;15682:365::-;15824:3;15845:66;15909:1;15904:3;15845:66;:::i;:::-;15838:73;;15920:93;16009:3;15920:93;:::i;:::-;16038:2;16033:3;16029:12;16022:19;;15828:219;;;:::o;16053:365::-;16195:3;16216:66;16280:1;16275:3;16216:66;:::i;:::-;16209:73;;16291:93;16380:3;16291:93;:::i;:::-;16409:2;16404:3;16400:12;16393:19;;16199:219;;;:::o;16424:366::-;16566:3;16587:67;16651:2;16646:3;16587:67;:::i;:::-;16580:74;;16663:93;16752:3;16663:93;:::i;:::-;16781:2;16776:3;16772:12;16765:19;;16570:220;;;:::o;16796:366::-;16938:3;16959:67;17023:2;17018:3;16959:67;:::i;:::-;16952:74;;17035:93;17124:3;17035:93;:::i;:::-;17153:2;17148:3;17144:12;17137:19;;16942:220;;;:::o;17168:366::-;17310:3;17331:67;17395:2;17390:3;17331:67;:::i;:::-;17324:74;;17407:93;17496:3;17407:93;:::i;:::-;17525:2;17520:3;17516:12;17509:19;;17314:220;;;:::o;17540:366::-;17682:3;17703:67;17767:2;17762:3;17703:67;:::i;:::-;17696:74;;17779:93;17868:3;17779:93;:::i;:::-;17897:2;17892:3;17888:12;17881:19;;17686:220;;;:::o;17912:366::-;18054:3;18075:67;18139:2;18134:3;18075:67;:::i;:::-;18068:74;;18151:93;18240:3;18151:93;:::i;:::-;18269:2;18264:3;18260:12;18253:19;;18058:220;;;:::o;18284:366::-;18426:3;18447:67;18511:2;18506:3;18447:67;:::i;:::-;18440:74;;18523:93;18612:3;18523:93;:::i;:::-;18641:2;18636:3;18632:12;18625:19;;18430:220;;;:::o;18656:366::-;18798:3;18819:67;18883:2;18878:3;18819:67;:::i;:::-;18812:74;;18895:93;18984:3;18895:93;:::i;:::-;19013:2;19008:3;19004:12;18997:19;;18802:220;;;:::o;19028:366::-;19170:3;19191:67;19255:2;19250:3;19191:67;:::i;:::-;19184:74;;19267:93;19356:3;19267:93;:::i;:::-;19385:2;19380:3;19376:12;19369:19;;19174:220;;;:::o;19400:366::-;19542:3;19563:67;19627:2;19622:3;19563:67;:::i;:::-;19556:74;;19639:93;19728:3;19639:93;:::i;:::-;19757:2;19752:3;19748:12;19741:19;;19546:220;;;:::o;19772:366::-;19914:3;19935:67;19999:2;19994:3;19935:67;:::i;:::-;19928:74;;20011:93;20100:3;20011:93;:::i;:::-;20129:2;20124:3;20120:12;20113:19;;19918:220;;;:::o;20144:366::-;20286:3;20307:67;20371:2;20366:3;20307:67;:::i;:::-;20300:74;;20383:93;20472:3;20383:93;:::i;:::-;20501:2;20496:3;20492:12;20485:19;;20290:220;;;:::o;20516:366::-;20658:3;20679:67;20743:2;20738:3;20679:67;:::i;:::-;20672:74;;20755:93;20844:3;20755:93;:::i;:::-;20873:2;20868:3;20864:12;20857:19;;20662:220;;;:::o;20888:366::-;21030:3;21051:67;21115:2;21110:3;21051:67;:::i;:::-;21044:74;;21127:93;21216:3;21127:93;:::i;:::-;21245:2;21240:3;21236:12;21229:19;;21034:220;;;:::o;21260:366::-;21402:3;21423:67;21487:2;21482:3;21423:67;:::i;:::-;21416:74;;21499:93;21588:3;21499:93;:::i;:::-;21617:2;21612:3;21608:12;21601:19;;21406:220;;;:::o;21632:366::-;21774:3;21795:67;21859:2;21854:3;21795:67;:::i;:::-;21788:74;;21871:93;21960:3;21871:93;:::i;:::-;21989:2;21984:3;21980:12;21973:19;;21778:220;;;:::o;22004:366::-;22146:3;22167:67;22231:2;22226:3;22167:67;:::i;:::-;22160:74;;22243:93;22332:3;22243:93;:::i;:::-;22361:2;22356:3;22352:12;22345:19;;22150:220;;;:::o;22376:118::-;22463:24;22481:5;22463:24;:::i;:::-;22458:3;22451:37;22441:53;;:::o;22500:435::-;22680:3;22702:95;22793:3;22784:6;22702:95;:::i;:::-;22695:102;;22814:95;22905:3;22896:6;22814:95;:::i;:::-;22807:102;;22926:3;22919:10;;22684:251;;;;;:::o;22941:222::-;23034:4;23072:2;23061:9;23057:18;23049:26;;23085:71;23153:1;23142:9;23138:17;23129:6;23085:71;:::i;:::-;23039:124;;;;:::o;23169:254::-;23278:4;23316:2;23305:9;23301:18;23293:26;;23329:87;23413:1;23402:9;23398:17;23389:6;23329:87;:::i;:::-;23283:140;;;;:::o;23429:640::-;23624:4;23662:3;23651:9;23647:19;23639:27;;23676:71;23744:1;23733:9;23729:17;23720:6;23676:71;:::i;:::-;23757:72;23825:2;23814:9;23810:18;23801:6;23757:72;:::i;:::-;23839;23907:2;23896:9;23892:18;23883:6;23839:72;:::i;:::-;23958:9;23952:4;23948:20;23943:2;23932:9;23928:18;23921:48;23986:76;24057:4;24048:6;23986:76;:::i;:::-;23978:84;;23629:440;;;;;;;:::o;24075:332::-;24196:4;24234:2;24223:9;24219:18;24211:26;;24247:71;24315:1;24304:9;24300:17;24291:6;24247:71;:::i;:::-;24328:72;24396:2;24385:9;24381:18;24372:6;24328:72;:::i;:::-;24201:206;;;;;:::o;24413:210::-;24500:4;24538:2;24527:9;24523:18;24515:26;;24551:65;24613:1;24602:9;24598:17;24589:6;24551:65;:::i;:::-;24505:118;;;;:::o;24629:313::-;24742:4;24780:2;24769:9;24765:18;24757:26;;24829:9;24823:4;24819:20;24815:1;24804:9;24800:17;24793:47;24857:78;24930:4;24921:6;24857:78;:::i;:::-;24849:86;;24747:195;;;;:::o;24948:419::-;25114:4;25152:2;25141:9;25137:18;25129:26;;25201:9;25195:4;25191:20;25187:1;25176:9;25172:17;25165:47;25229:131;25355:4;25229:131;:::i;:::-;25221:139;;25119:248;;;:::o;25373:419::-;25539:4;25577:2;25566:9;25562:18;25554:26;;25626:9;25620:4;25616:20;25612:1;25601:9;25597:17;25590:47;25654:131;25780:4;25654:131;:::i;:::-;25646:139;;25544:248;;;:::o;25798:419::-;25964:4;26002:2;25991:9;25987:18;25979:26;;26051:9;26045:4;26041:20;26037:1;26026:9;26022:17;26015:47;26079:131;26205:4;26079:131;:::i;:::-;26071:139;;25969:248;;;:::o;26223:419::-;26389:4;26427:2;26416:9;26412:18;26404:26;;26476:9;26470:4;26466:20;26462:1;26451:9;26447:17;26440:47;26504:131;26630:4;26504:131;:::i;:::-;26496:139;;26394:248;;;:::o;26648:419::-;26814:4;26852:2;26841:9;26837:18;26829:26;;26901:9;26895:4;26891:20;26887:1;26876:9;26872:17;26865:47;26929:131;27055:4;26929:131;:::i;:::-;26921:139;;26819:248;;;:::o;27073:419::-;27239:4;27277:2;27266:9;27262:18;27254:26;;27326:9;27320:4;27316:20;27312:1;27301:9;27297:17;27290:47;27354:131;27480:4;27354:131;:::i;:::-;27346:139;;27244:248;;;:::o;27498:419::-;27664:4;27702:2;27691:9;27687:18;27679:26;;27751:9;27745:4;27741:20;27737:1;27726:9;27722:17;27715:47;27779:131;27905:4;27779:131;:::i;:::-;27771:139;;27669:248;;;:::o;27923:419::-;28089:4;28127:2;28116:9;28112:18;28104:26;;28176:9;28170:4;28166:20;28162:1;28151:9;28147:17;28140:47;28204:131;28330:4;28204:131;:::i;:::-;28196:139;;28094:248;;;:::o;28348:419::-;28514:4;28552:2;28541:9;28537:18;28529:26;;28601:9;28595:4;28591:20;28587:1;28576:9;28572:17;28565:47;28629:131;28755:4;28629:131;:::i;:::-;28621:139;;28519:248;;;:::o;28773:419::-;28939:4;28977:2;28966:9;28962:18;28954:26;;29026:9;29020:4;29016:20;29012:1;29001:9;28997:17;28990:47;29054:131;29180:4;29054:131;:::i;:::-;29046:139;;28944:248;;;:::o;29198:419::-;29364:4;29402:2;29391:9;29387:18;29379:26;;29451:9;29445:4;29441:20;29437:1;29426:9;29422:17;29415:47;29479:131;29605:4;29479:131;:::i;:::-;29471:139;;29369:248;;;:::o;29623:419::-;29789:4;29827:2;29816:9;29812:18;29804:26;;29876:9;29870:4;29866:20;29862:1;29851:9;29847:17;29840:47;29904:131;30030:4;29904:131;:::i;:::-;29896:139;;29794:248;;;:::o;30048:419::-;30214:4;30252:2;30241:9;30237:18;30229:26;;30301:9;30295:4;30291:20;30287:1;30276:9;30272:17;30265:47;30329:131;30455:4;30329:131;:::i;:::-;30321:139;;30219:248;;;:::o;30473:419::-;30639:4;30677:2;30666:9;30662:18;30654:26;;30726:9;30720:4;30716:20;30712:1;30701:9;30697:17;30690:47;30754:131;30880:4;30754:131;:::i;:::-;30746:139;;30644:248;;;:::o;30898:419::-;31064:4;31102:2;31091:9;31087:18;31079:26;;31151:9;31145:4;31141:20;31137:1;31126:9;31122:17;31115:47;31179:131;31305:4;31179:131;:::i;:::-;31171:139;;31069:248;;;:::o;31323:419::-;31489:4;31527:2;31516:9;31512:18;31504:26;;31576:9;31570:4;31566:20;31562:1;31551:9;31547:17;31540:47;31604:131;31730:4;31604:131;:::i;:::-;31596:139;;31494:248;;;:::o;31748:419::-;31914:4;31952:2;31941:9;31937:18;31929:26;;32001:9;31995:4;31991:20;31987:1;31976:9;31972:17;31965:47;32029:131;32155:4;32029:131;:::i;:::-;32021:139;;31919:248;;;:::o;32173:419::-;32339:4;32377:2;32366:9;32362:18;32354:26;;32426:9;32420:4;32416:20;32412:1;32401:9;32397:17;32390:47;32454:131;32580:4;32454:131;:::i;:::-;32446:139;;32344:248;;;:::o;32598:419::-;32764:4;32802:2;32791:9;32787:18;32779:26;;32851:9;32845:4;32841:20;32837:1;32826:9;32822:17;32815:47;32879:131;33005:4;32879:131;:::i;:::-;32871:139;;32769:248;;;:::o;33023:419::-;33189:4;33227:2;33216:9;33212:18;33204:26;;33276:9;33270:4;33266:20;33262:1;33251:9;33247:17;33240:47;33304:131;33430:4;33304:131;:::i;:::-;33296:139;;33194:248;;;:::o;33448:419::-;33614:4;33652:2;33641:9;33637:18;33629:26;;33701:9;33695:4;33691:20;33687:1;33676:9;33672:17;33665:47;33729:131;33855:4;33729:131;:::i;:::-;33721:139;;33619:248;;;:::o;33873:419::-;34039:4;34077:2;34066:9;34062:18;34054:26;;34126:9;34120:4;34116:20;34112:1;34101:9;34097:17;34090:47;34154:131;34280:4;34154:131;:::i;:::-;34146:139;;34044:248;;;:::o;34298:419::-;34464:4;34502:2;34491:9;34487:18;34479:26;;34551:9;34545:4;34541:20;34537:1;34526:9;34522:17;34515:47;34579:131;34705:4;34579:131;:::i;:::-;34571:139;;34469:248;;;:::o;34723:419::-;34889:4;34927:2;34916:9;34912:18;34904:26;;34976:9;34970:4;34966:20;34962:1;34951:9;34947:17;34940:47;35004:131;35130:4;35004:131;:::i;:::-;34996:139;;34894:248;;;:::o;35148:419::-;35314:4;35352:2;35341:9;35337:18;35329:26;;35401:9;35395:4;35391:20;35387:1;35376:9;35372:17;35365:47;35429:131;35555:4;35429:131;:::i;:::-;35421:139;;35319:248;;;:::o;35573:419::-;35739:4;35777:2;35766:9;35762:18;35754:26;;35826:9;35820:4;35816:20;35812:1;35801:9;35797:17;35790:47;35854:131;35980:4;35854:131;:::i;:::-;35846:139;;35744:248;;;:::o;35998:419::-;36164:4;36202:2;36191:9;36187:18;36179:26;;36251:9;36245:4;36241:20;36237:1;36226:9;36222:17;36215:47;36279:131;36405:4;36279:131;:::i;:::-;36271:139;;36169:248;;;:::o;36423:419::-;36589:4;36627:2;36616:9;36612:18;36604:26;;36676:9;36670:4;36666:20;36662:1;36651:9;36647:17;36640:47;36704:131;36830:4;36704:131;:::i;:::-;36696:139;;36594:248;;;:::o;36848:419::-;37014:4;37052:2;37041:9;37037:18;37029:26;;37101:9;37095:4;37091:20;37087:1;37076:9;37072:17;37065:47;37129:131;37255:4;37129:131;:::i;:::-;37121:139;;37019:248;;;:::o;37273:419::-;37439:4;37477:2;37466:9;37462:18;37454:26;;37526:9;37520:4;37516:20;37512:1;37501:9;37497:17;37490:47;37554:131;37680:4;37554:131;:::i;:::-;37546:139;;37444:248;;;:::o;37698:419::-;37864:4;37902:2;37891:9;37887:18;37879:26;;37951:9;37945:4;37941:20;37937:1;37926:9;37922:17;37915:47;37979:131;38105:4;37979:131;:::i;:::-;37971:139;;37869:248;;;:::o;38123:419::-;38289:4;38327:2;38316:9;38312:18;38304:26;;38376:9;38370:4;38366:20;38362:1;38351:9;38347:17;38340:47;38404:131;38530:4;38404:131;:::i;:::-;38396:139;;38294:248;;;:::o;38548:222::-;38641:4;38679:2;38668:9;38664:18;38656:26;;38692:71;38760:1;38749:9;38745:17;38736:6;38692:71;:::i;:::-;38646:124;;;;:::o;38776:129::-;38810:6;38837:20;;:::i;:::-;38827:30;;38866:33;38894:4;38886:6;38866:33;:::i;:::-;38817:88;;;:::o;38911:75::-;38944:6;38977:2;38971:9;38961:19;;38951:35;:::o;38992:311::-;39069:4;39159:18;39151:6;39148:30;39145:2;;;39181:18;;:::i;:::-;39145:2;39231:4;39223:6;39219:17;39211:25;;39291:4;39285;39281:15;39273:23;;39074:229;;;:::o;39309:307::-;39370:4;39460:18;39452:6;39449:30;39446:2;;;39482:18;;:::i;:::-;39446:2;39520:29;39542:6;39520:29;:::i;:::-;39512:37;;39604:4;39598;39594:15;39586:23;;39375:241;;;:::o;39622:308::-;39684:4;39774:18;39766:6;39763:30;39760:2;;;39796:18;;:::i;:::-;39760:2;39834:29;39856:6;39834:29;:::i;:::-;39826:37;;39918:4;39912;39908:15;39900:23;;39689:241;;;:::o;39936:98::-;39987:6;40021:5;40015:12;40005:22;;39994:40;;;:::o;40040:99::-;40092:6;40126:5;40120:12;40110:22;;40099:40;;;:::o;40145:168::-;40228:11;40262:6;40257:3;40250:19;40302:4;40297:3;40293:14;40278:29;;40240:73;;;;:::o;40319:169::-;40403:11;40437:6;40432:3;40425:19;40477:4;40472:3;40468:14;40453:29;;40415:73;;;;:::o;40494:148::-;40596:11;40633:3;40618:18;;40608:34;;;;:::o;40648:305::-;40688:3;40707:20;40725:1;40707:20;:::i;:::-;40702:25;;40741:20;40759:1;40741:20;:::i;:::-;40736:25;;40895:1;40827:66;40823:74;40820:1;40817:81;40814:2;;;40901:18;;:::i;:::-;40814:2;40945:1;40942;40938:9;40931:16;;40692:261;;;;:::o;40959:185::-;40999:1;41016:20;41034:1;41016:20;:::i;:::-;41011:25;;41050:20;41068:1;41050:20;:::i;:::-;41045:25;;41089:1;41079:2;;41094:18;;:::i;:::-;41079:2;41136:1;41133;41129:9;41124:14;;41001:143;;;;:::o;41150:348::-;41190:7;41213:20;41231:1;41213:20;:::i;:::-;41208:25;;41247:20;41265:1;41247:20;:::i;:::-;41242:25;;41435:1;41367:66;41363:74;41360:1;41357:81;41352:1;41345:9;41338:17;41334:105;41331:2;;;41442:18;;:::i;:::-;41331:2;41490:1;41487;41483:9;41472:20;;41198:300;;;;:::o;41504:191::-;41544:4;41564:20;41582:1;41564:20;:::i;:::-;41559:25;;41598:20;41616:1;41598:20;:::i;:::-;41593:25;;41637:1;41634;41631:8;41628:2;;;41642:18;;:::i;:::-;41628:2;41687:1;41684;41680:9;41672:17;;41549:146;;;;:::o;41701:96::-;41738:7;41767:24;41785:5;41767:24;:::i;:::-;41756:35;;41746:51;;;:::o;41803:104::-;41848:7;41877:24;41895:5;41877:24;:::i;:::-;41866:35;;41856:51;;;:::o;41913:90::-;41947:7;41990:5;41983:13;41976:21;41965:32;;41955:48;;;:::o;42009:149::-;42045:7;42085:66;42078:5;42074:78;42063:89;;42053:105;;;:::o;42164:126::-;42201:7;42241:42;42234:5;42230:54;42219:65;;42209:81;;;:::o;42296:77::-;42333:7;42362:5;42351:16;;42341:32;;;:::o;42379:154::-;42463:6;42458:3;42453;42440:30;42525:1;42516:6;42511:3;42507:16;42500:27;42430:103;;;:::o;42539:307::-;42607:1;42617:113;42631:6;42628:1;42625:13;42617:113;;;42716:1;42711:3;42707:11;42701:18;42697:1;42692:3;42688:11;42681:39;42653:2;42650:1;42646:10;42641:15;;42617:113;;;42748:6;42745:1;42742:13;42739:2;;;42828:1;42819:6;42814:3;42810:16;42803:27;42739:2;42588:258;;;;:::o;42852:320::-;42896:6;42933:1;42927:4;42923:12;42913:22;;42980:1;42974:4;42970:12;43001:18;42991:2;;43057:4;43049:6;43045:17;43035:27;;42991:2;43119;43111:6;43108:14;43088:18;43085:38;43082:2;;;43138:18;;:::i;:::-;43082:2;42903:269;;;;:::o;43178:281::-;43261:27;43283:4;43261:27;:::i;:::-;43253:6;43249:40;43391:6;43379:10;43376:22;43355:18;43343:10;43340:34;43337:62;43334:2;;;43402:18;;:::i;:::-;43334:2;43442:10;43438:2;43431:22;43221:238;;;:::o;43465:233::-;43504:3;43527:24;43545:5;43527:24;:::i;:::-;43518:33;;43573:66;43566:5;43563:77;43560:2;;;43643:18;;:::i;:::-;43560:2;43690:1;43683:5;43679:13;43672:20;;43508:190;;;:::o;43704:176::-;43736:1;43753:20;43771:1;43753:20;:::i;:::-;43748:25;;43787:20;43805:1;43787:20;:::i;:::-;43782:25;;43826:1;43816:2;;43831:18;;:::i;:::-;43816:2;43872:1;43869;43865:9;43860:14;;43738:142;;;;:::o;43886:180::-;43934:77;43931:1;43924:88;44031:4;44028:1;44021:15;44055:4;44052:1;44045:15;44072:180;44120:77;44117:1;44110:88;44217:4;44214:1;44207:15;44241:4;44238:1;44231:15;44258:180;44306:77;44303:1;44296:88;44403:4;44400:1;44393:15;44427:4;44424:1;44417:15;44444:180;44492:77;44489:1;44482:88;44589:4;44586:1;44579:15;44613:4;44610:1;44603:15;44630:102;44671:6;44722:2;44718:7;44713:2;44706:5;44702:14;44698:28;44688:38;;44678:54;;;:::o;44738:157::-;44878:9;44874:1;44866:6;44862:14;44855:33;44844:51;:::o;44901:164::-;45041:16;45037:1;45029:6;45025:14;45018:40;45007:58;:::o;45071:230::-;45211:34;45207:1;45199:6;45195:14;45188:58;45280:13;45275:2;45267:6;45263:15;45256:38;45177:124;:::o;45307:237::-;45447:34;45443:1;45435:6;45431:14;45424:58;45516:20;45511:2;45503:6;45499:15;45492:45;45413:131;:::o;45550:162::-;45690:14;45686:1;45678:6;45674:14;45667:38;45656:56;:::o;45718:225::-;45858:34;45854:1;45846:6;45842:14;45835:58;45927:8;45922:2;45914:6;45910:15;45903:33;45824:119;:::o;45949:178::-;46089:30;46085:1;46077:6;46073:14;46066:54;46055:72;:::o;46133:181::-;46273:33;46269:1;46261:6;46257:14;46250:57;46239:75;:::o;46320:178::-;46460:30;46456:1;46448:6;46444:14;46437:54;46426:72;:::o;46504:173::-;46644:25;46640:1;46632:6;46628:14;46621:49;46610:67;:::o;46683:171::-;46823:23;46819:1;46811:6;46807:14;46800:47;46789:65;:::o;46860:174::-;47000:26;46996:1;46988:6;46984:14;46977:50;46966:68;:::o;47040:223::-;47180:34;47176:1;47168:6;47164:14;47157:58;47249:6;47244:2;47236:6;47232:15;47225:31;47146:117;:::o;47269:175::-;47409:27;47405:1;47397:6;47393:14;47386:51;47375:69;:::o;47450:158::-;47590:10;47586:1;47578:6;47574:14;47567:34;47556:52;:::o;47614:159::-;47754:11;47750:1;47742:6;47738:14;47731:35;47720:53;:::o;47779:231::-;47919:34;47915:1;47907:6;47903:14;47896:58;47988:14;47983:2;47975:6;47971:15;47964:39;47885:125;:::o;48016:167::-;48156:19;48152:1;48144:6;48140:14;48133:43;48122:61;:::o;48189:243::-;48329:34;48325:1;48317:6;48313:14;48306:58;48398:26;48393:2;48385:6;48381:15;48374:51;48295:137;:::o;48438:229::-;48578:34;48574:1;48566:6;48562:14;48555:58;48647:12;48642:2;48634:6;48630:15;48623:37;48544:123;:::o;48673:228::-;48813:34;48809:1;48801:6;48797:14;48790:58;48882:11;48877:2;48869:6;48865:15;48858:36;48779:122;:::o;48907:182::-;49047:34;49043:1;49035:6;49031:14;49024:58;49013:76;:::o;49095:231::-;49235:34;49231:1;49223:6;49219:14;49212:58;49304:14;49299:2;49291:6;49287:15;49280:39;49201:125;:::o;49332:182::-;49472:34;49468:1;49460:6;49456:14;49449:58;49438:76;:::o;49520:228::-;49660:34;49656:1;49648:6;49644:14;49637:58;49729:11;49724:2;49716:6;49712:15;49705:36;49626:122;:::o;49754:234::-;49894:34;49890:1;49882:6;49878:14;49871:58;49963:17;49958:2;49950:6;49946:15;49939:42;49860:128;:::o;49994:165::-;50134:17;50130:1;50122:6;50118:14;50111:41;50100:59;:::o;50165:176::-;50305:28;50301:1;50293:6;50289:14;50282:52;50271:70;:::o;50347:220::-;50487:34;50483:1;50475:6;50471:14;50464:58;50556:3;50551:2;50543:6;50539:15;50532:28;50453:114;:::o;50573:236::-;50713:34;50709:1;50701:6;50697:14;50690:58;50782:19;50777:2;50769:6;50765:15;50758:44;50679:130;:::o;50815:231::-;50955:34;50951:1;50943:6;50939:14;50932:58;51024:14;51019:2;51011:6;51007:15;51000:39;50921:125;:::o;51052:174::-;51192:26;51188:1;51180:6;51176:14;51169:50;51158:68;:::o;51232:122::-;51305:24;51323:5;51305:24;:::i;:::-;51298:5;51295:35;51285:2;;51344:1;51341;51334:12;51285:2;51275:79;:::o;51360:138::-;51441:32;51467:5;51441:32;:::i;:::-;51434:5;51431:43;51421:2;;51488:1;51485;51478:12;51421:2;51411:87;:::o;51504:116::-;51574:21;51589:5;51574:21;:::i;:::-;51567:5;51564:32;51554:2;;51610:1;51607;51600:12;51554:2;51544:76;:::o;51626:120::-;51698:23;51715:5;51698:23;:::i;:::-;51691:5;51688:34;51678:2;;51736:1;51733;51726:12;51678:2;51668:78;:::o;51752:122::-;51825:24;51843:5;51825:24;:::i;:::-;51818:5;51815:35;51805:2;;51864:1;51861;51854:12;51805:2;51795:79;:::o

Swarm Source

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