ETH Price: $2,403.30 (-3.17%)
 

Overview

Max Total Supply

669 Pigeons 4

Holders

223

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 Pigeons 4
0xc2a8b121dd355c3b882262758ede12c88b30fa80
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:
Pigeons4

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-02
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

//Developer Info:
//Written by Blockchainguy.net
//Email: [email protected]
//Instagram: @sheraz.manzoor

/**
 * @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;
    }
}
pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
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);

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

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used). 
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // 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 virtual returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _addressData[owner].aux = aux;
    }

    /**
     * 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) {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant: 
                    // There will always be an ownership that has an address and is not burned 
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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 && !_ownerships[tokenId].burned;
    }

    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;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(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 && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                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 ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _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.
        // Counter 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)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), 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.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn 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)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked { 
            _burnCounter++;
        }
    }

    /**
     * @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 TransferToNonERC721ReceiverImplementer();
                } 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.
     * And also called before burning one token.
     *
     * 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`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    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.
     * And also called after one token has been burned.
     *
     * 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` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

contract Pigeons4 is EIP712, Ownable, ERC721A{

    error SaleIsPaused();

    string private constant SIGNING_DOMAIN = "WEB3CLUB";
    string private constant SIGNATURE_VERSION = "1";
    uint public maxSupply = 743;
    string public baseURI = "https://pigeonsphase4api.vercel.app/api/nft/";

    bool public salePaused = true;
    bool public presalePaused = false;
    bool public crossmintPaused = false;
    address private whitelistVerify = 0xbF3e689B25F460F695FC5a6715aA9c74de79e52F;

    mapping(uint => uint) public voucherIds;

    uint public crossmintPrice = 0.03 ether;
    uint public salePrice = 0.03 ether;
    uint public presalePrice = 0.03 ether;

    uint public presaleSupply = 646;

    constructor() ERC721A("Pigeons of New York: Phase4", "Pigeons 4") EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION){}

    function sendNftstoMultipleWallets(address[] memory _wallets) external onlyOwner{
        require(totalSupply() + _wallets.length < maxSupply, "Max Supply Reached.");
        for(uint i = 0; i < _wallets.length; i++)
            _safeMint(_wallets[i], 1);
    }
    function sendManyNfts(address _reciever, uint256 _count) external onlyOwner{
            require(totalSupply() + _count < maxSupply, "Max Supply Reached.");
            _safeMint(_reciever, _count);
    }
    function cross(address to, uint256 quantity) external payable{
        if(crossmintPaused){
            revert SaleIsPaused();
        }
        
        require(totalSupply() + quantity < maxSupply, "Max Supply Reached.");
        require(msg.value == crossmintPrice * quantity, "Please send correct amount.");
        require(quantity + totalSupply() < presaleSupply, "Limit Reached.");

        _safeMint(to, quantity);                                                

    }
    function mint(uint256 _quantity) external payable {
        // Normal requirements
        require(!salePaused, "Sale is paused!");
        require(_quantity > 0, "Minimum 1 NFT has to be minted per transaction");
        require(_quantity + totalSupply() < maxSupply, "Sold out");
        require(msg.value == salePrice * _quantity, "Please send correct amount.");
 
        // Mint
        _safeMint(msg.sender, _quantity);
    }

    function mintPresale(uint256 _quantity, uint256 id, bytes memory signature) external payable {
        // Normal requirements
        require(!presalePaused, "Sale is paused!");
        require(_quantity > 0, "Minimum 1 NFT has to be minted per transaction");
        require(_quantity + totalSupply() < maxSupply, "Sold out");
        require(_quantity + totalSupply() < presaleSupply, "Presale Limit Reached.");
        require(msg.value == presalePrice * _quantity, "Please send correct amount.");
        require(check(id,signature) == whitelistVerify, "You are not whitelisted.");
        require(voucherIds[id] == 0, "Invalid Voucher. Try Again.");
 
        // Mint
        _safeMint(msg.sender, _quantity);
        voucherIds[id] = 1;
    }

    function check(uint id, bytes memory signature) public view returns(address){
        return _verify(id, signature);
    }

    function _verify(uint id, bytes memory signature) internal view returns(address){
        bytes32 digest = _hash(id);
        return ECDSA.recover(digest, signature);
    }

    function _hash(uint id) internal view returns(bytes32){
        return _hashTypedDataV4(keccak256(abi.encode(
            keccak256("EIP712Domain(uint id)"),
            id
        )));
    }    
    function setBaseUri(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }
    function setSalePaused(bool temp) external onlyOwner {
        salePaused = temp;
    }
    function setCrossmintPaused(bool temp) external onlyOwner {
        crossmintPaused = temp;
    }
    function setPresalePaused(bool temp) external onlyOwner {
        presalePaused = temp;
    }
    function setSalePrice(uint temp) external onlyOwner {
        salePrice = temp;
    }
    function setPresaleSupply(uint temp) external onlyOwner {
        presaleSupply = temp;
    }
    function setPresalePrice(uint temp) external onlyOwner {
        presalePrice = temp;
    }
    function setCrossMintPrice(uint temp) external onlyOwner {
        crossmintPrice = temp;
    }

    function setWhitelistVerify(address _to) external onlyOwner{
        whitelistVerify = _to;
    }

    function setMaxSupply(uint _temp) external onlyOwner{
        maxSupply = _temp;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }   
    function withdraw() external onlyOwner {
        uint _balance = address(this).balance;
        payable(msg.sender).transfer(_balance);
       
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"SaleIsPaused","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"check","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"cross","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"crossmintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crossmintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reciever","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"sendManyNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"sendNftstoMultipleWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"temp","type":"uint256"}],"name":"setCrossMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"temp","type":"bool"}],"name":"setCrossmintPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_temp","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"temp","type":"bool"}],"name":"setPresalePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"temp","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"temp","type":"uint256"}],"name":"setPresaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"temp","type":"bool"}],"name":"setSalePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"temp","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"setWhitelistVerify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voucherIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101406040526102e76009556040518060600160405280602c8152602001620056e0602c9139600a908162000035919062000647565b506001600b5f6101000a81548160ff0219169083151502179055505f600b60016101000a81548160ff0219169083151502179055505f600b60026101000a81548160ff02191690831515021790555073bf3e689b25f460f695fc5a6715aa9c74de79e52f600b60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550666a94d74f430000600d55666a94d74f430000600e55666a94d74f430000600f556102866010553480156200010c575f80fd5b506040518060400160405280601b81526020017f506967656f6e73206f66204e657720596f726b3a2050686173653400000000008152506040518060400160405280600981526020017f506967656f6e73203400000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f57454233434c55420000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152505f828051906020012090505f828051906020012090505f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200024b818484620002e060201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050620002b4620002a86200031b60201b60201c565b6200032260201b60201c565b8160039081620002c5919062000647565b508060049081620002d7919062000647565b505050620007f4565b5f8383834630604051602001620002fc95949392919062000799565b6040516020818303038152906040528051906020012090509392505050565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200045f57607f821691505b6020821081036200047557620004746200041a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200049c565b620004e586836200049c565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6200052f620005296200052384620004fd565b62000506565b620004fd565b9050919050565b5f819050919050565b6200054a836200050f565b62000562620005598262000536565b848454620004a8565b825550505050565b5f90565b620005786200056a565b620005858184846200053f565b505050565b5b81811015620005ac57620005a05f826200056e565b6001810190506200058b565b5050565b601f821115620005fb57620005c5816200047b565b620005d0846200048d565b81016020851015620005e0578190505b620005f8620005ef856200048d565b8301826200058a565b50505b505050565b5f82821c905092915050565b5f6200061d5f198460080262000600565b1980831691505092915050565b5f6200063783836200060c565b9150826002028217905092915050565b6200065282620003e3565b67ffffffffffffffff8111156200066e576200066d620003ed565b5b6200067a825462000447565b62000687828285620005b0565b5f60209050601f831160018114620006bd575f8415620006a8578287015190505b620006b485826200062a565b86555062000723565b601f198416620006cd866200047b565b5f5b82811015620006f657848901518255600182019150602085019450602081019050620006cf565b8683101562000716578489015162000712601f8916826200060c565b8355505b6001600288020188555050505b505050505050565b5f819050919050565b6200073f816200072b565b82525050565b6200075081620004fd565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007818262000756565b9050919050565b620007938162000775565b82525050565b5f60a082019050620007ae5f83018862000734565b620007bd602083018762000734565b620007cc604083018662000734565b620007db606083018562000745565b620007ea608083018462000788565b9695505050505050565b60805160a05160c05160e0516101005161012051614ea46200083c5f395f61355901525f61359b01525f61357a01525f6134af01525f61350501525f61352e0152614ea45ff3fe608060405260043610610265575f3560e01c80638da5cb5b11610143578063bc6cb080116100b5578063e03b41f011610079578063e03b41f0146108ab578063e5233047146108d5578063e57deb39146108f1578063e985e9c51461092d578063f2fde38b14610969578063f51f96dd1461099157610265565b8063bc6cb080146107d9578063bee53534146107f5578063c87b56dd1461081d578063cd594ffa14610859578063d5abeb011461088157610265565b8063a22cb46511610107578063a22cb465146106d1578063a79fdbb4146106f9578063ab34ee4f14610723578063b3a196e91461075f578063b88d4fde14610789578063b96502cb146107b157610265565b80638da5cb5b1461060f57806395d89b4114610639578063994a0ae714610663578063a0712d681461068d578063a0bcfc7f146106a957610265565b806340a72310116101dc5780636c0360eb116101a05780636c0360eb1461051b5780636f8b44b01461054557806370a082311461056d578063715018a6146105a95780638a0c5204146105bf5780638d92becd146105e757610265565b806340a723101461043d57806342842e0e1461046557806344e973781461048d5780635d08c1ae146104b55780636352211e146104df57610265565b806318160ddd1161022e57806318160ddd1461035d5780631919fed71461038757806323b872dd146103af578063318f0789146103d75780633549345e146103ff5780633ccfd60b1461042757610265565b80620e7fa81461026957806301ffc9a71461029357806306fdde03146102cf578063081812fc146102f9578063095ea7b314610335575b5f80fd5b348015610274575f80fd5b5061027d6109bb565b60405161028a91906137e3565b60405180910390f35b34801561029e575f80fd5b506102b960048036038101906102b49190613862565b6109c1565b6040516102c691906138a7565b60405180910390f35b3480156102da575f80fd5b506102e3610aa2565b6040516102f0919061394a565b60405180910390f35b348015610304575f80fd5b5061031f600480360381019061031a9190613994565b610b32565b60405161032c91906139fe565b60405180910390f35b348015610340575f80fd5b5061035b60048036038101906103569190613a41565b610baa565b005b348015610368575f80fd5b50610371610cb3565b60405161037e91906137e3565b60405180910390f35b348015610392575f80fd5b506103ad60048036038101906103a89190613994565b610cc0565b005b3480156103ba575f80fd5b506103d560048036038101906103d09190613a7f565b610d46565b005b3480156103e2575f80fd5b506103fd60048036038101906103f89190613af9565b610d56565b005b34801561040a575f80fd5b5061042560048036038101906104209190613994565b610def565b005b348015610432575f80fd5b5061043b610e75565b005b348015610448575f80fd5b50610463600480360381019061045e9190613a41565b610f3c565b005b348015610470575f80fd5b5061048b60048036038101906104869190613a7f565b61101c565b005b348015610498575f80fd5b506104b360048036038101906104ae9190613b24565b61103b565b005b3480156104c0575f80fd5b506104c96110fb565b6040516104d691906138a7565b60405180910390f35b3480156104ea575f80fd5b5061050560048036038101906105009190613994565b61110d565b60405161051291906139fe565b60405180910390f35b348015610526575f80fd5b5061052f611121565b60405161053c919061394a565b60405180910390f35b348015610550575f80fd5b5061056b60048036038101906105669190613994565b6111ad565b005b348015610578575f80fd5b50610593600480360381019061058e9190613b24565b611233565b6040516105a091906137e3565b60405180910390f35b3480156105b4575f80fd5b506105bd6112fd565b005b3480156105ca575f80fd5b506105e560048036038101906105e09190613c8f565b611384565b005b3480156105f2575f80fd5b5061060d60048036038101906106089190613af9565b611498565b005b34801561061a575f80fd5b50610623611530565b60405161063091906139fe565b60405180910390f35b348015610644575f80fd5b5061064d611557565b60405161065a919061394a565b60405180910390f35b34801561066e575f80fd5b506106776115e7565b60405161068491906138a7565b60405180910390f35b6106a760048036038101906106a29190613994565b6115fa565b005b3480156106b4575f80fd5b506106cf60048036038101906106ca9190613d86565b61173d565b005b3480156106dc575f80fd5b506106f760048036038101906106f29190613dcd565b6117cc565b005b348015610704575f80fd5b5061070d61193e565b60405161071a91906138a7565b60405180910390f35b34801561072e575f80fd5b5061074960048036038101906107449190613994565b611951565b60405161075691906137e3565b60405180910390f35b34801561076a575f80fd5b50610773611966565b60405161078091906137e3565b60405180910390f35b348015610794575f80fd5b506107af60048036038101906107aa9190613ea9565b61196c565b005b3480156107bc575f80fd5b506107d760048036038101906107d29190613994565b6119bf565b005b6107f360048036038101906107ee9190613f29565b611a45565b005b348015610800575f80fd5b5061081b60048036038101906108169190613af9565b611ce4565b005b348015610828575f80fd5b50610843600480360381019061083e9190613994565b611d7d565b604051610850919061394a565b60405180910390f35b348015610864575f80fd5b5061087f600480360381019061087a9190613994565b611e18565b005b34801561088c575f80fd5b50610895611e9e565b6040516108a291906137e3565b60405180910390f35b3480156108b6575f80fd5b506108bf611ea4565b6040516108cc91906137e3565b60405180910390f35b6108ef60048036038101906108ea9190613a41565b611eaa565b005b3480156108fc575f80fd5b5061091760048036038101906109129190613f95565b611ffa565b60405161092491906139fe565b60405180910390f35b348015610938575f80fd5b50610953600480360381019061094e9190613fef565b61200d565b60405161096091906138a7565b60405180910390f35b348015610974575f80fd5b5061098f600480360381019061098a9190613b24565b61209b565b005b34801561099c575f80fd5b506109a5612191565b6040516109b291906137e3565b60405180910390f35b600f5481565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a9b5750610a9a82612197565b5b9050919050565b606060038054610ab19061405a565b80601f0160208091040260200160405190810160405280929190818152602001828054610add9061405a565b8015610b285780601f10610aff57610100808354040283529160200191610b28565b820191905f5260205f20905b815481529060010190602001808311610b0b57829003601f168201915b5050505050905090565b5f610b3c82612200565b610b72576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610bb48261110d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c1b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3a612237565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c6c5750610c6a81610c65612237565b61200d565b155b15610ca3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cae83838361223e565b505050565b5f60025460015403905090565b610cc8612237565b73ffffffffffffffffffffffffffffffffffffffff16610ce6611530565b73ffffffffffffffffffffffffffffffffffffffff1614610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d33906140d4565b60405180910390fd5b80600e8190555050565b610d518383836122ed565b505050565b610d5e612237565b73ffffffffffffffffffffffffffffffffffffffff16610d7c611530565b73ffffffffffffffffffffffffffffffffffffffff1614610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc9906140d4565b60405180910390fd5b80600b60026101000a81548160ff02191690831515021790555050565b610df7612237565b73ffffffffffffffffffffffffffffffffffffffff16610e15611530565b73ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e62906140d4565b60405180910390fd5b80600f8190555050565b610e7d612237565b73ffffffffffffffffffffffffffffffffffffffff16610e9b611530565b73ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906140d4565b60405180910390fd5b5f4790503373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610f38573d5f803e3d5ffd5b5050565b610f44612237565b73ffffffffffffffffffffffffffffffffffffffff16610f62611530565b73ffffffffffffffffffffffffffffffffffffffff1614610fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faf906140d4565b60405180910390fd5b60095481610fc4610cb3565b610fce919061411f565b1061100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110059061419c565b60405180910390fd5b61101882826127b7565b5050565b61103683838360405180602001604052805f81525061196c565b505050565b611043612237565b73ffffffffffffffffffffffffffffffffffffffff16611061611530565b73ffffffffffffffffffffffffffffffffffffffff16146110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae906140d4565b60405180910390fd5b80600b60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5f9054906101000a900460ff1681565b5f611117826127d4565b5f01519050919050565b600a805461112e9061405a565b80601f016020809104026020016040519081016040528092919081815260200182805461115a9061405a565b80156111a55780601f1061117c576101008083540402835291602001916111a5565b820191905f5260205f20905b81548152906001019060200180831161118857829003601f168201915b505050505081565b6111b5612237565b73ffffffffffffffffffffffffffffffffffffffff166111d3611530565b73ffffffffffffffffffffffffffffffffffffffff1614611229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611220906140d4565b60405180910390fd5b8060098190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611299576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611305612237565b73ffffffffffffffffffffffffffffffffffffffff16611323611530565b73ffffffffffffffffffffffffffffffffffffffff1614611379576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611370906140d4565b60405180910390fd5b6113825f612a3e565b565b61138c612237565b73ffffffffffffffffffffffffffffffffffffffff166113aa611530565b73ffffffffffffffffffffffffffffffffffffffff1614611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f7906140d4565b60405180910390fd5b600954815161140d610cb3565b611417919061411f565b10611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e9061419c565b60405180910390fd5b5f5b815181101561149457611487828281518110611478576114776141ba565b5b602002602001015160016127b7565b8080600101915050611459565b5050565b6114a0612237565b73ffffffffffffffffffffffffffffffffffffffff166114be611530565b73ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906140d4565b60405180910390fd5b80600b5f6101000a81548160ff02191690831515021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546115669061405a565b80601f01602080910402602001604051908101604052809291908181526020018280546115929061405a565b80156115dd5780601f106115b4576101008083540402835291602001916115dd565b820191905f5260205f20905b8154815290600101906020018083116115c057829003601f168201915b5050505050905090565b600b60029054906101000a900460ff1681565b600b5f9054906101000a900460ff1615611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090614231565b60405180910390fd5b5f811161168b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611682906142bf565b60405180910390fd5b600954611696610cb3565b826116a1919061411f565b106116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d890614327565b60405180910390fd5b80600e546116ef9190614345565b3414611730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611727906143d0565b60405180910390fd5b61173a33826127b7565b50565b611745612237565b73ffffffffffffffffffffffffffffffffffffffff16611763611530565b73ffffffffffffffffffffffffffffffffffffffff16146117b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b0906140d4565b60405180910390fd5b80600a90816117c8919061458b565b5050565b6117d4612237565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611838576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f611844612237565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118ed612237565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161193291906138a7565b60405180910390a35050565b600b60019054906101000a900460ff1681565b600c602052805f5260405f205f915090505481565b60105481565b6119778484846122ed565b61198384848484612aff565b6119b9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6119c7612237565b73ffffffffffffffffffffffffffffffffffffffff166119e5611530565b73ffffffffffffffffffffffffffffffffffffffff1614611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a32906140d4565b60405180910390fd5b8060108190555050565b600b60019054906101000a900460ff1615611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c90614231565b60405180910390fd5b5f8311611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace906142bf565b60405180910390fd5b600954611ae2610cb3565b84611aed919061411f565b10611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2490614327565b60405180910390fd5b601054611b38610cb3565b84611b43919061411f565b10611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a906146a4565b60405180910390fd5b82600f54611b919190614345565b3414611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc9906143d0565b60405180910390fd5b600b60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c158383611ffa565b73ffffffffffffffffffffffffffffffffffffffff1614611c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c629061470c565b60405180910390fd5b5f600c5f8481526020019081526020015f205414611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb590614774565b60405180910390fd5b611cc833846127b7565b6001600c5f8481526020019081526020015f2081905550505050565b611cec612237565b73ffffffffffffffffffffffffffffffffffffffff16611d0a611530565b73ffffffffffffffffffffffffffffffffffffffff1614611d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d57906140d4565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b6060611d8882612200565b611dbe576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611dc7612c78565b90505f815103611de55760405180602001604052805f815250611e10565b80611def84612d08565b604051602001611e009291906147cc565b6040516020818303038152906040525b915050919050565b611e20612237565b73ffffffffffffffffffffffffffffffffffffffff16611e3e611530565b73ffffffffffffffffffffffffffffffffffffffff1614611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b906140d4565b60405180910390fd5b80600d8190555050565b60095481565b600d5481565b600b60029054906101000a900460ff1615611ef1576040517f71cc92d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095481611efd610cb3565b611f07919061411f565b10611f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3e9061419c565b60405180910390fd5b80600d54611f559190614345565b3414611f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8d906143d0565b60405180910390fd5b601054611fa1610cb3565b82611fac919061411f565b10611fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe390614839565b60405180910390fd5b611ff682826127b7565b5050565b5f6120058383612e61565b905092915050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6120a3612237565b73ffffffffffffffffffffffffffffffffffffffff166120c1611530565b73ffffffffffffffffffffffffffffffffffffffff1614612117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210e906140d4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217c906148c7565b60405180910390fd5b61218e81612a3e565b50565b600e5481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f60015482108015612230575060055f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260075f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6122f7826127d4565b90505f815f015173ffffffffffffffffffffffffffffffffffffffff1661231c612237565b73ffffffffffffffffffffffffffffffffffffffff16148061234e575061234d825f0151612348612237565b61200d565b5b80612393575061235c612237565b73ffffffffffffffffffffffffffffffffffffffff1661237b84610b32565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123cc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff1614612434576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612499576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124a68585856001612e81565b6124b45f84845f015161223e565b600160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8581526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8581526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001840190505f73ffffffffffffffffffffffffffffffffffffffff1660055f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036127475760015481101561274657825f015160055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826020015160055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127b08585856001612e87565b5050505050565b6127d0828260405180602001604052805f815250612e8d565b5050565b6127dc61378b565b5f829050600154811015612a07575f60055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090508060400151612a05575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146128f1578092505050612a39565b5b600115612a045781806001900392505060055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146129ff578092505050612a39565b6128f2565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f612b1f8473ffffffffffffffffffffffffffffffffffffffff16612e9f565b15612c6b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b48612237565b8786866040518563ffffffff1660e01b8152600401612b6a9493929190614937565b6020604051808303815f875af1925050508015612ba557506040513d601f19601f82011682018060405250810190612ba29190614995565b60015b612c1b573d805f8114612bd3576040519150601f19603f3d011682016040523d82523d5f602084013e612bd8565b606091505b505f815103612c13576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c70565b600190505b949350505050565b6060600a8054612c879061405a565b80601f0160208091040260200160405190810160405280929190818152602001828054612cb39061405a565b8015612cfe5780601f10612cd557610100808354040283529160200191612cfe565b820191905f5260205f20905b815481529060010190602001808311612ce157829003601f168201915b5050505050905090565b60605f8203612d4e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e5c565b5f8290505f5b5f8214612d7d578080612d66906149c0565b915050600a82612d769190614a34565b9150612d54565b5f8167ffffffffffffffff811115612d9857612d97613b53565b5b6040519080825280601f01601f191660200182016040528015612dca5781602001600182028036833780820191505090505b5090505b5f8514612e5557600182612de29190614a64565b9150600a85612df19190614a97565b6030612dfd919061411f565b60f81b818381518110612e1357612e126141ba565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612e4e9190614a34565b9450612dce565b8093505050505b919050565b5f80612e6c84612eb0565b9050612e788184612f09565b91505092915050565b50505050565b50505050565b612e9a8383836001612f2e565b505050565b5f80823b90505f8111915050919050565b5f612f027f092b584b565f9711d79732cb738ace6cf7a206eb6277470732d92d8cc83ad27583604051602001612ee7929190614adf565b6040516020818303038152906040528051906020012061324d565b9050919050565b5f805f612f168585613266565b91509150612f23816132e1565b819250505092915050565b5f60015490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f99576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8403612fd2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fde5f868387612e81565b8360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f5b8581101561323157818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156131e557506131e35f888488612aff565b155b1561321c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505061316c565b5080600181905550506132465f868387612e87565b5050505050565b5f61325f6132596134ac565b836135c5565b9050919050565b5f8060418351036132a3575f805f602086015192506040860151915060608601515f1a9050613297878285856135f7565b945094505050506132da565b60408351036132d2575f8060208501519150604085015190506132c78683836136f8565b9350935050506132da565b5f6002915091505b9250929050565b5f60048111156132f4576132f3614b06565b5b81600481111561330757613306614b06565b5b03156134a9576001600481111561332157613320614b06565b5b81600481111561333457613333614b06565b5b03613374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336b90614b7d565b60405180910390fd5b6002600481111561338857613387614b06565b5b81600481111561339b5761339a614b06565b5b036133db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d290614be5565b60405180910390fd5b600360048111156133ef576133ee614b06565b5b81600481111561340257613401614b06565b5b03613442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343990614c73565b60405180910390fd5b60048081111561345557613454614b06565b5b81600481111561346857613467614b06565b5b036134a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349f90614d01565b60405180910390fd5b5b50565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561352757507f000000000000000000000000000000000000000000000000000000000000000046145b15613554577f000000000000000000000000000000000000000000000000000000000000000090506135c2565b6135bf7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613752565b90505b90565b5f82826040516020016135d9929190614d89565b60405160208183030381529060405280519060200120905092915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c111561362f575f6003915091506136ef565b601b8560ff16141580156136475750601c8560ff1614155b15613658575f6004915091506136ef565b5f6001878787876040515f815260200160405260405161367b9493929190614dda565b6020604051602081039080840390855afa15801561369b573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036136e7575f600192509250506136ef565b805f92509250505b94509492505050565b5f805f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f1b841690505f601b60ff865f1c901c613736919061411f565b9050613744878288856135f7565b935093505050935093915050565b5f838383463060405160200161376c959493929190614e1d565b6040516020818303038152906040528051906020012090509392505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f819050919050565b6137dd816137cb565b82525050565b5f6020820190506137f65f8301846137d4565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138418161380d565b811461384b575f80fd5b50565b5f8135905061385c81613838565b92915050565b5f6020828403121561387757613876613805565b5b5f6138848482850161384e565b91505092915050565b5f8115159050919050565b6138a18161388d565b82525050565b5f6020820190506138ba5f830184613898565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156138f75780820151818401526020810190506138dc565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61391c826138c0565b61392681856138ca565b93506139368185602086016138da565b61393f81613902565b840191505092915050565b5f6020820190508181035f8301526139628184613912565b905092915050565b613973816137cb565b811461397d575f80fd5b50565b5f8135905061398e8161396a565b92915050565b5f602082840312156139a9576139a8613805565b5b5f6139b684828501613980565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6139e8826139bf565b9050919050565b6139f8816139de565b82525050565b5f602082019050613a115f8301846139ef565b92915050565b613a20816139de565b8114613a2a575f80fd5b50565b5f81359050613a3b81613a17565b92915050565b5f8060408385031215613a5757613a56613805565b5b5f613a6485828601613a2d565b9250506020613a7585828601613980565b9150509250929050565b5f805f60608486031215613a9657613a95613805565b5b5f613aa386828701613a2d565b9350506020613ab486828701613a2d565b9250506040613ac586828701613980565b9150509250925092565b613ad88161388d565b8114613ae2575f80fd5b50565b5f81359050613af381613acf565b92915050565b5f60208284031215613b0e57613b0d613805565b5b5f613b1b84828501613ae5565b91505092915050565b5f60208284031215613b3957613b38613805565b5b5f613b4684828501613a2d565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613b8982613902565b810181811067ffffffffffffffff82111715613ba857613ba7613b53565b5b80604052505050565b5f613bba6137fc565b9050613bc68282613b80565b919050565b5f67ffffffffffffffff821115613be557613be4613b53565b5b602082029050602081019050919050565b5f80fd5b5f613c0c613c0784613bcb565b613bb1565b90508083825260208201905060208402830185811115613c2f57613c2e613bf6565b5b835b81811015613c585780613c448882613a2d565b845260208401935050602081019050613c31565b5050509392505050565b5f82601f830112613c7657613c75613b4f565b5b8135613c86848260208601613bfa565b91505092915050565b5f60208284031215613ca457613ca3613805565b5b5f82013567ffffffffffffffff811115613cc157613cc0613809565b5b613ccd84828501613c62565b91505092915050565b5f80fd5b5f67ffffffffffffffff821115613cf457613cf3613b53565b5b613cfd82613902565b9050602081019050919050565b828183375f83830152505050565b5f613d2a613d2584613cda565b613bb1565b905082815260208101848484011115613d4657613d45613cd6565b5b613d51848285613d0a565b509392505050565b5f82601f830112613d6d57613d6c613b4f565b5b8135613d7d848260208601613d18565b91505092915050565b5f60208284031215613d9b57613d9a613805565b5b5f82013567ffffffffffffffff811115613db857613db7613809565b5b613dc484828501613d59565b91505092915050565b5f8060408385031215613de357613de2613805565b5b5f613df085828601613a2d565b9250506020613e0185828601613ae5565b9150509250929050565b5f67ffffffffffffffff821115613e2557613e24613b53565b5b613e2e82613902565b9050602081019050919050565b5f613e4d613e4884613e0b565b613bb1565b905082815260208101848484011115613e6957613e68613cd6565b5b613e74848285613d0a565b509392505050565b5f82601f830112613e9057613e8f613b4f565b5b8135613ea0848260208601613e3b565b91505092915050565b5f805f8060808587031215613ec157613ec0613805565b5b5f613ece87828801613a2d565b9450506020613edf87828801613a2d565b9350506040613ef087828801613980565b925050606085013567ffffffffffffffff811115613f1157613f10613809565b5b613f1d87828801613e7c565b91505092959194509250565b5f805f60608486031215613f4057613f3f613805565b5b5f613f4d86828701613980565b9350506020613f5e86828701613980565b925050604084013567ffffffffffffffff811115613f7f57613f7e613809565b5b613f8b86828701613e7c565b9150509250925092565b5f8060408385031215613fab57613faa613805565b5b5f613fb885828601613980565b925050602083013567ffffffffffffffff811115613fd957613fd8613809565b5b613fe585828601613e7c565b9150509250929050565b5f806040838503121561400557614004613805565b5b5f61401285828601613a2d565b925050602061402385828601613a2d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061407157607f821691505b6020821081036140845761408361402d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6140be6020836138ca565b91506140c98261408a565b602082019050919050565b5f6020820190508181035f8301526140eb816140b2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614129826137cb565b9150614134836137cb565b925082820190508082111561414c5761414b6140f2565b5b92915050565b7f4d617820537570706c7920526561636865642e000000000000000000000000005f82015250565b5f6141866013836138ca565b915061419182614152565b602082019050919050565b5f6020820190508181035f8301526141b38161417a565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f53616c65206973207061757365642100000000000000000000000000000000005f82015250565b5f61421b600f836138ca565b9150614226826141e7565b602082019050919050565b5f6020820190508181035f8301526142488161420f565b9050919050565b7f4d696e696d756d2031204e46542068617320746f206265206d696e74656420705f8201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b5f6142a9602e836138ca565b91506142b48261424f565b604082019050919050565b5f6020820190508181035f8301526142d68161429d565b9050919050565b7f536f6c64206f75740000000000000000000000000000000000000000000000005f82015250565b5f6143116008836138ca565b915061431c826142dd565b602082019050919050565b5f6020820190508181035f83015261433e81614305565b9050919050565b5f61434f826137cb565b915061435a836137cb565b9250828202614368816137cb565b9150828204841483151761437f5761437e6140f2565b5b5092915050565b7f506c656173652073656e6420636f727265637420616d6f756e742e00000000005f82015250565b5f6143ba601b836138ca565b91506143c582614386565b602082019050919050565b5f6020820190508181035f8301526143e7816143ae565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261444a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261440f565b614454868361440f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61448f61448a614485846137cb565b61446c565b6137cb565b9050919050565b5f819050919050565b6144a883614475565b6144bc6144b482614496565b84845461441b565b825550505050565b5f90565b6144d06144c4565b6144db81848461449f565b505050565b5b818110156144fe576144f35f826144c8565b6001810190506144e1565b5050565b601f82111561454357614514816143ee565b61451d84614400565b8101602085101561452c578190505b61454061453885614400565b8301826144e0565b50505b505050565b5f82821c905092915050565b5f6145635f1984600802614548565b1980831691505092915050565b5f61457b8383614554565b9150826002028217905092915050565b614594826138c0565b67ffffffffffffffff8111156145ad576145ac613b53565b5b6145b7825461405a565b6145c2828285614502565b5f60209050601f8311600181146145f3575f84156145e1578287015190505b6145eb8582614570565b865550614652565b601f198416614601866143ee565b5f5b8281101561462857848901518255600182019150602085019450602081019050614603565b868310156146455784890151614641601f891682614554565b8355505b6001600288020188555050505b505050505050565b7f50726573616c65204c696d697420526561636865642e000000000000000000005f82015250565b5f61468e6016836138ca565b91506146998261465a565b602082019050919050565b5f6020820190508181035f8301526146bb81614682565b9050919050565b7f596f7520617265206e6f742077686974656c69737465642e00000000000000005f82015250565b5f6146f66018836138ca565b9150614701826146c2565b602082019050919050565b5f6020820190508181035f830152614723816146ea565b9050919050565b7f496e76616c696420566f75636865722e2054727920416761696e2e00000000005f82015250565b5f61475e601b836138ca565b91506147698261472a565b602082019050919050565b5f6020820190508181035f83015261478b81614752565b9050919050565b5f81905092915050565b5f6147a6826138c0565b6147b08185614792565b93506147c08185602086016138da565b80840191505092915050565b5f6147d7828561479c565b91506147e3828461479c565b91508190509392505050565b7f4c696d697420526561636865642e0000000000000000000000000000000000005f82015250565b5f614823600e836138ca565b915061482e826147ef565b602082019050919050565b5f6020820190508181035f83015261485081614817565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6148b16026836138ca565b91506148bc82614857565b604082019050919050565b5f6020820190508181035f8301526148de816148a5565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f614909826148e5565b61491381856148ef565b93506149238185602086016138da565b61492c81613902565b840191505092915050565b5f60808201905061494a5f8301876139ef565b61495760208301866139ef565b61496460408301856137d4565b818103606083015261497681846148ff565b905095945050505050565b5f8151905061498f81613838565b92915050565b5f602082840312156149aa576149a9613805565b5b5f6149b784828501614981565b91505092915050565b5f6149ca826137cb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149fc576149fb6140f2565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a3e826137cb565b9150614a49836137cb565b925082614a5957614a58614a07565b5b828204905092915050565b5f614a6e826137cb565b9150614a79836137cb565b9250828203905081811115614a9157614a906140f2565b5b92915050565b5f614aa1826137cb565b9150614aac836137cb565b925082614abc57614abb614a07565b5b828206905092915050565b5f819050919050565b614ad981614ac7565b82525050565b5f604082019050614af25f830185614ad0565b614aff60208301846137d4565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f614b676018836138ca565b9150614b7282614b33565b602082019050919050565b5f6020820190508181035f830152614b9481614b5b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f614bcf601f836138ca565b9150614bda82614b9b565b602082019050919050565b5f6020820190508181035f830152614bfc81614bc3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f614c5d6022836138ca565b9150614c6882614c03565b604082019050919050565b5f6020820190508181035f830152614c8a81614c51565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f614ceb6022836138ca565b9150614cf682614c91565b604082019050919050565b5f6020820190508181035f830152614d1881614cdf565b9050919050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614d53600283614792565b9150614d5e82614d1f565b600282019050919050565b5f819050919050565b614d83614d7e82614ac7565b614d69565b82525050565b5f614d9382614d47565b9150614d9f8285614d72565b602082019150614daf8284614d72565b6020820191508190509392505050565b5f60ff82169050919050565b614dd481614dbf565b82525050565b5f608082019050614ded5f830187614ad0565b614dfa6020830186614dcb565b614e076040830185614ad0565b614e146060830184614ad0565b95945050505050565b5f60a082019050614e305f830188614ad0565b614e3d6020830187614ad0565b614e4a6040830186614ad0565b614e5760608301856137d4565b614e6460808301846139ef565b969550505050505056fea26469706673582212209f6c1ec124e5ddd3b18a2941f3d20a53734e08ff4379f55d0ab46284de41fa8964736f6c6343000816003368747470733a2f2f706967656f6e737068617365346170692e76657263656c2e6170702f6170692f6e66742f

Deployed Bytecode

0x608060405260043610610265575f3560e01c80638da5cb5b11610143578063bc6cb080116100b5578063e03b41f011610079578063e03b41f0146108ab578063e5233047146108d5578063e57deb39146108f1578063e985e9c51461092d578063f2fde38b14610969578063f51f96dd1461099157610265565b8063bc6cb080146107d9578063bee53534146107f5578063c87b56dd1461081d578063cd594ffa14610859578063d5abeb011461088157610265565b8063a22cb46511610107578063a22cb465146106d1578063a79fdbb4146106f9578063ab34ee4f14610723578063b3a196e91461075f578063b88d4fde14610789578063b96502cb146107b157610265565b80638da5cb5b1461060f57806395d89b4114610639578063994a0ae714610663578063a0712d681461068d578063a0bcfc7f146106a957610265565b806340a72310116101dc5780636c0360eb116101a05780636c0360eb1461051b5780636f8b44b01461054557806370a082311461056d578063715018a6146105a95780638a0c5204146105bf5780638d92becd146105e757610265565b806340a723101461043d57806342842e0e1461046557806344e973781461048d5780635d08c1ae146104b55780636352211e146104df57610265565b806318160ddd1161022e57806318160ddd1461035d5780631919fed71461038757806323b872dd146103af578063318f0789146103d75780633549345e146103ff5780633ccfd60b1461042757610265565b80620e7fa81461026957806301ffc9a71461029357806306fdde03146102cf578063081812fc146102f9578063095ea7b314610335575b5f80fd5b348015610274575f80fd5b5061027d6109bb565b60405161028a91906137e3565b60405180910390f35b34801561029e575f80fd5b506102b960048036038101906102b49190613862565b6109c1565b6040516102c691906138a7565b60405180910390f35b3480156102da575f80fd5b506102e3610aa2565b6040516102f0919061394a565b60405180910390f35b348015610304575f80fd5b5061031f600480360381019061031a9190613994565b610b32565b60405161032c91906139fe565b60405180910390f35b348015610340575f80fd5b5061035b60048036038101906103569190613a41565b610baa565b005b348015610368575f80fd5b50610371610cb3565b60405161037e91906137e3565b60405180910390f35b348015610392575f80fd5b506103ad60048036038101906103a89190613994565b610cc0565b005b3480156103ba575f80fd5b506103d560048036038101906103d09190613a7f565b610d46565b005b3480156103e2575f80fd5b506103fd60048036038101906103f89190613af9565b610d56565b005b34801561040a575f80fd5b5061042560048036038101906104209190613994565b610def565b005b348015610432575f80fd5b5061043b610e75565b005b348015610448575f80fd5b50610463600480360381019061045e9190613a41565b610f3c565b005b348015610470575f80fd5b5061048b60048036038101906104869190613a7f565b61101c565b005b348015610498575f80fd5b506104b360048036038101906104ae9190613b24565b61103b565b005b3480156104c0575f80fd5b506104c96110fb565b6040516104d691906138a7565b60405180910390f35b3480156104ea575f80fd5b5061050560048036038101906105009190613994565b61110d565b60405161051291906139fe565b60405180910390f35b348015610526575f80fd5b5061052f611121565b60405161053c919061394a565b60405180910390f35b348015610550575f80fd5b5061056b60048036038101906105669190613994565b6111ad565b005b348015610578575f80fd5b50610593600480360381019061058e9190613b24565b611233565b6040516105a091906137e3565b60405180910390f35b3480156105b4575f80fd5b506105bd6112fd565b005b3480156105ca575f80fd5b506105e560048036038101906105e09190613c8f565b611384565b005b3480156105f2575f80fd5b5061060d60048036038101906106089190613af9565b611498565b005b34801561061a575f80fd5b50610623611530565b60405161063091906139fe565b60405180910390f35b348015610644575f80fd5b5061064d611557565b60405161065a919061394a565b60405180910390f35b34801561066e575f80fd5b506106776115e7565b60405161068491906138a7565b60405180910390f35b6106a760048036038101906106a29190613994565b6115fa565b005b3480156106b4575f80fd5b506106cf60048036038101906106ca9190613d86565b61173d565b005b3480156106dc575f80fd5b506106f760048036038101906106f29190613dcd565b6117cc565b005b348015610704575f80fd5b5061070d61193e565b60405161071a91906138a7565b60405180910390f35b34801561072e575f80fd5b5061074960048036038101906107449190613994565b611951565b60405161075691906137e3565b60405180910390f35b34801561076a575f80fd5b50610773611966565b60405161078091906137e3565b60405180910390f35b348015610794575f80fd5b506107af60048036038101906107aa9190613ea9565b61196c565b005b3480156107bc575f80fd5b506107d760048036038101906107d29190613994565b6119bf565b005b6107f360048036038101906107ee9190613f29565b611a45565b005b348015610800575f80fd5b5061081b60048036038101906108169190613af9565b611ce4565b005b348015610828575f80fd5b50610843600480360381019061083e9190613994565b611d7d565b604051610850919061394a565b60405180910390f35b348015610864575f80fd5b5061087f600480360381019061087a9190613994565b611e18565b005b34801561088c575f80fd5b50610895611e9e565b6040516108a291906137e3565b60405180910390f35b3480156108b6575f80fd5b506108bf611ea4565b6040516108cc91906137e3565b60405180910390f35b6108ef60048036038101906108ea9190613a41565b611eaa565b005b3480156108fc575f80fd5b5061091760048036038101906109129190613f95565b611ffa565b60405161092491906139fe565b60405180910390f35b348015610938575f80fd5b50610953600480360381019061094e9190613fef565b61200d565b60405161096091906138a7565b60405180910390f35b348015610974575f80fd5b5061098f600480360381019061098a9190613b24565b61209b565b005b34801561099c575f80fd5b506109a5612191565b6040516109b291906137e3565b60405180910390f35b600f5481565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a9b5750610a9a82612197565b5b9050919050565b606060038054610ab19061405a565b80601f0160208091040260200160405190810160405280929190818152602001828054610add9061405a565b8015610b285780601f10610aff57610100808354040283529160200191610b28565b820191905f5260205f20905b815481529060010190602001808311610b0b57829003601f168201915b5050505050905090565b5f610b3c82612200565b610b72576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610bb48261110d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c1b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3a612237565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c6c5750610c6a81610c65612237565b61200d565b155b15610ca3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cae83838361223e565b505050565b5f60025460015403905090565b610cc8612237565b73ffffffffffffffffffffffffffffffffffffffff16610ce6611530565b73ffffffffffffffffffffffffffffffffffffffff1614610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d33906140d4565b60405180910390fd5b80600e8190555050565b610d518383836122ed565b505050565b610d5e612237565b73ffffffffffffffffffffffffffffffffffffffff16610d7c611530565b73ffffffffffffffffffffffffffffffffffffffff1614610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc9906140d4565b60405180910390fd5b80600b60026101000a81548160ff02191690831515021790555050565b610df7612237565b73ffffffffffffffffffffffffffffffffffffffff16610e15611530565b73ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e62906140d4565b60405180910390fd5b80600f8190555050565b610e7d612237565b73ffffffffffffffffffffffffffffffffffffffff16610e9b611530565b73ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906140d4565b60405180910390fd5b5f4790503373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610f38573d5f803e3d5ffd5b5050565b610f44612237565b73ffffffffffffffffffffffffffffffffffffffff16610f62611530565b73ffffffffffffffffffffffffffffffffffffffff1614610fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faf906140d4565b60405180910390fd5b60095481610fc4610cb3565b610fce919061411f565b1061100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110059061419c565b60405180910390fd5b61101882826127b7565b5050565b61103683838360405180602001604052805f81525061196c565b505050565b611043612237565b73ffffffffffffffffffffffffffffffffffffffff16611061611530565b73ffffffffffffffffffffffffffffffffffffffff16146110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae906140d4565b60405180910390fd5b80600b60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5f9054906101000a900460ff1681565b5f611117826127d4565b5f01519050919050565b600a805461112e9061405a565b80601f016020809104026020016040519081016040528092919081815260200182805461115a9061405a565b80156111a55780601f1061117c576101008083540402835291602001916111a5565b820191905f5260205f20905b81548152906001019060200180831161118857829003601f168201915b505050505081565b6111b5612237565b73ffffffffffffffffffffffffffffffffffffffff166111d3611530565b73ffffffffffffffffffffffffffffffffffffffff1614611229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611220906140d4565b60405180910390fd5b8060098190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611299576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611305612237565b73ffffffffffffffffffffffffffffffffffffffff16611323611530565b73ffffffffffffffffffffffffffffffffffffffff1614611379576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611370906140d4565b60405180910390fd5b6113825f612a3e565b565b61138c612237565b73ffffffffffffffffffffffffffffffffffffffff166113aa611530565b73ffffffffffffffffffffffffffffffffffffffff1614611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f7906140d4565b60405180910390fd5b600954815161140d610cb3565b611417919061411f565b10611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e9061419c565b60405180910390fd5b5f5b815181101561149457611487828281518110611478576114776141ba565b5b602002602001015160016127b7565b8080600101915050611459565b5050565b6114a0612237565b73ffffffffffffffffffffffffffffffffffffffff166114be611530565b73ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906140d4565b60405180910390fd5b80600b5f6101000a81548160ff02191690831515021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546115669061405a565b80601f01602080910402602001604051908101604052809291908181526020018280546115929061405a565b80156115dd5780601f106115b4576101008083540402835291602001916115dd565b820191905f5260205f20905b8154815290600101906020018083116115c057829003601f168201915b5050505050905090565b600b60029054906101000a900460ff1681565b600b5f9054906101000a900460ff1615611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090614231565b60405180910390fd5b5f811161168b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611682906142bf565b60405180910390fd5b600954611696610cb3565b826116a1919061411f565b106116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d890614327565b60405180910390fd5b80600e546116ef9190614345565b3414611730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611727906143d0565b60405180910390fd5b61173a33826127b7565b50565b611745612237565b73ffffffffffffffffffffffffffffffffffffffff16611763611530565b73ffffffffffffffffffffffffffffffffffffffff16146117b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b0906140d4565b60405180910390fd5b80600a90816117c8919061458b565b5050565b6117d4612237565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611838576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f611844612237565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118ed612237565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161193291906138a7565b60405180910390a35050565b600b60019054906101000a900460ff1681565b600c602052805f5260405f205f915090505481565b60105481565b6119778484846122ed565b61198384848484612aff565b6119b9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6119c7612237565b73ffffffffffffffffffffffffffffffffffffffff166119e5611530565b73ffffffffffffffffffffffffffffffffffffffff1614611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a32906140d4565b60405180910390fd5b8060108190555050565b600b60019054906101000a900460ff1615611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c90614231565b60405180910390fd5b5f8311611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace906142bf565b60405180910390fd5b600954611ae2610cb3565b84611aed919061411f565b10611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2490614327565b60405180910390fd5b601054611b38610cb3565b84611b43919061411f565b10611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a906146a4565b60405180910390fd5b82600f54611b919190614345565b3414611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc9906143d0565b60405180910390fd5b600b60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c158383611ffa565b73ffffffffffffffffffffffffffffffffffffffff1614611c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c629061470c565b60405180910390fd5b5f600c5f8481526020019081526020015f205414611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb590614774565b60405180910390fd5b611cc833846127b7565b6001600c5f8481526020019081526020015f2081905550505050565b611cec612237565b73ffffffffffffffffffffffffffffffffffffffff16611d0a611530565b73ffffffffffffffffffffffffffffffffffffffff1614611d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d57906140d4565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b6060611d8882612200565b611dbe576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611dc7612c78565b90505f815103611de55760405180602001604052805f815250611e10565b80611def84612d08565b604051602001611e009291906147cc565b6040516020818303038152906040525b915050919050565b611e20612237565b73ffffffffffffffffffffffffffffffffffffffff16611e3e611530565b73ffffffffffffffffffffffffffffffffffffffff1614611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b906140d4565b60405180910390fd5b80600d8190555050565b60095481565b600d5481565b600b60029054906101000a900460ff1615611ef1576040517f71cc92d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095481611efd610cb3565b611f07919061411f565b10611f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3e9061419c565b60405180910390fd5b80600d54611f559190614345565b3414611f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8d906143d0565b60405180910390fd5b601054611fa1610cb3565b82611fac919061411f565b10611fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe390614839565b60405180910390fd5b611ff682826127b7565b5050565b5f6120058383612e61565b905092915050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6120a3612237565b73ffffffffffffffffffffffffffffffffffffffff166120c1611530565b73ffffffffffffffffffffffffffffffffffffffff1614612117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210e906140d4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217c906148c7565b60405180910390fd5b61218e81612a3e565b50565b600e5481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f60015482108015612230575060055f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260075f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6122f7826127d4565b90505f815f015173ffffffffffffffffffffffffffffffffffffffff1661231c612237565b73ffffffffffffffffffffffffffffffffffffffff16148061234e575061234d825f0151612348612237565b61200d565b5b80612393575061235c612237565b73ffffffffffffffffffffffffffffffffffffffff1661237b84610b32565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123cc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff1614612434576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612499576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124a68585856001612e81565b6124b45f84845f015161223e565b600160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8581526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8581526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001840190505f73ffffffffffffffffffffffffffffffffffffffff1660055f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036127475760015481101561274657825f015160055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826020015160055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127b08585856001612e87565b5050505050565b6127d0828260405180602001604052805f815250612e8d565b5050565b6127dc61378b565b5f829050600154811015612a07575f60055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090508060400151612a05575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146128f1578092505050612a39565b5b600115612a045781806001900392505060055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146129ff578092505050612a39565b6128f2565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f612b1f8473ffffffffffffffffffffffffffffffffffffffff16612e9f565b15612c6b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b48612237565b8786866040518563ffffffff1660e01b8152600401612b6a9493929190614937565b6020604051808303815f875af1925050508015612ba557506040513d601f19601f82011682018060405250810190612ba29190614995565b60015b612c1b573d805f8114612bd3576040519150601f19603f3d011682016040523d82523d5f602084013e612bd8565b606091505b505f815103612c13576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c70565b600190505b949350505050565b6060600a8054612c879061405a565b80601f0160208091040260200160405190810160405280929190818152602001828054612cb39061405a565b8015612cfe5780601f10612cd557610100808354040283529160200191612cfe565b820191905f5260205f20905b815481529060010190602001808311612ce157829003601f168201915b5050505050905090565b60605f8203612d4e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e5c565b5f8290505f5b5f8214612d7d578080612d66906149c0565b915050600a82612d769190614a34565b9150612d54565b5f8167ffffffffffffffff811115612d9857612d97613b53565b5b6040519080825280601f01601f191660200182016040528015612dca5781602001600182028036833780820191505090505b5090505b5f8514612e5557600182612de29190614a64565b9150600a85612df19190614a97565b6030612dfd919061411f565b60f81b818381518110612e1357612e126141ba565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612e4e9190614a34565b9450612dce565b8093505050505b919050565b5f80612e6c84612eb0565b9050612e788184612f09565b91505092915050565b50505050565b50505050565b612e9a8383836001612f2e565b505050565b5f80823b90505f8111915050919050565b5f612f027f092b584b565f9711d79732cb738ace6cf7a206eb6277470732d92d8cc83ad27583604051602001612ee7929190614adf565b6040516020818303038152906040528051906020012061324d565b9050919050565b5f805f612f168585613266565b91509150612f23816132e1565b819250505092915050565b5f60015490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f99576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8403612fd2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fde5f868387612e81565b8360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f5b8581101561323157818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156131e557506131e35f888488612aff565b155b1561321c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505061316c565b5080600181905550506132465f868387612e87565b5050505050565b5f61325f6132596134ac565b836135c5565b9050919050565b5f8060418351036132a3575f805f602086015192506040860151915060608601515f1a9050613297878285856135f7565b945094505050506132da565b60408351036132d2575f8060208501519150604085015190506132c78683836136f8565b9350935050506132da565b5f6002915091505b9250929050565b5f60048111156132f4576132f3614b06565b5b81600481111561330757613306614b06565b5b03156134a9576001600481111561332157613320614b06565b5b81600481111561333457613333614b06565b5b03613374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336b90614b7d565b60405180910390fd5b6002600481111561338857613387614b06565b5b81600481111561339b5761339a614b06565b5b036133db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d290614be5565b60405180910390fd5b600360048111156133ef576133ee614b06565b5b81600481111561340257613401614b06565b5b03613442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343990614c73565b60405180910390fd5b60048081111561345557613454614b06565b5b81600481111561346857613467614b06565b5b036134a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349f90614d01565b60405180910390fd5b5b50565b5f7f0000000000000000000000004b220f065eba36ee1ffb67df04561c86988be62f73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561352757507f000000000000000000000000000000000000000000000000000000000000000146145b15613554577f0f0e93dbd13d5dd21e4e509d9f8ea2aa2dfcd6d0e9d77e98b99012dfc88fb29b90506135c2565b6135bf7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f7465fde7fb0420a03855c8bac7d7dd705d61d0241d0d293890335916e0da8ea27fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613752565b90505b90565b5f82826040516020016135d9929190614d89565b60405160208183030381529060405280519060200120905092915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c111561362f575f6003915091506136ef565b601b8560ff16141580156136475750601c8560ff1614155b15613658575f6004915091506136ef565b5f6001878787876040515f815260200160405260405161367b9493929190614dda565b6020604051602081039080840390855afa15801561369b573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036136e7575f600192509250506136ef565b805f92509250505b94509492505050565b5f805f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f1b841690505f601b60ff865f1c901c613736919061411f565b9050613744878288856135f7565b935093505050935093915050565b5f838383463060405160200161376c959493929190614e1d565b6040516020818303038152906040528051906020012090509392505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f819050919050565b6137dd816137cb565b82525050565b5f6020820190506137f65f8301846137d4565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138418161380d565b811461384b575f80fd5b50565b5f8135905061385c81613838565b92915050565b5f6020828403121561387757613876613805565b5b5f6138848482850161384e565b91505092915050565b5f8115159050919050565b6138a18161388d565b82525050565b5f6020820190506138ba5f830184613898565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156138f75780820151818401526020810190506138dc565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61391c826138c0565b61392681856138ca565b93506139368185602086016138da565b61393f81613902565b840191505092915050565b5f6020820190508181035f8301526139628184613912565b905092915050565b613973816137cb565b811461397d575f80fd5b50565b5f8135905061398e8161396a565b92915050565b5f602082840312156139a9576139a8613805565b5b5f6139b684828501613980565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6139e8826139bf565b9050919050565b6139f8816139de565b82525050565b5f602082019050613a115f8301846139ef565b92915050565b613a20816139de565b8114613a2a575f80fd5b50565b5f81359050613a3b81613a17565b92915050565b5f8060408385031215613a5757613a56613805565b5b5f613a6485828601613a2d565b9250506020613a7585828601613980565b9150509250929050565b5f805f60608486031215613a9657613a95613805565b5b5f613aa386828701613a2d565b9350506020613ab486828701613a2d565b9250506040613ac586828701613980565b9150509250925092565b613ad88161388d565b8114613ae2575f80fd5b50565b5f81359050613af381613acf565b92915050565b5f60208284031215613b0e57613b0d613805565b5b5f613b1b84828501613ae5565b91505092915050565b5f60208284031215613b3957613b38613805565b5b5f613b4684828501613a2d565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613b8982613902565b810181811067ffffffffffffffff82111715613ba857613ba7613b53565b5b80604052505050565b5f613bba6137fc565b9050613bc68282613b80565b919050565b5f67ffffffffffffffff821115613be557613be4613b53565b5b602082029050602081019050919050565b5f80fd5b5f613c0c613c0784613bcb565b613bb1565b90508083825260208201905060208402830185811115613c2f57613c2e613bf6565b5b835b81811015613c585780613c448882613a2d565b845260208401935050602081019050613c31565b5050509392505050565b5f82601f830112613c7657613c75613b4f565b5b8135613c86848260208601613bfa565b91505092915050565b5f60208284031215613ca457613ca3613805565b5b5f82013567ffffffffffffffff811115613cc157613cc0613809565b5b613ccd84828501613c62565b91505092915050565b5f80fd5b5f67ffffffffffffffff821115613cf457613cf3613b53565b5b613cfd82613902565b9050602081019050919050565b828183375f83830152505050565b5f613d2a613d2584613cda565b613bb1565b905082815260208101848484011115613d4657613d45613cd6565b5b613d51848285613d0a565b509392505050565b5f82601f830112613d6d57613d6c613b4f565b5b8135613d7d848260208601613d18565b91505092915050565b5f60208284031215613d9b57613d9a613805565b5b5f82013567ffffffffffffffff811115613db857613db7613809565b5b613dc484828501613d59565b91505092915050565b5f8060408385031215613de357613de2613805565b5b5f613df085828601613a2d565b9250506020613e0185828601613ae5565b9150509250929050565b5f67ffffffffffffffff821115613e2557613e24613b53565b5b613e2e82613902565b9050602081019050919050565b5f613e4d613e4884613e0b565b613bb1565b905082815260208101848484011115613e6957613e68613cd6565b5b613e74848285613d0a565b509392505050565b5f82601f830112613e9057613e8f613b4f565b5b8135613ea0848260208601613e3b565b91505092915050565b5f805f8060808587031215613ec157613ec0613805565b5b5f613ece87828801613a2d565b9450506020613edf87828801613a2d565b9350506040613ef087828801613980565b925050606085013567ffffffffffffffff811115613f1157613f10613809565b5b613f1d87828801613e7c565b91505092959194509250565b5f805f60608486031215613f4057613f3f613805565b5b5f613f4d86828701613980565b9350506020613f5e86828701613980565b925050604084013567ffffffffffffffff811115613f7f57613f7e613809565b5b613f8b86828701613e7c565b9150509250925092565b5f8060408385031215613fab57613faa613805565b5b5f613fb885828601613980565b925050602083013567ffffffffffffffff811115613fd957613fd8613809565b5b613fe585828601613e7c565b9150509250929050565b5f806040838503121561400557614004613805565b5b5f61401285828601613a2d565b925050602061402385828601613a2d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061407157607f821691505b6020821081036140845761408361402d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6140be6020836138ca565b91506140c98261408a565b602082019050919050565b5f6020820190508181035f8301526140eb816140b2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614129826137cb565b9150614134836137cb565b925082820190508082111561414c5761414b6140f2565b5b92915050565b7f4d617820537570706c7920526561636865642e000000000000000000000000005f82015250565b5f6141866013836138ca565b915061419182614152565b602082019050919050565b5f6020820190508181035f8301526141b38161417a565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f53616c65206973207061757365642100000000000000000000000000000000005f82015250565b5f61421b600f836138ca565b9150614226826141e7565b602082019050919050565b5f6020820190508181035f8301526142488161420f565b9050919050565b7f4d696e696d756d2031204e46542068617320746f206265206d696e74656420705f8201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b5f6142a9602e836138ca565b91506142b48261424f565b604082019050919050565b5f6020820190508181035f8301526142d68161429d565b9050919050565b7f536f6c64206f75740000000000000000000000000000000000000000000000005f82015250565b5f6143116008836138ca565b915061431c826142dd565b602082019050919050565b5f6020820190508181035f83015261433e81614305565b9050919050565b5f61434f826137cb565b915061435a836137cb565b9250828202614368816137cb565b9150828204841483151761437f5761437e6140f2565b5b5092915050565b7f506c656173652073656e6420636f727265637420616d6f756e742e00000000005f82015250565b5f6143ba601b836138ca565b91506143c582614386565b602082019050919050565b5f6020820190508181035f8301526143e7816143ae565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261444a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261440f565b614454868361440f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61448f61448a614485846137cb565b61446c565b6137cb565b9050919050565b5f819050919050565b6144a883614475565b6144bc6144b482614496565b84845461441b565b825550505050565b5f90565b6144d06144c4565b6144db81848461449f565b505050565b5b818110156144fe576144f35f826144c8565b6001810190506144e1565b5050565b601f82111561454357614514816143ee565b61451d84614400565b8101602085101561452c578190505b61454061453885614400565b8301826144e0565b50505b505050565b5f82821c905092915050565b5f6145635f1984600802614548565b1980831691505092915050565b5f61457b8383614554565b9150826002028217905092915050565b614594826138c0565b67ffffffffffffffff8111156145ad576145ac613b53565b5b6145b7825461405a565b6145c2828285614502565b5f60209050601f8311600181146145f3575f84156145e1578287015190505b6145eb8582614570565b865550614652565b601f198416614601866143ee565b5f5b8281101561462857848901518255600182019150602085019450602081019050614603565b868310156146455784890151614641601f891682614554565b8355505b6001600288020188555050505b505050505050565b7f50726573616c65204c696d697420526561636865642e000000000000000000005f82015250565b5f61468e6016836138ca565b91506146998261465a565b602082019050919050565b5f6020820190508181035f8301526146bb81614682565b9050919050565b7f596f7520617265206e6f742077686974656c69737465642e00000000000000005f82015250565b5f6146f66018836138ca565b9150614701826146c2565b602082019050919050565b5f6020820190508181035f830152614723816146ea565b9050919050565b7f496e76616c696420566f75636865722e2054727920416761696e2e00000000005f82015250565b5f61475e601b836138ca565b91506147698261472a565b602082019050919050565b5f6020820190508181035f83015261478b81614752565b9050919050565b5f81905092915050565b5f6147a6826138c0565b6147b08185614792565b93506147c08185602086016138da565b80840191505092915050565b5f6147d7828561479c565b91506147e3828461479c565b91508190509392505050565b7f4c696d697420526561636865642e0000000000000000000000000000000000005f82015250565b5f614823600e836138ca565b915061482e826147ef565b602082019050919050565b5f6020820190508181035f83015261485081614817565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6148b16026836138ca565b91506148bc82614857565b604082019050919050565b5f6020820190508181035f8301526148de816148a5565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f614909826148e5565b61491381856148ef565b93506149238185602086016138da565b61492c81613902565b840191505092915050565b5f60808201905061494a5f8301876139ef565b61495760208301866139ef565b61496460408301856137d4565b818103606083015261497681846148ff565b905095945050505050565b5f8151905061498f81613838565b92915050565b5f602082840312156149aa576149a9613805565b5b5f6149b784828501614981565b91505092915050565b5f6149ca826137cb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149fc576149fb6140f2565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a3e826137cb565b9150614a49836137cb565b925082614a5957614a58614a07565b5b828204905092915050565b5f614a6e826137cb565b9150614a79836137cb565b9250828203905081811115614a9157614a906140f2565b5b92915050565b5f614aa1826137cb565b9150614aac836137cb565b925082614abc57614abb614a07565b5b828206905092915050565b5f819050919050565b614ad981614ac7565b82525050565b5f604082019050614af25f830185614ad0565b614aff60208301846137d4565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f614b676018836138ca565b9150614b7282614b33565b602082019050919050565b5f6020820190508181035f830152614b9481614b5b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f614bcf601f836138ca565b9150614bda82614b9b565b602082019050919050565b5f6020820190508181035f830152614bfc81614bc3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f614c5d6022836138ca565b9150614c6882614c03565b604082019050919050565b5f6020820190508181035f830152614c8a81614c51565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f614ceb6022836138ca565b9150614cf682614c91565b604082019050919050565b5f6020820190508181035f830152614d1881614cdf565b9050919050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614d53600283614792565b9150614d5e82614d1f565b600282019050919050565b5f819050919050565b614d83614d7e82614ac7565b614d69565b82525050565b5f614d9382614d47565b9150614d9f8285614d72565b602082019150614daf8284614d72565b6020820191508190509392505050565b5f60ff82169050919050565b614dd481614dbf565b82525050565b5f608082019050614ded5f830187614ad0565b614dfa6020830186614dcb565b614e076040830185614ad0565b614e146060830184614ad0565b95945050505050565b5f60a082019050614e305f830188614ad0565b614e3d6020830187614ad0565b614e4a6040830186614ad0565b614e5760608301856137d4565b614e6460808301846139ef565b969550505050505056fea26469706673582212209f6c1ec124e5ddd3b18a2941f3d20a53734e08ff4379f55d0ab46284de41fa8964736f6c63430008160033

Deployed Bytecode Sourcemap

55095:4838:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55741:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25461:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28821:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30324:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29887:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25110:279;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59059:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31181:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58853:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59253:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59777:153;;;;;;;;;;;;;:::i;:::-;;56215:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31422:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59457:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55403:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28630:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55324:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59564:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25830:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14227:94;;;;;;;;;;;;;:::i;:::-;;55944:265;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58758:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13576:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28990:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55479:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56922:440;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58660:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30600:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55439:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55606:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55787:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31678:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59152:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57370:761;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58958:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29165:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59352:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55290:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55654:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56428:488;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58139:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30950:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14476:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55700:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55741:37;;;;:::o;25461:305::-;25563:4;25615:25;25600:40;;;:11;:40;;;;:105;;;;25672:33;25657:48;;;:11;:48;;;;25600:105;:158;;;;25722:36;25746:11;25722:23;:36::i;:::-;25600:158;25580:178;;25461:305;;;:::o;28821:100::-;28875:13;28908:5;28901:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28821:100;:::o;30324:204::-;30392:7;30417:16;30425:7;30417;:16::i;:::-;30412:64;;30442:34;;;;;;;;;;;;;;30412:64;30496:15;:24;30512:7;30496:24;;;;;;;;;;;;;;;;;;;;;30489:31;;30324:204;;;:::o;29887:371::-;29960:13;29976:24;29992:7;29976:15;:24::i;:::-;29960:40;;30021:5;30015:11;;:2;:11;;;30011:48;;30035:24;;;;;;;;;;;;;;30011:48;30092:5;30076:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;30102:37;30119:5;30126:12;:10;:12::i;:::-;30102:16;:37::i;:::-;30101:38;30076:63;30072:138;;;30163:35;;;;;;;;;;;;;;30072:138;30222:28;30231:2;30235:7;30244:5;30222:8;:28::i;:::-;29949:309;29887:371;;:::o;25110:279::-;25162:7;25354:12;;25338:13;;:28;25331:35;;25110:279;:::o;59059:87::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59134:4:::1;59122:9;:16;;;;59059:87:::0;:::o;31181:170::-;31315:28;31325:4;31331:2;31335:7;31315:9;:28::i;:::-;31181:170;;;:::o;58853:99::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58940:4:::1;58922:15;;:22;;;;;;;;;;;;;;;;;;58853:99:::0;:::o;59253:93::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59334:4:::1;59319:12;:19;;;;59253:93:::0;:::o;59777:153::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59827:13:::1;59843:21;59827:37;;59883:10;59875:28;;:38;59904:8;59875:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59816:114;59777:153::o:0;56215:207::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56338:9:::1;;56329:6;56313:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:34;56305:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;56386:28;56396:9;56407:6;56386:9;:28::i;:::-;56215:207:::0;;:::o;31422:185::-;31560:39;31577:4;31583:2;31587:7;31560:39;;;;;;;;;;;;:16;:39::i;:::-;31422:185;;;:::o;59457:99::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59545:3:::1;59527:15;;:21;;;;;;;;;;;;;;;;;;59457:99:::0;:::o;55403:29::-;;;;;;;;;;;;;:::o;28630:124::-;28694:7;28721:20;28733:7;28721:11;:20::i;:::-;:25;;;28714:32;;28630:124;;;:::o;55324:70::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59564:88::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59639:5:::1;59627:9;:17;;;;59564:88:::0;:::o;25830:206::-;25894:7;25935:1;25918:19;;:5;:19;;;25914:60;;25946:28;;;;;;;;;;;;;;25914:60;26000:12;:19;26013:5;26000:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25992:36;;25985:43;;25830:206;;;:::o;14227:94::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14292:21:::1;14310:1;14292:9;:21::i;:::-;14227:94::o:0;55944:265::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56077:9:::1;;56059:8;:15;56043:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:43;56035:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56125:6;56121:80;56141:8;:15;56137:1;:19;56121:80;;;56176:25;56186:8;56195:1;56186:11;;;;;;;;:::i;:::-;;;;;;;;56199:1;56176:9;:25::i;:::-;56158:3;;;;;;;56121:80;;;;55944:265:::0;:::o;58758:89::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58835:4:::1;58822:10;;:17;;;;;;;;;;;;;;;;;;58758:89:::0;:::o;13576:87::-;13622:7;13649:6;;;;;;;;;;;13642:13;;13576:87;:::o;28990:104::-;29046:13;29079:7;29072:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28990:104;:::o;55479:35::-;;;;;;;;;;;;;:::o;56922:440::-;57024:10;;;;;;;;;;;57023:11;57015:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;57085:1;57073:9;:13;57065:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57184:9;;57168:13;:11;:13::i;:::-;57156:9;:25;;;;:::i;:::-;:37;57148:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57250:9;57238;;:21;;;;:::i;:::-;57225:9;:34;57217:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;57322:32;57332:10;57344:9;57322;:32::i;:::-;56922:440;:::o;58660:92::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58740:4:::1;58730:7;:14;;;;;;:::i;:::-;;58660:92:::0;:::o;30600:279::-;30703:12;:10;:12::i;:::-;30691:24;;:8;:24;;;30687:54;;30724:17;;;;;;;;;;;;;;30687:54;30799:8;30754:18;:32;30773:12;:10;:12::i;:::-;30754:32;;;;;;;;;;;;;;;:42;30787:8;30754:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30852:8;30823:48;;30838:12;:10;:12::i;:::-;30823:48;;;30862:8;30823:48;;;;;;:::i;:::-;;;;;;;;30600:279;;:::o;55439:33::-;;;;;;;;;;;;;:::o;55606:39::-;;;;;;;;;;;;;;;;;:::o;55787:31::-;;;;:::o;31678:342::-;31845:28;31855:4;31861:2;31865:7;31845:9;:28::i;:::-;31889:48;31912:4;31918:2;31922:7;31931:5;31889:22;:48::i;:::-;31884:129;;31961:40;;;;;;;;;;;;;;31884:129;31678:342;;;;:::o;59152:95::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59235:4:::1;59219:13;:20;;;;59152:95:::0;:::o;57370:761::-;57515:13;;;;;;;;;;;57514:14;57506:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;57579:1;57567:9;:13;57559:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57678:9;;57662:13;:11;:13::i;:::-;57650:9;:25;;;;:::i;:::-;:37;57642:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57747:13;;57731;:11;:13::i;:::-;57719:9;:25;;;;:::i;:::-;:41;57711:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57834:9;57819:12;;:24;;;;:::i;:::-;57806:9;:37;57798:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57917:15;;;;;;;;;;;57894:38;;:19;57900:2;57903:9;57894:5;:19::i;:::-;:38;;;57886:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;57998:1;57980:10;:14;57991:2;57980:14;;;;;;;;;;;;:19;57972:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;58062:32;58072:10;58084:9;58062;:32::i;:::-;58122:1;58105:10;:14;58116:2;58105:14;;;;;;;;;;;:18;;;;57370:761;;;:::o;58958:95::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59041:4:::1;59025:13;;:20;;;;;;;;;;;;;;;;;;58958:95:::0;:::o;29165:318::-;29238:13;29269:16;29277:7;29269;:16::i;:::-;29264:59;;29294:29;;;;;;;;;;;;;;29264:59;29336:21;29360:10;:8;:10::i;:::-;29336:34;;29413:1;29394:7;29388:21;:26;:87;;;;;;;;;;;;;;;;;29441:7;29450:18;:7;:16;:18::i;:::-;29424:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29388:87;29381:94;;;29165:318;;;:::o;59352:97::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59437:4:::1;59420:14;:21;;;;59352:97:::0;:::o;55290:27::-;;;;:::o;55654:39::-;;;;:::o;56428:488::-;56503:15;;;;;;;;;;;56500:67;;;56541:14;;;;;;;;;;;;;;56500:67;56622:9;;56611:8;56595:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;56587:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56704:8;56687:14;;:25;;;;:::i;:::-;56674:9;:38;56666:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;56790:13;;56774;:11;:13::i;:::-;56763:8;:24;;;;:::i;:::-;:40;56755:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;56835:23;56845:2;56849:8;56835:9;:23::i;:::-;56428:488;;:::o;58139:124::-;58207:7;58233:22;58241:2;58245:9;58233:7;:22::i;:::-;58226:29;;58139:124;;;;:::o;30950:164::-;31047:4;31071:18;:25;31090:5;31071:25;;;;;;;;;;;;;;;:35;31097:8;31071:35;;;;;;;;;;;;;;;;;;;;;;;;;31064:42;;30950:164;;;;:::o;14476:192::-;13807:12;:10;:12::i;:::-;13796:23;;:7;:5;:7::i;:::-;:23;;;13788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14585:1:::1;14565:22;;:8;:22;;::::0;14557:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14641:19;14651:8;14641:9;:19::i;:::-;14476:192:::0;:::o;55700:34::-;;;;:::o;15581:157::-;15666:4;15705:25;15690:40;;;:11;:40;;;;15683:47;;15581:157;;;:::o;32275:144::-;32332:4;32366:13;;32356:7;:23;:55;;;;;32384:11;:20;32396:7;32384:20;;;;;;;;;;;:27;;;;;;;;;;;;32383:28;32356:55;32349:62;;32275:144;;;:::o;716:98::-;769:7;796:10;789:17;;716:98;:::o;39481:196::-;39623:2;39596:15;:24;39612:7;39596:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39661:7;39657:2;39641:28;;39650:5;39641:28;;;;;;;;;;;;39481:196;;;:::o;34982:2112::-;35097:35;35135:20;35147:7;35135:11;:20::i;:::-;35097:58;;35168:22;35210:13;:18;;;35194:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;35245:50;35262:13;:18;;;35282:12;:10;:12::i;:::-;35245:16;:50::i;:::-;35194:101;:154;;;;35336:12;:10;:12::i;:::-;35312:36;;:20;35324:7;35312:11;:20::i;:::-;:36;;;35194:154;35168:181;;35367:17;35362:66;;35393:35;;;;;;;;;;;;;;35362:66;35465:4;35443:26;;:13;:18;;;:26;;;35439:67;;35478:28;;;;;;;;;;;;;;35439:67;35535:1;35521:16;;:2;:16;;;35517:52;;35546:23;;;;;;;;;;;;;;35517:52;35582:43;35604:4;35610:2;35614:7;35623:1;35582:21;:43::i;:::-;35690:49;35707:1;35711:7;35720:13;:18;;;35690:8;:49::i;:::-;36065:1;36035:12;:18;36048:4;36035:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36109:1;36081:12;:16;36094:2;36081:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36155:2;36127:11;:20;36139:7;36127:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;36217:15;36172:11;:20;36184:7;36172:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;36485:19;36517:1;36507:7;:11;36485:33;;36578:1;36537:43;;:11;:24;36549:11;36537:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;36533:445;;36762:13;;36748:11;:27;36744:219;;;36832:13;:18;;;36800:11;:24;36812:11;36800:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;36915:13;:28;;;36873:11;:24;36885:11;36873:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;36744:219;36533:445;36010:979;37025:7;37021:2;37006:27;;37015:4;37006:27;;;;;;;;;;;;37044:42;37065:4;37071:2;37075:7;37084:1;37044:20;:42::i;:::-;35086:2008;;34982:2112;;;:::o;32427:104::-;32496:27;32506:2;32510:8;32496:27;;;;;;;;;;;;:9;:27::i;:::-;32427:104;;:::o;27485:1083::-;27546:21;;:::i;:::-;27580:12;27595:7;27580:22;;27651:13;;27644:4;:20;27640:861;;;27685:31;27719:11;:17;27731:4;27719:17;;;;;;;;;;;27685:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27760:9;:16;;;27755:731;;27831:1;27805:28;;:9;:14;;;:28;;;27801:101;;27869:9;27862:16;;;;;;27801:101;28206:261;28213:4;28206:261;;;28246:6;;;;;;;;28291:11;:17;28303:4;28291:17;;;;;;;;;;;28279:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28365:1;28339:28;;:9;:14;;;:28;;;28335:109;;28407:9;28400:16;;;;;;28335:109;28206:261;;;27755:731;27666:835;27640:861;28529:31;;;;;;;;;;;;;;27485:1083;;;;:::o;14676:173::-;14732:16;14751:6;;;;;;;;;;;14732:25;;14777:8;14768:6;;:17;;;;;;;;;;;;;;;;;;14832:8;14801:40;;14822:8;14801:40;;;;;;;;;;;;14721:128;14676:173;:::o;40242:790::-;40397:4;40418:15;:2;:13;;;:15::i;:::-;40414:611;;;40470:2;40454:36;;;40491:12;:10;:12::i;:::-;40505:4;40511:7;40520:5;40454:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40450:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40717:1;40700:6;:13;:18;40696:259;;40750:40;;;;;;;;;;;;;;40696:259;40905:6;40899:13;40890:6;40886:2;40882:15;40875:38;40450:520;40587:45;;;40577:55;;;:6;:55;;;;40570:62;;;;;40414:611;41009:4;41002:11;;40242:790;;;;;;;:::o;59660:108::-;59720:13;59753:7;59746:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59660:108;:::o;1181:723::-;1237:13;1467:1;1458:5;:10;1454:53;;1485:10;;;;;;;;;;;;;;;;;;;;;1454:53;1517:12;1532:5;1517:20;;1548:14;1573:78;1588:1;1580:4;:9;1573:78;;1606:8;;;;;:::i;:::-;;;;1637:2;1629:10;;;;;:::i;:::-;;;1573:78;;;1661:19;1693:6;1683:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1661:39;;1711:154;1727:1;1718:5;:10;1711:154;;1755:1;1745:11;;;;;:::i;:::-;;;1822:2;1814:5;:10;;;;:::i;:::-;1801:2;:24;;;;:::i;:::-;1788:39;;1771:6;1778;1771:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1851:2;1842:11;;;;;:::i;:::-;;;1711:154;;;1889:6;1875:21;;;;;1181:723;;;;:::o;58271:175::-;58343:7;58362:14;58379:9;58385:2;58379:5;:9::i;:::-;58362:26;;58406:32;58420:6;58428:9;58406:13;:32::i;:::-;58399:39;;;58271:175;;;;:::o;41680:159::-;;;;;:::o;42498:158::-;;;;;:::o;32894:163::-;33017:32;33023:2;33027:8;33037:5;33044:4;33017:5;:32::i;:::-;32894:163;;;:::o;3646:387::-;3706:4;3914:12;3981:7;3969:20;3961:28;;4024:1;4017:4;:8;4010:15;;;3646:387;;;:::o;58454:196::-;58500:7;58526:116;58578:34;58627:2;58553:87;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58543:98;;;;;;58526:16;:116::i;:::-;58519:123;;58454:196;;;:::o;46688:231::-;46766:7;46787:17;46806:18;46828:27;46839:4;46845:9;46828:10;:27::i;:::-;46786:69;;;;46866:18;46878:5;46866:11;:18::i;:::-;46902:9;46895:16;;;;46688:231;;;;:::o;33316:1412::-;33455:20;33478:13;;33455:36;;33520:1;33506:16;;:2;:16;;;33502:48;;33531:19;;;;;;;;;;;;;;33502:48;33577:1;33565:8;:13;33561:44;;33587:18;;;;;;;;;;;;;;33561:44;33618:61;33648:1;33652:2;33656:12;33670:8;33618:21;:61::i;:::-;33991:8;33956:12;:16;33969:2;33956:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34055:8;34015:12;:16;34028:2;34015:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34114:2;34081:11;:25;34093:12;34081:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34181:15;34131:11;:25;34143:12;34131:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34214:20;34237:12;34214:35;;34271:9;34266:328;34286:8;34282:1;:12;34266:328;;;34350:12;34346:2;34325:38;;34342:1;34325:38;;;;;;;;;;;;34386:4;:68;;;;;34395:59;34426:1;34430:2;34434:12;34448:5;34395:22;:59::i;:::-;34394:60;34386:68;34382:164;;;34486:40;;;;;;;;;;;;;;34382:164;34564:14;;;;;;;34296:3;;;;;;;34266:328;;;;34626:12;34610:13;:28;;;;33931:719;34660:60;34689:1;34693:2;34697:12;34711:8;34660:20;:60::i;:::-;33444:1284;33316:1412;;;;:::o;54921:167::-;54998:7;55025:55;55047:20;:18;:20::i;:::-;55069:10;55025:21;:55::i;:::-;55018:62;;54921:167;;;:::o;44578:1308::-;44659:7;44668:12;44913:2;44893:9;:16;:22;44889:990;;44932:9;44956;44980:7;45189:4;45178:9;45174:20;45168:27;45163:32;;45239:4;45228:9;45224:20;45218:27;45213:32;;45297:4;45286:9;45282:20;45276:27;45273:1;45268:36;45263:41;;45340:25;45351:4;45357:1;45360;45363;45340:10;:25::i;:::-;45333:32;;;;;;;;;44889:990;45407:2;45387:9;:16;:22;45383:496;;45426:9;45450:10;45662:4;45651:9;45647:20;45641:27;45636:32;;45713:4;45702:9;45698:20;45692:27;45686:33;;45755:23;45766:4;45772:1;45775:2;45755:10;:23::i;:::-;45748:30;;;;;;;;45383:496;45827:1;45831:35;45811:56;;;;44578:1308;;;;;;:::o;42849:643::-;42927:20;42918:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;42914:571;42964:7;42914:571;43025:29;43016:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;43012:473;;43071:34;;;;;;;;;;:::i;:::-;;;;;;;;43012:473;43136:35;43127:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;43123:362;;43188:41;;;;;;;;;;:::i;:::-;;;;;;;;43123:362;43260:30;43251:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;43247:238;;43307:44;;;;;;;;;;:::i;:::-;;;;;;;;43247:238;43382:30;43373:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;43369:116;;43429:44;;;;;;;;;;:::i;:::-;;;;;;;;43369:116;42849:643;;:::o;53694:314::-;53747:7;53788:12;53771:29;;53779:4;53771:29;;;:66;;;;;53821:16;53804:13;:33;53771:66;53767:234;;;53861:24;53854:31;;;;53767:234;53925:64;53947:10;53959:12;53973:15;53925:21;:64::i;:::-;53918:71;;53694:314;;:::o;51602:196::-;51695:7;51761:15;51778:10;51732:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51722:68;;;;;;51715:75;;51602:196;;;;:::o;48140:1632::-;48271:7;48280:12;49205:66;49200:1;49192:10;;:79;49188:163;;;49304:1;49308:30;49288:51;;;;;;49188:163;49370:2;49365:1;:7;;;;:18;;;;;49381:2;49376:1;:7;;;;49365:18;49361:102;;;49416:1;49420:30;49400:51;;;;;;49361:102;49560:14;49577:24;49587:4;49593:1;49596;49599;49577:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49560:41;;49634:1;49616:20;;:6;:20;;;49612:103;;49669:1;49673:29;49653:50;;;;;;;49612:103;49735:6;49743:20;49727:37;;;;;48140:1632;;;;;;;;:::o;47182:344::-;47296:7;47305:12;47330:9;47355:66;47347:75;;47342:2;:80;47330:92;;47433:7;47472:2;47465:3;47458:2;47450:11;;:18;;47449:25;;;;:::i;:::-;47433:42;;47493:25;47504:4;47510:1;47513;47516;47493:10;:25::i;:::-;47486:32;;;;;;47182:344;;;;;;:::o;54016:263::-;54160:7;54208:8;54218;54228:11;54241:13;54264:4;54197:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54187:84;;;;;;54180:91;;54016:263;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:246::-;2314:1;2324:113;2338:6;2335:1;2332:13;2324:113;;;2423:1;2418:3;2414:11;2408:18;2404:1;2399:3;2395:11;2388:39;2360:2;2357:1;2353:10;2348:15;;2324:113;;;2471:1;2462:6;2457:3;2453:16;2446:27;2295:184;2233:246;;;:::o;2485:102::-;2526:6;2577:2;2573:7;2568:2;2561:5;2557:14;2553:28;2543:38;;2485:102;;;:::o;2593:377::-;2681:3;2709:39;2742:5;2709:39;:::i;:::-;2764:71;2828:6;2823:3;2764:71;:::i;:::-;2757:78;;2844:65;2902:6;2897:3;2890:4;2883:5;2879:16;2844:65;:::i;:::-;2934:29;2956:6;2934:29;:::i;:::-;2929:3;2925:39;2918:46;;2685:285;2593:377;;;;:::o;2976:313::-;3089:4;3127:2;3116:9;3112:18;3104:26;;3176:9;3170:4;3166:20;3162:1;3151:9;3147:17;3140:47;3204:78;3277:4;3268:6;3204:78;:::i;:::-;3196:86;;2976:313;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:116::-;5937:21;5952:5;5937:21;:::i;:::-;5930:5;5927:32;5917:60;;5973:1;5970;5963:12;5917:60;5867:116;:::o;5989:133::-;6032:5;6070:6;6057:20;6048:29;;6086:30;6110:5;6086:30;:::i;:::-;5989:133;;;;:::o;6128:323::-;6184:6;6233:2;6221:9;6212:7;6208:23;6204:32;6201:119;;;6239:79;;:::i;:::-;6201:119;6359:1;6384:50;6426:7;6417:6;6406:9;6402:22;6384:50;:::i;:::-;6374:60;;6330:114;6128:323;;;;:::o;6457:329::-;6516:6;6565:2;6553:9;6544:7;6540:23;6536:32;6533:119;;;6571:79;;:::i;:::-;6533:119;6691:1;6716:53;6761:7;6752:6;6741:9;6737:22;6716:53;:::i;:::-;6706:63;;6662:117;6457:329;;;;:::o;6792:117::-;6901:1;6898;6891:12;6915:180;6963:77;6960:1;6953:88;7060:4;7057:1;7050:15;7084:4;7081:1;7074:15;7101:281;7184:27;7206:4;7184:27;:::i;:::-;7176:6;7172:40;7314:6;7302:10;7299:22;7278:18;7266:10;7263:34;7260:62;7257:88;;;7325:18;;:::i;:::-;7257:88;7365:10;7361:2;7354:22;7144:238;7101:281;;:::o;7388:129::-;7422:6;7449:20;;:::i;:::-;7439:30;;7478:33;7506:4;7498:6;7478:33;:::i;:::-;7388:129;;;:::o;7523:311::-;7600:4;7690:18;7682:6;7679:30;7676:56;;;7712:18;;:::i;:::-;7676:56;7762:4;7754:6;7750:17;7742:25;;7822:4;7816;7812:15;7804:23;;7523:311;;;:::o;7840:117::-;7949:1;7946;7939:12;7980:710;8076:5;8101:81;8117:64;8174:6;8117:64;:::i;:::-;8101:81;:::i;:::-;8092:90;;8202:5;8231:6;8224:5;8217:21;8265:4;8258:5;8254:16;8247:23;;8318:4;8310:6;8306:17;8298:6;8294:30;8347:3;8339:6;8336:15;8333:122;;;8366:79;;:::i;:::-;8333:122;8481:6;8464:220;8498:6;8493:3;8490:15;8464:220;;;8573:3;8602:37;8635:3;8623:10;8602:37;:::i;:::-;8597:3;8590:50;8669:4;8664:3;8660:14;8653:21;;8540:144;8524:4;8519:3;8515:14;8508:21;;8464:220;;;8468:21;8082:608;;7980:710;;;;;:::o;8713:370::-;8784:5;8833:3;8826:4;8818:6;8814:17;8810:27;8800:122;;8841:79;;:::i;:::-;8800:122;8958:6;8945:20;8983:94;9073:3;9065:6;9058:4;9050:6;9046:17;8983:94;:::i;:::-;8974:103;;8790:293;8713:370;;;;:::o;9089:539::-;9173:6;9222:2;9210:9;9201:7;9197:23;9193:32;9190:119;;;9228:79;;:::i;:::-;9190:119;9376:1;9365:9;9361:17;9348:31;9406:18;9398:6;9395:30;9392:117;;;9428:79;;:::i;:::-;9392:117;9533:78;9603:7;9594:6;9583:9;9579:22;9533:78;:::i;:::-;9523:88;;9319:302;9089:539;;;;:::o;9634:117::-;9743:1;9740;9733:12;9757:308;9819:4;9909:18;9901:6;9898:30;9895:56;;;9931:18;;:::i;:::-;9895:56;9969:29;9991:6;9969:29;:::i;:::-;9961:37;;10053:4;10047;10043:15;10035:23;;9757:308;;;:::o;10071:146::-;10168:6;10163:3;10158;10145:30;10209:1;10200:6;10195:3;10191:16;10184:27;10071:146;;;:::o;10223:425::-;10301:5;10326:66;10342:49;10384:6;10342:49;:::i;:::-;10326:66;:::i;:::-;10317:75;;10415:6;10408:5;10401:21;10453:4;10446:5;10442:16;10491:3;10482:6;10477:3;10473:16;10470:25;10467:112;;;10498:79;;:::i;:::-;10467:112;10588:54;10635:6;10630:3;10625;10588:54;:::i;:::-;10307:341;10223:425;;;;;:::o;10668:340::-;10724:5;10773:3;10766:4;10758:6;10754:17;10750:27;10740:122;;10781:79;;:::i;:::-;10740:122;10898:6;10885:20;10923:79;10998:3;10990:6;10983:4;10975:6;10971:17;10923:79;:::i;:::-;10914:88;;10730:278;10668:340;;;;:::o;11014:509::-;11083:6;11132:2;11120:9;11111:7;11107:23;11103:32;11100:119;;;11138:79;;:::i;:::-;11100:119;11286:1;11275:9;11271:17;11258:31;11316:18;11308:6;11305:30;11302:117;;;11338:79;;:::i;:::-;11302:117;11443:63;11498:7;11489:6;11478:9;11474:22;11443:63;:::i;:::-;11433:73;;11229:287;11014:509;;;;:::o;11529:468::-;11594:6;11602;11651:2;11639:9;11630:7;11626:23;11622:32;11619:119;;;11657:79;;:::i;:::-;11619:119;11777:1;11802:53;11847:7;11838:6;11827:9;11823:22;11802:53;:::i;:::-;11792:63;;11748:117;11904:2;11930:50;11972:7;11963:6;11952:9;11948:22;11930:50;:::i;:::-;11920:60;;11875:115;11529:468;;;;;:::o;12003:307::-;12064:4;12154:18;12146:6;12143:30;12140:56;;;12176:18;;:::i;:::-;12140:56;12214:29;12236:6;12214:29;:::i;:::-;12206:37;;12298:4;12292;12288:15;12280:23;;12003:307;;;:::o;12316:423::-;12393:5;12418:65;12434:48;12475:6;12434:48;:::i;:::-;12418:65;:::i;:::-;12409:74;;12506:6;12499:5;12492:21;12544:4;12537:5;12533:16;12582:3;12573:6;12568:3;12564:16;12561:25;12558:112;;;12589:79;;:::i;:::-;12558:112;12679:54;12726:6;12721:3;12716;12679:54;:::i;:::-;12399:340;12316:423;;;;;:::o;12758:338::-;12813:5;12862:3;12855:4;12847:6;12843:17;12839:27;12829:122;;12870:79;;:::i;:::-;12829:122;12987:6;12974:20;13012:78;13086:3;13078:6;13071:4;13063:6;13059:17;13012:78;:::i;:::-;13003:87;;12819:277;12758:338;;;;:::o;13102:943::-;13197:6;13205;13213;13221;13270:3;13258:9;13249:7;13245:23;13241:33;13238:120;;;13277:79;;:::i;:::-;13238:120;13397:1;13422:53;13467:7;13458:6;13447:9;13443:22;13422:53;:::i;:::-;13412:63;;13368:117;13524:2;13550:53;13595:7;13586:6;13575:9;13571:22;13550:53;:::i;:::-;13540:63;;13495:118;13652:2;13678:53;13723:7;13714:6;13703:9;13699:22;13678:53;:::i;:::-;13668:63;;13623:118;13808:2;13797:9;13793:18;13780:32;13839:18;13831:6;13828:30;13825:117;;;13861:79;;:::i;:::-;13825:117;13966:62;14020:7;14011:6;14000:9;13996:22;13966:62;:::i;:::-;13956:72;;13751:287;13102:943;;;;;;;:::o;14051:797::-;14137:6;14145;14153;14202:2;14190:9;14181:7;14177:23;14173:32;14170:119;;;14208:79;;:::i;:::-;14170:119;14328:1;14353:53;14398:7;14389:6;14378:9;14374:22;14353:53;:::i;:::-;14343:63;;14299:117;14455:2;14481:53;14526:7;14517:6;14506:9;14502:22;14481:53;:::i;:::-;14471:63;;14426:118;14611:2;14600:9;14596:18;14583:32;14642:18;14634:6;14631:30;14628:117;;;14664:79;;:::i;:::-;14628:117;14769:62;14823:7;14814:6;14803:9;14799:22;14769:62;:::i;:::-;14759:72;;14554:287;14051:797;;;;;:::o;14854:652::-;14931:6;14939;14988:2;14976:9;14967:7;14963:23;14959:32;14956:119;;;14994:79;;:::i;:::-;14956:119;15114:1;15139:53;15184:7;15175:6;15164:9;15160:22;15139:53;:::i;:::-;15129:63;;15085:117;15269:2;15258:9;15254:18;15241:32;15300:18;15292:6;15289:30;15286:117;;;15322:79;;:::i;:::-;15286:117;15427:62;15481:7;15472:6;15461:9;15457:22;15427:62;:::i;:::-;15417:72;;15212:287;14854:652;;;;;:::o;15512:474::-;15580:6;15588;15637:2;15625:9;15616:7;15612:23;15608:32;15605:119;;;15643:79;;:::i;:::-;15605:119;15763:1;15788:53;15833:7;15824:6;15813:9;15809:22;15788:53;:::i;:::-;15778:63;;15734:117;15890:2;15916:53;15961:7;15952:6;15941:9;15937:22;15916:53;:::i;:::-;15906:63;;15861:118;15512:474;;;;;:::o;15992:180::-;16040:77;16037:1;16030:88;16137:4;16134:1;16127:15;16161:4;16158:1;16151:15;16178:320;16222:6;16259:1;16253:4;16249:12;16239:22;;16306:1;16300:4;16296:12;16327:18;16317:81;;16383:4;16375:6;16371:17;16361:27;;16317:81;16445:2;16437:6;16434:14;16414:18;16411:38;16408:84;;16464:18;;:::i;:::-;16408:84;16229:269;16178:320;;;:::o;16504:182::-;16644:34;16640:1;16632:6;16628:14;16621:58;16504:182;:::o;16692:366::-;16834:3;16855:67;16919:2;16914:3;16855:67;:::i;:::-;16848:74;;16931:93;17020:3;16931:93;:::i;:::-;17049:2;17044:3;17040:12;17033:19;;16692:366;;;:::o;17064:419::-;17230:4;17268:2;17257:9;17253:18;17245:26;;17317:9;17311:4;17307:20;17303:1;17292:9;17288:17;17281:47;17345:131;17471:4;17345:131;:::i;:::-;17337:139;;17064:419;;;:::o;17489:180::-;17537:77;17534:1;17527:88;17634:4;17631:1;17624:15;17658:4;17655:1;17648:15;17675:191;17715:3;17734:20;17752:1;17734:20;:::i;:::-;17729:25;;17768:20;17786:1;17768:20;:::i;:::-;17763:25;;17811:1;17808;17804:9;17797:16;;17832:3;17829:1;17826:10;17823:36;;;17839:18;;:::i;:::-;17823:36;17675:191;;;;:::o;17872:169::-;18012:21;18008:1;18000:6;17996:14;17989:45;17872:169;:::o;18047:366::-;18189:3;18210:67;18274:2;18269:3;18210:67;:::i;:::-;18203:74;;18286:93;18375:3;18286:93;:::i;:::-;18404:2;18399:3;18395:12;18388:19;;18047:366;;;:::o;18419:419::-;18585:4;18623:2;18612:9;18608:18;18600:26;;18672:9;18666:4;18662:20;18658:1;18647:9;18643:17;18636:47;18700:131;18826:4;18700:131;:::i;:::-;18692:139;;18419:419;;;:::o;18844:180::-;18892:77;18889:1;18882:88;18989:4;18986:1;18979:15;19013:4;19010:1;19003:15;19030:165;19170:17;19166:1;19158:6;19154:14;19147:41;19030:165;:::o;19201:366::-;19343:3;19364:67;19428:2;19423:3;19364:67;:::i;:::-;19357:74;;19440:93;19529:3;19440:93;:::i;:::-;19558:2;19553:3;19549:12;19542:19;;19201:366;;;:::o;19573:419::-;19739:4;19777:2;19766:9;19762:18;19754:26;;19826:9;19820:4;19816:20;19812:1;19801:9;19797:17;19790:47;19854:131;19980:4;19854:131;:::i;:::-;19846:139;;19573:419;;;:::o;19998:233::-;20138:34;20134:1;20126:6;20122:14;20115:58;20207:16;20202:2;20194:6;20190:15;20183:41;19998:233;:::o;20237:366::-;20379:3;20400:67;20464:2;20459:3;20400:67;:::i;:::-;20393:74;;20476:93;20565:3;20476:93;:::i;:::-;20594:2;20589:3;20585:12;20578:19;;20237:366;;;:::o;20609:419::-;20775:4;20813:2;20802:9;20798:18;20790:26;;20862:9;20856:4;20852:20;20848:1;20837:9;20833:17;20826:47;20890:131;21016:4;20890:131;:::i;:::-;20882:139;;20609:419;;;:::o;21034:158::-;21174:10;21170:1;21162:6;21158:14;21151:34;21034:158;:::o;21198:365::-;21340:3;21361:66;21425:1;21420:3;21361:66;:::i;:::-;21354:73;;21436:93;21525:3;21436:93;:::i;:::-;21554:2;21549:3;21545:12;21538:19;;21198:365;;;:::o;21569:419::-;21735:4;21773:2;21762:9;21758:18;21750:26;;21822:9;21816:4;21812:20;21808:1;21797:9;21793:17;21786:47;21850:131;21976:4;21850:131;:::i;:::-;21842:139;;21569:419;;;:::o;21994:410::-;22034:7;22057:20;22075:1;22057:20;:::i;:::-;22052:25;;22091:20;22109:1;22091:20;:::i;:::-;22086:25;;22146:1;22143;22139:9;22168:30;22186:11;22168:30;:::i;:::-;22157:41;;22347:1;22338:7;22334:15;22331:1;22328:22;22308:1;22301:9;22281:83;22258:139;;22377:18;;:::i;:::-;22258:139;22042:362;21994:410;;;;:::o;22410:177::-;22550:29;22546:1;22538:6;22534:14;22527:53;22410:177;:::o;22593:366::-;22735:3;22756:67;22820:2;22815:3;22756:67;:::i;:::-;22749:74;;22832:93;22921:3;22832:93;:::i;:::-;22950:2;22945:3;22941:12;22934:19;;22593:366;;;:::o;22965:419::-;23131:4;23169:2;23158:9;23154:18;23146:26;;23218:9;23212:4;23208:20;23204:1;23193:9;23189:17;23182:47;23246:131;23372:4;23246:131;:::i;:::-;23238:139;;22965:419;;;:::o;23390:141::-;23439:4;23462:3;23454:11;;23485:3;23482:1;23475:14;23519:4;23516:1;23506:18;23498:26;;23390:141;;;:::o;23537:93::-;23574:6;23621:2;23616;23609:5;23605:14;23601:23;23591:33;;23537:93;;;:::o;23636:107::-;23680:8;23730:5;23724:4;23720:16;23699:37;;23636:107;;;;:::o;23749:393::-;23818:6;23868:1;23856:10;23852:18;23891:97;23921:66;23910:9;23891:97;:::i;:::-;24009:39;24039:8;24028:9;24009:39;:::i;:::-;23997:51;;24081:4;24077:9;24070:5;24066:21;24057:30;;24130:4;24120:8;24116:19;24109:5;24106:30;24096:40;;23825:317;;23749:393;;;;;:::o;24148:60::-;24176:3;24197:5;24190:12;;24148:60;;;:::o;24214:142::-;24264:9;24297:53;24315:34;24324:24;24342:5;24324:24;:::i;:::-;24315:34;:::i;:::-;24297:53;:::i;:::-;24284:66;;24214:142;;;:::o;24362:75::-;24405:3;24426:5;24419:12;;24362:75;;;:::o;24443:269::-;24553:39;24584:7;24553:39;:::i;:::-;24614:91;24663:41;24687:16;24663:41;:::i;:::-;24655:6;24648:4;24642:11;24614:91;:::i;:::-;24608:4;24601:105;24519:193;24443:269;;;:::o;24718:73::-;24763:3;24718:73;:::o;24797:189::-;24874:32;;:::i;:::-;24915:65;24973:6;24965;24959:4;24915:65;:::i;:::-;24850:136;24797:189;;:::o;24992:186::-;25052:120;25069:3;25062:5;25059:14;25052:120;;;25123:39;25160:1;25153:5;25123:39;:::i;:::-;25096:1;25089:5;25085:13;25076:22;;25052:120;;;24992:186;;:::o;25184:543::-;25285:2;25280:3;25277:11;25274:446;;;25319:38;25351:5;25319:38;:::i;:::-;25403:29;25421:10;25403:29;:::i;:::-;25393:8;25389:44;25586:2;25574:10;25571:18;25568:49;;;25607:8;25592:23;;25568:49;25630:80;25686:22;25704:3;25686:22;:::i;:::-;25676:8;25672:37;25659:11;25630:80;:::i;:::-;25289:431;;25274:446;25184:543;;;:::o;25733:117::-;25787:8;25837:5;25831:4;25827:16;25806:37;;25733:117;;;;:::o;25856:169::-;25900:6;25933:51;25981:1;25977:6;25969:5;25966:1;25962:13;25933:51;:::i;:::-;25929:56;26014:4;26008;26004:15;25994:25;;25907:118;25856:169;;;;:::o;26030:295::-;26106:4;26252:29;26277:3;26271:4;26252:29;:::i;:::-;26244:37;;26314:3;26311:1;26307:11;26301:4;26298:21;26290:29;;26030:295;;;;:::o;26330:1395::-;26447:37;26480:3;26447:37;:::i;:::-;26549:18;26541:6;26538:30;26535:56;;;26571:18;;:::i;:::-;26535:56;26615:38;26647:4;26641:11;26615:38;:::i;:::-;26700:67;26760:6;26752;26746:4;26700:67;:::i;:::-;26794:1;26818:4;26805:17;;26850:2;26842:6;26839:14;26867:1;26862:618;;;;27524:1;27541:6;27538:77;;;27590:9;27585:3;27581:19;27575:26;27566:35;;27538:77;27641:67;27701:6;27694:5;27641:67;:::i;:::-;27635:4;27628:81;27497:222;26832:887;;26862:618;26914:4;26910:9;26902:6;26898:22;26948:37;26980:4;26948:37;:::i;:::-;27007:1;27021:208;27035:7;27032:1;27029:14;27021:208;;;27114:9;27109:3;27105:19;27099:26;27091:6;27084:42;27165:1;27157:6;27153:14;27143:24;;27212:2;27201:9;27197:18;27184:31;;27058:4;27055:1;27051:12;27046:17;;27021:208;;;27257:6;27248:7;27245:19;27242:179;;;27315:9;27310:3;27306:19;27300:26;27358:48;27400:4;27392:6;27388:17;27377:9;27358:48;:::i;:::-;27350:6;27343:64;27265:156;27242:179;27467:1;27463;27455:6;27451:14;27447:22;27441:4;27434:36;26869:611;;;26832:887;;26422:1303;;;26330:1395;;:::o;27731:172::-;27871:24;27867:1;27859:6;27855:14;27848:48;27731:172;:::o;27909:366::-;28051:3;28072:67;28136:2;28131:3;28072:67;:::i;:::-;28065:74;;28148:93;28237:3;28148:93;:::i;:::-;28266:2;28261:3;28257:12;28250:19;;27909:366;;;:::o;28281:419::-;28447:4;28485:2;28474:9;28470:18;28462:26;;28534:9;28528:4;28524:20;28520:1;28509:9;28505:17;28498:47;28562:131;28688:4;28562:131;:::i;:::-;28554:139;;28281:419;;;:::o;28706:174::-;28846:26;28842:1;28834:6;28830:14;28823:50;28706:174;:::o;28886:366::-;29028:3;29049:67;29113:2;29108:3;29049:67;:::i;:::-;29042:74;;29125:93;29214:3;29125:93;:::i;:::-;29243:2;29238:3;29234:12;29227:19;;28886:366;;;:::o;29258:419::-;29424:4;29462:2;29451:9;29447:18;29439:26;;29511:9;29505:4;29501:20;29497:1;29486:9;29482:17;29475:47;29539:131;29665:4;29539:131;:::i;:::-;29531:139;;29258:419;;;:::o;29683:177::-;29823:29;29819:1;29811:6;29807:14;29800:53;29683:177;:::o;29866:366::-;30008:3;30029:67;30093:2;30088:3;30029:67;:::i;:::-;30022:74;;30105:93;30194:3;30105:93;:::i;:::-;30223:2;30218:3;30214:12;30207:19;;29866:366;;;:::o;30238:419::-;30404:4;30442:2;30431:9;30427:18;30419:26;;30491:9;30485:4;30481:20;30477:1;30466:9;30462:17;30455:47;30519:131;30645:4;30519:131;:::i;:::-;30511:139;;30238:419;;;:::o;30663:148::-;30765:11;30802:3;30787:18;;30663:148;;;;:::o;30817:390::-;30923:3;30951:39;30984:5;30951:39;:::i;:::-;31006:89;31088:6;31083:3;31006:89;:::i;:::-;30999:96;;31104:65;31162:6;31157:3;31150:4;31143:5;31139:16;31104:65;:::i;:::-;31194:6;31189:3;31185:16;31178:23;;30927:280;30817:390;;;;:::o;31213:435::-;31393:3;31415:95;31506:3;31497:6;31415:95;:::i;:::-;31408:102;;31527:95;31618:3;31609:6;31527:95;:::i;:::-;31520:102;;31639:3;31632:10;;31213:435;;;;;:::o;31654:164::-;31794:16;31790:1;31782:6;31778:14;31771:40;31654:164;:::o;31824:366::-;31966:3;31987:67;32051:2;32046:3;31987:67;:::i;:::-;31980:74;;32063:93;32152:3;32063:93;:::i;:::-;32181:2;32176:3;32172:12;32165:19;;31824:366;;;:::o;32196:419::-;32362:4;32400:2;32389:9;32385:18;32377:26;;32449:9;32443:4;32439:20;32435:1;32424:9;32420:17;32413:47;32477:131;32603:4;32477:131;:::i;:::-;32469:139;;32196:419;;;:::o;32621:225::-;32761:34;32757:1;32749:6;32745:14;32738:58;32830:8;32825:2;32817:6;32813:15;32806:33;32621:225;:::o;32852:366::-;32994:3;33015:67;33079:2;33074:3;33015:67;:::i;:::-;33008:74;;33091:93;33180:3;33091:93;:::i;:::-;33209:2;33204:3;33200:12;33193:19;;32852:366;;;:::o;33224:419::-;33390:4;33428:2;33417:9;33413:18;33405:26;;33477:9;33471:4;33467:20;33463:1;33452:9;33448:17;33441:47;33505:131;33631:4;33505:131;:::i;:::-;33497:139;;33224:419;;;:::o;33649:98::-;33700:6;33734:5;33728:12;33718:22;;33649:98;;;:::o;33753:168::-;33836:11;33870:6;33865:3;33858:19;33910:4;33905:3;33901:14;33886:29;;33753:168;;;;:::o;33927:373::-;34013:3;34041:38;34073:5;34041:38;:::i;:::-;34095:70;34158:6;34153:3;34095:70;:::i;:::-;34088:77;;34174:65;34232:6;34227:3;34220:4;34213:5;34209:16;34174:65;:::i;:::-;34264:29;34286:6;34264:29;:::i;:::-;34259:3;34255:39;34248:46;;34017:283;33927:373;;;;:::o;34306:640::-;34501:4;34539:3;34528:9;34524:19;34516:27;;34553:71;34621:1;34610:9;34606:17;34597:6;34553:71;:::i;:::-;34634:72;34702:2;34691:9;34687:18;34678:6;34634:72;:::i;:::-;34716;34784:2;34773:9;34769:18;34760:6;34716:72;:::i;:::-;34835:9;34829:4;34825:20;34820:2;34809:9;34805:18;34798:48;34863:76;34934:4;34925:6;34863:76;:::i;:::-;34855:84;;34306:640;;;;;;;:::o;34952:141::-;35008:5;35039:6;35033:13;35024:22;;35055:32;35081:5;35055:32;:::i;:::-;34952:141;;;;:::o;35099:349::-;35168:6;35217:2;35205:9;35196:7;35192:23;35188:32;35185:119;;;35223:79;;:::i;:::-;35185:119;35343:1;35368:63;35423:7;35414:6;35403:9;35399:22;35368:63;:::i;:::-;35358:73;;35314:127;35099:349;;;;:::o;35454:233::-;35493:3;35516:24;35534:5;35516:24;:::i;:::-;35507:33;;35562:66;35555:5;35552:77;35549:103;;35632:18;;:::i;:::-;35549:103;35679:1;35672:5;35668:13;35661:20;;35454:233;;;:::o;35693:180::-;35741:77;35738:1;35731:88;35838:4;35835:1;35828:15;35862:4;35859:1;35852:15;35879:185;35919:1;35936:20;35954:1;35936:20;:::i;:::-;35931:25;;35970:20;35988:1;35970:20;:::i;:::-;35965:25;;36009:1;35999:35;;36014:18;;:::i;:::-;35999:35;36056:1;36053;36049:9;36044:14;;35879:185;;;;:::o;36070:194::-;36110:4;36130:20;36148:1;36130:20;:::i;:::-;36125:25;;36164:20;36182:1;36164:20;:::i;:::-;36159:25;;36208:1;36205;36201:9;36193:17;;36232:1;36226:4;36223:11;36220:37;;;36237:18;;:::i;:::-;36220:37;36070:194;;;;:::o;36270:176::-;36302:1;36319:20;36337:1;36319:20;:::i;:::-;36314:25;;36353:20;36371:1;36353:20;:::i;:::-;36348:25;;36392:1;36382:35;;36397:18;;:::i;:::-;36382:35;36438:1;36435;36431:9;36426:14;;36270:176;;;;:::o;36452:77::-;36489:7;36518:5;36507:16;;36452:77;;;:::o;36535:118::-;36622:24;36640:5;36622:24;:::i;:::-;36617:3;36610:37;36535:118;;:::o;36659:332::-;36780:4;36818:2;36807:9;36803:18;36795:26;;36831:71;36899:1;36888:9;36884:17;36875:6;36831:71;:::i;:::-;36912:72;36980:2;36969:9;36965:18;36956:6;36912:72;:::i;:::-;36659:332;;;;;:::o;36997:180::-;37045:77;37042:1;37035:88;37142:4;37139:1;37132:15;37166:4;37163:1;37156:15;37183:174;37323:26;37319:1;37311:6;37307:14;37300:50;37183:174;:::o;37363:366::-;37505:3;37526:67;37590:2;37585:3;37526:67;:::i;:::-;37519:74;;37602:93;37691:3;37602:93;:::i;:::-;37720:2;37715:3;37711:12;37704:19;;37363:366;;;:::o;37735:419::-;37901:4;37939:2;37928:9;37924:18;37916:26;;37988:9;37982:4;37978:20;37974:1;37963:9;37959:17;37952:47;38016:131;38142:4;38016:131;:::i;:::-;38008:139;;37735:419;;;:::o;38160:181::-;38300:33;38296:1;38288:6;38284:14;38277:57;38160:181;:::o;38347:366::-;38489:3;38510:67;38574:2;38569:3;38510:67;:::i;:::-;38503:74;;38586:93;38675:3;38586:93;:::i;:::-;38704:2;38699:3;38695:12;38688:19;;38347:366;;;:::o;38719:419::-;38885:4;38923:2;38912:9;38908:18;38900:26;;38972:9;38966:4;38962:20;38958:1;38947:9;38943:17;38936:47;39000:131;39126:4;39000:131;:::i;:::-;38992:139;;38719:419;;;:::o;39144:221::-;39284:34;39280:1;39272:6;39268:14;39261:58;39353:4;39348:2;39340:6;39336:15;39329:29;39144:221;:::o;39371:366::-;39513:3;39534:67;39598:2;39593:3;39534:67;:::i;:::-;39527:74;;39610:93;39699:3;39610:93;:::i;:::-;39728:2;39723:3;39719:12;39712:19;;39371:366;;;:::o;39743:419::-;39909:4;39947:2;39936:9;39932:18;39924:26;;39996:9;39990:4;39986:20;39982:1;39971:9;39967:17;39960:47;40024:131;40150:4;40024:131;:::i;:::-;40016:139;;39743:419;;;:::o;40168:221::-;40308:34;40304:1;40296:6;40292:14;40285:58;40377:4;40372:2;40364:6;40360:15;40353:29;40168:221;:::o;40395:366::-;40537:3;40558:67;40622:2;40617:3;40558:67;:::i;:::-;40551:74;;40634:93;40723:3;40634:93;:::i;:::-;40752:2;40747:3;40743:12;40736:19;;40395:366;;;:::o;40767:419::-;40933:4;40971:2;40960:9;40956:18;40948:26;;41020:9;41014:4;41010:20;41006:1;40995:9;40991:17;40984:47;41048:131;41174:4;41048:131;:::i;:::-;41040:139;;40767:419;;;:::o;41192:214::-;41332:66;41328:1;41320:6;41316:14;41309:90;41192:214;:::o;41412:400::-;41572:3;41593:84;41675:1;41670:3;41593:84;:::i;:::-;41586:91;;41686:93;41775:3;41686:93;:::i;:::-;41804:1;41799:3;41795:11;41788:18;;41412:400;;;:::o;41818:79::-;41857:7;41886:5;41875:16;;41818:79;;;:::o;41903:157::-;42008:45;42028:24;42046:5;42028:24;:::i;:::-;42008:45;:::i;:::-;42003:3;41996:58;41903:157;;:::o;42066:663::-;42307:3;42329:148;42473:3;42329:148;:::i;:::-;42322:155;;42487:75;42558:3;42549:6;42487:75;:::i;:::-;42587:2;42582:3;42578:12;42571:19;;42600:75;42671:3;42662:6;42600:75;:::i;:::-;42700:2;42695:3;42691:12;42684:19;;42720:3;42713:10;;42066:663;;;;;:::o;42735:86::-;42770:7;42810:4;42803:5;42799:16;42788:27;;42735:86;;;:::o;42827:112::-;42910:22;42926:5;42910:22;:::i;:::-;42905:3;42898:35;42827:112;;:::o;42945:545::-;43118:4;43156:3;43145:9;43141:19;43133:27;;43170:71;43238:1;43227:9;43223:17;43214:6;43170:71;:::i;:::-;43251:68;43315:2;43304:9;43300:18;43291:6;43251:68;:::i;:::-;43329:72;43397:2;43386:9;43382:18;43373:6;43329:72;:::i;:::-;43411;43479:2;43468:9;43464:18;43455:6;43411:72;:::i;:::-;42945:545;;;;;;;:::o;43496:664::-;43701:4;43739:3;43728:9;43724:19;43716:27;;43753:71;43821:1;43810:9;43806:17;43797:6;43753:71;:::i;:::-;43834:72;43902:2;43891:9;43887:18;43878:6;43834:72;:::i;:::-;43916;43984:2;43973:9;43969:18;43960:6;43916:72;:::i;:::-;43998;44066:2;44055:9;44051:18;44042:6;43998:72;:::i;:::-;44080:73;44148:3;44137:9;44133:19;44124:6;44080:73;:::i;:::-;43496:664;;;;;;;;:::o

Swarm Source

ipfs://9f6c1ec124e5ddd3b18a2941f3d20a53734e08ff4379f55d0ab46284de41fa89
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.