ETH Price: $2,526.77 (+0.36%)

Token

The Brainiacs (TB)
 

Overview

Max Total Supply

1,064 TB

Holders

337

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TB
0xD7064b933C243D1Fb32e5831F567fd21D13C41E5
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:
TheBrainiacs

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-18
*/

// The Brainiacs //

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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/math/SaftMath.sol
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 SafeMath {
    /**
     * @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/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(), ".json")) : "";
    }

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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(to).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/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 @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 contracts/DZI.sol


pragma solidity ^0.8.0;



contract TheBrainiacs is ERC721, ERC721Enumerable, Ownable {

    using Strings for uint256;

    string public PROVENANCE;
    uint256 public constant tokenPrice = 80000000000000000; // 0.08 ETH
    uint public constant maxPresalePurchase = 4;
    uint public constant maxTokenPurchase = 8;
    uint public constant maxTokenPerWallet = 8888;
    uint256 public MAX_TOKENS = 8888;
    bool public saleIsActive = false;
    bool public preSaleIsActive = false;
    bool public revealed = false;
    string public notRevealedUri;
    string public baseExtension = ".json";
    string private _baseURIextended;
    // WhiteLists for presale.
    mapping (address => bool) private _isWhiteListed;
    mapping (address => uint) private _numberOfWallets;
    
    event AddWhiteListWallet(address _wallet );
    event RemoveWhiteListWallet(address _wallet );
    
    constructor(

    ) ERC721("The Brainiacs", "TB") {

    }

    function reveal() public onlyOwner {
        revealed = true;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

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

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

    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

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

    function setProvenance(string memory provenance) public onlyOwner {
        PROVENANCE = provenance;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
        _exists(tokenId),
        "ERC721Metadata: URI query for nonexistent token"
        );
        
        if(revealed == false) {
            return notRevealedUri;
        }

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

    // Reserve 100 Brainiacs for team & community (Used in giveaways, promotions etc...)


    function reserveTokens() public onlyOwner {
        uint supply = totalSupply();
        require(supply < 100, "More than 100 tokens have already been reserved or minted.");
        uint i;
        for (i = 0; i < 100; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function flipPreSaleState() public onlyOwner {
        preSaleIsActive = !preSaleIsActive;
    }

    function addWhiteListWallet (address _wallet) public onlyOwner {
        _isWhiteListed[_wallet] = true;
        emit AddWhiteListWallet(_wallet);
    }
    
    function removeWhiteListWallet (address _wallet) public onlyOwner {
        _isWhiteListed[_wallet] = false;
        emit RemoveWhiteListWallet(_wallet);
    }
    
    function preSaleToken(uint numberOfTokens) public payable {
        require(preSaleIsActive, "PreSale must be active to mint");
        require(!saleIsActive, "Could not pre-mint after sale is active");
        require(numberOfTokens <= maxPresalePurchase, "Exceeded max presale purchase");
        require(_numberOfWallets[msg.sender] + numberOfTokens <= maxPresalePurchase, "Exceeded max presale purchase per wallet");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply");
        require(tokenPrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_TOKENS) {
                _safeMint(msg.sender, mintIndex);
            }
        }
        
        _numberOfWallets[msg.sender] = _numberOfWallets[msg.sender] + numberOfTokens;
    }
    
    function mintToken(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint");
        require(numberOfTokens <= maxTokenPurchase, "Exceeded max token purchase");
        require(_numberOfWallets[msg.sender] + numberOfTokens <= maxTokenPurchase, "Exceeded max token purchase per wallet");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply");
        require(tokenPrice * numberOfTokens <= msg.value, "Ether value sent is not correct");

        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_TOKENS) {
                _safeMint(msg.sender, mintIndex);
            }
        }
        _numberOfWallets[msg.sender] = _numberOfWallets[msg.sender] + numberOfTokens;
    }

    // Update dev address by the previous dev.

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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_wallet","type":"address"}],"name":"AddWhiteListWallet","type":"event"},{"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":false,"internalType":"address","name":"_wallet","type":"address"}],"name":"RemoveWhiteListWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"addWhiteListWallet","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","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":"maxPresalePurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"preSaleToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"removeWhiteListWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526122b8600c556000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff0219169083151502179055506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f9080519060200190620000a89291906200024b565b50348015620000b657600080fd5b506040518060400160405280600d81526020017f54686520427261696e69616373000000000000000000000000000000000000008152506040518060400160405280600281526020017f544200000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200013b9291906200024b565b508060019080519060200190620001549291906200024b565b505050620001776200016b6200017d60201b60201c565b6200018560201b60201c565b62000360565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025990620002fb565b90600052602060002090601f0160209004810192826200027d5760008555620002c9565b82601f106200029857805160ff1916838001178555620002c9565b82800160010185558215620002c9579182015b82811115620002c8578251825591602001919060010190620002ab565b5b509050620002d89190620002dc565b5090565b5b80821115620002f7576000816000905550600101620002dd565b5090565b600060028204905060018216806200031457607f821691505b602082108114156200032b576200032a62000331565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614e8980620003706000396000f3fe6080604052600436106102515760003560e01c806370a0823111610139578063c634d032116100b6578063efa5860a1161007a578063efa5860a14610860578063f03255491461088b578063f2c4ce1e146108a2578063f2fde38b146108cb578063f47c84c5146108f4578063ffe630b51461091f57610251565b8063c634d03214610774578063c668286214610790578063c87b56dd146107bb578063e985e9c5146107f8578063eb8d24441461083557610251565b806395d89b41116100fd57806395d89b41146106b7578063a22cb465146106e2578063a475b5dd1461070b578063b7ced53b14610722578063b88d4fde1461074b57610251565b806370a08231146105e2578063715018a61461061f5780637a8baf52146106365780637ff9b596146106615780638da5cb5b1461068c57610251565b80632f745c59116101d25780634f6ccce7116101965780634f6ccce7146104cd578063518302271461050a57806355f804b3146105355780636352211e1461055e5780636373a6b11461059b5780636955327d146105c657610251565b80632f745c591461041057806331690b441461044d57806334918dfd146104765780633ccfd60b1461048d57806342842e0e146104a457610251565b806309aa3dcf1161021957806309aa3dcf1461034f57806318160ddd1461037a5780631f0234d8146103a557806323b872dd146103d057806327ac36c4146103f957610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063081c8c44146102fb578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906139a3565b610948565b60405161028a91906145f2565b60405180910390f35b34801561029f57600080fd5b506102a861095a565b6040516102b5919061460d565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613a36565b6109ec565b6040516102f2919061458b565b60405180910390f35b34801561030757600080fd5b50610310610a71565b60405161031d919061460d565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613967565b610aff565b005b34801561035b57600080fd5b50610364610c17565b60405161037191906149af565b60405180910390f35b34801561038657600080fd5b5061038f610c1c565b60405161039c91906149af565b60405180910390f35b3480156103b157600080fd5b506103ba610c29565b6040516103c791906145f2565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190613861565b610c3c565b005b34801561040557600080fd5b5061040e610c9c565b005b34801561041c57600080fd5b5061043760048036038101906104329190613967565b610d9f565b60405161044491906149af565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f91906137fc565b610e44565b005b34801561048257600080fd5b5061048b610f52565b005b34801561049957600080fd5b506104a2610ffa565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190613861565b6110c5565b005b3480156104d957600080fd5b506104f460048036038101906104ef9190613a36565b6110e5565b60405161050191906149af565b60405180910390f35b34801561051657600080fd5b5061051f61117c565b60405161052c91906145f2565b60405180910390f35b34801561054157600080fd5b5061055c600480360381019061055791906139f5565b61118f565b005b34801561056a57600080fd5b5061058560048036038101906105809190613a36565b611225565b604051610592919061458b565b60405180910390f35b3480156105a757600080fd5b506105b06112d7565b6040516105bd919061460d565b60405180910390f35b6105e060048036038101906105db9190613a36565b611365565b005b3480156105ee57600080fd5b50610609600480360381019061060491906137fc565b61165c565b60405161061691906149af565b60405180910390f35b34801561062b57600080fd5b50610634611714565b005b34801561064257600080fd5b5061064b61179c565b60405161065891906149af565b60405180910390f35b34801561066d57600080fd5b506106766117a2565b60405161068391906149af565b60405180910390f35b34801561069857600080fd5b506106a16117ae565b6040516106ae919061458b565b60405180910390f35b3480156106c357600080fd5b506106cc6117d8565b6040516106d9919061460d565b60405180910390f35b3480156106ee57600080fd5b506107096004803603810190610704919061392b565b61186a565b005b34801561071757600080fd5b506107206119eb565b005b34801561072e57600080fd5b50610749600480360381019061074491906137fc565b611a84565b005b34801561075757600080fd5b50610772600480360381019061076d91906138b0565b611b92565b005b61078e60048036038101906107899190613a36565b611bf4565b005b34801561079c57600080fd5b506107a5611e9b565b6040516107b2919061460d565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd9190613a36565b611f29565b6040516107ef919061460d565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a9190613825565b612082565b60405161082c91906145f2565b60405180910390f35b34801561084157600080fd5b5061084a612116565b60405161085791906145f2565b60405180910390f35b34801561086c57600080fd5b50610875612129565b60405161088291906149af565b60405180910390f35b34801561089757600080fd5b506108a061212e565b005b3480156108ae57600080fd5b506108c960048036038101906108c491906139f5565b6121d6565b005b3480156108d757600080fd5b506108f260048036038101906108ed91906137fc565b61226c565b005b34801561090057600080fd5b50610909612364565b60405161091691906149af565b60405180910390f35b34801561092b57600080fd5b50610946600480360381019061094191906139f5565b61236a565b005b600061095382612400565b9050919050565b60606000805461096990614c7e565b80601f016020809104026020016040519081016040528092919081815260200182805461099590614c7e565b80156109e25780601f106109b7576101008083540402835291602001916109e2565b820191906000526020600020905b8154815290600101906020018083116109c557829003601f168201915b5050505050905090565b60006109f78261247a565b610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d9061486f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e8054610a7e90614c7e565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaa90614c7e565b8015610af75780601f10610acc57610100808354040283529160200191610af7565b820191906000526020600020905b815481529060010190602001808311610ada57829003601f168201915b505050505081565b6000610b0a82611225565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b729061490f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b9a6124e6565b73ffffffffffffffffffffffffffffffffffffffff161480610bc95750610bc881610bc36124e6565b612082565b5b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff906147af565b60405180910390fd5b610c1283836124ee565b505050565b600881565b6000600880549050905090565b600d60019054906101000a900460ff1681565b610c4d610c476124e6565b826125a7565b610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c839061496f565b60405180910390fd5b610c97838383612685565b505050565b610ca46124e6565b73ffffffffffffffffffffffffffffffffffffffff16610cc26117ae565b73ffffffffffffffffffffffffffffffffffffffff1614610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f9061488f565b60405180910390fd5b6000610d22610c1c565b905060648110610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e906148af565b60405180910390fd5b60005b6064811015610d9b57610d88338284610d839190614ab3565b6128e1565b8080610d9390614cb0565b915050610d6a565b5050565b6000610daa8361165c565b8210610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de29061462f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e4c6124e6565b73ffffffffffffffffffffffffffffffffffffffff16610e6a6117ae565b73ffffffffffffffffffffffffffffffffffffffff1614610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb79061488f565b60405180910390fd5b6001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fc8651250df7c4c306e2bd9eb8d5a8e9a422a3101fb96cfa7f8e0c3a7df3b9b5181604051610f47919061458b565b60405180910390a150565b610f5a6124e6565b73ffffffffffffffffffffffffffffffffffffffff16610f786117ae565b73ffffffffffffffffffffffffffffffffffffffff1614610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc59061488f565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6110026124e6565b73ffffffffffffffffffffffffffffffffffffffff166110206117ae565b73ffffffffffffffffffffffffffffffffffffffff1614611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d9061488f565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110c1573d6000803e3d6000fd5b5050565b6110e083838360405180602001604052806000815250611b92565b505050565b60006110ef610c1c565b8210611130576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111279061498f565b60405180910390fd5b6008828154811061116a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600d60029054906101000a900460ff1681565b6111976124e6565b73ffffffffffffffffffffffffffffffffffffffff166111b56117ae565b73ffffffffffffffffffffffffffffffffffffffff161461120b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112029061488f565b60405180910390fd5b8060109080519060200190611221929190613620565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c5906147ef565b60405180910390fd5b80915050919050565b600b80546112e490614c7e565b80601f016020809104026020016040519081016040528092919081815260200182805461131090614c7e565b801561135d5780601f106113325761010080835404028352916020019161135d565b820191906000526020600020905b81548152906001019060200180831161134057829003601f168201915b505050505081565b600d60019054906101000a900460ff166113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab9061494f565b60405180910390fd5b600d60009054906101000a900460ff1615611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb9061478f565b60405180910390fd5b6004811115611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f9061484f565b60405180910390fd5b600481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114959190614ab3565b11156114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd906146af565b60405180910390fd5b600c54816114e2610c1c565b6114ec9190614ab3565b111561152d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115249061480f565b60405180910390fd5b348167011c37937e0800006115429190614b3a565b1115611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a9061472f565b60405180910390fd5b60005b818110156115ca576000611598610c1c565b9050600c546115a5610c1c565b10156115b6576115b533826128e1565b5b5080806115c290614cb0565b915050611586565b5080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116169190614ab3565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c4906147cf565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61171c6124e6565b73ffffffffffffffffffffffffffffffffffffffff1661173a6117ae565b73ffffffffffffffffffffffffffffffffffffffff1614611790576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117879061488f565b60405180910390fd5b61179a60006128ff565b565b6122b881565b67011c37937e08000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117e790614c7e565b80601f016020809104026020016040519081016040528092919081815260200182805461181390614c7e565b80156118605780601f1061183557610100808354040283529160200191611860565b820191906000526020600020905b81548152906001019060200180831161184357829003601f168201915b5050505050905090565b6118726124e6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d79061470f565b60405180910390fd5b80600560006118ed6124e6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661199a6124e6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119df91906145f2565b60405180910390a35050565b6119f36124e6565b73ffffffffffffffffffffffffffffffffffffffff16611a116117ae565b73ffffffffffffffffffffffffffffffffffffffff1614611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e9061488f565b60405180910390fd5b6001600d60026101000a81548160ff021916908315150217905550565b611a8c6124e6565b73ffffffffffffffffffffffffffffffffffffffff16611aaa6117ae565b73ffffffffffffffffffffffffffffffffffffffff1614611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af79061488f565b60405180910390fd5b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff4d05032556b7a946737f39b95e07890ce0335b8d0ea912ac5b9ed95710dbb8381604051611b87919061458b565b60405180910390a150565b611ba3611b9d6124e6565b836125a7565b611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd99061496f565b60405180910390fd5b611bee848484846129c5565b50505050565b600d60009054906101000a900460ff16611c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a9061474f565b60405180910390fd5b6008811115611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e9061492f565b60405180910390fd5b600881601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cd49190614ab3565b1115611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c906146cf565b60405180910390fd5b600c5481611d21610c1c565b611d2b9190614ab3565b1115611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d639061480f565b60405180910390fd5b348167011c37937e080000611d819190614b3a565b1115611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db99061472f565b60405180910390fd5b60005b81811015611e09576000611dd7610c1c565b9050600c54611de4610c1c565b1015611df557611df433826128e1565b5b508080611e0190614cb0565b915050611dc5565b5080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e559190614ab3565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600f8054611ea890614c7e565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed490614c7e565b8015611f215780601f10611ef657610100808354040283529160200191611f21565b820191906000526020600020905b815481529060010190602001808311611f0457829003601f168201915b505050505081565b6060611f348261247a565b611f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6a906148ef565b60405180910390fd5b60001515600d60029054906101000a900460ff161515141561202157600e8054611f9c90614c7e565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc890614c7e565b80156120155780601f10611fea57610100808354040283529160200191612015565b820191906000526020600020905b815481529060010190602001808311611ff857829003601f168201915b5050505050905061207d565b600061202b612a21565b9050600081511161204b5760405180602001604052806000815250612079565b8061205584612ab3565b600f6040516020016120699392919061455a565b6040516020818303038152906040525b9150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b600481565b6121366124e6565b73ffffffffffffffffffffffffffffffffffffffff166121546117ae565b73ffffffffffffffffffffffffffffffffffffffff16146121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a19061488f565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6121de6124e6565b73ffffffffffffffffffffffffffffffffffffffff166121fc6117ae565b73ffffffffffffffffffffffffffffffffffffffff1614612252576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122499061488f565b60405180910390fd5b80600e9080519060200190612268929190613620565b5050565b6122746124e6565b73ffffffffffffffffffffffffffffffffffffffff166122926117ae565b73ffffffffffffffffffffffffffffffffffffffff16146122e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122df9061488f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f9061466f565b60405180910390fd5b612361816128ff565b50565b600c5481565b6123726124e6565b73ffffffffffffffffffffffffffffffffffffffff166123906117ae565b73ffffffffffffffffffffffffffffffffffffffff16146123e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123dd9061488f565b60405180910390fd5b80600b90805190602001906123fc929190613620565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612473575061247282612c60565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661256183611225565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125b28261247a565b6125f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e89061476f565b60405180910390fd5b60006125fc83611225565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061266b57508373ffffffffffffffffffffffffffffffffffffffff16612653846109ec565b73ffffffffffffffffffffffffffffffffffffffff16145b8061267c575061267b8185612082565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126a582611225565b73ffffffffffffffffffffffffffffffffffffffff16146126fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f2906148cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561276b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612762906146ef565b60405180910390fd5b612776838383612d42565b6127816000826124ee565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127d19190614b94565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128289190614ab3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6128fb828260405180602001604052806000815250612d52565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129d0848484612685565b6129dc84848484612dad565b612a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a129061464f565b60405180910390fd5b50505050565b606060108054612a3090614c7e565b80601f0160208091040260200160405190810160405280929190818152602001828054612a5c90614c7e565b8015612aa95780601f10612a7e57610100808354040283529160200191612aa9565b820191906000526020600020905b815481529060010190602001808311612a8c57829003601f168201915b5050505050905090565b60606000821415612afb576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c5b565b600082905060005b60008214612b2d578080612b1690614cb0565b915050600a82612b269190614b09565b9150612b03565b60008167ffffffffffffffff811115612b6f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ba15781602001600182028036833780820191505090505b5090505b60008514612c5457600182612bba9190614b94565b9150600a85612bc99190614cf9565b6030612bd59190614ab3565b60f81b818381518110612c11577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c4d9190614b09565b9450612ba5565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d2b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d3b5750612d3a82612f44565b5b9050919050565b612d4d838383612fae565b505050565b612d5c83836130c2565b612d696000848484612dad565b612da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9f9061464f565b60405180910390fd5b505050565b6000612dce8473ffffffffffffffffffffffffffffffffffffffff16613290565b15612f37578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df76124e6565b8786866040518563ffffffff1660e01b8152600401612e1994939291906145a6565b602060405180830381600087803b158015612e3357600080fd5b505af1925050508015612e6457506040513d601f19601f82011682018060405250810190612e6191906139cc565b60015b612ee7573d8060008114612e94576040519150601f19603f3d011682016040523d82523d6000602084013e612e99565b606091505b50600081511415612edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed69061464f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f3c565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fb98383836132a3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ffc57612ff7816132a8565b61303b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461303a5761303983826132f1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561307e576130798161345e565b6130bd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130bc576130bb82826135a1565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613132576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131299061482f565b60405180910390fd5b61313b8161247a565b1561317b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131729061468f565b60405180910390fd5b61318760008383612d42565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131d79190614ab3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132fe8461165c565b6133089190614b94565b90506000600760008481526020019081526020016000205490508181146133ed576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134729190614b94565b90506000600960008481526020019081526020016000205490506000600883815481106134c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613510577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613585577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006135ac8361165c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461362c90614c7e565b90600052602060002090601f01602090048101928261364e5760008555613695565b82601f1061366757805160ff1916838001178555613695565b82800160010185558215613695579182015b82811115613694578251825591602001919060010190613679565b5b5090506136a291906136a6565b5090565b5b808211156136bf5760008160009055506001016136a7565b5090565b60006136d66136d1846149fb565b6149ca565b9050828152602081018484840111156136ee57600080fd5b6136f9848285614c3c565b509392505050565b600061371461370f84614a2b565b6149ca565b90508281526020810184848401111561372c57600080fd5b613737848285614c3c565b509392505050565b60008135905061374e81614df7565b92915050565b60008135905061376381614e0e565b92915050565b60008135905061377881614e25565b92915050565b60008151905061378d81614e25565b92915050565b600082601f8301126137a457600080fd5b81356137b48482602086016136c3565b91505092915050565b600082601f8301126137ce57600080fd5b81356137de848260208601613701565b91505092915050565b6000813590506137f681614e3c565b92915050565b60006020828403121561380e57600080fd5b600061381c8482850161373f565b91505092915050565b6000806040838503121561383857600080fd5b60006138468582860161373f565b92505060206138578582860161373f565b9150509250929050565b60008060006060848603121561387657600080fd5b60006138848682870161373f565b93505060206138958682870161373f565b92505060406138a6868287016137e7565b9150509250925092565b600080600080608085870312156138c657600080fd5b60006138d48782880161373f565b94505060206138e58782880161373f565b93505060406138f6878288016137e7565b925050606085013567ffffffffffffffff81111561391357600080fd5b61391f87828801613793565b91505092959194509250565b6000806040838503121561393e57600080fd5b600061394c8582860161373f565b925050602061395d85828601613754565b9150509250929050565b6000806040838503121561397a57600080fd5b60006139888582860161373f565b9250506020613999858286016137e7565b9150509250929050565b6000602082840312156139b557600080fd5b60006139c384828501613769565b91505092915050565b6000602082840312156139de57600080fd5b60006139ec8482850161377e565b91505092915050565b600060208284031215613a0757600080fd5b600082013567ffffffffffffffff811115613a2157600080fd5b613a2d848285016137bd565b91505092915050565b600060208284031215613a4857600080fd5b6000613a56848285016137e7565b91505092915050565b613a6881614bc8565b82525050565b613a7781614bda565b82525050565b6000613a8882614a70565b613a928185614a86565b9350613aa2818560208601614c4b565b613aab81614de6565b840191505092915050565b6000613ac182614a7b565b613acb8185614a97565b9350613adb818560208601614c4b565b613ae481614de6565b840191505092915050565b6000613afa82614a7b565b613b048185614aa8565b9350613b14818560208601614c4b565b80840191505092915050565b60008154613b2d81614c7e565b613b378186614aa8565b94506001821660008114613b525760018114613b6357613b96565b60ff19831686528186019350613b96565b613b6c85614a5b565b60005b83811015613b8e57815481890152600182019150602081019050613b6f565b838801955050505b50505092915050565b6000613bac602b83614a97565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613c12603283614a97565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613c78602683614a97565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cde601c83614a97565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613d1e602883614a97565b91507f4578636565646564206d61782070726573616c6520707572636861736520706560008301527f722077616c6c65740000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d84602683614a97565b91507f4578636565646564206d617820746f6b656e207075726368617365207065722060008301527f77616c6c657400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613dea602483614a97565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e50601983614a97565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613e90601f83614a97565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613ed0601b83614a97565b91507f53616c65206d7573742062652061637469766520746f206d696e7400000000006000830152602082019050919050565b6000613f10602c83614a97565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f76602783614a97565b91507f436f756c64206e6f74207072652d6d696e742061667465722073616c6520697360008301527f20616374697665000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fdc603883614a97565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614042602a83614a97565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006140a8602983614a97565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061410e602083614a97565b91507f507572636861736520776f756c6420657863656564206d617820737570706c796000830152602082019050919050565b600061414e602083614a97565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061418e601d83614a97565b91507f4578636565646564206d61782070726573616c652070757263686173650000006000830152602082019050919050565b60006141ce602c83614a97565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614234602083614a97565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614274603a83614a97565b91507f4d6f7265207468616e2031303020746f6b656e73206861766520616c7265616460008301527f79206265656e207265736572766564206f72206d696e7465642e0000000000006020830152604082019050919050565b60006142da602983614a97565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614340602f83614a97565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006143a6602183614a97565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061440c601b83614a97565b91507f4578636565646564206d617820746f6b656e20707572636861736500000000006000830152602082019050919050565b600061444c601e83614a97565b91507f50726553616c65206d7573742062652061637469766520746f206d696e7400006000830152602082019050919050565b600061448c603183614a97565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006144f2602c83614a97565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61455481614c32565b82525050565b60006145668286613aef565b91506145728285613aef565b915061457e8284613b20565b9150819050949350505050565b60006020820190506145a06000830184613a5f565b92915050565b60006080820190506145bb6000830187613a5f565b6145c86020830186613a5f565b6145d5604083018561454b565b81810360608301526145e78184613a7d565b905095945050505050565b60006020820190506146076000830184613a6e565b92915050565b600060208201905081810360008301526146278184613ab6565b905092915050565b6000602082019050818103600083015261464881613b9f565b9050919050565b6000602082019050818103600083015261466881613c05565b9050919050565b6000602082019050818103600083015261468881613c6b565b9050919050565b600060208201905081810360008301526146a881613cd1565b9050919050565b600060208201905081810360008301526146c881613d11565b9050919050565b600060208201905081810360008301526146e881613d77565b9050919050565b6000602082019050818103600083015261470881613ddd565b9050919050565b6000602082019050818103600083015261472881613e43565b9050919050565b6000602082019050818103600083015261474881613e83565b9050919050565b6000602082019050818103600083015261476881613ec3565b9050919050565b6000602082019050818103600083015261478881613f03565b9050919050565b600060208201905081810360008301526147a881613f69565b9050919050565b600060208201905081810360008301526147c881613fcf565b9050919050565b600060208201905081810360008301526147e881614035565b9050919050565b600060208201905081810360008301526148088161409b565b9050919050565b6000602082019050818103600083015261482881614101565b9050919050565b6000602082019050818103600083015261484881614141565b9050919050565b6000602082019050818103600083015261486881614181565b9050919050565b60006020820190508181036000830152614888816141c1565b9050919050565b600060208201905081810360008301526148a881614227565b9050919050565b600060208201905081810360008301526148c881614267565b9050919050565b600060208201905081810360008301526148e8816142cd565b9050919050565b6000602082019050818103600083015261490881614333565b9050919050565b6000602082019050818103600083015261492881614399565b9050919050565b60006020820190508181036000830152614948816143ff565b9050919050565b600060208201905081810360008301526149688161443f565b9050919050565b600060208201905081810360008301526149888161447f565b9050919050565b600060208201905081810360008301526149a8816144e5565b9050919050565b60006020820190506149c4600083018461454b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156149f1576149f0614db7565b5b8060405250919050565b600067ffffffffffffffff821115614a1657614a15614db7565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614a4657614a45614db7565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614abe82614c32565b9150614ac983614c32565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614afe57614afd614d2a565b5b828201905092915050565b6000614b1482614c32565b9150614b1f83614c32565b925082614b2f57614b2e614d59565b5b828204905092915050565b6000614b4582614c32565b9150614b5083614c32565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b8957614b88614d2a565b5b828202905092915050565b6000614b9f82614c32565b9150614baa83614c32565b925082821015614bbd57614bbc614d2a565b5b828203905092915050565b6000614bd382614c12565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c69578082015181840152602081019050614c4e565b83811115614c78576000848401525b50505050565b60006002820490506001821680614c9657607f821691505b60208210811415614caa57614ca9614d88565b5b50919050565b6000614cbb82614c32565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cee57614ced614d2a565b5b600182019050919050565b6000614d0482614c32565b9150614d0f83614c32565b925082614d1f57614d1e614d59565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614e0081614bc8565b8114614e0b57600080fd5b50565b614e1781614bda565b8114614e2257600080fd5b50565b614e2e81614be6565b8114614e3957600080fd5b50565b614e4581614c32565b8114614e5057600080fd5b5056fea264697066735822122055848daba8d74e1c8a2fbda5d7c04adc9521ebdc42a6c4f79e4fb7ba650ec9c764736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102515760003560e01c806370a0823111610139578063c634d032116100b6578063efa5860a1161007a578063efa5860a14610860578063f03255491461088b578063f2c4ce1e146108a2578063f2fde38b146108cb578063f47c84c5146108f4578063ffe630b51461091f57610251565b8063c634d03214610774578063c668286214610790578063c87b56dd146107bb578063e985e9c5146107f8578063eb8d24441461083557610251565b806395d89b41116100fd57806395d89b41146106b7578063a22cb465146106e2578063a475b5dd1461070b578063b7ced53b14610722578063b88d4fde1461074b57610251565b806370a08231146105e2578063715018a61461061f5780637a8baf52146106365780637ff9b596146106615780638da5cb5b1461068c57610251565b80632f745c59116101d25780634f6ccce7116101965780634f6ccce7146104cd578063518302271461050a57806355f804b3146105355780636352211e1461055e5780636373a6b11461059b5780636955327d146105c657610251565b80632f745c591461041057806331690b441461044d57806334918dfd146104765780633ccfd60b1461048d57806342842e0e146104a457610251565b806309aa3dcf1161021957806309aa3dcf1461034f57806318160ddd1461037a5780631f0234d8146103a557806323b872dd146103d057806327ac36c4146103f957610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063081c8c44146102fb578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906139a3565b610948565b60405161028a91906145f2565b60405180910390f35b34801561029f57600080fd5b506102a861095a565b6040516102b5919061460d565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613a36565b6109ec565b6040516102f2919061458b565b60405180910390f35b34801561030757600080fd5b50610310610a71565b60405161031d919061460d565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613967565b610aff565b005b34801561035b57600080fd5b50610364610c17565b60405161037191906149af565b60405180910390f35b34801561038657600080fd5b5061038f610c1c565b60405161039c91906149af565b60405180910390f35b3480156103b157600080fd5b506103ba610c29565b6040516103c791906145f2565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190613861565b610c3c565b005b34801561040557600080fd5b5061040e610c9c565b005b34801561041c57600080fd5b5061043760048036038101906104329190613967565b610d9f565b60405161044491906149af565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f91906137fc565b610e44565b005b34801561048257600080fd5b5061048b610f52565b005b34801561049957600080fd5b506104a2610ffa565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190613861565b6110c5565b005b3480156104d957600080fd5b506104f460048036038101906104ef9190613a36565b6110e5565b60405161050191906149af565b60405180910390f35b34801561051657600080fd5b5061051f61117c565b60405161052c91906145f2565b60405180910390f35b34801561054157600080fd5b5061055c600480360381019061055791906139f5565b61118f565b005b34801561056a57600080fd5b5061058560048036038101906105809190613a36565b611225565b604051610592919061458b565b60405180910390f35b3480156105a757600080fd5b506105b06112d7565b6040516105bd919061460d565b60405180910390f35b6105e060048036038101906105db9190613a36565b611365565b005b3480156105ee57600080fd5b50610609600480360381019061060491906137fc565b61165c565b60405161061691906149af565b60405180910390f35b34801561062b57600080fd5b50610634611714565b005b34801561064257600080fd5b5061064b61179c565b60405161065891906149af565b60405180910390f35b34801561066d57600080fd5b506106766117a2565b60405161068391906149af565b60405180910390f35b34801561069857600080fd5b506106a16117ae565b6040516106ae919061458b565b60405180910390f35b3480156106c357600080fd5b506106cc6117d8565b6040516106d9919061460d565b60405180910390f35b3480156106ee57600080fd5b506107096004803603810190610704919061392b565b61186a565b005b34801561071757600080fd5b506107206119eb565b005b34801561072e57600080fd5b50610749600480360381019061074491906137fc565b611a84565b005b34801561075757600080fd5b50610772600480360381019061076d91906138b0565b611b92565b005b61078e60048036038101906107899190613a36565b611bf4565b005b34801561079c57600080fd5b506107a5611e9b565b6040516107b2919061460d565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd9190613a36565b611f29565b6040516107ef919061460d565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a9190613825565b612082565b60405161082c91906145f2565b60405180910390f35b34801561084157600080fd5b5061084a612116565b60405161085791906145f2565b60405180910390f35b34801561086c57600080fd5b50610875612129565b60405161088291906149af565b60405180910390f35b34801561089757600080fd5b506108a061212e565b005b3480156108ae57600080fd5b506108c960048036038101906108c491906139f5565b6121d6565b005b3480156108d757600080fd5b506108f260048036038101906108ed91906137fc565b61226c565b005b34801561090057600080fd5b50610909612364565b60405161091691906149af565b60405180910390f35b34801561092b57600080fd5b50610946600480360381019061094191906139f5565b61236a565b005b600061095382612400565b9050919050565b60606000805461096990614c7e565b80601f016020809104026020016040519081016040528092919081815260200182805461099590614c7e565b80156109e25780601f106109b7576101008083540402835291602001916109e2565b820191906000526020600020905b8154815290600101906020018083116109c557829003601f168201915b5050505050905090565b60006109f78261247a565b610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d9061486f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e8054610a7e90614c7e565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaa90614c7e565b8015610af75780601f10610acc57610100808354040283529160200191610af7565b820191906000526020600020905b815481529060010190602001808311610ada57829003601f168201915b505050505081565b6000610b0a82611225565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b729061490f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b9a6124e6565b73ffffffffffffffffffffffffffffffffffffffff161480610bc95750610bc881610bc36124e6565b612082565b5b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff906147af565b60405180910390fd5b610c1283836124ee565b505050565b600881565b6000600880549050905090565b600d60019054906101000a900460ff1681565b610c4d610c476124e6565b826125a7565b610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c839061496f565b60405180910390fd5b610c97838383612685565b505050565b610ca46124e6565b73ffffffffffffffffffffffffffffffffffffffff16610cc26117ae565b73ffffffffffffffffffffffffffffffffffffffff1614610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f9061488f565b60405180910390fd5b6000610d22610c1c565b905060648110610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e906148af565b60405180910390fd5b60005b6064811015610d9b57610d88338284610d839190614ab3565b6128e1565b8080610d9390614cb0565b915050610d6a565b5050565b6000610daa8361165c565b8210610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de29061462f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e4c6124e6565b73ffffffffffffffffffffffffffffffffffffffff16610e6a6117ae565b73ffffffffffffffffffffffffffffffffffffffff1614610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb79061488f565b60405180910390fd5b6001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fc8651250df7c4c306e2bd9eb8d5a8e9a422a3101fb96cfa7f8e0c3a7df3b9b5181604051610f47919061458b565b60405180910390a150565b610f5a6124e6565b73ffffffffffffffffffffffffffffffffffffffff16610f786117ae565b73ffffffffffffffffffffffffffffffffffffffff1614610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc59061488f565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6110026124e6565b73ffffffffffffffffffffffffffffffffffffffff166110206117ae565b73ffffffffffffffffffffffffffffffffffffffff1614611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d9061488f565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110c1573d6000803e3d6000fd5b5050565b6110e083838360405180602001604052806000815250611b92565b505050565b60006110ef610c1c565b8210611130576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111279061498f565b60405180910390fd5b6008828154811061116a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600d60029054906101000a900460ff1681565b6111976124e6565b73ffffffffffffffffffffffffffffffffffffffff166111b56117ae565b73ffffffffffffffffffffffffffffffffffffffff161461120b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112029061488f565b60405180910390fd5b8060109080519060200190611221929190613620565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c5906147ef565b60405180910390fd5b80915050919050565b600b80546112e490614c7e565b80601f016020809104026020016040519081016040528092919081815260200182805461131090614c7e565b801561135d5780601f106113325761010080835404028352916020019161135d565b820191906000526020600020905b81548152906001019060200180831161134057829003601f168201915b505050505081565b600d60019054906101000a900460ff166113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab9061494f565b60405180910390fd5b600d60009054906101000a900460ff1615611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb9061478f565b60405180910390fd5b6004811115611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f9061484f565b60405180910390fd5b600481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114959190614ab3565b11156114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd906146af565b60405180910390fd5b600c54816114e2610c1c565b6114ec9190614ab3565b111561152d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115249061480f565b60405180910390fd5b348167011c37937e0800006115429190614b3a565b1115611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a9061472f565b60405180910390fd5b60005b818110156115ca576000611598610c1c565b9050600c546115a5610c1c565b10156115b6576115b533826128e1565b5b5080806115c290614cb0565b915050611586565b5080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116169190614ab3565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c4906147cf565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61171c6124e6565b73ffffffffffffffffffffffffffffffffffffffff1661173a6117ae565b73ffffffffffffffffffffffffffffffffffffffff1614611790576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117879061488f565b60405180910390fd5b61179a60006128ff565b565b6122b881565b67011c37937e08000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117e790614c7e565b80601f016020809104026020016040519081016040528092919081815260200182805461181390614c7e565b80156118605780601f1061183557610100808354040283529160200191611860565b820191906000526020600020905b81548152906001019060200180831161184357829003601f168201915b5050505050905090565b6118726124e6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d79061470f565b60405180910390fd5b80600560006118ed6124e6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661199a6124e6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119df91906145f2565b60405180910390a35050565b6119f36124e6565b73ffffffffffffffffffffffffffffffffffffffff16611a116117ae565b73ffffffffffffffffffffffffffffffffffffffff1614611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e9061488f565b60405180910390fd5b6001600d60026101000a81548160ff021916908315150217905550565b611a8c6124e6565b73ffffffffffffffffffffffffffffffffffffffff16611aaa6117ae565b73ffffffffffffffffffffffffffffffffffffffff1614611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af79061488f565b60405180910390fd5b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff4d05032556b7a946737f39b95e07890ce0335b8d0ea912ac5b9ed95710dbb8381604051611b87919061458b565b60405180910390a150565b611ba3611b9d6124e6565b836125a7565b611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd99061496f565b60405180910390fd5b611bee848484846129c5565b50505050565b600d60009054906101000a900460ff16611c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a9061474f565b60405180910390fd5b6008811115611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e9061492f565b60405180910390fd5b600881601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cd49190614ab3565b1115611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c906146cf565b60405180910390fd5b600c5481611d21610c1c565b611d2b9190614ab3565b1115611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d639061480f565b60405180910390fd5b348167011c37937e080000611d819190614b3a565b1115611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db99061472f565b60405180910390fd5b60005b81811015611e09576000611dd7610c1c565b9050600c54611de4610c1c565b1015611df557611df433826128e1565b5b508080611e0190614cb0565b915050611dc5565b5080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e559190614ab3565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600f8054611ea890614c7e565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed490614c7e565b8015611f215780601f10611ef657610100808354040283529160200191611f21565b820191906000526020600020905b815481529060010190602001808311611f0457829003601f168201915b505050505081565b6060611f348261247a565b611f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6a906148ef565b60405180910390fd5b60001515600d60029054906101000a900460ff161515141561202157600e8054611f9c90614c7e565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc890614c7e565b80156120155780601f10611fea57610100808354040283529160200191612015565b820191906000526020600020905b815481529060010190602001808311611ff857829003601f168201915b5050505050905061207d565b600061202b612a21565b9050600081511161204b5760405180602001604052806000815250612079565b8061205584612ab3565b600f6040516020016120699392919061455a565b6040516020818303038152906040525b9150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b600481565b6121366124e6565b73ffffffffffffffffffffffffffffffffffffffff166121546117ae565b73ffffffffffffffffffffffffffffffffffffffff16146121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a19061488f565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6121de6124e6565b73ffffffffffffffffffffffffffffffffffffffff166121fc6117ae565b73ffffffffffffffffffffffffffffffffffffffff1614612252576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122499061488f565b60405180910390fd5b80600e9080519060200190612268929190613620565b5050565b6122746124e6565b73ffffffffffffffffffffffffffffffffffffffff166122926117ae565b73ffffffffffffffffffffffffffffffffffffffff16146122e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122df9061488f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f9061466f565b60405180910390fd5b612361816128ff565b50565b600c5481565b6123726124e6565b73ffffffffffffffffffffffffffffffffffffffff166123906117ae565b73ffffffffffffffffffffffffffffffffffffffff16146123e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123dd9061488f565b60405180910390fd5b80600b90805190602001906123fc929190613620565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612473575061247282612c60565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661256183611225565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125b28261247a565b6125f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e89061476f565b60405180910390fd5b60006125fc83611225565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061266b57508373ffffffffffffffffffffffffffffffffffffffff16612653846109ec565b73ffffffffffffffffffffffffffffffffffffffff16145b8061267c575061267b8185612082565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126a582611225565b73ffffffffffffffffffffffffffffffffffffffff16146126fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f2906148cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561276b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612762906146ef565b60405180910390fd5b612776838383612d42565b6127816000826124ee565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127d19190614b94565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128289190614ab3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6128fb828260405180602001604052806000815250612d52565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129d0848484612685565b6129dc84848484612dad565b612a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a129061464f565b60405180910390fd5b50505050565b606060108054612a3090614c7e565b80601f0160208091040260200160405190810160405280929190818152602001828054612a5c90614c7e565b8015612aa95780601f10612a7e57610100808354040283529160200191612aa9565b820191906000526020600020905b815481529060010190602001808311612a8c57829003601f168201915b5050505050905090565b60606000821415612afb576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c5b565b600082905060005b60008214612b2d578080612b1690614cb0565b915050600a82612b269190614b09565b9150612b03565b60008167ffffffffffffffff811115612b6f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ba15781602001600182028036833780820191505090505b5090505b60008514612c5457600182612bba9190614b94565b9150600a85612bc99190614cf9565b6030612bd59190614ab3565b60f81b818381518110612c11577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c4d9190614b09565b9450612ba5565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d2b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d3b5750612d3a82612f44565b5b9050919050565b612d4d838383612fae565b505050565b612d5c83836130c2565b612d696000848484612dad565b612da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9f9061464f565b60405180910390fd5b505050565b6000612dce8473ffffffffffffffffffffffffffffffffffffffff16613290565b15612f37578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df76124e6565b8786866040518563ffffffff1660e01b8152600401612e1994939291906145a6565b602060405180830381600087803b158015612e3357600080fd5b505af1925050508015612e6457506040513d601f19601f82011682018060405250810190612e6191906139cc565b60015b612ee7573d8060008114612e94576040519150601f19603f3d011682016040523d82523d6000602084013e612e99565b606091505b50600081511415612edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed69061464f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f3c565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fb98383836132a3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ffc57612ff7816132a8565b61303b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461303a5761303983826132f1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561307e576130798161345e565b6130bd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130bc576130bb82826135a1565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613132576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131299061482f565b60405180910390fd5b61313b8161247a565b1561317b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131729061468f565b60405180910390fd5b61318760008383612d42565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131d79190614ab3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132fe8461165c565b6133089190614b94565b90506000600760008481526020019081526020016000205490508181146133ed576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134729190614b94565b90506000600960008481526020019081526020016000205490506000600883815481106134c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613510577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613585577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006135ac8361165c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461362c90614c7e565b90600052602060002090601f01602090048101928261364e5760008555613695565b82601f1061366757805160ff1916838001178555613695565b82800160010185558215613695579182015b82811115613694578251825591602001919060010190613679565b5b5090506136a291906136a6565b5090565b5b808211156136bf5760008160009055506001016136a7565b5090565b60006136d66136d1846149fb565b6149ca565b9050828152602081018484840111156136ee57600080fd5b6136f9848285614c3c565b509392505050565b600061371461370f84614a2b565b6149ca565b90508281526020810184848401111561372c57600080fd5b613737848285614c3c565b509392505050565b60008135905061374e81614df7565b92915050565b60008135905061376381614e0e565b92915050565b60008135905061377881614e25565b92915050565b60008151905061378d81614e25565b92915050565b600082601f8301126137a457600080fd5b81356137b48482602086016136c3565b91505092915050565b600082601f8301126137ce57600080fd5b81356137de848260208601613701565b91505092915050565b6000813590506137f681614e3c565b92915050565b60006020828403121561380e57600080fd5b600061381c8482850161373f565b91505092915050565b6000806040838503121561383857600080fd5b60006138468582860161373f565b92505060206138578582860161373f565b9150509250929050565b60008060006060848603121561387657600080fd5b60006138848682870161373f565b93505060206138958682870161373f565b92505060406138a6868287016137e7565b9150509250925092565b600080600080608085870312156138c657600080fd5b60006138d48782880161373f565b94505060206138e58782880161373f565b93505060406138f6878288016137e7565b925050606085013567ffffffffffffffff81111561391357600080fd5b61391f87828801613793565b91505092959194509250565b6000806040838503121561393e57600080fd5b600061394c8582860161373f565b925050602061395d85828601613754565b9150509250929050565b6000806040838503121561397a57600080fd5b60006139888582860161373f565b9250506020613999858286016137e7565b9150509250929050565b6000602082840312156139b557600080fd5b60006139c384828501613769565b91505092915050565b6000602082840312156139de57600080fd5b60006139ec8482850161377e565b91505092915050565b600060208284031215613a0757600080fd5b600082013567ffffffffffffffff811115613a2157600080fd5b613a2d848285016137bd565b91505092915050565b600060208284031215613a4857600080fd5b6000613a56848285016137e7565b91505092915050565b613a6881614bc8565b82525050565b613a7781614bda565b82525050565b6000613a8882614a70565b613a928185614a86565b9350613aa2818560208601614c4b565b613aab81614de6565b840191505092915050565b6000613ac182614a7b565b613acb8185614a97565b9350613adb818560208601614c4b565b613ae481614de6565b840191505092915050565b6000613afa82614a7b565b613b048185614aa8565b9350613b14818560208601614c4b565b80840191505092915050565b60008154613b2d81614c7e565b613b378186614aa8565b94506001821660008114613b525760018114613b6357613b96565b60ff19831686528186019350613b96565b613b6c85614a5b565b60005b83811015613b8e57815481890152600182019150602081019050613b6f565b838801955050505b50505092915050565b6000613bac602b83614a97565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613c12603283614a97565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613c78602683614a97565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cde601c83614a97565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613d1e602883614a97565b91507f4578636565646564206d61782070726573616c6520707572636861736520706560008301527f722077616c6c65740000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d84602683614a97565b91507f4578636565646564206d617820746f6b656e207075726368617365207065722060008301527f77616c6c657400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613dea602483614a97565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e50601983614a97565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613e90601f83614a97565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613ed0601b83614a97565b91507f53616c65206d7573742062652061637469766520746f206d696e7400000000006000830152602082019050919050565b6000613f10602c83614a97565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f76602783614a97565b91507f436f756c64206e6f74207072652d6d696e742061667465722073616c6520697360008301527f20616374697665000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fdc603883614a97565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614042602a83614a97565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006140a8602983614a97565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061410e602083614a97565b91507f507572636861736520776f756c6420657863656564206d617820737570706c796000830152602082019050919050565b600061414e602083614a97565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061418e601d83614a97565b91507f4578636565646564206d61782070726573616c652070757263686173650000006000830152602082019050919050565b60006141ce602c83614a97565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614234602083614a97565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614274603a83614a97565b91507f4d6f7265207468616e2031303020746f6b656e73206861766520616c7265616460008301527f79206265656e207265736572766564206f72206d696e7465642e0000000000006020830152604082019050919050565b60006142da602983614a97565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614340602f83614a97565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006143a6602183614a97565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061440c601b83614a97565b91507f4578636565646564206d617820746f6b656e20707572636861736500000000006000830152602082019050919050565b600061444c601e83614a97565b91507f50726553616c65206d7573742062652061637469766520746f206d696e7400006000830152602082019050919050565b600061448c603183614a97565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006144f2602c83614a97565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61455481614c32565b82525050565b60006145668286613aef565b91506145728285613aef565b915061457e8284613b20565b9150819050949350505050565b60006020820190506145a06000830184613a5f565b92915050565b60006080820190506145bb6000830187613a5f565b6145c86020830186613a5f565b6145d5604083018561454b565b81810360608301526145e78184613a7d565b905095945050505050565b60006020820190506146076000830184613a6e565b92915050565b600060208201905081810360008301526146278184613ab6565b905092915050565b6000602082019050818103600083015261464881613b9f565b9050919050565b6000602082019050818103600083015261466881613c05565b9050919050565b6000602082019050818103600083015261468881613c6b565b9050919050565b600060208201905081810360008301526146a881613cd1565b9050919050565b600060208201905081810360008301526146c881613d11565b9050919050565b600060208201905081810360008301526146e881613d77565b9050919050565b6000602082019050818103600083015261470881613ddd565b9050919050565b6000602082019050818103600083015261472881613e43565b9050919050565b6000602082019050818103600083015261474881613e83565b9050919050565b6000602082019050818103600083015261476881613ec3565b9050919050565b6000602082019050818103600083015261478881613f03565b9050919050565b600060208201905081810360008301526147a881613f69565b9050919050565b600060208201905081810360008301526147c881613fcf565b9050919050565b600060208201905081810360008301526147e881614035565b9050919050565b600060208201905081810360008301526148088161409b565b9050919050565b6000602082019050818103600083015261482881614101565b9050919050565b6000602082019050818103600083015261484881614141565b9050919050565b6000602082019050818103600083015261486881614181565b9050919050565b60006020820190508181036000830152614888816141c1565b9050919050565b600060208201905081810360008301526148a881614227565b9050919050565b600060208201905081810360008301526148c881614267565b9050919050565b600060208201905081810360008301526148e8816142cd565b9050919050565b6000602082019050818103600083015261490881614333565b9050919050565b6000602082019050818103600083015261492881614399565b9050919050565b60006020820190508181036000830152614948816143ff565b9050919050565b600060208201905081810360008301526149688161443f565b9050919050565b600060208201905081810360008301526149888161447f565b9050919050565b600060208201905081810360008301526149a8816144e5565b9050919050565b60006020820190506149c4600083018461454b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156149f1576149f0614db7565b5b8060405250919050565b600067ffffffffffffffff821115614a1657614a15614db7565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614a4657614a45614db7565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614abe82614c32565b9150614ac983614c32565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614afe57614afd614d2a565b5b828201905092915050565b6000614b1482614c32565b9150614b1f83614c32565b925082614b2f57614b2e614d59565b5b828204905092915050565b6000614b4582614c32565b9150614b5083614c32565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b8957614b88614d2a565b5b828202905092915050565b6000614b9f82614c32565b9150614baa83614c32565b925082821015614bbd57614bbc614d2a565b5b828203905092915050565b6000614bd382614c12565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c69578082015181840152602081019050614c4e565b83811115614c78576000848401525b50505050565b60006002820490506001821680614c9657607f821691505b60208210811415614caa57614ca9614d88565b5b50919050565b6000614cbb82614c32565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cee57614ced614d2a565b5b600182019050919050565b6000614d0482614c32565b9150614d0f83614c32565b925082614d1f57614d1e614d59565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614e0081614bc8565b8114614e0b57600080fd5b50565b614e1781614bda565b8114614e2257600080fd5b50565b614e2e81614be6565b8114614e3957600080fd5b50565b614e4581614c32565b8114614e5057600080fd5b5056fea264697066735822122055848daba8d74e1c8a2fbda5d7c04adc9521ebdc42a6c4f79e4fb7ba650ec9c764736f6c63430008000033

Deployed Bytecode Sourcemap

50036:5431:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51391:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28422:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29990:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50547:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29513:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50292:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44464:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50470:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30880:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52605:295;;;;;;;;;;;;;:::i;:::-;;44132:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53111:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52908:89;;;;;;;;;;;;;:::i;:::-;;55319:143;;;;;;;;;;;;;:::i;:::-;;31290:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44654:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50512:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51578:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28116:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50138:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53452:954;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27846:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41266:94;;;;;;;;;;;;;:::i;:::-;;50340:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50169:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40615:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28591:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30283:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50991:69;;;;;;;;;;;;;:::i;:::-;;53278:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31546:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54418:843;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50582:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51938:565;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30649:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50431:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50242:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53005:98;;;;;;;;;;;;;:::i;:::-;;51068:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41515:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50392:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51822:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51391:179;51502:4;51526:36;51550:11;51526:23;:36::i;:::-;51519:43;;51391:179;;;:::o;28422:100::-;28476:13;28509:5;28502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28422:100;:::o;29990:221::-;30066:7;30094:16;30102:7;30094;:16::i;:::-;30086:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30179:15;:24;30195:7;30179:24;;;;;;;;;;;;;;;;;;;;;30172:31;;29990:221;;;:::o;50547:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29513:411::-;29594:13;29610:23;29625:7;29610:14;:23::i;:::-;29594:39;;29658:5;29652:11;;:2;:11;;;;29644:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29752:5;29736:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29761:37;29778:5;29785:12;:10;:12::i;:::-;29761:16;:37::i;:::-;29736:62;29714:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29895:21;29904:2;29908:7;29895:8;:21::i;:::-;29513:411;;;:::o;50292:41::-;50332:1;50292:41;:::o;44464:113::-;44525:7;44552:10;:17;;;;44545:24;;44464:113;:::o;50470:35::-;;;;;;;;;;;;;:::o;30880:339::-;31075:41;31094:12;:10;:12::i;:::-;31108:7;31075:18;:41::i;:::-;31067:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31183:28;31193:4;31199:2;31203:7;31183:9;:28::i;:::-;30880:339;;;:::o;52605:295::-;40846:12;:10;:12::i;:::-;40835:23;;:7;:5;:7::i;:::-;:23;;;40827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52658:11:::1;52672:13;:11;:13::i;:::-;52658:27;;52713:3;52704:6;:12;52696:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;52790:6;52807:86;52823:3;52819:1;:7;52807:86;;;52848:33;52858:10;52879:1;52870:6;:10;;;;:::i;:::-;52848:9;:33::i;:::-;52828:3;;;;;:::i;:::-;;;;52807:86;;;40906:1;;52605:295::o:0;44132:256::-;44229:7;44265:23;44282:5;44265:16;:23::i;:::-;44257:5;:31;44249:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44354:12;:19;44367:5;44354:19;;;;;;;;;;;;;;;:26;44374:5;44354:26;;;;;;;;;;;;44347:33;;44132:256;;;;:::o;53111:155::-;40846:12;:10;:12::i;:::-;40835:23;;:7;:5;:7::i;:::-;:23;;;40827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53211:4:::1;53185:14;:23;53200:7;53185:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;53231:27;53250:7;53231:27;;;;;;:::i;:::-;;;;;;;;53111:155:::0;:::o;52908:89::-;40846:12;:10;:12::i;:::-;40835:23;;:7;:5;:7::i;:::-;:23;;;40827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52977:12:::1;;;;;;;;;;;52976:13;52961:12;;:28;;;;;;;;;;;;;;;;;;52908:89::o:0;55319:143::-;40846:12;:10;:12::i;:::-;40835:23;;:7;:5;:7::i;:::-;:23;;;40827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55367:15:::1;55385:21;55367:39;;55425:10;55417:28;;:37;55446:7;55417:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;40906:1;55319:143::o:0;31290:185::-;31428:39;31445:4;31451:2;31455:7;31428:39;;;;;;;;;;;;:16;:39::i;:::-;31290:185;;;:::o;44654:233::-;44729:7;44765:30;:28;:30::i;:::-;44757:5;:38;44749:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44862:10;44873:5;44862:17;;;;;;;;;;;;;;;;;;;;;;;;44855:24;;44654:233;;;:::o;50512:28::-;;;;;;;;;;;;;:::o;51578:111::-;40846:12;:10;:12::i;:::-;40835:23;;:7;:5;:7::i;:::-;:23;;;40827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51673:8:::1;51654:16;:27;;;;;;;;;;;;:::i;:::-;;51578:111:::0;:::o;28116:239::-;28188:7;28208:13;28224:7;:16;28232:7;28224:16;;;;;;;;;;;;;;;;;;;;;28208:32;;28276:1;28259:19;;:5;:19;;;;28251:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28342:5;28335:12;;;28116:239;;;:::o;50138:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53452:954::-;53529:15;;;;;;;;;;;53521:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53599:12;;;;;;;;;;;53598:13;53590:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50284:1;53674:14;:36;;53666:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50284:1;53794:14;53763:16;:28;53780:10;53763:28;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;:67;;53755:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;53928:10;;53910:14;53894:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;53886:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;54025:9;54007:14;50206:17;53994:27;;;;:::i;:::-;:40;;53986:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;54095:6;54091:211;54111:14;54107:1;:18;54091:211;;;54147:14;54164:13;:11;:13::i;:::-;54147:30;;54212:10;;54196:13;:11;:13::i;:::-;:26;54192:99;;;54243:32;54253:10;54265:9;54243;:32::i;:::-;54192:99;54091:211;54127:3;;;;;:::i;:::-;;;;54091:211;;;;54384:14;54353:16;:28;54370:10;54353:28;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;54322:16;:28;54339:10;54322:28;;;;;;;;;;;;;;;:76;;;;53452:954;:::o;27846:208::-;27918:7;27963:1;27946:19;;:5;:19;;;;27938:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28030:9;:16;28040:5;28030:16;;;;;;;;;;;;;;;;28023:23;;27846:208;;;:::o;41266:94::-;40846:12;:10;:12::i;:::-;40835:23;;:7;:5;:7::i;:::-;:23;;;40827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41331:21:::1;41349:1;41331:9;:21::i;:::-;41266:94::o:0;50340:45::-;50381:4;50340:45;:::o;50169:54::-;50206:17;50169:54;:::o;40615:87::-;40661:7;40688:6;;;;;;;;;;;40681:13;;40615:87;:::o;28591:104::-;28647:13;28680:7;28673:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28591:104;:::o;30283:295::-;30398:12;:10;:12::i;:::-;30386:24;;:8;:24;;;;30378:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30498:8;30453:18;:32;30472:12;:10;:12::i;:::-;30453:32;;;;;;;;;;;;;;;:42;30486:8;30453:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30551:8;30522:48;;30537:12;:10;:12::i;:::-;30522:48;;;30561:8;30522:48;;;;;;:::i;:::-;;;;;;;;30283:295;;:::o;50991:69::-;40846:12;:10;:12::i;:::-;40835:23;;:7;:5;:7::i;:::-;:23;;;40827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51048:4:::1;51037:8;;:15;;;;;;;;;;;;;;;;;;50991:69::o:0;53278:162::-;40846:12;:10;:12::i;:::-;40835:23;;:7;:5;:7::i;:::-;:23;;;40827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53381:5:::1;53355:14;:23;53370:7;53355:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;53402:30;53424:7;53402:30;;;;;;:::i;:::-;;;;;;;;53278:162:::0;:::o;31546:328::-;31721:41;31740:12;:10;:12::i;:::-;31754:7;31721:18;:41::i;:::-;31713:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31827:39;31841:4;31847:2;31851:7;31860:5;31827:13;:39::i;:::-;31546:328;;;;:::o;54418:843::-;54492:12;;;;;;;;;;;54484:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;50332:1;54555:14;:34;;54547:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50332:1;54671:14;54640:16;:28;54657:10;54640:28;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;:65;;54632:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;54801:10;;54783:14;54767:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;54759:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;54898:9;54880:14;50206:17;54867:27;;;;:::i;:::-;:40;;54859:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;54960:6;54956:211;54976:14;54972:1;:18;54956:211;;;55012:14;55029:13;:11;:13::i;:::-;55012:30;;55077:10;;55061:13;:11;:13::i;:::-;:26;55057:99;;;55108:32;55118:10;55130:9;55108;:32::i;:::-;55057:99;54956:211;54992:3;;;;;:::i;:::-;;;;54956:211;;;;55239:14;55208:16;:28;55225:10;55208:28;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;55177:16;:28;55194:10;55177:28;;;;;;;;;;;;;;;:76;;;;54418:843;:::o;50582:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51938:565::-;52056:13;52105:16;52113:7;52105;:16::i;:::-;52087:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;52228:5;52216:17;;:8;;;;;;;;;;;:17;;;52213:70;;;52257:14;52250:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52213:70;52295:28;52326:10;:8;:10::i;:::-;52295:41;;52385:1;52360:14;52354:28;:32;:141;;;;;;;;;;;;;;;;;52426:14;52442:18;:7;:16;:18::i;:::-;52462:13;52409:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52354:141;52347:148;;;51938:565;;;;:::o;30649:164::-;30746:4;30770:18;:25;30789:5;30770:25;;;;;;;;;;;;;;;:35;30796:8;30770:35;;;;;;;;;;;;;;;;;;;;;;;;;30763:42;;30649:164;;;;:::o;50431:32::-;;;;;;;;;;;;;:::o;50242:43::-;50284:1;50242:43;:::o;53005:98::-;40846:12;:10;:12::i;:::-;40835:23;;:7;:5;:7::i;:::-;:23;;;40827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53080:15:::1;;;;;;;;;;;53079:16;53061:15;;:34;;;;;;;;;;;;;;;;;;53005:98::o:0;51068:126::-;40846:12;:10;:12::i;:::-;40835:23;;:7;:5;:7::i;:::-;:23;;;40827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51171:15:::1;51154:14;:32;;;;;;;;;;;;:::i;:::-;;51068:126:::0;:::o;41515:192::-;40846:12;:10;:12::i;:::-;40835:23;;:7;:5;:7::i;:::-;:23;;;40827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41624:1:::1;41604:22;;:8;:22;;;;41596:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41680:19;41690:8;41680:9;:19::i;:::-;41515:192:::0;:::o;50392:32::-;;;;:::o;51822:108::-;40846:12;:10;:12::i;:::-;40835:23;;:7;:5;:7::i;:::-;:23;;;40827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51912:10:::1;51899;:23;;;;;;;;;;;;:::i;:::-;;51822:108:::0;:::o;43824:224::-;43926:4;43965:35;43950:50;;;:11;:50;;;;:90;;;;44004:36;44028:11;44004:23;:36::i;:::-;43950:90;43943:97;;43824:224;;;:::o;33384:127::-;33449:4;33501:1;33473:30;;:7;:16;33481:7;33473:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33466:37;;33384:127;;;:::o;15935:98::-;15988:7;16015:10;16008:17;;15935:98;:::o;37366:174::-;37468:2;37441:15;:24;37457:7;37441:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37524:7;37520:2;37486:46;;37495:23;37510:7;37495:14;:23::i;:::-;37486:46;;;;;;;;;;;;37366:174;;:::o;33678:348::-;33771:4;33796:16;33804:7;33796;:16::i;:::-;33788:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33872:13;33888:23;33903:7;33888:14;:23::i;:::-;33872:39;;33941:5;33930:16;;:7;:16;;;:51;;;;33974:7;33950:31;;:20;33962:7;33950:11;:20::i;:::-;:31;;;33930:51;:87;;;;33985:32;34002:5;34009:7;33985:16;:32::i;:::-;33930:87;33922:96;;;33678:348;;;;:::o;36670:578::-;36829:4;36802:31;;:23;36817:7;36802:14;:23::i;:::-;:31;;;36794:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36912:1;36898:16;;:2;:16;;;;36890:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36968:39;36989:4;36995:2;36999:7;36968:20;:39::i;:::-;37072:29;37089:1;37093:7;37072:8;:29::i;:::-;37133:1;37114:9;:15;37124:4;37114:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37162:1;37145:9;:13;37155:2;37145:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37193:2;37174:7;:16;37182:7;37174:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37232:7;37228:2;37213:27;;37222:4;37213:27;;;;;;;;;;;;36670:578;;;:::o;34368:110::-;34444:26;34454:2;34458:7;34444:26;;;;;;;;;;;;:9;:26::i;:::-;34368:110;;:::o;41715:173::-;41771:16;41790:6;;;;;;;;;;;41771:25;;41816:8;41807:6;;:17;;;;;;;;;;;;;;;;;;41871:8;41840:40;;41861:8;41840:40;;;;;;;;;;;;41715:173;;:::o;32756:315::-;32913:28;32923:4;32929:2;32933:7;32913:9;:28::i;:::-;32960:48;32983:4;32989:2;32993:7;33002:5;32960:22;:48::i;:::-;32952:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32756:315;;;;:::o;51697:117::-;51757:13;51790:16;51783:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51697:117;:::o;23416:723::-;23472:13;23702:1;23693:5;:10;23689:53;;;23720:10;;;;;;;;;;;;;;;;;;;;;23689:53;23752:12;23767:5;23752:20;;23783:14;23808:78;23823:1;23815:4;:9;23808:78;;23841:8;;;;;:::i;:::-;;;;23872:2;23864:10;;;;;:::i;:::-;;;23808:78;;;23896:19;23928:6;23918:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23896:39;;23946:154;23962:1;23953:5;:10;23946:154;;23990:1;23980:11;;;;;:::i;:::-;;;24057:2;24049:5;:10;;;;:::i;:::-;24036:2;:24;;;;:::i;:::-;24023:39;;24006:6;24013;24006:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;24086:2;24077:11;;;;;:::i;:::-;;;23946:154;;;24124:6;24110:21;;;;;23416:723;;;;:::o;27477:305::-;27579:4;27631:25;27616:40;;;:11;:40;;;;:105;;;;27688:33;27673:48;;;:11;:48;;;;27616:105;:158;;;;27738:36;27762:11;27738:23;:36::i;:::-;27616:158;27596:178;;27477:305;;;:::o;51202:181::-;51330:45;51357:4;51363:2;51367:7;51330:26;:45::i;:::-;51202:181;;;:::o;34705:321::-;34835:18;34841:2;34845:7;34835:5;:18::i;:::-;34886:54;34917:1;34921:2;34925:7;34934:5;34886:22;:54::i;:::-;34864:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34705:321;;;:::o;38105:803::-;38260:4;38281:15;:2;:13;;;:15::i;:::-;38277:624;;;38333:2;38317:36;;;38354:12;:10;:12::i;:::-;38368:4;38374:7;38383:5;38317:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38313:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38580:1;38563:6;:13;:18;38559:272;;;38606:60;;;;;;;;;;:::i;:::-;;;;;;;;38559:272;38781:6;38775:13;38766:6;38762:2;38758:15;38751:38;38313:533;38450:45;;;38440:55;;;:6;:55;;;;38433:62;;;;;38277:624;38885:4;38878:11;;38105:803;;;;;;;:::o;25977:157::-;26062:4;26101:25;26086:40;;;:11;:40;;;;26079:47;;25977:157;;;:::o;45500:589::-;45644:45;45671:4;45677:2;45681:7;45644:26;:45::i;:::-;45722:1;45706:18;;:4;:18;;;45702:187;;;45741:40;45773:7;45741:31;:40::i;:::-;45702:187;;;45811:2;45803:10;;:4;:10;;;45799:90;;45830:47;45863:4;45869:7;45830:32;:47::i;:::-;45799:90;45702:187;45917:1;45903:16;;:2;:16;;;45899:183;;;45936:45;45973:7;45936:36;:45::i;:::-;45899:183;;;46009:4;46003:10;;:2;:10;;;45999:83;;46030:40;46058:2;46062:7;46030:27;:40::i;:::-;45999:83;45899:183;45500:589;;;:::o;35362:382::-;35456:1;35442:16;;:2;:16;;;;35434:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35515:16;35523:7;35515;:16::i;:::-;35514:17;35506:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35577:45;35606:1;35610:2;35614:7;35577:20;:45::i;:::-;35652:1;35635:9;:13;35645:2;35635:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35683:2;35664:7;:16;35672:7;35664:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35728:7;35724:2;35703:33;;35720:1;35703:33;;;;;;;;;;;;35362:382;;:::o;8191:387::-;8251:4;8459:12;8526:7;8514:20;8506:28;;8569:1;8562:4;:8;8555:15;;;8191:387;;;:::o;39480:126::-;;;;:::o;46812:164::-;46916:10;:17;;;;46889:15;:24;46905:7;46889:24;;;;;;;;;;;:44;;;;46944:10;46960:7;46944:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46812:164;:::o;47603:988::-;47869:22;47919:1;47894:22;47911:4;47894:16;:22::i;:::-;:26;;;;:::i;:::-;47869:51;;47931:18;47952:17;:26;47970:7;47952:26;;;;;;;;;;;;47931:47;;48099:14;48085:10;:28;48081:328;;48130:19;48152:12;:18;48165:4;48152:18;;;;;;;;;;;;;;;:34;48171:14;48152:34;;;;;;;;;;;;48130:56;;48236:11;48203:12;:18;48216:4;48203:18;;;;;;;;;;;;;;;:30;48222:10;48203:30;;;;;;;;;;;:44;;;;48353:10;48320:17;:30;48338:11;48320:30;;;;;;;;;;;:43;;;;48081:328;;48505:17;:26;48523:7;48505:26;;;;;;;;;;;48498:33;;;48549:12;:18;48562:4;48549:18;;;;;;;;;;;;;;;:34;48568:14;48549:34;;;;;;;;;;;48542:41;;;47603:988;;;;:::o;48886:1079::-;49139:22;49184:1;49164:10;:17;;;;:21;;;;:::i;:::-;49139:46;;49196:18;49217:15;:24;49233:7;49217:24;;;;;;;;;;;;49196:45;;49568:19;49590:10;49601:14;49590:26;;;;;;;;;;;;;;;;;;;;;;;;49568:48;;49654:11;49629:10;49640;49629:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;49765:10;49734:15;:28;49750:11;49734:28;;;;;;;;;;;:41;;;;49906:15;:24;49922:7;49906:24;;;;;;;;;;;49899:31;;;49941:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48886:1079;;;;:::o;46390:221::-;46475:14;46492:20;46509:2;46492:16;:20::i;:::-;46475:37;;46550:7;46523:12;:16;46536:2;46523:16;;;;;;;;;;;;;;;:24;46540:6;46523:24;;;;;;;;;;;:34;;;;46597:6;46568:17;:26;46586:7;46568:26;;;;;;;;;;;:35;;;;46390:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7466:845::-;;7606:5;7600:12;7635:36;7661:9;7635:36;:::i;:::-;7687:89;7769:6;7764:3;7687:89;:::i;:::-;7680:96;;7807:1;7796:9;7792:17;7823:1;7818:137;;;;7969:1;7964:341;;;;7785:520;;7818:137;7902:4;7898:9;7887;7883:25;7878:3;7871:38;7938:6;7933:3;7929:16;7922:23;;7818:137;;7964:341;8031:38;8063:5;8031:38;:::i;:::-;8091:1;8105:154;8119:6;8116:1;8113:13;8105:154;;;8193:7;8187:14;8183:1;8178:3;8174:11;8167:35;8243:1;8234:7;8230:15;8219:26;;8141:4;8138:1;8134:12;8129:17;;8105:154;;;8288:6;8283:3;8279:16;8272:23;;7971:334;;7785:520;;7573:738;;;;;;:::o;8317:375::-;;8480:67;8544:2;8539:3;8480:67;:::i;:::-;8473:74;;8577:34;8573:1;8568:3;8564:11;8557:55;8643:13;8638:2;8633:3;8629:12;8622:35;8683:2;8678:3;8674:12;8667:19;;8463:229;;;:::o;8698:382::-;;8861:67;8925:2;8920:3;8861:67;:::i;:::-;8854:74;;8958:34;8954:1;8949:3;8945:11;8938:55;9024:20;9019:2;9014:3;9010:12;9003:42;9071:2;9066:3;9062:12;9055:19;;8844:236;;;:::o;9086:370::-;;9249:67;9313:2;9308:3;9249:67;:::i;:::-;9242:74;;9346:34;9342:1;9337:3;9333:11;9326:55;9412:8;9407:2;9402:3;9398:12;9391:30;9447:2;9442:3;9438:12;9431:19;;9232:224;;;:::o;9462:326::-;;9625:67;9689:2;9684:3;9625:67;:::i;:::-;9618:74;;9722:30;9718:1;9713:3;9709:11;9702:51;9779:2;9774:3;9770:12;9763:19;;9608:180;;;:::o;9794:372::-;;9957:67;10021:2;10016:3;9957:67;:::i;:::-;9950:74;;10054:34;10050:1;10045:3;10041:11;10034:55;10120:10;10115:2;10110:3;10106:12;10099:32;10157:2;10152:3;10148:12;10141:19;;9940:226;;;:::o;10172:370::-;;10335:67;10399:2;10394:3;10335:67;:::i;:::-;10328:74;;10432:34;10428:1;10423:3;10419:11;10412:55;10498:8;10493:2;10488:3;10484:12;10477:30;10533:2;10528:3;10524:12;10517:19;;10318:224;;;:::o;10548:368::-;;10711:67;10775:2;10770:3;10711:67;:::i;:::-;10704:74;;10808:34;10804:1;10799:3;10795:11;10788:55;10874:6;10869:2;10864:3;10860:12;10853:28;10907:2;10902:3;10898:12;10891:19;;10694:222;;;:::o;10922:323::-;;11085:67;11149:2;11144:3;11085:67;:::i;:::-;11078:74;;11182:27;11178:1;11173:3;11169:11;11162:48;11236:2;11231:3;11227:12;11220:19;;11068:177;;;:::o;11251:329::-;;11414:67;11478:2;11473:3;11414:67;:::i;:::-;11407:74;;11511:33;11507:1;11502:3;11498:11;11491:54;11571:2;11566:3;11562:12;11555:19;;11397:183;;;:::o;11586:325::-;;11749:67;11813:2;11808:3;11749:67;:::i;:::-;11742:74;;11846:29;11842:1;11837:3;11833:11;11826:50;11902:2;11897:3;11893:12;11886:19;;11732:179;;;:::o;11917:376::-;;12080:67;12144:2;12139:3;12080:67;:::i;:::-;12073:74;;12177:34;12173:1;12168:3;12164:11;12157:55;12243:14;12238:2;12233:3;12229:12;12222:36;12284:2;12279:3;12275:12;12268:19;;12063:230;;;:::o;12299:371::-;;12462:67;12526:2;12521:3;12462:67;:::i;:::-;12455:74;;12559:34;12555:1;12550:3;12546:11;12539:55;12625:9;12620:2;12615:3;12611:12;12604:31;12661:2;12656:3;12652:12;12645:19;;12445:225;;;:::o;12676:388::-;;12839:67;12903:2;12898:3;12839:67;:::i;:::-;12832:74;;12936:34;12932:1;12927:3;12923:11;12916:55;13002:26;12997:2;12992:3;12988:12;12981:48;13055:2;13050:3;13046:12;13039:19;;12822:242;;;:::o;13070:374::-;;13233:67;13297:2;13292:3;13233:67;:::i;:::-;13226:74;;13330:34;13326:1;13321:3;13317:11;13310:55;13396:12;13391:2;13386:3;13382:12;13375:34;13435:2;13430:3;13426:12;13419:19;;13216:228;;;:::o;13450:373::-;;13613:67;13677:2;13672:3;13613:67;:::i;:::-;13606:74;;13710:34;13706:1;13701:3;13697:11;13690:55;13776:11;13771:2;13766:3;13762:12;13755:33;13814:2;13809:3;13805:12;13798:19;;13596:227;;;:::o;13829:330::-;;13992:67;14056:2;14051:3;13992:67;:::i;:::-;13985:74;;14089:34;14085:1;14080:3;14076:11;14069:55;14150:2;14145:3;14141:12;14134:19;;13975:184;;;:::o;14165:330::-;;14328:67;14392:2;14387:3;14328:67;:::i;:::-;14321:74;;14425:34;14421:1;14416:3;14412:11;14405:55;14486:2;14481:3;14477:12;14470:19;;14311:184;;;:::o;14501:327::-;;14664:67;14728:2;14723:3;14664:67;:::i;:::-;14657:74;;14761:31;14757:1;14752:3;14748:11;14741:52;14819:2;14814:3;14810:12;14803:19;;14647:181;;;:::o;14834:376::-;;14997:67;15061:2;15056:3;14997:67;:::i;:::-;14990:74;;15094:34;15090:1;15085:3;15081:11;15074:55;15160:14;15155:2;15150:3;15146:12;15139:36;15201:2;15196:3;15192:12;15185:19;;14980:230;;;:::o;15216:330::-;;15379:67;15443:2;15438:3;15379:67;:::i;:::-;15372:74;;15476:34;15472:1;15467:3;15463:11;15456:55;15537:2;15532:3;15528:12;15521:19;;15362:184;;;:::o;15552:390::-;;15715:67;15779:2;15774:3;15715:67;:::i;:::-;15708:74;;15812:34;15808:1;15803:3;15799:11;15792:55;15878:28;15873:2;15868:3;15864:12;15857:50;15933:2;15928:3;15924:12;15917:19;;15698:244;;;:::o;15948:373::-;;16111:67;16175:2;16170:3;16111:67;:::i;:::-;16104:74;;16208:34;16204:1;16199:3;16195:11;16188:55;16274:11;16269:2;16264:3;16260:12;16253:33;16312:2;16307:3;16303:12;16296:19;;16094:227;;;:::o;16327:379::-;;16490:67;16554:2;16549:3;16490:67;:::i;:::-;16483:74;;16587:34;16583:1;16578:3;16574:11;16567:55;16653:17;16648:2;16643:3;16639:12;16632:39;16697:2;16692:3;16688:12;16681:19;;16473:233;;;:::o;16712:365::-;;16875:67;16939:2;16934:3;16875:67;:::i;:::-;16868:74;;16972:34;16968:1;16963:3;16959:11;16952:55;17038:3;17033:2;17028:3;17024:12;17017:25;17068:2;17063:3;17059:12;17052:19;;16858:219;;;:::o;17083:325::-;;17246:67;17310:2;17305:3;17246:67;:::i;:::-;17239:74;;17343:29;17339:1;17334:3;17330:11;17323:50;17399:2;17394:3;17390:12;17383:19;;17229:179;;;:::o;17414:328::-;;17577:67;17641:2;17636:3;17577:67;:::i;:::-;17570:74;;17674:32;17670:1;17665:3;17661:11;17654:53;17733:2;17728:3;17724:12;17717:19;;17560:182;;;:::o;17748:381::-;;17911:67;17975:2;17970:3;17911:67;:::i;:::-;17904:74;;18008:34;18004:1;17999:3;17995:11;17988:55;18074:19;18069:2;18064:3;18060:12;18053:41;18120:2;18115:3;18111:12;18104:19;;17894:235;;;:::o;18135:376::-;;18298:67;18362:2;18357:3;18298:67;:::i;:::-;18291:74;;18395:34;18391:1;18386:3;18382:11;18375:55;18461:14;18456:2;18451:3;18447:12;18440:36;18502:2;18497:3;18493:12;18486:19;;18281:230;;;:::o;18517:118::-;18604:24;18622:5;18604:24;:::i;:::-;18599:3;18592:37;18582:53;;:::o;18641:589::-;;18888:95;18979:3;18970:6;18888:95;:::i;:::-;18881:102;;19000:95;19091:3;19082:6;19000:95;:::i;:::-;18993:102;;19112:92;19200:3;19191:6;19112:92;:::i;:::-;19105:99;;19221:3;19214:10;;18870:360;;;;;;:::o;19236:222::-;;19367:2;19356:9;19352:18;19344:26;;19380:71;19448:1;19437:9;19433:17;19424:6;19380:71;:::i;:::-;19334:124;;;;:::o;19464:640::-;;19697:3;19686:9;19682:19;19674:27;;19711:71;19779:1;19768:9;19764:17;19755:6;19711:71;:::i;:::-;19792:72;19860:2;19849:9;19845:18;19836:6;19792:72;:::i;:::-;19874;19942:2;19931:9;19927:18;19918:6;19874:72;:::i;:::-;19993:9;19987:4;19983:20;19978:2;19967:9;19963:18;19956:48;20021:76;20092:4;20083:6;20021:76;:::i;:::-;20013:84;;19664:440;;;;;;;:::o;20110:210::-;;20235:2;20224:9;20220:18;20212:26;;20248:65;20310:1;20299:9;20295:17;20286:6;20248:65;:::i;:::-;20202:118;;;;:::o;20326:313::-;;20477:2;20466:9;20462:18;20454:26;;20526:9;20520:4;20516:20;20512:1;20501:9;20497:17;20490:47;20554:78;20627:4;20618:6;20554:78;:::i;:::-;20546:86;;20444:195;;;;:::o;20645:419::-;;20849:2;20838:9;20834:18;20826:26;;20898:9;20892:4;20888:20;20884:1;20873:9;20869:17;20862:47;20926:131;21052:4;20926:131;:::i;:::-;20918:139;;20816:248;;;:::o;21070:419::-;;21274:2;21263:9;21259:18;21251:26;;21323:9;21317:4;21313:20;21309:1;21298:9;21294:17;21287:47;21351:131;21477:4;21351:131;:::i;:::-;21343:139;;21241:248;;;:::o;21495:419::-;;21699:2;21688:9;21684:18;21676:26;;21748:9;21742:4;21738:20;21734:1;21723:9;21719:17;21712:47;21776:131;21902:4;21776:131;:::i;:::-;21768:139;;21666:248;;;:::o;21920:419::-;;22124:2;22113:9;22109:18;22101:26;;22173:9;22167:4;22163:20;22159:1;22148:9;22144:17;22137:47;22201:131;22327:4;22201:131;:::i;:::-;22193:139;;22091:248;;;:::o;22345:419::-;;22549:2;22538:9;22534:18;22526:26;;22598:9;22592:4;22588:20;22584:1;22573:9;22569:17;22562:47;22626:131;22752:4;22626:131;:::i;:::-;22618:139;;22516:248;;;:::o;22770:419::-;;22974:2;22963:9;22959:18;22951:26;;23023:9;23017:4;23013:20;23009:1;22998:9;22994:17;22987:47;23051:131;23177:4;23051:131;:::i;:::-;23043:139;;22941:248;;;:::o;23195:419::-;;23399:2;23388:9;23384:18;23376:26;;23448:9;23442:4;23438:20;23434:1;23423:9;23419:17;23412:47;23476:131;23602:4;23476:131;:::i;:::-;23468:139;;23366:248;;;:::o;23620:419::-;;23824:2;23813:9;23809:18;23801:26;;23873:9;23867:4;23863:20;23859:1;23848:9;23844:17;23837:47;23901:131;24027:4;23901:131;:::i;:::-;23893:139;;23791:248;;;:::o;24045:419::-;;24249:2;24238:9;24234:18;24226:26;;24298:9;24292:4;24288:20;24284:1;24273:9;24269:17;24262:47;24326:131;24452:4;24326:131;:::i;:::-;24318:139;;24216:248;;;:::o;24470:419::-;;24674:2;24663:9;24659:18;24651:26;;24723:9;24717:4;24713:20;24709:1;24698:9;24694:17;24687:47;24751:131;24877:4;24751:131;:::i;:::-;24743:139;;24641:248;;;:::o;24895:419::-;;25099:2;25088:9;25084:18;25076:26;;25148:9;25142:4;25138:20;25134:1;25123:9;25119:17;25112:47;25176:131;25302:4;25176:131;:::i;:::-;25168:139;;25066:248;;;:::o;25320:419::-;;25524:2;25513:9;25509:18;25501:26;;25573:9;25567:4;25563:20;25559:1;25548:9;25544:17;25537:47;25601:131;25727:4;25601:131;:::i;:::-;25593:139;;25491:248;;;:::o;25745:419::-;;25949:2;25938:9;25934:18;25926:26;;25998:9;25992:4;25988:20;25984:1;25973:9;25969:17;25962:47;26026:131;26152:4;26026:131;:::i;:::-;26018:139;;25916:248;;;:::o;26170:419::-;;26374:2;26363:9;26359:18;26351:26;;26423:9;26417:4;26413:20;26409:1;26398:9;26394:17;26387:47;26451:131;26577:4;26451:131;:::i;:::-;26443:139;;26341:248;;;:::o;26595:419::-;;26799:2;26788:9;26784:18;26776:26;;26848:9;26842:4;26838:20;26834:1;26823:9;26819:17;26812:47;26876:131;27002:4;26876:131;:::i;:::-;26868:139;;26766:248;;;:::o;27020:419::-;;27224:2;27213:9;27209:18;27201:26;;27273:9;27267:4;27263:20;27259:1;27248:9;27244:17;27237:47;27301:131;27427:4;27301:131;:::i;:::-;27293:139;;27191:248;;;:::o;27445:419::-;;27649:2;27638:9;27634:18;27626:26;;27698:9;27692:4;27688:20;27684:1;27673:9;27669:17;27662:47;27726:131;27852:4;27726:131;:::i;:::-;27718:139;;27616:248;;;:::o;27870:419::-;;28074:2;28063:9;28059:18;28051:26;;28123:9;28117:4;28113:20;28109:1;28098:9;28094:17;28087:47;28151:131;28277:4;28151:131;:::i;:::-;28143:139;;28041:248;;;:::o;28295:419::-;;28499:2;28488:9;28484:18;28476:26;;28548:9;28542:4;28538:20;28534:1;28523:9;28519:17;28512:47;28576:131;28702:4;28576:131;:::i;:::-;28568:139;;28466:248;;;:::o;28720:419::-;;28924:2;28913:9;28909:18;28901:26;;28973:9;28967:4;28963:20;28959:1;28948:9;28944:17;28937:47;29001:131;29127:4;29001:131;:::i;:::-;28993:139;;28891:248;;;:::o;29145:419::-;;29349:2;29338:9;29334:18;29326:26;;29398:9;29392:4;29388:20;29384:1;29373:9;29369:17;29362:47;29426:131;29552:4;29426:131;:::i;:::-;29418:139;;29316:248;;;:::o;29570:419::-;;29774:2;29763:9;29759:18;29751:26;;29823:9;29817:4;29813:20;29809:1;29798:9;29794:17;29787:47;29851:131;29977:4;29851:131;:::i;:::-;29843:139;;29741:248;;;:::o;29995:419::-;;30199:2;30188:9;30184:18;30176:26;;30248:9;30242:4;30238:20;30234:1;30223:9;30219:17;30212:47;30276:131;30402:4;30276:131;:::i;:::-;30268:139;;30166:248;;;:::o;30420:419::-;;30624:2;30613:9;30609:18;30601:26;;30673:9;30667:4;30663:20;30659:1;30648:9;30644:17;30637:47;30701:131;30827:4;30701:131;:::i;:::-;30693:139;;30591:248;;;:::o;30845:419::-;;31049:2;31038:9;31034:18;31026:26;;31098:9;31092:4;31088:20;31084:1;31073:9;31069:17;31062:47;31126:131;31252:4;31126:131;:::i;:::-;31118:139;;31016:248;;;:::o;31270:419::-;;31474:2;31463:9;31459:18;31451:26;;31523:9;31517:4;31513:20;31509:1;31498:9;31494:17;31487:47;31551:131;31677:4;31551:131;:::i;:::-;31543:139;;31441:248;;;:::o;31695:419::-;;31899:2;31888:9;31884:18;31876:26;;31948:9;31942:4;31938:20;31934:1;31923:9;31919:17;31912:47;31976:131;32102:4;31976:131;:::i;:::-;31968:139;;31866:248;;;:::o;32120:419::-;;32324:2;32313:9;32309:18;32301:26;;32373:9;32367:4;32363:20;32359:1;32348:9;32344:17;32337:47;32401:131;32527:4;32401:131;:::i;:::-;32393:139;;32291:248;;;:::o;32545:222::-;;32676:2;32665:9;32661:18;32653:26;;32689:71;32757:1;32746:9;32742:17;32733:6;32689:71;:::i;:::-;32643:124;;;;:::o;32773:283::-;;32839:2;32833:9;32823:19;;32881:4;32873:6;32869:17;32988:6;32976:10;32973:22;32952:18;32940:10;32937:34;32934:62;32931:2;;;32999:18;;:::i;:::-;32931:2;33039:10;33035:2;33028:22;32813:243;;;;:::o;33062:331::-;;33213:18;33205:6;33202:30;33199:2;;;33235:18;;:::i;:::-;33199:2;33320:4;33316:9;33309:4;33301:6;33297:17;33293:33;33285:41;;33381:4;33375;33371:15;33363:23;;33128:265;;;:::o;33399:332::-;;33551:18;33543:6;33540:30;33537:2;;;33573:18;;:::i;:::-;33537:2;33658:4;33654:9;33647:4;33639:6;33635:17;33631:33;33623:41;;33719:4;33713;33709:15;33701:23;;33466:265;;;:::o;33737:141::-;;33809:3;33801:11;;33832:3;33829:1;33822:14;33866:4;33863:1;33853:18;33845:26;;33791:87;;;:::o;33884:98::-;;33969:5;33963:12;33953:22;;33942:40;;;:::o;33988:99::-;;34074:5;34068:12;34058:22;;34047:40;;;:::o;34093:168::-;;34210:6;34205:3;34198:19;34250:4;34245:3;34241:14;34226:29;;34188:73;;;;:::o;34267:169::-;;34385:6;34380:3;34373:19;34425:4;34420:3;34416:14;34401:29;;34363:73;;;;:::o;34442:148::-;;34581:3;34566:18;;34556:34;;;;:::o;34596:305::-;;34655:20;34673:1;34655:20;:::i;:::-;34650:25;;34689:20;34707:1;34689:20;:::i;:::-;34684:25;;34843:1;34775:66;34771:74;34768:1;34765:81;34762:2;;;34849:18;;:::i;:::-;34762:2;34893:1;34890;34886:9;34879:16;;34640:261;;;;:::o;34907:185::-;;34964:20;34982:1;34964:20;:::i;:::-;34959:25;;34998:20;35016:1;34998:20;:::i;:::-;34993:25;;35037:1;35027:2;;35042:18;;:::i;:::-;35027:2;35084:1;35081;35077:9;35072:14;;34949:143;;;;:::o;35098:348::-;;35161:20;35179:1;35161:20;:::i;:::-;35156:25;;35195:20;35213:1;35195:20;:::i;:::-;35190:25;;35383:1;35315:66;35311:74;35308:1;35305:81;35300:1;35293:9;35286:17;35282:105;35279:2;;;35390:18;;:::i;:::-;35279:2;35438:1;35435;35431:9;35420:20;;35146:300;;;;:::o;35452:191::-;;35512:20;35530:1;35512:20;:::i;:::-;35507:25;;35546:20;35564:1;35546:20;:::i;:::-;35541:25;;35585:1;35582;35579:8;35576:2;;;35590:18;;:::i;:::-;35576:2;35635:1;35632;35628:9;35620:17;;35497:146;;;;:::o;35649:96::-;;35715:24;35733:5;35715:24;:::i;:::-;35704:35;;35694:51;;;:::o;35751:90::-;;35828:5;35821:13;35814:21;35803:32;;35793:48;;;:::o;35847:149::-;;35923:66;35916:5;35912:78;35901:89;;35891:105;;;:::o;36002:126::-;;36079:42;36072:5;36068:54;36057:65;;36047:81;;;:::o;36134:77::-;;36200:5;36189:16;;36179:32;;;:::o;36217:154::-;36301:6;36296:3;36291;36278:30;36363:1;36354:6;36349:3;36345:16;36338:27;36268:103;;;:::o;36377:307::-;36445:1;36455:113;36469:6;36466:1;36463:13;36455:113;;;36554:1;36549:3;36545:11;36539:18;36535:1;36530:3;36526:11;36519:39;36491:2;36488:1;36484:10;36479:15;;36455:113;;;36586:6;36583:1;36580:13;36577:2;;;36666:1;36657:6;36652:3;36648:16;36641:27;36577:2;36426:258;;;;:::o;36690:320::-;;36771:1;36765:4;36761:12;36751:22;;36818:1;36812:4;36808:12;36839:18;36829:2;;36895:4;36887:6;36883:17;36873:27;;36829:2;36957;36949:6;36946:14;36926:18;36923:38;36920:2;;;36976:18;;:::i;:::-;36920:2;36741:269;;;;:::o;37016:233::-;;37078:24;37096:5;37078:24;:::i;:::-;37069:33;;37124:66;37117:5;37114:77;37111:2;;;37194:18;;:::i;:::-;37111:2;37241:1;37234:5;37230:13;37223:20;;37059:190;;;:::o;37255:176::-;;37304:20;37322:1;37304:20;:::i;:::-;37299:25;;37338:20;37356:1;37338:20;:::i;:::-;37333:25;;37377:1;37367:2;;37382:18;;:::i;:::-;37367:2;37423:1;37420;37416:9;37411:14;;37289:142;;;;:::o;37437:180::-;37485:77;37482:1;37475:88;37582:4;37579:1;37572:15;37606:4;37603:1;37596:15;37623:180;37671:77;37668:1;37661:88;37768:4;37765:1;37758:15;37792:4;37789:1;37782:15;37809:180;37857:77;37854:1;37847:88;37954:4;37951:1;37944:15;37978:4;37975:1;37968:15;37995:180;38043:77;38040:1;38033:88;38140:4;38137:1;38130:15;38164:4;38161:1;38154:15;38181:102;;38273:2;38269:7;38264:2;38257:5;38253:14;38249:28;38239:38;;38229:54;;;:::o;38289:122::-;38362:24;38380:5;38362:24;:::i;:::-;38355:5;38352:35;38342:2;;38401:1;38398;38391:12;38342:2;38332:79;:::o;38417:116::-;38487:21;38502:5;38487:21;:::i;:::-;38480:5;38477:32;38467:2;;38523:1;38520;38513:12;38467:2;38457:76;:::o;38539:120::-;38611:23;38628:5;38611:23;:::i;:::-;38604:5;38601:34;38591:2;;38649:1;38646;38639:12;38591:2;38581:78;:::o;38665:122::-;38738:24;38756:5;38738:24;:::i;:::-;38731:5;38728:35;38718:2;;38777:1;38774;38767:12;38718:2;38708:79;:::o

Swarm Source

ipfs://55848daba8d74e1c8a2fbda5d7c04adc9521ebdc42a6c4f79e4fb7ba650ec9c7
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.