ETH Price: $3,312.15 (-8.94%)

Token

BoredApePlayingCards (BAPC)
 

Overview

Max Total Supply

7,270 BAPC

Holders

749

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BAPC
0x0573b2f29ab41d9bdfe769b634ee8cb6cfef92d6
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:
BoredApePlayingCards

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;

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

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

contract BoredApePlayingCards is ERC721A, Ownable {

    uint8 public maxMintsPerWallet;
    uint public maxSupply;
    uint public whitelistPrice;
    uint public salePrice;

    string public baseURI;

    bool public saleStatus;

    address public token;

    mapping(address => bool) public _whitelisted;
    mapping(address => uint8) public _maxMintedPerWallet;
    

    constructor() ERC721A("BoredApePlayingCards", "BAPC") {}

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

    function setTokenForWhitelist(address _token) external onlyOwner {
        token = _token;
    }

    function addToWhitelist(address[] memory whitelisted) external onlyOwner {
        for(uint8 i=0; i<whitelisted.length; i++){
            _whitelisted[whitelisted[i]] = !_whitelisted[whitelisted[i]];
        }
    }

    function setWhitelistPrice(uint _whitelistPrice) external onlyOwner {
        whitelistPrice = _whitelistPrice;
    }

    function setSalePrice(uint _salePrice) external onlyOwner {
        salePrice = _salePrice;
    }

    function setMaxMintPerWallet(uint8 _maxMintsPerWallet) external onlyOwner {
        maxMintsPerWallet = _maxMintsPerWallet;
    }

    function flipSaleStatus() external onlyOwner {
        saleStatus = !saleStatus;
    }

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

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

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

    function buyOne() external payable {
        require(saleStatus, "Sale not active!");
        require(_maxMintedPerWallet[msg.sender] < maxMintsPerWallet, "Mint limit reached!");
        require(currentIndex < maxSupply, "Sale finished!");
        uint balance = IERC721(token).balanceOf(msg.sender);
        if(balance > 0 || _whitelisted[msg.sender]){
            require(msg.value == whitelistPrice, "Incorrect value!");
            _safeMint(msg.sender, 1);
            _maxMintedPerWallet[msg.sender]++;
        }else{
            require(msg.value == salePrice, "Incorrect value!");
            _safeMint(msg.sender, 1);
            _maxMintedPerWallet[msg.sender]++;
        }
    }

    function buyFive() external payable {
        require(saleStatus, "Sale not active!");
        require(_maxMintedPerWallet[msg.sender] + 5 <= maxMintsPerWallet, "Exceeds mint limit!");
        require(currentIndex + 5 < maxSupply, "Not enough tokens!");
        uint balance = IERC721(token).balanceOf(msg.sender);
        if(balance > 0 || _whitelisted[msg.sender]){
            uint priceDiscounted = whitelistPrice * 90 / 100;
            uint price = priceDiscounted * 5;
            require(msg.value == price, "Incorrect value!");
            _safeMint(msg.sender, 5);
            _maxMintedPerWallet[msg.sender]+= 5;
        }else{ 
            uint priceDiscounted = salePrice * 90 / 100;
            uint price = priceDiscounted * 5;
            require(msg.value == price, "Incorrect value!");
            _safeMint(msg.sender, 5);
            _maxMintedPerWallet[msg.sender]+= 5;
        }
    }

    function buyTen() external payable {
        require(saleStatus, "Sale not active!");
        require(_maxMintedPerWallet[msg.sender] + 10 <= maxMintsPerWallet, "Exceeds mint limit!");
        require(currentIndex + 10 < maxSupply, "Not enough tokens!");
        uint balance = IERC721(token).balanceOf(msg.sender);
        if(balance > 0 || _whitelisted[msg.sender]){
            uint priceDiscounted = whitelistPrice * 80 / 100;
            uint price = priceDiscounted * 10;
            require(msg.value == price, "Incorrect value!");
            _safeMint(msg.sender, 10);
            _maxMintedPerWallet[msg.sender]+= 10;
        }else{
            uint priceDiscounted = salePrice * 80 / 100;
            uint price = priceDiscounted * 10;
            require(msg.value == price, "Incorrect value!");
            _safeMint(msg.sender, 10);
            _maxMintedPerWallet[msg.sender]+= 10;
        }
    }
}

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":"","type":"address"}],"name":"_maxMintedPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"whitelisted","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyOne","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyTen","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flipSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxMintsPerWallet","type":"uint8"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setTokenForWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistPrice","type":"uint256"}],"name":"setWhitelistPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280601481526020017f426f726564417065506c6179696e6743617264730000000000000000000000008152506040518060400160405280600481526020017f4241504300000000000000000000000000000000000000000000000000000000815250816001908051906020019062000096929190620001a6565b508060029080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000285565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200029e57607f821691505b60208210811415620002b557620002b462000256565b5b50919050565b61546d80620002cb6000396000f3fe60806040526004361061023b5760003560e01c8063717d57d31161012e578063d5abeb01116100ab578063f516a2e61161006f578063f516a2e61461081c578063f51f96dd14610847578063f9020e3314610872578063fc0c546a1461089d578063fc1a1c36146108c85761023b565b8063d5abeb0114610758578063e35188de14610783578063e985e9c51461078d578063edc35ba9146107ca578063f2fde38b146107f35761023b565b806395d89b41116100f257806395d89b4114610687578063a22cb465146106b2578063b88d4fde146106db578063c87b56dd14610704578063ce03ec93146107415761023b565b8063717d57d3146105c3578063779c0df1146105ec5780637f649783146106295780638d665095146106525780638da5cb5b1461065c5761023b565b806342842e0e116101bc5780636b5e2896116101805780636b5e2896146105115780636c0360eb1461051b5780636f8b44b01461054657806370a082311461056f578063715018a6146105ac5761023b565b806342842e0e1461041c5780634f6ccce71461044557806355f804b3146104825780636352211e146104ab5780636898f77d146104e85761023b565b806318160ddd1161020357806318160ddd1461034b5780631919fed71461037657806323b872dd1461039f5780632f745c59146103c85780633ccfd60b146104055761023b565b806301c4b3161461024057806301ffc9a71461027d57806306fdde03146102ba578063081812fc146102e5578063095ea7b314610322575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613a8f565b6108f3565b6040516102749190613ad7565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f9190613b4a565b610913565b6040516102b19190613ad7565b60405180910390f35b3480156102c657600080fd5b506102cf610a5d565b6040516102dc9190613c10565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613c68565b610aef565b6040516103199190613ca4565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190613cbf565b610b74565b005b34801561035757600080fd5b50610360610c8d565b60405161036d9190613d0e565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190613c68565b610ca3565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190613d29565b610d29565b005b3480156103d457600080fd5b506103ef60048036038101906103ea9190613cbf565b610d39565b6040516103fc9190613d0e565b60405180910390f35b34801561041157600080fd5b5061041a610f2b565b005b34801561042857600080fd5b50610443600480360381019061043e9190613d29565b610ff0565b005b34801561045157600080fd5b5061046c60048036038101906104679190613c68565b611010565b6040516104799190613d0e565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613eb1565b611063565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190613c68565b6110f9565b6040516104df9190613ca4565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190613f33565b61110f565b005b6105196111a9565b005b34801561052757600080fd5b5061053061156f565b60405161053d9190613c10565b60405180910390f35b34801561055257600080fd5b5061056d60048036038101906105689190613c68565b6115fd565b005b34801561057b57600080fd5b5061059660048036038101906105919190613a8f565b611683565b6040516105a39190613d0e565b60405180910390f35b3480156105b857600080fd5b506105c161176c565b005b3480156105cf57600080fd5b506105ea60048036038101906105e59190613c68565b6117f4565b005b3480156105f857600080fd5b50610613600480360381019061060e9190613a8f565b61187a565b6040516106209190613f6f565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190614052565b61189a565b005b61065a611a1a565b005b34801561066857600080fd5b50610671611e57565b60405161067e9190613ca4565b60405180910390f35b34801561069357600080fd5b5061069c611e81565b6040516106a99190613c10565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d491906140c7565b611f13565b005b3480156106e757600080fd5b5061070260048036038101906106fd91906141a8565b612094565b005b34801561071057600080fd5b5061072b60048036038101906107269190613c68565b6120f0565b6040516107389190613c10565b60405180910390f35b34801561074d57600080fd5b50610756612198565b005b34801561076457600080fd5b5061076d612240565b60405161077a9190613d0e565b60405180910390f35b61078b612246565b005b34801561079957600080fd5b506107b460048036038101906107af919061422b565b612683565b6040516107c19190613ad7565b60405180910390f35b3480156107d657600080fd5b506107f160048036038101906107ec9190613a8f565b612717565b005b3480156107ff57600080fd5b5061081a60048036038101906108159190613a8f565b6127d7565b005b34801561082857600080fd5b506108316128cf565b60405161083e9190613f6f565b60405180910390f35b34801561085357600080fd5b5061085c6128e2565b6040516108699190613d0e565b60405180910390f35b34801561087e57600080fd5b506108876128e8565b6040516108949190613ad7565b60405180910390f35b3480156108a957600080fd5b506108b26128fb565b6040516108bf9190613ca4565b60405180910390f35b3480156108d457600080fd5b506108dd612921565b6040516108ea9190613d0e565b60405180910390f35b600d6020528060005260406000206000915054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109de57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a565750610a5582612927565b5b9050919050565b606060018054610a6c9061429a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a989061429a565b8015610ae55780601f10610aba57610100808354040283529160200191610ae5565b820191906000526020600020905b815481529060010190602001808311610ac857829003601f168201915b5050505050905090565b6000610afa82612991565b610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b309061433e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b7f826110f9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be7906143d0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c0f61299e565b73ffffffffffffffffffffffffffffffffffffffff161480610c3e5750610c3d81610c3861299e565b612683565b5b610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490614462565b60405180910390fd5b610c888383836129a6565b505050565b60006001600054610c9e91906144b1565b905090565b610cab61299e565b73ffffffffffffffffffffffffffffffffffffffff16610cc9611e57565b73ffffffffffffffffffffffffffffffffffffffff1614610d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1690614531565b60405180910390fd5b80600a8190555050565b610d34838383612a58565b505050565b6000610d4483611683565b8210610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c906145c3565b60405180910390fd5b6000610d8f610c8d565b905060008060005b83811015610ee9576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e8957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610edb5786841415610ed2578195505050505050610f25565b83806001019450505b508080600101915050610d97565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c90614655565b60405180910390fd5b92915050565b610f3361299e565b73ffffffffffffffffffffffffffffffffffffffff16610f51611e57565b73ffffffffffffffffffffffffffffffffffffffff1614610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90614531565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610fed573d6000803e3d6000fd5b50565b61100b83838360405180602001604052806000815250612094565b505050565b600061101a610c8d565b821061105b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611052906146e7565b60405180910390fd5b819050919050565b61106b61299e565b73ffffffffffffffffffffffffffffffffffffffff16611089611e57565b73ffffffffffffffffffffffffffffffffffffffff16146110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690614531565b60405180910390fd5b80600b90805190602001906110f5929190613940565b5050565b600061110482612f98565b600001519050919050565b61111761299e565b73ffffffffffffffffffffffffffffffffffffffff16611135611e57565b73ffffffffffffffffffffffffffffffffffffffff161461118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290614531565b60405180910390fd5b80600760146101000a81548160ff021916908360ff16021790555050565b600c60009054906101000a900460ff166111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90614753565b60405180910390fd5b600760149054906101000a900460ff1660ff16600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff161061129b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611292906147bf565b60405180910390fd5b600854600054106112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d89061482b565b60405180910390fd5b6000600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161133e9190613ca4565b602060405180830381865afa15801561135b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137f9190614860565b905060008111806113d95750600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156114a7576009543414611422576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611419906148d9565b60405180910390fd5b61142d336001613132565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff1680929190611489906148f9565b91906101000a81548160ff021916908360ff1602179055505061156c565b600a5434146114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e2906148d9565b60405180910390fd5b6114f6336001613132565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff1680929190611552906148f9565b91906101000a81548160ff021916908360ff160217905550505b50565b600b805461157c9061429a565b80601f01602080910402602001604051908101604052809291908181526020018280546115a89061429a565b80156115f55780601f106115ca576101008083540402835291602001916115f5565b820191906000526020600020905b8154815290600101906020018083116115d857829003601f168201915b505050505081565b61160561299e565b73ffffffffffffffffffffffffffffffffffffffff16611623611e57565b73ffffffffffffffffffffffffffffffffffffffff1614611679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167090614531565b60405180910390fd5b8060088190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90614995565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61177461299e565b73ffffffffffffffffffffffffffffffffffffffff16611792611e57565b73ffffffffffffffffffffffffffffffffffffffff16146117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90614531565b60405180910390fd5b6117f26000613150565b565b6117fc61299e565b73ffffffffffffffffffffffffffffffffffffffff1661181a611e57565b73ffffffffffffffffffffffffffffffffffffffff1614611870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186790614531565b60405180910390fd5b8060098190555050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6118a261299e565b73ffffffffffffffffffffffffffffffffffffffff166118c0611e57565b73ffffffffffffffffffffffffffffffffffffffff1614611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90614531565b60405180910390fd5b60005b81518160ff161015611a1657600d6000838360ff168151811061193f5761193e6149b5565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600d6000848460ff16815181106119aa576119a96149b5565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611a0e906148f9565b915050611919565b5050565b600c60009054906101000a900460ff16611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6090614753565b60405180910390fd5b600760149054906101000a900460ff1660ff166005600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ad591906149e4565b60ff161115611b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1090614a67565b60405180910390fd5b6008546005600054611b2b9190614a87565b10611b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6290614b29565b60405180910390fd5b6000600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611bc89190613ca4565b602060405180830381865afa158015611be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c099190614860565b90506000811180611c635750600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611d605760006064605a600954611c7b9190614b49565b611c859190614bd2565b90506000600582611c969190614b49565b9050803414611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd1906148d9565b60405180910390fd5b611ce5336005613132565b6005600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611d4191906149e4565b92506101000a81548160ff021916908360ff1602179055505050611e54565b60006064605a600a54611d739190614b49565b611d7d9190614bd2565b90506000600582611d8e9190614b49565b9050803414611dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc9906148d9565b60405180910390fd5b611ddd336005613132565b6005600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611e3991906149e4565b92506101000a81548160ff021916908360ff16021790555050505b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611e909061429a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ebc9061429a565b8015611f095780601f10611ede57610100808354040283529160200191611f09565b820191906000526020600020905b815481529060010190602001808311611eec57829003601f168201915b5050505050905090565b611f1b61299e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8090614c4f565b60405180910390fd5b8060066000611f9661299e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661204361299e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120889190613ad7565b60405180910390a35050565b61209f848484612a58565b6120ab84848484613216565b6120ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e190614ce1565b60405180910390fd5b50505050565b60606120fb82612991565b61213a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213190614d73565b60405180910390fd5b600061214461339e565b90506000815114156121655760405180602001604052806000815250612190565b8061216f84613430565b604051602001612180929190614e1b565b6040516020818303038152906040525b915050919050565b6121a061299e565b73ffffffffffffffffffffffffffffffffffffffff166121be611e57565b73ffffffffffffffffffffffffffffffffffffffff1614612214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220b90614531565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b60085481565b600c60009054906101000a900460ff16612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90614753565b60405180910390fd5b600760149054906101000a900460ff1660ff16600a600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661230191906149e4565b60ff161115612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233c90614a67565b60405180910390fd5b600854600a6000546123579190614a87565b10612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238e90614b29565b60405180910390fd5b6000600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016123f49190613ca4565b602060405180830381865afa158015612411573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124359190614860565b9050600081118061248f5750600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561258c576000606460506009546124a79190614b49565b6124b19190614bd2565b90506000600a826124c29190614b49565b9050803414612506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fd906148d9565b60405180910390fd5b61251133600a613132565b600a600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661256d91906149e4565b92506101000a81548160ff021916908360ff1602179055505050612680565b600060646050600a5461259f9190614b49565b6125a99190614bd2565b90506000600a826125ba9190614b49565b90508034146125fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f5906148d9565b60405180910390fd5b61260933600a613132565b600a600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661266591906149e4565b92506101000a81548160ff021916908360ff16021790555050505b50565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61271f61299e565b73ffffffffffffffffffffffffffffffffffffffff1661273d611e57565b73ffffffffffffffffffffffffffffffffffffffff1614612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a90614531565b60405180910390fd5b80600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6127df61299e565b73ffffffffffffffffffffffffffffffffffffffff166127fd611e57565b73ffffffffffffffffffffffffffffffffffffffff1614612853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a90614531565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90614ebc565b60405180910390fd5b6128cc81613150565b50565b600760149054906101000a900460ff1681565b600a5481565b600c60009054906101000a900460ff1681565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612a6382612f98565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612a8a61299e565b73ffffffffffffffffffffffffffffffffffffffff161480612ae65750612aaf61299e565b73ffffffffffffffffffffffffffffffffffffffff16612ace84610aef565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b025750612b018260000151612afc61299e565b612683565b5b905080612b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3b90614f4e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bad90614fe0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1d90615072565b60405180910390fd5b612c338585856001613591565b612c4360008484600001516129a6565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f2857612e8781612991565b15612f275782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f918585856001613597565b5050505050565b612fa06139c6565b612fa982612991565b612fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdf90615104565b60405180910390fd5b60008290505b600081106130f1576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130e257809250505061312d565b50808060019003915050612fee565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312490615196565b60405180910390fd5b919050565b61314c82826040518060200160405280600081525061359d565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006132378473ffffffffffffffffffffffffffffffffffffffff166135af565b15613391578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261326061299e565b8786866040518563ffffffff1660e01b8152600401613282949392919061520b565b6020604051808303816000875af19250505080156132be57506040513d601f19601f820116820180604052508101906132bb919061526c565b60015b613341573d80600081146132ee576040519150601f19603f3d011682016040523d82523d6000602084013e6132f3565b606091505b50600081511415613339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333090614ce1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613396565b600190505b949350505050565b6060600b80546133ad9061429a565b80601f01602080910402602001604051908101604052809291908181526020018280546133d99061429a565b80156134265780601f106133fb57610100808354040283529160200191613426565b820191906000526020600020905b81548152906001019060200180831161340957829003601f168201915b5050505050905090565b60606000821415613478576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061358c565b600082905060005b600082146134aa57808061349390615299565b915050600a826134a39190614bd2565b9150613480565b60008167ffffffffffffffff8111156134c6576134c5613d86565b5b6040519080825280601f01601f1916602001820160405280156134f85781602001600182028036833780820191505090505b5090505b600085146135855760018261351191906144b1565b9150600a8561352091906152e2565b603061352c9190614a87565b60f81b818381518110613542576135416149b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561357e9190614bd2565b94506134fc565b8093505050505b919050565b50505050565b50505050565b6135aa83838360016135c2565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362f90615385565b60405180910390fd5b600084141561367c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367390615417565b60405180910390fd5b6136896000868387613591565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561392357818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561390e576138ce6000888488613216565b61390d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390490614ce1565b60405180910390fd5b5b81806001019250508080600101915050613857565b5080600081905550506139396000868387613597565b5050505050565b82805461394c9061429a565b90600052602060002090601f01602090048101928261396e57600085556139b5565b82601f1061398757805160ff19168380011785556139b5565b828001600101855582156139b5579182015b828111156139b4578251825591602001919060010190613999565b5b5090506139c29190613a00565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613a19576000816000905550600101613a01565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a5c82613a31565b9050919050565b613a6c81613a51565b8114613a7757600080fd5b50565b600081359050613a8981613a63565b92915050565b600060208284031215613aa557613aa4613a27565b5b6000613ab384828501613a7a565b91505092915050565b60008115159050919050565b613ad181613abc565b82525050565b6000602082019050613aec6000830184613ac8565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b2781613af2565b8114613b3257600080fd5b50565b600081359050613b4481613b1e565b92915050565b600060208284031215613b6057613b5f613a27565b5b6000613b6e84828501613b35565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613bb1578082015181840152602081019050613b96565b83811115613bc0576000848401525b50505050565b6000601f19601f8301169050919050565b6000613be282613b77565b613bec8185613b82565b9350613bfc818560208601613b93565b613c0581613bc6565b840191505092915050565b60006020820190508181036000830152613c2a8184613bd7565b905092915050565b6000819050919050565b613c4581613c32565b8114613c5057600080fd5b50565b600081359050613c6281613c3c565b92915050565b600060208284031215613c7e57613c7d613a27565b5b6000613c8c84828501613c53565b91505092915050565b613c9e81613a51565b82525050565b6000602082019050613cb96000830184613c95565b92915050565b60008060408385031215613cd657613cd5613a27565b5b6000613ce485828601613a7a565b9250506020613cf585828601613c53565b9150509250929050565b613d0881613c32565b82525050565b6000602082019050613d236000830184613cff565b92915050565b600080600060608486031215613d4257613d41613a27565b5b6000613d5086828701613a7a565b9350506020613d6186828701613a7a565b9250506040613d7286828701613c53565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613dbe82613bc6565b810181811067ffffffffffffffff82111715613ddd57613ddc613d86565b5b80604052505050565b6000613df0613a1d565b9050613dfc8282613db5565b919050565b600067ffffffffffffffff821115613e1c57613e1b613d86565b5b613e2582613bc6565b9050602081019050919050565b82818337600083830152505050565b6000613e54613e4f84613e01565b613de6565b905082815260208101848484011115613e7057613e6f613d81565b5b613e7b848285613e32565b509392505050565b600082601f830112613e9857613e97613d7c565b5b8135613ea8848260208601613e41565b91505092915050565b600060208284031215613ec757613ec6613a27565b5b600082013567ffffffffffffffff811115613ee557613ee4613a2c565b5b613ef184828501613e83565b91505092915050565b600060ff82169050919050565b613f1081613efa565b8114613f1b57600080fd5b50565b600081359050613f2d81613f07565b92915050565b600060208284031215613f4957613f48613a27565b5b6000613f5784828501613f1e565b91505092915050565b613f6981613efa565b82525050565b6000602082019050613f846000830184613f60565b92915050565b600067ffffffffffffffff821115613fa557613fa4613d86565b5b602082029050602081019050919050565b600080fd5b6000613fce613fc984613f8a565b613de6565b90508083825260208201905060208402830185811115613ff157613ff0613fb6565b5b835b8181101561401a57806140068882613a7a565b845260208401935050602081019050613ff3565b5050509392505050565b600082601f83011261403957614038613d7c565b5b8135614049848260208601613fbb565b91505092915050565b60006020828403121561406857614067613a27565b5b600082013567ffffffffffffffff81111561408657614085613a2c565b5b61409284828501614024565b91505092915050565b6140a481613abc565b81146140af57600080fd5b50565b6000813590506140c18161409b565b92915050565b600080604083850312156140de576140dd613a27565b5b60006140ec85828601613a7a565b92505060206140fd858286016140b2565b9150509250929050565b600067ffffffffffffffff82111561412257614121613d86565b5b61412b82613bc6565b9050602081019050919050565b600061414b61414684614107565b613de6565b90508281526020810184848401111561416757614166613d81565b5b614172848285613e32565b509392505050565b600082601f83011261418f5761418e613d7c565b5b813561419f848260208601614138565b91505092915050565b600080600080608085870312156141c2576141c1613a27565b5b60006141d087828801613a7a565b94505060206141e187828801613a7a565b93505060406141f287828801613c53565b925050606085013567ffffffffffffffff81111561421357614212613a2c565b5b61421f8782880161417a565b91505092959194509250565b6000806040838503121561424257614241613a27565b5b600061425085828601613a7a565b925050602061426185828601613a7a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806142b257607f821691505b602082108114156142c6576142c561426b565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614328602d83613b82565b9150614333826142cc565b604082019050919050565b600060208201905081810360008301526143578161431b565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006143ba602283613b82565b91506143c58261435e565b604082019050919050565b600060208201905081810360008301526143e9816143ad565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b600061444c603983613b82565b9150614457826143f0565b604082019050919050565b6000602082019050818103600083015261447b8161443f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144bc82613c32565b91506144c783613c32565b9250828210156144da576144d9614482565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061451b602083613b82565b9150614526826144e5565b602082019050919050565b6000602082019050818103600083015261454a8161450e565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006145ad602283613b82565b91506145b882614551565b604082019050919050565b600060208201905081810360008301526145dc816145a0565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061463f602e83613b82565b915061464a826145e3565b604082019050919050565b6000602082019050818103600083015261466e81614632565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b60006146d1602383613b82565b91506146dc82614675565b604082019050919050565b60006020820190508181036000830152614700816146c4565b9050919050565b7f53616c65206e6f74206163746976652100000000000000000000000000000000600082015250565b600061473d601083613b82565b915061474882614707565b602082019050919050565b6000602082019050818103600083015261476c81614730565b9050919050565b7f4d696e74206c696d697420726561636865642100000000000000000000000000600082015250565b60006147a9601383613b82565b91506147b482614773565b602082019050919050565b600060208201905081810360008301526147d88161479c565b9050919050565b7f53616c652066696e697368656421000000000000000000000000000000000000600082015250565b6000614815600e83613b82565b9150614820826147df565b602082019050919050565b6000602082019050818103600083015261484481614808565b9050919050565b60008151905061485a81613c3c565b92915050565b60006020828403121561487657614875613a27565b5b60006148848482850161484b565b91505092915050565b7f496e636f72726563742076616c75652100000000000000000000000000000000600082015250565b60006148c3601083613b82565b91506148ce8261488d565b602082019050919050565b600060208201905081810360008301526148f2816148b6565b9050919050565b600061490482613efa565b915060ff82141561491857614917614482565b5b600182019050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b600061497f602b83613b82565b915061498a82614923565b604082019050919050565b600060208201905081810360008301526149ae81614972565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006149ef82613efa565b91506149fa83613efa565b92508260ff03821115614a1057614a0f614482565b5b828201905092915050565b7f45786365656473206d696e74206c696d69742100000000000000000000000000600082015250565b6000614a51601383613b82565b9150614a5c82614a1b565b602082019050919050565b60006020820190508181036000830152614a8081614a44565b9050919050565b6000614a9282613c32565b9150614a9d83613c32565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ad257614ad1614482565b5b828201905092915050565b7f4e6f7420656e6f75676820746f6b656e73210000000000000000000000000000600082015250565b6000614b13601283613b82565b9150614b1e82614add565b602082019050919050565b60006020820190508181036000830152614b4281614b06565b9050919050565b6000614b5482613c32565b9150614b5f83613c32565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b9857614b97614482565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614bdd82613c32565b9150614be883613c32565b925082614bf857614bf7614ba3565b5b828204905092915050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614c39601a83613b82565b9150614c4482614c03565b602082019050919050565b60006020820190508181036000830152614c6881614c2c565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614ccb603383613b82565b9150614cd682614c6f565b604082019050919050565b60006020820190508181036000830152614cfa81614cbe565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614d5d602f83613b82565b9150614d6882614d01565b604082019050919050565b60006020820190508181036000830152614d8c81614d50565b9050919050565b600081905092915050565b6000614da982613b77565b614db38185614d93565b9350614dc3818560208601613b93565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614e05600583614d93565b9150614e1082614dcf565b600582019050919050565b6000614e278285614d9e565b9150614e338284614d9e565b9150614e3e82614df8565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ea6602683613b82565b9150614eb182614e4a565b604082019050919050565b60006020820190508181036000830152614ed581614e99565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614f38603283613b82565b9150614f4382614edc565b604082019050919050565b60006020820190508181036000830152614f6781614f2b565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000614fca602683613b82565b9150614fd582614f6e565b604082019050919050565b60006020820190508181036000830152614ff981614fbd565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061505c602583613b82565b915061506782615000565b604082019050919050565b6000602082019050818103600083015261508b8161504f565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006150ee602a83613b82565b91506150f982615092565b604082019050919050565b6000602082019050818103600083015261511d816150e1565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615180602f83613b82565b915061518b82615124565b604082019050919050565b600060208201905081810360008301526151af81615173565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006151dd826151b6565b6151e781856151c1565b93506151f7818560208601613b93565b61520081613bc6565b840191505092915050565b60006080820190506152206000830187613c95565b61522d6020830186613c95565b61523a6040830185613cff565b818103606083015261524c81846151d2565b905095945050505050565b60008151905061526681613b1e565b92915050565b60006020828403121561528257615281613a27565b5b600061529084828501615257565b91505092915050565b60006152a482613c32565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152d7576152d6614482565b5b600182019050919050565b60006152ed82613c32565b91506152f883613c32565b92508261530857615307614ba3565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061536f602183613b82565b915061537a82615313565b604082019050919050565b6000602082019050818103600083015261539e81615362565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000615401602883613b82565b915061540c826153a5565b604082019050919050565b60006020820190508181036000830152615430816153f4565b905091905056fea2646970667358221220e40448b292fc146cac7a941967ce0d9c19fba552f20ec88b159ca1b6775f8b9564736f6c634300080b0033

Deployed Bytecode

0x60806040526004361061023b5760003560e01c8063717d57d31161012e578063d5abeb01116100ab578063f516a2e61161006f578063f516a2e61461081c578063f51f96dd14610847578063f9020e3314610872578063fc0c546a1461089d578063fc1a1c36146108c85761023b565b8063d5abeb0114610758578063e35188de14610783578063e985e9c51461078d578063edc35ba9146107ca578063f2fde38b146107f35761023b565b806395d89b41116100f257806395d89b4114610687578063a22cb465146106b2578063b88d4fde146106db578063c87b56dd14610704578063ce03ec93146107415761023b565b8063717d57d3146105c3578063779c0df1146105ec5780637f649783146106295780638d665095146106525780638da5cb5b1461065c5761023b565b806342842e0e116101bc5780636b5e2896116101805780636b5e2896146105115780636c0360eb1461051b5780636f8b44b01461054657806370a082311461056f578063715018a6146105ac5761023b565b806342842e0e1461041c5780634f6ccce71461044557806355f804b3146104825780636352211e146104ab5780636898f77d146104e85761023b565b806318160ddd1161020357806318160ddd1461034b5780631919fed71461037657806323b872dd1461039f5780632f745c59146103c85780633ccfd60b146104055761023b565b806301c4b3161461024057806301ffc9a71461027d57806306fdde03146102ba578063081812fc146102e5578063095ea7b314610322575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613a8f565b6108f3565b6040516102749190613ad7565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f9190613b4a565b610913565b6040516102b19190613ad7565b60405180910390f35b3480156102c657600080fd5b506102cf610a5d565b6040516102dc9190613c10565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613c68565b610aef565b6040516103199190613ca4565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190613cbf565b610b74565b005b34801561035757600080fd5b50610360610c8d565b60405161036d9190613d0e565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190613c68565b610ca3565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190613d29565b610d29565b005b3480156103d457600080fd5b506103ef60048036038101906103ea9190613cbf565b610d39565b6040516103fc9190613d0e565b60405180910390f35b34801561041157600080fd5b5061041a610f2b565b005b34801561042857600080fd5b50610443600480360381019061043e9190613d29565b610ff0565b005b34801561045157600080fd5b5061046c60048036038101906104679190613c68565b611010565b6040516104799190613d0e565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613eb1565b611063565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190613c68565b6110f9565b6040516104df9190613ca4565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190613f33565b61110f565b005b6105196111a9565b005b34801561052757600080fd5b5061053061156f565b60405161053d9190613c10565b60405180910390f35b34801561055257600080fd5b5061056d60048036038101906105689190613c68565b6115fd565b005b34801561057b57600080fd5b5061059660048036038101906105919190613a8f565b611683565b6040516105a39190613d0e565b60405180910390f35b3480156105b857600080fd5b506105c161176c565b005b3480156105cf57600080fd5b506105ea60048036038101906105e59190613c68565b6117f4565b005b3480156105f857600080fd5b50610613600480360381019061060e9190613a8f565b61187a565b6040516106209190613f6f565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190614052565b61189a565b005b61065a611a1a565b005b34801561066857600080fd5b50610671611e57565b60405161067e9190613ca4565b60405180910390f35b34801561069357600080fd5b5061069c611e81565b6040516106a99190613c10565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d491906140c7565b611f13565b005b3480156106e757600080fd5b5061070260048036038101906106fd91906141a8565b612094565b005b34801561071057600080fd5b5061072b60048036038101906107269190613c68565b6120f0565b6040516107389190613c10565b60405180910390f35b34801561074d57600080fd5b50610756612198565b005b34801561076457600080fd5b5061076d612240565b60405161077a9190613d0e565b60405180910390f35b61078b612246565b005b34801561079957600080fd5b506107b460048036038101906107af919061422b565b612683565b6040516107c19190613ad7565b60405180910390f35b3480156107d657600080fd5b506107f160048036038101906107ec9190613a8f565b612717565b005b3480156107ff57600080fd5b5061081a60048036038101906108159190613a8f565b6127d7565b005b34801561082857600080fd5b506108316128cf565b60405161083e9190613f6f565b60405180910390f35b34801561085357600080fd5b5061085c6128e2565b6040516108699190613d0e565b60405180910390f35b34801561087e57600080fd5b506108876128e8565b6040516108949190613ad7565b60405180910390f35b3480156108a957600080fd5b506108b26128fb565b6040516108bf9190613ca4565b60405180910390f35b3480156108d457600080fd5b506108dd612921565b6040516108ea9190613d0e565b60405180910390f35b600d6020528060005260406000206000915054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109de57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a565750610a5582612927565b5b9050919050565b606060018054610a6c9061429a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a989061429a565b8015610ae55780601f10610aba57610100808354040283529160200191610ae5565b820191906000526020600020905b815481529060010190602001808311610ac857829003601f168201915b5050505050905090565b6000610afa82612991565b610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b309061433e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b7f826110f9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be7906143d0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c0f61299e565b73ffffffffffffffffffffffffffffffffffffffff161480610c3e5750610c3d81610c3861299e565b612683565b5b610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490614462565b60405180910390fd5b610c888383836129a6565b505050565b60006001600054610c9e91906144b1565b905090565b610cab61299e565b73ffffffffffffffffffffffffffffffffffffffff16610cc9611e57565b73ffffffffffffffffffffffffffffffffffffffff1614610d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1690614531565b60405180910390fd5b80600a8190555050565b610d34838383612a58565b505050565b6000610d4483611683565b8210610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c906145c3565b60405180910390fd5b6000610d8f610c8d565b905060008060005b83811015610ee9576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e8957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610edb5786841415610ed2578195505050505050610f25565b83806001019450505b508080600101915050610d97565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c90614655565b60405180910390fd5b92915050565b610f3361299e565b73ffffffffffffffffffffffffffffffffffffffff16610f51611e57565b73ffffffffffffffffffffffffffffffffffffffff1614610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90614531565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610fed573d6000803e3d6000fd5b50565b61100b83838360405180602001604052806000815250612094565b505050565b600061101a610c8d565b821061105b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611052906146e7565b60405180910390fd5b819050919050565b61106b61299e565b73ffffffffffffffffffffffffffffffffffffffff16611089611e57565b73ffffffffffffffffffffffffffffffffffffffff16146110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690614531565b60405180910390fd5b80600b90805190602001906110f5929190613940565b5050565b600061110482612f98565b600001519050919050565b61111761299e565b73ffffffffffffffffffffffffffffffffffffffff16611135611e57565b73ffffffffffffffffffffffffffffffffffffffff161461118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290614531565b60405180910390fd5b80600760146101000a81548160ff021916908360ff16021790555050565b600c60009054906101000a900460ff166111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90614753565b60405180910390fd5b600760149054906101000a900460ff1660ff16600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff161061129b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611292906147bf565b60405180910390fd5b600854600054106112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d89061482b565b60405180910390fd5b6000600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161133e9190613ca4565b602060405180830381865afa15801561135b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137f9190614860565b905060008111806113d95750600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156114a7576009543414611422576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611419906148d9565b60405180910390fd5b61142d336001613132565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff1680929190611489906148f9565b91906101000a81548160ff021916908360ff1602179055505061156c565b600a5434146114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e2906148d9565b60405180910390fd5b6114f6336001613132565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff1680929190611552906148f9565b91906101000a81548160ff021916908360ff160217905550505b50565b600b805461157c9061429a565b80601f01602080910402602001604051908101604052809291908181526020018280546115a89061429a565b80156115f55780601f106115ca576101008083540402835291602001916115f5565b820191906000526020600020905b8154815290600101906020018083116115d857829003601f168201915b505050505081565b61160561299e565b73ffffffffffffffffffffffffffffffffffffffff16611623611e57565b73ffffffffffffffffffffffffffffffffffffffff1614611679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167090614531565b60405180910390fd5b8060088190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90614995565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61177461299e565b73ffffffffffffffffffffffffffffffffffffffff16611792611e57565b73ffffffffffffffffffffffffffffffffffffffff16146117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90614531565b60405180910390fd5b6117f26000613150565b565b6117fc61299e565b73ffffffffffffffffffffffffffffffffffffffff1661181a611e57565b73ffffffffffffffffffffffffffffffffffffffff1614611870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186790614531565b60405180910390fd5b8060098190555050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6118a261299e565b73ffffffffffffffffffffffffffffffffffffffff166118c0611e57565b73ffffffffffffffffffffffffffffffffffffffff1614611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90614531565b60405180910390fd5b60005b81518160ff161015611a1657600d6000838360ff168151811061193f5761193e6149b5565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600d6000848460ff16815181106119aa576119a96149b5565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611a0e906148f9565b915050611919565b5050565b600c60009054906101000a900460ff16611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6090614753565b60405180910390fd5b600760149054906101000a900460ff1660ff166005600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ad591906149e4565b60ff161115611b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1090614a67565b60405180910390fd5b6008546005600054611b2b9190614a87565b10611b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6290614b29565b60405180910390fd5b6000600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611bc89190613ca4565b602060405180830381865afa158015611be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c099190614860565b90506000811180611c635750600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611d605760006064605a600954611c7b9190614b49565b611c859190614bd2565b90506000600582611c969190614b49565b9050803414611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd1906148d9565b60405180910390fd5b611ce5336005613132565b6005600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611d4191906149e4565b92506101000a81548160ff021916908360ff1602179055505050611e54565b60006064605a600a54611d739190614b49565b611d7d9190614bd2565b90506000600582611d8e9190614b49565b9050803414611dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc9906148d9565b60405180910390fd5b611ddd336005613132565b6005600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611e3991906149e4565b92506101000a81548160ff021916908360ff16021790555050505b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611e909061429a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ebc9061429a565b8015611f095780601f10611ede57610100808354040283529160200191611f09565b820191906000526020600020905b815481529060010190602001808311611eec57829003601f168201915b5050505050905090565b611f1b61299e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8090614c4f565b60405180910390fd5b8060066000611f9661299e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661204361299e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120889190613ad7565b60405180910390a35050565b61209f848484612a58565b6120ab84848484613216565b6120ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e190614ce1565b60405180910390fd5b50505050565b60606120fb82612991565b61213a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213190614d73565b60405180910390fd5b600061214461339e565b90506000815114156121655760405180602001604052806000815250612190565b8061216f84613430565b604051602001612180929190614e1b565b6040516020818303038152906040525b915050919050565b6121a061299e565b73ffffffffffffffffffffffffffffffffffffffff166121be611e57565b73ffffffffffffffffffffffffffffffffffffffff1614612214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220b90614531565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b60085481565b600c60009054906101000a900460ff16612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90614753565b60405180910390fd5b600760149054906101000a900460ff1660ff16600a600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661230191906149e4565b60ff161115612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233c90614a67565b60405180910390fd5b600854600a6000546123579190614a87565b10612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238e90614b29565b60405180910390fd5b6000600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016123f49190613ca4565b602060405180830381865afa158015612411573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124359190614860565b9050600081118061248f5750600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561258c576000606460506009546124a79190614b49565b6124b19190614bd2565b90506000600a826124c29190614b49565b9050803414612506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fd906148d9565b60405180910390fd5b61251133600a613132565b600a600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661256d91906149e4565b92506101000a81548160ff021916908360ff1602179055505050612680565b600060646050600a5461259f9190614b49565b6125a99190614bd2565b90506000600a826125ba9190614b49565b90508034146125fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f5906148d9565b60405180910390fd5b61260933600a613132565b600a600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661266591906149e4565b92506101000a81548160ff021916908360ff16021790555050505b50565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61271f61299e565b73ffffffffffffffffffffffffffffffffffffffff1661273d611e57565b73ffffffffffffffffffffffffffffffffffffffff1614612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a90614531565b60405180910390fd5b80600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6127df61299e565b73ffffffffffffffffffffffffffffffffffffffff166127fd611e57565b73ffffffffffffffffffffffffffffffffffffffff1614612853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a90614531565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90614ebc565b60405180910390fd5b6128cc81613150565b50565b600760149054906101000a900460ff1681565b600a5481565b600c60009054906101000a900460ff1681565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612a6382612f98565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612a8a61299e565b73ffffffffffffffffffffffffffffffffffffffff161480612ae65750612aaf61299e565b73ffffffffffffffffffffffffffffffffffffffff16612ace84610aef565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b025750612b018260000151612afc61299e565b612683565b5b905080612b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3b90614f4e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bad90614fe0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1d90615072565b60405180910390fd5b612c338585856001613591565b612c4360008484600001516129a6565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f2857612e8781612991565b15612f275782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f918585856001613597565b5050505050565b612fa06139c6565b612fa982612991565b612fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdf90615104565b60405180910390fd5b60008290505b600081106130f1576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130e257809250505061312d565b50808060019003915050612fee565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312490615196565b60405180910390fd5b919050565b61314c82826040518060200160405280600081525061359d565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006132378473ffffffffffffffffffffffffffffffffffffffff166135af565b15613391578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261326061299e565b8786866040518563ffffffff1660e01b8152600401613282949392919061520b565b6020604051808303816000875af19250505080156132be57506040513d601f19601f820116820180604052508101906132bb919061526c565b60015b613341573d80600081146132ee576040519150601f19603f3d011682016040523d82523d6000602084013e6132f3565b606091505b50600081511415613339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333090614ce1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613396565b600190505b949350505050565b6060600b80546133ad9061429a565b80601f01602080910402602001604051908101604052809291908181526020018280546133d99061429a565b80156134265780601f106133fb57610100808354040283529160200191613426565b820191906000526020600020905b81548152906001019060200180831161340957829003601f168201915b5050505050905090565b60606000821415613478576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061358c565b600082905060005b600082146134aa57808061349390615299565b915050600a826134a39190614bd2565b9150613480565b60008167ffffffffffffffff8111156134c6576134c5613d86565b5b6040519080825280601f01601f1916602001820160405280156134f85781602001600182028036833780820191505090505b5090505b600085146135855760018261351191906144b1565b9150600a8561352091906152e2565b603061352c9190614a87565b60f81b818381518110613542576135416149b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561357e9190614bd2565b94506134fc565b8093505050505b919050565b50505050565b50505050565b6135aa83838360016135c2565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362f90615385565b60405180910390fd5b600084141561367c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367390615417565b60405180910390fd5b6136896000868387613591565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561392357818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561390e576138ce6000888488613216565b61390d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390490614ce1565b60405180910390fd5b5b81806001019250508080600101915050613857565b5080600081905550506139396000868387613597565b5050505050565b82805461394c9061429a565b90600052602060002090601f01602090048101928261396e57600085556139b5565b82601f1061398757805160ff19168380011785556139b5565b828001600101855582156139b5579182015b828111156139b4578251825591602001919060010190613999565b5b5090506139c29190613a00565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613a19576000816000905550600101613a01565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a5c82613a31565b9050919050565b613a6c81613a51565b8114613a7757600080fd5b50565b600081359050613a8981613a63565b92915050565b600060208284031215613aa557613aa4613a27565b5b6000613ab384828501613a7a565b91505092915050565b60008115159050919050565b613ad181613abc565b82525050565b6000602082019050613aec6000830184613ac8565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b2781613af2565b8114613b3257600080fd5b50565b600081359050613b4481613b1e565b92915050565b600060208284031215613b6057613b5f613a27565b5b6000613b6e84828501613b35565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613bb1578082015181840152602081019050613b96565b83811115613bc0576000848401525b50505050565b6000601f19601f8301169050919050565b6000613be282613b77565b613bec8185613b82565b9350613bfc818560208601613b93565b613c0581613bc6565b840191505092915050565b60006020820190508181036000830152613c2a8184613bd7565b905092915050565b6000819050919050565b613c4581613c32565b8114613c5057600080fd5b50565b600081359050613c6281613c3c565b92915050565b600060208284031215613c7e57613c7d613a27565b5b6000613c8c84828501613c53565b91505092915050565b613c9e81613a51565b82525050565b6000602082019050613cb96000830184613c95565b92915050565b60008060408385031215613cd657613cd5613a27565b5b6000613ce485828601613a7a565b9250506020613cf585828601613c53565b9150509250929050565b613d0881613c32565b82525050565b6000602082019050613d236000830184613cff565b92915050565b600080600060608486031215613d4257613d41613a27565b5b6000613d5086828701613a7a565b9350506020613d6186828701613a7a565b9250506040613d7286828701613c53565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613dbe82613bc6565b810181811067ffffffffffffffff82111715613ddd57613ddc613d86565b5b80604052505050565b6000613df0613a1d565b9050613dfc8282613db5565b919050565b600067ffffffffffffffff821115613e1c57613e1b613d86565b5b613e2582613bc6565b9050602081019050919050565b82818337600083830152505050565b6000613e54613e4f84613e01565b613de6565b905082815260208101848484011115613e7057613e6f613d81565b5b613e7b848285613e32565b509392505050565b600082601f830112613e9857613e97613d7c565b5b8135613ea8848260208601613e41565b91505092915050565b600060208284031215613ec757613ec6613a27565b5b600082013567ffffffffffffffff811115613ee557613ee4613a2c565b5b613ef184828501613e83565b91505092915050565b600060ff82169050919050565b613f1081613efa565b8114613f1b57600080fd5b50565b600081359050613f2d81613f07565b92915050565b600060208284031215613f4957613f48613a27565b5b6000613f5784828501613f1e565b91505092915050565b613f6981613efa565b82525050565b6000602082019050613f846000830184613f60565b92915050565b600067ffffffffffffffff821115613fa557613fa4613d86565b5b602082029050602081019050919050565b600080fd5b6000613fce613fc984613f8a565b613de6565b90508083825260208201905060208402830185811115613ff157613ff0613fb6565b5b835b8181101561401a57806140068882613a7a565b845260208401935050602081019050613ff3565b5050509392505050565b600082601f83011261403957614038613d7c565b5b8135614049848260208601613fbb565b91505092915050565b60006020828403121561406857614067613a27565b5b600082013567ffffffffffffffff81111561408657614085613a2c565b5b61409284828501614024565b91505092915050565b6140a481613abc565b81146140af57600080fd5b50565b6000813590506140c18161409b565b92915050565b600080604083850312156140de576140dd613a27565b5b60006140ec85828601613a7a565b92505060206140fd858286016140b2565b9150509250929050565b600067ffffffffffffffff82111561412257614121613d86565b5b61412b82613bc6565b9050602081019050919050565b600061414b61414684614107565b613de6565b90508281526020810184848401111561416757614166613d81565b5b614172848285613e32565b509392505050565b600082601f83011261418f5761418e613d7c565b5b813561419f848260208601614138565b91505092915050565b600080600080608085870312156141c2576141c1613a27565b5b60006141d087828801613a7a565b94505060206141e187828801613a7a565b93505060406141f287828801613c53565b925050606085013567ffffffffffffffff81111561421357614212613a2c565b5b61421f8782880161417a565b91505092959194509250565b6000806040838503121561424257614241613a27565b5b600061425085828601613a7a565b925050602061426185828601613a7a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806142b257607f821691505b602082108114156142c6576142c561426b565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614328602d83613b82565b9150614333826142cc565b604082019050919050565b600060208201905081810360008301526143578161431b565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006143ba602283613b82565b91506143c58261435e565b604082019050919050565b600060208201905081810360008301526143e9816143ad565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b600061444c603983613b82565b9150614457826143f0565b604082019050919050565b6000602082019050818103600083015261447b8161443f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144bc82613c32565b91506144c783613c32565b9250828210156144da576144d9614482565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061451b602083613b82565b9150614526826144e5565b602082019050919050565b6000602082019050818103600083015261454a8161450e565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006145ad602283613b82565b91506145b882614551565b604082019050919050565b600060208201905081810360008301526145dc816145a0565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061463f602e83613b82565b915061464a826145e3565b604082019050919050565b6000602082019050818103600083015261466e81614632565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b60006146d1602383613b82565b91506146dc82614675565b604082019050919050565b60006020820190508181036000830152614700816146c4565b9050919050565b7f53616c65206e6f74206163746976652100000000000000000000000000000000600082015250565b600061473d601083613b82565b915061474882614707565b602082019050919050565b6000602082019050818103600083015261476c81614730565b9050919050565b7f4d696e74206c696d697420726561636865642100000000000000000000000000600082015250565b60006147a9601383613b82565b91506147b482614773565b602082019050919050565b600060208201905081810360008301526147d88161479c565b9050919050565b7f53616c652066696e697368656421000000000000000000000000000000000000600082015250565b6000614815600e83613b82565b9150614820826147df565b602082019050919050565b6000602082019050818103600083015261484481614808565b9050919050565b60008151905061485a81613c3c565b92915050565b60006020828403121561487657614875613a27565b5b60006148848482850161484b565b91505092915050565b7f496e636f72726563742076616c75652100000000000000000000000000000000600082015250565b60006148c3601083613b82565b91506148ce8261488d565b602082019050919050565b600060208201905081810360008301526148f2816148b6565b9050919050565b600061490482613efa565b915060ff82141561491857614917614482565b5b600182019050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b600061497f602b83613b82565b915061498a82614923565b604082019050919050565b600060208201905081810360008301526149ae81614972565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006149ef82613efa565b91506149fa83613efa565b92508260ff03821115614a1057614a0f614482565b5b828201905092915050565b7f45786365656473206d696e74206c696d69742100000000000000000000000000600082015250565b6000614a51601383613b82565b9150614a5c82614a1b565b602082019050919050565b60006020820190508181036000830152614a8081614a44565b9050919050565b6000614a9282613c32565b9150614a9d83613c32565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ad257614ad1614482565b5b828201905092915050565b7f4e6f7420656e6f75676820746f6b656e73210000000000000000000000000000600082015250565b6000614b13601283613b82565b9150614b1e82614add565b602082019050919050565b60006020820190508181036000830152614b4281614b06565b9050919050565b6000614b5482613c32565b9150614b5f83613c32565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b9857614b97614482565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614bdd82613c32565b9150614be883613c32565b925082614bf857614bf7614ba3565b5b828204905092915050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614c39601a83613b82565b9150614c4482614c03565b602082019050919050565b60006020820190508181036000830152614c6881614c2c565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614ccb603383613b82565b9150614cd682614c6f565b604082019050919050565b60006020820190508181036000830152614cfa81614cbe565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614d5d602f83613b82565b9150614d6882614d01565b604082019050919050565b60006020820190508181036000830152614d8c81614d50565b9050919050565b600081905092915050565b6000614da982613b77565b614db38185614d93565b9350614dc3818560208601613b93565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614e05600583614d93565b9150614e1082614dcf565b600582019050919050565b6000614e278285614d9e565b9150614e338284614d9e565b9150614e3e82614df8565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ea6602683613b82565b9150614eb182614e4a565b604082019050919050565b60006020820190508181036000830152614ed581614e99565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614f38603283613b82565b9150614f4382614edc565b604082019050919050565b60006020820190508181036000830152614f6781614f2b565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000614fca602683613b82565b9150614fd582614f6e565b604082019050919050565b60006020820190508181036000830152614ff981614fbd565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061505c602583613b82565b915061506782615000565b604082019050919050565b6000602082019050818103600083015261508b8161504f565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006150ee602a83613b82565b91506150f982615092565b604082019050919050565b6000602082019050818103600083015261511d816150e1565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615180602f83613b82565b915061518b82615124565b604082019050919050565b600060208201905081810360008301526151af81615173565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006151dd826151b6565b6151e781856151c1565b93506151f7818560208601613b93565b61520081613bc6565b840191505092915050565b60006080820190506152206000830187613c95565b61522d6020830186613c95565b61523a6040830185613cff565b818103606083015261524c81846151d2565b905095945050505050565b60008151905061526681613b1e565b92915050565b60006020828403121561528257615281613a27565b5b600061529084828501615257565b91505092915050565b60006152a482613c32565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152d7576152d6614482565b5b600182019050919050565b60006152ed82613c32565b91506152f883613c32565b92508261530857615307614ba3565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061536f602183613b82565b915061537a82615313565b604082019050919050565b6000602082019050818103600083015261539e81615362565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000615401602883613b82565b915061540c826153a5565b604082019050919050565b60006020820190508181036000830152615430816153f4565b905091905056fea2646970667358221220e40448b292fc146cac7a941967ce0d9c19fba552f20ec88b159ca1b6775f8b9564736f6c634300080b0033

Deployed Bytecode Sourcemap

38480:4283:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38757:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25342:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27228:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28799:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28320:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23590:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39506:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29675:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24258:1012;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39962:109;;;;;;;;;;;;;:::i;:::-;;29908:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23771:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39848:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27037:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39613:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40187:703;;;:::i;:::-;;38667:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38939:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25778:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4374:103;;;;;;;;;;;;;:::i;:::-;;39379:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38808:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39152:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40898:924;;;:::i;:::-;;3723:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27397:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29085:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30156:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27572:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39752:88;;;;;;;;;;;;;:::i;:::-;;38576:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41830:930;;;:::i;:::-;;29444:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39046:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4632:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38539:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38637:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38697:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38728:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38604:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38757:44;;;;;;;;;;;;;;;;;;;;;;:::o;25342:372::-;25444:4;25496:25;25481:40;;;:11;:40;;;;:105;;;;25553:33;25538:48;;;:11;:48;;;;25481:105;:172;;;;25618:35;25603:50;;;:11;:50;;;;25481:172;:225;;;;25670:36;25694:11;25670:23;:36::i;:::-;25481:225;25461:245;;25342:372;;;:::o;27228:100::-;27282:13;27315:5;27308:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27228:100;:::o;28799:214::-;28867:7;28895:16;28903:7;28895;:16::i;:::-;28887:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28981:15;:24;28997:7;28981:24;;;;;;;;;;;;;;;;;;;;;28974:31;;28799:214;;;:::o;28320:413::-;28393:13;28409:24;28425:7;28409:15;:24::i;:::-;28393:40;;28458:5;28452:11;;:2;:11;;;;28444:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28553:5;28537:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28562:37;28579:5;28586:12;:10;:12::i;:::-;28562:16;:37::i;:::-;28537:62;28515:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;28697:28;28706:2;28710:7;28719:5;28697:8;:28::i;:::-;28382:351;28320:413;;:::o;23590:104::-;23643:7;23685:1;23670:12;;:16;;;;:::i;:::-;23663:23;;23590:104;:::o;39506:99::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39587:10:::1;39575:9;:22;;;;39506:99:::0;:::o;29675:162::-;29801:28;29811:4;29817:2;29821:7;29801:9;:28::i;:::-;29675:162;;;:::o;24258:1012::-;24347:7;24383:16;24393:5;24383:9;:16::i;:::-;24375:5;:24;24367:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24449:22;24474:13;:11;:13::i;:::-;24449:38;;24498:19;24528:25;24722:9;24717:466;24737:14;24733:1;:18;24717:466;;;24777:31;24811:11;:14;24823:1;24811:14;;;;;;;;;;;24777:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24874:1;24848:28;;:9;:14;;;:28;;;24844:111;;24921:9;:14;;;24901:34;;24844:111;24998:5;24977:26;;:17;:26;;;24973:195;;;25047:5;25032:11;:20;25028:85;;;25088:1;25081:8;;;;;;;;;25028:85;25135:13;;;;;;;24973:195;24758:425;24753:3;;;;;;;24717:466;;;;25206:56;;;;;;;;;;:::i;:::-;;;;;;;;24258:1012;;;;;:::o;39962:109::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40020:10:::1;40012:28;;:51;40041:21;40012:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;39962:109::o:0;29908:177::-;30038:39;30055:4;30061:2;30065:7;30038:39;;;;;;;;;;;;:16;:39::i;:::-;29908:177;;;:::o;23771:187::-;23838:7;23874:13;:11;:13::i;:::-;23866:5;:21;23858:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23945:5;23938:12;;23771:187;;;:::o;39848:106::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39935:11:::1;39925:7;:21;;;;;;;;;;;;:::i;:::-;;39848:106:::0;:::o;27037:124::-;27101:7;27128:20;27140:7;27128:11;:20::i;:::-;:25;;;27121:32;;27037:124;;;:::o;39613:131::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39718:18:::1;39698:17;;:38;;;;;;;;;;;;;;;;;;39613:131:::0;:::o;40187:703::-;40241:10;;;;;;;;;;;40233:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;40325:17;;;;;;;;;;;40291:51;;:19;:31;40311:10;40291:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;40283:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;40400:9;;40385:12;;:24;40377:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;40439:12;40462:5;;;;;;;;;;;40454:24;;;40479:10;40454:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40439:51;;40514:1;40504:7;:11;:39;;;;40519:12;:24;40532:10;40519:24;;;;;;;;;;;;;;;;;;;;;;;;;40504:39;40501:382;;;40580:14;;40567:9;:27;40559:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;40630:24;40640:10;40652:1;40630:9;:24::i;:::-;40669:19;:31;40689:10;40669:31;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;40501:382;;;40754:9;;40741;:22;40733:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;40799:24;40809:10;40821:1;40799:9;:24::i;:::-;40838:19;:31;40858:10;40838:31;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;40501:382;40222:668;40187:703::o;38667:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38939:99::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39020:10:::1;39008:9;:22;;;;38939:99:::0;:::o;25778:221::-;25842:7;25887:1;25870:19;;:5;:19;;;;25862:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;25963:12;:19;25976:5;25963:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25955:36;;25948:43;;25778:221;;;:::o;4374:103::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4439:30:::1;4466:1;4439:18;:30::i;:::-;4374:103::o:0;39379:119::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39475:15:::1;39458:14;:32;;;;39379:119:::0;:::o;38808:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;39152:219::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39240:7:::1;39236:128;39253:11;:18;39251:1;:20;;;39236:128;;;39324:12;:28;39337:11;39349:1;39337:14;;;;;;;;;;:::i;:::-;;;;;;;;39324:28;;;;;;;;;;;;;;;;;;;;;;;;;39323:29;39292:12;:28;39305:11;39317:1;39305:14;;;;;;;;;;:::i;:::-;;;;;;;;39292:28;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;39273:3;;;;;:::i;:::-;;;;39236:128;;;;39152:219:::0;:::o;40898:924::-;40953:10;;;;;;;;;;;40945:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;41042:17;;;;;;;;;;;41003:56;;41037:1;41003:19;:31;41023:10;41003:31;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:56;;;;40995:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;41121:9;;41117:1;41102:12;;:16;;;;:::i;:::-;:28;41094:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;41164:12;41187:5;;;;;;;;;;;41179:24;;;41204:10;41179:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41164:51;;41239:1;41229:7;:11;:39;;;;41244:12;:24;41257:10;41244:24;;;;;;;;;;;;;;;;;;;;;;;;;41229:39;41226:589;;;41284:20;41329:3;41324:2;41307:14;;:19;;;;:::i;:::-;:25;;;;:::i;:::-;41284:48;;41347:10;41378:1;41360:15;:19;;;;:::i;:::-;41347:32;;41415:5;41402:9;:18;41394:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;41456:24;41466:10;41478:1;41456:9;:24::i;:::-;41529:1;41495:19;:31;41515:10;41495:31;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41269:273;;41226:589;;;41562:20;41602:3;41597:2;41585:9;;:14;;;;:::i;:::-;:20;;;;:::i;:::-;41562:43;;41620:10;41651:1;41633:15;:19;;;;:::i;:::-;41620:32;;41688:5;41675:9;:18;41667:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;41729:24;41739:10;41751:1;41729:9;:24::i;:::-;41802:1;41768:19;:31;41788:10;41768:31;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41546:269;;41226:589;40934:888;40898:924::o;3723:87::-;3769:7;3796:6;;;;;;;;;;;3789:13;;3723:87;:::o;27397:104::-;27453:13;27486:7;27479:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27397:104;:::o;29085:288::-;29192:12;:10;:12::i;:::-;29180:24;;:8;:24;;;;29172:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29293:8;29248:18;:32;29267:12;:10;:12::i;:::-;29248:32;;;;;;;;;;;;;;;:42;29281:8;29248:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29346:8;29317:48;;29332:12;:10;:12::i;:::-;29317:48;;;29356:8;29317:48;;;;;;:::i;:::-;;;;;;;;29085:288;;:::o;30156:355::-;30315:28;30325:4;30331:2;30335:7;30315:9;:28::i;:::-;30376:48;30399:4;30405:2;30409:7;30418:5;30376:22;:48::i;:::-;30354:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;30156:355;;;;:::o;27572:344::-;27645:13;27679:16;27687:7;27679;:16::i;:::-;27671:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;27760:21;27784:10;:8;:10::i;:::-;27760:34;;27837:1;27818:7;27812:21;:26;;:96;;;;;;;;;;;;;;;;;27865:7;27874:18;:7;:16;:18::i;:::-;27848:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27812:96;27805:103;;;27572:344;;;:::o;39752:88::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39822:10:::1;;;;;;;;;;;39821:11;39808:10;;:24;;;;;;;;;;;;;;;;;;39752:88::o:0;38576:21::-;;;;:::o;41830:930::-;41884:10;;;;;;;;;;;41876:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;41974:17;;;;;;;;;;;41934:57;;41968:2;41934:19;:31;41954:10;41934:31;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:57;;;;41926:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;42054:9;;42049:2;42034:12;;:17;;;;:::i;:::-;:29;42026:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;42097:12;42120:5;;;;;;;;;;;42112:24;;;42137:10;42112:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42097:51;;42172:1;42162:7;:11;:39;;;;42177:12;:24;42190:10;42177:24;;;;;;;;;;;;;;;;;;;;;;;;;42162:39;42159:594;;;42217:20;42262:3;42257:2;42240:14;;:19;;;;:::i;:::-;:25;;;;:::i;:::-;42217:48;;42280:10;42311:2;42293:15;:20;;;;:::i;:::-;42280:33;;42349:5;42336:9;:18;42328:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;42390:25;42400:10;42412:2;42390:9;:25::i;:::-;42464:2;42430:19;:31;42450:10;42430:31;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42202:276;;42159:594;;;42497:20;42537:3;42532:2;42520:9;;:14;;;;:::i;:::-;:20;;;;:::i;:::-;42497:43;;42555:10;42586:2;42568:15;:20;;;;:::i;:::-;42555:33;;42624:5;42611:9;:18;42603:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;42665:25;42675:10;42687:2;42665:9;:25::i;:::-;42739:2;42705:19;:31;42725:10;42705:31;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42482:271;;42159:594;41865:895;41830:930::o;29444:164::-;29541:4;29565:18;:25;29584:5;29565:25;;;;;;;;;;;;;;;:35;29591:8;29565:35;;;;;;;;;;;;;;;;;;;;;;;;;29558:42;;29444:164;;;;:::o;39046:98::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39130:6:::1;39122:5;;:14;;;;;;;;;;;;;;;;;;39046:98:::0;:::o;4632:201::-;3954:12;:10;:12::i;:::-;3943:23;;:7;:5;:7::i;:::-;:23;;;3935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4741:1:::1;4721:22;;:8;:22;;;;4713:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4797:28;4816:8;4797:18;:28::i;:::-;4632:201:::0;:::o;38539:30::-;;;;;;;;;;;;;:::o;38637:21::-;;;;:::o;38697:22::-;;;;;;;;;;;;;:::o;38728:20::-;;;;;;;;;;;;;:::o;38604:26::-;;;;:::o;15513:157::-;15598:4;15637:25;15622:40;;;:11;:40;;;;15615:47;;15513:157;;;:::o;30766:111::-;30823:4;30857:12;;30847:7;:22;30840:29;;30766:111;;;:::o;2590:98::-;2643:7;2670:10;2663:17;;2590:98;:::o;35691:196::-;35833:2;35806:15;:24;35822:7;35806:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35871:7;35867:2;35851:28;;35860:5;35851:28;;;;;;;;;;;;35691:196;;;:::o;33566:2007::-;33681:35;33719:20;33731:7;33719:11;:20::i;:::-;33681:58;;33752:22;33794:13;:18;;;33778:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;33853:12;:10;:12::i;:::-;33829:36;;:20;33841:7;33829:11;:20::i;:::-;:36;;;33778:87;:154;;;;33882:50;33899:13;:18;;;33919:12;:10;:12::i;:::-;33882:16;:50::i;:::-;33778:154;33752:181;;33954:17;33946:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;34069:4;34047:26;;:13;:18;;;:26;;;34039:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;34149:1;34135:16;;:2;:16;;;;34127:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34206:43;34228:4;34234:2;34238:7;34247:1;34206:21;:43::i;:::-;34314:49;34331:1;34335:7;34344:13;:18;;;34314:8;:49::i;:::-;34694:1;34664:12;:18;34677:4;34664:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34738:1;34710:12;:16;34723:2;34710:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34784:2;34756:11;:20;34768:7;34756:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;34846:15;34801:11;:20;34813:7;34801:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;35114:19;35146:1;35136:7;:11;35114:33;;35207:1;35166:43;;:11;:24;35178:11;35166:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;35162:295;;;35234:20;35242:11;35234:7;:20::i;:::-;35230:212;;;35311:13;:18;;;35279:11;:24;35291:11;35279:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;35394:13;:28;;;35352:11;:24;35364:11;35352:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;35230:212;35162:295;34639:829;35504:7;35500:2;35485:27;;35494:4;35485:27;;;;;;;;;;;;35523:42;35544:4;35550:2;35554:7;35563:1;35523:20;:42::i;:::-;33670:1903;;33566:2007;;;:::o;26438:537::-;26499:21;;:::i;:::-;26541:16;26549:7;26541;:16::i;:::-;26533:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26647:12;26662:7;26647:22;;26642:245;26679:1;26671:4;:9;26642:245;;26709:31;26743:11;:17;26755:4;26743:17;;;;;;;;;;;26709:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26809:1;26783:28;;:9;:14;;;:28;;;26779:93;;26843:9;26836:16;;;;;;26779:93;26690:197;26682:6;;;;;;;;26642:245;;;;26910:57;;;;;;;;;;:::i;:::-;;;;;;;;26438:537;;;;:::o;30885:104::-;30954:27;30964:2;30968:8;30954:27;;;;;;;;;;;;:9;:27::i;:::-;30885:104;;:::o;4993:191::-;5067:16;5086:6;;;;;;;;;;;5067:25;;5112:8;5103:6;;:17;;;;;;;;;;;;;;;;;;5167:8;5136:40;;5157:8;5136:40;;;;;;;;;;;;5056:128;4993:191;:::o;36452:804::-;36607:4;36628:15;:2;:13;;;:15::i;:::-;36624:625;;;36680:2;36664:36;;;36701:12;:10;:12::i;:::-;36715:4;36721:7;36730:5;36664:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36660:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36927:1;36910:6;:13;:18;36906:273;;;36953:61;;;;;;;;;;:::i;:::-;;;;;;;;36906:273;37129:6;37123:13;37114:6;37110:2;37106:15;37099:38;36660:534;36797:45;;;36787:55;;;:6;:55;;;;36780:62;;;;;36624:625;37233:4;37226:11;;36452:804;;;;;;;:::o;40079:100::-;40131:13;40164:7;40157:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40079:100;:::o;289:723::-;345:13;575:1;566:5;:10;562:53;;;593:10;;;;;;;;;;;;;;;;;;;;;562:53;625:12;640:5;625:20;;656:14;681:78;696:1;688:4;:9;681:78;;714:8;;;;;:::i;:::-;;;;745:2;737:10;;;;;:::i;:::-;;;681:78;;;769:19;801:6;791:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;769:39;;819:154;835:1;826:5;:10;819:154;;863:1;853:11;;;;;:::i;:::-;;;930:2;922:5;:10;;;;:::i;:::-;909:2;:24;;;;:::i;:::-;896:39;;879:6;886;879:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;959:2;950:11;;;;;:::i;:::-;;;819:154;;;997:6;983:21;;;;;289:723;;;;:::o;37744:159::-;;;;;:::o;38315:158::-;;;;;:::o;31352:163::-;31475:32;31481:2;31485:8;31495:5;31502:4;31475:5;:32::i;:::-;31352:163;;;:::o;5872:387::-;5932:4;6140:12;6207:7;6195:20;6187:28;;6250:1;6243:4;:8;6236:15;;;5872:387;;;:::o;31774:1538::-;31913:20;31936:12;;31913:35;;31981:1;31967:16;;:2;:16;;;;31959:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32052:1;32040:8;:13;;32032:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32111:61;32141:1;32145:2;32149:12;32163:8;32111:21;:61::i;:::-;32486:8;32450:12;:16;32463:2;32450:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32551:8;32510:12;:16;32523:2;32510:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32610:2;32577:11;:25;32589:12;32577:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32677:15;32627:11;:25;32639:12;32627:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32710:20;32733:12;32710:35;;32767:9;32762:415;32782:8;32778:1;:12;32762:415;;;32846:12;32842:2;32821:38;;32838:1;32821:38;;;;;;;;;;;;32882:4;32878:249;;;32945:59;32976:1;32980:2;32984:12;32998:5;32945:22;:59::i;:::-;32911:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;32878:249;33147:14;;;;;;;32792:3;;;;;;;32762:415;;;;33208:12;33193;:27;;;;32425:807;33244:60;33273:1;33277:2;33281:12;33295:8;33244:20;:60::i;:::-;31902:1410;31774:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:90::-;1210:7;1253:5;1246:13;1239:21;1228:32;;1176:90;;;:::o;1272:109::-;1353:21;1368:5;1353:21;:::i;:::-;1348:3;1341:34;1272:109;;:::o;1387:210::-;1474:4;1512:2;1501:9;1497:18;1489:26;;1525:65;1587:1;1576:9;1572:17;1563:6;1525:65;:::i;:::-;1387:210;;;;:::o;1603:149::-;1639:7;1679:66;1672:5;1668:78;1657:89;;1603:149;;;:::o;1758:120::-;1830:23;1847:5;1830:23;:::i;:::-;1823:5;1820:34;1810:62;;1868:1;1865;1858:12;1810:62;1758:120;:::o;1884:137::-;1929:5;1967:6;1954:20;1945:29;;1983:32;2009:5;1983:32;:::i;:::-;1884:137;;;;:::o;2027:327::-;2085:6;2134:2;2122:9;2113:7;2109:23;2105:32;2102:119;;;2140:79;;:::i;:::-;2102:119;2260:1;2285:52;2329:7;2320:6;2309:9;2305:22;2285:52;:::i;:::-;2275:62;;2231:116;2027:327;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:86::-;8906:7;8946:4;8939:5;8935:16;8924:27;;8871:86;;;:::o;8963:118::-;9034:22;9050:5;9034:22;:::i;:::-;9027:5;9024:33;9014:61;;9071:1;9068;9061:12;9014:61;8963:118;:::o;9087:135::-;9131:5;9169:6;9156:20;9147:29;;9185:31;9210:5;9185:31;:::i;:::-;9087:135;;;;:::o;9228:325::-;9285:6;9334:2;9322:9;9313:7;9309:23;9305:32;9302:119;;;9340:79;;:::i;:::-;9302:119;9460:1;9485:51;9528:7;9519:6;9508:9;9504:22;9485:51;:::i;:::-;9475:61;;9431:115;9228:325;;;;:::o;9559:112::-;9642:22;9658:5;9642:22;:::i;:::-;9637:3;9630:35;9559:112;;:::o;9677:214::-;9766:4;9804:2;9793:9;9789:18;9781:26;;9817:67;9881:1;9870:9;9866:17;9857:6;9817:67;:::i;:::-;9677:214;;;;:::o;9897:311::-;9974:4;10064:18;10056:6;10053:30;10050:56;;;10086:18;;:::i;:::-;10050:56;10136:4;10128:6;10124:17;10116:25;;10196:4;10190;10186:15;10178:23;;9897:311;;;:::o;10214:117::-;10323:1;10320;10313:12;10354:710;10450:5;10475:81;10491:64;10548:6;10491:64;:::i;:::-;10475:81;:::i;:::-;10466:90;;10576:5;10605:6;10598:5;10591:21;10639:4;10632:5;10628:16;10621:23;;10692:4;10684:6;10680:17;10672:6;10668:30;10721:3;10713:6;10710:15;10707:122;;;10740:79;;:::i;:::-;10707:122;10855:6;10838:220;10872:6;10867:3;10864:15;10838:220;;;10947:3;10976:37;11009:3;10997:10;10976:37;:::i;:::-;10971:3;10964:50;11043:4;11038:3;11034:14;11027:21;;10914:144;10898:4;10893:3;10889:14;10882:21;;10838:220;;;10842:21;10456:608;;10354:710;;;;;:::o;11087:370::-;11158:5;11207:3;11200:4;11192:6;11188:17;11184:27;11174:122;;11215:79;;:::i;:::-;11174:122;11332:6;11319:20;11357:94;11447:3;11439:6;11432:4;11424:6;11420:17;11357:94;:::i;:::-;11348:103;;11164:293;11087:370;;;;:::o;11463:539::-;11547:6;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11750:1;11739:9;11735:17;11722:31;11780:18;11772:6;11769:30;11766:117;;;11802:79;;:::i;:::-;11766:117;11907:78;11977:7;11968:6;11957:9;11953:22;11907:78;:::i;:::-;11897:88;;11693:302;11463:539;;;;:::o;12008:116::-;12078:21;12093:5;12078:21;:::i;:::-;12071:5;12068:32;12058:60;;12114:1;12111;12104:12;12058:60;12008:116;:::o;12130:133::-;12173:5;12211:6;12198:20;12189:29;;12227:30;12251:5;12227:30;:::i;:::-;12130:133;;;;:::o;12269:468::-;12334:6;12342;12391:2;12379:9;12370:7;12366:23;12362:32;12359:119;;;12397:79;;:::i;:::-;12359:119;12517:1;12542:53;12587:7;12578:6;12567:9;12563:22;12542:53;:::i;:::-;12532:63;;12488:117;12644:2;12670:50;12712:7;12703:6;12692:9;12688:22;12670:50;:::i;:::-;12660:60;;12615:115;12269:468;;;;;:::o;12743:307::-;12804:4;12894:18;12886:6;12883:30;12880:56;;;12916:18;;:::i;:::-;12880:56;12954:29;12976:6;12954:29;:::i;:::-;12946:37;;13038:4;13032;13028:15;13020:23;;12743:307;;;:::o;13056:410::-;13133:5;13158:65;13174:48;13215:6;13174:48;:::i;:::-;13158:65;:::i;:::-;13149:74;;13246:6;13239:5;13232:21;13284:4;13277:5;13273:16;13322:3;13313:6;13308:3;13304:16;13301:25;13298:112;;;13329:79;;:::i;:::-;13298:112;13419:41;13453:6;13448:3;13443;13419:41;:::i;:::-;13139:327;13056:410;;;;;:::o;13485:338::-;13540:5;13589:3;13582:4;13574:6;13570:17;13566:27;13556:122;;13597:79;;:::i;:::-;13556:122;13714:6;13701:20;13739:78;13813:3;13805:6;13798:4;13790:6;13786:17;13739:78;:::i;:::-;13730:87;;13546:277;13485:338;;;;:::o;13829:943::-;13924:6;13932;13940;13948;13997:3;13985:9;13976:7;13972:23;13968:33;13965:120;;;14004:79;;:::i;:::-;13965:120;14124:1;14149:53;14194:7;14185:6;14174:9;14170:22;14149:53;:::i;:::-;14139:63;;14095:117;14251:2;14277:53;14322:7;14313:6;14302:9;14298:22;14277:53;:::i;:::-;14267:63;;14222:118;14379:2;14405:53;14450:7;14441:6;14430:9;14426:22;14405:53;:::i;:::-;14395:63;;14350:118;14535:2;14524:9;14520:18;14507:32;14566:18;14558:6;14555:30;14552:117;;;14588:79;;:::i;:::-;14552:117;14693:62;14747:7;14738:6;14727:9;14723:22;14693:62;:::i;:::-;14683:72;;14478:287;13829:943;;;;;;;:::o;14778:474::-;14846:6;14854;14903:2;14891:9;14882:7;14878:23;14874:32;14871:119;;;14909:79;;:::i;:::-;14871:119;15029:1;15054:53;15099:7;15090:6;15079:9;15075:22;15054:53;:::i;:::-;15044:63;;15000:117;15156:2;15182:53;15227:7;15218:6;15207:9;15203:22;15182:53;:::i;:::-;15172:63;;15127:118;14778:474;;;;;:::o;15258:180::-;15306:77;15303:1;15296:88;15403:4;15400:1;15393:15;15427:4;15424:1;15417:15;15444:320;15488:6;15525:1;15519:4;15515:12;15505:22;;15572:1;15566:4;15562:12;15593:18;15583:81;;15649:4;15641:6;15637:17;15627:27;;15583:81;15711:2;15703:6;15700:14;15680:18;15677:38;15674:84;;;15730:18;;:::i;:::-;15674:84;15495:269;15444:320;;;:::o;15770:232::-;15910:34;15906:1;15898:6;15894:14;15887:58;15979:15;15974:2;15966:6;15962:15;15955:40;15770:232;:::o;16008:366::-;16150:3;16171:67;16235:2;16230:3;16171:67;:::i;:::-;16164:74;;16247:93;16336:3;16247:93;:::i;:::-;16365:2;16360:3;16356:12;16349:19;;16008:366;;;:::o;16380:419::-;16546:4;16584:2;16573:9;16569:18;16561:26;;16633:9;16627:4;16623:20;16619:1;16608:9;16604:17;16597:47;16661:131;16787:4;16661:131;:::i;:::-;16653:139;;16380:419;;;:::o;16805:221::-;16945:34;16941:1;16933:6;16929:14;16922:58;17014:4;17009:2;17001:6;16997:15;16990:29;16805:221;:::o;17032:366::-;17174:3;17195:67;17259:2;17254:3;17195:67;:::i;:::-;17188:74;;17271:93;17360:3;17271:93;:::i;:::-;17389:2;17384:3;17380:12;17373:19;;17032:366;;;:::o;17404:419::-;17570:4;17608:2;17597:9;17593:18;17585:26;;17657:9;17651:4;17647:20;17643:1;17632:9;17628:17;17621:47;17685:131;17811:4;17685:131;:::i;:::-;17677:139;;17404:419;;;:::o;17829:244::-;17969:34;17965:1;17957:6;17953:14;17946:58;18038:27;18033:2;18025:6;18021:15;18014:52;17829:244;:::o;18079:366::-;18221:3;18242:67;18306:2;18301:3;18242:67;:::i;:::-;18235:74;;18318:93;18407:3;18318:93;:::i;:::-;18436:2;18431:3;18427:12;18420:19;;18079:366;;;:::o;18451:419::-;18617:4;18655:2;18644:9;18640:18;18632:26;;18704:9;18698:4;18694:20;18690:1;18679:9;18675:17;18668:47;18732:131;18858:4;18732:131;:::i;:::-;18724:139;;18451:419;;;:::o;18876:180::-;18924:77;18921:1;18914:88;19021:4;19018:1;19011:15;19045:4;19042:1;19035:15;19062:191;19102:4;19122:20;19140:1;19122:20;:::i;:::-;19117:25;;19156:20;19174:1;19156:20;:::i;:::-;19151:25;;19195:1;19192;19189:8;19186:34;;;19200:18;;:::i;:::-;19186:34;19245:1;19242;19238:9;19230:17;;19062:191;;;;:::o;19259:182::-;19399:34;19395:1;19387:6;19383:14;19376:58;19259:182;:::o;19447:366::-;19589:3;19610:67;19674:2;19669:3;19610:67;:::i;:::-;19603:74;;19686:93;19775:3;19686:93;:::i;:::-;19804:2;19799:3;19795:12;19788:19;;19447:366;;;:::o;19819:419::-;19985:4;20023:2;20012:9;20008:18;20000:26;;20072:9;20066:4;20062:20;20058:1;20047:9;20043:17;20036:47;20100:131;20226:4;20100:131;:::i;:::-;20092:139;;19819:419;;;:::o;20244:221::-;20384:34;20380:1;20372:6;20368:14;20361:58;20453:4;20448:2;20440:6;20436:15;20429:29;20244:221;:::o;20471:366::-;20613:3;20634:67;20698:2;20693:3;20634:67;:::i;:::-;20627:74;;20710:93;20799:3;20710:93;:::i;:::-;20828:2;20823:3;20819:12;20812:19;;20471:366;;;:::o;20843:419::-;21009:4;21047:2;21036:9;21032:18;21024:26;;21096:9;21090:4;21086:20;21082:1;21071:9;21067:17;21060:47;21124:131;21250:4;21124:131;:::i;:::-;21116:139;;20843:419;;;:::o;21268:233::-;21408:34;21404:1;21396:6;21392:14;21385:58;21477:16;21472:2;21464:6;21460:15;21453:41;21268:233;:::o;21507:366::-;21649:3;21670:67;21734:2;21729:3;21670:67;:::i;:::-;21663:74;;21746:93;21835:3;21746:93;:::i;:::-;21864:2;21859:3;21855:12;21848:19;;21507:366;;;:::o;21879:419::-;22045:4;22083:2;22072:9;22068:18;22060:26;;22132:9;22126:4;22122:20;22118:1;22107:9;22103:17;22096:47;22160:131;22286:4;22160:131;:::i;:::-;22152:139;;21879:419;;;:::o;22304:222::-;22444:34;22440:1;22432:6;22428:14;22421:58;22513:5;22508:2;22500:6;22496:15;22489:30;22304:222;:::o;22532:366::-;22674:3;22695:67;22759:2;22754:3;22695:67;:::i;:::-;22688:74;;22771:93;22860:3;22771:93;:::i;:::-;22889:2;22884:3;22880:12;22873:19;;22532:366;;;:::o;22904:419::-;23070:4;23108:2;23097:9;23093:18;23085:26;;23157:9;23151:4;23147:20;23143:1;23132:9;23128:17;23121:47;23185:131;23311:4;23185:131;:::i;:::-;23177:139;;22904:419;;;:::o;23329:166::-;23469:18;23465:1;23457:6;23453:14;23446:42;23329:166;:::o;23501:366::-;23643:3;23664:67;23728:2;23723:3;23664:67;:::i;:::-;23657:74;;23740:93;23829:3;23740:93;:::i;:::-;23858:2;23853:3;23849:12;23842:19;;23501:366;;;:::o;23873:419::-;24039:4;24077:2;24066:9;24062:18;24054:26;;24126:9;24120:4;24116:20;24112:1;24101:9;24097:17;24090:47;24154:131;24280:4;24154:131;:::i;:::-;24146:139;;23873:419;;;:::o;24298:169::-;24438:21;24434:1;24426:6;24422:14;24415:45;24298:169;:::o;24473:366::-;24615:3;24636:67;24700:2;24695:3;24636:67;:::i;:::-;24629:74;;24712:93;24801:3;24712:93;:::i;:::-;24830:2;24825:3;24821:12;24814:19;;24473:366;;;:::o;24845:419::-;25011:4;25049:2;25038:9;25034:18;25026:26;;25098:9;25092:4;25088:20;25084:1;25073:9;25069:17;25062:47;25126:131;25252:4;25126:131;:::i;:::-;25118:139;;24845:419;;;:::o;25270:164::-;25410:16;25406:1;25398:6;25394:14;25387:40;25270:164;:::o;25440:366::-;25582:3;25603:67;25667:2;25662:3;25603:67;:::i;:::-;25596:74;;25679:93;25768:3;25679:93;:::i;:::-;25797:2;25792:3;25788:12;25781:19;;25440:366;;;:::o;25812:419::-;25978:4;26016:2;26005:9;26001:18;25993:26;;26065:9;26059:4;26055:20;26051:1;26040:9;26036:17;26029:47;26093:131;26219:4;26093:131;:::i;:::-;26085:139;;25812:419;;;:::o;26237:143::-;26294:5;26325:6;26319:13;26310:22;;26341:33;26368:5;26341:33;:::i;:::-;26237:143;;;;:::o;26386:351::-;26456:6;26505:2;26493:9;26484:7;26480:23;26476:32;26473:119;;;26511:79;;:::i;:::-;26473:119;26631:1;26656:64;26712:7;26703:6;26692:9;26688:22;26656:64;:::i;:::-;26646:74;;26602:128;26386:351;;;;:::o;26743:166::-;26883:18;26879:1;26871:6;26867:14;26860:42;26743:166;:::o;26915:366::-;27057:3;27078:67;27142:2;27137:3;27078:67;:::i;:::-;27071:74;;27154:93;27243:3;27154:93;:::i;:::-;27272:2;27267:3;27263:12;27256:19;;26915:366;;;:::o;27287:419::-;27453:4;27491:2;27480:9;27476:18;27468:26;;27540:9;27534:4;27530:20;27526:1;27515:9;27511:17;27504:47;27568:131;27694:4;27568:131;:::i;:::-;27560:139;;27287:419;;;:::o;27712:167::-;27749:3;27772:22;27788:5;27772:22;:::i;:::-;27763:31;;27816:4;27809:5;27806:15;27803:41;;;27824:18;;:::i;:::-;27803:41;27871:1;27864:5;27860:13;27853:20;;27712:167;;;:::o;27885:230::-;28025:34;28021:1;28013:6;28009:14;28002:58;28094:13;28089:2;28081:6;28077:15;28070:38;27885:230;:::o;28121:366::-;28263:3;28284:67;28348:2;28343:3;28284:67;:::i;:::-;28277:74;;28360:93;28449:3;28360:93;:::i;:::-;28478:2;28473:3;28469:12;28462:19;;28121:366;;;:::o;28493:419::-;28659:4;28697:2;28686:9;28682:18;28674:26;;28746:9;28740:4;28736:20;28732:1;28721:9;28717:17;28710:47;28774:131;28900:4;28774:131;:::i;:::-;28766:139;;28493:419;;;:::o;28918:180::-;28966:77;28963:1;28956:88;29063:4;29060:1;29053:15;29087:4;29084:1;29077:15;29104:237;29142:3;29161:18;29177:1;29161:18;:::i;:::-;29156:23;;29193:18;29209:1;29193:18;:::i;:::-;29188:23;;29283:1;29277:4;29273:12;29270:1;29267:19;29264:45;;;29289:18;;:::i;:::-;29264:45;29333:1;29330;29326:9;29319:16;;29104:237;;;;:::o;29347:169::-;29487:21;29483:1;29475:6;29471:14;29464:45;29347:169;:::o;29522:366::-;29664:3;29685:67;29749:2;29744:3;29685:67;:::i;:::-;29678:74;;29761:93;29850:3;29761:93;:::i;:::-;29879:2;29874:3;29870:12;29863:19;;29522:366;;;:::o;29894:419::-;30060:4;30098:2;30087:9;30083:18;30075:26;;30147:9;30141:4;30137:20;30133:1;30122:9;30118:17;30111:47;30175:131;30301:4;30175:131;:::i;:::-;30167:139;;29894:419;;;:::o;30319:305::-;30359:3;30378:20;30396:1;30378:20;:::i;:::-;30373:25;;30412:20;30430:1;30412:20;:::i;:::-;30407:25;;30566:1;30498:66;30494:74;30491:1;30488:81;30485:107;;;30572:18;;:::i;:::-;30485:107;30616:1;30613;30609:9;30602:16;;30319:305;;;;:::o;30630:168::-;30770:20;30766:1;30758:6;30754:14;30747:44;30630:168;:::o;30804:366::-;30946:3;30967:67;31031:2;31026:3;30967:67;:::i;:::-;30960:74;;31043:93;31132:3;31043:93;:::i;:::-;31161:2;31156:3;31152:12;31145:19;;30804:366;;;:::o;31176:419::-;31342:4;31380:2;31369:9;31365:18;31357:26;;31429:9;31423:4;31419:20;31415:1;31404:9;31400:17;31393:47;31457:131;31583:4;31457:131;:::i;:::-;31449:139;;31176:419;;;:::o;31601:348::-;31641:7;31664:20;31682:1;31664:20;:::i;:::-;31659:25;;31698:20;31716:1;31698:20;:::i;:::-;31693:25;;31886:1;31818:66;31814:74;31811:1;31808:81;31803:1;31796:9;31789:17;31785:105;31782:131;;;31893:18;;:::i;:::-;31782:131;31941:1;31938;31934:9;31923:20;;31601:348;;;;:::o;31955:180::-;32003:77;32000:1;31993:88;32100:4;32097:1;32090:15;32124:4;32121:1;32114:15;32141:185;32181:1;32198:20;32216:1;32198:20;:::i;:::-;32193:25;;32232:20;32250:1;32232:20;:::i;:::-;32227:25;;32271:1;32261:35;;32276:18;;:::i;:::-;32261:35;32318:1;32315;32311:9;32306:14;;32141:185;;;;:::o;32332:176::-;32472:28;32468:1;32460:6;32456:14;32449:52;32332:176;:::o;32514:366::-;32656:3;32677:67;32741:2;32736:3;32677:67;:::i;:::-;32670:74;;32753:93;32842:3;32753:93;:::i;:::-;32871:2;32866:3;32862:12;32855:19;;32514:366;;;:::o;32886:419::-;33052:4;33090:2;33079:9;33075:18;33067:26;;33139:9;33133:4;33129:20;33125:1;33114:9;33110:17;33103:47;33167:131;33293:4;33167:131;:::i;:::-;33159:139;;32886:419;;;:::o;33311:238::-;33451:34;33447:1;33439:6;33435:14;33428:58;33520:21;33515:2;33507:6;33503:15;33496:46;33311:238;:::o;33555:366::-;33697:3;33718:67;33782:2;33777:3;33718:67;:::i;:::-;33711:74;;33794:93;33883:3;33794:93;:::i;:::-;33912:2;33907:3;33903:12;33896:19;;33555:366;;;:::o;33927:419::-;34093:4;34131:2;34120:9;34116:18;34108:26;;34180:9;34174:4;34170:20;34166:1;34155:9;34151:17;34144:47;34208:131;34334:4;34208:131;:::i;:::-;34200:139;;33927:419;;;:::o;34352:234::-;34492:34;34488:1;34480:6;34476:14;34469:58;34561:17;34556:2;34548:6;34544:15;34537:42;34352:234;:::o;34592:366::-;34734:3;34755:67;34819:2;34814:3;34755:67;:::i;:::-;34748:74;;34831:93;34920:3;34831:93;:::i;:::-;34949:2;34944:3;34940:12;34933:19;;34592:366;;;:::o;34964:419::-;35130:4;35168:2;35157:9;35153:18;35145:26;;35217:9;35211:4;35207:20;35203:1;35192:9;35188:17;35181:47;35245:131;35371:4;35245:131;:::i;:::-;35237:139;;34964:419;;;:::o;35389:148::-;35491:11;35528:3;35513:18;;35389:148;;;;:::o;35543:377::-;35649:3;35677:39;35710:5;35677:39;:::i;:::-;35732:89;35814:6;35809:3;35732:89;:::i;:::-;35725:96;;35830:52;35875:6;35870:3;35863:4;35856:5;35852:16;35830:52;:::i;:::-;35907:6;35902:3;35898:16;35891:23;;35653:267;35543:377;;;;:::o;35926:155::-;36066:7;36062:1;36054:6;36050:14;36043:31;35926:155;:::o;36087:400::-;36247:3;36268:84;36350:1;36345:3;36268:84;:::i;:::-;36261:91;;36361:93;36450:3;36361:93;:::i;:::-;36479:1;36474:3;36470:11;36463:18;;36087:400;;;:::o;36493:701::-;36774:3;36796:95;36887:3;36878:6;36796:95;:::i;:::-;36789:102;;36908:95;36999:3;36990:6;36908:95;:::i;:::-;36901:102;;37020:148;37164:3;37020:148;:::i;:::-;37013:155;;37185:3;37178:10;;36493:701;;;;;:::o;37200:225::-;37340:34;37336:1;37328:6;37324:14;37317:58;37409:8;37404:2;37396:6;37392:15;37385:33;37200:225;:::o;37431:366::-;37573:3;37594:67;37658:2;37653:3;37594:67;:::i;:::-;37587:74;;37670:93;37759:3;37670:93;:::i;:::-;37788:2;37783:3;37779:12;37772:19;;37431:366;;;:::o;37803:419::-;37969:4;38007:2;37996:9;37992:18;37984:26;;38056:9;38050:4;38046:20;38042:1;38031:9;38027:17;38020:47;38084:131;38210:4;38084:131;:::i;:::-;38076:139;;37803:419;;;:::o;38228:237::-;38368:34;38364:1;38356:6;38352:14;38345:58;38437:20;38432:2;38424:6;38420:15;38413:45;38228:237;:::o;38471:366::-;38613:3;38634:67;38698:2;38693:3;38634:67;:::i;:::-;38627:74;;38710:93;38799:3;38710:93;:::i;:::-;38828:2;38823:3;38819:12;38812:19;;38471:366;;;:::o;38843:419::-;39009:4;39047:2;39036:9;39032:18;39024:26;;39096:9;39090:4;39086:20;39082:1;39071:9;39067:17;39060:47;39124:131;39250:4;39124:131;:::i;:::-;39116:139;;38843:419;;;:::o;39268:225::-;39408:34;39404:1;39396:6;39392:14;39385:58;39477:8;39472:2;39464:6;39460:15;39453:33;39268:225;:::o;39499:366::-;39641:3;39662:67;39726:2;39721:3;39662:67;:::i;:::-;39655:74;;39738:93;39827:3;39738:93;:::i;:::-;39856:2;39851:3;39847:12;39840:19;;39499:366;;;:::o;39871:419::-;40037:4;40075:2;40064:9;40060:18;40052:26;;40124:9;40118:4;40114:20;40110:1;40099:9;40095:17;40088:47;40152:131;40278:4;40152:131;:::i;:::-;40144:139;;39871:419;;;:::o;40296:224::-;40436:34;40432:1;40424:6;40420:14;40413:58;40505:7;40500:2;40492:6;40488:15;40481:32;40296:224;:::o;40526:366::-;40668:3;40689:67;40753:2;40748:3;40689:67;:::i;:::-;40682:74;;40765:93;40854:3;40765:93;:::i;:::-;40883:2;40878:3;40874:12;40867:19;;40526:366;;;:::o;40898:419::-;41064:4;41102:2;41091:9;41087:18;41079:26;;41151:9;41145:4;41141:20;41137:1;41126:9;41122:17;41115:47;41179:131;41305:4;41179:131;:::i;:::-;41171:139;;40898:419;;;:::o;41323:229::-;41463:34;41459:1;41451:6;41447:14;41440:58;41532:12;41527:2;41519:6;41515:15;41508:37;41323:229;:::o;41558:366::-;41700:3;41721:67;41785:2;41780:3;41721:67;:::i;:::-;41714:74;;41797:93;41886:3;41797:93;:::i;:::-;41915:2;41910:3;41906:12;41899:19;;41558:366;;;:::o;41930:419::-;42096:4;42134:2;42123:9;42119:18;42111:26;;42183:9;42177:4;42173:20;42169:1;42158:9;42154:17;42147:47;42211:131;42337:4;42211:131;:::i;:::-;42203:139;;41930:419;;;:::o;42355:234::-;42495:34;42491:1;42483:6;42479:14;42472:58;42564:17;42559:2;42551:6;42547:15;42540:42;42355:234;:::o;42595:366::-;42737:3;42758:67;42822:2;42817:3;42758:67;:::i;:::-;42751:74;;42834:93;42923:3;42834:93;:::i;:::-;42952:2;42947:3;42943:12;42936:19;;42595:366;;;:::o;42967:419::-;43133:4;43171:2;43160:9;43156:18;43148:26;;43220:9;43214:4;43210:20;43206:1;43195:9;43191:17;43184:47;43248:131;43374:4;43248:131;:::i;:::-;43240:139;;42967:419;;;:::o;43392:98::-;43443:6;43477:5;43471:12;43461:22;;43392:98;;;:::o;43496:168::-;43579:11;43613:6;43608:3;43601:19;43653:4;43648:3;43644:14;43629:29;;43496:168;;;;:::o;43670:360::-;43756:3;43784:38;43816:5;43784:38;:::i;:::-;43838:70;43901:6;43896:3;43838:70;:::i;:::-;43831:77;;43917:52;43962:6;43957:3;43950:4;43943:5;43939:16;43917:52;:::i;:::-;43994:29;44016:6;43994:29;:::i;:::-;43989:3;43985:39;43978:46;;43760:270;43670:360;;;;:::o;44036:640::-;44231:4;44269:3;44258:9;44254:19;44246:27;;44283:71;44351:1;44340:9;44336:17;44327:6;44283:71;:::i;:::-;44364:72;44432:2;44421:9;44417:18;44408:6;44364:72;:::i;:::-;44446;44514:2;44503:9;44499:18;44490:6;44446:72;:::i;:::-;44565:9;44559:4;44555:20;44550:2;44539:9;44535:18;44528:48;44593:76;44664:4;44655:6;44593:76;:::i;:::-;44585:84;;44036:640;;;;;;;:::o;44682:141::-;44738:5;44769:6;44763:13;44754:22;;44785:32;44811:5;44785:32;:::i;:::-;44682:141;;;;:::o;44829:349::-;44898:6;44947:2;44935:9;44926:7;44922:23;44918:32;44915:119;;;44953:79;;:::i;:::-;44915:119;45073:1;45098:63;45153:7;45144:6;45133:9;45129:22;45098:63;:::i;:::-;45088:73;;45044:127;44829:349;;;;:::o;45184:233::-;45223:3;45246:24;45264:5;45246:24;:::i;:::-;45237:33;;45292:66;45285:5;45282:77;45279:103;;;45362:18;;:::i;:::-;45279:103;45409:1;45402:5;45398:13;45391:20;;45184:233;;;:::o;45423:176::-;45455:1;45472:20;45490:1;45472:20;:::i;:::-;45467:25;;45506:20;45524:1;45506:20;:::i;:::-;45501:25;;45545:1;45535:35;;45550:18;;:::i;:::-;45535:35;45591:1;45588;45584:9;45579:14;;45423:176;;;;:::o;45605:220::-;45745:34;45741:1;45733:6;45729:14;45722:58;45814:3;45809:2;45801:6;45797:15;45790:28;45605:220;:::o;45831:366::-;45973:3;45994:67;46058:2;46053:3;45994:67;:::i;:::-;45987:74;;46070:93;46159:3;46070:93;:::i;:::-;46188:2;46183:3;46179:12;46172:19;;45831:366;;;:::o;46203:419::-;46369:4;46407:2;46396:9;46392:18;46384:26;;46456:9;46450:4;46446:20;46442:1;46431:9;46427:17;46420:47;46484:131;46610:4;46484:131;:::i;:::-;46476:139;;46203:419;;;:::o;46628:227::-;46768:34;46764:1;46756:6;46752:14;46745:58;46837:10;46832:2;46824:6;46820:15;46813:35;46628:227;:::o;46861:366::-;47003:3;47024:67;47088:2;47083:3;47024:67;:::i;:::-;47017:74;;47100:93;47189:3;47100:93;:::i;:::-;47218:2;47213:3;47209:12;47202:19;;46861:366;;;:::o;47233:419::-;47399:4;47437:2;47426:9;47422:18;47414:26;;47486:9;47480:4;47476:20;47472:1;47461:9;47457:17;47450:47;47514:131;47640:4;47514:131;:::i;:::-;47506:139;;47233:419;;;:::o

Swarm Source

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