ETH Price: $3,405.42 (+6.68%)
Gas: 38 Gwei

Token

Doodbeast (BEAST)
 

Overview

Max Total Supply

5,555 BEAST

Holders

1,100

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 BEAST
0xc92c5942468ab60e7a6236dbe3a1e475d4becbd4
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:
Doodbeast

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-10
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @title ERC-721 Non-Fungible Token Standard, optional 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);
}


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

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

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex = 56;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    bool public revealStatus;

    string public constant unrevealedURI = "QmdQR4fftQ7TLW6eoqpRD33q2i8kTSt6cHCCJQZitprQCJ";
    string public revealedURI;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // currentIndex overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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');
        if(!revealStatus){
            string memory baseURI = _baseURI();
            return bytes(baseURI).length != 0 ? string(abi.encodePacked("ipfs://", baseURI, "/", tokenId.toString(), ".json")) : '';
        }else{
            string memory baseURI = _baseURI();
            return bytes(baseURI).length != 0 ? string(abi.encodePacked("ipfs://", 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 returns (string memory) {
        if (!revealStatus) {
            return unrevealedURI;
        } else {
            return revealedURI;
        }
    }

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: 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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex && tokenId != 0 ;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // currentIndex overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, 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('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract Doodbeast is ERC721A, Ownable {

    uint public ownerCounter = 1;
    uint public ownerAssignments;
    uint public maxSupply = 5555;
    uint public price = 0.015 ether;

    mapping(address => uint) public _airdrops;
    mapping(address => uint) public _freeTokensMinted;

    event Reveal (string unrevealedURI, string revealedURI);

    constructor() ERC721A("Doodbeast", "BEAST") {}

    function reveal(string memory _revealedURI) external onlyOwner {
        require(!revealStatus, "Collection already revealed!");
        revealedURI = _revealedURI;
        revealStatus = !revealStatus;
        emit Reveal(unrevealedURI, revealedURI);
    }

    function setPrice(uint _price) external onlyOwner {
        price = _price;
    }

    function claimAirdrop() external {
        require(_airdrops[msg.sender] > 0, "No tokens to claim!");
        uint amount = _airdrops[msg.sender];
        uint pastIndex = currentIndex;
        currentIndex = ownerCounter;
        _safeMint(msg.sender, amount);
        currentIndex = pastIndex;
        ownerCounter += amount;
        _airdrops[msg.sender] = 0;
    }

    function ownerAssignment(address wallet, uint amount) external onlyOwner {
        require(ownerAssignments + amount <= 55, "Not enough tokens to assign");
        _airdrops[wallet] += amount;
        ownerAssignments += amount;
    }

    function freeMint(uint amount) external {
        require(currentIndex + amount <= 556, "Not enough free tokens available!");
        require(amount <= 4, "Not allowed!");
        require(_freeTokensMinted[msg.sender] < 4, "Max free tokens already minted!");
        _safeMint(msg.sender, amount);
        _freeTokensMinted[msg.sender] += amount;
    }

    function saleMint(uint amount) external payable {
        require(amount <= 15, "Incorrect amount!");
        require(currentIndex > 555, "Free round not finished!");
        require(msg.value == amount * price, "Incorrect value!");
        require(currentIndex + amount <= maxSupply + 1, "Not enough tokens!");
        _safeMint(msg.sender, amount);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"unrevealedURI","type":"string"},{"indexed":false,"internalType":"string","name":"revealedURI","type":"string"}],"name":"Reveal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_airdrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_freeTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"claimAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"freeMint","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerAssignment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerAssignments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_revealedURI","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"saleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260386000556001600a556115b3600c5566354a6ba7a18000600d553480156200002c57600080fd5b506040518060400160405280600981526020017f446f6f64626561737400000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f42454153540000000000000000000000000000000000000000000000000000008152508160019080519060200190620000b1929190620001c1565b508060029080519060200190620000ca929190620001c1565b505050620000ed620000e1620000f360201b60201c565b620000fb60201b60201c565b620002d6565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001cf90620002a0565b90600052602060002090601f016020900481019282620001f357600085556200023f565b82601f106200020e57805160ff19168380011785556200023f565b828001600101855582156200023f579182015b828111156200023e57825182559160200191906001019062000221565b5b5090506200024e919062000252565b5090565b5b808211156200026d57600081600090555060010162000253565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002b957607f821691505b60208210811415620002d057620002cf62000271565b5b50919050565b614ac680620002e66000396000f3fe6080604052600436106102045760003560e01c80636352211e11610118578063a035b1fe116100a0578063d5abeb011161006f578063d5abeb0114610758578063e97df29714610783578063e985e9c5146107ae578063f2fde38b146107eb578063f7e8d6ea1461081457610204565b8063a035b1fe1461069e578063a22cb465146106c9578063b88d4fde146106f2578063c87b56dd1461071b57610204565b80637c928fe9116100e75780637c928fe9146105da5780638ca887ca146106035780638da5cb5b1461061f57806391b7f5ed1461064a57806395d89b411461067357610204565b80636352211e1461051e5780637035bf181461055b57806370a0823114610586578063715018a6146105c357610204565b806330943fcf1161019b578063454f75321161016a578063454f75321461042757806349506440146104645780634c261247146104a15780634f6ccce7146104ca5780635b88349d1461050757610204565b806330943fcf146103935780633ccfd60b146103be5780633d529db6146103d557806342842e0e146103fe57610204565b806318160ddd116101d757806318160ddd146102d757806323b872dd14610302578063263e4f5e1461032b5780632f745c591461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612fa8565b61083f565b60405161023d9190612ff0565b60405180910390f35b34801561025257600080fd5b5061025b610989565b60405161026891906130a4565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906130fc565b610a1b565b6040516102a5919061316a565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906131b1565b610aa0565b005b3480156102e357600080fd5b506102ec610bb9565b6040516102f99190613200565b60405180910390f35b34801561030e57600080fd5b506103296004803603810190610324919061321b565b610bcf565b005b34801561033757600080fd5b50610340610bdf565b60405161034d9190612ff0565b60405180910390f35b34801561036257600080fd5b5061037d600480360381019061037891906131b1565b610bf2565b60405161038a9190613200565b60405180910390f35b34801561039f57600080fd5b506103a8610de4565b6040516103b59190613200565b60405180910390f35b3480156103ca57600080fd5b506103d3610dea565b005b3480156103e157600080fd5b506103fc60048036038101906103f791906131b1565b610eaf565b005b34801561040a57600080fd5b506104256004803603810190610420919061321b565b610fef565b005b34801561043357600080fd5b5061044e6004803603810190610449919061326e565b61100f565b60405161045b9190613200565b60405180910390f35b34801561047057600080fd5b5061048b6004803603810190610486919061326e565b611027565b6040516104989190613200565b60405180910390f35b3480156104ad57600080fd5b506104c860048036038101906104c391906133d0565b61103f565b005b3480156104d657600080fd5b506104f160048036038101906104ec91906130fc565b6111a1565b6040516104fe9190613200565b60405180910390f35b34801561051357600080fd5b5061051c6111f4565b005b34801561052a57600080fd5b50610545600480360381019061054091906130fc565b61133c565b604051610552919061316a565b60405180910390f35b34801561056757600080fd5b50610570611352565b60405161057d91906130a4565b60405180910390f35b34801561059257600080fd5b506105ad60048036038101906105a8919061326e565b61136e565b6040516105ba9190613200565b60405180910390f35b3480156105cf57600080fd5b506105d8611457565b005b3480156105e657600080fd5b5061060160048036038101906105fc91906130fc565b6114df565b005b61061d600480360381019061061891906130fc565b61165a565b005b34801561062b57600080fd5b5061063461179e565b604051610641919061316a565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c91906130fc565b6117c8565b005b34801561067f57600080fd5b5061068861184e565b60405161069591906130a4565b60405180910390f35b3480156106aa57600080fd5b506106b36118e0565b6040516106c09190613200565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb9190613445565b6118e6565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613526565b611a67565b005b34801561072757600080fd5b50610742600480360381019061073d91906130fc565b611ac3565b60405161074f91906130a4565b60405180910390f35b34801561076457600080fd5b5061076d611bde565b60405161077a9190613200565b60405180910390f35b34801561078f57600080fd5b50610798611be4565b6040516107a59190613200565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d091906135a9565b611bea565b6040516107e29190612ff0565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d919061326e565b611c7e565b005b34801561082057600080fd5b50610829611d76565b60405161083691906130a4565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061097257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610982575061098182611e04565b5b9050919050565b60606001805461099890613618565b80601f01602080910402602001604051908101604052809291908181526020018280546109c490613618565b8015610a115780601f106109e657610100808354040283529160200191610a11565b820191906000526020600020905b8154815290600101906020018083116109f457829003601f168201915b5050505050905090565b6000610a2682611e6e565b610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906136bc565b60405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aab8261133c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b139061374e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b3b611e88565b73ffffffffffffffffffffffffffffffffffffffff161480610b6a5750610b6981610b64611e88565b611bea565b5b610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906137e0565b60405180910390fd5b610bb4838383611e90565b505050565b60006001600054610bca919061382f565b905090565b610bda838383611f42565b505050565b600360009054906101000a900460ff1681565b6000610bfd8361136e565b8210610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c35906138d5565b60405180910390fd5b6000610c48610bb9565b905060008060005b83811015610da2576000600560008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d4257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d945786841415610d8b578195505050505050610dde565b83806001019450505b508080600101915050610c50565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd590613967565b60405180910390fd5b92915050565b600a5481565b610df2611e88565b73ffffffffffffffffffffffffffffffffffffffff16610e1061179e565b73ffffffffffffffffffffffffffffffffffffffff1614610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d906139d3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610eac573d6000803e3d6000fd5b50565b610eb7611e88565b73ffffffffffffffffffffffffffffffffffffffff16610ed561179e565b73ffffffffffffffffffffffffffffffffffffffff1614610f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f22906139d3565b60405180910390fd5b603781600b54610f3b91906139f3565b1115610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390613a95565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fcb91906139f3565b9250508190555080600b6000828254610fe491906139f3565b925050819055505050565b61100a83838360405180602001604052806000815250611a67565b505050565b600e6020528060005260406000206000915090505481565b600f6020528060005260406000206000915090505481565b611047611e88565b73ffffffffffffffffffffffffffffffffffffffff1661106561179e565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b2906139d3565b60405180910390fd5b600360009054906101000a900460ff161561110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290613b01565b60405180910390fd5b8060049080519060200190611121929190612e5f565b50600360009054906101000a900460ff1615600360006101000a81548160ff0219169083151502179055507f354aad5708d4f0f772c74ac659b608e378eb95c1d608ffbe5703e1dbd40124306040518060600160405280602e8152602001614a63602e91396004604051611196929190613bb6565b60405180910390a150565b60006111ab610bb9565b82106111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e390613c5f565b60405180910390fd5b819050919050565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d90613ccb565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600080549050600a546000819055506112d33383612482565b8060008190555081600a60008282546112ec91906139f3565b925050819055506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000611347826124a0565b600001519050919050565b6040518060600160405280602e8152602001614a63602e913981565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690613d5d565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61145f611e88565b73ffffffffffffffffffffffffffffffffffffffff1661147d61179e565b73ffffffffffffffffffffffffffffffffffffffff16146114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca906139d3565b60405180910390fd5b6114dd600061263a565b565b61022c816000546114f091906139f3565b1115611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890613def565b60405180910390fd5b6004811115611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c90613e5b565b60405180910390fd5b6004600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee90613ec7565b60405180910390fd5b6116013382612482565b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461165091906139f3565b9250508190555050565b600f81111561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590613f33565b60405180910390fd5b61022b600054116116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db90613f9f565b60405180910390fd5b600d54816116f29190613fbf565b3414611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a90614065565b60405180910390fd5b6001600c5461174291906139f3565b8160005461175091906139f3565b1115611791576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611788906140d1565b60405180910390fd5b61179b3382612482565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117d0611e88565b73ffffffffffffffffffffffffffffffffffffffff166117ee61179e565b73ffffffffffffffffffffffffffffffffffffffff1614611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183b906139d3565b60405180910390fd5b80600d8190555050565b60606002805461185d90613618565b80601f016020809104026020016040519081016040528092919081815260200182805461188990613618565b80156118d65780601f106118ab576101008083540402835291602001916118d6565b820191906000526020600020905b8154815290600101906020018083116118b957829003601f168201915b5050505050905090565b600d5481565b6118ee611e88565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561195c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119539061413d565b60405180910390fd5b8060086000611969611e88565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a16611e88565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a5b9190612ff0565b60405180910390a35050565b611a72848484611f42565b611a7e84848484612700565b611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab4906141cf565b60405180910390fd5b50505050565b6060611ace82611e6e565b611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490614261565b60405180910390fd5b600360009054906101000a900460ff16611b7f576000611b2b612888565b9050600081511415611b4c5760405180602001604052806000815250611b77565b80611b568461294f565b604051602001611b679291906143a1565b6040516020818303038152906040525b915050611bd9565b6000611b89612888565b9050600081511415611baa5760405180602001604052806000815250611bd5565b80611bb48461294f565b604051602001611bc59291906143a1565b6040516020818303038152906040525b9150505b919050565b600c5481565b600b5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c86611e88565b73ffffffffffffffffffffffffffffffffffffffff16611ca461179e565b73ffffffffffffffffffffffffffffffffffffffff1614611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf1906139d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6190614458565b60405180910390fd5b611d738161263a565b50565b60048054611d8390613618565b80601f0160208091040260200160405190810160405280929190818152602001828054611daf90613618565b8015611dfc5780601f10611dd157610100808354040283529160200191611dfc565b820191906000526020600020905b815481529060010190602001808311611ddf57829003601f168201915b505050505081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482108015611e81575060008214155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611f4d826124a0565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611f74611e88565b73ffffffffffffffffffffffffffffffffffffffff161480611fd05750611f99611e88565b73ffffffffffffffffffffffffffffffffffffffff16611fb884610a1b565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fec5750611feb8260000151611fe6611e88565b611bea565b5b90508061202e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612025906144ea565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146120a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120979061457c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612110576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121079061460e565b60405180910390fd5b61211d8585856001612ab0565b61212d6000848460000151611e90565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836005600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124125761237181611e6e565b156124115782600001516005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461247b8585856001612ab6565b5050505050565b61249c828260405180602001604052806000815250612abc565b5050565b6124a8612ee5565b6124b182611e6e565b6124f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e7906146a0565b60405180910390fd5b60008290505b600081106125f9576000600560008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125ea578092505050612635565b508080600190039150506124f6565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262c90614732565b60405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006127218473ffffffffffffffffffffffffffffffffffffffff16612ace565b1561287b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261274a611e88565b8786866040518563ffffffff1660e01b815260040161276c94939291906147a7565b6020604051808303816000875af19250505080156127a857506040513d601f19601f820116820180604052508101906127a59190614808565b60015b61282b573d80600081146127d8576040519150601f19603f3d011682016040523d82523d6000602084013e6127dd565b606091505b50600081511415612823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281a906141cf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612880565b600190505b949350505050565b6060600360009054906101000a900460ff166128be576040518060600160405280602e8152602001614a63602e9139905061294c565b600480546128cb90613618565b80601f01602080910402602001604051908101604052809291908181526020018280546128f790613618565b80156129445780601f1061291957610100808354040283529160200191612944565b820191906000526020600020905b81548152906001019060200180831161292757829003601f168201915b505050505090505b90565b60606000821415612997576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612aab565b600082905060005b600082146129c95780806129b290614835565b915050600a826129c291906148ad565b915061299f565b60008167ffffffffffffffff8111156129e5576129e46132a5565b5b6040519080825280601f01601f191660200182016040528015612a175781602001600182028036833780820191505090505b5090505b60008514612aa457600182612a30919061382f565b9150600a85612a3f91906148de565b6030612a4b91906139f3565b60f81b818381518110612a6157612a6061490f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a9d91906148ad565b9450612a1b565b8093505050505b919050565b50505050565b50505050565b612ac98383836001612ae1565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4e906149b0565b60405180910390fd5b6000841415612b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9290614a42565b60405180910390fd5b612ba86000868387612ab0565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612e4257818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612e2d57612ded6000888488612700565b612e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e23906141cf565b60405180910390fd5b5b81806001019250508080600101915050612d76565b508060008190555050612e586000868387612ab6565b5050505050565b828054612e6b90613618565b90600052602060002090601f016020900481019282612e8d5760008555612ed4565b82601f10612ea657805160ff1916838001178555612ed4565b82800160010185558215612ed4579182015b82811115612ed3578251825591602001919060010190612eb8565b5b509050612ee19190612f1f565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612f38576000816000905550600101612f20565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f8581612f50565b8114612f9057600080fd5b50565b600081359050612fa281612f7c565b92915050565b600060208284031215612fbe57612fbd612f46565b5b6000612fcc84828501612f93565b91505092915050565b60008115159050919050565b612fea81612fd5565b82525050565b60006020820190506130056000830184612fe1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561304557808201518184015260208101905061302a565b83811115613054576000848401525b50505050565b6000601f19601f8301169050919050565b60006130768261300b565b6130808185613016565b9350613090818560208601613027565b6130998161305a565b840191505092915050565b600060208201905081810360008301526130be818461306b565b905092915050565b6000819050919050565b6130d9816130c6565b81146130e457600080fd5b50565b6000813590506130f6816130d0565b92915050565b60006020828403121561311257613111612f46565b5b6000613120848285016130e7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061315482613129565b9050919050565b61316481613149565b82525050565b600060208201905061317f600083018461315b565b92915050565b61318e81613149565b811461319957600080fd5b50565b6000813590506131ab81613185565b92915050565b600080604083850312156131c8576131c7612f46565b5b60006131d68582860161319c565b92505060206131e7858286016130e7565b9150509250929050565b6131fa816130c6565b82525050565b600060208201905061321560008301846131f1565b92915050565b60008060006060848603121561323457613233612f46565b5b60006132428682870161319c565b93505060206132538682870161319c565b9250506040613264868287016130e7565b9150509250925092565b60006020828403121561328457613283612f46565b5b60006132928482850161319c565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132dd8261305a565b810181811067ffffffffffffffff821117156132fc576132fb6132a5565b5b80604052505050565b600061330f612f3c565b905061331b82826132d4565b919050565b600067ffffffffffffffff82111561333b5761333a6132a5565b5b6133448261305a565b9050602081019050919050565b82818337600083830152505050565b600061337361336e84613320565b613305565b90508281526020810184848401111561338f5761338e6132a0565b5b61339a848285613351565b509392505050565b600082601f8301126133b7576133b661329b565b5b81356133c7848260208601613360565b91505092915050565b6000602082840312156133e6576133e5612f46565b5b600082013567ffffffffffffffff81111561340457613403612f4b565b5b613410848285016133a2565b91505092915050565b61342281612fd5565b811461342d57600080fd5b50565b60008135905061343f81613419565b92915050565b6000806040838503121561345c5761345b612f46565b5b600061346a8582860161319c565b925050602061347b85828601613430565b9150509250929050565b600067ffffffffffffffff8211156134a05761349f6132a5565b5b6134a98261305a565b9050602081019050919050565b60006134c96134c484613485565b613305565b9050828152602081018484840111156134e5576134e46132a0565b5b6134f0848285613351565b509392505050565b600082601f83011261350d5761350c61329b565b5b813561351d8482602086016134b6565b91505092915050565b600080600080608085870312156135405761353f612f46565b5b600061354e8782880161319c565b945050602061355f8782880161319c565b9350506040613570878288016130e7565b925050606085013567ffffffffffffffff81111561359157613590612f4b565b5b61359d878288016134f8565b91505092959194509250565b600080604083850312156135c0576135bf612f46565b5b60006135ce8582860161319c565b92505060206135df8582860161319c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061363057607f821691505b60208210811415613644576136436135e9565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006136a6602d83613016565b91506136b18261364a565b604082019050919050565b600060208201905081810360008301526136d581613699565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613738602283613016565b9150613743826136dc565b604082019050919050565b600060208201905081810360008301526137678161372b565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006137ca603983613016565b91506137d58261376e565b604082019050919050565b600060208201905081810360008301526137f9816137bd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061383a826130c6565b9150613845836130c6565b92508282101561385857613857613800565b5b828203905092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006138bf602283613016565b91506138ca82613863565b604082019050919050565b600060208201905081810360008301526138ee816138b2565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613951602e83613016565b915061395c826138f5565b604082019050919050565b6000602082019050818103600083015261398081613944565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139bd602083613016565b91506139c882613987565b602082019050919050565b600060208201905081810360008301526139ec816139b0565b9050919050565b60006139fe826130c6565b9150613a09836130c6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a3e57613a3d613800565b5b828201905092915050565b7f4e6f7420656e6f75676820746f6b656e7320746f2061737369676e0000000000600082015250565b6000613a7f601b83613016565b9150613a8a82613a49565b602082019050919050565b60006020820190508181036000830152613aae81613a72565b9050919050565b7f436f6c6c656374696f6e20616c72656164792072657665616c65642100000000600082015250565b6000613aeb601c83613016565b9150613af682613ab5565b602082019050919050565b60006020820190508181036000830152613b1a81613ade565b9050919050565b60008190508160005260206000209050919050565b60008154613b4381613618565b613b4d8186613016565b94506001821660008114613b685760018114613b7a57613bad565b60ff1983168652602086019350613bad565b613b8385613b21565b60005b83811015613ba557815481890152600182019150602081019050613b86565b808801955050505b50505092915050565b60006040820190508181036000830152613bd0818561306b565b90508181036020830152613be48184613b36565b90509392505050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613c49602383613016565b9150613c5482613bed565b604082019050919050565b60006020820190508181036000830152613c7881613c3c565b9050919050565b7f4e6f20746f6b656e7320746f20636c61696d2100000000000000000000000000600082015250565b6000613cb5601383613016565b9150613cc082613c7f565b602082019050919050565b60006020820190508181036000830152613ce481613ca8565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613d47602b83613016565b9150613d5282613ceb565b604082019050919050565b60006020820190508181036000830152613d7681613d3a565b9050919050565b7f4e6f7420656e6f756768206672656520746f6b656e7320617661696c61626c6560008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dd9602183613016565b9150613de482613d7d565b604082019050919050565b60006020820190508181036000830152613e0881613dcc565b9050919050565b7f4e6f7420616c6c6f776564210000000000000000000000000000000000000000600082015250565b6000613e45600c83613016565b9150613e5082613e0f565b602082019050919050565b60006020820190508181036000830152613e7481613e38565b9050919050565b7f4d6178206672656520746f6b656e7320616c7265616479206d696e7465642100600082015250565b6000613eb1601f83613016565b9150613ebc82613e7b565b602082019050919050565b60006020820190508181036000830152613ee081613ea4565b9050919050565b7f496e636f727265637420616d6f756e7421000000000000000000000000000000600082015250565b6000613f1d601183613016565b9150613f2882613ee7565b602082019050919050565b60006020820190508181036000830152613f4c81613f10565b9050919050565b7f4672656520726f756e64206e6f742066696e6973686564210000000000000000600082015250565b6000613f89601883613016565b9150613f9482613f53565b602082019050919050565b60006020820190508181036000830152613fb881613f7c565b9050919050565b6000613fca826130c6565b9150613fd5836130c6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561400e5761400d613800565b5b828202905092915050565b7f496e636f72726563742076616c75652100000000000000000000000000000000600082015250565b600061404f601083613016565b915061405a82614019565b602082019050919050565b6000602082019050818103600083015261407e81614042565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73210000000000000000000000000000600082015250565b60006140bb601283613016565b91506140c682614085565b602082019050919050565b600060208201905081810360008301526140ea816140ae565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614127601a83613016565b9150614132826140f1565b602082019050919050565b600060208201905081810360008301526141568161411a565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006141b9603383613016565b91506141c48261415d565b604082019050919050565b600060208201905081810360008301526141e8816141ac565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061424b602f83613016565b9150614256826141ef565b604082019050919050565b6000602082019050818103600083015261427a8161423e565b9050919050565b600081905092915050565b7f697066733a2f2f00000000000000000000000000000000000000000000000000600082015250565b60006142c2600783614281565b91506142cd8261428c565b600782019050919050565b60006142e38261300b565b6142ed8185614281565b93506142fd818560208601613027565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061433f600183614281565b915061434a82614309565b600182019050919050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061438b600583614281565b915061439682614355565b600582019050919050565b60006143ac826142b5565b91506143b882856142d8565b91506143c382614332565b91506143cf82846142d8565b91506143da8261437e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614442602683613016565b915061444d826143e6565b604082019050919050565b6000602082019050818103600083015261447181614435565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006144d4603283613016565b91506144df82614478565b604082019050919050565b60006020820190508181036000830152614503816144c7565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000614566602683613016565b91506145718261450a565b604082019050919050565b6000602082019050818103600083015261459581614559565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006145f8602583613016565b91506146038261459c565b604082019050919050565b60006020820190508181036000830152614627816145eb565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b600061468a602a83613016565b91506146958261462e565b604082019050919050565b600060208201905081810360008301526146b98161467d565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061471c602f83613016565b9150614727826146c0565b604082019050919050565b6000602082019050818103600083015261474b8161470f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061477982614752565b614783818561475d565b9350614793818560208601613027565b61479c8161305a565b840191505092915050565b60006080820190506147bc600083018761315b565b6147c9602083018661315b565b6147d660408301856131f1565b81810360608301526147e8818461476e565b905095945050505050565b60008151905061480281612f7c565b92915050565b60006020828403121561481e5761481d612f46565b5b600061482c848285016147f3565b91505092915050565b6000614840826130c6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561487357614872613800565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148b8826130c6565b91506148c3836130c6565b9250826148d3576148d261487e565b5b828204905092915050565b60006148e9826130c6565b91506148f4836130c6565b9250826149045761490361487e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061499a602183613016565b91506149a58261493e565b604082019050919050565b600060208201905081810360008301526149c98161498d565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000614a2c602883613016565b9150614a37826149d0565b604082019050919050565b60006020820190508181036000830152614a5b81614a1f565b905091905056fe516d645152346666745137544c5736656f717052443333713269386b54537436634843434a515a6974707251434aa264697066735822122012304630f6a5fd6886716f083e6d096a1c8cc8a958fcec177dff712226934bf064736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106102045760003560e01c80636352211e11610118578063a035b1fe116100a0578063d5abeb011161006f578063d5abeb0114610758578063e97df29714610783578063e985e9c5146107ae578063f2fde38b146107eb578063f7e8d6ea1461081457610204565b8063a035b1fe1461069e578063a22cb465146106c9578063b88d4fde146106f2578063c87b56dd1461071b57610204565b80637c928fe9116100e75780637c928fe9146105da5780638ca887ca146106035780638da5cb5b1461061f57806391b7f5ed1461064a57806395d89b411461067357610204565b80636352211e1461051e5780637035bf181461055b57806370a0823114610586578063715018a6146105c357610204565b806330943fcf1161019b578063454f75321161016a578063454f75321461042757806349506440146104645780634c261247146104a15780634f6ccce7146104ca5780635b88349d1461050757610204565b806330943fcf146103935780633ccfd60b146103be5780633d529db6146103d557806342842e0e146103fe57610204565b806318160ddd116101d757806318160ddd146102d757806323b872dd14610302578063263e4f5e1461032b5780632f745c591461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612fa8565b61083f565b60405161023d9190612ff0565b60405180910390f35b34801561025257600080fd5b5061025b610989565b60405161026891906130a4565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906130fc565b610a1b565b6040516102a5919061316a565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906131b1565b610aa0565b005b3480156102e357600080fd5b506102ec610bb9565b6040516102f99190613200565b60405180910390f35b34801561030e57600080fd5b506103296004803603810190610324919061321b565b610bcf565b005b34801561033757600080fd5b50610340610bdf565b60405161034d9190612ff0565b60405180910390f35b34801561036257600080fd5b5061037d600480360381019061037891906131b1565b610bf2565b60405161038a9190613200565b60405180910390f35b34801561039f57600080fd5b506103a8610de4565b6040516103b59190613200565b60405180910390f35b3480156103ca57600080fd5b506103d3610dea565b005b3480156103e157600080fd5b506103fc60048036038101906103f791906131b1565b610eaf565b005b34801561040a57600080fd5b506104256004803603810190610420919061321b565b610fef565b005b34801561043357600080fd5b5061044e6004803603810190610449919061326e565b61100f565b60405161045b9190613200565b60405180910390f35b34801561047057600080fd5b5061048b6004803603810190610486919061326e565b611027565b6040516104989190613200565b60405180910390f35b3480156104ad57600080fd5b506104c860048036038101906104c391906133d0565b61103f565b005b3480156104d657600080fd5b506104f160048036038101906104ec91906130fc565b6111a1565b6040516104fe9190613200565b60405180910390f35b34801561051357600080fd5b5061051c6111f4565b005b34801561052a57600080fd5b50610545600480360381019061054091906130fc565b61133c565b604051610552919061316a565b60405180910390f35b34801561056757600080fd5b50610570611352565b60405161057d91906130a4565b60405180910390f35b34801561059257600080fd5b506105ad60048036038101906105a8919061326e565b61136e565b6040516105ba9190613200565b60405180910390f35b3480156105cf57600080fd5b506105d8611457565b005b3480156105e657600080fd5b5061060160048036038101906105fc91906130fc565b6114df565b005b61061d600480360381019061061891906130fc565b61165a565b005b34801561062b57600080fd5b5061063461179e565b604051610641919061316a565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c91906130fc565b6117c8565b005b34801561067f57600080fd5b5061068861184e565b60405161069591906130a4565b60405180910390f35b3480156106aa57600080fd5b506106b36118e0565b6040516106c09190613200565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb9190613445565b6118e6565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613526565b611a67565b005b34801561072757600080fd5b50610742600480360381019061073d91906130fc565b611ac3565b60405161074f91906130a4565b60405180910390f35b34801561076457600080fd5b5061076d611bde565b60405161077a9190613200565b60405180910390f35b34801561078f57600080fd5b50610798611be4565b6040516107a59190613200565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d091906135a9565b611bea565b6040516107e29190612ff0565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d919061326e565b611c7e565b005b34801561082057600080fd5b50610829611d76565b60405161083691906130a4565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061097257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610982575061098182611e04565b5b9050919050565b60606001805461099890613618565b80601f01602080910402602001604051908101604052809291908181526020018280546109c490613618565b8015610a115780601f106109e657610100808354040283529160200191610a11565b820191906000526020600020905b8154815290600101906020018083116109f457829003601f168201915b5050505050905090565b6000610a2682611e6e565b610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906136bc565b60405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aab8261133c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b139061374e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b3b611e88565b73ffffffffffffffffffffffffffffffffffffffff161480610b6a5750610b6981610b64611e88565b611bea565b5b610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906137e0565b60405180910390fd5b610bb4838383611e90565b505050565b60006001600054610bca919061382f565b905090565b610bda838383611f42565b505050565b600360009054906101000a900460ff1681565b6000610bfd8361136e565b8210610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c35906138d5565b60405180910390fd5b6000610c48610bb9565b905060008060005b83811015610da2576000600560008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d4257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d945786841415610d8b578195505050505050610dde565b83806001019450505b508080600101915050610c50565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd590613967565b60405180910390fd5b92915050565b600a5481565b610df2611e88565b73ffffffffffffffffffffffffffffffffffffffff16610e1061179e565b73ffffffffffffffffffffffffffffffffffffffff1614610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d906139d3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610eac573d6000803e3d6000fd5b50565b610eb7611e88565b73ffffffffffffffffffffffffffffffffffffffff16610ed561179e565b73ffffffffffffffffffffffffffffffffffffffff1614610f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f22906139d3565b60405180910390fd5b603781600b54610f3b91906139f3565b1115610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390613a95565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fcb91906139f3565b9250508190555080600b6000828254610fe491906139f3565b925050819055505050565b61100a83838360405180602001604052806000815250611a67565b505050565b600e6020528060005260406000206000915090505481565b600f6020528060005260406000206000915090505481565b611047611e88565b73ffffffffffffffffffffffffffffffffffffffff1661106561179e565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b2906139d3565b60405180910390fd5b600360009054906101000a900460ff161561110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290613b01565b60405180910390fd5b8060049080519060200190611121929190612e5f565b50600360009054906101000a900460ff1615600360006101000a81548160ff0219169083151502179055507f354aad5708d4f0f772c74ac659b608e378eb95c1d608ffbe5703e1dbd40124306040518060600160405280602e8152602001614a63602e91396004604051611196929190613bb6565b60405180910390a150565b60006111ab610bb9565b82106111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e390613c5f565b60405180910390fd5b819050919050565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d90613ccb565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600080549050600a546000819055506112d33383612482565b8060008190555081600a60008282546112ec91906139f3565b925050819055506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000611347826124a0565b600001519050919050565b6040518060600160405280602e8152602001614a63602e913981565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690613d5d565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61145f611e88565b73ffffffffffffffffffffffffffffffffffffffff1661147d61179e565b73ffffffffffffffffffffffffffffffffffffffff16146114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca906139d3565b60405180910390fd5b6114dd600061263a565b565b61022c816000546114f091906139f3565b1115611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890613def565b60405180910390fd5b6004811115611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c90613e5b565b60405180910390fd5b6004600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee90613ec7565b60405180910390fd5b6116013382612482565b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461165091906139f3565b9250508190555050565b600f81111561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590613f33565b60405180910390fd5b61022b600054116116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db90613f9f565b60405180910390fd5b600d54816116f29190613fbf565b3414611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a90614065565b60405180910390fd5b6001600c5461174291906139f3565b8160005461175091906139f3565b1115611791576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611788906140d1565b60405180910390fd5b61179b3382612482565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117d0611e88565b73ffffffffffffffffffffffffffffffffffffffff166117ee61179e565b73ffffffffffffffffffffffffffffffffffffffff1614611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183b906139d3565b60405180910390fd5b80600d8190555050565b60606002805461185d90613618565b80601f016020809104026020016040519081016040528092919081815260200182805461188990613618565b80156118d65780601f106118ab576101008083540402835291602001916118d6565b820191906000526020600020905b8154815290600101906020018083116118b957829003601f168201915b5050505050905090565b600d5481565b6118ee611e88565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561195c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119539061413d565b60405180910390fd5b8060086000611969611e88565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a16611e88565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a5b9190612ff0565b60405180910390a35050565b611a72848484611f42565b611a7e84848484612700565b611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab4906141cf565b60405180910390fd5b50505050565b6060611ace82611e6e565b611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490614261565b60405180910390fd5b600360009054906101000a900460ff16611b7f576000611b2b612888565b9050600081511415611b4c5760405180602001604052806000815250611b77565b80611b568461294f565b604051602001611b679291906143a1565b6040516020818303038152906040525b915050611bd9565b6000611b89612888565b9050600081511415611baa5760405180602001604052806000815250611bd5565b80611bb48461294f565b604051602001611bc59291906143a1565b6040516020818303038152906040525b9150505b919050565b600c5481565b600b5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c86611e88565b73ffffffffffffffffffffffffffffffffffffffff16611ca461179e565b73ffffffffffffffffffffffffffffffffffffffff1614611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf1906139d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6190614458565b60405180910390fd5b611d738161263a565b50565b60048054611d8390613618565b80601f0160208091040260200160405190810160405280929190818152602001828054611daf90613618565b8015611dfc5780601f10611dd157610100808354040283529160200191611dfc565b820191906000526020600020905b815481529060010190602001808311611ddf57829003601f168201915b505050505081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482108015611e81575060008214155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611f4d826124a0565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611f74611e88565b73ffffffffffffffffffffffffffffffffffffffff161480611fd05750611f99611e88565b73ffffffffffffffffffffffffffffffffffffffff16611fb884610a1b565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fec5750611feb8260000151611fe6611e88565b611bea565b5b90508061202e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612025906144ea565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146120a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120979061457c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612110576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121079061460e565b60405180910390fd5b61211d8585856001612ab0565b61212d6000848460000151611e90565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836005600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124125761237181611e6e565b156124115782600001516005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461247b8585856001612ab6565b5050505050565b61249c828260405180602001604052806000815250612abc565b5050565b6124a8612ee5565b6124b182611e6e565b6124f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e7906146a0565b60405180910390fd5b60008290505b600081106125f9576000600560008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125ea578092505050612635565b508080600190039150506124f6565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262c90614732565b60405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006127218473ffffffffffffffffffffffffffffffffffffffff16612ace565b1561287b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261274a611e88565b8786866040518563ffffffff1660e01b815260040161276c94939291906147a7565b6020604051808303816000875af19250505080156127a857506040513d601f19601f820116820180604052508101906127a59190614808565b60015b61282b573d80600081146127d8576040519150601f19603f3d011682016040523d82523d6000602084013e6127dd565b606091505b50600081511415612823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281a906141cf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612880565b600190505b949350505050565b6060600360009054906101000a900460ff166128be576040518060600160405280602e8152602001614a63602e9139905061294c565b600480546128cb90613618565b80601f01602080910402602001604051908101604052809291908181526020018280546128f790613618565b80156129445780601f1061291957610100808354040283529160200191612944565b820191906000526020600020905b81548152906001019060200180831161292757829003601f168201915b505050505090505b90565b60606000821415612997576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612aab565b600082905060005b600082146129c95780806129b290614835565b915050600a826129c291906148ad565b915061299f565b60008167ffffffffffffffff8111156129e5576129e46132a5565b5b6040519080825280601f01601f191660200182016040528015612a175781602001600182028036833780820191505090505b5090505b60008514612aa457600182612a30919061382f565b9150600a85612a3f91906148de565b6030612a4b91906139f3565b60f81b818381518110612a6157612a6061490f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a9d91906148ad565b9450612a1b565b8093505050505b919050565b50505050565b50505050565b612ac98383836001612ae1565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4e906149b0565b60405180910390fd5b6000841415612b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9290614a42565b60405180910390fd5b612ba86000868387612ab0565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612e4257818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612e2d57612ded6000888488612700565b612e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e23906141cf565b60405180910390fd5b5b81806001019250508080600101915050612d76565b508060008190555050612e586000868387612ab6565b5050505050565b828054612e6b90613618565b90600052602060002090601f016020900481019282612e8d5760008555612ed4565b82601f10612ea657805160ff1916838001178555612ed4565b82800160010185558215612ed4579182015b82811115612ed3578251825591602001919060010190612eb8565b5b509050612ee19190612f1f565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612f38576000816000905550600101612f20565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f8581612f50565b8114612f9057600080fd5b50565b600081359050612fa281612f7c565b92915050565b600060208284031215612fbe57612fbd612f46565b5b6000612fcc84828501612f93565b91505092915050565b60008115159050919050565b612fea81612fd5565b82525050565b60006020820190506130056000830184612fe1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561304557808201518184015260208101905061302a565b83811115613054576000848401525b50505050565b6000601f19601f8301169050919050565b60006130768261300b565b6130808185613016565b9350613090818560208601613027565b6130998161305a565b840191505092915050565b600060208201905081810360008301526130be818461306b565b905092915050565b6000819050919050565b6130d9816130c6565b81146130e457600080fd5b50565b6000813590506130f6816130d0565b92915050565b60006020828403121561311257613111612f46565b5b6000613120848285016130e7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061315482613129565b9050919050565b61316481613149565b82525050565b600060208201905061317f600083018461315b565b92915050565b61318e81613149565b811461319957600080fd5b50565b6000813590506131ab81613185565b92915050565b600080604083850312156131c8576131c7612f46565b5b60006131d68582860161319c565b92505060206131e7858286016130e7565b9150509250929050565b6131fa816130c6565b82525050565b600060208201905061321560008301846131f1565b92915050565b60008060006060848603121561323457613233612f46565b5b60006132428682870161319c565b93505060206132538682870161319c565b9250506040613264868287016130e7565b9150509250925092565b60006020828403121561328457613283612f46565b5b60006132928482850161319c565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132dd8261305a565b810181811067ffffffffffffffff821117156132fc576132fb6132a5565b5b80604052505050565b600061330f612f3c565b905061331b82826132d4565b919050565b600067ffffffffffffffff82111561333b5761333a6132a5565b5b6133448261305a565b9050602081019050919050565b82818337600083830152505050565b600061337361336e84613320565b613305565b90508281526020810184848401111561338f5761338e6132a0565b5b61339a848285613351565b509392505050565b600082601f8301126133b7576133b661329b565b5b81356133c7848260208601613360565b91505092915050565b6000602082840312156133e6576133e5612f46565b5b600082013567ffffffffffffffff81111561340457613403612f4b565b5b613410848285016133a2565b91505092915050565b61342281612fd5565b811461342d57600080fd5b50565b60008135905061343f81613419565b92915050565b6000806040838503121561345c5761345b612f46565b5b600061346a8582860161319c565b925050602061347b85828601613430565b9150509250929050565b600067ffffffffffffffff8211156134a05761349f6132a5565b5b6134a98261305a565b9050602081019050919050565b60006134c96134c484613485565b613305565b9050828152602081018484840111156134e5576134e46132a0565b5b6134f0848285613351565b509392505050565b600082601f83011261350d5761350c61329b565b5b813561351d8482602086016134b6565b91505092915050565b600080600080608085870312156135405761353f612f46565b5b600061354e8782880161319c565b945050602061355f8782880161319c565b9350506040613570878288016130e7565b925050606085013567ffffffffffffffff81111561359157613590612f4b565b5b61359d878288016134f8565b91505092959194509250565b600080604083850312156135c0576135bf612f46565b5b60006135ce8582860161319c565b92505060206135df8582860161319c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061363057607f821691505b60208210811415613644576136436135e9565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006136a6602d83613016565b91506136b18261364a565b604082019050919050565b600060208201905081810360008301526136d581613699565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613738602283613016565b9150613743826136dc565b604082019050919050565b600060208201905081810360008301526137678161372b565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006137ca603983613016565b91506137d58261376e565b604082019050919050565b600060208201905081810360008301526137f9816137bd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061383a826130c6565b9150613845836130c6565b92508282101561385857613857613800565b5b828203905092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006138bf602283613016565b91506138ca82613863565b604082019050919050565b600060208201905081810360008301526138ee816138b2565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613951602e83613016565b915061395c826138f5565b604082019050919050565b6000602082019050818103600083015261398081613944565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139bd602083613016565b91506139c882613987565b602082019050919050565b600060208201905081810360008301526139ec816139b0565b9050919050565b60006139fe826130c6565b9150613a09836130c6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a3e57613a3d613800565b5b828201905092915050565b7f4e6f7420656e6f75676820746f6b656e7320746f2061737369676e0000000000600082015250565b6000613a7f601b83613016565b9150613a8a82613a49565b602082019050919050565b60006020820190508181036000830152613aae81613a72565b9050919050565b7f436f6c6c656374696f6e20616c72656164792072657665616c65642100000000600082015250565b6000613aeb601c83613016565b9150613af682613ab5565b602082019050919050565b60006020820190508181036000830152613b1a81613ade565b9050919050565b60008190508160005260206000209050919050565b60008154613b4381613618565b613b4d8186613016565b94506001821660008114613b685760018114613b7a57613bad565b60ff1983168652602086019350613bad565b613b8385613b21565b60005b83811015613ba557815481890152600182019150602081019050613b86565b808801955050505b50505092915050565b60006040820190508181036000830152613bd0818561306b565b90508181036020830152613be48184613b36565b90509392505050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613c49602383613016565b9150613c5482613bed565b604082019050919050565b60006020820190508181036000830152613c7881613c3c565b9050919050565b7f4e6f20746f6b656e7320746f20636c61696d2100000000000000000000000000600082015250565b6000613cb5601383613016565b9150613cc082613c7f565b602082019050919050565b60006020820190508181036000830152613ce481613ca8565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613d47602b83613016565b9150613d5282613ceb565b604082019050919050565b60006020820190508181036000830152613d7681613d3a565b9050919050565b7f4e6f7420656e6f756768206672656520746f6b656e7320617661696c61626c6560008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dd9602183613016565b9150613de482613d7d565b604082019050919050565b60006020820190508181036000830152613e0881613dcc565b9050919050565b7f4e6f7420616c6c6f776564210000000000000000000000000000000000000000600082015250565b6000613e45600c83613016565b9150613e5082613e0f565b602082019050919050565b60006020820190508181036000830152613e7481613e38565b9050919050565b7f4d6178206672656520746f6b656e7320616c7265616479206d696e7465642100600082015250565b6000613eb1601f83613016565b9150613ebc82613e7b565b602082019050919050565b60006020820190508181036000830152613ee081613ea4565b9050919050565b7f496e636f727265637420616d6f756e7421000000000000000000000000000000600082015250565b6000613f1d601183613016565b9150613f2882613ee7565b602082019050919050565b60006020820190508181036000830152613f4c81613f10565b9050919050565b7f4672656520726f756e64206e6f742066696e6973686564210000000000000000600082015250565b6000613f89601883613016565b9150613f9482613f53565b602082019050919050565b60006020820190508181036000830152613fb881613f7c565b9050919050565b6000613fca826130c6565b9150613fd5836130c6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561400e5761400d613800565b5b828202905092915050565b7f496e636f72726563742076616c75652100000000000000000000000000000000600082015250565b600061404f601083613016565b915061405a82614019565b602082019050919050565b6000602082019050818103600083015261407e81614042565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73210000000000000000000000000000600082015250565b60006140bb601283613016565b91506140c682614085565b602082019050919050565b600060208201905081810360008301526140ea816140ae565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614127601a83613016565b9150614132826140f1565b602082019050919050565b600060208201905081810360008301526141568161411a565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006141b9603383613016565b91506141c48261415d565b604082019050919050565b600060208201905081810360008301526141e8816141ac565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061424b602f83613016565b9150614256826141ef565b604082019050919050565b6000602082019050818103600083015261427a8161423e565b9050919050565b600081905092915050565b7f697066733a2f2f00000000000000000000000000000000000000000000000000600082015250565b60006142c2600783614281565b91506142cd8261428c565b600782019050919050565b60006142e38261300b565b6142ed8185614281565b93506142fd818560208601613027565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061433f600183614281565b915061434a82614309565b600182019050919050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061438b600583614281565b915061439682614355565b600582019050919050565b60006143ac826142b5565b91506143b882856142d8565b91506143c382614332565b91506143cf82846142d8565b91506143da8261437e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614442602683613016565b915061444d826143e6565b604082019050919050565b6000602082019050818103600083015261447181614435565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006144d4603283613016565b91506144df82614478565b604082019050919050565b60006020820190508181036000830152614503816144c7565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000614566602683613016565b91506145718261450a565b604082019050919050565b6000602082019050818103600083015261459581614559565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006145f8602583613016565b91506146038261459c565b604082019050919050565b60006020820190508181036000830152614627816145eb565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b600061468a602a83613016565b91506146958261462e565b604082019050919050565b600060208201905081810360008301526146b98161467d565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061471c602f83613016565b9150614727826146c0565b604082019050919050565b6000602082019050818103600083015261474b8161470f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061477982614752565b614783818561475d565b9350614793818560208601613027565b61479c8161305a565b840191505092915050565b60006080820190506147bc600083018761315b565b6147c9602083018661315b565b6147d660408301856131f1565b81810360608301526147e8818461476e565b905095945050505050565b60008151905061480281612f7c565b92915050565b60006020828403121561481e5761481d612f46565b5b600061482c848285016147f3565b91505092915050565b6000614840826130c6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561487357614872613800565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148b8826130c6565b91506148c3836130c6565b9250826148d3576148d261487e565b5b828204905092915050565b60006148e9826130c6565b91506148f4836130c6565b9250826149045761490361487e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061499a602183613016565b91506149a58261493e565b604082019050919050565b600060208201905081810360008301526149c98161498d565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000614a2c602883613016565b9150614a37826149d0565b604082019050919050565b60006020820190508181036000830152614a5b81614a1f565b905091905056fe516d645152346666745137544c5736656f717052443333713269386b54537436634843434a515a6974707251434aa264697066735822122012304630f6a5fd6886716f083e6d096a1c8cc8a958fcec177dff712226934bf064736f6c634300080b0033

Deployed Bytecode Sourcemap

39024:2257:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25508:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27394:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29326:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28847:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23756:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30202:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22820:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24424:1012;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39072:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41169:109;;;;;;;;;;;;;:::i;:::-;;40187:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30435:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39217:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39265:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39441:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23937:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39802:377;;;;;;;;;;;;;:::i;:::-;;27203:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22853:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25944:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4374:103;;;;;;;;;;;;;:::i;:::-;;40433:358;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40799:362;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3723:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39711:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27563:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39177:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29612:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30683:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27738:606;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39142:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29971:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4632:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22947:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25508:372;25610:4;25662:25;25647:40;;;:11;:40;;;;:105;;;;25719:33;25704:48;;;:11;:48;;;;25647:105;:172;;;;25784:35;25769:50;;;:11;:50;;;;25647:172;:225;;;;25836:36;25860:11;25836:23;:36::i;:::-;25647:225;25627:245;;25508:372;;;:::o;27394:100::-;27448:13;27481:5;27474:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27394:100;:::o;29326:214::-;29394:7;29422:16;29430:7;29422;:16::i;:::-;29414:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29508:15;:24;29524:7;29508:24;;;;;;;;;;;;;;;;;;;;;29501:31;;29326:214;;;:::o;28847:413::-;28920:13;28936:24;28952:7;28936:15;:24::i;:::-;28920:40;;28985:5;28979:11;;:2;:11;;;;28971:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29080:5;29064:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29089:37;29106:5;29113:12;:10;:12::i;:::-;29089:16;:37::i;:::-;29064:62;29042:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;29224:28;29233:2;29237:7;29246:5;29224:8;:28::i;:::-;28909:351;28847:413;;:::o;23756:104::-;23809:7;23851:1;23836:12;;:16;;;;:::i;:::-;23829:23;;23756:104;:::o;30202:162::-;30328:28;30338:4;30344:2;30348:7;30328:9;:28::i;:::-;30202:162;;;:::o;22820:24::-;;;;;;;;;;;;;:::o;24424:1012::-;24513:7;24549:16;24559:5;24549:9;:16::i;:::-;24541:5;:24;24533:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24615:22;24640:13;:11;:13::i;:::-;24615:38;;24664:19;24694:25;24888:9;24883:466;24903:14;24899:1;:18;24883:466;;;24943:31;24977:11;:14;24989:1;24977:14;;;;;;;;;;;24943:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25040:1;25014:28;;:9;:14;;;:28;;;25010:111;;25087:9;:14;;;25067:34;;25010:111;25164:5;25143:26;;:17;:26;;;25139:195;;;25213:5;25198:11;:20;25194:85;;;25254:1;25247:8;;;;;;;;;25194:85;25301:13;;;;;;;25139:195;24924:425;24919:3;;;;;;;24883:466;;;;25372:56;;;;;;;;;;:::i;:::-;;;;;;;;24424:1012;;;;;:::o;39072:28::-;;;;:::o;41169:109::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41227:10:::1;41219:28;;:51;41248:21;41219:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;41169:109::o:0;40187:238::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40308:2:::1;40298:6;40279:16;;:25;;;;:::i;:::-;:31;;40271:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;40374:6;40353:9;:17;40363:6;40353:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;40411:6;40391:16;;:26;;;;;;;:::i;:::-;;;;;;;;40187:238:::0;;:::o;30435:177::-;30565:39;30582:4;30588:2;30592:7;30565:39;;;;;;;;;;;;:16;:39::i;:::-;30435:177;;;:::o;39217:41::-;;;;;;;;;;;;;;;;;:::o;39265:49::-;;;;;;;;;;;;;;;;;:::o;39441:262::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39524:12:::1;;;;;;;;;;;39523:13;39515:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;39594:12;39580:11;:26;;;;;;;;;;;;:::i;:::-;;39633:12;;;;;;;;;;;39632:13;39617:12;;:28;;;;;;;;;;;;;;;;;;39661:34;39668:13;;;;;;;;;;;;;;;;;39683:11;39661:34;;;;;;;:::i;:::-;;;;;;;;39441:262:::0;:::o;23937:187::-;24004:7;24040:13;:11;:13::i;:::-;24032:5;:21;24024:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;24111:5;24104:12;;23937:187;;;:::o;39802:377::-;39878:1;39854:9;:21;39864:10;39854:21;;;;;;;;;;;;;;;;:25;39846:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;39914:11;39928:9;:21;39938:10;39928:21;;;;;;;;;;;;;;;;39914:35;;39960:14;39977:12;;39960:29;;40015:12;;40000;:27;;;;40038:29;40048:10;40060:6;40038:9;:29::i;:::-;40093:9;40078:12;:24;;;;40129:6;40113:12;;:22;;;;;;;:::i;:::-;;;;;;;;40170:1;40146:9;:21;40156:10;40146:21;;;;;;;;;;;;;;;:25;;;;39835:344;;39802:377::o;27203:124::-;27267:7;27294:20;27306:7;27294:11;:20::i;:::-;:25;;;27287:32;;27203:124;;;:::o;22853:87::-;;;;;;;;;;;;;;;;;;;:::o;25944:221::-;26008:7;26053:1;26036:19;;:5;:19;;;;26028:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;26129:12;:19;26142:5;26129:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;26121:36;;26114:43;;25944:221;;;:::o;4374:103::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4439:30:::1;4466:1;4439:18;:30::i;:::-;4374:103::o:0;40433:358::-;40517:3;40507:6;40492:12;;:21;;;;:::i;:::-;:28;;40484:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40587:1;40577:6;:11;;40569:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;40656:1;40624:17;:29;40642:10;40624:29;;;;;;;;;;;;;;;;:33;40616:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;40704:29;40714:10;40726:6;40704:9;:29::i;:::-;40777:6;40744:17;:29;40762:10;40744:29;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;40433:358;:::o;40799:362::-;40876:2;40866:6;:12;;40858:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;40934:3;40919:12;;:18;40911:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41007:5;;40998:6;:14;;;;:::i;:::-;40985:9;:27;40977:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;41089:1;41077:9;;:13;;;;:::i;:::-;41067:6;41052:12;;:21;;;;:::i;:::-;:38;;41044:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;41124:29;41134:10;41146:6;41124:9;:29::i;:::-;40799:362;:::o;3723:87::-;3769:7;3796:6;;;;;;;;;;;3789:13;;3723:87;:::o;39711:83::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39780:6:::1;39772:5;:14;;;;39711:83:::0;:::o;27563:104::-;27619:13;27652:7;27645:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27563:104;:::o;39177:31::-;;;;:::o;29612:288::-;29719:12;:10;:12::i;:::-;29707:24;;:8;:24;;;;29699:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29820:8;29775:18;:32;29794:12;:10;:12::i;:::-;29775:32;;;;;;;;;;;;;;;:42;29808:8;29775:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29873:8;29844:48;;29859:12;:10;:12::i;:::-;29844:48;;;29883:8;29844:48;;;;;;:::i;:::-;;;;;;;;29612:288;;:::o;30683:355::-;30842:28;30852:4;30858:2;30862:7;30842:9;:28::i;:::-;30903:48;30926:4;30932:2;30936:7;30945:5;30903:22;:48::i;:::-;30881:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;30683:355;;;;:::o;27738:606::-;27811:13;27845:16;27853:7;27845;:16::i;:::-;27837:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;27928:12;;;;;;;;;;;27924:411;;27956:21;27980:10;:8;:10::i;:::-;27956:34;;28037:1;28018:7;28012:21;:26;;:112;;;;;;;;;;;;;;;;;28076:7;28090:18;:7;:16;:18::i;:::-;28048:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28012:112;28005:119;;;;;27924:411;28155:21;28179:10;:8;:10::i;:::-;28155:34;;28236:1;28217:7;28211:21;:26;;:112;;;;;;;;;;;;;;;;;28275:7;28289:18;:7;:16;:18::i;:::-;28247:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28211:112;28204:119;;;27738:606;;;;:::o;39142:28::-;;;;:::o;39107:::-;;;;:::o;29971:164::-;30068:4;30092:18;:25;30111:5;30092:25;;;;;;;;;;;;;;;:35;30118:8;30092:35;;;;;;;;;;;;;;;;;;;;;;;;;30085:42;;29971:164;;;;:::o;4632:201::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4741:1:::1;4721:22;;:8;:22;;;;4713:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4797:28;4816:8;4797:18;:28::i;:::-;4632:201:::0;:::o;22947:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15513:157::-;15598:4;15637:25;15622:40;;;:11;:40;;;;15615:47;;15513:157;;;:::o;31293:128::-;31350:4;31384:12;;31374:7;:22;:38;;;;;31411:1;31400:7;:12;;31374:38;31367:45;;31293:128;;;:::o;2590:98::-;2643:7;2670:10;2663:17;;2590:98;:::o;36235:196::-;36377:2;36350:15;:24;36366:7;36350:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36415:7;36411:2;36395:28;;36404:5;36395:28;;;;;;;;;;;;36235:196;;;:::o;34110:2007::-;34225:35;34263:20;34275:7;34263:11;:20::i;:::-;34225:58;;34296:22;34338:13;:18;;;34322:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;34397:12;:10;:12::i;:::-;34373:36;;:20;34385:7;34373:11;:20::i;:::-;:36;;;34322:87;:154;;;;34426:50;34443:13;:18;;;34463:12;:10;:12::i;:::-;34426:16;:50::i;:::-;34322:154;34296:181;;34498:17;34490:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;34613:4;34591:26;;:13;:18;;;:26;;;34583:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;34693:1;34679:16;;:2;:16;;;;34671:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34750:43;34772:4;34778:2;34782:7;34791:1;34750:21;:43::i;:::-;34858:49;34875:1;34879:7;34888:13;:18;;;34858:8;:49::i;:::-;35238:1;35208:12;:18;35221:4;35208:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35282:1;35254:12;:16;35267:2;35254:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35328:2;35300:11;:20;35312:7;35300:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;35390:15;35345:11;:20;35357:7;35345:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;35658:19;35690:1;35680:7;:11;35658:33;;35751:1;35710:43;;:11;:24;35722:11;35710:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;35706:295;;;35778:20;35786:11;35778:7;:20::i;:::-;35774:212;;;35855:13;:18;;;35823:11;:24;35835:11;35823:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;35938:13;:28;;;35896:11;:24;35908:11;35896:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;35774:212;35706:295;35183:829;36048:7;36044:2;36029:27;;36038:4;36029:27;;;;;;;;;;;;36067:42;36088:4;36094:2;36098:7;36107:1;36067:20;:42::i;:::-;34214:1903;;34110:2007;;;:::o;31429:104::-;31498:27;31508:2;31512:8;31498:27;;;;;;;;;;;;:9;:27::i;:::-;31429:104;;:::o;26604:537::-;26665:21;;:::i;:::-;26707:16;26715:7;26707;:16::i;:::-;26699:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26813:12;26828:7;26813:22;;26808:245;26845:1;26837:4;:9;26808:245;;26875:31;26909:11;:17;26921:4;26909:17;;;;;;;;;;;26875:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26975:1;26949:28;;:9;:14;;;:28;;;26945:93;;27009:9;27002:16;;;;;;26945:93;26856:197;26848:6;;;;;;;;26808:245;;;;27076:57;;;;;;;;;;:::i;:::-;;;;;;;;26604:537;;;;:::o;4993:191::-;5067:16;5086:6;;;;;;;;;;;5067:25;;5112:8;5103:6;;:17;;;;;;;;;;;;;;;;;;5167:8;5136:40;;5157:8;5136:40;;;;;;;;;;;;5056:128;4993:191;:::o;36996:804::-;37151:4;37172:15;:2;:13;;;:15::i;:::-;37168:625;;;37224:2;37208:36;;;37245:12;:10;:12::i;:::-;37259:4;37265:7;37274:5;37208:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37204:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37471:1;37454:6;:13;:18;37450:273;;;37497:61;;;;;;;;;;:::i;:::-;;;;;;;;37450:273;37673:6;37667:13;37658:6;37654:2;37650:15;37643:38;37204:534;37341:45;;;37331:55;;;:6;:55;;;;37324:62;;;;;37168:625;37777:4;37770:11;;36996:804;;;;;;;:::o;28592:193::-;28635:13;28666:12;;;;;;;;;;;28661:117;;28702:13;;;;;;;;;;;;;;;;;28695:20;;;;28661:117;28755:11;28748:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28592:193;;:::o;289:723::-;345:13;575:1;566:5;:10;562:53;;;593:10;;;;;;;;;;;;;;;;;;;;;562:53;625:12;640:5;625:20;;656:14;681:78;696:1;688:4;:9;681:78;;714:8;;;;;:::i;:::-;;;;745:2;737:10;;;;;:::i;:::-;;;681:78;;;769:19;801:6;791:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;769:39;;819:154;835:1;826:5;:10;819:154;;863:1;853:11;;;;;:::i;:::-;;;930:2;922:5;:10;;;;:::i;:::-;909:2;:24;;;;:::i;:::-;896:39;;879:6;886;879:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;959:2;950:11;;;;;:::i;:::-;;;819:154;;;997:6;983:21;;;;;289:723;;;;:::o;38288:159::-;;;;;:::o;38859:158::-;;;;;:::o;31896:163::-;32019:32;32025:2;32029:8;32039:5;32046:4;32019:5;:32::i;:::-;31896:163;;;:::o;5872:387::-;5932:4;6140:12;6207:7;6195:20;6187:28;;6250:1;6243:4;:8;6236:15;;;5872:387;;;:::o;32318:1538::-;32457:20;32480:12;;32457:35;;32525:1;32511:16;;:2;:16;;;;32503:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32596:1;32584:8;:13;;32576:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32655:61;32685:1;32689:2;32693:12;32707:8;32655:21;:61::i;:::-;33030:8;32994:12;:16;33007:2;32994:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33095:8;33054:12;:16;33067:2;33054:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33154:2;33121:11;:25;33133:12;33121:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33221:15;33171:11;:25;33183:12;33171:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33254:20;33277:12;33254:35;;33311:9;33306:415;33326:8;33322:1;:12;33306:415;;;33390:12;33386:2;33365:38;;33382:1;33365:38;;;;;;;;;;;;33426:4;33422:249;;;33489:59;33520:1;33524:2;33528:12;33542:5;33489:22;:59::i;:::-;33455:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;33422:249;33691:14;;;;;;;33336:3;;;;;;;33306:415;;;;33752:12;33737;:27;;;;32969:807;33788:60;33817:1;33821:2;33825:12;33839:8;33788:20;:60::i;:::-;32446:1410;32318:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:474::-;11709:6;11717;11766:2;11754:9;11745:7;11741:23;11737:32;11734:119;;;11772:79;;:::i;:::-;11734:119;11892:1;11917:53;11962:7;11953:6;11942:9;11938:22;11917:53;:::i;:::-;11907:63;;11863:117;12019:2;12045:53;12090:7;12081:6;12070:9;12066:22;12045:53;:::i;:::-;12035:63;;11990:118;11641:474;;;;;:::o;12121:180::-;12169:77;12166:1;12159:88;12266:4;12263:1;12256:15;12290:4;12287:1;12280:15;12307:320;12351:6;12388:1;12382:4;12378:12;12368:22;;12435:1;12429:4;12425:12;12456:18;12446:81;;12512:4;12504:6;12500:17;12490:27;;12446:81;12574:2;12566:6;12563:14;12543:18;12540:38;12537:84;;;12593:18;;:::i;:::-;12537:84;12358:269;12307:320;;;:::o;12633:232::-;12773:34;12769:1;12761:6;12757:14;12750:58;12842:15;12837:2;12829:6;12825:15;12818:40;12633:232;:::o;12871:366::-;13013:3;13034:67;13098:2;13093:3;13034:67;:::i;:::-;13027:74;;13110:93;13199:3;13110:93;:::i;:::-;13228:2;13223:3;13219:12;13212:19;;12871:366;;;:::o;13243:419::-;13409:4;13447:2;13436:9;13432:18;13424:26;;13496:9;13490:4;13486:20;13482:1;13471:9;13467:17;13460:47;13524:131;13650:4;13524:131;:::i;:::-;13516:139;;13243:419;;;:::o;13668:221::-;13808:34;13804:1;13796:6;13792:14;13785:58;13877:4;13872:2;13864:6;13860:15;13853:29;13668:221;:::o;13895:366::-;14037:3;14058:67;14122:2;14117:3;14058:67;:::i;:::-;14051:74;;14134:93;14223:3;14134:93;:::i;:::-;14252:2;14247:3;14243:12;14236:19;;13895:366;;;:::o;14267:419::-;14433:4;14471:2;14460:9;14456:18;14448:26;;14520:9;14514:4;14510:20;14506:1;14495:9;14491:17;14484:47;14548:131;14674:4;14548:131;:::i;:::-;14540:139;;14267:419;;;:::o;14692:244::-;14832:34;14828:1;14820:6;14816:14;14809:58;14901:27;14896:2;14888:6;14884:15;14877:52;14692:244;:::o;14942:366::-;15084:3;15105:67;15169:2;15164:3;15105:67;:::i;:::-;15098:74;;15181:93;15270:3;15181:93;:::i;:::-;15299:2;15294:3;15290:12;15283:19;;14942:366;;;:::o;15314:419::-;15480:4;15518:2;15507:9;15503:18;15495:26;;15567:9;15561:4;15557:20;15553:1;15542:9;15538:17;15531:47;15595:131;15721:4;15595:131;:::i;:::-;15587:139;;15314:419;;;:::o;15739:180::-;15787:77;15784:1;15777:88;15884:4;15881:1;15874:15;15908:4;15905:1;15898:15;15925:191;15965:4;15985:20;16003:1;15985:20;:::i;:::-;15980:25;;16019:20;16037:1;16019:20;:::i;:::-;16014:25;;16058:1;16055;16052:8;16049:34;;;16063:18;;:::i;:::-;16049:34;16108:1;16105;16101:9;16093:17;;15925:191;;;;:::o;16122:221::-;16262:34;16258:1;16250:6;16246:14;16239:58;16331:4;16326:2;16318:6;16314:15;16307:29;16122:221;:::o;16349:366::-;16491:3;16512:67;16576:2;16571:3;16512:67;:::i;:::-;16505:74;;16588:93;16677:3;16588:93;:::i;:::-;16706:2;16701:3;16697:12;16690:19;;16349:366;;;:::o;16721:419::-;16887:4;16925:2;16914:9;16910:18;16902:26;;16974:9;16968:4;16964:20;16960:1;16949:9;16945:17;16938:47;17002:131;17128:4;17002:131;:::i;:::-;16994:139;;16721:419;;;:::o;17146:233::-;17286:34;17282:1;17274:6;17270:14;17263:58;17355:16;17350:2;17342:6;17338:15;17331:41;17146:233;:::o;17385:366::-;17527:3;17548:67;17612:2;17607:3;17548:67;:::i;:::-;17541:74;;17624:93;17713:3;17624:93;:::i;:::-;17742:2;17737:3;17733:12;17726:19;;17385:366;;;:::o;17757:419::-;17923:4;17961:2;17950:9;17946:18;17938:26;;18010:9;18004:4;18000:20;17996:1;17985:9;17981:17;17974:47;18038:131;18164:4;18038:131;:::i;:::-;18030:139;;17757:419;;;:::o;18182:182::-;18322:34;18318:1;18310:6;18306:14;18299:58;18182:182;:::o;18370:366::-;18512:3;18533:67;18597:2;18592:3;18533:67;:::i;:::-;18526:74;;18609:93;18698:3;18609:93;:::i;:::-;18727:2;18722:3;18718:12;18711:19;;18370:366;;;:::o;18742:419::-;18908:4;18946:2;18935:9;18931:18;18923:26;;18995:9;18989:4;18985:20;18981:1;18970:9;18966:17;18959:47;19023:131;19149:4;19023:131;:::i;:::-;19015:139;;18742:419;;;:::o;19167:305::-;19207:3;19226:20;19244:1;19226:20;:::i;:::-;19221:25;;19260:20;19278:1;19260:20;:::i;:::-;19255:25;;19414:1;19346:66;19342:74;19339:1;19336:81;19333:107;;;19420:18;;:::i;:::-;19333:107;19464:1;19461;19457:9;19450:16;;19167:305;;;;:::o;19478:177::-;19618:29;19614:1;19606:6;19602:14;19595:53;19478:177;:::o;19661:366::-;19803:3;19824:67;19888:2;19883:3;19824:67;:::i;:::-;19817:74;;19900:93;19989:3;19900:93;:::i;:::-;20018:2;20013:3;20009:12;20002:19;;19661:366;;;:::o;20033:419::-;20199:4;20237:2;20226:9;20222:18;20214:26;;20286:9;20280:4;20276:20;20272:1;20261:9;20257:17;20250:47;20314:131;20440:4;20314:131;:::i;:::-;20306:139;;20033:419;;;:::o;20458:178::-;20598:30;20594:1;20586:6;20582:14;20575:54;20458:178;:::o;20642:366::-;20784:3;20805:67;20869:2;20864:3;20805:67;:::i;:::-;20798:74;;20881:93;20970:3;20881:93;:::i;:::-;20999:2;20994:3;20990:12;20983:19;;20642:366;;;:::o;21014:419::-;21180:4;21218:2;21207:9;21203:18;21195:26;;21267:9;21261:4;21257:20;21253:1;21242:9;21238:17;21231:47;21295:131;21421:4;21295:131;:::i;:::-;21287:139;;21014:419;;;:::o;21439:141::-;21488:4;21511:3;21503:11;;21534:3;21531:1;21524:14;21568:4;21565:1;21555:18;21547:26;;21439:141;;;:::o;21610:802::-;21695:3;21732:5;21726:12;21761:36;21787:9;21761:36;:::i;:::-;21813:71;21877:6;21872:3;21813:71;:::i;:::-;21806:78;;21915:1;21904:9;21900:17;21931:1;21926:135;;;;22075:1;22070:336;;;;21893:513;;21926:135;22010:4;22006:9;21995;21991:25;21986:3;21979:38;22046:4;22041:3;22037:14;22030:21;;21926:135;;22070:336;22137:38;22169:5;22137:38;:::i;:::-;22197:1;22211:154;22225:6;22222:1;22219:13;22211:154;;;22299:7;22293:14;22289:1;22284:3;22280:11;22273:35;22349:1;22340:7;22336:15;22325:26;;22247:4;22244:1;22240:12;22235:17;;22211:154;;;22394:1;22389:3;22385:11;22378:18;;22077:329;;21893:513;;21699:713;;21610:802;;;;:::o;22418:508::-;22576:4;22614:2;22603:9;22599:18;22591:26;;22663:9;22657:4;22653:20;22649:1;22638:9;22634:17;22627:47;22691:78;22764:4;22755:6;22691:78;:::i;:::-;22683:86;;22816:9;22810:4;22806:20;22801:2;22790:9;22786:18;22779:48;22844:75;22914:4;22905:6;22844:75;:::i;:::-;22836:83;;22418:508;;;;;:::o;22932:222::-;23072:34;23068:1;23060:6;23056:14;23049:58;23141:5;23136:2;23128:6;23124:15;23117:30;22932:222;:::o;23160:366::-;23302:3;23323:67;23387:2;23382:3;23323:67;:::i;:::-;23316:74;;23399:93;23488:3;23399:93;:::i;:::-;23517:2;23512:3;23508:12;23501:19;;23160:366;;;:::o;23532:419::-;23698:4;23736:2;23725:9;23721:18;23713:26;;23785:9;23779:4;23775:20;23771:1;23760:9;23756:17;23749:47;23813:131;23939:4;23813:131;:::i;:::-;23805:139;;23532:419;;;:::o;23957:169::-;24097:21;24093:1;24085:6;24081:14;24074:45;23957:169;:::o;24132:366::-;24274:3;24295:67;24359:2;24354:3;24295:67;:::i;:::-;24288:74;;24371:93;24460:3;24371:93;:::i;:::-;24489:2;24484:3;24480:12;24473:19;;24132:366;;;:::o;24504:419::-;24670:4;24708:2;24697:9;24693:18;24685:26;;24757:9;24751:4;24747:20;24743:1;24732:9;24728:17;24721:47;24785:131;24911:4;24785:131;:::i;:::-;24777:139;;24504:419;;;:::o;24929:230::-;25069:34;25065:1;25057:6;25053:14;25046:58;25138:13;25133:2;25125:6;25121:15;25114:38;24929:230;:::o;25165:366::-;25307:3;25328:67;25392:2;25387:3;25328:67;:::i;:::-;25321:74;;25404:93;25493:3;25404:93;:::i;:::-;25522:2;25517:3;25513:12;25506:19;;25165:366;;;:::o;25537:419::-;25703:4;25741:2;25730:9;25726:18;25718:26;;25790:9;25784:4;25780:20;25776:1;25765:9;25761:17;25754:47;25818:131;25944:4;25818:131;:::i;:::-;25810:139;;25537:419;;;:::o;25962:220::-;26102:34;26098:1;26090:6;26086:14;26079:58;26171:3;26166:2;26158:6;26154:15;26147:28;25962:220;:::o;26188:366::-;26330:3;26351:67;26415:2;26410:3;26351:67;:::i;:::-;26344:74;;26427:93;26516:3;26427:93;:::i;:::-;26545:2;26540:3;26536:12;26529:19;;26188:366;;;:::o;26560:419::-;26726:4;26764:2;26753:9;26749:18;26741:26;;26813:9;26807:4;26803:20;26799:1;26788:9;26784:17;26777:47;26841:131;26967:4;26841:131;:::i;:::-;26833:139;;26560:419;;;:::o;26985:162::-;27125:14;27121:1;27113:6;27109:14;27102:38;26985:162;:::o;27153:366::-;27295:3;27316:67;27380:2;27375:3;27316:67;:::i;:::-;27309:74;;27392:93;27481:3;27392:93;:::i;:::-;27510:2;27505:3;27501:12;27494:19;;27153:366;;;:::o;27525:419::-;27691:4;27729:2;27718:9;27714:18;27706:26;;27778:9;27772:4;27768:20;27764:1;27753:9;27749:17;27742:47;27806:131;27932:4;27806:131;:::i;:::-;27798:139;;27525:419;;;:::o;27950:181::-;28090:33;28086:1;28078:6;28074:14;28067:57;27950:181;:::o;28137:366::-;28279:3;28300:67;28364:2;28359:3;28300:67;:::i;:::-;28293:74;;28376:93;28465:3;28376:93;:::i;:::-;28494:2;28489:3;28485:12;28478:19;;28137:366;;;:::o;28509:419::-;28675:4;28713:2;28702:9;28698:18;28690:26;;28762:9;28756:4;28752:20;28748:1;28737:9;28733:17;28726:47;28790:131;28916:4;28790:131;:::i;:::-;28782:139;;28509:419;;;:::o;28934:167::-;29074:19;29070:1;29062:6;29058:14;29051:43;28934:167;:::o;29107:366::-;29249:3;29270:67;29334:2;29329:3;29270:67;:::i;:::-;29263:74;;29346:93;29435:3;29346:93;:::i;:::-;29464:2;29459:3;29455:12;29448:19;;29107:366;;;:::o;29479:419::-;29645:4;29683:2;29672:9;29668:18;29660:26;;29732:9;29726:4;29722:20;29718:1;29707:9;29703:17;29696:47;29760:131;29886:4;29760:131;:::i;:::-;29752:139;;29479:419;;;:::o;29904:174::-;30044:26;30040:1;30032:6;30028:14;30021:50;29904:174;:::o;30084:366::-;30226:3;30247:67;30311:2;30306:3;30247:67;:::i;:::-;30240:74;;30323:93;30412:3;30323:93;:::i;:::-;30441:2;30436:3;30432:12;30425:19;;30084:366;;;:::o;30456:419::-;30622:4;30660:2;30649:9;30645:18;30637:26;;30709:9;30703:4;30699:20;30695:1;30684:9;30680:17;30673:47;30737:131;30863:4;30737:131;:::i;:::-;30729:139;;30456:419;;;:::o;30881:348::-;30921:7;30944:20;30962:1;30944:20;:::i;:::-;30939:25;;30978:20;30996:1;30978:20;:::i;:::-;30973:25;;31166:1;31098:66;31094:74;31091:1;31088:81;31083:1;31076:9;31069:17;31065:105;31062:131;;;31173:18;;:::i;:::-;31062:131;31221:1;31218;31214:9;31203:20;;30881:348;;;;:::o;31235:166::-;31375:18;31371:1;31363:6;31359:14;31352:42;31235:166;:::o;31407:366::-;31549:3;31570:67;31634:2;31629:3;31570:67;:::i;:::-;31563:74;;31646:93;31735:3;31646:93;:::i;:::-;31764:2;31759:3;31755:12;31748:19;;31407:366;;;:::o;31779:419::-;31945:4;31983:2;31972:9;31968:18;31960:26;;32032:9;32026:4;32022:20;32018:1;32007:9;32003:17;31996:47;32060:131;32186:4;32060:131;:::i;:::-;32052:139;;31779:419;;;:::o;32204:168::-;32344:20;32340:1;32332:6;32328:14;32321:44;32204:168;:::o;32378:366::-;32520:3;32541:67;32605:2;32600:3;32541:67;:::i;:::-;32534:74;;32617:93;32706:3;32617:93;:::i;:::-;32735:2;32730:3;32726:12;32719:19;;32378:366;;;:::o;32750:419::-;32916:4;32954:2;32943:9;32939:18;32931:26;;33003:9;32997:4;32993:20;32989:1;32978:9;32974:17;32967:47;33031:131;33157:4;33031:131;:::i;:::-;33023:139;;32750:419;;;:::o;33175:176::-;33315:28;33311:1;33303:6;33299:14;33292:52;33175:176;:::o;33357:366::-;33499:3;33520:67;33584:2;33579:3;33520:67;:::i;:::-;33513:74;;33596:93;33685:3;33596:93;:::i;:::-;33714:2;33709:3;33705:12;33698:19;;33357:366;;;:::o;33729:419::-;33895:4;33933:2;33922:9;33918:18;33910:26;;33982:9;33976:4;33972:20;33968:1;33957:9;33953:17;33946:47;34010:131;34136:4;34010:131;:::i;:::-;34002:139;;33729:419;;;:::o;34154:238::-;34294:34;34290:1;34282:6;34278:14;34271:58;34363:21;34358:2;34350:6;34346:15;34339:46;34154:238;:::o;34398:366::-;34540:3;34561:67;34625:2;34620:3;34561:67;:::i;:::-;34554:74;;34637:93;34726:3;34637:93;:::i;:::-;34755:2;34750:3;34746:12;34739:19;;34398:366;;;:::o;34770:419::-;34936:4;34974:2;34963:9;34959:18;34951:26;;35023:9;35017:4;35013:20;35009:1;34998:9;34994:17;34987:47;35051:131;35177:4;35051:131;:::i;:::-;35043:139;;34770:419;;;:::o;35195:234::-;35335:34;35331:1;35323:6;35319:14;35312:58;35404:17;35399:2;35391:6;35387:15;35380:42;35195:234;:::o;35435:366::-;35577:3;35598:67;35662:2;35657:3;35598:67;:::i;:::-;35591:74;;35674:93;35763:3;35674:93;:::i;:::-;35792:2;35787:3;35783:12;35776:19;;35435:366;;;:::o;35807:419::-;35973:4;36011:2;36000:9;35996:18;35988:26;;36060:9;36054:4;36050:20;36046:1;36035:9;36031:17;36024:47;36088:131;36214:4;36088:131;:::i;:::-;36080:139;;35807:419;;;:::o;36232:148::-;36334:11;36371:3;36356:18;;36232:148;;;;:::o;36386:161::-;36526:9;36522:1;36514:6;36510:14;36503:33;36386:161;:::o;36557:416::-;36717:3;36742:84;36824:1;36819:3;36742:84;:::i;:::-;36735:91;;36839:93;36928:3;36839:93;:::i;:::-;36961:1;36956:3;36952:11;36945:18;;36557:416;;;:::o;36983:397::-;37089:3;37121:39;37154:5;37121:39;:::i;:::-;37180:89;37262:6;37257:3;37180:89;:::i;:::-;37173:96;;37282:52;37327:6;37322:3;37315:4;37308:5;37304:16;37282:52;:::i;:::-;37363:6;37358:3;37354:16;37347:23;;37093:287;36983:397;;;;:::o;37390:159::-;37534:3;37530:1;37522:6;37518:14;37511:27;37390:159;:::o;37559:416::-;37719:3;37744:84;37826:1;37821:3;37744:84;:::i;:::-;37737:91;;37841:93;37930:3;37841:93;:::i;:::-;37963:1;37958:3;37954:11;37947:18;;37559:416;;;:::o;37985:163::-;38129:7;38125:1;38117:6;38113:14;38106:31;37985:163;:::o;38158:416::-;38318:3;38343:84;38425:1;38420:3;38343:84;:::i;:::-;38336:91;;38440:93;38529:3;38440:93;:::i;:::-;38562:1;38557:3;38553:11;38546:18;;38158:416;;;:::o;38584:1261::-;39067:3;39093:148;39237:3;39093:148;:::i;:::-;39086:155;;39262:95;39353:3;39344:6;39262:95;:::i;:::-;39255:102;;39378:148;39522:3;39378:148;:::i;:::-;39371:155;;39547:95;39638:3;39629:6;39547:95;:::i;:::-;39540:102;;39663:148;39807:3;39663:148;:::i;:::-;39656:155;;39832:3;39825:10;;38584:1261;;;;;:::o;39855:237::-;39999:34;39995:1;39987:6;39983:14;39976:58;40072:8;40067:2;40059:6;40055:15;40048:33;39855:237;:::o;40102:382::-;40244:3;40269:67;40333:2;40328:3;40269:67;:::i;:::-;40262:74;;40349:93;40438:3;40349:93;:::i;:::-;40471:2;40466:3;40462:12;40455:19;;40102:382;;;:::o;40494:435::-;40660:4;40702:2;40691:9;40687:18;40679:26;;40755:9;40749:4;40745:20;40741:1;40730:9;40726:17;40719:47;40787:131;40913:4;40787:131;:::i;:::-;40779:139;;40494:435;;;:::o;40939:249::-;41083:34;41079:1;41071:6;41067:14;41060:58;41156:20;41151:2;41143:6;41139:15;41132:45;40939:249;:::o;41198:382::-;41340:3;41365:67;41429:2;41424:3;41365:67;:::i;:::-;41358:74;;41445:93;41534:3;41445:93;:::i;:::-;41567:2;41562:3;41558:12;41551:19;;41198:382;;;:::o;41590:435::-;41756:4;41798:2;41787:9;41783:18;41775:26;;41851:9;41845:4;41841:20;41837:1;41826:9;41822:17;41815:47;41883:131;42009:4;41883:131;:::i;:::-;41875:139;;41590:435;;;:::o;42035:237::-;42179:34;42175:1;42167:6;42163:14;42156:58;42252:8;42247:2;42239:6;42235:15;42228:33;42035:237;:::o;42282:382::-;42424:3;42449:67;42513:2;42508:3;42449:67;:::i;:::-;42442:74;;42529:93;42618:3;42529:93;:::i;:::-;42651:2;42646:3;42642:12;42635:19;;42282:382;;;:::o;42674:435::-;42840:4;42882:2;42871:9;42867:18;42859:26;;42935:9;42929:4;42925:20;42921:1;42910:9;42906:17;42899:47;42967:131;43093:4;42967:131;:::i;:::-;42959:139;;42674:435;;;:::o;43119:236::-;43263:34;43259:1;43251:6;43247:14;43240:58;43336:7;43331:2;43323:6;43319:15;43312:32;43119:236;:::o;43365:382::-;43507:3;43532:67;43596:2;43591:3;43532:67;:::i;:::-;43525:74;;43612:93;43701:3;43612:93;:::i;:::-;43734:2;43729:3;43725:12;43718:19;;43365:382;;;:::o;43757:435::-;43923:4;43965:2;43954:9;43950:18;43942:26;;44018:9;44012:4;44008:20;44004:1;43993:9;43989:17;43982:47;44050:131;44176:4;44050:131;:::i;:::-;44042:139;;43757:435;;;:::o;44202:241::-;44346:34;44342:1;44334:6;44330:14;44323:58;44419:12;44414:2;44406:6;44402:15;44395:37;44202:241;:::o;44453:382::-;44595:3;44620:67;44684:2;44679:3;44620:67;:::i;:::-;44613:74;;44700:93;44789:3;44700:93;:::i;:::-;44822:2;44817:3;44813:12;44806:19;;44453:382;;;:::o;44845:435::-;45011:4;45053:2;45042:9;45038:18;45030:26;;45106:9;45100:4;45096:20;45092:1;45081:9;45077:17;45070:47;45138:131;45264:4;45138:131;:::i;:::-;45130:139;;44845:435;;;:::o;45290:246::-;45434:34;45430:1;45422:6;45418:14;45411:58;45507:17;45502:2;45494:6;45490:15;45483:42;45290:246;:::o;45546:382::-;45688:3;45713:67;45777:2;45772:3;45713:67;:::i;:::-;45706:74;;45793:93;45882:3;45793:93;:::i;:::-;45915:2;45910:3;45906:12;45899:19;;45546:382;;;:::o;45938:435::-;46104:4;46146:2;46135:9;46131:18;46123:26;;46199:9;46193:4;46189:20;46185:1;46174:9;46170:17;46163:47;46231:131;46357:4;46231:131;:::i;:::-;46223:139;;45938:435;;;:::o;46383:106::-;46434:6;46472:5;46466:12;46456:22;;46383:106;;;:::o;46499:180::-;46582:11;46620:6;46615:3;46608:19;46664:4;46659:3;46655:14;46640:29;;46499:180;;;;:::o;46689:380::-;46775:3;46807:38;46839:5;46807:38;:::i;:::-;46865:70;46928:6;46923:3;46865:70;:::i;:::-;46858:77;;46948:52;46993:6;46988:3;46981:4;46974:5;46970:16;46948:52;:::i;:::-;47029:29;47051:6;47029:29;:::i;:::-;47024:3;47020:39;47013:46;;46779:290;46689:380;;;;:::o;47079:668::-;47274:4;47316:3;47305:9;47301:19;47293:27;;47334:71;47402:1;47391:9;47387:17;47378:6;47334:71;:::i;:::-;47419:72;47487:2;47476:9;47472:18;47463:6;47419:72;:::i;:::-;47505;47573:2;47562:9;47558:18;47549:6;47505:72;:::i;:::-;47628:9;47622:4;47618:20;47613:2;47602:9;47598:18;47591:48;47660:76;47731:4;47722:6;47660:76;:::i;:::-;47652:84;;47079:668;;;;;;;:::o;47757:153::-;47813:5;47848:6;47842:13;47833:22;;47868:32;47894:5;47868:32;:::i;:::-;47757:153;;;;:::o;47920:373::-;47989:6;48042:2;48030:9;48021:7;48017:23;48013:32;48010:119;;;48048:79;;:::i;:::-;48010:119;48176:1;48205:63;48260:7;48251:6;48240:9;48236:22;48205:63;:::i;:::-;48195:73;;48143:139;47920:373;;;;:::o;48303:249::-;48342:3;48369:24;48387:5;48369:24;:::i;:::-;48360:33;;48419:66;48412:5;48409:77;48406:103;;;48489:18;;:::i;:::-;48406:103;48540:1;48533:5;48529:13;48522:20;;48303:249;;;:::o;48562:196::-;48614:77;48611:1;48604:88;48715:4;48712:1;48705:15;48743:4;48740:1;48733:15;48768:205;48808:1;48829:20;48847:1;48829:20;:::i;:::-;48824:25;;48867:20;48885:1;48867:20;:::i;:::-;48862:25;;48910:1;48900:35;;48915:18;;:::i;:::-;48900:35;48961:1;48958;48954:9;48949:14;;48768:205;;;;:::o;48983:196::-;49015:1;49036:20;49054:1;49036:20;:::i;:::-;49031:25;;49074:20;49092:1;49074:20;:::i;:::-;49069:25;;49117:1;49107:35;;49122:18;;:::i;:::-;49107:35;49167:1;49164;49160:9;49155:14;;48983:196;;;;:::o;49189:::-;49241:77;49238:1;49231:88;49342:4;49339:1;49332:15;49370:4;49367:1;49360:15;49395:232;49539:34;49535:1;49527:6;49523:14;49516:58;49612:3;49607:2;49599:6;49595:15;49588:28;49395:232;:::o;49637:382::-;49779:3;49804:67;49868:2;49863:3;49804:67;:::i;:::-;49797:74;;49884:93;49973:3;49884:93;:::i;:::-;50006:2;50001:3;49997:12;49990:19;;49637:382;;;:::o;50029:435::-;50195:4;50237:2;50226:9;50222:18;50214:26;;50290:9;50284:4;50280:20;50276:1;50265:9;50261:17;50254:47;50322:131;50448:4;50322:131;:::i;:::-;50314:139;;50029:435;;;:::o;50474:239::-;50618:34;50614:1;50606:6;50602:14;50595:58;50691:10;50686:2;50678:6;50674:15;50667:35;50474:239;:::o;50723:382::-;50865:3;50890:67;50954:2;50949:3;50890:67;:::i;:::-;50883:74;;50970:93;51059:3;50970:93;:::i;:::-;51092:2;51087:3;51083:12;51076:19;;50723:382;;;:::o;51115:435::-;51281:4;51323:2;51312:9;51308:18;51300:26;;51376:9;51370:4;51366:20;51362:1;51351:9;51347:17;51340:47;51408:131;51534:4;51408:131;:::i;:::-;51400:139;;51115:435;;;:::o

Swarm Source

ipfs://12304630f6a5fd6886716f083e6d096a1c8cc8a958fcec177dff712226934bf0
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.