ETH Price: $3,123.59 (+1.90%)

Token

Swole Apes.wtf (SWOLE)
 

Overview

Max Total Supply

3,494 SWOLE

Holders

1,320

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 SWOLE
0x25bd9c27b833b25d70bbfcb4333af8bdfa79b596
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:
SwoleApeswtf

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-25
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.0;









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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal _nextTokenId;

    // 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_;
        _nextTokenId = 1;
    }

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert('ERC721A: unable to get token of owner by index');
    }

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

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

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

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

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

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

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

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

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

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

        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);
        require(to != owner, 'ERC721A: approval to current owner');

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _nextTokenId;
    }

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _nextTokenId;
        require(to != address(0), 'ERC721A: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721A: token already minted');
        require(quantity > 0, 'ERC721A: quantity must be greater 0');

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

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

        _nextTokenId = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
        }

        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

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

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

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

pragma solidity ^0.8.0;

contract SwoleApeswtf is ERC721A, Ownable {
  using Strings for uint256;
  address public contractOwner;
  uint256 public mintPrice = 0.008 ether;
  uint256 public presalePrice = 0.0 ether;
  uint256 public supply = 8888;
  uint256 public freeAmount = 3000;
  string private baseURI = "ipfs://bafybeifzdp3sqwl5pnvxxtqk63vwuwirvuvirvy3ao4uahqp5z3ofpizoi/";
  uint8 public phase = 1;
  uint8 public maxBuy = 50;
  uint8 public presaleMaxBuy = 1;

  mapping(address => uint8)  public walletBuys;

  constructor() ERC721A("Swole Apes.wtf", "SWOLE") {
    contractOwner = msg.sender;
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

  function mintForAddress(address[] calldata _addresses, uint256 quantity) public onlyOwner {
    for (uint i=0; i<_addresses.length; i++) {
      _safeMint(_addresses[i], quantity);
    }
  }

  function mint(uint8 _mintAmount) external payable {
    require(phase == 3, "This sale has not started");
    require(totalSupply() + _mintAmount <= supply, "You can't mint more then the total supply");
    require(walletBuys[msg.sender] + _mintAmount <= maxBuy, "Buy limit reached");
    require(msg.value >= mintPrice * _mintAmount, "Insufficient funds");

    walletBuys[msg.sender] += _mintAmount;
    _safeMint(msg.sender, _mintAmount);
  }

  function publicMint(uint8 _mintAmount) external payable {
    require(phase == 2, "This sale has not started");
    require(totalSupply() + _mintAmount <= supply, "You can't mint more then the total supply");
    require(walletBuys[msg.sender] + _mintAmount <= presaleMaxBuy, "Buy limit reached");
    

    require(totalSupply() + _mintAmount < freeAmount, "All free mints have been claimed");
    require(msg.value >= presalePrice * _mintAmount, "Insufficient funds");
    
    walletBuys[msg.sender] += _mintAmount;
    _safeMint(msg.sender, _mintAmount);
    
  }

  function presaleMint(uint8 _mintAmount) public payable {
    // Verify presale list requirements
    require(phase == 0, "This sale has not started");
    require(walletBuys[msg.sender] + _mintAmount <= presaleMaxBuy, "Buy limit reached");

    walletBuys[msg.sender] += _mintAmount;
    _safeMint(msg.sender, _mintAmount);
  }

  function getBaseURI() public view returns (string memory) {
    return baseURI;
  }

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

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

  function setMintPrice (uint256 _newPrice) external onlyOwner {
    mintPrice = _newPrice;
  }

  function setPresalePrice (uint256 _newPrice) external onlyOwner {
    presalePrice = _newPrice;
  }

  function setPhase(uint8 _phase) public onlyOwner {
    phase = _phase;
  }

  function setMaxBuy(uint8 _maxBuy) external onlyOwner {
      maxBuy = _maxBuy;
  }

  function setPresaleMaxBuy(uint8 _maxBuy) external onlyOwner {
      presaleMaxBuy = _maxBuy;
  }

  function updateSupply(uint256 _supply) external onlyOwner {
      supply = _supply;
  }

  function updateFreeAmount(uint256 _amount) external onlyOwner {
      freeAmount = _amount;
  }

  function getContractBalance () external view onlyOwner returns (uint256) {
    return address(this).balance;
  }

  function changeTreasury(address payable _newWallet) external onlyOwner {
    contractOwner = _newWallet;
  }

  function withdraw() external payable onlyOwner {
    (bool os, ) = payable(contractOwner).call{value: address(this).balance}("");
    require(os);
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[{"internalType":"address payable","name":"_newWallet","type":"address"}],"name":"changeTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeAmount","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":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxBuy","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMaxBuy","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxBuy","type":"uint8"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_phase","type":"uint8"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxBuy","type":"uint8"}],"name":"setPresaleMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateFreeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"updateSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletBuys","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052661c6bf5263400006009556000600a556122b8600b55610bb8600c556040518060800160405280604381526020016200545260439139600d90805190602001906200005192919062000291565b506001600e60006101000a81548160ff021916908360ff1602179055506032600e60016101000a81548160ff021916908360ff1602179055506001600e60026101000a81548160ff021916908360ff160217905550348015620000b357600080fd5b506040518060400160405280600e81526020017f53776f6c6520417065732e7774660000000000000000000000000000000000008152506040518060400160405280600581526020017f53574f4c4500000000000000000000000000000000000000000000000000000081525081600190805190602001906200013892919062000291565b5080600290805190602001906200015192919062000291565b50600160008190555050506200017c62000170620001c360201b60201c565b620001cb60201b60201c565b33600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003a6565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200029f9062000341565b90600052602060002090601f016020900481019282620002c357600085556200030f565b82601f10620002de57805160ff19168380011785556200030f565b828001600101855582156200030f579182015b828111156200030e578251825591602001919060010190620002f1565b5b5090506200031e919062000322565b5090565b5b808211156200033d57600081600090555060010162000323565b5090565b600060028204905060018216806200035a57607f821691505b6020821081141562000371576200037062000377565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61509c80620003b66000396000f3fe6080604052600436106102665760003560e01c806370db69d611610144578063c03afb59116100b6578063dea96c981161007a578063dea96c98146108de578063dfcf15b01461091b578063e985e9c514610944578063f2fde38b14610981578063f4a0a528146109aa578063f617f920146109d357610266565b8063c03afb59146107fb578063c87b56dd14610824578063ce606ee014610861578063cf1ec4bd1461088c578063dbdf2dc0146108b557610266565b806395d89b411161010857806395d89b4114610701578063a22cb4651461072c578063ad0b4cc314610755578063b14f2a391461077e578063b1c9fe6e146107a7578063b88d4fde146107d257610266565b806370db69d61461064d578063714c539814610678578063715018a6146106a3578063858e83b5146106ba5780638da5cb5b146106d657610266565b80633a3f716a116101dd5780636352211e116101a15780636352211e146105385780636817c76c146105755780636bd08049146105a05780636ecd2306146105c95780636f9fb98a146105e557806370a082311461061057610266565b80633a3f716a146104745780633ccfd60b1461049f57806342842e0e146104a95780634f6ccce7146104d257806355f804b31461050f57610266565b8063081812fc1161022f578063081812fc14610354578063095ea7b31461039157806318160ddd146103ba57806323b872dd146103e55780632f745c591461040e5780633549345e1461044b57610266565b80620e7fa81461026b57806301ffc9a7146102965780630451a9f1146102d3578063047fc9aa146102fe57806306fdde0314610329575b600080fd5b34801561027757600080fd5b506102806109ef565b60405161028d9190614a8c565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190613b81565b6109f5565b6040516102ca919061474f565b60405180910390f35b3480156102df57600080fd5b506102e8610b3f565b6040516102f59190614a8c565b60405180910390f35b34801561030a57600080fd5b50610313610b45565b6040516103209190614a8c565b60405180910390f35b34801561033557600080fd5b5061033e610b4b565b60405161034b919061476a565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190613c14565b610bdd565b60405161038891906146e8565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190613aed565b610c62565b005b3480156103c657600080fd5b506103cf610d7b565b6040516103dc9190614a8c565b60405180910390f35b3480156103f157600080fd5b5061040c600480360381019061040791906139e7565b610d91565b005b34801561041a57600080fd5b5061043560048036038101906104309190613aed565b610da1565b6040516104429190614a8c565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d9190613c14565b610f9f565b005b34801561048057600080fd5b50610489611025565b6040516104969190614aa7565b60405180910390f35b6104a7611038565b005b3480156104b557600080fd5b506104d060048036038101906104cb91906139e7565b61114f565b005b3480156104de57600080fd5b506104f960048036038101906104f49190613c14565b61116f565b6040516105069190614a8c565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613bd3565b6111c2565b005b34801561054457600080fd5b5061055f600480360381019061055a9190613c14565b611258565b60405161056c91906146e8565b60405180910390f35b34801561058157600080fd5b5061058a61126e565b6040516105979190614a8c565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c29190613c14565b611274565b005b6105e360048036038101906105de9190613c3d565b6112fa565b005b3480156105f157600080fd5b506105fa61152e565b6040516106079190614a8c565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190613959565b6115b2565b6040516106449190614a8c565b60405180910390f35b34801561065957600080fd5b5061066261169b565b60405161066f9190614aa7565b60405180910390f35b34801561068457600080fd5b5061068d6116ae565b60405161069a919061476a565b60405180910390f35b3480156106af57600080fd5b506106b8611740565b005b6106d460048036038101906106cf9190613c3d565b6117c8565b005b3480156106e257600080fd5b506106eb611a55565b6040516106f891906146e8565b60405180910390f35b34801561070d57600080fd5b50610716611a7f565b604051610723919061476a565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190613ab1565b611b11565b005b34801561076157600080fd5b5061077c60048036038101906107779190613c3d565b611c92565b005b34801561078a57600080fd5b506107a560048036038101906107a09190613982565b611d2c565b005b3480156107b357600080fd5b506107bc611dec565b6040516107c99190614aa7565b60405180910390f35b3480156107de57600080fd5b506107f960048036038101906107f49190613a36565b611dff565b005b34801561080757600080fd5b50610822600480360381019061081d9190613c3d565b611e5b565b005b34801561083057600080fd5b5061084b60048036038101906108469190613c14565b611ef5565b604051610858919061476a565b60405180910390f35b34801561086d57600080fd5b50610876611f9d565b60405161088391906146e8565b60405180910390f35b34801561089857600080fd5b506108b360048036038101906108ae9190613c14565b611fc3565b005b3480156108c157600080fd5b506108dc60048036038101906108d79190613c3d565b612049565b005b3480156108ea57600080fd5b5061090560048036038101906109009190613959565b6120e3565b6040516109129190614aa7565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d9190613b29565b612103565b005b34801561095057600080fd5b5061096b600480360381019061096691906139ab565b6121fd565b604051610978919061474f565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a39190613959565b612291565b005b3480156109b657600080fd5b506109d160048036038101906109cc9190613c14565b612389565b005b6109ed60048036038101906109e89190613c3d565b61240f565b005b600a5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ac057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b2857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b385750610b3782612596565b5b9050919050565b600c5481565b600b5481565b606060018054610b5a90614e63565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8690614e63565b8015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b5050505050905090565b6000610be882612600565b610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e90614a6c565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6d82611258565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd59061496c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cfd61260d565b73ffffffffffffffffffffffffffffffffffffffff161480610d2c5750610d2b81610d2661260d565b6121fd565b5b610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d629061486c565b60405180910390fd5b610d76838383612615565b505050565b60006001600054610d8c9190614d14565b905090565b610d9c8383836126c7565b505050565b6000610dac836115b2565b8210610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de49061478c565b60405180910390fd5b6000610df7610d7b565b905060008060005b83811015610f5d576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ef157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f495786841415610f3a578195505050505050610f99565b8380610f4590614e95565b9450505b508080610f5590614e95565b915050610dff565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9090614a2c565b60405180910390fd5b92915050565b610fa761260d565b73ffffffffffffffffffffffffffffffffffffffff16610fc5611a55565b73ffffffffffffffffffffffffffffffffffffffff161461101b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611012906148ec565b60405180910390fd5b80600a8190555050565b600e60029054906101000a900460ff1681565b61104061260d565b73ffffffffffffffffffffffffffffffffffffffff1661105e611a55565b73ffffffffffffffffffffffffffffffffffffffff16146110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ab906148ec565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516110fc906146d3565b60006040518083038185875af1925050503d8060008114611139576040519150601f19603f3d011682016040523d82523d6000602084013e61113e565b606091505b505090508061114c57600080fd5b50565b61116a83838360405180602001604052806000815250611dff565b505050565b6000611179610d7b565b82106111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b1906147ec565b60405180910390fd5b819050919050565b6111ca61260d565b73ffffffffffffffffffffffffffffffffffffffff166111e8611a55565b73ffffffffffffffffffffffffffffffffffffffff161461123e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611235906148ec565b60405180910390fd5b80600d90805190602001906112549291906136cf565b5050565b600061126382612c6e565b600001519050919050565b60095481565b61127c61260d565b73ffffffffffffffffffffffffffffffffffffffff1661129a611a55565b73ffffffffffffffffffffffffffffffffffffffff16146112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e7906148ec565b60405180910390fd5b80600b8190555050565b6003600e60009054906101000a900460ff1660ff161461134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690614a4c565b60405180910390fd5b600b548160ff1661135e610d7b565b6113689190614bfc565b11156113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a09061484c565b60405180910390fd5b600e60019054906101000a900460ff1660ff1681600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114149190614c52565b60ff161115611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f9061488c565b60405180910390fd5b8060ff166009546114699190614cba565b3410156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a29061482c565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166115069190614c52565b92506101000a81548160ff021916908360ff16021790555061152b338260ff16612dc9565b50565b600061153861260d565b73ffffffffffffffffffffffffffffffffffffffff16611556611a55565b73ffffffffffffffffffffffffffffffffffffffff16146115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a3906148ec565b60405180910390fd5b47905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a906148ac565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b600e60019054906101000a900460ff1681565b6060600d80546116bd90614e63565b80601f01602080910402602001604051908101604052809291908181526020018280546116e990614e63565b80156117365780601f1061170b57610100808354040283529160200191611736565b820191906000526020600020905b81548152906001019060200180831161171957829003601f168201915b5050505050905090565b61174861260d565b73ffffffffffffffffffffffffffffffffffffffff16611766611a55565b73ffffffffffffffffffffffffffffffffffffffff16146117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b3906148ec565b60405180910390fd5b6117c66000612de7565b565b6002600e60009054906101000a900460ff1660ff161461181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490614a4c565b60405180910390fd5b600b548160ff1661182c610d7b565b6118369190614bfc565b1115611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e9061484c565b60405180910390fd5b600e60029054906101000a900460ff1660ff1681600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118e29190614c52565b60ff161115611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d9061488c565b60405180910390fd5b600c548160ff16611935610d7b565b61193f9190614bfc565b1061197f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611976906149ec565b60405180910390fd5b8060ff16600a546119909190614cba565b3410156119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c99061482c565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611a2d9190614c52565b92506101000a81548160ff021916908360ff160217905550611a52338260ff16612dc9565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611a8e90614e63565b80601f0160208091040260200160405190810160405280929190818152602001828054611aba90614e63565b8015611b075780601f10611adc57610100808354040283529160200191611b07565b820191906000526020600020905b815481529060010190602001808311611aea57829003601f168201915b5050505050905090565b611b1961260d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7e9061492c565b60405180910390fd5b8060066000611b9461260d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c4161260d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c86919061474f565b60405180910390a35050565b611c9a61260d565b73ffffffffffffffffffffffffffffffffffffffff16611cb8611a55565b73ffffffffffffffffffffffffffffffffffffffff1614611d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d05906148ec565b60405180910390fd5b80600e60026101000a81548160ff021916908360ff16021790555050565b611d3461260d565b73ffffffffffffffffffffffffffffffffffffffff16611d52611a55565b73ffffffffffffffffffffffffffffffffffffffff1614611da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9f906148ec565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60009054906101000a900460ff1681565b611e0a8484846126c7565b611e1684848484612ead565b611e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4c906149ac565b60405180910390fd5b50505050565b611e6361260d565b73ffffffffffffffffffffffffffffffffffffffff16611e81611a55565b73ffffffffffffffffffffffffffffffffffffffff1614611ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ece906148ec565b60405180910390fd5b80600e60006101000a81548160ff021916908360ff16021790555050565b6060611f0082612600565b611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f369061490c565b60405180910390fd5b6000600d8054611f4e90614e63565b905011611f6a5760405180602001604052806000815250611f96565b600d611f7583613044565b604051602001611f869291906146a4565b6040516020818303038152906040525b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611fcb61260d565b73ffffffffffffffffffffffffffffffffffffffff16611fe9611a55565b73ffffffffffffffffffffffffffffffffffffffff161461203f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612036906148ec565b60405180910390fd5b80600c8190555050565b61205161260d565b73ffffffffffffffffffffffffffffffffffffffff1661206f611a55565b73ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc906148ec565b60405180910390fd5b80600e60016101000a81548160ff021916908360ff16021790555050565b600f6020528060005260406000206000915054906101000a900460ff1681565b61210b61260d565b73ffffffffffffffffffffffffffffffffffffffff16612129611a55565b73ffffffffffffffffffffffffffffffffffffffff161461217f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612176906148ec565b60405180910390fd5b60005b838390508110156121f7576121e48484838181106121c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906121de9190613959565b83612dc9565b80806121ef90614e95565b915050612182565b50505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61229961260d565b73ffffffffffffffffffffffffffffffffffffffff166122b7611a55565b73ffffffffffffffffffffffffffffffffffffffff161461230d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612304906148ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561237d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612374906147ac565b60405180910390fd5b61238681612de7565b50565b61239161260d565b73ffffffffffffffffffffffffffffffffffffffff166123af611a55565b73ffffffffffffffffffffffffffffffffffffffff1614612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fc906148ec565b60405180910390fd5b8060098190555050565b6000600e60009054906101000a900460ff1660ff1614612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245b90614a4c565b60405180910390fd5b600e60029054906101000a900460ff1660ff1681600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166124cf9190614c52565b60ff161115612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250a9061488c565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661256e9190614c52565b92506101000a81548160ff021916908360ff160217905550612593338260ff16612dc9565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006126d282612c6e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166126f961260d565b73ffffffffffffffffffffffffffffffffffffffff161480612755575061271e61260d565b73ffffffffffffffffffffffffffffffffffffffff1661273d84610bdd565b73ffffffffffffffffffffffffffffffffffffffff16145b806127715750612770826000015161276b61260d565b6121fd565b5b9050806127b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127aa9061494c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281c906148cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288c9061480c565b60405180910390fd5b6128a285858560016131f1565b6128b26000848460000151612615565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612ab89190614bfc565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612bfe57612b2e81612600565b15612bfd576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c6686868660016131f7565b505050505050565b612c76613755565b612c7f82612600565b612cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb5906147cc565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612db0578092505050612dc4565b508080612dbc90614e39565b915050612cc4565b919050565b612de38282604051806020016040528060008152506131fd565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ece8473ffffffffffffffffffffffffffffffffffffffff166136bc565b15613037578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ef761260d565b8786866040518563ffffffff1660e01b8152600401612f199493929190614703565b602060405180830381600087803b158015612f3357600080fd5b505af1925050508015612f6457506040513d601f19601f82011682018060405250810190612f619190613baa565b60015b612fe7573d8060008114612f94576040519150601f19603f3d011682016040523d82523d6000602084013e612f99565b606091505b50600081511415612fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd6906149ac565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061303c565b600190505b949350505050565b6060600082141561308c576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131ec565b600082905060005b600082146130be5780806130a790614e95565b915050600a826130b79190614c89565b9150613094565b60008167ffffffffffffffff811115613100577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131325781602001600182028036833780820191505090505b5090505b600085146131e55760018261314b9190614d14565b9150600a8561315a9190614ede565b60306131669190614bfc565b60f81b8183815181106131a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131de9190614c89565b9450613136565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326a90614a0c565b60405180910390fd5b61327c81612600565b156132bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b3906149cc565b60405180910390fd5b600083116132ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f69061498c565b60405180910390fd5b61330c60008583866131f1565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516134099190614bb6565b6fffffffffffffffffffffffffffffffff1681526020018583602001516134309190614bb6565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561369f57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461363f6000888488612ead565b61367e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613675906149ac565b60405180910390fd5b818061368990614e95565b925050808061369790614e95565b9150506135ce565b50806000819055506136b460008785886131f7565b505050505050565b600080823b905060008111915050919050565b8280546136db90614e63565b90600052602060002090601f0160209004810192826136fd5760008555613744565b82601f1061371657805160ff1916838001178555613744565b82800160010185558215613744579182015b82811115613743578251825591602001919060010190613728565b5b509050613751919061378f565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156137a8576000816000905550600101613790565b5090565b60006137bf6137ba84614af3565b614ac2565b9050828152602081018484840111156137d757600080fd5b6137e2848285614df7565b509392505050565b60006137fd6137f884614b23565b614ac2565b90508281526020810184848401111561381557600080fd5b613820848285614df7565b509392505050565b60008135905061383781614fdc565b92915050565b60008135905061384c81614ff3565b92915050565b60008083601f84011261386457600080fd5b8235905067ffffffffffffffff81111561387d57600080fd5b60208301915083602082028301111561389557600080fd5b9250929050565b6000813590506138ab8161500a565b92915050565b6000813590506138c081615021565b92915050565b6000815190506138d581615021565b92915050565b600082601f8301126138ec57600080fd5b81356138fc8482602086016137ac565b91505092915050565b600082601f83011261391657600080fd5b81356139268482602086016137ea565b91505092915050565b60008135905061393e81615038565b92915050565b6000813590506139538161504f565b92915050565b60006020828403121561396b57600080fd5b600061397984828501613828565b91505092915050565b60006020828403121561399457600080fd5b60006139a28482850161383d565b91505092915050565b600080604083850312156139be57600080fd5b60006139cc85828601613828565b92505060206139dd85828601613828565b9150509250929050565b6000806000606084860312156139fc57600080fd5b6000613a0a86828701613828565b9350506020613a1b86828701613828565b9250506040613a2c8682870161392f565b9150509250925092565b60008060008060808587031215613a4c57600080fd5b6000613a5a87828801613828565b9450506020613a6b87828801613828565b9350506040613a7c8782880161392f565b925050606085013567ffffffffffffffff811115613a9957600080fd5b613aa5878288016138db565b91505092959194509250565b60008060408385031215613ac457600080fd5b6000613ad285828601613828565b9250506020613ae38582860161389c565b9150509250929050565b60008060408385031215613b0057600080fd5b6000613b0e85828601613828565b9250506020613b1f8582860161392f565b9150509250929050565b600080600060408486031215613b3e57600080fd5b600084013567ffffffffffffffff811115613b5857600080fd5b613b6486828701613852565b93509350506020613b778682870161392f565b9150509250925092565b600060208284031215613b9357600080fd5b6000613ba1848285016138b1565b91505092915050565b600060208284031215613bbc57600080fd5b6000613bca848285016138c6565b91505092915050565b600060208284031215613be557600080fd5b600082013567ffffffffffffffff811115613bff57600080fd5b613c0b84828501613905565b91505092915050565b600060208284031215613c2657600080fd5b6000613c348482850161392f565b91505092915050565b600060208284031215613c4f57600080fd5b6000613c5d84828501613944565b91505092915050565b613c6f81614d48565b82525050565b613c7e81614d6c565b82525050565b6000613c8f82614b68565b613c998185614b7e565b9350613ca9818560208601614e06565b613cb281614fcb565b840191505092915050565b6000613cc882614b73565b613cd28185614b9a565b9350613ce2818560208601614e06565b613ceb81614fcb565b840191505092915050565b6000613d0182614b73565b613d0b8185614bab565b9350613d1b818560208601614e06565b80840191505092915050565b60008154613d3481614e63565b613d3e8186614bab565b94506001821660008114613d595760018114613d6a57613d9d565b60ff19831686528186019350613d9d565b613d7385614b53565b60005b83811015613d9557815481890152600182019150602081019050613d76565b838801955050505b50505092915050565b6000613db3602283614b9a565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e19602683614b9a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e7f602a83614b9a565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ee5602383614b9a565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f4b602583614b9a565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fb1601283614b9a565b91507f496e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b6000613ff1602983614b9a565b91507f596f752063616e2774206d696e74206d6f7265207468656e2074686520746f7460008301527f616c20737570706c7900000000000000000000000000000000000000000000006020830152604082019050919050565b6000614057603983614b9a565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b60006140bd601183614b9a565b91507f427579206c696d697420726561636865640000000000000000000000000000006000830152602082019050919050565b60006140fd602b83614b9a565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000614163602683614b9a565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141c9600583614bab565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000614209602083614b9a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614249602f83614b9a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006142af601a83614b9a565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b60006142ef603283614b9a565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b6000614355602283614b9a565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143bb600083614b8f565b9150600082019050919050565b60006143d5602383614b9a565b91507f455243373231413a207175616e74697479206d7573742062652067726561746560008301527f72203000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061443b603383614b9a565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b60006144a1601d83614b9a565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b60006144e1602083614b9a565b91507f416c6c2066726565206d696e74732068617665206265656e20636c61696d65646000830152602082019050919050565b6000614521602183614b9a565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614587602e83614b9a565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b60006145ed601983614b9a565b91507f546869732073616c6520686173206e6f742073746172746564000000000000006000830152602082019050919050565b600061462d602d83614b9a565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b61468f81614de0565b82525050565b61469e81614dea565b82525050565b60006146b08285613d27565b91506146bc8284613cf6565b91506146c7826141bc565b91508190509392505050565b60006146de826143ae565b9150819050919050565b60006020820190506146fd6000830184613c66565b92915050565b60006080820190506147186000830187613c66565b6147256020830186613c66565b6147326040830185614686565b81810360608301526147448184613c84565b905095945050505050565b60006020820190506147646000830184613c75565b92915050565b600060208201905081810360008301526147848184613cbd565b905092915050565b600060208201905081810360008301526147a581613da6565b9050919050565b600060208201905081810360008301526147c581613e0c565b9050919050565b600060208201905081810360008301526147e581613e72565b9050919050565b6000602082019050818103600083015261480581613ed8565b9050919050565b6000602082019050818103600083015261482581613f3e565b9050919050565b6000602082019050818103600083015261484581613fa4565b9050919050565b6000602082019050818103600083015261486581613fe4565b9050919050565b600060208201905081810360008301526148858161404a565b9050919050565b600060208201905081810360008301526148a5816140b0565b9050919050565b600060208201905081810360008301526148c5816140f0565b9050919050565b600060208201905081810360008301526148e581614156565b9050919050565b60006020820190508181036000830152614905816141fc565b9050919050565b600060208201905081810360008301526149258161423c565b9050919050565b60006020820190508181036000830152614945816142a2565b9050919050565b60006020820190508181036000830152614965816142e2565b9050919050565b6000602082019050818103600083015261498581614348565b9050919050565b600060208201905081810360008301526149a5816143c8565b9050919050565b600060208201905081810360008301526149c58161442e565b9050919050565b600060208201905081810360008301526149e581614494565b9050919050565b60006020820190508181036000830152614a05816144d4565b9050919050565b60006020820190508181036000830152614a2581614514565b9050919050565b60006020820190508181036000830152614a458161457a565b9050919050565b60006020820190508181036000830152614a65816145e0565b9050919050565b60006020820190508181036000830152614a8581614620565b9050919050565b6000602082019050614aa16000830184614686565b92915050565b6000602082019050614abc6000830184614695565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ae957614ae8614f9c565b5b8060405250919050565b600067ffffffffffffffff821115614b0e57614b0d614f9c565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614b3e57614b3d614f9c565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614bc182614da4565b9150614bcc83614da4565b9250826fffffffffffffffffffffffffffffffff03821115614bf157614bf0614f0f565b5b828201905092915050565b6000614c0782614de0565b9150614c1283614de0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c4757614c46614f0f565b5b828201905092915050565b6000614c5d82614dea565b9150614c6883614dea565b92508260ff03821115614c7e57614c7d614f0f565b5b828201905092915050565b6000614c9482614de0565b9150614c9f83614de0565b925082614caf57614cae614f3e565b5b828204905092915050565b6000614cc582614de0565b9150614cd083614de0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d0957614d08614f0f565b5b828202905092915050565b6000614d1f82614de0565b9150614d2a83614de0565b925082821015614d3d57614d3c614f0f565b5b828203905092915050565b6000614d5382614dc0565b9050919050565b6000614d6582614dc0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614e24578082015181840152602081019050614e09565b83811115614e33576000848401525b50505050565b6000614e4482614de0565b91506000821415614e5857614e57614f0f565b5b600182039050919050565b60006002820490506001821680614e7b57607f821691505b60208210811415614e8f57614e8e614f6d565b5b50919050565b6000614ea082614de0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ed357614ed2614f0f565b5b600182019050919050565b6000614ee982614de0565b9150614ef483614de0565b925082614f0457614f03614f3e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614fe581614d48565b8114614ff057600080fd5b50565b614ffc81614d5a565b811461500757600080fd5b50565b61501381614d6c565b811461501e57600080fd5b50565b61502a81614d78565b811461503557600080fd5b50565b61504181614de0565b811461504c57600080fd5b50565b61505881614dea565b811461506357600080fd5b5056fea26469706673582212201875a87f6a6afb869e7d39360e7de9d64af8d9f068b1aa0e94f34cbd692701e164736f6c63430008000033697066733a2f2f62616679626569667a6470337371776c35706e76787874716b36337677757769727675766972767933616f347561687170357a336f6670697a6f692f

Deployed Bytecode

0x6080604052600436106102665760003560e01c806370db69d611610144578063c03afb59116100b6578063dea96c981161007a578063dea96c98146108de578063dfcf15b01461091b578063e985e9c514610944578063f2fde38b14610981578063f4a0a528146109aa578063f617f920146109d357610266565b8063c03afb59146107fb578063c87b56dd14610824578063ce606ee014610861578063cf1ec4bd1461088c578063dbdf2dc0146108b557610266565b806395d89b411161010857806395d89b4114610701578063a22cb4651461072c578063ad0b4cc314610755578063b14f2a391461077e578063b1c9fe6e146107a7578063b88d4fde146107d257610266565b806370db69d61461064d578063714c539814610678578063715018a6146106a3578063858e83b5146106ba5780638da5cb5b146106d657610266565b80633a3f716a116101dd5780636352211e116101a15780636352211e146105385780636817c76c146105755780636bd08049146105a05780636ecd2306146105c95780636f9fb98a146105e557806370a082311461061057610266565b80633a3f716a146104745780633ccfd60b1461049f57806342842e0e146104a95780634f6ccce7146104d257806355f804b31461050f57610266565b8063081812fc1161022f578063081812fc14610354578063095ea7b31461039157806318160ddd146103ba57806323b872dd146103e55780632f745c591461040e5780633549345e1461044b57610266565b80620e7fa81461026b57806301ffc9a7146102965780630451a9f1146102d3578063047fc9aa146102fe57806306fdde0314610329575b600080fd5b34801561027757600080fd5b506102806109ef565b60405161028d9190614a8c565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190613b81565b6109f5565b6040516102ca919061474f565b60405180910390f35b3480156102df57600080fd5b506102e8610b3f565b6040516102f59190614a8c565b60405180910390f35b34801561030a57600080fd5b50610313610b45565b6040516103209190614a8c565b60405180910390f35b34801561033557600080fd5b5061033e610b4b565b60405161034b919061476a565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190613c14565b610bdd565b60405161038891906146e8565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190613aed565b610c62565b005b3480156103c657600080fd5b506103cf610d7b565b6040516103dc9190614a8c565b60405180910390f35b3480156103f157600080fd5b5061040c600480360381019061040791906139e7565b610d91565b005b34801561041a57600080fd5b5061043560048036038101906104309190613aed565b610da1565b6040516104429190614a8c565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d9190613c14565b610f9f565b005b34801561048057600080fd5b50610489611025565b6040516104969190614aa7565b60405180910390f35b6104a7611038565b005b3480156104b557600080fd5b506104d060048036038101906104cb91906139e7565b61114f565b005b3480156104de57600080fd5b506104f960048036038101906104f49190613c14565b61116f565b6040516105069190614a8c565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613bd3565b6111c2565b005b34801561054457600080fd5b5061055f600480360381019061055a9190613c14565b611258565b60405161056c91906146e8565b60405180910390f35b34801561058157600080fd5b5061058a61126e565b6040516105979190614a8c565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c29190613c14565b611274565b005b6105e360048036038101906105de9190613c3d565b6112fa565b005b3480156105f157600080fd5b506105fa61152e565b6040516106079190614a8c565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190613959565b6115b2565b6040516106449190614a8c565b60405180910390f35b34801561065957600080fd5b5061066261169b565b60405161066f9190614aa7565b60405180910390f35b34801561068457600080fd5b5061068d6116ae565b60405161069a919061476a565b60405180910390f35b3480156106af57600080fd5b506106b8611740565b005b6106d460048036038101906106cf9190613c3d565b6117c8565b005b3480156106e257600080fd5b506106eb611a55565b6040516106f891906146e8565b60405180910390f35b34801561070d57600080fd5b50610716611a7f565b604051610723919061476a565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190613ab1565b611b11565b005b34801561076157600080fd5b5061077c60048036038101906107779190613c3d565b611c92565b005b34801561078a57600080fd5b506107a560048036038101906107a09190613982565b611d2c565b005b3480156107b357600080fd5b506107bc611dec565b6040516107c99190614aa7565b60405180910390f35b3480156107de57600080fd5b506107f960048036038101906107f49190613a36565b611dff565b005b34801561080757600080fd5b50610822600480360381019061081d9190613c3d565b611e5b565b005b34801561083057600080fd5b5061084b60048036038101906108469190613c14565b611ef5565b604051610858919061476a565b60405180910390f35b34801561086d57600080fd5b50610876611f9d565b60405161088391906146e8565b60405180910390f35b34801561089857600080fd5b506108b360048036038101906108ae9190613c14565b611fc3565b005b3480156108c157600080fd5b506108dc60048036038101906108d79190613c3d565b612049565b005b3480156108ea57600080fd5b5061090560048036038101906109009190613959565b6120e3565b6040516109129190614aa7565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d9190613b29565b612103565b005b34801561095057600080fd5b5061096b600480360381019061096691906139ab565b6121fd565b604051610978919061474f565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a39190613959565b612291565b005b3480156109b657600080fd5b506109d160048036038101906109cc9190613c14565b612389565b005b6109ed60048036038101906109e89190613c3d565b61240f565b005b600a5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ac057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b2857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b385750610b3782612596565b5b9050919050565b600c5481565b600b5481565b606060018054610b5a90614e63565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8690614e63565b8015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b5050505050905090565b6000610be882612600565b610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e90614a6c565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6d82611258565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd59061496c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cfd61260d565b73ffffffffffffffffffffffffffffffffffffffff161480610d2c5750610d2b81610d2661260d565b6121fd565b5b610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d629061486c565b60405180910390fd5b610d76838383612615565b505050565b60006001600054610d8c9190614d14565b905090565b610d9c8383836126c7565b505050565b6000610dac836115b2565b8210610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de49061478c565b60405180910390fd5b6000610df7610d7b565b905060008060005b83811015610f5d576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ef157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f495786841415610f3a578195505050505050610f99565b8380610f4590614e95565b9450505b508080610f5590614e95565b915050610dff565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9090614a2c565b60405180910390fd5b92915050565b610fa761260d565b73ffffffffffffffffffffffffffffffffffffffff16610fc5611a55565b73ffffffffffffffffffffffffffffffffffffffff161461101b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611012906148ec565b60405180910390fd5b80600a8190555050565b600e60029054906101000a900460ff1681565b61104061260d565b73ffffffffffffffffffffffffffffffffffffffff1661105e611a55565b73ffffffffffffffffffffffffffffffffffffffff16146110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ab906148ec565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516110fc906146d3565b60006040518083038185875af1925050503d8060008114611139576040519150601f19603f3d011682016040523d82523d6000602084013e61113e565b606091505b505090508061114c57600080fd5b50565b61116a83838360405180602001604052806000815250611dff565b505050565b6000611179610d7b565b82106111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b1906147ec565b60405180910390fd5b819050919050565b6111ca61260d565b73ffffffffffffffffffffffffffffffffffffffff166111e8611a55565b73ffffffffffffffffffffffffffffffffffffffff161461123e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611235906148ec565b60405180910390fd5b80600d90805190602001906112549291906136cf565b5050565b600061126382612c6e565b600001519050919050565b60095481565b61127c61260d565b73ffffffffffffffffffffffffffffffffffffffff1661129a611a55565b73ffffffffffffffffffffffffffffffffffffffff16146112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e7906148ec565b60405180910390fd5b80600b8190555050565b6003600e60009054906101000a900460ff1660ff161461134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690614a4c565b60405180910390fd5b600b548160ff1661135e610d7b565b6113689190614bfc565b11156113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a09061484c565b60405180910390fd5b600e60019054906101000a900460ff1660ff1681600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114149190614c52565b60ff161115611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f9061488c565b60405180910390fd5b8060ff166009546114699190614cba565b3410156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a29061482c565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166115069190614c52565b92506101000a81548160ff021916908360ff16021790555061152b338260ff16612dc9565b50565b600061153861260d565b73ffffffffffffffffffffffffffffffffffffffff16611556611a55565b73ffffffffffffffffffffffffffffffffffffffff16146115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a3906148ec565b60405180910390fd5b47905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a906148ac565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b600e60019054906101000a900460ff1681565b6060600d80546116bd90614e63565b80601f01602080910402602001604051908101604052809291908181526020018280546116e990614e63565b80156117365780601f1061170b57610100808354040283529160200191611736565b820191906000526020600020905b81548152906001019060200180831161171957829003601f168201915b5050505050905090565b61174861260d565b73ffffffffffffffffffffffffffffffffffffffff16611766611a55565b73ffffffffffffffffffffffffffffffffffffffff16146117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b3906148ec565b60405180910390fd5b6117c66000612de7565b565b6002600e60009054906101000a900460ff1660ff161461181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490614a4c565b60405180910390fd5b600b548160ff1661182c610d7b565b6118369190614bfc565b1115611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e9061484c565b60405180910390fd5b600e60029054906101000a900460ff1660ff1681600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118e29190614c52565b60ff161115611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d9061488c565b60405180910390fd5b600c548160ff16611935610d7b565b61193f9190614bfc565b1061197f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611976906149ec565b60405180910390fd5b8060ff16600a546119909190614cba565b3410156119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c99061482c565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611a2d9190614c52565b92506101000a81548160ff021916908360ff160217905550611a52338260ff16612dc9565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611a8e90614e63565b80601f0160208091040260200160405190810160405280929190818152602001828054611aba90614e63565b8015611b075780601f10611adc57610100808354040283529160200191611b07565b820191906000526020600020905b815481529060010190602001808311611aea57829003601f168201915b5050505050905090565b611b1961260d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7e9061492c565b60405180910390fd5b8060066000611b9461260d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c4161260d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c86919061474f565b60405180910390a35050565b611c9a61260d565b73ffffffffffffffffffffffffffffffffffffffff16611cb8611a55565b73ffffffffffffffffffffffffffffffffffffffff1614611d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d05906148ec565b60405180910390fd5b80600e60026101000a81548160ff021916908360ff16021790555050565b611d3461260d565b73ffffffffffffffffffffffffffffffffffffffff16611d52611a55565b73ffffffffffffffffffffffffffffffffffffffff1614611da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9f906148ec565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60009054906101000a900460ff1681565b611e0a8484846126c7565b611e1684848484612ead565b611e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4c906149ac565b60405180910390fd5b50505050565b611e6361260d565b73ffffffffffffffffffffffffffffffffffffffff16611e81611a55565b73ffffffffffffffffffffffffffffffffffffffff1614611ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ece906148ec565b60405180910390fd5b80600e60006101000a81548160ff021916908360ff16021790555050565b6060611f0082612600565b611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f369061490c565b60405180910390fd5b6000600d8054611f4e90614e63565b905011611f6a5760405180602001604052806000815250611f96565b600d611f7583613044565b604051602001611f869291906146a4565b6040516020818303038152906040525b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611fcb61260d565b73ffffffffffffffffffffffffffffffffffffffff16611fe9611a55565b73ffffffffffffffffffffffffffffffffffffffff161461203f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612036906148ec565b60405180910390fd5b80600c8190555050565b61205161260d565b73ffffffffffffffffffffffffffffffffffffffff1661206f611a55565b73ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc906148ec565b60405180910390fd5b80600e60016101000a81548160ff021916908360ff16021790555050565b600f6020528060005260406000206000915054906101000a900460ff1681565b61210b61260d565b73ffffffffffffffffffffffffffffffffffffffff16612129611a55565b73ffffffffffffffffffffffffffffffffffffffff161461217f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612176906148ec565b60405180910390fd5b60005b838390508110156121f7576121e48484838181106121c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906121de9190613959565b83612dc9565b80806121ef90614e95565b915050612182565b50505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61229961260d565b73ffffffffffffffffffffffffffffffffffffffff166122b7611a55565b73ffffffffffffffffffffffffffffffffffffffff161461230d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612304906148ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561237d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612374906147ac565b60405180910390fd5b61238681612de7565b50565b61239161260d565b73ffffffffffffffffffffffffffffffffffffffff166123af611a55565b73ffffffffffffffffffffffffffffffffffffffff1614612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fc906148ec565b60405180910390fd5b8060098190555050565b6000600e60009054906101000a900460ff1660ff1614612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245b90614a4c565b60405180910390fd5b600e60029054906101000a900460ff1660ff1681600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166124cf9190614c52565b60ff161115612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250a9061488c565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661256e9190614c52565b92506101000a81548160ff021916908360ff160217905550612593338260ff16612dc9565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006126d282612c6e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166126f961260d565b73ffffffffffffffffffffffffffffffffffffffff161480612755575061271e61260d565b73ffffffffffffffffffffffffffffffffffffffff1661273d84610bdd565b73ffffffffffffffffffffffffffffffffffffffff16145b806127715750612770826000015161276b61260d565b6121fd565b5b9050806127b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127aa9061494c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281c906148cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288c9061480c565b60405180910390fd5b6128a285858560016131f1565b6128b26000848460000151612615565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612ab89190614bfc565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612bfe57612b2e81612600565b15612bfd576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c6686868660016131f7565b505050505050565b612c76613755565b612c7f82612600565b612cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb5906147cc565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612db0578092505050612dc4565b508080612dbc90614e39565b915050612cc4565b919050565b612de38282604051806020016040528060008152506131fd565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ece8473ffffffffffffffffffffffffffffffffffffffff166136bc565b15613037578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ef761260d565b8786866040518563ffffffff1660e01b8152600401612f199493929190614703565b602060405180830381600087803b158015612f3357600080fd5b505af1925050508015612f6457506040513d601f19601f82011682018060405250810190612f619190613baa565b60015b612fe7573d8060008114612f94576040519150601f19603f3d011682016040523d82523d6000602084013e612f99565b606091505b50600081511415612fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd6906149ac565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061303c565b600190505b949350505050565b6060600082141561308c576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131ec565b600082905060005b600082146130be5780806130a790614e95565b915050600a826130b79190614c89565b9150613094565b60008167ffffffffffffffff811115613100577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131325781602001600182028036833780820191505090505b5090505b600085146131e55760018261314b9190614d14565b9150600a8561315a9190614ede565b60306131669190614bfc565b60f81b8183815181106131a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131de9190614c89565b9450613136565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326a90614a0c565b60405180910390fd5b61327c81612600565b156132bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b3906149cc565b60405180910390fd5b600083116132ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f69061498c565b60405180910390fd5b61330c60008583866131f1565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516134099190614bb6565b6fffffffffffffffffffffffffffffffff1681526020018583602001516134309190614bb6565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561369f57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461363f6000888488612ead565b61367e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613675906149ac565b60405180910390fd5b818061368990614e95565b925050808061369790614e95565b9150506135ce565b50806000819055506136b460008785886131f7565b505050505050565b600080823b905060008111915050919050565b8280546136db90614e63565b90600052602060002090601f0160209004810192826136fd5760008555613744565b82601f1061371657805160ff1916838001178555613744565b82800160010185558215613744579182015b82811115613743578251825591602001919060010190613728565b5b509050613751919061378f565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156137a8576000816000905550600101613790565b5090565b60006137bf6137ba84614af3565b614ac2565b9050828152602081018484840111156137d757600080fd5b6137e2848285614df7565b509392505050565b60006137fd6137f884614b23565b614ac2565b90508281526020810184848401111561381557600080fd5b613820848285614df7565b509392505050565b60008135905061383781614fdc565b92915050565b60008135905061384c81614ff3565b92915050565b60008083601f84011261386457600080fd5b8235905067ffffffffffffffff81111561387d57600080fd5b60208301915083602082028301111561389557600080fd5b9250929050565b6000813590506138ab8161500a565b92915050565b6000813590506138c081615021565b92915050565b6000815190506138d581615021565b92915050565b600082601f8301126138ec57600080fd5b81356138fc8482602086016137ac565b91505092915050565b600082601f83011261391657600080fd5b81356139268482602086016137ea565b91505092915050565b60008135905061393e81615038565b92915050565b6000813590506139538161504f565b92915050565b60006020828403121561396b57600080fd5b600061397984828501613828565b91505092915050565b60006020828403121561399457600080fd5b60006139a28482850161383d565b91505092915050565b600080604083850312156139be57600080fd5b60006139cc85828601613828565b92505060206139dd85828601613828565b9150509250929050565b6000806000606084860312156139fc57600080fd5b6000613a0a86828701613828565b9350506020613a1b86828701613828565b9250506040613a2c8682870161392f565b9150509250925092565b60008060008060808587031215613a4c57600080fd5b6000613a5a87828801613828565b9450506020613a6b87828801613828565b9350506040613a7c8782880161392f565b925050606085013567ffffffffffffffff811115613a9957600080fd5b613aa5878288016138db565b91505092959194509250565b60008060408385031215613ac457600080fd5b6000613ad285828601613828565b9250506020613ae38582860161389c565b9150509250929050565b60008060408385031215613b0057600080fd5b6000613b0e85828601613828565b9250506020613b1f8582860161392f565b9150509250929050565b600080600060408486031215613b3e57600080fd5b600084013567ffffffffffffffff811115613b5857600080fd5b613b6486828701613852565b93509350506020613b778682870161392f565b9150509250925092565b600060208284031215613b9357600080fd5b6000613ba1848285016138b1565b91505092915050565b600060208284031215613bbc57600080fd5b6000613bca848285016138c6565b91505092915050565b600060208284031215613be557600080fd5b600082013567ffffffffffffffff811115613bff57600080fd5b613c0b84828501613905565b91505092915050565b600060208284031215613c2657600080fd5b6000613c348482850161392f565b91505092915050565b600060208284031215613c4f57600080fd5b6000613c5d84828501613944565b91505092915050565b613c6f81614d48565b82525050565b613c7e81614d6c565b82525050565b6000613c8f82614b68565b613c998185614b7e565b9350613ca9818560208601614e06565b613cb281614fcb565b840191505092915050565b6000613cc882614b73565b613cd28185614b9a565b9350613ce2818560208601614e06565b613ceb81614fcb565b840191505092915050565b6000613d0182614b73565b613d0b8185614bab565b9350613d1b818560208601614e06565b80840191505092915050565b60008154613d3481614e63565b613d3e8186614bab565b94506001821660008114613d595760018114613d6a57613d9d565b60ff19831686528186019350613d9d565b613d7385614b53565b60005b83811015613d9557815481890152600182019150602081019050613d76565b838801955050505b50505092915050565b6000613db3602283614b9a565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e19602683614b9a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e7f602a83614b9a565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ee5602383614b9a565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f4b602583614b9a565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fb1601283614b9a565b91507f496e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b6000613ff1602983614b9a565b91507f596f752063616e2774206d696e74206d6f7265207468656e2074686520746f7460008301527f616c20737570706c7900000000000000000000000000000000000000000000006020830152604082019050919050565b6000614057603983614b9a565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b60006140bd601183614b9a565b91507f427579206c696d697420726561636865640000000000000000000000000000006000830152602082019050919050565b60006140fd602b83614b9a565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000614163602683614b9a565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141c9600583614bab565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000614209602083614b9a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614249602f83614b9a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006142af601a83614b9a565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b60006142ef603283614b9a565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b6000614355602283614b9a565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143bb600083614b8f565b9150600082019050919050565b60006143d5602383614b9a565b91507f455243373231413a207175616e74697479206d7573742062652067726561746560008301527f72203000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061443b603383614b9a565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b60006144a1601d83614b9a565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b60006144e1602083614b9a565b91507f416c6c2066726565206d696e74732068617665206265656e20636c61696d65646000830152602082019050919050565b6000614521602183614b9a565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614587602e83614b9a565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b60006145ed601983614b9a565b91507f546869732073616c6520686173206e6f742073746172746564000000000000006000830152602082019050919050565b600061462d602d83614b9a565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b61468f81614de0565b82525050565b61469e81614dea565b82525050565b60006146b08285613d27565b91506146bc8284613cf6565b91506146c7826141bc565b91508190509392505050565b60006146de826143ae565b9150819050919050565b60006020820190506146fd6000830184613c66565b92915050565b60006080820190506147186000830187613c66565b6147256020830186613c66565b6147326040830185614686565b81810360608301526147448184613c84565b905095945050505050565b60006020820190506147646000830184613c75565b92915050565b600060208201905081810360008301526147848184613cbd565b905092915050565b600060208201905081810360008301526147a581613da6565b9050919050565b600060208201905081810360008301526147c581613e0c565b9050919050565b600060208201905081810360008301526147e581613e72565b9050919050565b6000602082019050818103600083015261480581613ed8565b9050919050565b6000602082019050818103600083015261482581613f3e565b9050919050565b6000602082019050818103600083015261484581613fa4565b9050919050565b6000602082019050818103600083015261486581613fe4565b9050919050565b600060208201905081810360008301526148858161404a565b9050919050565b600060208201905081810360008301526148a5816140b0565b9050919050565b600060208201905081810360008301526148c5816140f0565b9050919050565b600060208201905081810360008301526148e581614156565b9050919050565b60006020820190508181036000830152614905816141fc565b9050919050565b600060208201905081810360008301526149258161423c565b9050919050565b60006020820190508181036000830152614945816142a2565b9050919050565b60006020820190508181036000830152614965816142e2565b9050919050565b6000602082019050818103600083015261498581614348565b9050919050565b600060208201905081810360008301526149a5816143c8565b9050919050565b600060208201905081810360008301526149c58161442e565b9050919050565b600060208201905081810360008301526149e581614494565b9050919050565b60006020820190508181036000830152614a05816144d4565b9050919050565b60006020820190508181036000830152614a2581614514565b9050919050565b60006020820190508181036000830152614a458161457a565b9050919050565b60006020820190508181036000830152614a65816145e0565b9050919050565b60006020820190508181036000830152614a8581614620565b9050919050565b6000602082019050614aa16000830184614686565b92915050565b6000602082019050614abc6000830184614695565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ae957614ae8614f9c565b5b8060405250919050565b600067ffffffffffffffff821115614b0e57614b0d614f9c565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614b3e57614b3d614f9c565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614bc182614da4565b9150614bcc83614da4565b9250826fffffffffffffffffffffffffffffffff03821115614bf157614bf0614f0f565b5b828201905092915050565b6000614c0782614de0565b9150614c1283614de0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c4757614c46614f0f565b5b828201905092915050565b6000614c5d82614dea565b9150614c6883614dea565b92508260ff03821115614c7e57614c7d614f0f565b5b828201905092915050565b6000614c9482614de0565b9150614c9f83614de0565b925082614caf57614cae614f3e565b5b828204905092915050565b6000614cc582614de0565b9150614cd083614de0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d0957614d08614f0f565b5b828202905092915050565b6000614d1f82614de0565b9150614d2a83614de0565b925082821015614d3d57614d3c614f0f565b5b828203905092915050565b6000614d5382614dc0565b9050919050565b6000614d6582614dc0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614e24578082015181840152602081019050614e09565b83811115614e33576000848401525b50505050565b6000614e4482614de0565b91506000821415614e5857614e57614f0f565b5b600182039050919050565b60006002820490506001821680614e7b57607f821691505b60208210811415614e8f57614e8e614f6d565b5b50919050565b6000614ea082614de0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ed357614ed2614f0f565b5b600182019050919050565b6000614ee982614de0565b9150614ef483614de0565b925082614f0457614f03614f3e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614fe581614d48565b8114614ff057600080fd5b50565b614ffc81614d5a565b811461500757600080fd5b50565b61501381614d6c565b811461501e57600080fd5b50565b61502a81614d78565b811461503557600080fd5b50565b61504181614de0565b811461504c57600080fd5b50565b61505881614dea565b811461506357600080fd5b5056fea26469706673582212201875a87f6a6afb869e7d39360e7de9d64af8d9f068b1aa0e94f34cbd692701e164736f6c63430008000033

Deployed Bytecode Sourcemap

38876:3849:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39029:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24331:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39106:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39073:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25958:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27519:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27040:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22768:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28395:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23436:823;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41750:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39298:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42567:153;;;:::i;:::-;;28628:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22949:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41549:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25767:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38986:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42133:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39974:453;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42331:114;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24767:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39269:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41358:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38032:103;;;;;;;;;;;;;:::i;:::-;;40433:579;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37381:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26127:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27805:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42029:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42451:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39242:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28876:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41857:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39480:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38953:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42228:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41939:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39335:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39774:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28164:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38290:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41649:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41018:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39029:39;;;;:::o;24331:372::-;24433:4;24485:25;24470:40;;;:11;:40;;;;:105;;;;24542:33;24527:48;;;:11;:48;;;;24470:105;:172;;;;24607:35;24592:50;;;:11;:50;;;;24470:172;:225;;;;24659:36;24683:11;24659:23;:36::i;:::-;24470:225;24450:245;;24331:372;;;:::o;39106:32::-;;;;:::o;39073:28::-;;;;:::o;25958:100::-;26012:13;26045:5;26038:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25958:100;:::o;27519:214::-;27587:7;27615:16;27623:7;27615;:16::i;:::-;27607:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27701:15;:24;27717:7;27701:24;;;;;;;;;;;;;;;;;;;;;27694:31;;27519:214;;;:::o;27040:413::-;27113:13;27129:24;27145:7;27129:15;:24::i;:::-;27113:40;;27178:5;27172:11;;:2;:11;;;;27164:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27273:5;27257:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27282:37;27299:5;27306:12;:10;:12::i;:::-;27282:16;:37::i;:::-;27257:62;27235:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;27417:28;27426:2;27430:7;27439:5;27417:8;:28::i;:::-;27040:413;;;:::o;22768:104::-;22821:7;22863:1;22848:12;;:16;;;;:::i;:::-;22841:23;;22768:104;:::o;28395:162::-;28521:28;28531:4;28537:2;28541:7;28521:9;:28::i;:::-;28395:162;;;:::o;23436:823::-;23525:7;23561:16;23571:5;23561:9;:16::i;:::-;23553:5;:24;23545:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23627:22;23652:13;:11;:13::i;:::-;23627:38;;23676:19;23710:25;23764:9;23759:426;23783:14;23779:1;:18;23759:426;;;23819:31;23853:11;:14;23865:1;23853:14;;;;;;;;;;;23819:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23912:1;23886:28;;:9;:14;;;:28;;;23882:103;;23955:9;:14;;;23935:34;;23882:103;24024:5;24003:26;;:17;:26;;;23999:175;;;24069:5;24054:11;:20;24050:77;;;24106:1;24099:8;;;;;;;;;24050:77;24145:13;;;;;:::i;:::-;;;;23999:175;23759:426;23799:3;;;;;:::i;:::-;;;;23759:426;;;;24195:56;;;;;;;;;;:::i;:::-;;;;;;;;23436:823;;;;;:::o;41750:101::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41836:9:::1;41821:12;:24;;;;41750:101:::0;:::o;39298:30::-;;;;;;;;;;;;;:::o;42567:153::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42622:7:::1;42643:13;;;;;;;;;;;42635:27;;42670:21;42635:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42621:75;;;42711:2;42703:11;;;::::0;::::1;;37672:1;42567:153::o:0;28628:177::-;28758:39;28775:4;28781:2;28785:7;28758:39;;;;;;;;;;;;:16;:39::i;:::-;28628:177;;;:::o;22949:187::-;23016:7;23052:13;:11;:13::i;:::-;23044:5;:21;23036:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23123:5;23116:12;;22949:187;;;:::o;41549:94::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41629:8:::1;41619:7;:18;;;;;;;;;;;;:::i;:::-;;41549:94:::0;:::o;25767:124::-;25831:7;25858:20;25870:7;25858:11;:20::i;:::-;:25;;;25851:32;;25767:124;;;:::o;38986:38::-;;;;:::o;42133:89::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42209:7:::1;42200:6;:16;;;;42133:89:::0;:::o;39974:453::-;40048:1;40039:5;;;;;;;;;;;:10;;;40031:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;40125:6;;40110:11;40094:27;;:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:37;;40086:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;40232:6;;;;;;;;;;;40192:46;;40217:11;40192:10;:22;40203:10;40192:22;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:46;;;;40184:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;40300:11;40288:23;;:9;;:23;;;;:::i;:::-;40275:9;:36;;40267:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;40369:11;40343:10;:22;40354:10;40343:22;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40387:34;40397:10;40409:11;40387:34;;:9;:34::i;:::-;39974:453;:::o;42331:114::-;42395:7;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42418:21:::1;42411:28;;42331:114:::0;:::o;24767:221::-;24831:7;24876:1;24859:19;;:5;:19;;;;24851:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;24952:12;:19;24965:5;24952:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24944:36;;24937:43;;24767:221;;;:::o;39269:24::-;;;;;;;;;;;;;:::o;41358:85::-;41401:13;41430:7;41423:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41358:85;:::o;38032:103::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38097:30:::1;38124:1;38097:18;:30::i;:::-;38032:103::o:0;40433:579::-;40513:1;40504:5;;;;;;;;;;;:10;;;40496:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;40590:6;;40575:11;40559:27;;:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:37;;40551:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;40697:13;;;;;;;;;;;40657:53;;40682:11;40657:10;:22;40668:10;40657:22;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:53;;;;40649:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;40785:10;;40771:11;40755:27;;:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;40747:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40875:11;40860:26;;:12;;:26;;;;:::i;:::-;40847:9;:39;;40839:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;40948:11;40922:10;:22;40933:10;40922:22;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40966:34;40976:10;40988:11;40966:34;;:9;:34::i;:::-;40433:579;:::o;37381:87::-;37427:7;37454:6;;;;;;;;;;;37447:13;;37381:87;:::o;26127:104::-;26183:13;26216:7;26209:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26127:104;:::o;27805:288::-;27912:12;:10;:12::i;:::-;27900:24;;:8;:24;;;;27892:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28013:8;27968:18;:32;27987:12;:10;:12::i;:::-;27968:32;;;;;;;;;;;;;;;:42;28001:8;27968:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28066:8;28037:48;;28052:12;:10;:12::i;:::-;28037:48;;;28076:8;28037:48;;;;;;:::i;:::-;;;;;;;;27805:288;;:::o;42029:98::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42114:7:::1;42098:13;;:23;;;;;;;;;;;;;;;;;;42029:98:::0;:::o;42451:110::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42545:10:::1;42529:13;;:26;;;;;;;;;;;;;;;;;;42451:110:::0;:::o;39242:22::-;;;;;;;;;;;;;:::o;28876:355::-;29035:28;29045:4;29051:2;29055:7;29035:9;:28::i;:::-;29096:48;29119:4;29125:2;29129:7;29138:5;29096:22;:48::i;:::-;29074:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;28876:355;;;;:::o;41857:76::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41921:6:::1;41913:5;;:14;;;;;;;;;;;;;;;;;;41857:76:::0;:::o;39480:288::-;39553:13;39583:16;39591:7;39583;:16::i;:::-;39575:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39691:1;39673:7;39667:21;;;;;:::i;:::-;;;:25;:95;;;;;;;;;;;;;;;;;39719:7;39728:18;:7;:16;:18::i;:::-;39702:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39667:95;39660:102;;39480:288;;;:::o;38953:28::-;;;;;;;;;;;;;:::o;42228:97::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42312:7:::1;42299:10;:20;;;;42228:97:::0;:::o;41939:84::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42010:7:::1;42001:6;;:16;;;;;;;;;;;;;;;;;;41939:84:::0;:::o;39335:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;39774:194::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39876:6:::1;39871:92;39888:10;;:17;;39886:1;:19;39871:92;;;39921:34;39931:10;;39942:1;39931:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39946:8;39921:9;:34::i;:::-;39907:3;;;;;:::i;:::-;;;;39871:92;;;;39774:194:::0;;;:::o;28164:164::-;28261:4;28285:18;:25;28304:5;28285:25;;;;;;;;;;;;;;;:35;28311:8;28285:35;;;;;;;;;;;;;;;;;;;;;;;;;28278:42;;28164:164;;;;:::o;38290:201::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38399:1:::1;38379:22;;:8;:22;;;;38371:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38455:28;38474:8;38455:18;:28::i;:::-;38290:201:::0;:::o;41649:95::-;37612:12;:10;:12::i;:::-;37601:23;;:7;:5;:7::i;:::-;:23;;;37593:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41729:9:::1;41717;:21;;;;41649:95:::0;:::o;41018:334::-;41138:1;41129:5;;;;;;;;;;;:10;;;41121:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;41224:13;;;;;;;;;;;41184:53;;41209:11;41184:10;:22;41195:10;41184:22;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:53;;;;41176:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;41294:11;41268:10;:22;41279:10;41268:22;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41312:34;41322:10;41334:11;41312:34;;:9;:34::i;:::-;41018:334;:::o;13119:157::-;13204:4;13243:25;13228:40;;;:11;:40;;;;13221:47;;13119:157;;;:::o;29486:111::-;29543:4;29577:12;;29567:7;:22;29560:29;;29486:111;;;:::o;20710:98::-;20763:7;20790:10;20783:17;;20710:98;:::o;33530:196::-;33672:2;33645:15;:24;33661:7;33645:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33710:7;33706:2;33690:28;;33699:5;33690:28;;;;;;;;;;;;33530:196;;;:::o;31629:1783::-;31744:35;31782:20;31794:7;31782:11;:20::i;:::-;31744:58;;31815:22;31857:13;:18;;;31841:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;31916:12;:10;:12::i;:::-;31892:36;;:20;31904:7;31892:11;:20::i;:::-;:36;;;31841:87;:154;;;;31945:50;31962:13;:18;;;31982:12;:10;:12::i;:::-;31945:16;:50::i;:::-;31841:154;31815:181;;32017:17;32009:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;32132:4;32110:26;;:13;:18;;;:26;;;32102:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;32212:1;32198:16;;:2;:16;;;;32190:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32269:43;32291:4;32297:2;32301:7;32310:1;32269:21;:43::i;:::-;32377:49;32394:1;32398:7;32407:13;:18;;;32377:8;:49::i;:::-;32661:1;32631:12;:18;32644:4;32631:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32705:1;32677:12;:16;32690:2;32677:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32753:43;;;;;;;;32768:2;32753:43;;;;;;32779:15;32753:43;;;;;32730:11;:20;32742:7;32730:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33036:19;33068:1;33058:7;:11;;;;:::i;:::-;33036:33;;33125:1;33084:43;;:11;:24;33096:11;33084:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;33080:227;;;33148:20;33156:11;33148:7;:20::i;:::-;33144:152;;;33216:64;;;;;;;;33231:13;:18;;;33216:64;;;;;;33251:13;:28;;;33216:64;;;;;33189:11;:24;33201:11;33189:24;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33144:152;33080:227;33343:7;33339:2;33324:27;;33333:4;33324:27;;;;;;;;;;;;33362:42;33383:4;33389:2;33393:7;33402:1;33362:20;:42::i;:::-;31629:1783;;;;;;:::o;25233:472::-;25294:21;;:::i;:::-;25336:16;25344:7;25336;:16::i;:::-;25328:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25417:12;25432:7;25417:22;;25412:216;25466:31;25500:11;:17;25512:4;25500:17;;;;;;;;;;;25466:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25562:1;25536:28;;:9;:14;;;:28;;;25532:85;;25592:9;25585:16;;;;;;25532:85;25412:216;25443:6;;;;;:::i;:::-;;;;25412:216;;25233:472;;;;:::o;29605:104::-;29674:27;29684:2;29688:8;29674:27;;;;;;;;;;;;:9;:27::i;:::-;29605:104;;:::o;38651:191::-;38725:16;38744:6;;;;;;;;;;;38725:25;;38770:8;38761:6;;:17;;;;;;;;;;;;;;;;;;38825:8;38794:40;;38815:8;38794:40;;;;;;;;;;;;38651:191;;:::o;34291:804::-;34446:4;34467:15;:2;:13;;;:15::i;:::-;34463:625;;;34519:2;34503:36;;;34540:12;:10;:12::i;:::-;34554:4;34560:7;34569:5;34503:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34499:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34766:1;34749:6;:13;:18;34745:273;;;34792:61;;;;;;;;;;:::i;:::-;;;;;;;;34745:273;34968:6;34962:13;34953:6;34949:2;34945:15;34938:38;34499:534;34636:45;;;34626:55;;;:6;:55;;;;34619:62;;;;;34463:625;35072:4;35065:11;;34291:804;;;;;;;:::o;396:723::-;452:13;682:1;673:5;:10;669:53;;;700:10;;;;;;;;;;;;;;;;;;;;;669:53;732:12;747:5;732:20;;763:14;788:78;803:1;795:4;:9;788:78;;821:8;;;;;:::i;:::-;;;;852:2;844:10;;;;;:::i;:::-;;;788:78;;;876:19;908:6;898:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;876:39;;926:154;942:1;933:5;:10;926:154;;970:1;960:11;;;;;:::i;:::-;;;1037:2;1029:5;:10;;;;:::i;:::-;1016:2;:24;;;;:::i;:::-;1003:39;;986:6;993;986:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1066:2;1057:11;;;;;:::i;:::-;;;926:154;;;1104:6;1090:21;;;;;396:723;;;;:::o;35583:159::-;;;;;:::o;36154:158::-;;;;;:::o;29986:1389::-;30109:20;30132:12;;30109:35;;30177:1;30163:16;;:2;:16;;;;30155:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30362:21;30370:12;30362:7;:21::i;:::-;30361:22;30353:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;30447:1;30436:8;:12;30428:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;30501:61;30531:1;30535:2;30539:12;30553:8;30501:21;:61::i;:::-;30575:30;30608:12;:16;30621:2;30608:16;;;;;;;;;;;;;;;30575:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30654:135;;;;;;;;30710:8;30680:11;:19;;;:39;;;;:::i;:::-;30654:135;;;;;;30769:8;30734:11;:24;;;:44;;;;:::i;:::-;30654:135;;;;;30635:12;:16;30648:2;30635:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30828:43;;;;;;;;30843:2;30828:43;;;;;;30854:15;30828:43;;;;;30800:11;:25;30812:12;30800:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30884:20;30907:12;30884:35;;30937:9;30932:325;30956:8;30952:1;:12;30932:325;;;31016:12;31012:2;30991:38;;31008:1;30991:38;;;;;;;;;;;;31070:59;31101:1;31105:2;31109:12;31123:5;31070:22;:59::i;:::-;31044:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;31231:14;;;;;:::i;:::-;;;;30966:3;;;;;:::i;:::-;;;;30932:325;;;;31284:12;31269;:27;;;;31307:60;31336:1;31340:2;31344:12;31358:8;31307:20;:60::i;:::-;29986:1389;;;;;;:::o;2975:387::-;3035:4;3243:12;3310:7;3298:20;3290:28;;3353:1;3346:4;:8;3339:15;;;2975:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:155::-;;942:6;929:20;920:29;;958:41;993:5;958:41;:::i;:::-;910:95;;;;:::o;1028:367::-;;;1161:3;1154:4;1146:6;1142:17;1138:27;1128:2;;1179:1;1176;1169:12;1128:2;1215:6;1202:20;1192:30;;1245:18;1237:6;1234:30;1231:2;;;1277:1;1274;1267:12;1231:2;1314:4;1306:6;1302:17;1290:29;;1368:3;1360:4;1352:6;1348:17;1338:8;1334:32;1331:41;1328:2;;;1385:1;1382;1375:12;1328:2;1118:277;;;;;:::o;1401:133::-;;1482:6;1469:20;1460:29;;1498:30;1522:5;1498:30;:::i;:::-;1450:84;;;;:::o;1540:137::-;;1623:6;1610:20;1601:29;;1639:32;1665:5;1639:32;:::i;:::-;1591:86;;;;:::o;1683:141::-;;1770:6;1764:13;1755:22;;1786:32;1812:5;1786:32;:::i;:::-;1745:79;;;;:::o;1843:271::-;;1947:3;1940:4;1932:6;1928:17;1924:27;1914:2;;1965:1;1962;1955:12;1914:2;2005:6;1992:20;2030:78;2104:3;2096:6;2089:4;2081:6;2077:17;2030:78;:::i;:::-;2021:87;;1904:210;;;;;:::o;2134:273::-;;2239:3;2232:4;2224:6;2220:17;2216:27;2206:2;;2257:1;2254;2247:12;2206:2;2297:6;2284:20;2322:79;2397:3;2389:6;2382:4;2374:6;2370:17;2322:79;:::i;:::-;2313:88;;2196:211;;;;;:::o;2413:139::-;;2497:6;2484:20;2475:29;;2513:33;2540:5;2513:33;:::i;:::-;2465:87;;;;:::o;2558:135::-;;2640:6;2627:20;2618:29;;2656:31;2681:5;2656:31;:::i;:::-;2608:85;;;;:::o;2699:262::-;;2807:2;2795:9;2786:7;2782:23;2778:32;2775:2;;;2823:1;2820;2813:12;2775:2;2866:1;2891:53;2936:7;2927:6;2916:9;2912:22;2891:53;:::i;:::-;2881:63;;2837:117;2765:196;;;;:::o;2967:278::-;;3083:2;3071:9;3062:7;3058:23;3054:32;3051:2;;;3099:1;3096;3089:12;3051:2;3142:1;3167:61;3220:7;3211:6;3200:9;3196:22;3167:61;:::i;:::-;3157:71;;3113:125;3041:204;;;;:::o;3251:407::-;;;3376:2;3364:9;3355:7;3351:23;3347:32;3344:2;;;3392:1;3389;3382:12;3344:2;3435:1;3460:53;3505:7;3496:6;3485:9;3481:22;3460:53;:::i;:::-;3450:63;;3406:117;3562:2;3588:53;3633:7;3624:6;3613:9;3609:22;3588:53;:::i;:::-;3578:63;;3533:118;3334:324;;;;;:::o;3664:552::-;;;;3806:2;3794:9;3785:7;3781:23;3777:32;3774:2;;;3822:1;3819;3812:12;3774:2;3865:1;3890:53;3935:7;3926:6;3915:9;3911:22;3890:53;:::i;:::-;3880:63;;3836:117;3992:2;4018:53;4063:7;4054:6;4043:9;4039:22;4018:53;:::i;:::-;4008:63;;3963:118;4120:2;4146:53;4191:7;4182:6;4171:9;4167:22;4146:53;:::i;:::-;4136:63;;4091:118;3764:452;;;;;:::o;4222:809::-;;;;;4390:3;4378:9;4369:7;4365:23;4361:33;4358:2;;;4407:1;4404;4397:12;4358:2;4450:1;4475:53;4520:7;4511:6;4500:9;4496:22;4475:53;:::i;:::-;4465:63;;4421:117;4577:2;4603:53;4648:7;4639:6;4628:9;4624:22;4603:53;:::i;:::-;4593:63;;4548:118;4705:2;4731:53;4776:7;4767:6;4756:9;4752:22;4731:53;:::i;:::-;4721:63;;4676:118;4861:2;4850:9;4846:18;4833:32;4892:18;4884:6;4881:30;4878:2;;;4924:1;4921;4914:12;4878:2;4952:62;5006:7;4997:6;4986:9;4982:22;4952:62;:::i;:::-;4942:72;;4804:220;4348:683;;;;;;;:::o;5037:401::-;;;5159:2;5147:9;5138:7;5134:23;5130:32;5127:2;;;5175:1;5172;5165:12;5127:2;5218:1;5243:53;5288:7;5279:6;5268:9;5264:22;5243:53;:::i;:::-;5233:63;;5189:117;5345:2;5371:50;5413:7;5404:6;5393:9;5389:22;5371:50;:::i;:::-;5361:60;;5316:115;5117:321;;;;;:::o;5444:407::-;;;5569:2;5557:9;5548:7;5544:23;5540:32;5537:2;;;5585:1;5582;5575:12;5537:2;5628:1;5653:53;5698:7;5689:6;5678:9;5674:22;5653:53;:::i;:::-;5643:63;;5599:117;5755:2;5781:53;5826:7;5817:6;5806:9;5802:22;5781:53;:::i;:::-;5771:63;;5726:118;5527:324;;;;;:::o;5857:570::-;;;;6017:2;6005:9;5996:7;5992:23;5988:32;5985:2;;;6033:1;6030;6023:12;5985:2;6104:1;6093:9;6089:17;6076:31;6134:18;6126:6;6123:30;6120:2;;;6166:1;6163;6156:12;6120:2;6202:80;6274:7;6265:6;6254:9;6250:22;6202:80;:::i;:::-;6184:98;;;;6047:245;6331:2;6357:53;6402:7;6393:6;6382:9;6378:22;6357:53;:::i;:::-;6347:63;;6302:118;5975:452;;;;;:::o;6433:260::-;;6540:2;6528:9;6519:7;6515:23;6511:32;6508:2;;;6556:1;6553;6546:12;6508:2;6599:1;6624:52;6668:7;6659:6;6648:9;6644:22;6624:52;:::i;:::-;6614:62;;6570:116;6498:195;;;;:::o;6699:282::-;;6817:2;6805:9;6796:7;6792:23;6788:32;6785:2;;;6833:1;6830;6823:12;6785:2;6876:1;6901:63;6956:7;6947:6;6936:9;6932:22;6901:63;:::i;:::-;6891:73;;6847:127;6775:206;;;;:::o;6987:375::-;;7105:2;7093:9;7084:7;7080:23;7076:32;7073:2;;;7121:1;7118;7111:12;7073:2;7192:1;7181:9;7177:17;7164:31;7222:18;7214:6;7211:30;7208:2;;;7254:1;7251;7244:12;7208:2;7282:63;7337:7;7328:6;7317:9;7313:22;7282:63;:::i;:::-;7272:73;;7135:220;7063:299;;;;:::o;7368:262::-;;7476:2;7464:9;7455:7;7451:23;7447:32;7444:2;;;7492:1;7489;7482:12;7444:2;7535:1;7560:53;7605:7;7596:6;7585:9;7581:22;7560:53;:::i;:::-;7550:63;;7506:117;7434:196;;;;:::o;7636:258::-;;7742:2;7730:9;7721:7;7717:23;7713:32;7710:2;;;7758:1;7755;7748:12;7710:2;7801:1;7826:51;7869:7;7860:6;7849:9;7845:22;7826:51;:::i;:::-;7816:61;;7772:115;7700:194;;;;:::o;7900:118::-;7987:24;8005:5;7987:24;:::i;:::-;7982:3;7975:37;7965:53;;:::o;8024:109::-;8105:21;8120:5;8105:21;:::i;:::-;8100:3;8093:34;8083:50;;:::o;8139:360::-;;8253:38;8285:5;8253:38;:::i;:::-;8307:70;8370:6;8365:3;8307:70;:::i;:::-;8300:77;;8386:52;8431:6;8426:3;8419:4;8412:5;8408:16;8386:52;:::i;:::-;8463:29;8485:6;8463:29;:::i;:::-;8458:3;8454:39;8447:46;;8229:270;;;;;:::o;8505:364::-;;8621:39;8654:5;8621:39;:::i;:::-;8676:71;8740:6;8735:3;8676:71;:::i;:::-;8669:78;;8756:52;8801:6;8796:3;8789:4;8782:5;8778:16;8756:52;:::i;:::-;8833:29;8855:6;8833:29;:::i;:::-;8828:3;8824:39;8817:46;;8597:272;;;;;:::o;8875:377::-;;9009:39;9042:5;9009:39;:::i;:::-;9064:89;9146:6;9141:3;9064:89;:::i;:::-;9057:96;;9162:52;9207:6;9202:3;9195:4;9188:5;9184:16;9162:52;:::i;:::-;9239:6;9234:3;9230:16;9223:23;;8985:267;;;;;:::o;9282:845::-;;9422:5;9416:12;9451:36;9477:9;9451:36;:::i;:::-;9503:89;9585:6;9580:3;9503:89;:::i;:::-;9496:96;;9623:1;9612:9;9608:17;9639:1;9634:137;;;;9785:1;9780:341;;;;9601:520;;9634:137;9718:4;9714:9;9703;9699:25;9694:3;9687:38;9754:6;9749:3;9745:16;9738:23;;9634:137;;9780:341;9847:38;9879:5;9847:38;:::i;:::-;9907:1;9921:154;9935:6;9932:1;9929:13;9921:154;;;10009:7;10003:14;9999:1;9994:3;9990:11;9983:35;10059:1;10050:7;10046:15;10035:26;;9957:4;9954:1;9950:12;9945:17;;9921:154;;;10104:6;10099:3;10095:16;10088:23;;9787:334;;9601:520;;9389:738;;;;;;:::o;10133:366::-;;10296:67;10360:2;10355:3;10296:67;:::i;:::-;10289:74;;10393:34;10389:1;10384:3;10380:11;10373:55;10459:4;10454:2;10449:3;10445:12;10438:26;10490:2;10485:3;10481:12;10474:19;;10279:220;;;:::o;10505:370::-;;10668:67;10732:2;10727:3;10668:67;:::i;:::-;10661:74;;10765:34;10761:1;10756:3;10752:11;10745:55;10831:8;10826:2;10821:3;10817:12;10810:30;10866:2;10861:3;10857:12;10850:19;;10651:224;;;:::o;10881:374::-;;11044:67;11108:2;11103:3;11044:67;:::i;:::-;11037:74;;11141:34;11137:1;11132:3;11128:11;11121:55;11207:12;11202:2;11197:3;11193:12;11186:34;11246:2;11241:3;11237:12;11230:19;;11027:228;;;:::o;11261:367::-;;11424:67;11488:2;11483:3;11424:67;:::i;:::-;11417:74;;11521:34;11517:1;11512:3;11508:11;11501:55;11587:5;11582:2;11577:3;11573:12;11566:27;11619:2;11614:3;11610:12;11603:19;;11407:221;;;:::o;11634:369::-;;11797:67;11861:2;11856:3;11797:67;:::i;:::-;11790:74;;11894:34;11890:1;11885:3;11881:11;11874:55;11960:7;11955:2;11950:3;11946:12;11939:29;11994:2;11989:3;11985:12;11978:19;;11780:223;;;:::o;12009:316::-;;12172:67;12236:2;12231:3;12172:67;:::i;:::-;12165:74;;12269:20;12265:1;12260:3;12256:11;12249:41;12316:2;12311:3;12307:12;12300:19;;12155:170;;;:::o;12331:373::-;;12494:67;12558:2;12553:3;12494:67;:::i;:::-;12487:74;;12591:34;12587:1;12582:3;12578:11;12571:55;12657:11;12652:2;12647:3;12643:12;12636:33;12695:2;12690:3;12686:12;12679:19;;12477:227;;;:::o;12710:389::-;;12873:67;12937:2;12932:3;12873:67;:::i;:::-;12866:74;;12970:34;12966:1;12961:3;12957:11;12950:55;13036:27;13031:2;13026:3;13022:12;13015:49;13090:2;13085:3;13081:12;13074:19;;12856:243;;;:::o;13105:315::-;;13268:67;13332:2;13327:3;13268:67;:::i;:::-;13261:74;;13365:19;13361:1;13356:3;13352:11;13345:40;13411:2;13406:3;13402:12;13395:19;;13251:169;;;:::o;13426:375::-;;13589:67;13653:2;13648:3;13589:67;:::i;:::-;13582:74;;13686:34;13682:1;13677:3;13673:11;13666:55;13752:13;13747:2;13742:3;13738:12;13731:35;13792:2;13787:3;13783:12;13776:19;;13572:229;;;:::o;13807:370::-;;13970:67;14034:2;14029:3;13970:67;:::i;:::-;13963:74;;14067:34;14063:1;14058:3;14054:11;14047:55;14133:8;14128:2;14123:3;14119:12;14112:30;14168:2;14163:3;14159:12;14152:19;;13953:224;;;:::o;14183:337::-;;14364:84;14446:1;14441:3;14364:84;:::i;:::-;14357:91;;14478:7;14474:1;14469:3;14465:11;14458:28;14512:1;14507:3;14503:11;14496:18;;14347:173;;;:::o;14526:330::-;;14689:67;14753:2;14748:3;14689:67;:::i;:::-;14682:74;;14786:34;14782:1;14777:3;14773:11;14766:55;14847:2;14842:3;14838:12;14831:19;;14672:184;;;:::o;14862:379::-;;15025:67;15089:2;15084:3;15025:67;:::i;:::-;15018:74;;15122:34;15118:1;15113:3;15109:11;15102:55;15188:17;15183:2;15178:3;15174:12;15167:39;15232:2;15227:3;15223:12;15216:19;;15008:233;;;:::o;15247:324::-;;15410:67;15474:2;15469:3;15410:67;:::i;:::-;15403:74;;15507:28;15503:1;15498:3;15494:11;15487:49;15562:2;15557:3;15553:12;15546:19;;15393:178;;;:::o;15577:382::-;;15740:67;15804:2;15799:3;15740:67;:::i;:::-;15733:74;;15837:34;15833:1;15828:3;15824:11;15817:55;15903:20;15898:2;15893:3;15889:12;15882:42;15950:2;15945:3;15941:12;15934:19;;15723:236;;;:::o;15965:366::-;;16128:67;16192:2;16187:3;16128:67;:::i;:::-;16121:74;;16225:34;16221:1;16216:3;16212:11;16205:55;16291:4;16286:2;16281:3;16277:12;16270:26;16322:2;16317:3;16313:12;16306:19;;16111:220;;;:::o;16337:297::-;;16517:83;16598:1;16593:3;16517:83;:::i;:::-;16510:90;;16626:1;16621:3;16617:11;16610:18;;16500:134;;;:::o;16640:367::-;;16803:67;16867:2;16862:3;16803:67;:::i;:::-;16796:74;;16900:34;16896:1;16891:3;16887:11;16880:55;16966:5;16961:2;16956:3;16952:12;16945:27;16998:2;16993:3;16989:12;16982:19;;16786:221;;;:::o;17013:383::-;;17176:67;17240:2;17235:3;17176:67;:::i;:::-;17169:74;;17273:34;17269:1;17264:3;17260:11;17253:55;17339:21;17334:2;17329:3;17325:12;17318:43;17387:2;17382:3;17378:12;17371:19;;17159:237;;;:::o;17402:327::-;;17565:67;17629:2;17624:3;17565:67;:::i;:::-;17558:74;;17662:31;17658:1;17653:3;17649:11;17642:52;17720:2;17715:3;17711:12;17704:19;;17548:181;;;:::o;17735:330::-;;17898:67;17962:2;17957:3;17898:67;:::i;:::-;17891:74;;17995:34;17991:1;17986:3;17982:11;17975:55;18056:2;18051:3;18047:12;18040:19;;17881:184;;;:::o;18071:365::-;;18234:67;18298:2;18293:3;18234:67;:::i;:::-;18227:74;;18331:34;18327:1;18322:3;18318:11;18311:55;18397:3;18392:2;18387:3;18383:12;18376:25;18427:2;18422:3;18418:12;18411:19;;18217:219;;;:::o;18442:378::-;;18605:67;18669:2;18664:3;18605:67;:::i;:::-;18598:74;;18702:34;18698:1;18693:3;18689:11;18682:55;18768:16;18763:2;18758:3;18754:12;18747:38;18811:2;18806:3;18802:12;18795:19;;18588:232;;;:::o;19211:323::-;;19374:67;19438:2;19433:3;19374:67;:::i;:::-;19367:74;;19471:27;19467:1;19462:3;19458:11;19451:48;19525:2;19520:3;19516:12;19509:19;;19357:177;;;:::o;19540:377::-;;19703:67;19767:2;19762:3;19703:67;:::i;:::-;19696:74;;19800:34;19796:1;19791:3;19787:11;19780:55;19866:15;19861:2;19856:3;19852:12;19845:37;19908:2;19903:3;19899:12;19892:19;;19686:231;;;:::o;19923:118::-;20010:24;20028:5;20010:24;:::i;:::-;20005:3;19998:37;19988:53;;:::o;20047:112::-;20130:22;20146:5;20130:22;:::i;:::-;20125:3;20118:35;20108:51;;:::o;20165:695::-;;20465:92;20553:3;20544:6;20465:92;:::i;:::-;20458:99;;20574:95;20665:3;20656:6;20574:95;:::i;:::-;20567:102;;20686:148;20830:3;20686:148;:::i;:::-;20679:155;;20851:3;20844:10;;20447:413;;;;;:::o;20866:379::-;;21072:147;21215:3;21072:147;:::i;:::-;21065:154;;21236:3;21229:10;;21054:191;;;:::o;21251:222::-;;21382:2;21371:9;21367:18;21359:26;;21395:71;21463:1;21452:9;21448:17;21439:6;21395:71;:::i;:::-;21349:124;;;;:::o;21479:640::-;;21712:3;21701:9;21697:19;21689:27;;21726:71;21794:1;21783:9;21779:17;21770:6;21726:71;:::i;:::-;21807:72;21875:2;21864:9;21860:18;21851:6;21807:72;:::i;:::-;21889;21957:2;21946:9;21942:18;21933:6;21889:72;:::i;:::-;22008:9;22002:4;21998:20;21993:2;21982:9;21978:18;21971:48;22036:76;22107:4;22098:6;22036:76;:::i;:::-;22028:84;;21679:440;;;;;;;:::o;22125:210::-;;22250:2;22239:9;22235:18;22227:26;;22263:65;22325:1;22314:9;22310:17;22301:6;22263:65;:::i;:::-;22217:118;;;;:::o;22341:313::-;;22492:2;22481:9;22477:18;22469:26;;22541:9;22535:4;22531:20;22527:1;22516:9;22512:17;22505:47;22569:78;22642:4;22633:6;22569:78;:::i;:::-;22561:86;;22459:195;;;;:::o;22660:419::-;;22864:2;22853:9;22849:18;22841:26;;22913:9;22907:4;22903:20;22899:1;22888:9;22884:17;22877:47;22941:131;23067:4;22941:131;:::i;:::-;22933:139;;22831:248;;;:::o;23085:419::-;;23289:2;23278:9;23274:18;23266:26;;23338:9;23332:4;23328:20;23324:1;23313:9;23309:17;23302:47;23366:131;23492:4;23366:131;:::i;:::-;23358:139;;23256:248;;;:::o;23510:419::-;;23714:2;23703:9;23699:18;23691:26;;23763:9;23757:4;23753:20;23749:1;23738:9;23734:17;23727:47;23791:131;23917:4;23791:131;:::i;:::-;23783:139;;23681:248;;;:::o;23935:419::-;;24139:2;24128:9;24124:18;24116:26;;24188:9;24182:4;24178:20;24174:1;24163:9;24159:17;24152:47;24216:131;24342:4;24216:131;:::i;:::-;24208:139;;24106:248;;;:::o;24360:419::-;;24564:2;24553:9;24549:18;24541:26;;24613:9;24607:4;24603:20;24599:1;24588:9;24584:17;24577:47;24641:131;24767:4;24641:131;:::i;:::-;24633:139;;24531:248;;;:::o;24785:419::-;;24989:2;24978:9;24974:18;24966:26;;25038:9;25032:4;25028:20;25024:1;25013:9;25009:17;25002:47;25066:131;25192:4;25066:131;:::i;:::-;25058:139;;24956:248;;;:::o;25210:419::-;;25414:2;25403:9;25399:18;25391:26;;25463:9;25457:4;25453:20;25449:1;25438:9;25434:17;25427:47;25491:131;25617:4;25491:131;:::i;:::-;25483:139;;25381:248;;;:::o;25635:419::-;;25839:2;25828:9;25824:18;25816:26;;25888:9;25882:4;25878:20;25874:1;25863:9;25859:17;25852:47;25916:131;26042:4;25916:131;:::i;:::-;25908:139;;25806:248;;;:::o;26060:419::-;;26264:2;26253:9;26249:18;26241:26;;26313:9;26307:4;26303:20;26299:1;26288:9;26284:17;26277:47;26341:131;26467:4;26341:131;:::i;:::-;26333:139;;26231:248;;;:::o;26485:419::-;;26689:2;26678:9;26674:18;26666:26;;26738:9;26732:4;26728:20;26724:1;26713:9;26709:17;26702:47;26766:131;26892:4;26766:131;:::i;:::-;26758:139;;26656:248;;;:::o;26910:419::-;;27114:2;27103:9;27099:18;27091:26;;27163:9;27157:4;27153:20;27149:1;27138:9;27134:17;27127:47;27191:131;27317:4;27191:131;:::i;:::-;27183:139;;27081:248;;;:::o;27335:419::-;;27539:2;27528:9;27524:18;27516:26;;27588:9;27582:4;27578:20;27574:1;27563:9;27559:17;27552:47;27616:131;27742:4;27616:131;:::i;:::-;27608:139;;27506:248;;;:::o;27760:419::-;;27964:2;27953:9;27949:18;27941:26;;28013:9;28007:4;28003:20;27999:1;27988:9;27984:17;27977:47;28041:131;28167:4;28041:131;:::i;:::-;28033:139;;27931:248;;;:::o;28185:419::-;;28389:2;28378:9;28374:18;28366:26;;28438:9;28432:4;28428:20;28424:1;28413:9;28409:17;28402:47;28466:131;28592:4;28466:131;:::i;:::-;28458:139;;28356:248;;;:::o;28610:419::-;;28814:2;28803:9;28799:18;28791:26;;28863:9;28857:4;28853:20;28849:1;28838:9;28834:17;28827:47;28891:131;29017:4;28891:131;:::i;:::-;28883:139;;28781:248;;;:::o;29035:419::-;;29239:2;29228:9;29224:18;29216:26;;29288:9;29282:4;29278:20;29274:1;29263:9;29259:17;29252:47;29316:131;29442:4;29316:131;:::i;:::-;29308:139;;29206:248;;;:::o;29460:419::-;;29664:2;29653:9;29649:18;29641:26;;29713:9;29707:4;29703:20;29699:1;29688:9;29684:17;29677:47;29741:131;29867:4;29741:131;:::i;:::-;29733:139;;29631:248;;;:::o;29885:419::-;;30089:2;30078:9;30074:18;30066:26;;30138:9;30132:4;30128:20;30124:1;30113:9;30109:17;30102:47;30166:131;30292:4;30166:131;:::i;:::-;30158:139;;30056:248;;;:::o;30310:419::-;;30514:2;30503:9;30499:18;30491:26;;30563:9;30557:4;30553:20;30549:1;30538:9;30534:17;30527:47;30591:131;30717:4;30591:131;:::i;:::-;30583:139;;30481:248;;;:::o;30735:419::-;;30939:2;30928:9;30924:18;30916:26;;30988:9;30982:4;30978:20;30974:1;30963:9;30959:17;30952:47;31016:131;31142:4;31016:131;:::i;:::-;31008:139;;30906:248;;;:::o;31160:419::-;;31364:2;31353:9;31349:18;31341:26;;31413:9;31407:4;31403:20;31399:1;31388:9;31384:17;31377:47;31441:131;31567:4;31441:131;:::i;:::-;31433:139;;31331:248;;;:::o;31585:419::-;;31789:2;31778:9;31774:18;31766:26;;31838:9;31832:4;31828:20;31824:1;31813:9;31809:17;31802:47;31866:131;31992:4;31866:131;:::i;:::-;31858:139;;31756:248;;;:::o;32435:419::-;;32639:2;32628:9;32624:18;32616:26;;32688:9;32682:4;32678:20;32674:1;32663:9;32659:17;32652:47;32716:131;32842:4;32716:131;:::i;:::-;32708:139;;32606:248;;;:::o;32860:419::-;;33064:2;33053:9;33049:18;33041:26;;33113:9;33107:4;33103:20;33099:1;33088:9;33084:17;33077:47;33141:131;33267:4;33141:131;:::i;:::-;33133:139;;33031:248;;;:::o;33285:222::-;;33416:2;33405:9;33401:18;33393:26;;33429:71;33497:1;33486:9;33482:17;33473:6;33429:71;:::i;:::-;33383:124;;;;:::o;33513:214::-;;33640:2;33629:9;33625:18;33617:26;;33653:67;33717:1;33706:9;33702:17;33693:6;33653:67;:::i;:::-;33607:120;;;;:::o;33733:283::-;;33799:2;33793:9;33783:19;;33841:4;33833:6;33829:17;33948:6;33936:10;33933:22;33912:18;33900:10;33897:34;33894:62;33891:2;;;33959:18;;:::i;:::-;33891:2;33999:10;33995:2;33988:22;33773:243;;;;:::o;34022:331::-;;34173:18;34165:6;34162:30;34159:2;;;34195:18;;:::i;:::-;34159:2;34280:4;34276:9;34269:4;34261:6;34257:17;34253:33;34245:41;;34341:4;34335;34331:15;34323:23;;34088:265;;;:::o;34359:332::-;;34511:18;34503:6;34500:30;34497:2;;;34533:18;;:::i;:::-;34497:2;34618:4;34614:9;34607:4;34599:6;34595:17;34591:33;34583:41;;34679:4;34673;34669:15;34661:23;;34426:265;;;:::o;34697:141::-;;34769:3;34761:11;;34792:3;34789:1;34782:14;34826:4;34823:1;34813:18;34805:26;;34751:87;;;:::o;34844:98::-;;34929:5;34923:12;34913:22;;34902:40;;;:::o;34948:99::-;;35034:5;35028:12;35018:22;;35007:40;;;:::o;35053:168::-;;35170:6;35165:3;35158:19;35210:4;35205:3;35201:14;35186:29;;35148:73;;;;:::o;35227:147::-;;35365:3;35350:18;;35340:34;;;;:::o;35380:169::-;;35498:6;35493:3;35486:19;35538:4;35533:3;35529:14;35514:29;;35476:73;;;;:::o;35555:148::-;;35694:3;35679:18;;35669:34;;;;:::o;35709:273::-;;35768:20;35786:1;35768:20;:::i;:::-;35763:25;;35802:20;35820:1;35802:20;:::i;:::-;35797:25;;35924:1;35888:34;35884:42;35881:1;35878:49;35875:2;;;35930:18;;:::i;:::-;35875:2;35974:1;35971;35967:9;35960:16;;35753:229;;;;:::o;35988:305::-;;36047:20;36065:1;36047:20;:::i;:::-;36042:25;;36081:20;36099:1;36081:20;:::i;:::-;36076:25;;36235:1;36167:66;36163:74;36160:1;36157:81;36154:2;;;36241:18;;:::i;:::-;36154:2;36285:1;36282;36278:9;36271:16;;36032:261;;;;:::o;36299:237::-;;36356:18;36372:1;36356:18;:::i;:::-;36351:23;;36388:18;36404:1;36388:18;:::i;:::-;36383:23;;36478:1;36472:4;36468:12;36465:1;36462:19;36459:2;;;36484:18;;:::i;:::-;36459:2;36528:1;36525;36521:9;36514:16;;36341:195;;;;:::o;36542:185::-;;36599:20;36617:1;36599:20;:::i;:::-;36594:25;;36633:20;36651:1;36633:20;:::i;:::-;36628:25;;36672:1;36662:2;;36677:18;;:::i;:::-;36662:2;36719:1;36716;36712:9;36707:14;;36584:143;;;;:::o;36733:348::-;;36796:20;36814:1;36796:20;:::i;:::-;36791:25;;36830:20;36848:1;36830:20;:::i;:::-;36825:25;;37018:1;36950:66;36946:74;36943:1;36940:81;36935:1;36928:9;36921:17;36917:105;36914:2;;;37025:18;;:::i;:::-;36914:2;37073:1;37070;37066:9;37055:20;;36781:300;;;;:::o;37087:191::-;;37147:20;37165:1;37147:20;:::i;:::-;37142:25;;37181:20;37199:1;37181:20;:::i;:::-;37176:25;;37220:1;37217;37214:8;37211:2;;;37225:18;;:::i;:::-;37211:2;37270:1;37267;37263:9;37255:17;;37132:146;;;;:::o;37284:96::-;;37350:24;37368:5;37350:24;:::i;:::-;37339:35;;37329:51;;;:::o;37386:104::-;;37460:24;37478:5;37460:24;:::i;:::-;37449:35;;37439:51;;;:::o;37496:90::-;;37573:5;37566:13;37559:21;37548:32;;37538:48;;;:::o;37592:149::-;;37668:66;37661:5;37657:78;37646:89;;37636:105;;;:::o;37747:118::-;;37824:34;37817:5;37813:46;37802:57;;37792:73;;;:::o;37871:126::-;;37948:42;37941:5;37937:54;37926:65;;37916:81;;;:::o;38003:77::-;;38069:5;38058:16;;38048:32;;;:::o;38086:86::-;;38161:4;38154:5;38150:16;38139:27;;38129:43;;;:::o;38178:154::-;38262:6;38257:3;38252;38239:30;38324:1;38315:6;38310:3;38306:16;38299:27;38229:103;;;:::o;38338:307::-;38406:1;38416:113;38430:6;38427:1;38424:13;38416:113;;;38515:1;38510:3;38506:11;38500:18;38496:1;38491:3;38487:11;38480:39;38452:2;38449:1;38445:10;38440:15;;38416:113;;;38547:6;38544:1;38541:13;38538:2;;;38627:1;38618:6;38613:3;38609:16;38602:27;38538:2;38387:258;;;;:::o;38651:171::-;;38713:24;38731:5;38713:24;:::i;:::-;38704:33;;38759:4;38752:5;38749:15;38746:2;;;38767:18;;:::i;:::-;38746:2;38814:1;38807:5;38803:13;38796:20;;38694:128;;;:::o;38828:320::-;;38909:1;38903:4;38899:12;38889:22;;38956:1;38950:4;38946:12;38977:18;38967:2;;39033:4;39025:6;39021:17;39011:27;;38967:2;39095;39087:6;39084:14;39064:18;39061:38;39058:2;;;39114:18;;:::i;:::-;39058:2;38879:269;;;;:::o;39154:233::-;;39216:24;39234:5;39216:24;:::i;:::-;39207:33;;39262:66;39255:5;39252:77;39249:2;;;39332:18;;:::i;:::-;39249:2;39379:1;39372:5;39368:13;39361:20;;39197:190;;;:::o;39393:176::-;;39442:20;39460:1;39442:20;:::i;:::-;39437:25;;39476:20;39494:1;39476:20;:::i;:::-;39471:25;;39515:1;39505:2;;39520:18;;:::i;:::-;39505:2;39561:1;39558;39554:9;39549:14;;39427:142;;;;:::o;39575:180::-;39623:77;39620:1;39613:88;39720:4;39717:1;39710:15;39744:4;39741:1;39734:15;39761:180;39809:77;39806:1;39799:88;39906:4;39903:1;39896:15;39930:4;39927:1;39920:15;39947:180;39995:77;39992:1;39985:88;40092:4;40089:1;40082:15;40116:4;40113:1;40106:15;40133:180;40181:77;40178:1;40171:88;40278:4;40275:1;40268:15;40302:4;40299:1;40292:15;40319:102;;40411:2;40407:7;40402:2;40395:5;40391:14;40387:28;40377:38;;40367:54;;;:::o;40427:122::-;40500:24;40518:5;40500:24;:::i;:::-;40493:5;40490:35;40480:2;;40539:1;40536;40529:12;40480:2;40470:79;:::o;40555:138::-;40636:32;40662:5;40636:32;:::i;:::-;40629:5;40626:43;40616:2;;40683:1;40680;40673:12;40616:2;40606:87;:::o;40699:116::-;40769:21;40784:5;40769:21;:::i;:::-;40762:5;40759:32;40749:2;;40805:1;40802;40795:12;40749:2;40739:76;:::o;40821:120::-;40893:23;40910:5;40893:23;:::i;:::-;40886:5;40883:34;40873:2;;40931:1;40928;40921:12;40873:2;40863:78;:::o;40947:122::-;41020:24;41038:5;41020:24;:::i;:::-;41013:5;41010:35;41000:2;;41059:1;41056;41049:12;41000:2;40990:79;:::o;41075:118::-;41146:22;41162:5;41146:22;:::i;:::-;41139:5;41136:33;41126:2;;41183:1;41180;41173:12;41126:2;41116:77;:::o

Swarm Source

ipfs://1875a87f6a6afb869e7d39360e7de9d64af8d9f068b1aa0e94f34cbd692701e1
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.