ETH Price: $3,410.83 (-1.51%)
Gas: 5 Gwei

Token

ViralataFunk Camarote Bonde (VFCB)
 

Overview

Max Total Supply

10,000 VFCB

Holders

1,794

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 VFCB
0x663c759793c279dc6ac39d956ff041bd6732eada
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:
ViralataFunkCamaroteBonde

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library Counters {
    struct Counter {

        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {

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

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

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

pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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


pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;


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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;


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

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

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


pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


pragma solidity >=0.7.0 <0.9.0;




contract ViralataFunkCamaroteBonde is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;


struct Whitelist {
        uint256 amount;
        bool claimed;
    }

    mapping(address => Whitelist) private _whitelist;

    Counters.Counter private supply;

    string public uriPrefix = "";
    string public uriSuffix = ".json";
    string public hiddenMetadataUri;

    uint256 public cost = 0.075 ether;
    uint256 public maxSupply = 10000;
    uint256 public maxMintAmountPerTx = 10;

    bool public paused = false;
    bool public revealed = false;

    constructor() ERC721("ViralataFunk Camarote Bonde", "VFCB") {
        setHiddenMetadataUri(
            "ipfs://QmQUaYdoyJtv8FLMbBHw1bmp5394W85RRQd2KtVgfpCJzR/hidden.json"
        );
    }

    modifier mintCompliance(uint256 _mintAmount) {
        require(
            _mintAmount > 0 && _mintAmount <= maxMintAmountPerTx,
            "Invalid mint amount!"
        );
        require(
            supply.current() + _mintAmount <= maxSupply,
            "Max supply exceeded!"
        );
        _;
    }
    
    modifier claimCompliance() {
        require(
            _whitelist[msg.sender].amount > 0,
            "Not whitelisted!"
        );
        require(
            !_whitelist[msg.sender].claimed,
            "Already claimed!"
        );
        require(
            supply.current() + _whitelist[msg.sender].amount <= maxSupply,
            "Max supply exceeded!"
        );
        _;
    }
   
    function totalSupply() public view returns (uint256) {
        return supply.current();
    }

    function mint(uint256 _mintAmount)
        public
        payable
        mintCompliance(_mintAmount)
    {
        require(!paused, "The contract is paused!");
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");

        _mintLoop(msg.sender, _mintAmount);
    }

    function claim()
        public 
        claimCompliance()
    {        
        require(!paused, "The contract is paused!");
        _whitelist[msg.sender].claimed = true;
        _mintLoop(msg.sender, _whitelist[msg.sender].amount);
    }
function isWhitelisted(address _address
    ) public view returns (bool) {   
        return _whitelist[_address].amount > 0;
    }

    function hasClaimed(address _address
    ) public view returns (bool) {   
        return _whitelist[_address].claimed;
    }

    function addToWhitelist(
        address[] calldata _address,
        uint256[] calldata _amount
    ) public onlyOwner {
        require(_address.length < 255, "Invalid length");
        require(_address.length == _amount.length, "Invalid arrays");

        for (uint256 i = 0; i < _address.length; i++) {
            require(
            _whitelist[_address[i]].amount == 0,
            "Already whitelisted!"
            );
            _whitelist[_address[i]].claimed = false;
            _whitelist[_address[i]].amount = _amount[i];
        }
    }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _mintLoop(_receiver, _mintAmount);
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

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

    if (revealed == false) {
      return hiddenMetadataUri;
    }

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

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

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

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

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

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":"_address","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"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":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600990805190602001906200002b92919062000368565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200007992919062000368565b5067010a741a46278000600c55612710600d55600a600e556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff021916908315150217905550348015620000d457600080fd5b506040518060400160405280601b81526020017f566972616c61746146756e6b2043616d61726f746520426f6e646500000000008152506040518060400160405280600481526020017f564643420000000000000000000000000000000000000000000000000000000081525081600090805190602001906200015992919062000368565b5080600190805190602001906200017292919062000368565b5050506200019562000189620001c560201b60201c565b620001cd60201b60201c565b620001bf6040518060800160405280604181526020016200517b604191396200029360201b60201c565b62000500565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a3620001c560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c96200033e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000319906200043f565b60405180910390fd5b80600b90805190602001906200033a92919062000368565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003769062000472565b90600052602060002090601f0160209004810192826200039a5760008555620003e6565b82601f10620003b557805160ff1916838001178555620003e6565b82800160010185558215620003e6579182015b82811115620003e5578251825591602001919060010190620003c8565b5b509050620003f59190620003f9565b5090565b5b8082111562000414576000816000905550600101620003fa565b5090565b60006200042760208362000461565b91506200043482620004d7565b602082019050919050565b600060208201905081810360008301526200045a8162000418565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200048b57607f821691505b60208210811415620004a257620004a1620004a8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614c6b80620005106000396000f3fe60806040526004361061023b5760003560e01c80636352211e1161012e578063a45ba8e7116100ab578063e0a808531161006f578063e0a8085314610850578063e985e9c514610879578063efbd73f4146108b6578063f2fde38b146108df578063f8d50542146109085761023b565b8063a45ba8e71461076b578063b071401b14610796578063b88d4fde146107bf578063c87b56dd146107e8578063d5abeb01146108255761023b565b80638da5cb5b116100f25780638da5cb5b146106a557806394354fd0146106d057806395d89b41146106fb578063a0712d6814610726578063a22cb465146107425761023b565b80636352211e146105ae57806370a08231146105eb578063715018a61461062857806373b2e80e1461063f5780637ec4a6591461067c5761023b565b80633ccfd60b116101bc5780634fdd43cb116101805780634fdd43cb146104d957806351830227146105025780635503a0e81461052d5780635c975abb1461055857806362b99ad4146105835761023b565b80633ccfd60b1461041c57806342842e0e14610433578063438b63001461045c57806344a0d68a146104995780634e71d92d146104c25761023b565b806316ba10e01161020357806316ba10e01461033957806316c38b3c1461036257806318160ddd1461038b57806323b872dd146103b65780633af32abf146103df5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e557806313faede61461030e575b600080fd5b34801561024c57600080fd5b506102676004803603810190610262919061366f565b610931565b6040516102749190613db0565b60405180910390f35b34801561028957600080fd5b50610292610a13565b60405161029f9190613dcb565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613712565b610aa5565b6040516102dc9190613d27565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613581565b610b2a565b005b34801561031a57600080fd5b50610323610c42565b604051610330919061410d565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b91906136c9565b610c48565b005b34801561036e57600080fd5b5061038960048036038101906103849190613642565b610cde565b005b34801561039757600080fd5b506103a0610d77565b6040516103ad919061410d565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d8919061346b565b610d88565b005b3480156103eb57600080fd5b50610406600480360381019061040191906133fe565b610de8565b6040516104139190613db0565b60405180910390f35b34801561042857600080fd5b50610431610e36565b005b34801561043f57600080fd5b5061045a6004803603810190610455919061346b565b610f32565b005b34801561046857600080fd5b50610483600480360381019061047e91906133fe565b610f52565b6040516104909190613d8e565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190613712565b61105d565b005b3480156104ce57600080fd5b506104d76110e3565b005b3480156104e557600080fd5b5061050060048036038101906104fb91906136c9565b61138c565b005b34801561050e57600080fd5b50610517611422565b6040516105249190613db0565b60405180910390f35b34801561053957600080fd5b50610542611435565b60405161054f9190613dcb565b60405180910390f35b34801561056457600080fd5b5061056d6114c3565b60405161057a9190613db0565b60405180910390f35b34801561058f57600080fd5b506105986114d6565b6040516105a59190613dcb565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190613712565b611564565b6040516105e29190613d27565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d91906133fe565b611616565b60405161061f919061410d565b60405180910390f35b34801561063457600080fd5b5061063d6116ce565b005b34801561064b57600080fd5b50610666600480360381019061066191906133fe565b611756565b6040516106739190613db0565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e91906136c9565b6117af565b005b3480156106b157600080fd5b506106ba611845565b6040516106c79190613d27565b60405180910390f35b3480156106dc57600080fd5b506106e561186f565b6040516106f2919061410d565b60405180910390f35b34801561070757600080fd5b50610710611875565b60405161071d9190613dcb565b60405180910390f35b610740600480360381019061073b9190613712565b611907565b005b34801561074e57600080fd5b5061076960048036038101906107649190613541565b611a60565b005b34801561077757600080fd5b50610780611a76565b60405161078d9190613dcb565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b89190613712565b611b04565b005b3480156107cb57600080fd5b506107e660048036038101906107e191906134be565b611b8a565b005b3480156107f457600080fd5b5061080f600480360381019061080a9190613712565b611bec565b60405161081c9190613dcb565b60405180910390f35b34801561083157600080fd5b5061083a611d45565b604051610847919061410d565b60405180910390f35b34801561085c57600080fd5b5061087760048036038101906108729190613642565b611d4b565b005b34801561088557600080fd5b506108a0600480360381019061089b919061342b565b611de4565b6040516108ad9190613db0565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d8919061373f565b611e78565b005b3480156108eb57600080fd5b50610906600480360381019061090191906133fe565b611fae565b005b34801561091457600080fd5b5061092f600480360381019061092a91906135c1565b6120a6565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109fc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a0c5750610a0b8261238d565b5b9050919050565b606060008054610a2290614416565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4e90614416565b8015610a9b5780601f10610a7057610100808354040283529160200191610a9b565b820191906000526020600020905b815481529060010190602001808311610a7e57829003601f168201915b5050505050905090565b6000610ab0826123f7565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae69061400d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3582611564565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d9061408d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc5612463565b73ffffffffffffffffffffffffffffffffffffffff161480610bf45750610bf381610bee612463565b611de4565b5b610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90613f6d565b60405180910390fd5b610c3d838361246b565b505050565b600c5481565b610c50612463565b73ffffffffffffffffffffffffffffffffffffffff16610c6e611845565b73ffffffffffffffffffffffffffffffffffffffff1614610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb9061402d565b60405180910390fd5b80600a9080519060200190610cda929190613166565b5050565b610ce6612463565b73ffffffffffffffffffffffffffffffffffffffff16610d04611845565b73ffffffffffffffffffffffffffffffffffffffff1614610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d519061402d565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000610d836008612524565b905090565b610d99610d93612463565b82612532565b610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf906140cd565b60405180910390fd5b610de3838383612610565b505050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154119050919050565b610e3e612463565b73ffffffffffffffffffffffffffffffffffffffff16610e5c611845565b73ffffffffffffffffffffffffffffffffffffffff1614610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea99061402d565b60405180910390fd5b6000610ebc611845565b73ffffffffffffffffffffffffffffffffffffffff1647604051610edf90613d12565b60006040518083038185875af1925050503d8060008114610f1c576040519150601f19603f3d011682016040523d82523d6000602084013e610f21565b606091505b5050905080610f2f57600080fd5b50565b610f4d83838360405180602001604052806000815250611b8a565b505050565b60606000610f5f83611616565b905060008167ffffffffffffffff811115610f7d57610f7c6145af565b5b604051908082528060200260200182016040528015610fab5781602001602082028036833780820191505090505b50905060006001905060005b8381108015610fc85750600d548211155b15611051576000610fd883611564565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561103d578284838151811061102257611021614580565b5b602002602001018181525050818061103990614479565b9250505b828061104890614479565b93505050610fb7565b82945050505050919050565b611065612463565b73ffffffffffffffffffffffffffffffffffffffff16611083611845565b73ffffffffffffffffffffffffffffffffffffffff16146110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d09061402d565b60405180910390fd5b80600c8190555050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90613e8d565b60405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16156111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90613e2d565b60405180910390fd5b600d54600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546112486008612524565b611252919061424b565b1115611293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128a906140ad565b60405180910390fd5b600f60009054906101000a900460ff16156112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da9061404d565b60405180910390fd5b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555061138a33600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612877565b565b611394612463565b73ffffffffffffffffffffffffffffffffffffffff166113b2611845565b73ffffffffffffffffffffffffffffffffffffffff1614611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ff9061402d565b60405180910390fd5b80600b908051906020019061141e929190613166565b5050565b600f60019054906101000a900460ff1681565b600a805461144290614416565b80601f016020809104026020016040519081016040528092919081815260200182805461146e90614416565b80156114bb5780601f10611490576101008083540402835291602001916114bb565b820191906000526020600020905b81548152906001019060200180831161149e57829003601f168201915b505050505081565b600f60009054906101000a900460ff1681565b600980546114e390614416565b80601f016020809104026020016040519081016040528092919081815260200182805461150f90614416565b801561155c5780601f106115315761010080835404028352916020019161155c565b820191906000526020600020905b81548152906001019060200180831161153f57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561160d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160490613fad565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90613f8d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116d6612463565b73ffffffffffffffffffffffffffffffffffffffff166116f4611845565b73ffffffffffffffffffffffffffffffffffffffff161461174a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117419061402d565b60405180910390fd5b61175460006128b7565b565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff169050919050565b6117b7612463565b73ffffffffffffffffffffffffffffffffffffffff166117d5611845565b73ffffffffffffffffffffffffffffffffffffffff161461182b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118229061402d565b60405180910390fd5b8060099080519060200190611841929190613166565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b60606001805461188490614416565b80601f01602080910402602001604051908101604052809291908181526020018280546118b090614416565b80156118fd5780601f106118d2576101008083540402835291602001916118fd565b820191906000526020600020905b8154815290600101906020018083116118e057829003601f168201915b5050505050905090565b8060008111801561191a5750600e548111155b611959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195090613eed565b60405180910390fd5b600d54816119676008612524565b611971919061424b565b11156119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a9906140ad565b60405180910390fd5b600f60009054906101000a900460ff1615611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f99061404d565b60405180910390fd5b81600c54611a1091906142d2565b341015611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a49906140ed565b60405180910390fd5b611a5c3383612877565b5050565b611a72611a6b612463565b838361297d565b5050565b600b8054611a8390614416565b80601f0160208091040260200160405190810160405280929190818152602001828054611aaf90614416565b8015611afc5780601f10611ad157610100808354040283529160200191611afc565b820191906000526020600020905b815481529060010190602001808311611adf57829003601f168201915b505050505081565b611b0c612463565b73ffffffffffffffffffffffffffffffffffffffff16611b2a611845565b73ffffffffffffffffffffffffffffffffffffffff1614611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b779061402d565b60405180910390fd5b80600e8190555050565b611b9b611b95612463565b83612532565b611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd1906140cd565b60405180910390fd5b611be684848484612aea565b50505050565b6060611bf7826123f7565b611c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2d9061406d565b60405180910390fd5b60001515600f60019054906101000a900460ff1615151415611ce457600b8054611c5f90614416565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8b90614416565b8015611cd85780601f10611cad57610100808354040283529160200191611cd8565b820191906000526020600020905b815481529060010190602001808311611cbb57829003601f168201915b50505050509050611d40565b6000611cee612b46565b90506000815111611d0e5760405180602001604052806000815250611d3c565b80611d1884612bd8565b600a604051602001611d2c93929190613ce1565b6040516020818303038152906040525b9150505b919050565b600d5481565b611d53612463565b73ffffffffffffffffffffffffffffffffffffffff16611d71611845565b73ffffffffffffffffffffffffffffffffffffffff1614611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe9061402d565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611e8b5750600e548111155b611eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec190613eed565b60405180910390fd5b600d5481611ed86008612524565b611ee2919061424b565b1115611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a906140ad565b60405180910390fd5b611f2b612463565b73ffffffffffffffffffffffffffffffffffffffff16611f49611845565b73ffffffffffffffffffffffffffffffffffffffff1614611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f969061402d565b60405180910390fd5b611fa98284612877565b505050565b611fb6612463565b73ffffffffffffffffffffffffffffffffffffffff16611fd4611845565b73ffffffffffffffffffffffffffffffffffffffff161461202a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120219061402d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561209a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209190613e6d565b60405180910390fd5b6120a3816128b7565b50565b6120ae612463565b73ffffffffffffffffffffffffffffffffffffffff166120cc611845565b73ffffffffffffffffffffffffffffffffffffffff1614612122576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121199061402d565b60405180910390fd5b60ff8484905010612168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215f90613e0d565b60405180910390fd5b8181905084849050146121b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a790613ded565b60405180910390fd5b60005b84849050811015612386576000600760008787858181106121d7576121d6614580565b5b90506020020160208101906121ec91906133fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541461226a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226190613fcd565b60405180910390fd5b60006007600087878581811061228357612282614580565b5b905060200201602081019061229891906133fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055508282828181106122ff576122fe614580565b5b905060200201356007600087878581811061231d5761231c614580565b5b905060200201602081019061233291906133fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550808061237e90614479565b9150506121b3565b5050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124de83611564565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600061253d826123f7565b61257c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257390613f4d565b60405180910390fd5b600061258783611564565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125f657508373ffffffffffffffffffffffffffffffffffffffff166125de84610aa5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061260757506126068185611de4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661263082611564565b73ffffffffffffffffffffffffffffffffffffffff1614612686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267d90613ead565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ed90613f0d565b60405180910390fd5b612701838383612d39565b61270c60008261246b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461275c919061432c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b3919061424b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612872838383612d3e565b505050565b60005b818110156128b25761288c6008612d43565b61289f8361289a6008612524565b612d59565b80806128aa90614479565b91505061287a565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e390613f2d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612add9190613db0565b60405180910390a3505050565b612af5848484612610565b612b0184848484612d77565b612b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3790613e4d565b60405180910390fd5b50505050565b606060098054612b5590614416565b80601f0160208091040260200160405190810160405280929190818152602001828054612b8190614416565b8015612bce5780601f10612ba357610100808354040283529160200191612bce565b820191906000526020600020905b815481529060010190602001808311612bb157829003601f168201915b5050505050905090565b60606000821415612c20576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d34565b600082905060005b60008214612c52578080612c3b90614479565b915050600a82612c4b91906142a1565b9150612c28565b60008167ffffffffffffffff811115612c6e57612c6d6145af565b5b6040519080825280601f01601f191660200182016040528015612ca05781602001600182028036833780820191505090505b5090505b60008514612d2d57600182612cb9919061432c565b9150600a85612cc891906144c2565b6030612cd4919061424b565b60f81b818381518110612cea57612ce9614580565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d2691906142a1565b9450612ca4565b8093505050505b919050565b505050565b505050565b6001816000016000828254019250508190555050565b612d73828260405180602001604052806000815250612f0e565b5050565b6000612d988473ffffffffffffffffffffffffffffffffffffffff16612f69565b15612f01578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dc1612463565b8786866040518563ffffffff1660e01b8152600401612de39493929190613d42565b602060405180830381600087803b158015612dfd57600080fd5b505af1925050508015612e2e57506040513d601f19601f82011682018060405250810190612e2b919061369c565b60015b612eb1573d8060008114612e5e576040519150601f19603f3d011682016040523d82523d6000602084013e612e63565b606091505b50600081511415612ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea090613e4d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f06565b600190505b949350505050565b612f188383612f8c565b612f256000848484612d77565b612f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5b90613e4d565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff390613fed565b60405180910390fd5b613005816123f7565b15613045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303c90613ecd565b60405180910390fd5b61305160008383612d39565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130a1919061424b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461316260008383612d3e565b5050565b82805461317290614416565b90600052602060002090601f01602090048101928261319457600085556131db565b82601f106131ad57805160ff19168380011785556131db565b828001600101855582156131db579182015b828111156131da5782518255916020019190600101906131bf565b5b5090506131e891906131ec565b5090565b5b808211156132055760008160009055506001016131ed565b5090565b600061321c6132178461414d565b614128565b905082815260208101848484011115613238576132376145ed565b5b6132438482856143d4565b509392505050565b600061325e6132598461417e565b614128565b90508281526020810184848401111561327a576132796145ed565b5b6132858482856143d4565b509392505050565b60008135905061329c81614bd9565b92915050565b60008083601f8401126132b8576132b76145e3565b5b8235905067ffffffffffffffff8111156132d5576132d46145de565b5b6020830191508360208202830111156132f1576132f06145e8565b5b9250929050565b60008083601f84011261330e5761330d6145e3565b5b8235905067ffffffffffffffff81111561332b5761332a6145de565b5b602083019150836020820283011115613347576133466145e8565b5b9250929050565b60008135905061335d81614bf0565b92915050565b60008135905061337281614c07565b92915050565b60008151905061338781614c07565b92915050565b600082601f8301126133a2576133a16145e3565b5b81356133b2848260208601613209565b91505092915050565b600082601f8301126133d0576133cf6145e3565b5b81356133e084826020860161324b565b91505092915050565b6000813590506133f881614c1e565b92915050565b600060208284031215613414576134136145f7565b5b60006134228482850161328d565b91505092915050565b60008060408385031215613442576134416145f7565b5b60006134508582860161328d565b92505060206134618582860161328d565b9150509250929050565b600080600060608486031215613484576134836145f7565b5b60006134928682870161328d565b93505060206134a38682870161328d565b92505060406134b4868287016133e9565b9150509250925092565b600080600080608085870312156134d8576134d76145f7565b5b60006134e68782880161328d565b94505060206134f78782880161328d565b9350506040613508878288016133e9565b925050606085013567ffffffffffffffff811115613529576135286145f2565b5b6135358782880161338d565b91505092959194509250565b60008060408385031215613558576135576145f7565b5b60006135668582860161328d565b92505060206135778582860161334e565b9150509250929050565b60008060408385031215613598576135976145f7565b5b60006135a68582860161328d565b92505060206135b7858286016133e9565b9150509250929050565b600080600080604085870312156135db576135da6145f7565b5b600085013567ffffffffffffffff8111156135f9576135f86145f2565b5b613605878288016132a2565b9450945050602085013567ffffffffffffffff811115613628576136276145f2565b5b613634878288016132f8565b925092505092959194509250565b600060208284031215613658576136576145f7565b5b60006136668482850161334e565b91505092915050565b600060208284031215613685576136846145f7565b5b600061369384828501613363565b91505092915050565b6000602082840312156136b2576136b16145f7565b5b60006136c084828501613378565b91505092915050565b6000602082840312156136df576136de6145f7565b5b600082013567ffffffffffffffff8111156136fd576136fc6145f2565b5b613709848285016133bb565b91505092915050565b600060208284031215613728576137276145f7565b5b6000613736848285016133e9565b91505092915050565b60008060408385031215613756576137556145f7565b5b6000613764858286016133e9565b92505060206137758582860161328d565b9150509250929050565b600061378b8383613cc3565b60208301905092915050565b6137a081614360565b82525050565b60006137b1826141d4565b6137bb8185614202565b93506137c6836141af565b8060005b838110156137f75781516137de888261377f565b97506137e9836141f5565b9250506001810190506137ca565b5085935050505092915050565b61380d81614372565b82525050565b600061381e826141df565b6138288185614213565b93506138388185602086016143e3565b613841816145fc565b840191505092915050565b6000613857826141ea565b613861818561422f565b93506138718185602086016143e3565b61387a816145fc565b840191505092915050565b6000613890826141ea565b61389a8185614240565b93506138aa8185602086016143e3565b80840191505092915050565b600081546138c381614416565b6138cd8186614240565b945060018216600081146138e857600181146138f95761392c565b60ff1983168652818601935061392c565b613902856141bf565b60005b8381101561392457815481890152600182019150602081019050613905565b838801955050505b50505092915050565b6000613942600e8361422f565b915061394d8261460d565b602082019050919050565b6000613965600e8361422f565b915061397082614636565b602082019050919050565b600061398860108361422f565b91506139938261465f565b602082019050919050565b60006139ab60328361422f565b91506139b682614688565b604082019050919050565b60006139ce60268361422f565b91506139d9826146d7565b604082019050919050565b60006139f160108361422f565b91506139fc82614726565b602082019050919050565b6000613a1460258361422f565b9150613a1f8261474f565b604082019050919050565b6000613a37601c8361422f565b9150613a428261479e565b602082019050919050565b6000613a5a60148361422f565b9150613a65826147c7565b602082019050919050565b6000613a7d60248361422f565b9150613a88826147f0565b604082019050919050565b6000613aa060198361422f565b9150613aab8261483f565b602082019050919050565b6000613ac3602c8361422f565b9150613ace82614868565b604082019050919050565b6000613ae660388361422f565b9150613af1826148b7565b604082019050919050565b6000613b09602a8361422f565b9150613b1482614906565b604082019050919050565b6000613b2c60298361422f565b9150613b3782614955565b604082019050919050565b6000613b4f60148361422f565b9150613b5a826149a4565b602082019050919050565b6000613b7260208361422f565b9150613b7d826149cd565b602082019050919050565b6000613b95602c8361422f565b9150613ba0826149f6565b604082019050919050565b6000613bb860208361422f565b9150613bc382614a45565b602082019050919050565b6000613bdb60178361422f565b9150613be682614a6e565b602082019050919050565b6000613bfe602f8361422f565b9150613c0982614a97565b604082019050919050565b6000613c2160218361422f565b9150613c2c82614ae6565b604082019050919050565b6000613c44600083614224565b9150613c4f82614b35565b600082019050919050565b6000613c6760148361422f565b9150613c7282614b38565b602082019050919050565b6000613c8a60318361422f565b9150613c9582614b61565b604082019050919050565b6000613cad60138361422f565b9150613cb882614bb0565b602082019050919050565b613ccc816143ca565b82525050565b613cdb816143ca565b82525050565b6000613ced8286613885565b9150613cf98285613885565b9150613d0582846138b6565b9150819050949350505050565b6000613d1d82613c37565b9150819050919050565b6000602082019050613d3c6000830184613797565b92915050565b6000608082019050613d576000830187613797565b613d646020830186613797565b613d716040830185613cd2565b8181036060830152613d838184613813565b905095945050505050565b60006020820190508181036000830152613da881846137a6565b905092915050565b6000602082019050613dc56000830184613804565b92915050565b60006020820190508181036000830152613de5818461384c565b905092915050565b60006020820190508181036000830152613e0681613935565b9050919050565b60006020820190508181036000830152613e2681613958565b9050919050565b60006020820190508181036000830152613e468161397b565b9050919050565b60006020820190508181036000830152613e668161399e565b9050919050565b60006020820190508181036000830152613e86816139c1565b9050919050565b60006020820190508181036000830152613ea6816139e4565b9050919050565b60006020820190508181036000830152613ec681613a07565b9050919050565b60006020820190508181036000830152613ee681613a2a565b9050919050565b60006020820190508181036000830152613f0681613a4d565b9050919050565b60006020820190508181036000830152613f2681613a70565b9050919050565b60006020820190508181036000830152613f4681613a93565b9050919050565b60006020820190508181036000830152613f6681613ab6565b9050919050565b60006020820190508181036000830152613f8681613ad9565b9050919050565b60006020820190508181036000830152613fa681613afc565b9050919050565b60006020820190508181036000830152613fc681613b1f565b9050919050565b60006020820190508181036000830152613fe681613b42565b9050919050565b6000602082019050818103600083015261400681613b65565b9050919050565b6000602082019050818103600083015261402681613b88565b9050919050565b6000602082019050818103600083015261404681613bab565b9050919050565b6000602082019050818103600083015261406681613bce565b9050919050565b6000602082019050818103600083015261408681613bf1565b9050919050565b600060208201905081810360008301526140a681613c14565b9050919050565b600060208201905081810360008301526140c681613c5a565b9050919050565b600060208201905081810360008301526140e681613c7d565b9050919050565b6000602082019050818103600083015261410681613ca0565b9050919050565b60006020820190506141226000830184613cd2565b92915050565b6000614132614143565b905061413e8282614448565b919050565b6000604051905090565b600067ffffffffffffffff821115614168576141676145af565b5b614171826145fc565b9050602081019050919050565b600067ffffffffffffffff821115614199576141986145af565b5b6141a2826145fc565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614256826143ca565b9150614261836143ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614296576142956144f3565b5b828201905092915050565b60006142ac826143ca565b91506142b7836143ca565b9250826142c7576142c6614522565b5b828204905092915050565b60006142dd826143ca565b91506142e8836143ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614321576143206144f3565b5b828202905092915050565b6000614337826143ca565b9150614342836143ca565b925082821015614355576143546144f3565b5b828203905092915050565b600061436b826143aa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156144015780820151818401526020810190506143e6565b83811115614410576000848401525b50505050565b6000600282049050600182168061442e57607f821691505b6020821081141561444257614441614551565b5b50919050565b614451826145fc565b810181811067ffffffffffffffff821117156144705761446f6145af565b5b80604052505050565b6000614484826143ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144b7576144b66144f3565b5b600182019050919050565b60006144cd826143ca565b91506144d8836143ca565b9250826144e8576144e7614522565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e76616c696420617272617973000000000000000000000000000000000000600082015250565b7f496e76616c6964206c656e677468000000000000000000000000000000000000600082015250565b7f416c726561647920636c61696d65642100000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f742077686974656c69737465642100000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f416c72656164792077686974656c697374656421000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b614be281614360565b8114614bed57600080fd5b50565b614bf981614372565b8114614c0457600080fd5b50565b614c108161437e565b8114614c1b57600080fd5b50565b614c27816143ca565b8114614c3257600080fd5b5056fea26469706673582212205a6b7ba1f836ad62d240c33dca92433582ef832cf77d714920d0e9157d73112b64736f6c63430008070033697066733a2f2f516d51556159646f794a747638464c4d6242487731626d703533393457383552525164324b7456676670434a7a522f68696464656e2e6a736f6e

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80636352211e1161012e578063a45ba8e7116100ab578063e0a808531161006f578063e0a8085314610850578063e985e9c514610879578063efbd73f4146108b6578063f2fde38b146108df578063f8d50542146109085761023b565b8063a45ba8e71461076b578063b071401b14610796578063b88d4fde146107bf578063c87b56dd146107e8578063d5abeb01146108255761023b565b80638da5cb5b116100f25780638da5cb5b146106a557806394354fd0146106d057806395d89b41146106fb578063a0712d6814610726578063a22cb465146107425761023b565b80636352211e146105ae57806370a08231146105eb578063715018a61461062857806373b2e80e1461063f5780637ec4a6591461067c5761023b565b80633ccfd60b116101bc5780634fdd43cb116101805780634fdd43cb146104d957806351830227146105025780635503a0e81461052d5780635c975abb1461055857806362b99ad4146105835761023b565b80633ccfd60b1461041c57806342842e0e14610433578063438b63001461045c57806344a0d68a146104995780634e71d92d146104c25761023b565b806316ba10e01161020357806316ba10e01461033957806316c38b3c1461036257806318160ddd1461038b57806323b872dd146103b65780633af32abf146103df5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e557806313faede61461030e575b600080fd5b34801561024c57600080fd5b506102676004803603810190610262919061366f565b610931565b6040516102749190613db0565b60405180910390f35b34801561028957600080fd5b50610292610a13565b60405161029f9190613dcb565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613712565b610aa5565b6040516102dc9190613d27565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613581565b610b2a565b005b34801561031a57600080fd5b50610323610c42565b604051610330919061410d565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b91906136c9565b610c48565b005b34801561036e57600080fd5b5061038960048036038101906103849190613642565b610cde565b005b34801561039757600080fd5b506103a0610d77565b6040516103ad919061410d565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d8919061346b565b610d88565b005b3480156103eb57600080fd5b50610406600480360381019061040191906133fe565b610de8565b6040516104139190613db0565b60405180910390f35b34801561042857600080fd5b50610431610e36565b005b34801561043f57600080fd5b5061045a6004803603810190610455919061346b565b610f32565b005b34801561046857600080fd5b50610483600480360381019061047e91906133fe565b610f52565b6040516104909190613d8e565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190613712565b61105d565b005b3480156104ce57600080fd5b506104d76110e3565b005b3480156104e557600080fd5b5061050060048036038101906104fb91906136c9565b61138c565b005b34801561050e57600080fd5b50610517611422565b6040516105249190613db0565b60405180910390f35b34801561053957600080fd5b50610542611435565b60405161054f9190613dcb565b60405180910390f35b34801561056457600080fd5b5061056d6114c3565b60405161057a9190613db0565b60405180910390f35b34801561058f57600080fd5b506105986114d6565b6040516105a59190613dcb565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190613712565b611564565b6040516105e29190613d27565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d91906133fe565b611616565b60405161061f919061410d565b60405180910390f35b34801561063457600080fd5b5061063d6116ce565b005b34801561064b57600080fd5b50610666600480360381019061066191906133fe565b611756565b6040516106739190613db0565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e91906136c9565b6117af565b005b3480156106b157600080fd5b506106ba611845565b6040516106c79190613d27565b60405180910390f35b3480156106dc57600080fd5b506106e561186f565b6040516106f2919061410d565b60405180910390f35b34801561070757600080fd5b50610710611875565b60405161071d9190613dcb565b60405180910390f35b610740600480360381019061073b9190613712565b611907565b005b34801561074e57600080fd5b5061076960048036038101906107649190613541565b611a60565b005b34801561077757600080fd5b50610780611a76565b60405161078d9190613dcb565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b89190613712565b611b04565b005b3480156107cb57600080fd5b506107e660048036038101906107e191906134be565b611b8a565b005b3480156107f457600080fd5b5061080f600480360381019061080a9190613712565b611bec565b60405161081c9190613dcb565b60405180910390f35b34801561083157600080fd5b5061083a611d45565b604051610847919061410d565b60405180910390f35b34801561085c57600080fd5b5061087760048036038101906108729190613642565b611d4b565b005b34801561088557600080fd5b506108a0600480360381019061089b919061342b565b611de4565b6040516108ad9190613db0565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d8919061373f565b611e78565b005b3480156108eb57600080fd5b50610906600480360381019061090191906133fe565b611fae565b005b34801561091457600080fd5b5061092f600480360381019061092a91906135c1565b6120a6565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109fc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a0c5750610a0b8261238d565b5b9050919050565b606060008054610a2290614416565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4e90614416565b8015610a9b5780601f10610a7057610100808354040283529160200191610a9b565b820191906000526020600020905b815481529060010190602001808311610a7e57829003601f168201915b5050505050905090565b6000610ab0826123f7565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae69061400d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3582611564565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d9061408d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc5612463565b73ffffffffffffffffffffffffffffffffffffffff161480610bf45750610bf381610bee612463565b611de4565b5b610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90613f6d565b60405180910390fd5b610c3d838361246b565b505050565b600c5481565b610c50612463565b73ffffffffffffffffffffffffffffffffffffffff16610c6e611845565b73ffffffffffffffffffffffffffffffffffffffff1614610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb9061402d565b60405180910390fd5b80600a9080519060200190610cda929190613166565b5050565b610ce6612463565b73ffffffffffffffffffffffffffffffffffffffff16610d04611845565b73ffffffffffffffffffffffffffffffffffffffff1614610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d519061402d565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000610d836008612524565b905090565b610d99610d93612463565b82612532565b610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf906140cd565b60405180910390fd5b610de3838383612610565b505050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154119050919050565b610e3e612463565b73ffffffffffffffffffffffffffffffffffffffff16610e5c611845565b73ffffffffffffffffffffffffffffffffffffffff1614610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea99061402d565b60405180910390fd5b6000610ebc611845565b73ffffffffffffffffffffffffffffffffffffffff1647604051610edf90613d12565b60006040518083038185875af1925050503d8060008114610f1c576040519150601f19603f3d011682016040523d82523d6000602084013e610f21565b606091505b5050905080610f2f57600080fd5b50565b610f4d83838360405180602001604052806000815250611b8a565b505050565b60606000610f5f83611616565b905060008167ffffffffffffffff811115610f7d57610f7c6145af565b5b604051908082528060200260200182016040528015610fab5781602001602082028036833780820191505090505b50905060006001905060005b8381108015610fc85750600d548211155b15611051576000610fd883611564565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561103d578284838151811061102257611021614580565b5b602002602001018181525050818061103990614479565b9250505b828061104890614479565b93505050610fb7565b82945050505050919050565b611065612463565b73ffffffffffffffffffffffffffffffffffffffff16611083611845565b73ffffffffffffffffffffffffffffffffffffffff16146110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d09061402d565b60405180910390fd5b80600c8190555050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90613e8d565b60405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16156111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90613e2d565b60405180910390fd5b600d54600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546112486008612524565b611252919061424b565b1115611293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128a906140ad565b60405180910390fd5b600f60009054906101000a900460ff16156112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da9061404d565b60405180910390fd5b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555061138a33600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612877565b565b611394612463565b73ffffffffffffffffffffffffffffffffffffffff166113b2611845565b73ffffffffffffffffffffffffffffffffffffffff1614611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ff9061402d565b60405180910390fd5b80600b908051906020019061141e929190613166565b5050565b600f60019054906101000a900460ff1681565b600a805461144290614416565b80601f016020809104026020016040519081016040528092919081815260200182805461146e90614416565b80156114bb5780601f10611490576101008083540402835291602001916114bb565b820191906000526020600020905b81548152906001019060200180831161149e57829003601f168201915b505050505081565b600f60009054906101000a900460ff1681565b600980546114e390614416565b80601f016020809104026020016040519081016040528092919081815260200182805461150f90614416565b801561155c5780601f106115315761010080835404028352916020019161155c565b820191906000526020600020905b81548152906001019060200180831161153f57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561160d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160490613fad565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90613f8d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116d6612463565b73ffffffffffffffffffffffffffffffffffffffff166116f4611845565b73ffffffffffffffffffffffffffffffffffffffff161461174a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117419061402d565b60405180910390fd5b61175460006128b7565b565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff169050919050565b6117b7612463565b73ffffffffffffffffffffffffffffffffffffffff166117d5611845565b73ffffffffffffffffffffffffffffffffffffffff161461182b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118229061402d565b60405180910390fd5b8060099080519060200190611841929190613166565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b60606001805461188490614416565b80601f01602080910402602001604051908101604052809291908181526020018280546118b090614416565b80156118fd5780601f106118d2576101008083540402835291602001916118fd565b820191906000526020600020905b8154815290600101906020018083116118e057829003601f168201915b5050505050905090565b8060008111801561191a5750600e548111155b611959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195090613eed565b60405180910390fd5b600d54816119676008612524565b611971919061424b565b11156119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a9906140ad565b60405180910390fd5b600f60009054906101000a900460ff1615611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f99061404d565b60405180910390fd5b81600c54611a1091906142d2565b341015611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a49906140ed565b60405180910390fd5b611a5c3383612877565b5050565b611a72611a6b612463565b838361297d565b5050565b600b8054611a8390614416565b80601f0160208091040260200160405190810160405280929190818152602001828054611aaf90614416565b8015611afc5780601f10611ad157610100808354040283529160200191611afc565b820191906000526020600020905b815481529060010190602001808311611adf57829003601f168201915b505050505081565b611b0c612463565b73ffffffffffffffffffffffffffffffffffffffff16611b2a611845565b73ffffffffffffffffffffffffffffffffffffffff1614611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b779061402d565b60405180910390fd5b80600e8190555050565b611b9b611b95612463565b83612532565b611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd1906140cd565b60405180910390fd5b611be684848484612aea565b50505050565b6060611bf7826123f7565b611c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2d9061406d565b60405180910390fd5b60001515600f60019054906101000a900460ff1615151415611ce457600b8054611c5f90614416565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8b90614416565b8015611cd85780601f10611cad57610100808354040283529160200191611cd8565b820191906000526020600020905b815481529060010190602001808311611cbb57829003601f168201915b50505050509050611d40565b6000611cee612b46565b90506000815111611d0e5760405180602001604052806000815250611d3c565b80611d1884612bd8565b600a604051602001611d2c93929190613ce1565b6040516020818303038152906040525b9150505b919050565b600d5481565b611d53612463565b73ffffffffffffffffffffffffffffffffffffffff16611d71611845565b73ffffffffffffffffffffffffffffffffffffffff1614611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe9061402d565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611e8b5750600e548111155b611eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec190613eed565b60405180910390fd5b600d5481611ed86008612524565b611ee2919061424b565b1115611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a906140ad565b60405180910390fd5b611f2b612463565b73ffffffffffffffffffffffffffffffffffffffff16611f49611845565b73ffffffffffffffffffffffffffffffffffffffff1614611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f969061402d565b60405180910390fd5b611fa98284612877565b505050565b611fb6612463565b73ffffffffffffffffffffffffffffffffffffffff16611fd4611845565b73ffffffffffffffffffffffffffffffffffffffff161461202a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120219061402d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561209a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209190613e6d565b60405180910390fd5b6120a3816128b7565b50565b6120ae612463565b73ffffffffffffffffffffffffffffffffffffffff166120cc611845565b73ffffffffffffffffffffffffffffffffffffffff1614612122576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121199061402d565b60405180910390fd5b60ff8484905010612168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215f90613e0d565b60405180910390fd5b8181905084849050146121b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a790613ded565b60405180910390fd5b60005b84849050811015612386576000600760008787858181106121d7576121d6614580565b5b90506020020160208101906121ec91906133fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541461226a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226190613fcd565b60405180910390fd5b60006007600087878581811061228357612282614580565b5b905060200201602081019061229891906133fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055508282828181106122ff576122fe614580565b5b905060200201356007600087878581811061231d5761231c614580565b5b905060200201602081019061233291906133fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550808061237e90614479565b9150506121b3565b5050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124de83611564565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600061253d826123f7565b61257c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257390613f4d565b60405180910390fd5b600061258783611564565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125f657508373ffffffffffffffffffffffffffffffffffffffff166125de84610aa5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061260757506126068185611de4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661263082611564565b73ffffffffffffffffffffffffffffffffffffffff1614612686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267d90613ead565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ed90613f0d565b60405180910390fd5b612701838383612d39565b61270c60008261246b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461275c919061432c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b3919061424b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612872838383612d3e565b505050565b60005b818110156128b25761288c6008612d43565b61289f8361289a6008612524565b612d59565b80806128aa90614479565b91505061287a565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e390613f2d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612add9190613db0565b60405180910390a3505050565b612af5848484612610565b612b0184848484612d77565b612b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3790613e4d565b60405180910390fd5b50505050565b606060098054612b5590614416565b80601f0160208091040260200160405190810160405280929190818152602001828054612b8190614416565b8015612bce5780601f10612ba357610100808354040283529160200191612bce565b820191906000526020600020905b815481529060010190602001808311612bb157829003601f168201915b5050505050905090565b60606000821415612c20576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d34565b600082905060005b60008214612c52578080612c3b90614479565b915050600a82612c4b91906142a1565b9150612c28565b60008167ffffffffffffffff811115612c6e57612c6d6145af565b5b6040519080825280601f01601f191660200182016040528015612ca05781602001600182028036833780820191505090505b5090505b60008514612d2d57600182612cb9919061432c565b9150600a85612cc891906144c2565b6030612cd4919061424b565b60f81b818381518110612cea57612ce9614580565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d2691906142a1565b9450612ca4565b8093505050505b919050565b505050565b505050565b6001816000016000828254019250508190555050565b612d73828260405180602001604052806000815250612f0e565b5050565b6000612d988473ffffffffffffffffffffffffffffffffffffffff16612f69565b15612f01578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dc1612463565b8786866040518563ffffffff1660e01b8152600401612de39493929190613d42565b602060405180830381600087803b158015612dfd57600080fd5b505af1925050508015612e2e57506040513d601f19601f82011682018060405250810190612e2b919061369c565b60015b612eb1573d8060008114612e5e576040519150601f19603f3d011682016040523d82523d6000602084013e612e63565b606091505b50600081511415612ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea090613e4d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f06565b600190505b949350505050565b612f188383612f8c565b612f256000848484612d77565b612f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5b90613e4d565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff390613fed565b60405180910390fd5b613005816123f7565b15613045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303c90613ecd565b60405180910390fd5b61305160008383612d39565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130a1919061424b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461316260008383612d3e565b5050565b82805461317290614416565b90600052602060002090601f01602090048101928261319457600085556131db565b82601f106131ad57805160ff19168380011785556131db565b828001600101855582156131db579182015b828111156131da5782518255916020019190600101906131bf565b5b5090506131e891906131ec565b5090565b5b808211156132055760008160009055506001016131ed565b5090565b600061321c6132178461414d565b614128565b905082815260208101848484011115613238576132376145ed565b5b6132438482856143d4565b509392505050565b600061325e6132598461417e565b614128565b90508281526020810184848401111561327a576132796145ed565b5b6132858482856143d4565b509392505050565b60008135905061329c81614bd9565b92915050565b60008083601f8401126132b8576132b76145e3565b5b8235905067ffffffffffffffff8111156132d5576132d46145de565b5b6020830191508360208202830111156132f1576132f06145e8565b5b9250929050565b60008083601f84011261330e5761330d6145e3565b5b8235905067ffffffffffffffff81111561332b5761332a6145de565b5b602083019150836020820283011115613347576133466145e8565b5b9250929050565b60008135905061335d81614bf0565b92915050565b60008135905061337281614c07565b92915050565b60008151905061338781614c07565b92915050565b600082601f8301126133a2576133a16145e3565b5b81356133b2848260208601613209565b91505092915050565b600082601f8301126133d0576133cf6145e3565b5b81356133e084826020860161324b565b91505092915050565b6000813590506133f881614c1e565b92915050565b600060208284031215613414576134136145f7565b5b60006134228482850161328d565b91505092915050565b60008060408385031215613442576134416145f7565b5b60006134508582860161328d565b92505060206134618582860161328d565b9150509250929050565b600080600060608486031215613484576134836145f7565b5b60006134928682870161328d565b93505060206134a38682870161328d565b92505060406134b4868287016133e9565b9150509250925092565b600080600080608085870312156134d8576134d76145f7565b5b60006134e68782880161328d565b94505060206134f78782880161328d565b9350506040613508878288016133e9565b925050606085013567ffffffffffffffff811115613529576135286145f2565b5b6135358782880161338d565b91505092959194509250565b60008060408385031215613558576135576145f7565b5b60006135668582860161328d565b92505060206135778582860161334e565b9150509250929050565b60008060408385031215613598576135976145f7565b5b60006135a68582860161328d565b92505060206135b7858286016133e9565b9150509250929050565b600080600080604085870312156135db576135da6145f7565b5b600085013567ffffffffffffffff8111156135f9576135f86145f2565b5b613605878288016132a2565b9450945050602085013567ffffffffffffffff811115613628576136276145f2565b5b613634878288016132f8565b925092505092959194509250565b600060208284031215613658576136576145f7565b5b60006136668482850161334e565b91505092915050565b600060208284031215613685576136846145f7565b5b600061369384828501613363565b91505092915050565b6000602082840312156136b2576136b16145f7565b5b60006136c084828501613378565b91505092915050565b6000602082840312156136df576136de6145f7565b5b600082013567ffffffffffffffff8111156136fd576136fc6145f2565b5b613709848285016133bb565b91505092915050565b600060208284031215613728576137276145f7565b5b6000613736848285016133e9565b91505092915050565b60008060408385031215613756576137556145f7565b5b6000613764858286016133e9565b92505060206137758582860161328d565b9150509250929050565b600061378b8383613cc3565b60208301905092915050565b6137a081614360565b82525050565b60006137b1826141d4565b6137bb8185614202565b93506137c6836141af565b8060005b838110156137f75781516137de888261377f565b97506137e9836141f5565b9250506001810190506137ca565b5085935050505092915050565b61380d81614372565b82525050565b600061381e826141df565b6138288185614213565b93506138388185602086016143e3565b613841816145fc565b840191505092915050565b6000613857826141ea565b613861818561422f565b93506138718185602086016143e3565b61387a816145fc565b840191505092915050565b6000613890826141ea565b61389a8185614240565b93506138aa8185602086016143e3565b80840191505092915050565b600081546138c381614416565b6138cd8186614240565b945060018216600081146138e857600181146138f95761392c565b60ff1983168652818601935061392c565b613902856141bf565b60005b8381101561392457815481890152600182019150602081019050613905565b838801955050505b50505092915050565b6000613942600e8361422f565b915061394d8261460d565b602082019050919050565b6000613965600e8361422f565b915061397082614636565b602082019050919050565b600061398860108361422f565b91506139938261465f565b602082019050919050565b60006139ab60328361422f565b91506139b682614688565b604082019050919050565b60006139ce60268361422f565b91506139d9826146d7565b604082019050919050565b60006139f160108361422f565b91506139fc82614726565b602082019050919050565b6000613a1460258361422f565b9150613a1f8261474f565b604082019050919050565b6000613a37601c8361422f565b9150613a428261479e565b602082019050919050565b6000613a5a60148361422f565b9150613a65826147c7565b602082019050919050565b6000613a7d60248361422f565b9150613a88826147f0565b604082019050919050565b6000613aa060198361422f565b9150613aab8261483f565b602082019050919050565b6000613ac3602c8361422f565b9150613ace82614868565b604082019050919050565b6000613ae660388361422f565b9150613af1826148b7565b604082019050919050565b6000613b09602a8361422f565b9150613b1482614906565b604082019050919050565b6000613b2c60298361422f565b9150613b3782614955565b604082019050919050565b6000613b4f60148361422f565b9150613b5a826149a4565b602082019050919050565b6000613b7260208361422f565b9150613b7d826149cd565b602082019050919050565b6000613b95602c8361422f565b9150613ba0826149f6565b604082019050919050565b6000613bb860208361422f565b9150613bc382614a45565b602082019050919050565b6000613bdb60178361422f565b9150613be682614a6e565b602082019050919050565b6000613bfe602f8361422f565b9150613c0982614a97565b604082019050919050565b6000613c2160218361422f565b9150613c2c82614ae6565b604082019050919050565b6000613c44600083614224565b9150613c4f82614b35565b600082019050919050565b6000613c6760148361422f565b9150613c7282614b38565b602082019050919050565b6000613c8a60318361422f565b9150613c9582614b61565b604082019050919050565b6000613cad60138361422f565b9150613cb882614bb0565b602082019050919050565b613ccc816143ca565b82525050565b613cdb816143ca565b82525050565b6000613ced8286613885565b9150613cf98285613885565b9150613d0582846138b6565b9150819050949350505050565b6000613d1d82613c37565b9150819050919050565b6000602082019050613d3c6000830184613797565b92915050565b6000608082019050613d576000830187613797565b613d646020830186613797565b613d716040830185613cd2565b8181036060830152613d838184613813565b905095945050505050565b60006020820190508181036000830152613da881846137a6565b905092915050565b6000602082019050613dc56000830184613804565b92915050565b60006020820190508181036000830152613de5818461384c565b905092915050565b60006020820190508181036000830152613e0681613935565b9050919050565b60006020820190508181036000830152613e2681613958565b9050919050565b60006020820190508181036000830152613e468161397b565b9050919050565b60006020820190508181036000830152613e668161399e565b9050919050565b60006020820190508181036000830152613e86816139c1565b9050919050565b60006020820190508181036000830152613ea6816139e4565b9050919050565b60006020820190508181036000830152613ec681613a07565b9050919050565b60006020820190508181036000830152613ee681613a2a565b9050919050565b60006020820190508181036000830152613f0681613a4d565b9050919050565b60006020820190508181036000830152613f2681613a70565b9050919050565b60006020820190508181036000830152613f4681613a93565b9050919050565b60006020820190508181036000830152613f6681613ab6565b9050919050565b60006020820190508181036000830152613f8681613ad9565b9050919050565b60006020820190508181036000830152613fa681613afc565b9050919050565b60006020820190508181036000830152613fc681613b1f565b9050919050565b60006020820190508181036000830152613fe681613b42565b9050919050565b6000602082019050818103600083015261400681613b65565b9050919050565b6000602082019050818103600083015261402681613b88565b9050919050565b6000602082019050818103600083015261404681613bab565b9050919050565b6000602082019050818103600083015261406681613bce565b9050919050565b6000602082019050818103600083015261408681613bf1565b9050919050565b600060208201905081810360008301526140a681613c14565b9050919050565b600060208201905081810360008301526140c681613c5a565b9050919050565b600060208201905081810360008301526140e681613c7d565b9050919050565b6000602082019050818103600083015261410681613ca0565b9050919050565b60006020820190506141226000830184613cd2565b92915050565b6000614132614143565b905061413e8282614448565b919050565b6000604051905090565b600067ffffffffffffffff821115614168576141676145af565b5b614171826145fc565b9050602081019050919050565b600067ffffffffffffffff821115614199576141986145af565b5b6141a2826145fc565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614256826143ca565b9150614261836143ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614296576142956144f3565b5b828201905092915050565b60006142ac826143ca565b91506142b7836143ca565b9250826142c7576142c6614522565b5b828204905092915050565b60006142dd826143ca565b91506142e8836143ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614321576143206144f3565b5b828202905092915050565b6000614337826143ca565b9150614342836143ca565b925082821015614355576143546144f3565b5b828203905092915050565b600061436b826143aa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156144015780820151818401526020810190506143e6565b83811115614410576000848401525b50505050565b6000600282049050600182168061442e57607f821691505b6020821081141561444257614441614551565b5b50919050565b614451826145fc565b810181811067ffffffffffffffff821117156144705761446f6145af565b5b80604052505050565b6000614484826143ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144b7576144b66144f3565b5b600182019050919050565b60006144cd826143ca565b91506144d8836143ca565b9250826144e8576144e7614522565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e76616c696420617272617973000000000000000000000000000000000000600082015250565b7f496e76616c6964206c656e677468000000000000000000000000000000000000600082015250565b7f416c726561647920636c61696d65642100000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f742077686974656c69737465642100000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f416c72656164792077686974656c697374656421000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b614be281614360565b8114614bed57600080fd5b50565b614bf981614372565b8114614c0457600080fd5b50565b614c108161437e565b8114614c1b57600080fd5b50565b614c27816143ca565b8114614c3257600080fd5b5056fea26469706673582212205a6b7ba1f836ad62d240c33dca92433582ef832cf77d714920d0e9157d73112b64736f6c63430008070033

Deployed Bytecode Sourcemap

36530:5576:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23373:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24318:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25877:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25400:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36954:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41457:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41563:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38102:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26627:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38755:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41646:137;;;;;;;;;;;;;:::i;:::-;;27037:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39769:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40997:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38506:247;;;;;;;;;;;;;:::i;:::-;;41213:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37113:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36874:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37080:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36839:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24012:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23742:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4958:103;;;;;;;;;;;;;:::i;:::-;;38897:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41351:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4307:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37033:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24487:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38205:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26170:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36914:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41077:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27293:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40410:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36994:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40910:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26396:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39608:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5216:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39033:567;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23373:305;23475:4;23527:25;23512:40;;;:11;:40;;;;:105;;;;23584:33;23569:48;;;:11;:48;;;;23512:105;:158;;;;23634:36;23658:11;23634:23;:36::i;:::-;23512:158;23492:178;;23373:305;;;:::o;24318:100::-;24372:13;24405:5;24398:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24318:100;:::o;25877:221::-;25953:7;25981:16;25989:7;25981;:16::i;:::-;25973:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26066:15;:24;26082:7;26066:24;;;;;;;;;;;;;;;;;;;;;26059:31;;25877:221;;;:::o;25400:411::-;25481:13;25497:23;25512:7;25497:14;:23::i;:::-;25481:39;;25545:5;25539:11;;:2;:11;;;;25531:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25639:5;25623:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25648:37;25665:5;25672:12;:10;:12::i;:::-;25648:16;:37::i;:::-;25623:62;25601:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25782:21;25791:2;25795:7;25782:8;:21::i;:::-;25470:341;25400:411;;:::o;36954:33::-;;;;:::o;41457:100::-;4538:12;:10;:12::i;:::-;4527:23;;:7;:5;:7::i;:::-;:23;;;4519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41541:10:::1;41529:9;:22;;;;;;;;;;;;:::i;:::-;;41457:100:::0;:::o;41563:77::-;4538:12;:10;:12::i;:::-;4527:23;;:7;:5;:7::i;:::-;:23;;;4519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41628:6:::1;41619;;:15;;;;;;;;;;;;;;;;;;41563:77:::0;:::o;38102:95::-;38146:7;38173:16;:6;:14;:16::i;:::-;38166:23;;38102:95;:::o;26627:339::-;26822:41;26841:12;:10;:12::i;:::-;26855:7;26822:18;:41::i;:::-;26814:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26930:28;26940:4;26946:2;26950:7;26930:9;:28::i;:::-;26627:339;;;:::o;38755:134::-;38823:4;38880:1;38850:10;:20;38861:8;38850:20;;;;;;;;;;;;;;;:27;;;:31;38843:38;;38755:134;;;:::o;41646:137::-;4538:12;:10;:12::i;:::-;4527:23;;:7;:5;:7::i;:::-;:23;;;4519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41691:7:::1;41712;:5;:7::i;:::-;41704:21;;41733;41704:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41690:69;;;41774:2;41766:11;;;::::0;::::1;;41683:100;41646:137::o:0;27037:185::-;27175:39;27192:4;27198:2;27202:7;27175:39;;;;;;;;;;;;:16;:39::i;:::-;27037:185;;;:::o;39769:635::-;39844:16;39872:23;39898:17;39908:6;39898:9;:17::i;:::-;39872:43;;39922:30;39969:15;39955:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39922:63;;39992:22;40017:1;39992:26;;40025:23;40061:309;40086:15;40068;:33;:64;;;;;40123:9;;40105:14;:27;;40068:64;40061:309;;;40143:25;40171:23;40179:14;40171:7;:23::i;:::-;40143:51;;40230:6;40209:27;;:17;:27;;;40205:131;;;40282:14;40249:13;40263:15;40249:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;40309:17;;;;;:::i;:::-;;;;40205:131;40346:16;;;;;:::i;:::-;;;;40134:236;40061:309;;;40385:13;40378:20;;;;;;39769:635;;;:::o;40997:74::-;4538:12;:10;:12::i;:::-;4527:23;;:7;:5;:7::i;:::-;:23;;;4519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41060:5:::1;41053:4;:12;;;;40997:74:::0;:::o;38506:247::-;37776:1;37744:10;:22;37755:10;37744:22;;;;;;;;;;;;;;;:29;;;:33;37722:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;37855:10;:22;37866:10;37855:22;;;;;;;;;;;;;;;:30;;;;;;;;;;;;37854:31;37832:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;38014:9;;37981:10;:22;37992:10;37981:22;;;;;;;;;;;;;;;:29;;;37962:16;:6;:14;:16::i;:::-;:48;;;;:::i;:::-;:61;;37940:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;38600:6:::1;;;;;;;;;;;38599:7;38591:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;38678:4;38645:10;:22;38656:10;38645:22;;;;;;;;;;;;;;;:30;;;:37;;;;;;;;;;;;;;;;;;38693:52;38703:10;38715;:22;38726:10;38715:22;;;;;;;;;;;;;;;:29;;;38693:9;:52::i;:::-;38506:247::o:0;41213:132::-;4538:12;:10;:12::i;:::-;4527:23;;:7;:5;:7::i;:::-;:23;;;4519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41321:18:::1;41301:17;:38;;;;;;;;;;;;:::i;:::-;;41213:132:::0;:::o;37113:28::-;;;;;;;;;;;;;:::o;36874:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37080:26::-;;;;;;;;;;;;;:::o;36839:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24012:239::-;24084:7;24104:13;24120:7;:16;24128:7;24120:16;;;;;;;;;;;;;;;;;;;;;24104:32;;24172:1;24155:19;;:5;:19;;;;24147:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24238:5;24231:12;;;24012:239;;;:::o;23742:208::-;23814:7;23859:1;23842:19;;:5;:19;;;;23834:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23926:9;:16;23936:5;23926:16;;;;;;;;;;;;;;;;23919:23;;23742:208;;;:::o;4958:103::-;4538:12;:10;:12::i;:::-;4527:23;;:7;:5;:7::i;:::-;:23;;;4519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5023:30:::1;5050:1;5023:18;:30::i;:::-;4958:103::o:0;38897:128::-;38962:4;38989:10;:20;39000:8;38989:20;;;;;;;;;;;;;;;:28;;;;;;;;;;;;38982:35;;38897:128;;;:::o;41351:100::-;4538:12;:10;:12::i;:::-;4527:23;;:7;:5;:7::i;:::-;:23;;;4519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41435:10:::1;41423:9;:22;;;;;;;;;;;;:::i;:::-;;41351:100:::0;:::o;4307:87::-;4353:7;4380:6;;;;;;;;;;;4373:13;;4307:87;:::o;37033:38::-;;;;:::o;24487:104::-;24543:13;24576:7;24569:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24487:104;:::o;38205:293::-;38297:11;37442:1;37428:11;:15;:52;;;;;37462:18;;37447:11;:33;;37428:52;37406:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;37595:9;;37580:11;37561:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;37539:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;38335:6:::1;;;;;;;;;;;38334:7;38326:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;38408:11;38401:4;;:18;;;;:::i;:::-;38388:9;:31;;38380:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38456:34;38466:10;38478:11;38456:9;:34::i;:::-;38205:293:::0;;:::o;26170:155::-;26265:52;26284:12;:10;:12::i;:::-;26298:8;26308;26265:18;:52::i;:::-;26170:155;;:::o;36914:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41077:130::-;4538:12;:10;:12::i;:::-;4527:23;;:7;:5;:7::i;:::-;:23;;;4519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41182:19:::1;41161:18;:40;;;;41077:130:::0;:::o;27293:328::-;27468:41;27487:12;:10;:12::i;:::-;27501:7;27468:18;:41::i;:::-;27460:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27574:39;27588:4;27594:2;27598:7;27607:5;27574:13;:39::i;:::-;27293:328;;;;:::o;40410:494::-;40509:13;40550:17;40558:8;40550:7;:17::i;:::-;40534:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;40657:5;40645:17;;:8;;;;;;;;;;;:17;;;40641:64;;;40680:17;40673:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40641:64;40713:28;40744:10;:8;:10::i;:::-;40713:41;;40799:1;40774:14;40768:28;:32;:130;;;;;;;;;;;;;;;;;40836:14;40852:19;:8;:17;:19::i;:::-;40873:9;40819:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40768:130;40761:137;;;40410:494;;;;:::o;36994:32::-;;;;:::o;40910:81::-;4538:12;:10;:12::i;:::-;4527:23;;:7;:5;:7::i;:::-;:23;;;4519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40979:6:::1;40968:8;;:17;;;;;;;;;;;;;;;;;;40910:81:::0;:::o;26396:164::-;26493:4;26517:18;:25;26536:5;26517:25;;;;;;;;;;;;;;;:35;26543:8;26517:35;;;;;;;;;;;;;;;;;;;;;;;;;26510:42;;26396:164;;;;:::o;39608:155::-;39694:11;37442:1;37428:11;:15;:52;;;;;37462:18;;37447:11;:33;;37428:52;37406:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;37595:9;;37580:11;37561:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;37539:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;4538:12:::1;:10;:12::i;:::-;4527:23;;:7;:5;:7::i;:::-;:23;;;4519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39724:33:::2;39734:9;39745:11;39724:9;:33::i;:::-;39608:155:::0;;;:::o;5216:201::-;4538:12;:10;:12::i;:::-;4527:23;;:7;:5;:7::i;:::-;:23;;;4519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5325:1:::1;5305:22;;:8;:22;;;;5297:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5381:28;5400:8;5381:18;:28::i;:::-;5216:201:::0;:::o;39033:567::-;4538:12;:10;:12::i;:::-;4527:23;;:7;:5;:7::i;:::-;:23;;;4519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39193:3:::1;39175:8;;:15;;:21;39167:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;39253:7;;:14;;39234:8;;:15;;:33;39226:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;39304:9;39299:294;39323:8;;:15;;39319:1;:19;39299:294;;;39416:1;39382:10;:23;39393:8;;39402:1;39393:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39382:23;;;;;;;;;;;;;;;:30;;;:35;39360:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;39518:5;39484:10;:23;39495:8;;39504:1;39495:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39484:23;;;;;;;;;;;;;;;:31;;;:39;;;;;;;;;;;;;;;;;;39571:7;;39579:1;39571:10;;;;;;;:::i;:::-;;;;;;;;39538;:23;39549:8;;39558:1;39549:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39538:23;;;;;;;;;;;;;;;:30;;:43;;;;39340:3;;;;;:::i;:::-;;;;39299:294;;;;39033:567:::0;;;;:::o;16550:157::-;16635:4;16674:25;16659:40;;;:11;:40;;;;16652:47;;16550:157;;;:::o;29131:127::-;29196:4;29248:1;29220:30;;:7;:16;29228:7;29220:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29213:37;;29131:127;;;:::o;3143:98::-;3196:7;3223:10;3216:17;;3143:98;:::o;33277:174::-;33379:2;33352:15;:24;33368:7;33352:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33435:7;33431:2;33397:46;;33406:23;33421:7;33406:14;:23::i;:::-;33397:46;;;;;;;;;;;;33277:174;;:::o;158:114::-;223:7;250;:14;;;243:21;;158:114;;;:::o;29425:348::-;29518:4;29543:16;29551:7;29543;:16::i;:::-;29535:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29619:13;29635:23;29650:7;29635:14;:23::i;:::-;29619:39;;29688:5;29677:16;;:7;:16;;;:51;;;;29721:7;29697:31;;:20;29709:7;29697:11;:20::i;:::-;:31;;;29677:51;:87;;;;29732:32;29749:5;29756:7;29732:16;:32::i;:::-;29677:87;29669:96;;;29425:348;;;;:::o;32534:625::-;32693:4;32666:31;;:23;32681:7;32666:14;:23::i;:::-;:31;;;32658:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32772:1;32758:16;;:2;:16;;;;32750:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32828:39;32849:4;32855:2;32859:7;32828:20;:39::i;:::-;32932:29;32949:1;32953:7;32932:8;:29::i;:::-;32993:1;32974:9;:15;32984:4;32974:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33022:1;33005:9;:13;33015:2;33005:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33053:2;33034:7;:16;33042:7;33034:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33092:7;33088:2;33073:27;;33082:4;33073:27;;;;;;;;;;;;33113:38;33133:4;33139:2;33143:7;33113:19;:38::i;:::-;32534:625;;;:::o;41789:204::-;41869:9;41864:124;41888:11;41884:1;:15;41864:124;;;41915:18;:6;:16;:18::i;:::-;41942:38;41952:9;41963:16;:6;:14;:16::i;:::-;41942:9;:38::i;:::-;41901:3;;;;;:::i;:::-;;;;41864:124;;;;41789:204;;:::o;5577:191::-;5651:16;5670:6;;;;;;;;;;;5651:25;;5696:8;5687:6;;:17;;;;;;;;;;;;;;;;;;5751:8;5720:40;;5741:8;5720:40;;;;;;;;;;;;5640:128;5577:191;:::o;33593:315::-;33748:8;33739:17;;:5;:17;;;;33731:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33835:8;33797:18;:25;33816:5;33797:25;;;;;;;;;;;;;;;:35;33823:8;33797:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33881:8;33859:41;;33874:5;33859:41;;;33891:8;33859:41;;;;;;:::i;:::-;;;;;;;;33593:315;;;:::o;28503:::-;28660:28;28670:4;28676:2;28680:7;28660:9;:28::i;:::-;28707:48;28730:4;28736:2;28740:7;28749:5;28707:22;:48::i;:::-;28699:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28503:315;;;;:::o;41999:104::-;42059:13;42088:9;42081:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41999:104;:::o;1006:534::-;1062:13;1103:1;1094:5;:10;1090:53;;;1121:10;;;;;;;;;;;;;;;;;;;;;1090:53;1153:12;1168:5;1153:20;;1184:14;1209:78;1224:1;1216:4;:9;1209:78;;1242:8;;;;;:::i;:::-;;;;1273:2;1265:10;;;;;:::i;:::-;;;1209:78;;;1297:19;1329:6;1319:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1297:39;;1347:154;1363:1;1354:5;:10;1347:154;;1391:1;1381:11;;;;;:::i;:::-;;;1458:2;1450:5;:10;;;;:::i;:::-;1437:2;:24;;;;:::i;:::-;1424:39;;1407:6;1414;1407:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1487:2;1478:11;;;;;:::i;:::-;;;1347:154;;;1525:6;1511:21;;;;;1006:534;;;;:::o;35844:126::-;;;;:::o;36355:125::-;;;;:::o;280:127::-;387:1;369:7;:14;;;:19;;;;;;;;;;;280:127;:::o;30115:110::-;30191:26;30201:2;30205:7;30191:26;;;;;;;;;;;;:9;:26::i;:::-;30115:110;;:::o;34473:799::-;34628:4;34649:15;:2;:13;;;:15::i;:::-;34645:620;;;34701:2;34685:36;;;34722:12;:10;:12::i;:::-;34736:4;34742:7;34751:5;34685:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34681:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34944:1;34927:6;:13;:18;34923:272;;;34970:60;;;;;;;;;;:::i;:::-;;;;;;;;34923:272;35145:6;35139:13;35130:6;35126:2;35122:15;35115:38;34681:529;34818:41;;;34808:51;;;:6;:51;;;;34801:58;;;;;34645:620;35249:4;35242:11;;34473:799;;;;;;;:::o;30452:321::-;30582:18;30588:2;30592:7;30582:5;:18::i;:::-;30633:54;30664:1;30668:2;30672:7;30681:5;30633:22;:54::i;:::-;30611:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30452:321;;;:::o;6883:326::-;6943:4;7200:1;7178:7;:19;;;:23;7171:30;;6883:326;;;:::o;31109:439::-;31203:1;31189:16;;:2;:16;;;;31181:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31262:16;31270:7;31262;:16::i;:::-;31261:17;31253:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31324:45;31353:1;31357:2;31361:7;31324:20;:45::i;:::-;31399:1;31382:9;:13;31392:2;31382:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31430:2;31411:7;:16;31419:7;31411:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31475:7;31471:2;31450:33;;31467:1;31450:33;;;;;;;;;;;;31496:44;31524:1;31528:2;31532:7;31496:19;:44::i;:::-;31109:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2352:5;2390:6;2377:20;2368:29;;2406:32;2432:5;2406:32;:::i;:::-;2307:137;;;;:::o;2450:141::-;2506:5;2537:6;2531:13;2522:22;;2553:32;2579:5;2553:32;:::i;:::-;2450:141;;;;:::o;2610:338::-;2665:5;2714:3;2707:4;2699:6;2695:17;2691:27;2681:122;;2722:79;;:::i;:::-;2681:122;2839:6;2826:20;2864:78;2938:3;2930:6;2923:4;2915:6;2911:17;2864:78;:::i;:::-;2855:87;;2671:277;2610:338;;;;:::o;2968:340::-;3024:5;3073:3;3066:4;3058:6;3054:17;3050:27;3040:122;;3081:79;;:::i;:::-;3040:122;3198:6;3185:20;3223:79;3298:3;3290:6;3283:4;3275:6;3271:17;3223:79;:::i;:::-;3214:88;;3030:278;2968:340;;;;:::o;3314:139::-;3360:5;3398:6;3385:20;3376:29;;3414:33;3441:5;3414:33;:::i;:::-;3314:139;;;;:::o;3459:329::-;3518:6;3567:2;3555:9;3546:7;3542:23;3538:32;3535:119;;;3573:79;;:::i;:::-;3535:119;3693:1;3718:53;3763:7;3754:6;3743:9;3739:22;3718:53;:::i;:::-;3708:63;;3664:117;3459:329;;;;:::o;3794:474::-;3862:6;3870;3919:2;3907:9;3898:7;3894:23;3890:32;3887:119;;;3925:79;;:::i;:::-;3887:119;4045:1;4070:53;4115:7;4106:6;4095:9;4091:22;4070:53;:::i;:::-;4060:63;;4016:117;4172:2;4198:53;4243:7;4234:6;4223:9;4219:22;4198:53;:::i;:::-;4188:63;;4143:118;3794:474;;;;;:::o;4274:619::-;4351:6;4359;4367;4416:2;4404:9;4395:7;4391:23;4387:32;4384:119;;;4422:79;;:::i;:::-;4384:119;4542:1;4567:53;4612:7;4603:6;4592:9;4588:22;4567:53;:::i;:::-;4557:63;;4513:117;4669:2;4695:53;4740:7;4731:6;4720:9;4716:22;4695:53;:::i;:::-;4685:63;;4640:118;4797:2;4823:53;4868:7;4859:6;4848:9;4844:22;4823:53;:::i;:::-;4813:63;;4768:118;4274:619;;;;;:::o;4899:943::-;4994:6;5002;5010;5018;5067:3;5055:9;5046:7;5042:23;5038:33;5035:120;;;5074:79;;:::i;:::-;5035:120;5194:1;5219:53;5264:7;5255:6;5244:9;5240:22;5219:53;:::i;:::-;5209:63;;5165:117;5321:2;5347:53;5392:7;5383:6;5372:9;5368:22;5347:53;:::i;:::-;5337:63;;5292:118;5449:2;5475:53;5520:7;5511:6;5500:9;5496:22;5475:53;:::i;:::-;5465:63;;5420:118;5605:2;5594:9;5590:18;5577:32;5636:18;5628:6;5625:30;5622:117;;;5658:79;;:::i;:::-;5622:117;5763:62;5817:7;5808:6;5797:9;5793:22;5763:62;:::i;:::-;5753:72;;5548:287;4899:943;;;;;;;:::o;5848:468::-;5913:6;5921;5970:2;5958:9;5949:7;5945:23;5941:32;5938:119;;;5976:79;;:::i;:::-;5938:119;6096:1;6121:53;6166:7;6157:6;6146:9;6142:22;6121:53;:::i;:::-;6111:63;;6067:117;6223:2;6249:50;6291:7;6282:6;6271:9;6267:22;6249:50;:::i;:::-;6239:60;;6194:115;5848:468;;;;;:::o;6322:474::-;6390:6;6398;6447:2;6435:9;6426:7;6422:23;6418:32;6415:119;;;6453:79;;:::i;:::-;6415:119;6573:1;6598:53;6643:7;6634:6;6623:9;6619:22;6598:53;:::i;:::-;6588:63;;6544:117;6700:2;6726:53;6771:7;6762:6;6751:9;6747:22;6726:53;:::i;:::-;6716:63;;6671:118;6322:474;;;;;:::o;6802:934::-;6924:6;6932;6940;6948;6997:2;6985:9;6976:7;6972:23;6968:32;6965:119;;;7003:79;;:::i;:::-;6965:119;7151:1;7140:9;7136:17;7123:31;7181:18;7173:6;7170:30;7167:117;;;7203:79;;:::i;:::-;7167:117;7316:80;7388:7;7379:6;7368:9;7364:22;7316:80;:::i;:::-;7298:98;;;;7094:312;7473:2;7462:9;7458:18;7445:32;7504:18;7496:6;7493:30;7490:117;;;7526:79;;:::i;:::-;7490:117;7639:80;7711:7;7702:6;7691:9;7687:22;7639:80;:::i;:::-;7621:98;;;;7416:313;6802:934;;;;;;;:::o;7742:323::-;7798:6;7847:2;7835:9;7826:7;7822:23;7818:32;7815:119;;;7853:79;;:::i;:::-;7815:119;7973:1;7998:50;8040:7;8031:6;8020:9;8016:22;7998:50;:::i;:::-;7988:60;;7944:114;7742:323;;;;:::o;8071:327::-;8129:6;8178:2;8166:9;8157:7;8153:23;8149:32;8146:119;;;8184:79;;:::i;:::-;8146:119;8304:1;8329:52;8373:7;8364:6;8353:9;8349:22;8329:52;:::i;:::-;8319:62;;8275:116;8071:327;;;;:::o;8404:349::-;8473:6;8522:2;8510:9;8501:7;8497:23;8493:32;8490:119;;;8528:79;;:::i;:::-;8490:119;8648:1;8673:63;8728:7;8719:6;8708:9;8704:22;8673:63;:::i;:::-;8663:73;;8619:127;8404:349;;;;:::o;8759:509::-;8828:6;8877:2;8865:9;8856:7;8852:23;8848:32;8845:119;;;8883:79;;:::i;:::-;8845:119;9031:1;9020:9;9016:17;9003:31;9061:18;9053:6;9050:30;9047:117;;;9083:79;;:::i;:::-;9047:117;9188:63;9243:7;9234:6;9223:9;9219:22;9188:63;:::i;:::-;9178:73;;8974:287;8759:509;;;;:::o;9274:329::-;9333:6;9382:2;9370:9;9361:7;9357:23;9353:32;9350:119;;;9388:79;;:::i;:::-;9350:119;9508:1;9533:53;9578:7;9569:6;9558:9;9554:22;9533:53;:::i;:::-;9523:63;;9479:117;9274:329;;;;:::o;9609:474::-;9677:6;9685;9734:2;9722:9;9713:7;9709:23;9705:32;9702:119;;;9740:79;;:::i;:::-;9702:119;9860:1;9885:53;9930:7;9921:6;9910:9;9906:22;9885:53;:::i;:::-;9875:63;;9831:117;9987:2;10013:53;10058:7;10049:6;10038:9;10034:22;10013:53;:::i;:::-;10003:63;;9958:118;9609:474;;;;;:::o;10089:179::-;10158:10;10179:46;10221:3;10213:6;10179:46;:::i;:::-;10257:4;10252:3;10248:14;10234:28;;10089:179;;;;:::o;10274:118::-;10361:24;10379:5;10361:24;:::i;:::-;10356:3;10349:37;10274:118;;:::o;10428:732::-;10547:3;10576:54;10624:5;10576:54;:::i;:::-;10646:86;10725:6;10720:3;10646:86;:::i;:::-;10639:93;;10756:56;10806:5;10756:56;:::i;:::-;10835:7;10866:1;10851:284;10876:6;10873:1;10870:13;10851:284;;;10952:6;10946:13;10979:63;11038:3;11023:13;10979:63;:::i;:::-;10972:70;;11065:60;11118:6;11065:60;:::i;:::-;11055:70;;10911:224;10898:1;10895;10891:9;10886:14;;10851:284;;;10855:14;11151:3;11144:10;;10552:608;;;10428:732;;;;:::o;11166:109::-;11247:21;11262:5;11247:21;:::i;:::-;11242:3;11235:34;11166:109;;:::o;11281:360::-;11367:3;11395:38;11427:5;11395:38;:::i;:::-;11449:70;11512:6;11507:3;11449:70;:::i;:::-;11442:77;;11528:52;11573:6;11568:3;11561:4;11554:5;11550:16;11528:52;:::i;:::-;11605:29;11627:6;11605:29;:::i;:::-;11600:3;11596:39;11589:46;;11371:270;11281:360;;;;:::o;11647:364::-;11735:3;11763:39;11796:5;11763:39;:::i;:::-;11818:71;11882:6;11877:3;11818:71;:::i;:::-;11811:78;;11898:52;11943:6;11938:3;11931:4;11924:5;11920:16;11898:52;:::i;:::-;11975:29;11997:6;11975:29;:::i;:::-;11970:3;11966:39;11959:46;;11739:272;11647:364;;;;:::o;12017:377::-;12123:3;12151:39;12184:5;12151:39;:::i;:::-;12206:89;12288:6;12283:3;12206:89;:::i;:::-;12199:96;;12304:52;12349:6;12344:3;12337:4;12330:5;12326:16;12304:52;:::i;:::-;12381:6;12376:3;12372:16;12365:23;;12127:267;12017:377;;;;:::o;12424:845::-;12527:3;12564:5;12558:12;12593:36;12619:9;12593:36;:::i;:::-;12645:89;12727:6;12722:3;12645:89;:::i;:::-;12638:96;;12765:1;12754:9;12750:17;12781:1;12776:137;;;;12927:1;12922:341;;;;12743:520;;12776:137;12860:4;12856:9;12845;12841:25;12836:3;12829:38;12896:6;12891:3;12887:16;12880:23;;12776:137;;12922:341;12989:38;13021:5;12989:38;:::i;:::-;13049:1;13063:154;13077:6;13074:1;13071:13;13063:154;;;13151:7;13145:14;13141:1;13136:3;13132:11;13125:35;13201:1;13192:7;13188:15;13177:26;;13099:4;13096:1;13092:12;13087:17;;13063:154;;;13246:6;13241:3;13237:16;13230:23;;12929:334;;12743:520;;12531:738;;12424:845;;;;:::o;13275:366::-;13417:3;13438:67;13502:2;13497:3;13438:67;:::i;:::-;13431:74;;13514:93;13603:3;13514:93;:::i;:::-;13632:2;13627:3;13623:12;13616:19;;13275:366;;;:::o;13647:::-;13789:3;13810:67;13874:2;13869:3;13810:67;:::i;:::-;13803:74;;13886:93;13975:3;13886:93;:::i;:::-;14004:2;13999:3;13995:12;13988:19;;13647:366;;;:::o;14019:::-;14161:3;14182:67;14246:2;14241:3;14182:67;:::i;:::-;14175:74;;14258:93;14347:3;14258:93;:::i;:::-;14376:2;14371:3;14367:12;14360:19;;14019:366;;;:::o;14391:::-;14533:3;14554:67;14618:2;14613:3;14554:67;:::i;:::-;14547:74;;14630:93;14719:3;14630:93;:::i;:::-;14748:2;14743:3;14739:12;14732:19;;14391:366;;;:::o;14763:::-;14905:3;14926:67;14990:2;14985:3;14926:67;:::i;:::-;14919:74;;15002:93;15091:3;15002:93;:::i;:::-;15120:2;15115:3;15111:12;15104:19;;14763:366;;;:::o;15135:::-;15277:3;15298:67;15362:2;15357:3;15298:67;:::i;:::-;15291:74;;15374:93;15463:3;15374:93;:::i;:::-;15492:2;15487:3;15483:12;15476:19;;15135:366;;;:::o;15507:::-;15649:3;15670:67;15734:2;15729:3;15670:67;:::i;:::-;15663:74;;15746:93;15835:3;15746:93;:::i;:::-;15864:2;15859:3;15855:12;15848:19;;15507:366;;;:::o;15879:::-;16021:3;16042:67;16106:2;16101:3;16042:67;:::i;:::-;16035:74;;16118:93;16207:3;16118:93;:::i;:::-;16236:2;16231:3;16227:12;16220:19;;15879:366;;;:::o;16251:::-;16393:3;16414:67;16478:2;16473:3;16414:67;:::i;:::-;16407:74;;16490:93;16579:3;16490:93;:::i;:::-;16608:2;16603:3;16599:12;16592:19;;16251:366;;;:::o;16623:::-;16765:3;16786:67;16850:2;16845:3;16786:67;:::i;:::-;16779:74;;16862:93;16951:3;16862:93;:::i;:::-;16980:2;16975:3;16971:12;16964:19;;16623:366;;;:::o;16995:::-;17137:3;17158:67;17222:2;17217:3;17158:67;:::i;:::-;17151:74;;17234:93;17323:3;17234:93;:::i;:::-;17352:2;17347:3;17343:12;17336:19;;16995:366;;;:::o;17367:::-;17509:3;17530:67;17594:2;17589:3;17530:67;:::i;:::-;17523:74;;17606:93;17695:3;17606:93;:::i;:::-;17724:2;17719:3;17715:12;17708:19;;17367:366;;;:::o;17739:::-;17881:3;17902:67;17966:2;17961:3;17902:67;:::i;:::-;17895:74;;17978:93;18067:3;17978:93;:::i;:::-;18096:2;18091:3;18087:12;18080:19;;17739:366;;;:::o;18111:::-;18253:3;18274:67;18338:2;18333:3;18274:67;:::i;:::-;18267:74;;18350:93;18439:3;18350:93;:::i;:::-;18468:2;18463:3;18459:12;18452:19;;18111:366;;;:::o;18483:::-;18625:3;18646:67;18710:2;18705:3;18646:67;:::i;:::-;18639:74;;18722:93;18811:3;18722:93;:::i;:::-;18840:2;18835:3;18831:12;18824:19;;18483:366;;;:::o;18855:::-;18997:3;19018:67;19082:2;19077:3;19018:67;:::i;:::-;19011:74;;19094:93;19183:3;19094:93;:::i;:::-;19212:2;19207:3;19203:12;19196:19;;18855:366;;;:::o;19227:::-;19369:3;19390:67;19454:2;19449:3;19390:67;:::i;:::-;19383:74;;19466:93;19555:3;19466:93;:::i;:::-;19584:2;19579:3;19575:12;19568:19;;19227:366;;;:::o;19599:::-;19741:3;19762:67;19826:2;19821:3;19762:67;:::i;:::-;19755:74;;19838:93;19927:3;19838:93;:::i;:::-;19956:2;19951:3;19947:12;19940:19;;19599:366;;;:::o;19971:::-;20113:3;20134:67;20198:2;20193:3;20134:67;:::i;:::-;20127:74;;20210:93;20299:3;20210:93;:::i;:::-;20328:2;20323:3;20319:12;20312:19;;19971:366;;;:::o;20343:::-;20485:3;20506:67;20570:2;20565:3;20506:67;:::i;:::-;20499:74;;20582:93;20671:3;20582:93;:::i;:::-;20700:2;20695:3;20691:12;20684:19;;20343:366;;;:::o;20715:::-;20857:3;20878:67;20942:2;20937:3;20878:67;:::i;:::-;20871:74;;20954:93;21043:3;20954:93;:::i;:::-;21072:2;21067:3;21063:12;21056:19;;20715:366;;;:::o;21087:::-;21229:3;21250:67;21314:2;21309:3;21250:67;:::i;:::-;21243:74;;21326:93;21415:3;21326:93;:::i;:::-;21444:2;21439:3;21435:12;21428:19;;21087:366;;;:::o;21459:398::-;21618:3;21639:83;21720:1;21715:3;21639:83;:::i;:::-;21632:90;;21731:93;21820:3;21731:93;:::i;:::-;21849:1;21844:3;21840:11;21833:18;;21459:398;;;:::o;21863:366::-;22005:3;22026:67;22090:2;22085:3;22026:67;:::i;:::-;22019:74;;22102:93;22191:3;22102:93;:::i;:::-;22220:2;22215:3;22211:12;22204:19;;21863:366;;;:::o;22235:::-;22377:3;22398:67;22462:2;22457:3;22398:67;:::i;:::-;22391:74;;22474:93;22563:3;22474:93;:::i;:::-;22592:2;22587:3;22583:12;22576:19;;22235:366;;;:::o;22607:::-;22749:3;22770:67;22834:2;22829:3;22770:67;:::i;:::-;22763:74;;22846:93;22935:3;22846:93;:::i;:::-;22964:2;22959:3;22955:12;22948:19;;22607:366;;;:::o;22979:108::-;23056:24;23074:5;23056:24;:::i;:::-;23051:3;23044:37;22979:108;;:::o;23093:118::-;23180:24;23198:5;23180:24;:::i;:::-;23175:3;23168:37;23093:118;;:::o;23217:589::-;23442:3;23464:95;23555:3;23546:6;23464:95;:::i;:::-;23457:102;;23576:95;23667:3;23658:6;23576:95;:::i;:::-;23569:102;;23688:92;23776:3;23767:6;23688:92;:::i;:::-;23681:99;;23797:3;23790:10;;23217:589;;;;;;:::o;23812:379::-;23996:3;24018:147;24161:3;24018:147;:::i;:::-;24011:154;;24182:3;24175:10;;23812:379;;;:::o;24197:222::-;24290:4;24328:2;24317:9;24313:18;24305:26;;24341:71;24409:1;24398:9;24394:17;24385:6;24341:71;:::i;:::-;24197:222;;;;:::o;24425:640::-;24620:4;24658:3;24647:9;24643:19;24635:27;;24672:71;24740:1;24729:9;24725:17;24716:6;24672:71;:::i;:::-;24753:72;24821:2;24810:9;24806:18;24797:6;24753:72;:::i;:::-;24835;24903:2;24892:9;24888:18;24879:6;24835:72;:::i;:::-;24954:9;24948:4;24944:20;24939:2;24928:9;24924:18;24917:48;24982:76;25053:4;25044:6;24982:76;:::i;:::-;24974:84;;24425:640;;;;;;;:::o;25071:373::-;25214:4;25252:2;25241:9;25237:18;25229:26;;25301:9;25295:4;25291:20;25287:1;25276:9;25272:17;25265:47;25329:108;25432:4;25423:6;25329:108;:::i;:::-;25321:116;;25071:373;;;;:::o;25450:210::-;25537:4;25575:2;25564:9;25560:18;25552:26;;25588:65;25650:1;25639:9;25635:17;25626:6;25588:65;:::i;:::-;25450:210;;;;:::o;25666:313::-;25779:4;25817:2;25806:9;25802:18;25794:26;;25866:9;25860:4;25856:20;25852:1;25841:9;25837:17;25830:47;25894:78;25967:4;25958:6;25894:78;:::i;:::-;25886:86;;25666:313;;;;:::o;25985:419::-;26151:4;26189:2;26178:9;26174:18;26166:26;;26238:9;26232:4;26228:20;26224:1;26213:9;26209:17;26202:47;26266:131;26392:4;26266:131;:::i;:::-;26258:139;;25985:419;;;:::o;26410:::-;26576:4;26614:2;26603:9;26599:18;26591:26;;26663:9;26657:4;26653:20;26649:1;26638:9;26634:17;26627:47;26691:131;26817:4;26691:131;:::i;:::-;26683:139;;26410:419;;;:::o;26835:::-;27001:4;27039:2;27028:9;27024:18;27016:26;;27088:9;27082:4;27078:20;27074:1;27063:9;27059:17;27052:47;27116:131;27242:4;27116:131;:::i;:::-;27108:139;;26835:419;;;:::o;27260:::-;27426:4;27464:2;27453:9;27449:18;27441:26;;27513:9;27507:4;27503:20;27499:1;27488:9;27484:17;27477:47;27541:131;27667:4;27541:131;:::i;:::-;27533:139;;27260:419;;;:::o;27685:::-;27851:4;27889:2;27878:9;27874:18;27866:26;;27938:9;27932:4;27928:20;27924:1;27913:9;27909:17;27902:47;27966:131;28092:4;27966:131;:::i;:::-;27958:139;;27685:419;;;:::o;28110:::-;28276:4;28314:2;28303:9;28299:18;28291:26;;28363:9;28357:4;28353:20;28349:1;28338:9;28334:17;28327:47;28391:131;28517:4;28391:131;:::i;:::-;28383:139;;28110:419;;;:::o;28535:::-;28701:4;28739:2;28728:9;28724:18;28716:26;;28788:9;28782:4;28778:20;28774:1;28763:9;28759:17;28752:47;28816:131;28942:4;28816:131;:::i;:::-;28808:139;;28535:419;;;:::o;28960:::-;29126:4;29164:2;29153:9;29149:18;29141:26;;29213:9;29207:4;29203:20;29199:1;29188:9;29184:17;29177:47;29241:131;29367:4;29241:131;:::i;:::-;29233:139;;28960:419;;;:::o;29385:::-;29551:4;29589:2;29578:9;29574:18;29566:26;;29638:9;29632:4;29628:20;29624:1;29613:9;29609:17;29602:47;29666:131;29792:4;29666:131;:::i;:::-;29658:139;;29385:419;;;:::o;29810:::-;29976:4;30014:2;30003:9;29999:18;29991:26;;30063:9;30057:4;30053:20;30049:1;30038:9;30034:17;30027:47;30091:131;30217:4;30091:131;:::i;:::-;30083:139;;29810:419;;;:::o;30235:::-;30401:4;30439:2;30428:9;30424:18;30416:26;;30488:9;30482:4;30478:20;30474:1;30463:9;30459:17;30452:47;30516:131;30642:4;30516:131;:::i;:::-;30508:139;;30235:419;;;:::o;30660:::-;30826:4;30864:2;30853:9;30849:18;30841:26;;30913:9;30907:4;30903:20;30899:1;30888:9;30884:17;30877:47;30941:131;31067:4;30941:131;:::i;:::-;30933:139;;30660:419;;;:::o;31085:::-;31251:4;31289:2;31278:9;31274:18;31266:26;;31338:9;31332:4;31328:20;31324:1;31313:9;31309:17;31302:47;31366:131;31492:4;31366:131;:::i;:::-;31358:139;;31085:419;;;:::o;31510:::-;31676:4;31714:2;31703:9;31699:18;31691:26;;31763:9;31757:4;31753:20;31749:1;31738:9;31734:17;31727:47;31791:131;31917:4;31791:131;:::i;:::-;31783:139;;31510:419;;;:::o;31935:::-;32101:4;32139:2;32128:9;32124:18;32116:26;;32188:9;32182:4;32178:20;32174:1;32163:9;32159:17;32152:47;32216:131;32342:4;32216:131;:::i;:::-;32208:139;;31935:419;;;:::o;32360:::-;32526:4;32564:2;32553:9;32549:18;32541:26;;32613:9;32607:4;32603:20;32599:1;32588:9;32584:17;32577:47;32641:131;32767:4;32641:131;:::i;:::-;32633:139;;32360:419;;;:::o;32785:::-;32951:4;32989:2;32978:9;32974:18;32966:26;;33038:9;33032:4;33028:20;33024:1;33013:9;33009:17;33002:47;33066:131;33192:4;33066:131;:::i;:::-;33058:139;;32785:419;;;:::o;33210:::-;33376:4;33414:2;33403:9;33399:18;33391:26;;33463:9;33457:4;33453:20;33449:1;33438:9;33434:17;33427:47;33491:131;33617:4;33491:131;:::i;:::-;33483:139;;33210:419;;;:::o;33635:::-;33801:4;33839:2;33828:9;33824:18;33816:26;;33888:9;33882:4;33878:20;33874:1;33863:9;33859:17;33852:47;33916:131;34042:4;33916:131;:::i;:::-;33908:139;;33635:419;;;:::o;34060:::-;34226:4;34264:2;34253:9;34249:18;34241:26;;34313:9;34307:4;34303:20;34299:1;34288:9;34284:17;34277:47;34341:131;34467:4;34341:131;:::i;:::-;34333:139;;34060:419;;;:::o;34485:::-;34651:4;34689:2;34678:9;34674:18;34666:26;;34738:9;34732:4;34728:20;34724:1;34713:9;34709:17;34702:47;34766:131;34892:4;34766:131;:::i;:::-;34758:139;;34485:419;;;:::o;34910:::-;35076:4;35114:2;35103:9;35099:18;35091:26;;35163:9;35157:4;35153:20;35149:1;35138:9;35134:17;35127:47;35191:131;35317:4;35191:131;:::i;:::-;35183:139;;34910:419;;;:::o;35335:::-;35501:4;35539:2;35528:9;35524:18;35516:26;;35588:9;35582:4;35578:20;35574:1;35563:9;35559:17;35552:47;35616:131;35742:4;35616:131;:::i;:::-;35608:139;;35335:419;;;:::o;35760:::-;35926:4;35964:2;35953:9;35949:18;35941:26;;36013:9;36007:4;36003:20;35999:1;35988:9;35984:17;35977:47;36041:131;36167:4;36041:131;:::i;:::-;36033:139;;35760:419;;;:::o;36185:::-;36351:4;36389:2;36378:9;36374:18;36366:26;;36438:9;36432:4;36428:20;36424:1;36413:9;36409:17;36402:47;36466:131;36592:4;36466:131;:::i;:::-;36458:139;;36185:419;;;:::o;36610:222::-;36703:4;36741:2;36730:9;36726:18;36718:26;;36754:71;36822:1;36811:9;36807:17;36798:6;36754:71;:::i;:::-;36610:222;;;;:::o;36838:129::-;36872:6;36899:20;;:::i;:::-;36889:30;;36928:33;36956:4;36948:6;36928:33;:::i;:::-;36838:129;;;:::o;36973:75::-;37006:6;37039:2;37033:9;37023:19;;36973:75;:::o;37054:307::-;37115:4;37205:18;37197:6;37194:30;37191:56;;;37227:18;;:::i;:::-;37191:56;37265:29;37287:6;37265:29;:::i;:::-;37257:37;;37349:4;37343;37339:15;37331:23;;37054:307;;;:::o;37367:308::-;37429:4;37519:18;37511:6;37508:30;37505:56;;;37541:18;;:::i;:::-;37505:56;37579:29;37601:6;37579:29;:::i;:::-;37571:37;;37663:4;37657;37653:15;37645:23;;37367:308;;;:::o;37681:132::-;37748:4;37771:3;37763:11;;37801:4;37796:3;37792:14;37784:22;;37681:132;;;:::o;37819:141::-;37868:4;37891:3;37883:11;;37914:3;37911:1;37904:14;37948:4;37945:1;37935:18;37927:26;;37819:141;;;:::o;37966:114::-;38033:6;38067:5;38061:12;38051:22;;37966:114;;;:::o;38086:98::-;38137:6;38171:5;38165:12;38155:22;;38086:98;;;:::o;38190:99::-;38242:6;38276:5;38270:12;38260:22;;38190:99;;;:::o;38295:113::-;38365:4;38397;38392:3;38388:14;38380:22;;38295:113;;;:::o;38414:184::-;38513:11;38547:6;38542:3;38535:19;38587:4;38582:3;38578:14;38563:29;;38414:184;;;;:::o;38604:168::-;38687:11;38721:6;38716:3;38709:19;38761:4;38756:3;38752:14;38737:29;;38604:168;;;;:::o;38778:147::-;38879:11;38916:3;38901:18;;38778:147;;;;:::o;38931:169::-;39015:11;39049:6;39044:3;39037:19;39089:4;39084:3;39080:14;39065:29;;38931:169;;;;:::o;39106:148::-;39208:11;39245:3;39230:18;;39106:148;;;;:::o;39260:305::-;39300:3;39319:20;39337:1;39319:20;:::i;:::-;39314:25;;39353:20;39371:1;39353:20;:::i;:::-;39348:25;;39507:1;39439:66;39435:74;39432:1;39429:81;39426:107;;;39513:18;;:::i;:::-;39426:107;39557:1;39554;39550:9;39543:16;;39260:305;;;;:::o;39571:185::-;39611:1;39628:20;39646:1;39628:20;:::i;:::-;39623:25;;39662:20;39680:1;39662:20;:::i;:::-;39657:25;;39701:1;39691:35;;39706:18;;:::i;:::-;39691:35;39748:1;39745;39741:9;39736:14;;39571:185;;;;:::o;39762:348::-;39802:7;39825:20;39843:1;39825:20;:::i;:::-;39820:25;;39859:20;39877:1;39859:20;:::i;:::-;39854:25;;40047:1;39979:66;39975:74;39972:1;39969:81;39964:1;39957:9;39950:17;39946:105;39943:131;;;40054:18;;:::i;:::-;39943:131;40102:1;40099;40095:9;40084:20;;39762:348;;;;:::o;40116:191::-;40156:4;40176:20;40194:1;40176:20;:::i;:::-;40171:25;;40210:20;40228:1;40210:20;:::i;:::-;40205:25;;40249:1;40246;40243:8;40240:34;;;40254:18;;:::i;:::-;40240:34;40299:1;40296;40292:9;40284:17;;40116:191;;;;:::o;40313:96::-;40350:7;40379:24;40397:5;40379:24;:::i;:::-;40368:35;;40313:96;;;:::o;40415:90::-;40449:7;40492:5;40485:13;40478:21;40467:32;;40415:90;;;:::o;40511:149::-;40547:7;40587:66;40580:5;40576:78;40565:89;;40511:149;;;:::o;40666:126::-;40703:7;40743:42;40736:5;40732:54;40721:65;;40666:126;;;:::o;40798:77::-;40835:7;40864:5;40853:16;;40798:77;;;:::o;40881:154::-;40965:6;40960:3;40955;40942:30;41027:1;41018:6;41013:3;41009:16;41002:27;40881:154;;;:::o;41041:307::-;41109:1;41119:113;41133:6;41130:1;41127:13;41119:113;;;41218:1;41213:3;41209:11;41203:18;41199:1;41194:3;41190:11;41183:39;41155:2;41152:1;41148:10;41143:15;;41119:113;;;41250:6;41247:1;41244:13;41241:101;;;41330:1;41321:6;41316:3;41312:16;41305:27;41241:101;41090:258;41041:307;;;:::o;41354:320::-;41398:6;41435:1;41429:4;41425:12;41415:22;;41482:1;41476:4;41472:12;41503:18;41493:81;;41559:4;41551:6;41547:17;41537:27;;41493:81;41621:2;41613:6;41610:14;41590:18;41587:38;41584:84;;;41640:18;;:::i;:::-;41584:84;41405:269;41354:320;;;:::o;41680:281::-;41763:27;41785:4;41763:27;:::i;:::-;41755:6;41751:40;41893:6;41881:10;41878:22;41857:18;41845:10;41842:34;41839:62;41836:88;;;41904:18;;:::i;:::-;41836:88;41944:10;41940:2;41933:22;41723:238;41680:281;;:::o;41967:233::-;42006:3;42029:24;42047:5;42029:24;:::i;:::-;42020:33;;42075:66;42068:5;42065:77;42062:103;;;42145:18;;:::i;:::-;42062:103;42192:1;42185:5;42181:13;42174:20;;41967:233;;;:::o;42206:176::-;42238:1;42255:20;42273:1;42255:20;:::i;:::-;42250:25;;42289:20;42307:1;42289:20;:::i;:::-;42284:25;;42328:1;42318:35;;42333:18;;:::i;:::-;42318:35;42374:1;42371;42367:9;42362:14;;42206:176;;;;:::o;42388:180::-;42436:77;42433:1;42426:88;42533:4;42530:1;42523:15;42557:4;42554:1;42547:15;42574:180;42622:77;42619:1;42612:88;42719:4;42716:1;42709:15;42743:4;42740:1;42733:15;42760:180;42808:77;42805:1;42798:88;42905:4;42902:1;42895:15;42929:4;42926:1;42919:15;42946:180;42994:77;42991:1;42984:88;43091:4;43088:1;43081:15;43115:4;43112:1;43105:15;43132:180;43180:77;43177:1;43170:88;43277:4;43274:1;43267:15;43301:4;43298:1;43291:15;43318:117;43427:1;43424;43417:12;43441:117;43550:1;43547;43540:12;43564:117;43673:1;43670;43663:12;43687:117;43796:1;43793;43786:12;43810:117;43919:1;43916;43909:12;43933:117;44042:1;44039;44032:12;44056:102;44097:6;44148:2;44144:7;44139:2;44132:5;44128:14;44124:28;44114:38;;44056:102;;;:::o;44164:164::-;44304:16;44300:1;44292:6;44288:14;44281:40;44164:164;:::o;44334:::-;44474:16;44470:1;44462:6;44458:14;44451:40;44334:164;:::o;44504:166::-;44644:18;44640:1;44632:6;44628:14;44621:42;44504:166;:::o;44676:237::-;44816:34;44812:1;44804:6;44800:14;44793:58;44885:20;44880:2;44872:6;44868:15;44861:45;44676:237;:::o;44919:225::-;45059:34;45055:1;45047:6;45043:14;45036:58;45128:8;45123:2;45115:6;45111:15;45104:33;44919:225;:::o;45150:166::-;45290:18;45286:1;45278:6;45274:14;45267:42;45150:166;:::o;45322:224::-;45462:34;45458:1;45450:6;45446:14;45439:58;45531:7;45526:2;45518:6;45514:15;45507:32;45322:224;:::o;45552:178::-;45692:30;45688:1;45680:6;45676:14;45669:54;45552:178;:::o;45736:170::-;45876:22;45872:1;45864:6;45860:14;45853:46;45736:170;:::o;45912:223::-;46052:34;46048:1;46040:6;46036:14;46029:58;46121:6;46116:2;46108:6;46104:15;46097:31;45912:223;:::o;46141:175::-;46281:27;46277:1;46269:6;46265:14;46258:51;46141:175;:::o;46322:231::-;46462:34;46458:1;46450:6;46446:14;46439:58;46531:14;46526:2;46518:6;46514:15;46507:39;46322:231;:::o;46559:243::-;46699:34;46695:1;46687:6;46683:14;46676:58;46768:26;46763:2;46755:6;46751:15;46744:51;46559:243;:::o;46808:229::-;46948:34;46944:1;46936:6;46932:14;46925:58;47017:12;47012:2;47004:6;47000:15;46993:37;46808:229;:::o;47043:228::-;47183:34;47179:1;47171:6;47167:14;47160:58;47252:11;47247:2;47239:6;47235:15;47228:36;47043:228;:::o;47277:170::-;47417:22;47413:1;47405:6;47401:14;47394:46;47277:170;:::o;47453:182::-;47593:34;47589:1;47581:6;47577:14;47570:58;47453:182;:::o;47641:231::-;47781:34;47777:1;47769:6;47765:14;47758:58;47850:14;47845:2;47837:6;47833:15;47826:39;47641:231;:::o;47878:182::-;48018:34;48014:1;48006:6;48002:14;47995:58;47878:182;:::o;48066:173::-;48206:25;48202:1;48194:6;48190:14;48183:49;48066:173;:::o;48245:234::-;48385:34;48381:1;48373:6;48369:14;48362:58;48454:17;48449:2;48441:6;48437:15;48430:42;48245:234;:::o;48485:220::-;48625:34;48621:1;48613:6;48609:14;48602:58;48694:3;48689:2;48681:6;48677:15;48670:28;48485:220;:::o;48711:114::-;;:::o;48831:170::-;48971:22;48967:1;48959:6;48955:14;48948:46;48831:170;:::o;49007:236::-;49147:34;49143:1;49135:6;49131:14;49124:58;49216:19;49211:2;49203:6;49199:15;49192:44;49007:236;:::o;49249:169::-;49389:21;49385:1;49377:6;49373:14;49366:45;49249:169;:::o;49424:122::-;49497:24;49515:5;49497:24;:::i;:::-;49490:5;49487:35;49477:63;;49536:1;49533;49526:12;49477:63;49424:122;:::o;49552:116::-;49622:21;49637:5;49622:21;:::i;:::-;49615:5;49612:32;49602:60;;49658:1;49655;49648:12;49602:60;49552:116;:::o;49674:120::-;49746:23;49763:5;49746:23;:::i;:::-;49739:5;49736:34;49726:62;;49784:1;49781;49774:12;49726:62;49674:120;:::o;49800:122::-;49873:24;49891:5;49873:24;:::i;:::-;49866:5;49863:35;49853:63;;49912:1;49909;49902:12;49853:63;49800:122;:::o

Swarm Source

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