Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
9 OQ3
Holders
8
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 OQ3Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
OQMag3
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-08 */ // File: @openzeppelin\contracts\utils\introspection\IERC165.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin\contracts\token\ERC721\IERC721.sol // // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) /** * @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`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin\contracts\token\ERC721\IERC721Receiver.sol // // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) /** * @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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin\contracts\token\ERC721\extensions\IERC721Metadata.sol // // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin\contracts\utils\Address.sol // // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) /** * @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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin\contracts\utils\Context.sol // // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin\contracts\utils\Strings.sol // // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin\contracts\utils\introspection\ERC165.sol // // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin\contracts\token\ERC721\ERC721.sol // // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) /** * @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: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); 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 overridden 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 token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); 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: caller is not token 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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 an {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 an {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 Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly 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 {} } // File: @openzeppelin\contracts\utils\Counters.sol // // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 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; } } // File: @openzeppelin\contracts\access\Ownable.sol // // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) /** * @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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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); } } // File: @openzeppelin\contracts\utils\cryptography\MerkleProof.sol // // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin\contracts\token\ERC20\IERC20.sol // // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin\contracts\token\ERC20\extensions\draft-IERC20Permit.sol // // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin\contracts\token\ERC20\utils\SafeERC20.sol // // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin\contracts\finance\PaymentSplitter.sol // // OpenZeppelin Contracts (last updated v4.7.0) (finance/PaymentSplitter.sol) /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the * time of contract deployment and can't be updated thereafter. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Getter for the amount of payee's releasable Ether. */ function releasable(address account) public view returns (uint256) { uint256 totalReceived = address(this).balance + totalReleased(); return _pendingPayment(account, totalReceived, released(account)); } /** * @dev Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an * IERC20 contract. */ function releasable(IERC20 token, address account) public view returns (uint256) { uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); return _pendingPayment(account, totalReceived, released(token, account)); } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(account); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(token, account); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: contracts\oqMag3.sol // pragma solidity >=0.7.0 <0.9.0; contract OQMag3 is ERC721, Ownable, PaymentSplitter { using Strings for uint256; using Counters for Counters.Counter; mapping(address => uint256) public addressMintCount; uint16[500] public ids; uint16 private index; Counters.Counter private supply; string public uriPrefix = ""; string public uriSuffix = ".json"; string public hiddenMetadataUri; uint256 public cost = 0.03 ether; uint256 public constant costWL = 0.015 ether; uint256 public currentMaxSupply = 500; uint256 public finalMaxSupply = 500; uint256 public maxMintAmountPerTx = 50; uint256 public maxWLMintCount = 20; bytes32 public wlRoot; bool public paused = true; bool public revealed = true; constructor(address[] memory _payees, uint256[] memory _shares, bytes32 _WLmerkleroot) PaymentSplitter(_payees, _shares) payable ERC721("OQ Magazine", "OQ3") { setHiddenMetadataUri("https://owmag.mypinata.cloud/ipfs/QmTLtQE7X4UAEjv5SXJjV3nqmstWH9iywQbmQzKiughgz2/hiddenMeta.json"); wlRoot = _WLmerkleroot; } function setWLMerkleRoot(bytes32 _WLmerkleroot) external onlyOwner { wlRoot = _WLmerkleroot; } modifier mintCompliance(uint256 _mintAmount) { require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!"); require(supply.current() + _mintAmount <= currentMaxSupply, "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 mintWL(uint256 _mintAmount, bytes32[] calldata _proof) public payable mintCompliance(_mintAmount) { uint256 mintCount = addressMintCount[msg.sender]; require(!paused, "The contract is paused!"); require(msg.value >= costWL * _mintAmount, "Insufficient funds!"); require(_verify(_leaf(msg.sender), _proof, wlRoot), "Not Whitelisted"); require(mintCount + _mintAmount <= maxWLMintCount, "Exceeded whitelist allowance."); addressMintCount[msg.sender] = mintCount + _mintAmount; _mintLoop(msg.sender, _mintAmount); } 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 <= currentMaxSupply) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function setCurrentMaxSupply(uint256 _supply) public onlyOwner { require(_supply <= finalMaxSupply && _supply >= totalSupply()); currentMaxSupply = _supply; } function resetFinalMaxSupply() public onlyOwner { finalMaxSupply = currentMaxSupply; } 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 _leaf(address _account) internal pure returns (bytes32) { return keccak256(abi.encodePacked(_account)); } function _verify(bytes32 leaf, bytes32[] memory _proof, bytes32 _root) pure internal returns (bool) { return MerkleProof.verify(_proof, _root, leaf); } function _pickRandomUniqueId(uint256 random) private returns (uint256 id) { uint256 len = ids.length - index++; require(len > 0, 'no ids left'); uint256 randomIndex = random % len; id = ids[randomIndex] != 0 ? ids[randomIndex] : randomIndex; ids[randomIndex] = uint16(ids[len - 1] == 0 ? len - 1 : ids[len - 1]); ids[len - 1] = 0; } function _mintLoop(address _receiver, uint256 _mintAmount) internal { for (uint256 i = 0; i < _mintAmount; i++) { uint256 _random = uint256(keccak256(abi.encodePacked(index++, msg.sender, block.timestamp, blockhash(block.number-1)))); supply.increment(); _safeMint(_receiver, _pickRandomUniqueId(_random)); } } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_shares","type":"uint256[]"},{"internalType":"bytes32","name":"_WLmerkleroot","type":"bytes32"}],"stateMutability":"payable","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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ids","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWLMintCount","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":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetFinalMaxSupply","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":"uint256","name":"_supply","type":"uint256"}],"name":"setCurrentMaxSupply","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":"bytes32","name":"_WLmerkleroot","type":"bytes32"}],"name":"setWLMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"wlRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052604051806020016040528060008152506031908162000024919062000937565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250603290816200006b919062000937565b50666a94d74f4300006034556101f46035556101f4603655603260375560146038556001603a60006101000a81548160ff0219169083151502179055506001603a60016101000a81548160ff021916908315150217905550604051620070fb380380620070fb8339818101604052810190620000e8919062000d1f565b82826040518060400160405280600b81526020017f4f51204d6167617a696e650000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4f51330000000000000000000000000000000000000000000000000000000000815250816000908162000167919062000937565b50806001908162000179919062000937565b5050506200019c62000190620002d660201b60201c565b620002de60201b60201c565b8051825114620001e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001da9062000e40565b60405180910390fd5b60008251116200022a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002219062000eb2565b60405180910390fd5b60005b825181101562000299576200028383828151811062000251576200025062000ed4565b5b60200260200101518383815181106200026f576200026e62000ed4565b5b6020026020010151620003a460201b60201c565b8080620002909062000f32565b9150506200022d565b505050620002c66040518060800160405280606081526020016200709b60609139620005dd60201b60201c565b806039819055505050506200121d565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000416576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200040d9062000ff5565b60405180910390fd5b600081116200045c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004539062001067565b60405180910390fd5b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414620004e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004d890620010ff565b60405180910390fd5b600b829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060075462000598919062001121565b6007819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac8282604051620005d19291906200117e565b60405180910390a15050565b620005ed6200060260201b60201c565b8060339081620005fe919062000937565b5050565b62000612620002d660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620006386200069360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200068890620011fb565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200073f57607f821691505b602082108103620007555762000754620006f7565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007bf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000780565b620007cb868362000780565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000818620008126200080c84620007e3565b620007ed565b620007e3565b9050919050565b6000819050919050565b6200083483620007f7565b6200084c62000843826200081f565b8484546200078d565b825550505050565b600090565b6200086362000854565b6200087081848462000829565b505050565b5b8181101562000898576200088c60008262000859565b60018101905062000876565b5050565b601f821115620008e757620008b1816200075b565b620008bc8462000770565b81016020851015620008cc578190505b620008e4620008db8562000770565b83018262000875565b50505b505050565b600082821c905092915050565b60006200090c60001984600802620008ec565b1980831691505092915050565b6000620009278383620008f9565b9150826002028217905092915050565b6200094282620006bd565b67ffffffffffffffff8111156200095e576200095d620006c8565b5b6200096a825462000726565b620009778282856200089c565b600060209050601f831160018114620009af57600084156200099a578287015190505b620009a6858262000919565b86555062000a16565b601f198416620009bf866200075b565b60005b82811015620009e957848901518255600182019150602085019450602081019050620009c2565b8683101562000a09578489015162000a05601f891682620008f9565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000a538262000a37565b810181811067ffffffffffffffff8211171562000a755762000a74620006c8565b5b80604052505050565b600062000a8a62000a1e565b905062000a98828262000a48565b919050565b600067ffffffffffffffff82111562000abb5762000aba620006c8565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000afe8262000ad1565b9050919050565b62000b108162000af1565b811462000b1c57600080fd5b50565b60008151905062000b308162000b05565b92915050565b600062000b4d62000b478462000a9d565b62000a7e565b9050808382526020820190506020840283018581111562000b735762000b7262000acc565b5b835b8181101562000ba0578062000b8b888262000b1f565b84526020840193505060208101905062000b75565b5050509392505050565b600082601f83011262000bc25762000bc162000a32565b5b815162000bd484826020860162000b36565b91505092915050565b600067ffffffffffffffff82111562000bfb5762000bfa620006c8565b5b602082029050602081019050919050565b62000c1781620007e3565b811462000c2357600080fd5b50565b60008151905062000c378162000c0c565b92915050565b600062000c5462000c4e8462000bdd565b62000a7e565b9050808382526020820190506020840283018581111562000c7a5762000c7962000acc565b5b835b8181101562000ca7578062000c92888262000c26565b84526020840193505060208101905062000c7c565b5050509392505050565b600082601f83011262000cc95762000cc862000a32565b5b815162000cdb84826020860162000c3d565b91505092915050565b6000819050919050565b62000cf98162000ce4565b811462000d0557600080fd5b50565b60008151905062000d198162000cee565b92915050565b60008060006060848603121562000d3b5762000d3a62000a28565b5b600084015167ffffffffffffffff81111562000d5c5762000d5b62000a2d565b5b62000d6a8682870162000baa565b935050602084015167ffffffffffffffff81111562000d8e5762000d8d62000a2d565b5b62000d9c8682870162000cb1565b925050604062000daf8682870162000d08565b9150509250925092565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b600062000e2860328362000db9565b915062000e358262000dca565b604082019050919050565b6000602082019050818103600083015262000e5b8162000e19565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b600062000e9a601a8362000db9565b915062000ea78262000e62565b602082019050919050565b6000602082019050818103600083015262000ecd8162000e8b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000f3f82620007e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000f745762000f7362000f03565b5b600182019050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b600062000fdd602c8362000db9565b915062000fea8262000f7f565b604082019050919050565b60006020820190508181036000830152620010108162000fce565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b60006200104f601d8362000db9565b91506200105c8262001017565b602082019050919050565b60006020820190508181036000830152620010828162001040565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b6000620010e7602b8362000db9565b9150620010f48262001089565b604082019050919050565b600060208201905081810360008301526200111a81620010d8565b9050919050565b60006200112e82620007e3565b91506200113b83620007e3565b925082820190508082111562001156576200115562000f03565b5b92915050565b620011678162000af1565b82525050565b6200117881620007e3565b82525050565b60006040820190506200119560008301856200115c565b620011a460208301846200116d565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620011e360208362000db9565b9150620011f082620011ab565b602082019050919050565b600060208201905081810360008301526200121681620011d4565b9050919050565b615e6e806200122d6000396000f3fe60806040526004361061036f5760003560e01c8063715018a6116101c6578063a45ba8e7116100f7578063d79779b211610095578063e985e9c51161006f578063e985e9c514610d0d578063efbd73f414610d4a578063f2fde38b14610d73578063fac333ac14610d9c576103b6565b8063d79779b214610c7c578063e0a8085314610cb9578063e33b7de314610ce2576103b6565b8063c45ac050116100d1578063c45ac05014610ba9578063c87b56dd14610be6578063ce7c2ac214610c23578063d0bfb81014610c60576103b6565b8063a45ba8e714610b2c578063b071401b14610b57578063b88d4fde14610b80576103b6565b80638da5cb5b116101645780639852595c1161013e5780639852595c14610a6d578063a0712d6814610aaa578063a22cb46514610ac6578063a3f8eace14610aef576103b6565b80638da5cb5b146109ec57806394354fd014610a1757806395d89b4114610a42576103b6565b80637ec4a659116101a05780637ec4a6591461093057806382c30987146109595780638b83209b146109845780638c2a5a1a146109c1576103b6565b8063715018a6146108c757806373022011146108de5780637d44fd1114610907576103b6565b8063406072a9116102a0578063518302271161023e5780635c975abb116102185780635c975abb146107f757806362b99ad4146108225780636352211e1461084d57806370a082311461088a576103b6565b8063518302271461078a5780635503a0e8146107b5578063569b75f8146107e0576103b6565b806344a0d68a1161027a57806344a0d68a146106e457806348b750441461070d5780634ad66811146107365780634fdd43cb14610761576103b6565b8063406072a91461064157806342842e0e1461067e578063438b6300146106a7576103b6565b806316ba10e01161030d57806319165587116102e757806319165587146105875780631ba4f67d146105b057806323b872dd146105ed5780633a98ef3914610616576103b6565b806316ba10e01461050a57806316c38b3c1461053357806318160ddd1461055c576103b6565b8063081812fc11610349578063081812fc1461044e578063095ea7b31461048b578063104aeef8146104b457806313faede6146104df576103b6565b806301ffc9a7146103bb57806306afd592146103f857806306fdde0314610423576103b6565b366103b6577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061039d610dd9565b346040516103ac929190613c84565b60405180910390a1005b600080fd5b3480156103c757600080fd5b506103e260048036038101906103dd9190613d19565b610de1565b6040516103ef9190613d61565b60405180910390f35b34801561040457600080fd5b5061040d610ec3565b60405161041a9190613d7c565b60405180910390f35b34801561042f57600080fd5b50610438610ece565b6040516104459190613e27565b60405180910390f35b34801561045a57600080fd5b5061047560048036038101906104709190613e75565b610f60565b6040516104829190613ea2565b60405180910390f35b34801561049757600080fd5b506104b260048036038101906104ad9190613ee9565b610fa6565b005b3480156104c057600080fd5b506104c96110bd565b6040516104d69190613d7c565b60405180910390f35b3480156104eb57600080fd5b506104f46110c3565b6040516105019190613d7c565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c919061405e565b6110c9565b005b34801561053f57600080fd5b5061055a600480360381019061055591906140d3565b6110e4565b005b34801561056857600080fd5b50610571611109565b60405161057e9190613d7c565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a9919061413e565b61111a565b005b3480156105bc57600080fd5b506105d760048036038101906105d2919061416b565b6112a2565b6040516105e49190613d7c565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190614198565b6112ba565b005b34801561062257600080fd5b5061062b61131a565b6040516106389190613d7c565b60405180910390f35b34801561064d57600080fd5b5061066860048036038101906106639190614229565b611324565b6040516106759190613d7c565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190614198565b6113ab565b005b3480156106b357600080fd5b506106ce60048036038101906106c9919061416b565b6113cb565b6040516106db9190614327565b60405180910390f35b3480156106f057600080fd5b5061070b60048036038101906107069190613e75565b6114d5565b005b34801561071957600080fd5b50610734600480360381019061072f9190614229565b6114e7565b005b34801561074257600080fd5b5061074b611703565b6040516107589190613d7c565b60405180910390f35b34801561076d57600080fd5b506107886004803603810190610783919061405e565b611709565b005b34801561079657600080fd5b5061079f611724565b6040516107ac9190613d61565b60405180910390f35b3480156107c157600080fd5b506107ca611737565b6040516107d79190613e27565b60405180910390f35b3480156107ec57600080fd5b506107f56117c5565b005b34801561080357600080fd5b5061080c6117d8565b6040516108199190613d61565b60405180910390f35b34801561082e57600080fd5b506108376117eb565b6040516108449190613e27565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f9190613e75565b611879565b6040516108819190613ea2565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac919061416b565b61192a565b6040516108be9190613d7c565b60405180910390f35b3480156108d357600080fd5b506108dc6119e1565b005b3480156108ea57600080fd5b5061090560048036038101906109009190613e75565b6119f5565b005b34801561091357600080fd5b5061092e6004803603810190610929919061437f565b611a29565b005b34801561093c57600080fd5b506109576004803603810190610952919061405e565b611a3b565b005b34801561096557600080fd5b5061096e611a56565b60405161097b91906143bb565b60405180910390f35b34801561099057600080fd5b506109ab60048036038101906109a69190613e75565b611a5c565b6040516109b89190613ea2565b60405180910390f35b3480156109cd57600080fd5b506109d6611aa4565b6040516109e39190613d7c565b60405180910390f35b3480156109f857600080fd5b50610a01611aaa565b604051610a0e9190613ea2565b60405180910390f35b348015610a2357600080fd5b50610a2c611ad4565b604051610a399190613d7c565b60405180910390f35b348015610a4e57600080fd5b50610a57611ada565b604051610a649190613e27565b60405180910390f35b348015610a7957600080fd5b50610a946004803603810190610a8f919061416b565b611b6c565b604051610aa19190613d7c565b60405180910390f35b610ac46004803603810190610abf9190613e75565b611bb5565b005b348015610ad257600080fd5b50610aed6004803603810190610ae891906143d6565b611d0e565b005b348015610afb57600080fd5b50610b166004803603810190610b11919061416b565b611d24565b604051610b239190613d7c565b60405180910390f35b348015610b3857600080fd5b50610b41611d57565b604051610b4e9190613e27565b60405180910390f35b348015610b6357600080fd5b50610b7e6004803603810190610b799190613e75565b611de5565b005b348015610b8c57600080fd5b50610ba76004803603810190610ba291906144b7565b611df7565b005b348015610bb557600080fd5b50610bd06004803603810190610bcb9190614229565b611e59565b604051610bdd9190613d7c565b60405180910390f35b348015610bf257600080fd5b50610c0d6004803603810190610c089190613e75565b611f08565b604051610c1a9190613e27565b60405180910390f35b348015610c2f57600080fd5b50610c4a6004803603810190610c45919061416b565b612060565b604051610c579190613d7c565b60405180910390f35b610c7a6004803603810190610c75919061459a565b6120a9565b005b348015610c8857600080fd5b50610ca36004803603810190610c9e91906145fa565b612382565b604051610cb09190613d7c565b60405180910390f35b348015610cc557600080fd5b50610ce06004803603810190610cdb91906140d3565b6123cb565b005b348015610cee57600080fd5b50610cf76123f0565b604051610d049190613d7c565b60405180910390f35b348015610d1957600080fd5b50610d346004803603810190610d2f9190614627565b6123fa565b604051610d419190613d61565b60405180910390f35b348015610d5657600080fd5b50610d716004803603810190610d6c9190614667565b61248e565b005b348015610d7f57600080fd5b50610d9a6004803603810190610d95919061416b565b612550565b005b348015610da857600080fd5b50610dc36004803603810190610dbe9190613e75565b6125d3565b604051610dd091906146c4565b60405180910390f35b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610eac57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ebc5750610ebb82612602565b5b9050919050565b66354a6ba7a1800081565b606060008054610edd9061470e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f099061470e565b8015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b5050505050905090565b6000610f6b8261266c565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610fb182611879565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611018906147b1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611040610dd9565b73ffffffffffffffffffffffffffffffffffffffff16148061106f575061106e81611069610dd9565b6123fa565b5b6110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590614843565b60405180910390fd5b6110b883836126b7565b505050565b60355481565b60345481565b6110d1612770565b80603290816110e09190614a0f565b5050565b6110ec612770565b80603a60006101000a81548160ff02191690831515021790555050565b600061111560306127ee565b905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390614b53565b60405180910390fd5b60006111a782611d24565b9050600081036111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e390614be5565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461123b9190614c34565b9250508190555080600860008282546112549190614c34565b9250508190555061126582826127fc565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568282604051611296929190614cbd565b60405180910390a15050565b600e6020528060005260406000206000915090505481565b6112cb6112c5610dd9565b826128f0565b61130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190614d58565b60405180910390fd5b611315838383612985565b505050565b6000600754905090565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6113c683838360405180602001604052806000815250611df7565b505050565b606060006113d88361192a565b905060008167ffffffffffffffff8111156113f6576113f5613f33565b5b6040519080825280602002602001820160405280156114245781602001602082028036833780820191505090505b50905060006001905060005b838110801561144157506035548211155b156114c957600061145183611879565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114b5578284838151811061149a57611499614d78565b5b60200260200101818152505081806114b190614da7565b9250505b82806114c090614da7565b93505050611430565b82945050505050919050565b6114dd612770565b8060348190555050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090614b53565b60405180910390fd5b60006115758383611e59565b9050600081036115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b190614be5565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116469190614c34565b9250508190555080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461169c9190614c34565b925050819055506116ae838383612beb565b8273ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a83836040516116f6929190613c84565b60405180910390a2505050565b60365481565b611711612770565b80603390816117209190614a0f565b5050565b603a60019054906101000a900460ff1681565b603280546117449061470e565b80601f01602080910402602001604051908101604052809291908181526020018280546117709061470e565b80156117bd5780601f10611792576101008083540402835291602001916117bd565b820191906000526020600020905b8154815290600101906020018083116117a057829003601f168201915b505050505081565b6117cd612770565b603554603681905550565b603a60009054906101000a900460ff1681565b603180546117f89061470e565b80601f01602080910402602001604051908101604052809291908181526020018280546118249061470e565b80156118715780601f1061184657610100808354040283529160200191611871565b820191906000526020600020905b81548152906001019060200180831161185457829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191890614e3b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361199a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199190614ecd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119e9612770565b6119f36000612c71565b565b6119fd612770565b6036548111158015611a165750611a12611109565b8110155b611a1f57600080fd5b8060358190555050565b611a31612770565b8060398190555050565b611a43612770565b8060319081611a529190614a0f565b5050565b60395481565b6000600b8281548110611a7257611a71614d78565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60385481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60375481565b606060018054611ae99061470e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b159061470e565b8015611b625780601f10611b3757610100808354040283529160200191611b62565b820191906000526020600020905b815481529060010190602001808311611b4557829003601f168201915b5050505050905090565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b80600081118015611bc857506037548111155b611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe90614f39565b60405180910390fd5b60355481611c1560306127ee565b611c1f9190614c34565b1115611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5790614fa5565b60405180910390fd5b603a60009054906101000a900460ff1615611cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca790615011565b60405180910390fd5b81603454611cbe9190615031565b341015611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf7906150bf565b60405180910390fd5b611d0a3383612d37565b5050565b611d20611d19610dd9565b8383612df1565b5050565b600080611d2f6123f0565b47611d3a9190614c34565b9050611d4f8382611d4a86611b6c565b612f5d565b915050919050565b60338054611d649061470e565b80601f0160208091040260200160405190810160405280929190818152602001828054611d909061470e565b8015611ddd5780601f10611db257610100808354040283529160200191611ddd565b820191906000526020600020905b815481529060010190602001808311611dc057829003601f168201915b505050505081565b611ded612770565b8060378190555050565b611e08611e02610dd9565b836128f0565b611e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3e90614d58565b60405180910390fd5b611e5384848484612fcb565b50505050565b600080611e6584612382565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e9e9190613ea2565b602060405180830381865afa158015611ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edf91906150f4565b611ee99190614c34565b9050611eff8382611efa8787611324565b612f5d565b91505092915050565b6060611f1382613027565b611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4990615193565b60405180910390fd5b60001515603a60019054906101000a900460ff16151503611fff5760338054611f7a9061470e565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa69061470e565b8015611ff35780601f10611fc857610100808354040283529160200191611ff3565b820191906000526020600020905b815481529060010190602001808311611fd657829003601f168201915b5050505050905061205b565b6000612009613093565b905060008151116120295760405180602001604052806000815250612057565b8061203384613125565b603260405160200161204793929190615272565b6040516020818303038152906040525b9150505b919050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b826000811180156120bc57506037548111155b6120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f290614f39565b60405180910390fd5b6035548161210960306127ee565b6121139190614c34565b1115612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b90614fa5565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050603a60009054906101000a900460ff16156121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df90615011565b60405180910390fd5b8466354a6ba7a180006121fb9190615031565b34101561223d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612234906150bf565b60405180910390fd5b61229361224933613285565b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506039546132b5565b6122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c9906152ef565b60405180910390fd5b60385485826122e19190614c34565b1115612322576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123199061535b565b60405180910390fd5b848161232e9190614c34565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061237b3386612d37565b5050505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6123d3612770565b80603a60016101000a81548160ff02191690831515021790555050565b6000600854905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b816000811180156124a157506037548111155b6124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d790614f39565b60405180910390fd5b603554816124ee60306127ee565b6124f89190614c34565b1115612539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253090614fa5565b60405180910390fd5b612541612770565b61254b8284612d37565b505050565b612558612770565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125be906153ed565b60405180910390fd5b6125d081612c71565b50565b600f816101f481106125e457600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61267581613027565b6126b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ab90614e3b565b60405180910390fd5b50565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661272a83611879565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612778610dd9565b73ffffffffffffffffffffffffffffffffffffffff16612796611aaa565b73ffffffffffffffffffffffffffffffffffffffff16146127ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e390615459565b60405180910390fd5b565b600081600001549050919050565b8047101561283f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612836906154c5565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161286590615516565b60006040518083038185875af1925050503d80600081146128a2576040519150601f19603f3d011682016040523d82523d6000602084013e6128a7565b606091505b50509050806128eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e29061559d565b60405180910390fd5b505050565b6000806128fc83611879565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061293e575061293d81856123fa565b5b8061297c57508373ffffffffffffffffffffffffffffffffffffffff1661296484610f60565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129a582611879565b73ffffffffffffffffffffffffffffffffffffffff16146129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f29061562f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a61906156c1565b60405180910390fd5b612a758383836132cb565b612a806000826126b7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ad091906156e1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b279190614c34565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612be68383836132d0565b505050565b612c6c8363a9059cbb60e01b8484604051602401612c0a929190613c84565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506132d5565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015612dec576000602f600081819054906101000a900461ffff1680929190612d6490615715565b91906101000a81548161ffff021916908361ffff1602179055503342600143612d8d91906156e1565b40604051602001612da194939291906157ff565b6040516020818303038152906040528051906020012060001c9050612dc6603061339c565b612dd884612dd3836133b2565b6135ec565b508080612de490614da7565b915050612d3a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5690615899565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f509190613d61565b60405180910390a3505050565b600081600754600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485612fae9190615031565b612fb891906158e8565b612fc291906156e1565b90509392505050565b612fd6848484612985565b612fe28484848461360a565b613021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130189061598b565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060603180546130a29061470e565b80601f01602080910402602001604051908101604052809291908181526020018280546130ce9061470e565b801561311b5780601f106130f05761010080835404028352916020019161311b565b820191906000526020600020905b8154815290600101906020018083116130fe57829003601f168201915b5050505050905090565b60606000820361316c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613280565b600082905060005b6000821461319e57808061318790614da7565b915050600a8261319791906158e8565b9150613174565b60008167ffffffffffffffff8111156131ba576131b9613f33565b5b6040519080825280601f01601f1916602001820160405280156131ec5781602001600182028036833780820191505090505b5090505b600085146132795760018261320591906156e1565b9150600a8561321491906159ab565b60306132209190614c34565b60f81b81838151811061323657613235614d78565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561327291906158e8565b94506131f0565b8093505050505b919050565b60008160405160200161329891906159dc565b604051602081830303815290604052805190602001209050919050565b60006132c2838386613791565b90509392505050565b505050565b505050565b6000613337826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137a89092919063ffffffff16565b905060008151111561339757808060200190518101906133579190615a0c565b613396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338d90615aab565b60405180910390fd5b5b505050565b6001816000016000828254019250508190555050565b600080602f600081819054906101000a900461ffff16809291906133d590615715565b91906101000a81548161ffff021916908361ffff16021790555061ffff166101f461340091906156e1565b905060008111613445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343c90615b17565b60405180910390fd5b6000818461345391906159ab565b90506000600f826101f4811061346c5761346b614d78565b5b601091828204019190066002029054906101000a900461ffff1661ffff160361349557806134c9565b600f816101f481106134aa576134a9614d78565b5b601091828204019190066002029054906101000a900461ffff1661ffff165b92506000600f6001846134dc91906156e1565b6101f481106134ee576134ed614d78565b5b601091828204019190066002029054906101000a900461ffff1661ffff161461355557600f60018361352091906156e1565b6101f4811061353257613531614d78565b5b601091828204019190066002029054906101000a900461ffff1661ffff16613563565b60018261356291906156e1565b5b600f826101f4811061357857613577614d78565b5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506000600f6001846135ae91906156e1565b6101f481106135c0576135bf614d78565b5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050919050565b6136068282604051806020016040528060008152506137c0565b5050565b600061362b8473ffffffffffffffffffffffffffffffffffffffff1661381b565b15613784578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613654610dd9565b8786866040518563ffffffff1660e01b81526004016136769493929190615b8c565b6020604051808303816000875af19250505080156136b257506040513d601f19601f820116820180604052508101906136af9190615bed565b60015b613734573d80600081146136e2576040519150601f19603f3d011682016040523d82523d6000602084013e6136e7565b606091505b50600081510361372c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137239061598b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613789565b600190505b949350505050565b60008261379e858461383e565b1490509392505050565b60606137b78484600085613894565b90509392505050565b6137ca83836139a8565b6137d7600084848461360a565b613816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380d9061598b565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b8451811015613889576138748286838151811061386757613866614d78565b5b6020026020010151613b81565b9150808061388190614da7565b915050613847565b508091505092915050565b6060824710156138d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d090615c8c565b60405180910390fd5b6138e28561381b565b613921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391890615cf8565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161394a9190615d49565b60006040518083038185875af1925050503d8060008114613987576040519150601f19603f3d011682016040523d82523d6000602084013e61398c565b606091505b509150915061399c828286613bac565b92505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0e90615dac565b60405180910390fd5b613a2081613027565b15613a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a5790615e18565b60405180910390fd5b613a6c600083836132cb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613abc9190614c34565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b7d600083836132d0565b5050565b6000818310613b9957613b948284613c13565b613ba4565b613ba38383613c13565b5b905092915050565b60608315613bbc57829050613c0c565b600083511115613bcf5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c039190613e27565b60405180910390fd5b9392505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c5582613c2a565b9050919050565b613c6581613c4a565b82525050565b6000819050919050565b613c7e81613c6b565b82525050565b6000604082019050613c996000830185613c5c565b613ca66020830184613c75565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cf681613cc1565b8114613d0157600080fd5b50565b600081359050613d1381613ced565b92915050565b600060208284031215613d2f57613d2e613cb7565b5b6000613d3d84828501613d04565b91505092915050565b60008115159050919050565b613d5b81613d46565b82525050565b6000602082019050613d766000830184613d52565b92915050565b6000602082019050613d916000830184613c75565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613dd1578082015181840152602081019050613db6565b60008484015250505050565b6000601f19601f8301169050919050565b6000613df982613d97565b613e038185613da2565b9350613e13818560208601613db3565b613e1c81613ddd565b840191505092915050565b60006020820190508181036000830152613e418184613dee565b905092915050565b613e5281613c6b565b8114613e5d57600080fd5b50565b600081359050613e6f81613e49565b92915050565b600060208284031215613e8b57613e8a613cb7565b5b6000613e9984828501613e60565b91505092915050565b6000602082019050613eb76000830184613c5c565b92915050565b613ec681613c4a565b8114613ed157600080fd5b50565b600081359050613ee381613ebd565b92915050565b60008060408385031215613f0057613eff613cb7565b5b6000613f0e85828601613ed4565b9250506020613f1f85828601613e60565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f6b82613ddd565b810181811067ffffffffffffffff82111715613f8a57613f89613f33565b5b80604052505050565b6000613f9d613cad565b9050613fa98282613f62565b919050565b600067ffffffffffffffff821115613fc957613fc8613f33565b5b613fd282613ddd565b9050602081019050919050565b82818337600083830152505050565b6000614001613ffc84613fae565b613f93565b90508281526020810184848401111561401d5761401c613f2e565b5b614028848285613fdf565b509392505050565b600082601f83011261404557614044613f29565b5b8135614055848260208601613fee565b91505092915050565b60006020828403121561407457614073613cb7565b5b600082013567ffffffffffffffff81111561409257614091613cbc565b5b61409e84828501614030565b91505092915050565b6140b081613d46565b81146140bb57600080fd5b50565b6000813590506140cd816140a7565b92915050565b6000602082840312156140e9576140e8613cb7565b5b60006140f7848285016140be565b91505092915050565b600061410b82613c2a565b9050919050565b61411b81614100565b811461412657600080fd5b50565b60008135905061413881614112565b92915050565b60006020828403121561415457614153613cb7565b5b600061416284828501614129565b91505092915050565b60006020828403121561418157614180613cb7565b5b600061418f84828501613ed4565b91505092915050565b6000806000606084860312156141b1576141b0613cb7565b5b60006141bf86828701613ed4565b93505060206141d086828701613ed4565b92505060406141e186828701613e60565b9150509250925092565b60006141f682613c4a565b9050919050565b614206816141eb565b811461421157600080fd5b50565b600081359050614223816141fd565b92915050565b600080604083850312156142405761423f613cb7565b5b600061424e85828601614214565b925050602061425f85828601613ed4565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61429e81613c6b565b82525050565b60006142b08383614295565b60208301905092915050565b6000602082019050919050565b60006142d482614269565b6142de8185614274565b93506142e983614285565b8060005b8381101561431a57815161430188826142a4565b975061430c836142bc565b9250506001810190506142ed565b5085935050505092915050565b6000602082019050818103600083015261434181846142c9565b905092915050565b6000819050919050565b61435c81614349565b811461436757600080fd5b50565b60008135905061437981614353565b92915050565b60006020828403121561439557614394613cb7565b5b60006143a38482850161436a565b91505092915050565b6143b581614349565b82525050565b60006020820190506143d060008301846143ac565b92915050565b600080604083850312156143ed576143ec613cb7565b5b60006143fb85828601613ed4565b925050602061440c858286016140be565b9150509250929050565b600067ffffffffffffffff82111561443157614430613f33565b5b61443a82613ddd565b9050602081019050919050565b600061445a61445584614416565b613f93565b90508281526020810184848401111561447657614475613f2e565b5b614481848285613fdf565b509392505050565b600082601f83011261449e5761449d613f29565b5b81356144ae848260208601614447565b91505092915050565b600080600080608085870312156144d1576144d0613cb7565b5b60006144df87828801613ed4565b94505060206144f087828801613ed4565b935050604061450187828801613e60565b925050606085013567ffffffffffffffff81111561452257614521613cbc565b5b61452e87828801614489565b91505092959194509250565b600080fd5b600080fd5b60008083601f84011261455a57614559613f29565b5b8235905067ffffffffffffffff8111156145775761457661453a565b5b6020830191508360208202830111156145935761459261453f565b5b9250929050565b6000806000604084860312156145b3576145b2613cb7565b5b60006145c186828701613e60565b935050602084013567ffffffffffffffff8111156145e2576145e1613cbc565b5b6145ee86828701614544565b92509250509250925092565b6000602082840312156146105761460f613cb7565b5b600061461e84828501614214565b91505092915050565b6000806040838503121561463e5761463d613cb7565b5b600061464c85828601613ed4565b925050602061465d85828601613ed4565b9150509250929050565b6000806040838503121561467e5761467d613cb7565b5b600061468c85828601613e60565b925050602061469d85828601613ed4565b9150509250929050565b600061ffff82169050919050565b6146be816146a7565b82525050565b60006020820190506146d960008301846146b5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061472657607f821691505b602082108103614739576147386146df565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061479b602183613da2565b91506147a68261473f565b604082019050919050565b600060208201905081810360008301526147ca8161478e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b600061482d603e83613da2565b9150614838826147d1565b604082019050919050565b6000602082019050818103600083015261485c81614820565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614888565b6148cf8683614888565b95508019841693508086168417925050509392505050565b6000819050919050565b600061490c61490761490284613c6b565b6148e7565b613c6b565b9050919050565b6000819050919050565b614926836148f1565b61493a61493282614913565b848454614895565b825550505050565b600090565b61494f614942565b61495a81848461491d565b505050565b5b8181101561497e57614973600082614947565b600181019050614960565b5050565b601f8211156149c35761499481614863565b61499d84614878565b810160208510156149ac578190505b6149c06149b885614878565b83018261495f565b50505b505050565b600082821c905092915050565b60006149e6600019846008026149c8565b1980831691505092915050565b60006149ff83836149d5565b9150826002028217905092915050565b614a1882613d97565b67ffffffffffffffff811115614a3157614a30613f33565b5b614a3b825461470e565b614a46828285614982565b600060209050601f831160018114614a795760008415614a67578287015190505b614a7185826149f3565b865550614ad9565b601f198416614a8786614863565b60005b82811015614aaf57848901518255600182019150602085019450602081019050614a8a565b86831015614acc5784890151614ac8601f8916826149d5565b8355505b6001600288020188555050505b505050505050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000614b3d602683613da2565b9150614b4882614ae1565b604082019050919050565b60006020820190508181036000830152614b6c81614b30565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614bcf602b83613da2565b9150614bda82614b73565b604082019050919050565b60006020820190508181036000830152614bfe81614bc2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c3f82613c6b565b9150614c4a83613c6b565b9250828201905080821115614c6257614c61614c05565b5b92915050565b6000614c83614c7e614c7984613c2a565b6148e7565b613c2a565b9050919050565b6000614c9582614c68565b9050919050565b6000614ca782614c8a565b9050919050565b614cb781614c9c565b82525050565b6000604082019050614cd26000830185614cae565b614cdf6020830184613c75565b9392505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614d42602e83613da2565b9150614d4d82614ce6565b604082019050919050565b60006020820190508181036000830152614d7181614d35565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614db282613c6b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614de457614de3614c05565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614e25601883613da2565b9150614e3082614def565b602082019050919050565b60006020820190508181036000830152614e5481614e18565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614eb7602983613da2565b9150614ec282614e5b565b604082019050919050565b60006020820190508181036000830152614ee681614eaa565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000614f23601483613da2565b9150614f2e82614eed565b602082019050919050565b60006020820190508181036000830152614f5281614f16565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614f8f601483613da2565b9150614f9a82614f59565b602082019050919050565b60006020820190508181036000830152614fbe81614f82565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000614ffb601783613da2565b915061500682614fc5565b602082019050919050565b6000602082019050818103600083015261502a81614fee565b9050919050565b600061503c82613c6b565b915061504783613c6b565b925082820261505581613c6b565b9150828204841483151761506c5761506b614c05565b5b5092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006150a9601383613da2565b91506150b482615073565b602082019050919050565b600060208201905081810360008301526150d88161509c565b9050919050565b6000815190506150ee81613e49565b92915050565b60006020828403121561510a57615109613cb7565b5b6000615118848285016150df565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061517d602f83613da2565b915061518882615121565b604082019050919050565b600060208201905081810360008301526151ac81615170565b9050919050565b600081905092915050565b60006151c982613d97565b6151d381856151b3565b93506151e3818560208601613db3565b80840191505092915050565b600081546151fc8161470e565b61520681866151b3565b94506001821660008114615221576001811461523657615269565b60ff1983168652811515820286019350615269565b61523f85614863565b60005b8381101561526157815481890152600182019150602081019050615242565b838801955050505b50505092915050565b600061527e82866151be565b915061528a82856151be565b915061529682846151ef565b9150819050949350505050565b7f4e6f742057686974656c69737465640000000000000000000000000000000000600082015250565b60006152d9600f83613da2565b91506152e4826152a3565b602082019050919050565b60006020820190508181036000830152615308816152cc565b9050919050565b7f45786365656465642077686974656c69737420616c6c6f77616e63652e000000600082015250565b6000615345601d83613da2565b91506153508261530f565b602082019050919050565b6000602082019050818103600083015261537481615338565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153d7602683613da2565b91506153e28261537b565b604082019050919050565b60006020820190508181036000830152615406816153ca565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615443602083613da2565b915061544e8261540d565b602082019050919050565b6000602082019050818103600083015261547281615436565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006154af601d83613da2565b91506154ba82615479565b602082019050919050565b600060208201905081810360008301526154de816154a2565b9050919050565b600081905092915050565b50565b60006155006000836154e5565b915061550b826154f0565b600082019050919050565b6000615521826154f3565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000615587603a83613da2565b91506155928261552b565b604082019050919050565b600060208201905081810360008301526155b68161557a565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615619602583613da2565b9150615624826155bd565b604082019050919050565b600060208201905081810360008301526156488161560c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006156ab602483613da2565b91506156b68261564f565b604082019050919050565b600060208201905081810360008301526156da8161569e565b9050919050565b60006156ec82613c6b565b91506156f783613c6b565b925082820390508181111561570f5761570e614c05565b5b92915050565b6000615720826146a7565b915061ffff820361573457615733614c05565b5b600182019050919050565b60008160f01b9050919050565b60006157578261573f565b9050919050565b61576f61576a826146a7565b61574c565b82525050565b60008160601b9050919050565b600061578d82615775565b9050919050565b600061579f82615782565b9050919050565b6157b76157b282613c4a565b615794565b82525050565b6000819050919050565b6157d86157d382613c6b565b6157bd565b82525050565b6000819050919050565b6157f96157f482614349565b6157de565b82525050565b600061580b828761575e565b60028201915061581b82866157a6565b60148201915061582b82856157c7565b60208201915061583b82846157e8565b60208201915081905095945050505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615883601983613da2565b915061588e8261584d565b602082019050919050565b600060208201905081810360008301526158b281615876565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006158f382613c6b565b91506158fe83613c6b565b92508261590e5761590d6158b9565b5b828204905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615975603283613da2565b915061598082615919565b604082019050919050565b600060208201905081810360008301526159a481615968565b9050919050565b60006159b682613c6b565b91506159c183613c6b565b9250826159d1576159d06158b9565b5b828206905092915050565b60006159e882846157a6565b60148201915081905092915050565b600081519050615a06816140a7565b92915050565b600060208284031215615a2257615a21613cb7565b5b6000615a30848285016159f7565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615a95602a83613da2565b9150615aa082615a39565b604082019050919050565b60006020820190508181036000830152615ac481615a88565b9050919050565b7f6e6f20696473206c656674000000000000000000000000000000000000000000600082015250565b6000615b01600b83613da2565b9150615b0c82615acb565b602082019050919050565b60006020820190508181036000830152615b3081615af4565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615b5e82615b37565b615b688185615b42565b9350615b78818560208601613db3565b615b8181613ddd565b840191505092915050565b6000608082019050615ba16000830187613c5c565b615bae6020830186613c5c565b615bbb6040830185613c75565b8181036060830152615bcd8184615b53565b905095945050505050565b600081519050615be781613ced565b92915050565b600060208284031215615c0357615c02613cb7565b5b6000615c1184828501615bd8565b91505092915050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615c76602683613da2565b9150615c8182615c1a565b604082019050919050565b60006020820190508181036000830152615ca581615c69565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615ce2601d83613da2565b9150615ced82615cac565b602082019050919050565b60006020820190508181036000830152615d1181615cd5565b9050919050565b6000615d2382615b37565b615d2d81856154e5565b9350615d3d818560208601613db3565b80840191505092915050565b6000615d558284615d18565b915081905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615d96602083613da2565b9150615da182615d60565b602082019050919050565b60006020820190508181036000830152615dc581615d89565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615e02601c83613da2565b9150615e0d82615dcc565b602082019050919050565b60006020820190508181036000830152615e3181615df5565b905091905056fea26469706673582212204cca1def1894b0358dde361d06f979a1d65b5c9a54ef24a65df9f0a24912025a64736f6c6343000811003368747470733a2f2f6f776d61672e6d7970696e6174612e636c6f75642f697066732f516d544c7451453758345541456a763553584a6a56336e716d737457483969797751626d517a4b69756768677a322f68696464656e4d6574612e6a736f6e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140b3738760361f3525e0bf891d1b78e2be362946561922136c41bfddafbdce49960000000000000000000000000000000000000000000000000000000000000006000000000000000000000000af16bece4c1b8612649eded817d92ce511c15dda00000000000000000000000053d785a16006fa2010d45d64fef818bb76b65137000000000000000000000000d5fd92317468d34607bff917cbb3d0ca4a9c2839000000000000000000000000a2215bdec9f3f4daed848032df35440f367630270000000000000000000000000ba6d637f8b9910c57e5c55a634074db505feb26000000000000000000000000c7161d1b10da41980f527beaaddb6d8a1cd229100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000002
Deployed Bytecode
0x60806040526004361061036f5760003560e01c8063715018a6116101c6578063a45ba8e7116100f7578063d79779b211610095578063e985e9c51161006f578063e985e9c514610d0d578063efbd73f414610d4a578063f2fde38b14610d73578063fac333ac14610d9c576103b6565b8063d79779b214610c7c578063e0a8085314610cb9578063e33b7de314610ce2576103b6565b8063c45ac050116100d1578063c45ac05014610ba9578063c87b56dd14610be6578063ce7c2ac214610c23578063d0bfb81014610c60576103b6565b8063a45ba8e714610b2c578063b071401b14610b57578063b88d4fde14610b80576103b6565b80638da5cb5b116101645780639852595c1161013e5780639852595c14610a6d578063a0712d6814610aaa578063a22cb46514610ac6578063a3f8eace14610aef576103b6565b80638da5cb5b146109ec57806394354fd014610a1757806395d89b4114610a42576103b6565b80637ec4a659116101a05780637ec4a6591461093057806382c30987146109595780638b83209b146109845780638c2a5a1a146109c1576103b6565b8063715018a6146108c757806373022011146108de5780637d44fd1114610907576103b6565b8063406072a9116102a0578063518302271161023e5780635c975abb116102185780635c975abb146107f757806362b99ad4146108225780636352211e1461084d57806370a082311461088a576103b6565b8063518302271461078a5780635503a0e8146107b5578063569b75f8146107e0576103b6565b806344a0d68a1161027a57806344a0d68a146106e457806348b750441461070d5780634ad66811146107365780634fdd43cb14610761576103b6565b8063406072a91461064157806342842e0e1461067e578063438b6300146106a7576103b6565b806316ba10e01161030d57806319165587116102e757806319165587146105875780631ba4f67d146105b057806323b872dd146105ed5780633a98ef3914610616576103b6565b806316ba10e01461050a57806316c38b3c1461053357806318160ddd1461055c576103b6565b8063081812fc11610349578063081812fc1461044e578063095ea7b31461048b578063104aeef8146104b457806313faede6146104df576103b6565b806301ffc9a7146103bb57806306afd592146103f857806306fdde0314610423576103b6565b366103b6577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061039d610dd9565b346040516103ac929190613c84565b60405180910390a1005b600080fd5b3480156103c757600080fd5b506103e260048036038101906103dd9190613d19565b610de1565b6040516103ef9190613d61565b60405180910390f35b34801561040457600080fd5b5061040d610ec3565b60405161041a9190613d7c565b60405180910390f35b34801561042f57600080fd5b50610438610ece565b6040516104459190613e27565b60405180910390f35b34801561045a57600080fd5b5061047560048036038101906104709190613e75565b610f60565b6040516104829190613ea2565b60405180910390f35b34801561049757600080fd5b506104b260048036038101906104ad9190613ee9565b610fa6565b005b3480156104c057600080fd5b506104c96110bd565b6040516104d69190613d7c565b60405180910390f35b3480156104eb57600080fd5b506104f46110c3565b6040516105019190613d7c565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c919061405e565b6110c9565b005b34801561053f57600080fd5b5061055a600480360381019061055591906140d3565b6110e4565b005b34801561056857600080fd5b50610571611109565b60405161057e9190613d7c565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a9919061413e565b61111a565b005b3480156105bc57600080fd5b506105d760048036038101906105d2919061416b565b6112a2565b6040516105e49190613d7c565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190614198565b6112ba565b005b34801561062257600080fd5b5061062b61131a565b6040516106389190613d7c565b60405180910390f35b34801561064d57600080fd5b5061066860048036038101906106639190614229565b611324565b6040516106759190613d7c565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190614198565b6113ab565b005b3480156106b357600080fd5b506106ce60048036038101906106c9919061416b565b6113cb565b6040516106db9190614327565b60405180910390f35b3480156106f057600080fd5b5061070b60048036038101906107069190613e75565b6114d5565b005b34801561071957600080fd5b50610734600480360381019061072f9190614229565b6114e7565b005b34801561074257600080fd5b5061074b611703565b6040516107589190613d7c565b60405180910390f35b34801561076d57600080fd5b506107886004803603810190610783919061405e565b611709565b005b34801561079657600080fd5b5061079f611724565b6040516107ac9190613d61565b60405180910390f35b3480156107c157600080fd5b506107ca611737565b6040516107d79190613e27565b60405180910390f35b3480156107ec57600080fd5b506107f56117c5565b005b34801561080357600080fd5b5061080c6117d8565b6040516108199190613d61565b60405180910390f35b34801561082e57600080fd5b506108376117eb565b6040516108449190613e27565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f9190613e75565b611879565b6040516108819190613ea2565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac919061416b565b61192a565b6040516108be9190613d7c565b60405180910390f35b3480156108d357600080fd5b506108dc6119e1565b005b3480156108ea57600080fd5b5061090560048036038101906109009190613e75565b6119f5565b005b34801561091357600080fd5b5061092e6004803603810190610929919061437f565b611a29565b005b34801561093c57600080fd5b506109576004803603810190610952919061405e565b611a3b565b005b34801561096557600080fd5b5061096e611a56565b60405161097b91906143bb565b60405180910390f35b34801561099057600080fd5b506109ab60048036038101906109a69190613e75565b611a5c565b6040516109b89190613ea2565b60405180910390f35b3480156109cd57600080fd5b506109d6611aa4565b6040516109e39190613d7c565b60405180910390f35b3480156109f857600080fd5b50610a01611aaa565b604051610a0e9190613ea2565b60405180910390f35b348015610a2357600080fd5b50610a2c611ad4565b604051610a399190613d7c565b60405180910390f35b348015610a4e57600080fd5b50610a57611ada565b604051610a649190613e27565b60405180910390f35b348015610a7957600080fd5b50610a946004803603810190610a8f919061416b565b611b6c565b604051610aa19190613d7c565b60405180910390f35b610ac46004803603810190610abf9190613e75565b611bb5565b005b348015610ad257600080fd5b50610aed6004803603810190610ae891906143d6565b611d0e565b005b348015610afb57600080fd5b50610b166004803603810190610b11919061416b565b611d24565b604051610b239190613d7c565b60405180910390f35b348015610b3857600080fd5b50610b41611d57565b604051610b4e9190613e27565b60405180910390f35b348015610b6357600080fd5b50610b7e6004803603810190610b799190613e75565b611de5565b005b348015610b8c57600080fd5b50610ba76004803603810190610ba291906144b7565b611df7565b005b348015610bb557600080fd5b50610bd06004803603810190610bcb9190614229565b611e59565b604051610bdd9190613d7c565b60405180910390f35b348015610bf257600080fd5b50610c0d6004803603810190610c089190613e75565b611f08565b604051610c1a9190613e27565b60405180910390f35b348015610c2f57600080fd5b50610c4a6004803603810190610c45919061416b565b612060565b604051610c579190613d7c565b60405180910390f35b610c7a6004803603810190610c75919061459a565b6120a9565b005b348015610c8857600080fd5b50610ca36004803603810190610c9e91906145fa565b612382565b604051610cb09190613d7c565b60405180910390f35b348015610cc557600080fd5b50610ce06004803603810190610cdb91906140d3565b6123cb565b005b348015610cee57600080fd5b50610cf76123f0565b604051610d049190613d7c565b60405180910390f35b348015610d1957600080fd5b50610d346004803603810190610d2f9190614627565b6123fa565b604051610d419190613d61565b60405180910390f35b348015610d5657600080fd5b50610d716004803603810190610d6c9190614667565b61248e565b005b348015610d7f57600080fd5b50610d9a6004803603810190610d95919061416b565b612550565b005b348015610da857600080fd5b50610dc36004803603810190610dbe9190613e75565b6125d3565b604051610dd091906146c4565b60405180910390f35b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610eac57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ebc5750610ebb82612602565b5b9050919050565b66354a6ba7a1800081565b606060008054610edd9061470e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f099061470e565b8015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b5050505050905090565b6000610f6b8261266c565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610fb182611879565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611018906147b1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611040610dd9565b73ffffffffffffffffffffffffffffffffffffffff16148061106f575061106e81611069610dd9565b6123fa565b5b6110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590614843565b60405180910390fd5b6110b883836126b7565b505050565b60355481565b60345481565b6110d1612770565b80603290816110e09190614a0f565b5050565b6110ec612770565b80603a60006101000a81548160ff02191690831515021790555050565b600061111560306127ee565b905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390614b53565b60405180910390fd5b60006111a782611d24565b9050600081036111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e390614be5565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461123b9190614c34565b9250508190555080600860008282546112549190614c34565b9250508190555061126582826127fc565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568282604051611296929190614cbd565b60405180910390a15050565b600e6020528060005260406000206000915090505481565b6112cb6112c5610dd9565b826128f0565b61130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190614d58565b60405180910390fd5b611315838383612985565b505050565b6000600754905090565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6113c683838360405180602001604052806000815250611df7565b505050565b606060006113d88361192a565b905060008167ffffffffffffffff8111156113f6576113f5613f33565b5b6040519080825280602002602001820160405280156114245781602001602082028036833780820191505090505b50905060006001905060005b838110801561144157506035548211155b156114c957600061145183611879565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114b5578284838151811061149a57611499614d78565b5b60200260200101818152505081806114b190614da7565b9250505b82806114c090614da7565b93505050611430565b82945050505050919050565b6114dd612770565b8060348190555050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090614b53565b60405180910390fd5b60006115758383611e59565b9050600081036115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b190614be5565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116469190614c34565b9250508190555080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461169c9190614c34565b925050819055506116ae838383612beb565b8273ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a83836040516116f6929190613c84565b60405180910390a2505050565b60365481565b611711612770565b80603390816117209190614a0f565b5050565b603a60019054906101000a900460ff1681565b603280546117449061470e565b80601f01602080910402602001604051908101604052809291908181526020018280546117709061470e565b80156117bd5780601f10611792576101008083540402835291602001916117bd565b820191906000526020600020905b8154815290600101906020018083116117a057829003601f168201915b505050505081565b6117cd612770565b603554603681905550565b603a60009054906101000a900460ff1681565b603180546117f89061470e565b80601f01602080910402602001604051908101604052809291908181526020018280546118249061470e565b80156118715780601f1061184657610100808354040283529160200191611871565b820191906000526020600020905b81548152906001019060200180831161185457829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191890614e3b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361199a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199190614ecd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119e9612770565b6119f36000612c71565b565b6119fd612770565b6036548111158015611a165750611a12611109565b8110155b611a1f57600080fd5b8060358190555050565b611a31612770565b8060398190555050565b611a43612770565b8060319081611a529190614a0f565b5050565b60395481565b6000600b8281548110611a7257611a71614d78565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60385481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60375481565b606060018054611ae99061470e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b159061470e565b8015611b625780601f10611b3757610100808354040283529160200191611b62565b820191906000526020600020905b815481529060010190602001808311611b4557829003601f168201915b5050505050905090565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b80600081118015611bc857506037548111155b611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe90614f39565b60405180910390fd5b60355481611c1560306127ee565b611c1f9190614c34565b1115611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5790614fa5565b60405180910390fd5b603a60009054906101000a900460ff1615611cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca790615011565b60405180910390fd5b81603454611cbe9190615031565b341015611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf7906150bf565b60405180910390fd5b611d0a3383612d37565b5050565b611d20611d19610dd9565b8383612df1565b5050565b600080611d2f6123f0565b47611d3a9190614c34565b9050611d4f8382611d4a86611b6c565b612f5d565b915050919050565b60338054611d649061470e565b80601f0160208091040260200160405190810160405280929190818152602001828054611d909061470e565b8015611ddd5780601f10611db257610100808354040283529160200191611ddd565b820191906000526020600020905b815481529060010190602001808311611dc057829003601f168201915b505050505081565b611ded612770565b8060378190555050565b611e08611e02610dd9565b836128f0565b611e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3e90614d58565b60405180910390fd5b611e5384848484612fcb565b50505050565b600080611e6584612382565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e9e9190613ea2565b602060405180830381865afa158015611ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edf91906150f4565b611ee99190614c34565b9050611eff8382611efa8787611324565b612f5d565b91505092915050565b6060611f1382613027565b611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4990615193565b60405180910390fd5b60001515603a60019054906101000a900460ff16151503611fff5760338054611f7a9061470e565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa69061470e565b8015611ff35780601f10611fc857610100808354040283529160200191611ff3565b820191906000526020600020905b815481529060010190602001808311611fd657829003601f168201915b5050505050905061205b565b6000612009613093565b905060008151116120295760405180602001604052806000815250612057565b8061203384613125565b603260405160200161204793929190615272565b6040516020818303038152906040525b9150505b919050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b826000811180156120bc57506037548111155b6120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f290614f39565b60405180910390fd5b6035548161210960306127ee565b6121139190614c34565b1115612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b90614fa5565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050603a60009054906101000a900460ff16156121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df90615011565b60405180910390fd5b8466354a6ba7a180006121fb9190615031565b34101561223d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612234906150bf565b60405180910390fd5b61229361224933613285565b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506039546132b5565b6122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c9906152ef565b60405180910390fd5b60385485826122e19190614c34565b1115612322576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123199061535b565b60405180910390fd5b848161232e9190614c34565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061237b3386612d37565b5050505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6123d3612770565b80603a60016101000a81548160ff02191690831515021790555050565b6000600854905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b816000811180156124a157506037548111155b6124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d790614f39565b60405180910390fd5b603554816124ee60306127ee565b6124f89190614c34565b1115612539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253090614fa5565b60405180910390fd5b612541612770565b61254b8284612d37565b505050565b612558612770565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125be906153ed565b60405180910390fd5b6125d081612c71565b50565b600f816101f481106125e457600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61267581613027565b6126b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ab90614e3b565b60405180910390fd5b50565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661272a83611879565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612778610dd9565b73ffffffffffffffffffffffffffffffffffffffff16612796611aaa565b73ffffffffffffffffffffffffffffffffffffffff16146127ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e390615459565b60405180910390fd5b565b600081600001549050919050565b8047101561283f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612836906154c5565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161286590615516565b60006040518083038185875af1925050503d80600081146128a2576040519150601f19603f3d011682016040523d82523d6000602084013e6128a7565b606091505b50509050806128eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e29061559d565b60405180910390fd5b505050565b6000806128fc83611879565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061293e575061293d81856123fa565b5b8061297c57508373ffffffffffffffffffffffffffffffffffffffff1661296484610f60565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129a582611879565b73ffffffffffffffffffffffffffffffffffffffff16146129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f29061562f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a61906156c1565b60405180910390fd5b612a758383836132cb565b612a806000826126b7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ad091906156e1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b279190614c34565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612be68383836132d0565b505050565b612c6c8363a9059cbb60e01b8484604051602401612c0a929190613c84565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506132d5565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015612dec576000602f600081819054906101000a900461ffff1680929190612d6490615715565b91906101000a81548161ffff021916908361ffff1602179055503342600143612d8d91906156e1565b40604051602001612da194939291906157ff565b6040516020818303038152906040528051906020012060001c9050612dc6603061339c565b612dd884612dd3836133b2565b6135ec565b508080612de490614da7565b915050612d3a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5690615899565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f509190613d61565b60405180910390a3505050565b600081600754600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485612fae9190615031565b612fb891906158e8565b612fc291906156e1565b90509392505050565b612fd6848484612985565b612fe28484848461360a565b613021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130189061598b565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060603180546130a29061470e565b80601f01602080910402602001604051908101604052809291908181526020018280546130ce9061470e565b801561311b5780601f106130f05761010080835404028352916020019161311b565b820191906000526020600020905b8154815290600101906020018083116130fe57829003601f168201915b5050505050905090565b60606000820361316c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613280565b600082905060005b6000821461319e57808061318790614da7565b915050600a8261319791906158e8565b9150613174565b60008167ffffffffffffffff8111156131ba576131b9613f33565b5b6040519080825280601f01601f1916602001820160405280156131ec5781602001600182028036833780820191505090505b5090505b600085146132795760018261320591906156e1565b9150600a8561321491906159ab565b60306132209190614c34565b60f81b81838151811061323657613235614d78565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561327291906158e8565b94506131f0565b8093505050505b919050565b60008160405160200161329891906159dc565b604051602081830303815290604052805190602001209050919050565b60006132c2838386613791565b90509392505050565b505050565b505050565b6000613337826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137a89092919063ffffffff16565b905060008151111561339757808060200190518101906133579190615a0c565b613396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338d90615aab565b60405180910390fd5b5b505050565b6001816000016000828254019250508190555050565b600080602f600081819054906101000a900461ffff16809291906133d590615715565b91906101000a81548161ffff021916908361ffff16021790555061ffff166101f461340091906156e1565b905060008111613445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343c90615b17565b60405180910390fd5b6000818461345391906159ab565b90506000600f826101f4811061346c5761346b614d78565b5b601091828204019190066002029054906101000a900461ffff1661ffff160361349557806134c9565b600f816101f481106134aa576134a9614d78565b5b601091828204019190066002029054906101000a900461ffff1661ffff165b92506000600f6001846134dc91906156e1565b6101f481106134ee576134ed614d78565b5b601091828204019190066002029054906101000a900461ffff1661ffff161461355557600f60018361352091906156e1565b6101f4811061353257613531614d78565b5b601091828204019190066002029054906101000a900461ffff1661ffff16613563565b60018261356291906156e1565b5b600f826101f4811061357857613577614d78565b5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506000600f6001846135ae91906156e1565b6101f481106135c0576135bf614d78565b5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050919050565b6136068282604051806020016040528060008152506137c0565b5050565b600061362b8473ffffffffffffffffffffffffffffffffffffffff1661381b565b15613784578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613654610dd9565b8786866040518563ffffffff1660e01b81526004016136769493929190615b8c565b6020604051808303816000875af19250505080156136b257506040513d601f19601f820116820180604052508101906136af9190615bed565b60015b613734573d80600081146136e2576040519150601f19603f3d011682016040523d82523d6000602084013e6136e7565b606091505b50600081510361372c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137239061598b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613789565b600190505b949350505050565b60008261379e858461383e565b1490509392505050565b60606137b78484600085613894565b90509392505050565b6137ca83836139a8565b6137d7600084848461360a565b613816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380d9061598b565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b8451811015613889576138748286838151811061386757613866614d78565b5b6020026020010151613b81565b9150808061388190614da7565b915050613847565b508091505092915050565b6060824710156138d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d090615c8c565b60405180910390fd5b6138e28561381b565b613921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391890615cf8565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161394a9190615d49565b60006040518083038185875af1925050503d8060008114613987576040519150601f19603f3d011682016040523d82523d6000602084013e61398c565b606091505b509150915061399c828286613bac565b92505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0e90615dac565b60405180910390fd5b613a2081613027565b15613a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a5790615e18565b60405180910390fd5b613a6c600083836132cb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613abc9190614c34565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b7d600083836132d0565b5050565b6000818310613b9957613b948284613c13565b613ba4565b613ba38383613c13565b5b905092915050565b60608315613bbc57829050613c0c565b600083511115613bcf5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c039190613e27565b60405180910390fd5b9392505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c5582613c2a565b9050919050565b613c6581613c4a565b82525050565b6000819050919050565b613c7e81613c6b565b82525050565b6000604082019050613c996000830185613c5c565b613ca66020830184613c75565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cf681613cc1565b8114613d0157600080fd5b50565b600081359050613d1381613ced565b92915050565b600060208284031215613d2f57613d2e613cb7565b5b6000613d3d84828501613d04565b91505092915050565b60008115159050919050565b613d5b81613d46565b82525050565b6000602082019050613d766000830184613d52565b92915050565b6000602082019050613d916000830184613c75565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613dd1578082015181840152602081019050613db6565b60008484015250505050565b6000601f19601f8301169050919050565b6000613df982613d97565b613e038185613da2565b9350613e13818560208601613db3565b613e1c81613ddd565b840191505092915050565b60006020820190508181036000830152613e418184613dee565b905092915050565b613e5281613c6b565b8114613e5d57600080fd5b50565b600081359050613e6f81613e49565b92915050565b600060208284031215613e8b57613e8a613cb7565b5b6000613e9984828501613e60565b91505092915050565b6000602082019050613eb76000830184613c5c565b92915050565b613ec681613c4a565b8114613ed157600080fd5b50565b600081359050613ee381613ebd565b92915050565b60008060408385031215613f0057613eff613cb7565b5b6000613f0e85828601613ed4565b9250506020613f1f85828601613e60565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f6b82613ddd565b810181811067ffffffffffffffff82111715613f8a57613f89613f33565b5b80604052505050565b6000613f9d613cad565b9050613fa98282613f62565b919050565b600067ffffffffffffffff821115613fc957613fc8613f33565b5b613fd282613ddd565b9050602081019050919050565b82818337600083830152505050565b6000614001613ffc84613fae565b613f93565b90508281526020810184848401111561401d5761401c613f2e565b5b614028848285613fdf565b509392505050565b600082601f83011261404557614044613f29565b5b8135614055848260208601613fee565b91505092915050565b60006020828403121561407457614073613cb7565b5b600082013567ffffffffffffffff81111561409257614091613cbc565b5b61409e84828501614030565b91505092915050565b6140b081613d46565b81146140bb57600080fd5b50565b6000813590506140cd816140a7565b92915050565b6000602082840312156140e9576140e8613cb7565b5b60006140f7848285016140be565b91505092915050565b600061410b82613c2a565b9050919050565b61411b81614100565b811461412657600080fd5b50565b60008135905061413881614112565b92915050565b60006020828403121561415457614153613cb7565b5b600061416284828501614129565b91505092915050565b60006020828403121561418157614180613cb7565b5b600061418f84828501613ed4565b91505092915050565b6000806000606084860312156141b1576141b0613cb7565b5b60006141bf86828701613ed4565b93505060206141d086828701613ed4565b92505060406141e186828701613e60565b9150509250925092565b60006141f682613c4a565b9050919050565b614206816141eb565b811461421157600080fd5b50565b600081359050614223816141fd565b92915050565b600080604083850312156142405761423f613cb7565b5b600061424e85828601614214565b925050602061425f85828601613ed4565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61429e81613c6b565b82525050565b60006142b08383614295565b60208301905092915050565b6000602082019050919050565b60006142d482614269565b6142de8185614274565b93506142e983614285565b8060005b8381101561431a57815161430188826142a4565b975061430c836142bc565b9250506001810190506142ed565b5085935050505092915050565b6000602082019050818103600083015261434181846142c9565b905092915050565b6000819050919050565b61435c81614349565b811461436757600080fd5b50565b60008135905061437981614353565b92915050565b60006020828403121561439557614394613cb7565b5b60006143a38482850161436a565b91505092915050565b6143b581614349565b82525050565b60006020820190506143d060008301846143ac565b92915050565b600080604083850312156143ed576143ec613cb7565b5b60006143fb85828601613ed4565b925050602061440c858286016140be565b9150509250929050565b600067ffffffffffffffff82111561443157614430613f33565b5b61443a82613ddd565b9050602081019050919050565b600061445a61445584614416565b613f93565b90508281526020810184848401111561447657614475613f2e565b5b614481848285613fdf565b509392505050565b600082601f83011261449e5761449d613f29565b5b81356144ae848260208601614447565b91505092915050565b600080600080608085870312156144d1576144d0613cb7565b5b60006144df87828801613ed4565b94505060206144f087828801613ed4565b935050604061450187828801613e60565b925050606085013567ffffffffffffffff81111561452257614521613cbc565b5b61452e87828801614489565b91505092959194509250565b600080fd5b600080fd5b60008083601f84011261455a57614559613f29565b5b8235905067ffffffffffffffff8111156145775761457661453a565b5b6020830191508360208202830111156145935761459261453f565b5b9250929050565b6000806000604084860312156145b3576145b2613cb7565b5b60006145c186828701613e60565b935050602084013567ffffffffffffffff8111156145e2576145e1613cbc565b5b6145ee86828701614544565b92509250509250925092565b6000602082840312156146105761460f613cb7565b5b600061461e84828501614214565b91505092915050565b6000806040838503121561463e5761463d613cb7565b5b600061464c85828601613ed4565b925050602061465d85828601613ed4565b9150509250929050565b6000806040838503121561467e5761467d613cb7565b5b600061468c85828601613e60565b925050602061469d85828601613ed4565b9150509250929050565b600061ffff82169050919050565b6146be816146a7565b82525050565b60006020820190506146d960008301846146b5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061472657607f821691505b602082108103614739576147386146df565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061479b602183613da2565b91506147a68261473f565b604082019050919050565b600060208201905081810360008301526147ca8161478e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b600061482d603e83613da2565b9150614838826147d1565b604082019050919050565b6000602082019050818103600083015261485c81614820565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614888565b6148cf8683614888565b95508019841693508086168417925050509392505050565b6000819050919050565b600061490c61490761490284613c6b565b6148e7565b613c6b565b9050919050565b6000819050919050565b614926836148f1565b61493a61493282614913565b848454614895565b825550505050565b600090565b61494f614942565b61495a81848461491d565b505050565b5b8181101561497e57614973600082614947565b600181019050614960565b5050565b601f8211156149c35761499481614863565b61499d84614878565b810160208510156149ac578190505b6149c06149b885614878565b83018261495f565b50505b505050565b600082821c905092915050565b60006149e6600019846008026149c8565b1980831691505092915050565b60006149ff83836149d5565b9150826002028217905092915050565b614a1882613d97565b67ffffffffffffffff811115614a3157614a30613f33565b5b614a3b825461470e565b614a46828285614982565b600060209050601f831160018114614a795760008415614a67578287015190505b614a7185826149f3565b865550614ad9565b601f198416614a8786614863565b60005b82811015614aaf57848901518255600182019150602085019450602081019050614a8a565b86831015614acc5784890151614ac8601f8916826149d5565b8355505b6001600288020188555050505b505050505050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000614b3d602683613da2565b9150614b4882614ae1565b604082019050919050565b60006020820190508181036000830152614b6c81614b30565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614bcf602b83613da2565b9150614bda82614b73565b604082019050919050565b60006020820190508181036000830152614bfe81614bc2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c3f82613c6b565b9150614c4a83613c6b565b9250828201905080821115614c6257614c61614c05565b5b92915050565b6000614c83614c7e614c7984613c2a565b6148e7565b613c2a565b9050919050565b6000614c9582614c68565b9050919050565b6000614ca782614c8a565b9050919050565b614cb781614c9c565b82525050565b6000604082019050614cd26000830185614cae565b614cdf6020830184613c75565b9392505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614d42602e83613da2565b9150614d4d82614ce6565b604082019050919050565b60006020820190508181036000830152614d7181614d35565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614db282613c6b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614de457614de3614c05565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614e25601883613da2565b9150614e3082614def565b602082019050919050565b60006020820190508181036000830152614e5481614e18565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614eb7602983613da2565b9150614ec282614e5b565b604082019050919050565b60006020820190508181036000830152614ee681614eaa565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000614f23601483613da2565b9150614f2e82614eed565b602082019050919050565b60006020820190508181036000830152614f5281614f16565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614f8f601483613da2565b9150614f9a82614f59565b602082019050919050565b60006020820190508181036000830152614fbe81614f82565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000614ffb601783613da2565b915061500682614fc5565b602082019050919050565b6000602082019050818103600083015261502a81614fee565b9050919050565b600061503c82613c6b565b915061504783613c6b565b925082820261505581613c6b565b9150828204841483151761506c5761506b614c05565b5b5092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006150a9601383613da2565b91506150b482615073565b602082019050919050565b600060208201905081810360008301526150d88161509c565b9050919050565b6000815190506150ee81613e49565b92915050565b60006020828403121561510a57615109613cb7565b5b6000615118848285016150df565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061517d602f83613da2565b915061518882615121565b604082019050919050565b600060208201905081810360008301526151ac81615170565b9050919050565b600081905092915050565b60006151c982613d97565b6151d381856151b3565b93506151e3818560208601613db3565b80840191505092915050565b600081546151fc8161470e565b61520681866151b3565b94506001821660008114615221576001811461523657615269565b60ff1983168652811515820286019350615269565b61523f85614863565b60005b8381101561526157815481890152600182019150602081019050615242565b838801955050505b50505092915050565b600061527e82866151be565b915061528a82856151be565b915061529682846151ef565b9150819050949350505050565b7f4e6f742057686974656c69737465640000000000000000000000000000000000600082015250565b60006152d9600f83613da2565b91506152e4826152a3565b602082019050919050565b60006020820190508181036000830152615308816152cc565b9050919050565b7f45786365656465642077686974656c69737420616c6c6f77616e63652e000000600082015250565b6000615345601d83613da2565b91506153508261530f565b602082019050919050565b6000602082019050818103600083015261537481615338565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153d7602683613da2565b91506153e28261537b565b604082019050919050565b60006020820190508181036000830152615406816153ca565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615443602083613da2565b915061544e8261540d565b602082019050919050565b6000602082019050818103600083015261547281615436565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006154af601d83613da2565b91506154ba82615479565b602082019050919050565b600060208201905081810360008301526154de816154a2565b9050919050565b600081905092915050565b50565b60006155006000836154e5565b915061550b826154f0565b600082019050919050565b6000615521826154f3565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000615587603a83613da2565b91506155928261552b565b604082019050919050565b600060208201905081810360008301526155b68161557a565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615619602583613da2565b9150615624826155bd565b604082019050919050565b600060208201905081810360008301526156488161560c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006156ab602483613da2565b91506156b68261564f565b604082019050919050565b600060208201905081810360008301526156da8161569e565b9050919050565b60006156ec82613c6b565b91506156f783613c6b565b925082820390508181111561570f5761570e614c05565b5b92915050565b6000615720826146a7565b915061ffff820361573457615733614c05565b5b600182019050919050565b60008160f01b9050919050565b60006157578261573f565b9050919050565b61576f61576a826146a7565b61574c565b82525050565b60008160601b9050919050565b600061578d82615775565b9050919050565b600061579f82615782565b9050919050565b6157b76157b282613c4a565b615794565b82525050565b6000819050919050565b6157d86157d382613c6b565b6157bd565b82525050565b6000819050919050565b6157f96157f482614349565b6157de565b82525050565b600061580b828761575e565b60028201915061581b82866157a6565b60148201915061582b82856157c7565b60208201915061583b82846157e8565b60208201915081905095945050505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615883601983613da2565b915061588e8261584d565b602082019050919050565b600060208201905081810360008301526158b281615876565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006158f382613c6b565b91506158fe83613c6b565b92508261590e5761590d6158b9565b5b828204905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615975603283613da2565b915061598082615919565b604082019050919050565b600060208201905081810360008301526159a481615968565b9050919050565b60006159b682613c6b565b91506159c183613c6b565b9250826159d1576159d06158b9565b5b828206905092915050565b60006159e882846157a6565b60148201915081905092915050565b600081519050615a06816140a7565b92915050565b600060208284031215615a2257615a21613cb7565b5b6000615a30848285016159f7565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615a95602a83613da2565b9150615aa082615a39565b604082019050919050565b60006020820190508181036000830152615ac481615a88565b9050919050565b7f6e6f20696473206c656674000000000000000000000000000000000000000000600082015250565b6000615b01600b83613da2565b9150615b0c82615acb565b602082019050919050565b60006020820190508181036000830152615b3081615af4565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615b5e82615b37565b615b688185615b42565b9350615b78818560208601613db3565b615b8181613ddd565b840191505092915050565b6000608082019050615ba16000830187613c5c565b615bae6020830186613c5c565b615bbb6040830185613c75565b8181036060830152615bcd8184615b53565b905095945050505050565b600081519050615be781613ced565b92915050565b600060208284031215615c0357615c02613cb7565b5b6000615c1184828501615bd8565b91505092915050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615c76602683613da2565b9150615c8182615c1a565b604082019050919050565b60006020820190508181036000830152615ca581615c69565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615ce2601d83613da2565b9150615ced82615cac565b602082019050919050565b60006020820190508181036000830152615d1181615cd5565b9050919050565b6000615d2382615b37565b615d2d81856154e5565b9350615d3d818560208601613db3565b80840191505092915050565b6000615d558284615d18565b915081905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615d96602083613da2565b9150615da182615d60565b602082019050919050565b60006020820190508181036000830152615dc581615d89565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615e02601c83613da2565b9150615e0d82615dcc565b602082019050919050565b60006020820190508181036000830152615e3181615df5565b905091905056fea26469706673582212204cca1def1894b0358dde361d06f979a1d65b5c9a54ef24a65df9f0a24912025a64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140b3738760361f3525e0bf891d1b78e2be362946561922136c41bfddafbdce49960000000000000000000000000000000000000000000000000000000000000006000000000000000000000000af16bece4c1b8612649eded817d92ce511c15dda00000000000000000000000053d785a16006fa2010d45d64fef818bb76b65137000000000000000000000000d5fd92317468d34607bff917cbb3d0ca4a9c2839000000000000000000000000a2215bdec9f3f4daed848032df35440f367630270000000000000000000000000ba6d637f8b9910c57e5c55a634074db505feb26000000000000000000000000c7161d1b10da41980f527beaaddb6d8a1cd229100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000002
-----Decoded View---------------
Arg [0] : _payees (address[]): 0xaf16BECE4C1b8612649EdeD817d92CE511C15dda,0x53D785A16006Fa2010d45d64fEf818bB76b65137,0xD5Fd92317468d34607bFF917cbb3D0cA4a9c2839,0xA2215bDEc9f3f4Daed848032Df35440f36763027,0x0Ba6d637f8B9910c57e5c55A634074DB505FEB26,0xC7161d1B10dA41980F527beaADdb6D8A1cd22910
Arg [1] : _shares (uint256[]): 10,15,18,40,15,2
Arg [2] : _WLmerkleroot (bytes32): 0xb3738760361f3525e0bf891d1b78e2be362946561922136c41bfddafbdce4996
-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : b3738760361f3525e0bf891d1b78e2be362946561922136c41bfddafbdce4996
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [4] : 000000000000000000000000af16bece4c1b8612649eded817d92ce511c15dda
Arg [5] : 00000000000000000000000053d785a16006fa2010d45d64fef818bb76b65137
Arg [6] : 000000000000000000000000d5fd92317468d34607bff917cbb3d0ca4a9c2839
Arg [7] : 000000000000000000000000a2215bdec9f3f4daed848032df35440f36763027
Arg [8] : 0000000000000000000000000ba6d637f8b9910c57e5c55a634074db505feb26
Arg [9] : 000000000000000000000000c7161d1b10da41980f527beaaddb6d8a1cd22910
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [11] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [12] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [15] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000002
Deployed Bytecode Sourcemap
65334:5781:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60457:40;60473:12;:10;:12::i;:::-;60487:9;60457:40;;;;;;;:::i;:::-;;;;;;;;65334:5781;;;;;21689:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65757:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22610:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24107:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23630:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65806:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65720:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69745:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69849:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66741:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62958:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65461:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24799:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60586:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61705:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25202:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67805:632;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69293:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63669:506;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65848:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69505:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66027:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65646:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68616:94;;;;;;;;;;;;;:::i;:::-;;65997:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65613:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22323:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22056:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38044:103;;;;;;;;;;;;;:::i;:::-;;68441:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66384:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69641:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65970:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61929:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65931:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37400:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65888:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22777:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61429:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66834:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24346:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62117:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65684:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69371:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25456:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62500:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68714:490;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61227:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67083:559;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61019:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69208:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60769:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24570:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67646:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38300:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65521:22;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16677:98;16730:7;16757:10;16750:17;;16677:98;:::o;21689:305::-;21791:4;21843:25;21828:40;;;:11;:40;;;;:105;;;;21900:33;21885:48;;;:11;:48;;;;21828:105;:158;;;;21950:36;21974:11;21950:23;:36::i;:::-;21828:158;21808:178;;21689:305;;;:::o;65757:44::-;65790:11;65757:44;:::o;22610:100::-;22664:13;22697:5;22690:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22610:100;:::o;24107:169::-;24183:7;24203:23;24218:7;24203:14;:23::i;:::-;24244:15;:24;24260:7;24244:24;;;;;;;;;;;;;;;;;;;;;24237:31;;24107:169;;;:::o;23630:413::-;23711:13;23727:23;23742:7;23727:14;:23::i;:::-;23711:39;;23775:5;23769:11;;:2;:11;;;23761:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23867:5;23851:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23876:37;23893:5;23900:12;:10;:12::i;:::-;23876:16;:37::i;:::-;23851:62;23829:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;24014:21;24023:2;24027:7;24014:8;:21::i;:::-;23700:343;23630:413;;:::o;65806:37::-;;;;:::o;65720:32::-;;;;:::o;69745:100::-;37288:13;:11;:13::i;:::-;69829:10:::1;69817:9;:22;;;;;;:::i;:::-;;69745:100:::0;:::o;69849:77::-;37288:13;:11;:13::i;:::-;69914:6:::1;69905;;:15;;;;;;;;;;;;;;;;;;69849:77:::0;:::o;66741:89::-;66785:7;66808:16;:6;:14;:16::i;:::-;66801:23;;66741:89;:::o;62958:445::-;63053:1;63034:7;:16;63042:7;63034:16;;;;;;;;;;;;;;;;:20;63026:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;63108:15;63126:19;63137:7;63126:10;:19::i;:::-;63108:37;;63175:1;63164:7;:12;63156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63257:7;63235:9;:18;63245:7;63235:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;63293:7;63275:14;;:25;;;;;;;:::i;:::-;;;;;;;;63311:35;63329:7;63338;63311:17;:35::i;:::-;63362:33;63378:7;63387;63362:33;;;;;;;:::i;:::-;;;;;;;;63015:388;62958:445;:::o;65461:51::-;;;;;;;;;;;;;;;;;:::o;24799:334::-;24994:41;25013:12;:10;:12::i;:::-;25027:7;24994:18;:41::i;:::-;24986:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25097:28;25107:4;25113:2;25117:7;25097:9;:28::i;:::-;24799:334;;;:::o;60586:91::-;60630:7;60657:12;;60650:19;;60586:91;:::o;61705:135::-;61775:7;61802:14;:21;61817:5;61802:21;;;;;;;;;;;;;;;:30;61824:7;61802:30;;;;;;;;;;;;;;;;61795:37;;61705:135;;;;:::o;25202:185::-;25340:39;25357:4;25363:2;25367:7;25340:39;;;;;;;;;;;;:16;:39::i;:::-;25202:185;;;:::o;67805:632::-;67880:16;67908:23;67934:17;67944:6;67934:9;:17::i;:::-;67908:43;;67958:30;68005:15;67991:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67958:63;;68028:22;68053:1;68028:26;;68061:23;68095:310;68120:15;68102;:33;:71;;;;;68157:16;;68139:14;:34;;68102:71;68095:310;;;68184:25;68212:23;68220:14;68212:7;:23::i;:::-;68184:51;;68269:6;68248:27;;:17;:27;;;68244:129;;68321:14;68288:13;68302:15;68288:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;68346:17;;;;;:::i;:::-;;;;68244:129;68381:16;;;;;:::i;:::-;;;;68175:230;68095:310;;;68418:13;68411:20;;;;;;67805:632;;;:::o;69293:74::-;37288:13;:11;:13::i;:::-;69356:5:::1;69349:4;:12;;;;69293:74:::0;:::o;63669:506::-;63770:1;63751:7;:16;63759:7;63751:16;;;;;;;;;;;;;;;;:20;63743:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;63825:15;63843:26;63854:5;63861:7;63843:10;:26::i;:::-;63825:44;;63899:1;63888:7;:12;63880:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63993:7;63959:14;:21;63974:5;63959:21;;;;;;;;;;;;;;;:30;63981:7;63959:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;64041:7;64011:19;:26;64031:5;64011:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;64059:47;64082:5;64089:7;64098;64059:22;:47::i;:::-;64143:5;64122:45;;;64150:7;64159;64122:45;;;;;;;:::i;:::-;;;;;;;;63732:443;63669:506;;:::o;65848:35::-;;;;:::o;69505:132::-;37288:13;:11;:13::i;:::-;69613:18:::1;69593:17;:38;;;;;;:::i;:::-;;69505:132:::0;:::o;66027:27::-;;;;;;;;;;;;;:::o;65646:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68616:94::-;37288:13;:11;:13::i;:::-;68688:16:::1;;68671:14;:33;;;;68616:94::o:0;65997:25::-;;;;;;;;;;;;;:::o;65613:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22323:222::-;22395:7;22415:13;22431:7;:16;22439:7;22431:16;;;;;;;;;;;;;;;;;;;;;22415:32;;22483:1;22466:19;;:5;:19;;;22458:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;22532:5;22525:12;;;22323:222;;;:::o;22056:207::-;22128:7;22173:1;22156:19;;:5;:19;;;22148:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22239:9;:16;22249:5;22239:16;;;;;;;;;;;;;;;;22232:23;;22056:207;;;:::o;38044:103::-;37288:13;:11;:13::i;:::-;38109:30:::1;38136:1;38109:18;:30::i;:::-;38044:103::o:0;68441:171::-;37288:13;:11;:13::i;:::-;68530:14:::1;;68519:7;:25;;:53;;;;;68559:13;:11;:13::i;:::-;68548:7;:24;;68519:53;68511:62;;;::::0;::::1;;68599:7;68580:16;:26;;;;68441:171:::0;:::o;66384:108::-;37288:13;:11;:13::i;:::-;66471::::1;66462:6;:22;;;;66384:108:::0;:::o;69641:100::-;37288:13;:11;:13::i;:::-;69725:10:::1;69713:9;:22;;;;;;:::i;:::-;;69641:100:::0;:::o;65970:21::-;;;;:::o;61929:100::-;61980:7;62007;62015:5;62007:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;62000:21;;61929:100;;;:::o;65931:34::-;;;;:::o;37400:87::-;37446:7;37473:6;;;;;;;;;;;37466:13;;37400:87;:::o;65888:38::-;;;;:::o;22777:104::-;22833:13;22866:7;22859:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22777:104;:::o;61429:109::-;61485:7;61512:9;:18;61522:7;61512:18;;;;;;;;;;;;;;;;61505:25;;61429:109;;;:::o;66834:245::-;66899:11;66570:1;66556:11;:15;:52;;;;;66590:18;;66575:11;:33;;66556:52;66548:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;66682:16;;66667:11;66648:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:50;;66640:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;66928:6:::1;;;;;;;;;;;66927:7;66919:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;66997:11;66990:4;;:18;;;;:::i;:::-;66977:9;:31;;66969:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;67039:34;67049:10;67061:11;67039:9;:34::i;:::-;66834:245:::0;;:::o;24346:155::-;24441:52;24460:12;:10;:12::i;:::-;24474:8;24484;24441:18;:52::i;:::-;24346:155;;:::o;62117:225::-;62175:7;62195:21;62243:15;:13;:15::i;:::-;62219:21;:39;;;;:::i;:::-;62195:63;;62276:58;62292:7;62301:13;62316:17;62325:7;62316:8;:17::i;:::-;62276:15;:58::i;:::-;62269:65;;;62117:225;;;:::o;65684:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69371:130::-;37288:13;:11;:13::i;:::-;69476:19:::1;69455:18;:40;;;;69371:130:::0;:::o;25456:323::-;25630:41;25649:12;:10;:12::i;:::-;25663:7;25630:18;:41::i;:::-;25622:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25733:38;25747:4;25753:2;25757:7;25766:4;25733:13;:38::i;:::-;25456:323;;;;:::o;62500:260::-;62572:7;62592:21;62649:20;62663:5;62649:13;:20::i;:::-;62616:5;:15;;;62640:4;62616:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;62592:77;;62687:65;62703:7;62712:13;62727:24;62736:5;62743:7;62727:8;:24::i;:::-;62687:15;:65::i;:::-;62680:72;;;62500:260;;;;:::o;68714:490::-;68813:13;68854:17;68862:8;68854:7;:17::i;:::-;68838:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;68959:5;68947:17;;:8;;;;;;;;;;;:17;;;68943:64;;68982:17;68975:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68943:64;69013:28;69044:10;:8;:10::i;:::-;69013:41;;69099:1;69074:14;69068:28;:32;:130;;;;;;;;;;;;;;;;;69136:14;69152:19;:8;:17;:19::i;:::-;69173:9;69119:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69068:130;69061:137;;;68714:490;;;;:::o;61227:105::-;61281:7;61308;:16;61316:7;61308:16;;;;;;;;;;;;;;;;61301:23;;61227:105;;;:::o;67083:559::-;67177:11;66570:1;66556:11;:15;:52;;;;;66590:18;;66575:11;:33;;66556:52;66548:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;66682:16;;66667:11;66648:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:50;;66640:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;67197:17:::1;67217:16;:28;67234:10;67217:28;;;;;;;;;;;;;;;;67197:48;;67261:6;;;;;;;;;;;67260:7;67252:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;67332:11;65790;67323:20;;;;:::i;:::-;67310:9;:33;;67302:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;67382:42;67390:17;67396:10;67390:5;:17::i;:::-;67409:6;;67382:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67417:6;;67382:7;:42::i;:::-;67374:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;67486:14;;67471:11;67459:9;:23;;;;:::i;:::-;:41;;67451:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;67584:11;67572:9;:23;;;;:::i;:::-;67541:16;:28;67558:10;67541:28;;;;;;;;;;;;;;;:54;;;;67602:34;67612:10;67624:11;67602:9;:34::i;:::-;67190:452;67083:559:::0;;;;:::o;61019:119::-;61077:7;61104:19;:26;61124:5;61104:26;;;;;;;;;;;;;;;;61097:33;;61019:119;;;:::o;69208:81::-;37288:13;:11;:13::i;:::-;69277:6:::1;69266:8;;:17;;;;;;;;;;;;;;;;;;69208:81:::0;:::o;60769:95::-;60815:7;60842:14;;60835:21;;60769:95;:::o;24570:164::-;24667:4;24691:18;:25;24710:5;24691:25;;;;;;;;;;;;;;;:35;24717:8;24691:35;;;;;;;;;;;;;;;;;;;;;;;;;24684:42;;24570:164;;;;:::o;67646:155::-;67732:11;66570:1;66556:11;:15;:52;;;;;66590:18;;66575:11;:33;;66556:52;66548:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;66682:16;;66667:11;66648:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:50;;66640:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;37288:13:::1;:11;:13::i;:::-;67762:33:::2;67772:9;67783:11;67762:9;:33::i;:::-;67646:155:::0;;;:::o;38300:201::-;37288:13;:11;:13::i;:::-;38409:1:::1;38389:22;;:8;:22;;::::0;38381:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38465:28;38484:8;38465:18;:28::i;:::-;38300:201:::0;:::o;65521:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20178:157::-;20263:4;20302:25;20287:40;;;:11;:40;;;;20280:47;;20178:157;;;:::o;32018:135::-;32100:16;32108:7;32100;:16::i;:::-;32092:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32018:135;:::o;31301:174::-;31403:2;31376:15;:24;31392:7;31376:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31459:7;31455:2;31421:46;;31430:23;31445:7;31430:14;:23::i;:::-;31421:46;;;;;;;;;;;;31301:174;;:::o;37563:132::-;37638:12;:10;:12::i;:::-;37627:23;;:7;:5;:7::i;:::-;:23;;;37619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37563:132::o;35618:114::-;35683:7;35710;:14;;;35703:21;;35618:114;;;:::o;9996:315::-;10111:6;10086:21;:31;;10078:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10163:12;10181:9;:14;;10203:6;10181:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10162:52;;;10233:7;10225:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;10067:244;9996:315;;:::o;27574:264::-;27667:4;27684:13;27700:23;27715:7;27700:14;:23::i;:::-;27684:39;;27753:5;27742:16;;:7;:16;;;:52;;;;27762:32;27779:5;27786:7;27762:16;:32::i;:::-;27742:52;:87;;;;27822:7;27798:31;;:20;27810:7;27798:11;:20::i;:::-;:31;;;27742:87;27734:96;;;27574:264;;;;:::o;30569:615::-;30728:4;30701:31;;:23;30716:7;30701:14;:23::i;:::-;:31;;;30693:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30807:1;30793:16;;:2;:16;;;30785:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30861:39;30882:4;30888:2;30892:7;30861:20;:39::i;:::-;30963:29;30980:1;30984:7;30963:8;:29::i;:::-;31022:1;31003:9;:15;31013:4;31003:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31051:1;31034:9;:13;31044:2;31034:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31082:2;31063:7;:16;31071:7;31063:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31119:7;31115:2;31100:27;;31109:4;31100:27;;;;;;;;;;;;31138:38;31158:4;31164:2;31168:7;31138:19;:38::i;:::-;30569:615;;;:::o;53364:211::-;53481:86;53501:5;53531:23;;;53556:2;53560:5;53508:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53481:19;:86::i;:::-;53364:211;;;:::o;38659:191::-;38733:16;38752:6;;;;;;;;;;;38733:25;;38778:8;38769:6;;:17;;;;;;;;;;;;;;;;;;38833:8;38802:40;;38823:8;38802:40;;;;;;;;;;;;38722:128;38659:191;:::o;70638:366::-;70718:9;70713:286;70737:11;70733:1;:15;70713:286;;;70770:15;70823:5;;:7;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;70832:10;70844:15;70884:1;70871:12;:14;;;;:::i;:::-;70861:25;70806:81;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70796:92;;;;;;70788:101;;70770:119;;70904:18;:6;:16;:18::i;:::-;70937:50;70947:9;70958:28;70978:7;70958:19;:28::i;:::-;70937:9;:50::i;:::-;70755:244;70750:3;;;;;:::i;:::-;;;;70713:286;;;;70638:366;;:::o;31616:315::-;31771:8;31762:17;;:5;:17;;;31754:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31858:8;31820:18;:25;31839:5;31820:25;;;;;;;;;;;;;;;:35;31846:8;31820:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31904:8;31882:41;;31897:5;31882:41;;;31914:8;31882:41;;;;;;:::i;:::-;;;;;;;;31616:315;;;:::o;64351:248::-;64497:7;64576:15;64561:12;;64541:7;:16;64549:7;64541:16;;;;;;;;;;;;;;;;64525:13;:32;;;;:::i;:::-;64524:49;;;;:::i;:::-;:67;;;;:::i;:::-;64517:74;;64351:248;;;;;:::o;26658:313::-;26814:28;26824:4;26830:2;26834:7;26814:9;:28::i;:::-;26861:47;26884:4;26890:2;26894:7;26903:4;26861:22;:47::i;:::-;26853:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26658:313;;;;:::o;27282:127::-;27347:4;27399:1;27371:30;;:7;:16;27379:7;27371:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27364:37;;27282:127;;;:::o;71008:104::-;71068:13;71097:9;71090:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71008:104;:::o;17286:721::-;17342:13;17570:1;17561:5;:10;17557:53;;17588:10;;;;;;;;;;;;;;;;;;;;;17557:53;17620:12;17635:5;17620:20;;17651:14;17676:78;17691:1;17683:4;:9;17676:78;;17709:8;;;;;:::i;:::-;;;;17740:2;17732:10;;;;;:::i;:::-;;;17676:78;;;17764:19;17796:6;17786:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17764:39;;17814:154;17830:1;17821:5;:10;17814:154;;17858:1;17848:11;;;;;:::i;:::-;;;17925:2;17917:5;:10;;;;:::i;:::-;17904:2;:24;;;;:::i;:::-;17891:39;;17874:6;17881;17874:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17954:2;17945:11;;;;;:::i;:::-;;;17814:154;;;17992:6;17978:21;;;;;17286:721;;;;:::o;69930:133::-;69986:7;70045:8;70028:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;70018:37;;;;;;70011:44;;69930:133;;;:::o;70069:170::-;70163:4;70192:39;70211:6;70219:5;70226:4;70192:18;:39::i;:::-;70185:46;;70069:170;;;;;:::o;34138:126::-;;;;:::o;34647:125::-;;;;:::o;56419:714::-;56841:23;56867:69;56895:4;56867:69;;;;;;;;;;;;;;;;;56875:5;56867:27;;;;:69;;;;;:::i;:::-;56841:95;;56971:1;56951:10;:17;:21;56947:179;;;57048:10;57037:30;;;;;;;;;;;;:::i;:::-;57029:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;56947:179;56489:644;56419:714;;:::o;35738:127::-;35845:1;35827:7;:14;;;:19;;;;;;;;;;;35738:127;:::o;70243:391::-;70305:10;70328:11;70355:5;;:7;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;70342:20;;:10;:20;;;;:::i;:::-;70328:34;;70387:1;70381:3;:7;70373:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;70415:19;70446:3;70437:6;:12;;;;:::i;:::-;70415:34;;70485:1;70465:3;70469:11;70465:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:21;;;:54;;70508:11;70465:54;;;70489:3;70493:11;70489:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;70465:54;;;70460:59;;70572:1;70556:3;70566:1;70560:3;:7;;;;:::i;:::-;70556:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:17;;;:42;;70586:3;70596:1;70590:3;:7;;;;:::i;:::-;70586:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;70556:42;;;;;70582:1;70576:3;:7;;;;:::i;:::-;70556:42;70530:3;70534:11;70530:16;;;;;;;:::i;:::-;;;;;;;;;;;;;:69;;;;;;;;;;;;;;;;;;70625:1;70610:3;70620:1;70614:3;:7;;;;:::i;:::-;70610:12;;;;;;;:::i;:::-;;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;70317:317;;70243:391;;;:::o;28178:110::-;28254:26;28264:2;28268:7;28254:26;;;;;;;;;;;;:9;:26::i;:::-;28178:110;;:::o;32715:853::-;32869:4;32890:15;:2;:13;;;:15::i;:::-;32886:675;;;32942:2;32926:36;;;32963:12;:10;:12::i;:::-;32977:4;32983:7;32992:4;32926:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32922:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33184:1;33167:6;:13;:18;33163:328;;33210:60;;;;;;;;;;:::i;:::-;;;;;;;;33163:328;33441:6;33435:13;33426:6;33422:2;33418:15;33411:38;32922:584;33058:41;;;33048:51;;;:6;:51;;;;33041:58;;;;;32886:675;33545:4;33538:11;;32715:853;;;;;;;:::o;40046:190::-;40171:4;40224;40195:25;40208:5;40215:4;40195:12;:25::i;:::-;:33;40188:40;;40046:190;;;;;:::o;11474:229::-;11611:12;11643:52;11665:6;11673:4;11679:1;11682:12;11643:21;:52::i;:::-;11636:59;;11474:229;;;;;:::o;28513:319::-;28642:18;28648:2;28652:7;28642:5;:18::i;:::-;28693:53;28724:1;28728:2;28732:7;28741:4;28693:22;:53::i;:::-;28671:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;28513:319;;;:::o;8739:324::-;8799:4;9054:1;9032:7;:19;;;:23;9025:30;;8739:324;;;:::o;40909:296::-;40992:7;41012:20;41035:4;41012:27;;41055:9;41050:118;41074:5;:12;41070:1;:16;41050:118;;;41123:33;41133:12;41147:5;41153:1;41147:8;;;;;;;;:::i;:::-;;;;;;;;41123:9;:33::i;:::-;41108:48;;41088:3;;;;;:::i;:::-;;;;41050:118;;;;41185:12;41178:19;;;40909:296;;;;:::o;12590:508::-;12760:12;12818:5;12793:21;:30;;12785:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;12885:18;12896:6;12885:10;:18::i;:::-;12877:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;12949:12;12963:23;12990:6;:11;;13009:5;13016:4;12990:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12948:73;;;;13039:51;13056:7;13065:10;13077:12;13039:16;:51::i;:::-;13032:58;;;;12590:508;;;;;;:::o;29166:431::-;29260:1;29246:16;;:2;:16;;;29238:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29319:16;29327:7;29319;:16::i;:::-;29318:17;29310:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29379:45;29408:1;29412:2;29416:7;29379:20;:45::i;:::-;29452:1;29435:9;:13;29445:2;29435:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29483:2;29464:7;:16;29472:7;29464:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29526:7;29522:2;29501:33;;29518:1;29501:33;;;;;;;;;;;;29545:44;29573:1;29577:2;29581:7;29545:19;:44::i;:::-;29166:431;;:::o;47092:149::-;47155:7;47186:1;47182;:5;:51;;47213:20;47228:1;47231;47213:14;:20::i;:::-;47182:51;;;47190:20;47205:1;47208;47190:14;:20::i;:::-;47182:51;47175:58;;47092:149;;;;:::o;15260:762::-;15410:12;15439:7;15435:580;;;15470:10;15463:17;;;;15435:580;15604:1;15584:10;:17;:21;15580:424;;;15832:10;15826:17;15893:15;15880:10;15876:2;15872:19;15865:44;15580:424;15975:12;15968:20;;;;;;;;;;;:::i;:::-;;;;;;;;15260:762;;;;;;:::o;47247:268::-;47315:13;47422:1;47416:4;47409:15;47451:1;47445:4;47438:15;47492:4;47486;47476:21;47467:30;;47247:268;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:149;1273:7;1313:66;1306:5;1302:78;1291:89;;1237:149;;;:::o;1392:120::-;1464:23;1481:5;1464:23;:::i;:::-;1457:5;1454:34;1444:62;;1502:1;1499;1492:12;1444:62;1392:120;:::o;1518:137::-;1563:5;1601:6;1588:20;1579:29;;1617:32;1643:5;1617:32;:::i;:::-;1518:137;;;;:::o;1661:327::-;1719:6;1768:2;1756:9;1747:7;1743:23;1739:32;1736:119;;;1774:79;;:::i;:::-;1736:119;1894:1;1919:52;1963:7;1954:6;1943:9;1939:22;1919:52;:::i;:::-;1909:62;;1865:116;1661:327;;;;:::o;1994:90::-;2028:7;2071:5;2064:13;2057:21;2046:32;;1994:90;;;:::o;2090:109::-;2171:21;2186:5;2171:21;:::i;:::-;2166:3;2159:34;2090:109;;:::o;2205:210::-;2292:4;2330:2;2319:9;2315:18;2307:26;;2343:65;2405:1;2394:9;2390:17;2381:6;2343:65;:::i;:::-;2205:210;;;;:::o;2421:222::-;2514:4;2552:2;2541:9;2537:18;2529:26;;2565:71;2633:1;2622:9;2618:17;2609:6;2565:71;:::i;:::-;2421:222;;;;:::o;2649:99::-;2701:6;2735:5;2729:12;2719:22;;2649:99;;;:::o;2754:169::-;2838:11;2872:6;2867:3;2860:19;2912:4;2907:3;2903:14;2888:29;;2754:169;;;;:::o;2929:246::-;3010:1;3020:113;3034:6;3031:1;3028:13;3020:113;;;3119:1;3114:3;3110:11;3104:18;3100:1;3095:3;3091:11;3084:39;3056:2;3053:1;3049:10;3044:15;;3020:113;;;3167:1;3158:6;3153:3;3149:16;3142:27;2991:184;2929:246;;;:::o;3181:102::-;3222:6;3273:2;3269:7;3264:2;3257:5;3253:14;3249:28;3239:38;;3181:102;;;:::o;3289:377::-;3377:3;3405:39;3438:5;3405:39;:::i;:::-;3460:71;3524:6;3519:3;3460:71;:::i;:::-;3453:78;;3540:65;3598:6;3593:3;3586:4;3579:5;3575:16;3540:65;:::i;:::-;3630:29;3652:6;3630:29;:::i;:::-;3625:3;3621:39;3614:46;;3381:285;3289:377;;;;:::o;3672:313::-;3785:4;3823:2;3812:9;3808:18;3800:26;;3872:9;3866:4;3862:20;3858:1;3847:9;3843:17;3836:47;3900:78;3973:4;3964:6;3900:78;:::i;:::-;3892:86;;3672:313;;;;:::o;3991:122::-;4064:24;4082:5;4064:24;:::i;:::-;4057:5;4054:35;4044:63;;4103:1;4100;4093:12;4044:63;3991:122;:::o;4119:139::-;4165:5;4203:6;4190:20;4181:29;;4219:33;4246:5;4219:33;:::i;:::-;4119:139;;;;:::o;4264:329::-;4323:6;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4264:329;;;;:::o;4599:222::-;4692:4;4730:2;4719:9;4715:18;4707:26;;4743:71;4811:1;4800:9;4796:17;4787:6;4743:71;:::i;:::-;4599:222;;;;:::o;4827:122::-;4900:24;4918:5;4900:24;:::i;:::-;4893:5;4890:35;4880:63;;4939:1;4936;4929:12;4880:63;4827:122;:::o;4955:139::-;5001:5;5039:6;5026:20;5017:29;;5055:33;5082:5;5055:33;:::i;:::-;4955:139;;;;:::o;5100:474::-;5168:6;5176;5225:2;5213:9;5204:7;5200:23;5196:32;5193:119;;;5231:79;;:::i;:::-;5193:119;5351:1;5376:53;5421:7;5412:6;5401:9;5397:22;5376:53;:::i;:::-;5366:63;;5322:117;5478:2;5504:53;5549:7;5540:6;5529:9;5525:22;5504:53;:::i;:::-;5494:63;;5449:118;5100:474;;;;;:::o;5580:117::-;5689:1;5686;5679:12;5703:117;5812:1;5809;5802:12;5826:180;5874:77;5871:1;5864:88;5971:4;5968:1;5961:15;5995:4;5992:1;5985:15;6012:281;6095:27;6117:4;6095:27;:::i;:::-;6087:6;6083:40;6225:6;6213:10;6210:22;6189:18;6177:10;6174:34;6171:62;6168:88;;;6236:18;;:::i;:::-;6168:88;6276:10;6272:2;6265:22;6055:238;6012:281;;:::o;6299:129::-;6333:6;6360:20;;:::i;:::-;6350:30;;6389:33;6417:4;6409:6;6389:33;:::i;:::-;6299:129;;;:::o;6434:308::-;6496:4;6586:18;6578:6;6575:30;6572:56;;;6608:18;;:::i;:::-;6572:56;6646:29;6668:6;6646:29;:::i;:::-;6638:37;;6730:4;6724;6720:15;6712:23;;6434:308;;;:::o;6748:146::-;6845:6;6840:3;6835;6822:30;6886:1;6877:6;6872:3;6868:16;6861:27;6748:146;;;:::o;6900:425::-;6978:5;7003:66;7019:49;7061:6;7019:49;:::i;:::-;7003:66;:::i;:::-;6994:75;;7092:6;7085:5;7078:21;7130:4;7123:5;7119:16;7168:3;7159:6;7154:3;7150:16;7147:25;7144:112;;;7175:79;;:::i;:::-;7144:112;7265:54;7312:6;7307:3;7302;7265:54;:::i;:::-;6984:341;6900:425;;;;;:::o;7345:340::-;7401:5;7450:3;7443:4;7435:6;7431:17;7427:27;7417:122;;7458:79;;:::i;:::-;7417:122;7575:6;7562:20;7600:79;7675:3;7667:6;7660:4;7652:6;7648:17;7600:79;:::i;:::-;7591:88;;7407:278;7345:340;;;;:::o;7691:509::-;7760:6;7809:2;7797:9;7788:7;7784:23;7780:32;7777:119;;;7815:79;;:::i;:::-;7777:119;7963:1;7952:9;7948:17;7935:31;7993:18;7985:6;7982:30;7979:117;;;8015:79;;:::i;:::-;7979:117;8120:63;8175:7;8166:6;8155:9;8151:22;8120:63;:::i;:::-;8110:73;;7906:287;7691:509;;;;:::o;8206:116::-;8276:21;8291:5;8276:21;:::i;:::-;8269:5;8266:32;8256:60;;8312:1;8309;8302:12;8256:60;8206:116;:::o;8328:133::-;8371:5;8409:6;8396:20;8387:29;;8425:30;8449:5;8425:30;:::i;:::-;8328:133;;;;:::o;8467:323::-;8523:6;8572:2;8560:9;8551:7;8547:23;8543:32;8540:119;;;8578:79;;:::i;:::-;8540:119;8698:1;8723:50;8765:7;8756:6;8745:9;8741:22;8723:50;:::i;:::-;8713:60;;8669:114;8467:323;;;;:::o;8796:104::-;8841:7;8870:24;8888:5;8870:24;:::i;:::-;8859:35;;8796:104;;;:::o;8906:138::-;8987:32;9013:5;8987:32;:::i;:::-;8980:5;8977:43;8967:71;;9034:1;9031;9024:12;8967:71;8906:138;:::o;9050:155::-;9104:5;9142:6;9129:20;9120:29;;9158:41;9193:5;9158:41;:::i;:::-;9050:155;;;;:::o;9211:345::-;9278:6;9327:2;9315:9;9306:7;9302:23;9298:32;9295:119;;;9333:79;;:::i;:::-;9295:119;9453:1;9478:61;9531:7;9522:6;9511:9;9507:22;9478:61;:::i;:::-;9468:71;;9424:125;9211:345;;;;:::o;9562:329::-;9621:6;9670:2;9658:9;9649:7;9645:23;9641:32;9638:119;;;9676:79;;:::i;:::-;9638:119;9796:1;9821:53;9866:7;9857:6;9846:9;9842:22;9821:53;:::i;:::-;9811:63;;9767:117;9562:329;;;;:::o;9897:619::-;9974:6;9982;9990;10039:2;10027:9;10018:7;10014:23;10010:32;10007:119;;;10045:79;;:::i;:::-;10007:119;10165:1;10190:53;10235:7;10226:6;10215:9;10211:22;10190:53;:::i;:::-;10180:63;;10136:117;10292:2;10318:53;10363:7;10354:6;10343:9;10339:22;10318:53;:::i;:::-;10308:63;;10263:118;10420:2;10446:53;10491:7;10482:6;10471:9;10467:22;10446:53;:::i;:::-;10436:63;;10391:118;9897:619;;;;;:::o;10522:111::-;10574:7;10603:24;10621:5;10603:24;:::i;:::-;10592:35;;10522:111;;;:::o;10639:152::-;10727:39;10760:5;10727:39;:::i;:::-;10720:5;10717:50;10707:78;;10781:1;10778;10771:12;10707:78;10639:152;:::o;10797:169::-;10858:5;10896:6;10883:20;10874:29;;10912:48;10954:5;10912:48;:::i;:::-;10797:169;;;;:::o;10972:504::-;11055:6;11063;11112:2;11100:9;11091:7;11087:23;11083:32;11080:119;;;11118:79;;:::i;:::-;11080:119;11238:1;11263:68;11323:7;11314:6;11303:9;11299:22;11263:68;:::i;:::-;11253:78;;11209:132;11380:2;11406:53;11451:7;11442:6;11431:9;11427:22;11406:53;:::i;:::-;11396:63;;11351:118;10972:504;;;;;:::o;11482:114::-;11549:6;11583:5;11577:12;11567:22;;11482:114;;;:::o;11602:184::-;11701:11;11735:6;11730:3;11723:19;11775:4;11770:3;11766:14;11751:29;;11602:184;;;;:::o;11792:132::-;11859:4;11882:3;11874:11;;11912:4;11907:3;11903:14;11895:22;;11792:132;;;:::o;11930:108::-;12007:24;12025:5;12007:24;:::i;:::-;12002:3;11995:37;11930:108;;:::o;12044:179::-;12113:10;12134:46;12176:3;12168:6;12134:46;:::i;:::-;12212:4;12207:3;12203:14;12189:28;;12044:179;;;;:::o;12229:113::-;12299:4;12331;12326:3;12322:14;12314:22;;12229:113;;;:::o;12378:732::-;12497:3;12526:54;12574:5;12526:54;:::i;:::-;12596:86;12675:6;12670:3;12596:86;:::i;:::-;12589:93;;12706:56;12756:5;12706:56;:::i;:::-;12785:7;12816:1;12801:284;12826:6;12823:1;12820:13;12801:284;;;12902:6;12896:13;12929:63;12988:3;12973:13;12929:63;:::i;:::-;12922:70;;13015:60;13068:6;13015:60;:::i;:::-;13005:70;;12861:224;12848:1;12845;12841:9;12836:14;;12801:284;;;12805:14;13101:3;13094:10;;12502:608;;;12378:732;;;;:::o;13116:373::-;13259:4;13297:2;13286:9;13282:18;13274:26;;13346:9;13340:4;13336:20;13332:1;13321:9;13317:17;13310:47;13374:108;13477:4;13468:6;13374:108;:::i;:::-;13366:116;;13116:373;;;;:::o;13495:77::-;13532:7;13561:5;13550:16;;13495:77;;;:::o;13578:122::-;13651:24;13669:5;13651:24;:::i;:::-;13644:5;13641:35;13631:63;;13690:1;13687;13680:12;13631:63;13578:122;:::o;13706:139::-;13752:5;13790:6;13777:20;13768:29;;13806:33;13833:5;13806:33;:::i;:::-;13706:139;;;;:::o;13851:329::-;13910:6;13959:2;13947:9;13938:7;13934:23;13930:32;13927:119;;;13965:79;;:::i;:::-;13927:119;14085:1;14110:53;14155:7;14146:6;14135:9;14131:22;14110:53;:::i;:::-;14100:63;;14056:117;13851:329;;;;:::o;14186:118::-;14273:24;14291:5;14273:24;:::i;:::-;14268:3;14261:37;14186:118;;:::o;14310:222::-;14403:4;14441:2;14430:9;14426:18;14418:26;;14454:71;14522:1;14511:9;14507:17;14498:6;14454:71;:::i;:::-;14310:222;;;;:::o;14538:468::-;14603:6;14611;14660:2;14648:9;14639:7;14635:23;14631:32;14628:119;;;14666:79;;:::i;:::-;14628:119;14786:1;14811:53;14856:7;14847:6;14836:9;14832:22;14811:53;:::i;:::-;14801:63;;14757:117;14913:2;14939:50;14981:7;14972:6;14961:9;14957:22;14939:50;:::i;:::-;14929:60;;14884:115;14538:468;;;;;:::o;15012:307::-;15073:4;15163:18;15155:6;15152:30;15149:56;;;15185:18;;:::i;:::-;15149:56;15223:29;15245:6;15223:29;:::i;:::-;15215:37;;15307:4;15301;15297:15;15289:23;;15012:307;;;:::o;15325:423::-;15402:5;15427:65;15443:48;15484:6;15443:48;:::i;:::-;15427:65;:::i;:::-;15418:74;;15515:6;15508:5;15501:21;15553:4;15546:5;15542:16;15591:3;15582:6;15577:3;15573:16;15570:25;15567:112;;;15598:79;;:::i;:::-;15567:112;15688:54;15735:6;15730:3;15725;15688:54;:::i;:::-;15408:340;15325:423;;;;;:::o;15767:338::-;15822:5;15871:3;15864:4;15856:6;15852:17;15848:27;15838:122;;15879:79;;:::i;:::-;15838:122;15996:6;15983:20;16021:78;16095:3;16087:6;16080:4;16072:6;16068:17;16021:78;:::i;:::-;16012:87;;15828:277;15767:338;;;;:::o;16111:943::-;16206:6;16214;16222;16230;16279:3;16267:9;16258:7;16254:23;16250:33;16247:120;;;16286:79;;:::i;:::-;16247:120;16406:1;16431:53;16476:7;16467:6;16456:9;16452:22;16431:53;:::i;:::-;16421:63;;16377:117;16533:2;16559:53;16604:7;16595:6;16584:9;16580:22;16559:53;:::i;:::-;16549:63;;16504:118;16661:2;16687:53;16732:7;16723:6;16712:9;16708:22;16687:53;:::i;:::-;16677:63;;16632:118;16817:2;16806:9;16802:18;16789:32;16848:18;16840:6;16837:30;16834:117;;;16870:79;;:::i;:::-;16834:117;16975:62;17029:7;17020:6;17009:9;17005:22;16975:62;:::i;:::-;16965:72;;16760:287;16111:943;;;;;;;:::o;17060:117::-;17169:1;17166;17159:12;17183:117;17292:1;17289;17282:12;17323:568;17396:8;17406:6;17456:3;17449:4;17441:6;17437:17;17433:27;17423:122;;17464:79;;:::i;:::-;17423:122;17577:6;17564:20;17554:30;;17607:18;17599:6;17596:30;17593:117;;;17629:79;;:::i;:::-;17593:117;17743:4;17735:6;17731:17;17719:29;;17797:3;17789:4;17781:6;17777:17;17767:8;17763:32;17760:41;17757:128;;;17804:79;;:::i;:::-;17757:128;17323:568;;;;;:::o;17897:704::-;17992:6;18000;18008;18057:2;18045:9;18036:7;18032:23;18028:32;18025:119;;;18063:79;;:::i;:::-;18025:119;18183:1;18208:53;18253:7;18244:6;18233:9;18229:22;18208:53;:::i;:::-;18198:63;;18154:117;18338:2;18327:9;18323:18;18310:32;18369:18;18361:6;18358:30;18355:117;;;18391:79;;:::i;:::-;18355:117;18504:80;18576:7;18567:6;18556:9;18552:22;18504:80;:::i;:::-;18486:98;;;;18281:313;17897:704;;;;;:::o;18607:359::-;18681:6;18730:2;18718:9;18709:7;18705:23;18701:32;18698:119;;;18736:79;;:::i;:::-;18698:119;18856:1;18881:68;18941:7;18932:6;18921:9;18917:22;18881:68;:::i;:::-;18871:78;;18827:132;18607:359;;;;:::o;18972:474::-;19040:6;19048;19097:2;19085:9;19076:7;19072:23;19068:32;19065:119;;;19103:79;;:::i;:::-;19065:119;19223:1;19248:53;19293:7;19284:6;19273:9;19269:22;19248:53;:::i;:::-;19238:63;;19194:117;19350:2;19376:53;19421:7;19412:6;19401:9;19397:22;19376:53;:::i;:::-;19366:63;;19321:118;18972:474;;;;;:::o;19452:::-;19520:6;19528;19577:2;19565:9;19556:7;19552:23;19548:32;19545:119;;;19583:79;;:::i;:::-;19545:119;19703:1;19728:53;19773:7;19764:6;19753:9;19749:22;19728:53;:::i;:::-;19718:63;;19674:117;19830:2;19856:53;19901:7;19892:6;19881:9;19877:22;19856:53;:::i;:::-;19846:63;;19801:118;19452:474;;;;;:::o;19932:89::-;19968:7;20008:6;20001:5;19997:18;19986:29;;19932:89;;;:::o;20027:115::-;20112:23;20129:5;20112:23;:::i;:::-;20107:3;20100:36;20027:115;;:::o;20148:218::-;20239:4;20277:2;20266:9;20262:18;20254:26;;20290:69;20356:1;20345:9;20341:17;20332:6;20290:69;:::i;:::-;20148:218;;;;:::o;20372:180::-;20420:77;20417:1;20410:88;20517:4;20514:1;20507:15;20541:4;20538:1;20531:15;20558:320;20602:6;20639:1;20633:4;20629:12;20619:22;;20686:1;20680:4;20676:12;20707:18;20697:81;;20763:4;20755:6;20751:17;20741:27;;20697:81;20825:2;20817:6;20814:14;20794:18;20791:38;20788:84;;20844:18;;:::i;:::-;20788:84;20609:269;20558:320;;;:::o;20884:220::-;21024:34;21020:1;21012:6;21008:14;21001:58;21093:3;21088:2;21080:6;21076:15;21069:28;20884:220;:::o;21110:366::-;21252:3;21273:67;21337:2;21332:3;21273:67;:::i;:::-;21266:74;;21349:93;21438:3;21349:93;:::i;:::-;21467:2;21462:3;21458:12;21451:19;;21110:366;;;:::o;21482:419::-;21648:4;21686:2;21675:9;21671:18;21663:26;;21735:9;21729:4;21725:20;21721:1;21710:9;21706:17;21699:47;21763:131;21889:4;21763:131;:::i;:::-;21755:139;;21482:419;;;:::o;21907:249::-;22047:34;22043:1;22035:6;22031:14;22024:58;22116:32;22111:2;22103:6;22099:15;22092:57;21907:249;:::o;22162:366::-;22304:3;22325:67;22389:2;22384:3;22325:67;:::i;:::-;22318:74;;22401:93;22490:3;22401:93;:::i;:::-;22519:2;22514:3;22510:12;22503:19;;22162:366;;;:::o;22534:419::-;22700:4;22738:2;22727:9;22723:18;22715:26;;22787:9;22781:4;22777:20;22773:1;22762:9;22758:17;22751:47;22815:131;22941:4;22815:131;:::i;:::-;22807:139;;22534:419;;;:::o;22959:141::-;23008:4;23031:3;23023:11;;23054:3;23051:1;23044:14;23088:4;23085:1;23075:18;23067:26;;22959:141;;;:::o;23106:93::-;23143:6;23190:2;23185;23178:5;23174:14;23170:23;23160:33;;23106:93;;;:::o;23205:107::-;23249:8;23299:5;23293:4;23289:16;23268:37;;23205:107;;;;:::o;23318:393::-;23387:6;23437:1;23425:10;23421:18;23460:97;23490:66;23479:9;23460:97;:::i;:::-;23578:39;23608:8;23597:9;23578:39;:::i;:::-;23566:51;;23650:4;23646:9;23639:5;23635:21;23626:30;;23699:4;23689:8;23685:19;23678:5;23675:30;23665:40;;23394:317;;23318:393;;;;;:::o;23717:60::-;23745:3;23766:5;23759:12;;23717:60;;;:::o;23783:142::-;23833:9;23866:53;23884:34;23893:24;23911:5;23893:24;:::i;:::-;23884:34;:::i;:::-;23866:53;:::i;:::-;23853:66;;23783:142;;;:::o;23931:75::-;23974:3;23995:5;23988:12;;23931:75;;;:::o;24012:269::-;24122:39;24153:7;24122:39;:::i;:::-;24183:91;24232:41;24256:16;24232:41;:::i;:::-;24224:6;24217:4;24211:11;24183:91;:::i;:::-;24177:4;24170:105;24088:193;24012:269;;;:::o;24287:73::-;24332:3;24287:73;:::o;24366:189::-;24443:32;;:::i;:::-;24484:65;24542:6;24534;24528:4;24484:65;:::i;:::-;24419:136;24366:189;;:::o;24561:186::-;24621:120;24638:3;24631:5;24628:14;24621:120;;;24692:39;24729:1;24722:5;24692:39;:::i;:::-;24665:1;24658:5;24654:13;24645:22;;24621:120;;;24561:186;;:::o;24753:543::-;24854:2;24849:3;24846:11;24843:446;;;24888:38;24920:5;24888:38;:::i;:::-;24972:29;24990:10;24972:29;:::i;:::-;24962:8;24958:44;25155:2;25143:10;25140:18;25137:49;;;25176:8;25161:23;;25137:49;25199:80;25255:22;25273:3;25255:22;:::i;:::-;25245:8;25241:37;25228:11;25199:80;:::i;:::-;24858:431;;24843:446;24753:543;;;:::o;25302:117::-;25356:8;25406:5;25400:4;25396:16;25375:37;;25302:117;;;;:::o;25425:169::-;25469:6;25502:51;25550:1;25546:6;25538:5;25535:1;25531:13;25502:51;:::i;:::-;25498:56;25583:4;25577;25573:15;25563:25;;25476:118;25425:169;;;;:::o;25599:295::-;25675:4;25821:29;25846:3;25840:4;25821:29;:::i;:::-;25813:37;;25883:3;25880:1;25876:11;25870:4;25867:21;25859:29;;25599:295;;;;:::o;25899:1395::-;26016:37;26049:3;26016:37;:::i;:::-;26118:18;26110:6;26107:30;26104:56;;;26140:18;;:::i;:::-;26104:56;26184:38;26216:4;26210:11;26184:38;:::i;:::-;26269:67;26329:6;26321;26315:4;26269:67;:::i;:::-;26363:1;26387:4;26374:17;;26419:2;26411:6;26408:14;26436:1;26431:618;;;;27093:1;27110:6;27107:77;;;27159:9;27154:3;27150:19;27144:26;27135:35;;27107:77;27210:67;27270:6;27263:5;27210:67;:::i;:::-;27204:4;27197:81;27066:222;26401:887;;26431:618;26483:4;26479:9;26471:6;26467:22;26517:37;26549:4;26517:37;:::i;:::-;26576:1;26590:208;26604:7;26601:1;26598:14;26590:208;;;26683:9;26678:3;26674:19;26668:26;26660:6;26653:42;26734:1;26726:6;26722:14;26712:24;;26781:2;26770:9;26766:18;26753:31;;26627:4;26624:1;26620:12;26615:17;;26590:208;;;26826:6;26817:7;26814:19;26811:179;;;26884:9;26879:3;26875:19;26869:26;26927:48;26969:4;26961:6;26957:17;26946:9;26927:48;:::i;:::-;26919:6;26912:64;26834:156;26811:179;27036:1;27032;27024:6;27020:14;27016:22;27010:4;27003:36;26438:611;;;26401:887;;25991:1303;;;25899:1395;;:::o;27300:225::-;27440:34;27436:1;27428:6;27424:14;27417:58;27509:8;27504:2;27496:6;27492:15;27485:33;27300:225;:::o;27531:366::-;27673:3;27694:67;27758:2;27753:3;27694:67;:::i;:::-;27687:74;;27770:93;27859:3;27770:93;:::i;:::-;27888:2;27883:3;27879:12;27872:19;;27531:366;;;:::o;27903:419::-;28069:4;28107:2;28096:9;28092:18;28084:26;;28156:9;28150:4;28146:20;28142:1;28131:9;28127:17;28120:47;28184:131;28310:4;28184:131;:::i;:::-;28176:139;;27903:419;;;:::o;28328:230::-;28468:34;28464:1;28456:6;28452:14;28445:58;28537:13;28532:2;28524:6;28520:15;28513:38;28328:230;:::o;28564:366::-;28706:3;28727:67;28791:2;28786:3;28727:67;:::i;:::-;28720:74;;28803:93;28892:3;28803:93;:::i;:::-;28921:2;28916:3;28912:12;28905:19;;28564:366;;;:::o;28936:419::-;29102:4;29140:2;29129:9;29125:18;29117:26;;29189:9;29183:4;29179:20;29175:1;29164:9;29160:17;29153:47;29217:131;29343:4;29217:131;:::i;:::-;29209:139;;28936:419;;;:::o;29361:180::-;29409:77;29406:1;29399:88;29506:4;29503:1;29496:15;29530:4;29527:1;29520:15;29547:191;29587:3;29606:20;29624:1;29606:20;:::i;:::-;29601:25;;29640:20;29658:1;29640:20;:::i;:::-;29635:25;;29683:1;29680;29676:9;29669:16;;29704:3;29701:1;29698:10;29695:36;;;29711:18;;:::i;:::-;29695:36;29547:191;;;;:::o;29744:142::-;29794:9;29827:53;29845:34;29854:24;29872:5;29854:24;:::i;:::-;29845:34;:::i;:::-;29827:53;:::i;:::-;29814:66;;29744:142;;;:::o;29892:126::-;29942:9;29975:37;30006:5;29975:37;:::i;:::-;29962:50;;29892:126;;;:::o;30024:134::-;30082:9;30115:37;30146:5;30115:37;:::i;:::-;30102:50;;30024:134;;;:::o;30164:147::-;30259:45;30298:5;30259:45;:::i;:::-;30254:3;30247:58;30164:147;;:::o;30317:348::-;30446:4;30484:2;30473:9;30469:18;30461:26;;30497:79;30573:1;30562:9;30558:17;30549:6;30497:79;:::i;:::-;30586:72;30654:2;30643:9;30639:18;30630:6;30586:72;:::i;:::-;30317:348;;;;;:::o;30671:233::-;30811:34;30807:1;30799:6;30795:14;30788:58;30880:16;30875:2;30867:6;30863:15;30856:41;30671:233;:::o;30910:366::-;31052:3;31073:67;31137:2;31132:3;31073:67;:::i;:::-;31066:74;;31149:93;31238:3;31149:93;:::i;:::-;31267:2;31262:3;31258:12;31251:19;;30910:366;;;:::o;31282:419::-;31448:4;31486:2;31475:9;31471:18;31463:26;;31535:9;31529:4;31525:20;31521:1;31510:9;31506:17;31499:47;31563:131;31689:4;31563:131;:::i;:::-;31555:139;;31282:419;;;:::o;31707:180::-;31755:77;31752:1;31745:88;31852:4;31849:1;31842:15;31876:4;31873:1;31866:15;31893:233;31932:3;31955:24;31973:5;31955:24;:::i;:::-;31946:33;;32001:66;31994:5;31991:77;31988:103;;32071:18;;:::i;:::-;31988:103;32118:1;32111:5;32107:13;32100:20;;31893:233;;;:::o;32132:174::-;32272:26;32268:1;32260:6;32256:14;32249:50;32132:174;:::o;32312:366::-;32454:3;32475:67;32539:2;32534:3;32475:67;:::i;:::-;32468:74;;32551:93;32640:3;32551:93;:::i;:::-;32669:2;32664:3;32660:12;32653:19;;32312:366;;;:::o;32684:419::-;32850:4;32888:2;32877:9;32873:18;32865:26;;32937:9;32931:4;32927:20;32923:1;32912:9;32908:17;32901:47;32965:131;33091:4;32965:131;:::i;:::-;32957:139;;32684:419;;;:::o;33109:228::-;33249:34;33245:1;33237:6;33233:14;33226:58;33318:11;33313:2;33305:6;33301:15;33294:36;33109:228;:::o;33343:366::-;33485:3;33506:67;33570:2;33565:3;33506:67;:::i;:::-;33499:74;;33582:93;33671:3;33582:93;:::i;:::-;33700:2;33695:3;33691:12;33684:19;;33343:366;;;:::o;33715:419::-;33881:4;33919:2;33908:9;33904:18;33896:26;;33968:9;33962:4;33958:20;33954:1;33943:9;33939:17;33932:47;33996:131;34122:4;33996:131;:::i;:::-;33988:139;;33715:419;;;:::o;34140:170::-;34280:22;34276:1;34268:6;34264:14;34257:46;34140:170;:::o;34316:366::-;34458:3;34479:67;34543:2;34538:3;34479:67;:::i;:::-;34472:74;;34555:93;34644:3;34555:93;:::i;:::-;34673:2;34668:3;34664:12;34657:19;;34316:366;;;:::o;34688:419::-;34854:4;34892:2;34881:9;34877:18;34869:26;;34941:9;34935:4;34931:20;34927:1;34916:9;34912:17;34905:47;34969:131;35095:4;34969:131;:::i;:::-;34961:139;;34688:419;;;:::o;35113:170::-;35253:22;35249:1;35241:6;35237:14;35230:46;35113:170;:::o;35289:366::-;35431:3;35452:67;35516:2;35511:3;35452:67;:::i;:::-;35445:74;;35528:93;35617:3;35528:93;:::i;:::-;35646:2;35641:3;35637:12;35630:19;;35289:366;;;:::o;35661:419::-;35827:4;35865:2;35854:9;35850:18;35842:26;;35914:9;35908:4;35904:20;35900:1;35889:9;35885:17;35878:47;35942:131;36068:4;35942:131;:::i;:::-;35934:139;;35661:419;;;:::o;36086:173::-;36226:25;36222:1;36214:6;36210:14;36203:49;36086:173;:::o;36265:366::-;36407:3;36428:67;36492:2;36487:3;36428:67;:::i;:::-;36421:74;;36504:93;36593:3;36504:93;:::i;:::-;36622:2;36617:3;36613:12;36606:19;;36265:366;;;:::o;36637:419::-;36803:4;36841:2;36830:9;36826:18;36818:26;;36890:9;36884:4;36880:20;36876:1;36865:9;36861:17;36854:47;36918:131;37044:4;36918:131;:::i;:::-;36910:139;;36637:419;;;:::o;37062:410::-;37102:7;37125:20;37143:1;37125:20;:::i;:::-;37120:25;;37159:20;37177:1;37159:20;:::i;:::-;37154:25;;37214:1;37211;37207:9;37236:30;37254:11;37236:30;:::i;:::-;37225:41;;37415:1;37406:7;37402:15;37399:1;37396:22;37376:1;37369:9;37349:83;37326:139;;37445:18;;:::i;:::-;37326:139;37110:362;37062:410;;;;:::o;37478:169::-;37618:21;37614:1;37606:6;37602:14;37595:45;37478:169;:::o;37653:366::-;37795:3;37816:67;37880:2;37875:3;37816:67;:::i;:::-;37809:74;;37892:93;37981:3;37892:93;:::i;:::-;38010:2;38005:3;38001:12;37994:19;;37653:366;;;:::o;38025:419::-;38191:4;38229:2;38218:9;38214:18;38206:26;;38278:9;38272:4;38268:20;38264:1;38253:9;38249:17;38242:47;38306:131;38432:4;38306:131;:::i;:::-;38298:139;;38025:419;;;:::o;38450:143::-;38507:5;38538:6;38532:13;38523:22;;38554:33;38581:5;38554:33;:::i;:::-;38450:143;;;;:::o;38599:351::-;38669:6;38718:2;38706:9;38697:7;38693:23;38689:32;38686:119;;;38724:79;;:::i;:::-;38686:119;38844:1;38869:64;38925:7;38916:6;38905:9;38901:22;38869:64;:::i;:::-;38859:74;;38815:128;38599:351;;;;:::o;38956:234::-;39096:34;39092:1;39084:6;39080:14;39073:58;39165:17;39160:2;39152:6;39148:15;39141:42;38956:234;:::o;39196:366::-;39338:3;39359:67;39423:2;39418:3;39359:67;:::i;:::-;39352:74;;39435:93;39524:3;39435:93;:::i;:::-;39553:2;39548:3;39544:12;39537:19;;39196:366;;;:::o;39568:419::-;39734:4;39772:2;39761:9;39757:18;39749:26;;39821:9;39815:4;39811:20;39807:1;39796:9;39792:17;39785:47;39849:131;39975:4;39849:131;:::i;:::-;39841:139;;39568:419;;;:::o;39993:148::-;40095:11;40132:3;40117:18;;39993:148;;;;:::o;40147:390::-;40253:3;40281:39;40314:5;40281:39;:::i;:::-;40336:89;40418:6;40413:3;40336:89;:::i;:::-;40329:96;;40434:65;40492:6;40487:3;40480:4;40473:5;40469:16;40434:65;:::i;:::-;40524:6;40519:3;40515:16;40508:23;;40257:280;40147:390;;;;:::o;40567:874::-;40670:3;40707:5;40701:12;40736:36;40762:9;40736:36;:::i;:::-;40788:89;40870:6;40865:3;40788:89;:::i;:::-;40781:96;;40908:1;40897:9;40893:17;40924:1;40919:166;;;;41099:1;41094:341;;;;40886:549;;40919:166;41003:4;40999:9;40988;40984:25;40979:3;40972:38;41065:6;41058:14;41051:22;41043:6;41039:35;41034:3;41030:45;41023:52;;40919:166;;41094:341;41161:38;41193:5;41161:38;:::i;:::-;41221:1;41235:154;41249:6;41246:1;41243:13;41235:154;;;41323:7;41317:14;41313:1;41308:3;41304:11;41297:35;41373:1;41364:7;41360:15;41349:26;;41271:4;41268:1;41264:12;41259:17;;41235:154;;;41418:6;41413:3;41409:16;41402:23;;41101:334;;40886:549;;40674:767;;40567:874;;;;:::o;41447:589::-;41672:3;41694:95;41785:3;41776:6;41694:95;:::i;:::-;41687:102;;41806:95;41897:3;41888:6;41806:95;:::i;:::-;41799:102;;41918:92;42006:3;41997:6;41918:92;:::i;:::-;41911:99;;42027:3;42020:10;;41447:589;;;;;;:::o;42042:165::-;42182:17;42178:1;42170:6;42166:14;42159:41;42042:165;:::o;42213:366::-;42355:3;42376:67;42440:2;42435:3;42376:67;:::i;:::-;42369:74;;42452:93;42541:3;42452:93;:::i;:::-;42570:2;42565:3;42561:12;42554:19;;42213:366;;;:::o;42585:419::-;42751:4;42789:2;42778:9;42774:18;42766:26;;42838:9;42832:4;42828:20;42824:1;42813:9;42809:17;42802:47;42866:131;42992:4;42866:131;:::i;:::-;42858:139;;42585:419;;;:::o;43010:179::-;43150:31;43146:1;43138:6;43134:14;43127:55;43010:179;:::o;43195:366::-;43337:3;43358:67;43422:2;43417:3;43358:67;:::i;:::-;43351:74;;43434:93;43523:3;43434:93;:::i;:::-;43552:2;43547:3;43543:12;43536:19;;43195:366;;;:::o;43567:419::-;43733:4;43771:2;43760:9;43756:18;43748:26;;43820:9;43814:4;43810:20;43806:1;43795:9;43791:17;43784:47;43848:131;43974:4;43848:131;:::i;:::-;43840:139;;43567:419;;;:::o;43992:225::-;44132:34;44128:1;44120:6;44116:14;44109:58;44201:8;44196:2;44188:6;44184:15;44177:33;43992:225;:::o;44223:366::-;44365:3;44386:67;44450:2;44445:3;44386:67;:::i;:::-;44379:74;;44462:93;44551:3;44462:93;:::i;:::-;44580:2;44575:3;44571:12;44564:19;;44223:366;;;:::o;44595:419::-;44761:4;44799:2;44788:9;44784:18;44776:26;;44848:9;44842:4;44838:20;44834:1;44823:9;44819:17;44812:47;44876:131;45002:4;44876:131;:::i;:::-;44868:139;;44595:419;;;:::o;45020:182::-;45160:34;45156:1;45148:6;45144:14;45137:58;45020:182;:::o;45208:366::-;45350:3;45371:67;45435:2;45430:3;45371:67;:::i;:::-;45364:74;;45447:93;45536:3;45447:93;:::i;:::-;45565:2;45560:3;45556:12;45549:19;;45208:366;;;:::o;45580:419::-;45746:4;45784:2;45773:9;45769:18;45761:26;;45833:9;45827:4;45823:20;45819:1;45808:9;45804:17;45797:47;45861:131;45987:4;45861:131;:::i;:::-;45853:139;;45580:419;;;:::o;46005:179::-;46145:31;46141:1;46133:6;46129:14;46122:55;46005:179;:::o;46190:366::-;46332:3;46353:67;46417:2;46412:3;46353:67;:::i;:::-;46346:74;;46429:93;46518:3;46429:93;:::i;:::-;46547:2;46542:3;46538:12;46531:19;;46190:366;;;:::o;46562:419::-;46728:4;46766:2;46755:9;46751:18;46743:26;;46815:9;46809:4;46805:20;46801:1;46790:9;46786:17;46779:47;46843:131;46969:4;46843:131;:::i;:::-;46835:139;;46562:419;;;:::o;46987:147::-;47088:11;47125:3;47110:18;;46987:147;;;;:::o;47140:114::-;;:::o;47260:398::-;47419:3;47440:83;47521:1;47516:3;47440:83;:::i;:::-;47433:90;;47532:93;47621:3;47532:93;:::i;:::-;47650:1;47645:3;47641:11;47634:18;;47260:398;;;:::o;47664:379::-;47848:3;47870:147;48013:3;47870:147;:::i;:::-;47863:154;;48034:3;48027:10;;47664:379;;;:::o;48049:245::-;48189:34;48185:1;48177:6;48173:14;48166:58;48258:28;48253:2;48245:6;48241:15;48234:53;48049:245;:::o;48300:366::-;48442:3;48463:67;48527:2;48522:3;48463:67;:::i;:::-;48456:74;;48539:93;48628:3;48539:93;:::i;:::-;48657:2;48652:3;48648:12;48641:19;;48300:366;;;:::o;48672:419::-;48838:4;48876:2;48865:9;48861:18;48853:26;;48925:9;48919:4;48915:20;48911:1;48900:9;48896:17;48889:47;48953:131;49079:4;48953:131;:::i;:::-;48945:139;;48672:419;;;:::o;49097:224::-;49237:34;49233:1;49225:6;49221:14;49214:58;49306:7;49301:2;49293:6;49289:15;49282:32;49097:224;:::o;49327:366::-;49469:3;49490:67;49554:2;49549:3;49490:67;:::i;:::-;49483:74;;49566:93;49655:3;49566:93;:::i;:::-;49684:2;49679:3;49675:12;49668:19;;49327:366;;;:::o;49699:419::-;49865:4;49903:2;49892:9;49888:18;49880:26;;49952:9;49946:4;49942:20;49938:1;49927:9;49923:17;49916:47;49980:131;50106:4;49980:131;:::i;:::-;49972:139;;49699:419;;;:::o;50124:223::-;50264:34;50260:1;50252:6;50248:14;50241:58;50333:6;50328:2;50320:6;50316:15;50309:31;50124:223;:::o;50353:366::-;50495:3;50516:67;50580:2;50575:3;50516:67;:::i;:::-;50509:74;;50592:93;50681:3;50592:93;:::i;:::-;50710:2;50705:3;50701:12;50694:19;;50353:366;;;:::o;50725:419::-;50891:4;50929:2;50918:9;50914:18;50906:26;;50978:9;50972:4;50968:20;50964:1;50953:9;50949:17;50942:47;51006:131;51132:4;51006:131;:::i;:::-;50998:139;;50725:419;;;:::o;51150:194::-;51190:4;51210:20;51228:1;51210:20;:::i;:::-;51205:25;;51244:20;51262:1;51244:20;:::i;:::-;51239:25;;51288:1;51285;51281:9;51273:17;;51312:1;51306:4;51303:11;51300:37;;;51317:18;;:::i;:::-;51300:37;51150:194;;;;:::o;51350:171::-;51388:3;51411:23;51428:5;51411:23;:::i;:::-;51402:32;;51456:6;51449:5;51446:17;51443:43;;51466:18;;:::i;:::-;51443:43;51513:1;51506:5;51502:13;51495:20;;51350:171;;;:::o;51527:96::-;51561:8;51610:5;51605:3;51601:15;51580:36;;51527:96;;;:::o;51629:94::-;51667:7;51696:21;51711:5;51696:21;:::i;:::-;51685:32;;51629:94;;;:::o;51729:153::-;51832:43;51851:23;51868:5;51851:23;:::i;:::-;51832:43;:::i;:::-;51827:3;51820:56;51729:153;;:::o;51888:94::-;51921:8;51969:5;51965:2;51961:14;51940:35;;51888:94;;;:::o;51988:::-;52027:7;52056:20;52070:5;52056:20;:::i;:::-;52045:31;;51988:94;;;:::o;52088:100::-;52127:7;52156:26;52176:5;52156:26;:::i;:::-;52145:37;;52088:100;;;:::o;52194:157::-;52299:45;52319:24;52337:5;52319:24;:::i;:::-;52299:45;:::i;:::-;52294:3;52287:58;52194:157;;:::o;52357:79::-;52396:7;52425:5;52414:16;;52357:79;;;:::o;52442:157::-;52547:45;52567:24;52585:5;52567:24;:::i;:::-;52547:45;:::i;:::-;52542:3;52535:58;52442:157;;:::o;52605:79::-;52644:7;52673:5;52662:16;;52605:79;;;:::o;52690:157::-;52795:45;52815:24;52833:5;52815:24;:::i;:::-;52795:45;:::i;:::-;52790:3;52783:58;52690:157;;:::o;52853:674::-;53047:3;53062:73;53131:3;53122:6;53062:73;:::i;:::-;53160:1;53155:3;53151:11;53144:18;;53172:75;53243:3;53234:6;53172:75;:::i;:::-;53272:2;53267:3;53263:12;53256:19;;53285:75;53356:3;53347:6;53285:75;:::i;:::-;53385:2;53380:3;53376:12;53369:19;;53398:75;53469:3;53460:6;53398:75;:::i;:::-;53498:2;53493:3;53489:12;53482:19;;53518:3;53511:10;;52853:674;;;;;;;:::o;53533:175::-;53673:27;53669:1;53661:6;53657:14;53650:51;53533:175;:::o;53714:366::-;53856:3;53877:67;53941:2;53936:3;53877:67;:::i;:::-;53870:74;;53953:93;54042:3;53953:93;:::i;:::-;54071:2;54066:3;54062:12;54055:19;;53714:366;;;:::o;54086:419::-;54252:4;54290:2;54279:9;54275:18;54267:26;;54339:9;54333:4;54329:20;54325:1;54314:9;54310:17;54303:47;54367:131;54493:4;54367:131;:::i;:::-;54359:139;;54086:419;;;:::o;54511:180::-;54559:77;54556:1;54549:88;54656:4;54653:1;54646:15;54680:4;54677:1;54670:15;54697:185;54737:1;54754:20;54772:1;54754:20;:::i;:::-;54749:25;;54788:20;54806:1;54788:20;:::i;:::-;54783:25;;54827:1;54817:35;;54832:18;;:::i;:::-;54817:35;54874:1;54871;54867:9;54862:14;;54697:185;;;;:::o;54888:237::-;55028:34;55024:1;55016:6;55012:14;55005:58;55097:20;55092:2;55084:6;55080:15;55073:45;54888:237;:::o;55131:366::-;55273:3;55294:67;55358:2;55353:3;55294:67;:::i;:::-;55287:74;;55370:93;55459:3;55370:93;:::i;:::-;55488:2;55483:3;55479:12;55472:19;;55131:366;;;:::o;55503:419::-;55669:4;55707:2;55696:9;55692:18;55684:26;;55756:9;55750:4;55746:20;55742:1;55731:9;55727:17;55720:47;55784:131;55910:4;55784:131;:::i;:::-;55776:139;;55503:419;;;:::o;55928:176::-;55960:1;55977:20;55995:1;55977:20;:::i;:::-;55972:25;;56011:20;56029:1;56011:20;:::i;:::-;56006:25;;56050:1;56040:35;;56055:18;;:::i;:::-;56040:35;56096:1;56093;56089:9;56084:14;;55928:176;;;;:::o;56110:256::-;56222:3;56237:75;56308:3;56299:6;56237:75;:::i;:::-;56337:2;56332:3;56328:12;56321:19;;56357:3;56350:10;;56110:256;;;;:::o;56372:137::-;56426:5;56457:6;56451:13;56442:22;;56473:30;56497:5;56473:30;:::i;:::-;56372:137;;;;:::o;56515:345::-;56582:6;56631:2;56619:9;56610:7;56606:23;56602:32;56599:119;;;56637:79;;:::i;:::-;56599:119;56757:1;56782:61;56835:7;56826:6;56815:9;56811:22;56782:61;:::i;:::-;56772:71;;56728:125;56515:345;;;;:::o;56866:229::-;57006:34;57002:1;56994:6;56990:14;56983:58;57075:12;57070:2;57062:6;57058:15;57051:37;56866:229;:::o;57101:366::-;57243:3;57264:67;57328:2;57323:3;57264:67;:::i;:::-;57257:74;;57340:93;57429:3;57340:93;:::i;:::-;57458:2;57453:3;57449:12;57442:19;;57101:366;;;:::o;57473:419::-;57639:4;57677:2;57666:9;57662:18;57654:26;;57726:9;57720:4;57716:20;57712:1;57701:9;57697:17;57690:47;57754:131;57880:4;57754:131;:::i;:::-;57746:139;;57473:419;;;:::o;57898:161::-;58038:13;58034:1;58026:6;58022:14;58015:37;57898:161;:::o;58065:366::-;58207:3;58228:67;58292:2;58287:3;58228:67;:::i;:::-;58221:74;;58304:93;58393:3;58304:93;:::i;:::-;58422:2;58417:3;58413:12;58406:19;;58065:366;;;:::o;58437:419::-;58603:4;58641:2;58630:9;58626:18;58618:26;;58690:9;58684:4;58680:20;58676:1;58665:9;58661:17;58654:47;58718:131;58844:4;58718:131;:::i;:::-;58710:139;;58437:419;;;:::o;58862:98::-;58913:6;58947:5;58941:12;58931:22;;58862:98;;;:::o;58966:168::-;59049:11;59083:6;59078:3;59071:19;59123:4;59118:3;59114:14;59099:29;;58966:168;;;;:::o;59140:373::-;59226:3;59254:38;59286:5;59254:38;:::i;:::-;59308:70;59371:6;59366:3;59308:70;:::i;:::-;59301:77;;59387:65;59445:6;59440:3;59433:4;59426:5;59422:16;59387:65;:::i;:::-;59477:29;59499:6;59477:29;:::i;:::-;59472:3;59468:39;59461:46;;59230:283;59140:373;;;;:::o;59519:640::-;59714:4;59752:3;59741:9;59737:19;59729:27;;59766:71;59834:1;59823:9;59819:17;59810:6;59766:71;:::i;:::-;59847:72;59915:2;59904:9;59900:18;59891:6;59847:72;:::i;:::-;59929;59997:2;59986:9;59982:18;59973:6;59929:72;:::i;:::-;60048:9;60042:4;60038:20;60033:2;60022:9;60018:18;60011:48;60076:76;60147:4;60138:6;60076:76;:::i;:::-;60068:84;;59519:640;;;;;;;:::o;60165:141::-;60221:5;60252:6;60246:13;60237:22;;60268:32;60294:5;60268:32;:::i;:::-;60165:141;;;;:::o;60312:349::-;60381:6;60430:2;60418:9;60409:7;60405:23;60401:32;60398:119;;;60436:79;;:::i;:::-;60398:119;60556:1;60581:63;60636:7;60627:6;60616:9;60612:22;60581:63;:::i;:::-;60571:73;;60527:127;60312:349;;;;:::o;60667:225::-;60807:34;60803:1;60795:6;60791:14;60784:58;60876:8;60871:2;60863:6;60859:15;60852:33;60667:225;:::o;60898:366::-;61040:3;61061:67;61125:2;61120:3;61061:67;:::i;:::-;61054:74;;61137:93;61226:3;61137:93;:::i;:::-;61255:2;61250:3;61246:12;61239:19;;60898:366;;;:::o;61270:419::-;61436:4;61474:2;61463:9;61459:18;61451:26;;61523:9;61517:4;61513:20;61509:1;61498:9;61494:17;61487:47;61551:131;61677:4;61551:131;:::i;:::-;61543:139;;61270:419;;;:::o;61695:179::-;61835:31;61831:1;61823:6;61819:14;61812:55;61695:179;:::o;61880:366::-;62022:3;62043:67;62107:2;62102:3;62043:67;:::i;:::-;62036:74;;62119:93;62208:3;62119:93;:::i;:::-;62237:2;62232:3;62228:12;62221:19;;61880:366;;;:::o;62252:419::-;62418:4;62456:2;62445:9;62441:18;62433:26;;62505:9;62499:4;62495:20;62491:1;62480:9;62476:17;62469:47;62533:131;62659:4;62533:131;:::i;:::-;62525:139;;62252:419;;;:::o;62677:386::-;62781:3;62809:38;62841:5;62809:38;:::i;:::-;62863:88;62944:6;62939:3;62863:88;:::i;:::-;62856:95;;62960:65;63018:6;63013:3;63006:4;62999:5;62995:16;62960:65;:::i;:::-;63050:6;63045:3;63041:16;63034:23;;62785:278;62677:386;;;;:::o;63069:271::-;63199:3;63221:93;63310:3;63301:6;63221:93;:::i;:::-;63214:100;;63331:3;63324:10;;63069:271;;;;:::o;63346:182::-;63486:34;63482:1;63474:6;63470:14;63463:58;63346:182;:::o;63534:366::-;63676:3;63697:67;63761:2;63756:3;63697:67;:::i;:::-;63690:74;;63773:93;63862:3;63773:93;:::i;:::-;63891:2;63886:3;63882:12;63875:19;;63534:366;;;:::o;63906:419::-;64072:4;64110:2;64099:9;64095:18;64087:26;;64159:9;64153:4;64149:20;64145:1;64134:9;64130:17;64123:47;64187:131;64313:4;64187:131;:::i;:::-;64179:139;;63906:419;;;:::o;64331:178::-;64471:30;64467:1;64459:6;64455:14;64448:54;64331:178;:::o;64515:366::-;64657:3;64678:67;64742:2;64737:3;64678:67;:::i;:::-;64671:74;;64754:93;64843:3;64754:93;:::i;:::-;64872:2;64867:3;64863:12;64856:19;;64515:366;;;:::o;64887:419::-;65053:4;65091:2;65080:9;65076:18;65068:26;;65140:9;65134:4;65130:20;65126:1;65115:9;65111:17;65104:47;65168:131;65294:4;65168:131;:::i;:::-;65160:139;;64887:419;;;:::o
Swarm Source
ipfs://4cca1def1894b0358dde361d06f979a1d65b5c9a54ef24a65df9f0a24912025a
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.