Token Fantom Hippies
Overview ERC-721
Total Supply:
17 HIPPIES
Holders:
8 addresses
Transfers:
-
Contract:
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FantomHippies
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-21 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.2; interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),'.json')) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @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); } /** * @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 of token that is not own"); 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); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @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` cannot be the zero address. * - `to` cannot be the zero address. * * 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 override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } /** /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } /** * @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; } } contract FantomHippies is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable, ERC721Burnable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; uint256 public maxSupply = 301; uint256 public price = 200000000000000000000; constructor() ERC721("Fantom Hippies", "HIPPIES") {} function _baseURI() internal pure override returns (string memory) { return "https://gateway.pinata.cloud/ipfs/QmfBbEvZ4VQgajyjZTtmaQmE1UQd9NszJkTVGoVKNdAWx8/"; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function setPrice(uint256 newPrice) public onlyOwner { price = newPrice; } function setMaxSupply(uint256 newMaxSupply) public onlyOwner { maxSupply = newMaxSupply; } function getAllTokenURIsByAddress(address owner) external view returns (string[] memory) { uint256 count = ERC721.balanceOf(owner); string[] memory uris = new string[](count); for (uint256 i = 0; i < count; i++) { uint256 tokenId = tokenOfOwnerByIndex(owner, i); uris[i] = tokenURI(tokenId); } return uris; } function transferGiveaway( address to, uint256 tokenId ) public onlyOwner { _safeMint(to, tokenId); } function mint(address[] memory to ,uint256[] memory _index) public payable { uint256 supply = totalSupply(); require( to.length < 6, 'You can mint a maximum of 10' ); require( msg.value * to.length >= price * to.length, 'not enough price' ); require( supply + to.length <= maxSupply, 'Exceeds maximum supply' ); for(uint256 i; i < to.length; i++){ _safeMint(to[i], _index[i]); } } function mintALT(address to ,uint256 num) public payable { uint256 supply = totalSupply(); require( num < 6, 'You can mint a maximum of 10' ); require( msg.value * num >= price * num, 'not enough price' ); require( supply + num <= maxSupply, 'Exceeds maximum supply' ); for(uint256 i; i < num; i++){ _tokenIdCounter.increment(); _safeMint(to, _tokenIdCounter.current()); } } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getAllTokenURIsByAddress","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"_index","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintALT","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405261012d600d55680ad78ebc5ac6200000600e553480156200002457600080fd5b506040518060400160405280600e81526020017f46616e746f6d20486970706965730000000000000000000000000000000000008152506040518060400160405280600781526020017f48495050494553000000000000000000000000000000000000000000000000008152508160009080519060200190620000a9929190620001d4565b508060019080519060200190620000c2929190620001d4565b5050506000600b60006101000a81548160ff02191690831515021790555062000100620000f46200010660201b60201c565b6200010e60201b60201c565b620002e9565b600033905090565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001e29062000284565b90600052602060002090601f01602090048101928262000206576000855562000252565b82601f106200022157805160ff191683800117855562000252565b8280016001018555821562000252579182015b828111156200025157825182559160200191906001019062000234565b5b50905062000261919062000265565b5090565b5b808211156200028057600081600090555060010162000266565b5090565b600060028204905060018216806200029d57607f821691505b60208210811415620002b457620002b3620002ba565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61491c80620002f96000396000f3fe6080604052600436106101d85760003560e01c806370a0823111610102578063a22cb46511610095578063d5abeb0111610064578063d5abeb0114610699578063e467f7e0146106c4578063e985e9c5146106e0578063f2fde38b1461071d576101d8565b8063a22cb465146105ee578063a58ecfa414610617578063b88d4fde14610633578063c87b56dd1461065c576101d8565b80638da5cb5b116100d15780638da5cb5b1461054457806391b7f5ed1461056f57806395d89b4114610598578063a035b1fe146105c3576101d8565b806370a08231146104b0578063715018a6146104ed5780638456cb591461050457806386a9ba371461051b576101d8565b80632f745c591161017a5780634f6ccce7116101495780634f6ccce7146103e25780635c975abb1461041f5780636352211e1461044a5780636f8b44b014610487576101d8565b80632f745c591461033c5780633f4ba83a1461037957806342842e0e1461039057806342966c68146103b9576101d8565b8063089c9140116101b6578063089c914014610282578063095ea7b3146102bf57806318160ddd146102e857806323b872dd14610313576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff919061328d565b610746565b6040516102119190613910565b60405180910390f35b34801561022657600080fd5b5061022f610758565b60405161023c919061392b565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906132e7565b6107ea565b6040516102799190613887565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190613052565b61086f565b6040516102b691906138ee565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e191906131d5565b61092f565b005b3480156102f457600080fd5b506102fd610a47565b60405161030a9190613c6d565b60405180910390f35b34801561031f57600080fd5b5061033a600480360381019061033591906130bf565b610a54565b005b34801561034857600080fd5b50610363600480360381019061035e91906131d5565b610ab4565b6040516103709190613c6d565b60405180910390f35b34801561038557600080fd5b5061038e610b59565b005b34801561039c57600080fd5b506103b760048036038101906103b291906130bf565b610bdf565b005b3480156103c557600080fd5b506103e060048036038101906103db91906132e7565b610bff565b005b3480156103ee57600080fd5b50610409600480360381019061040491906132e7565b610c5b565b6040516104169190613c6d565b60405180910390f35b34801561042b57600080fd5b50610434610ccc565b6040516104419190613910565b60405180910390f35b34801561045657600080fd5b50610471600480360381019061046c91906132e7565b610ce3565b60405161047e9190613887565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a991906132e7565b610d95565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613052565b610e1b565b6040516104e49190613c6d565b60405180910390f35b3480156104f957600080fd5b50610502610ed3565b005b34801561051057600080fd5b50610519610f5b565b005b34801561052757600080fd5b50610542600480360381019061053d91906131d5565b610fe1565b005b34801561055057600080fd5b5061055961106b565b6040516105669190613887565b60405180910390f35b34801561057b57600080fd5b50610596600480360381019061059191906132e7565b611095565b005b3480156105a457600080fd5b506105ad61111b565b6040516105ba919061392b565b60405180910390f35b3480156105cf57600080fd5b506105d86111ad565b6040516105e59190613c6d565b60405180910390f35b3480156105fa57600080fd5b5061061560048036038101906106109190613195565b6111b3565b005b610631600480360381019061062c91906131d5565b611334565b005b34801561063f57600080fd5b5061065a60048036038101906106559190613112565b61146f565b005b34801561066857600080fd5b50610683600480360381019061067e91906132e7565b6114d1565b604051610690919061392b565b60405180910390f35b3480156106a557600080fd5b506106ae6114e3565b6040516106bb9190613c6d565b60405180910390f35b6106de60048036038101906106d99190613215565b6114e9565b005b3480156106ec57600080fd5b506107076004803603810190610702919061307f565b61164a565b6040516107149190613910565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f9190613052565b6116de565b005b6000610751826117d6565b9050919050565b60606000805461076790613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461079390613f8e565b80156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b5050505050905090565b60006107f582611850565b610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b90613b2d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6060600061087c83610e1b565b905060008167ffffffffffffffff81111561089a57610899614156565b5b6040519080825280602002602001820160405280156108cd57816020015b60608152602001906001900390816108b85790505b50905060005b828110156109245760006108e78683610ab4565b90506108f2816114d1565b83838151811061090557610904614127565b5b602002602001018190525050808061091c90613ff1565b9150506108d3565b508092505050919050565b600061093a82610ce3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a290613bad565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ca6118bc565b73ffffffffffffffffffffffffffffffffffffffff1614806109f957506109f8816109f36118bc565b61164a565b5b610a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2f90613a8d565b60405180910390fd5b610a4283836118c4565b505050565b6000600880549050905090565b610a65610a5f6118bc565b8261197d565b610aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9b90613bed565b60405180910390fd5b610aaf838383611a5b565b505050565b6000610abf83610e1b565b8210610b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af79061396d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b616118bc565b73ffffffffffffffffffffffffffffffffffffffff16610b7f61106b565b73ffffffffffffffffffffffffffffffffffffffff1614610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90613b4d565b60405180910390fd5b610bdd611cb7565b565b610bfa8383836040518060200160405280600081525061146f565b505050565b610c10610c0a6118bc565b8261197d565b610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690613c4d565b60405180910390fd5b610c5881611d59565b50565b6000610c65610a47565b8210610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90613c0d565b60405180910390fd5b60088281548110610cba57610cb9614127565b5b90600052602060002001549050919050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8390613acd565b60405180910390fd5b80915050919050565b610d9d6118bc565b73ffffffffffffffffffffffffffffffffffffffff16610dbb61106b565b73ffffffffffffffffffffffffffffffffffffffff1614610e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0890613b4d565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8390613aad565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610edb6118bc565b73ffffffffffffffffffffffffffffffffffffffff16610ef961106b565b73ffffffffffffffffffffffffffffffffffffffff1614610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690613b4d565b60405180910390fd5b610f596000611d65565b565b610f636118bc565b73ffffffffffffffffffffffffffffffffffffffff16610f8161106b565b73ffffffffffffffffffffffffffffffffffffffff1614610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90613b4d565b60405180910390fd5b610fdf611e2b565b565b610fe96118bc565b73ffffffffffffffffffffffffffffffffffffffff1661100761106b565b73ffffffffffffffffffffffffffffffffffffffff161461105d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105490613b4d565b60405180910390fd5b6110678282611ece565b5050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61109d6118bc565b73ffffffffffffffffffffffffffffffffffffffff166110bb61106b565b73ffffffffffffffffffffffffffffffffffffffff1614611111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110890613b4d565b60405180910390fd5b80600e8190555050565b60606001805461112a90613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461115690613f8e565b80156111a35780601f10611178576101008083540402835291602001916111a3565b820191906000526020600020905b81548152906001019060200180831161118657829003601f168201915b5050505050905090565b600e5481565b6111bb6118bc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090613a0d565b60405180910390fd5b80600560006112366118bc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112e36118bc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113289190613910565b60405180910390a35050565b600061133e610a47565b905060068210611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a90613c2d565b60405180910390fd5b81600e546113919190613e4a565b823461139d9190613e4a565b10156113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590613a4d565b60405180910390fd5b600d5482826113ed9190613dc3565b111561142e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142590613bcd565b60405180910390fd5b60005b8281101561146957611443600c611eec565b61145684611451600c611f02565b611ece565b808061146190613ff1565b915050611431565b50505050565b61148061147a6118bc565b8361197d565b6114bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b690613bed565b60405180910390fd5b6114cb84848484611f10565b50505050565b60606114dc82611f6c565b9050919050565b600d5481565b60006114f3610a47565b90506006835110611539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153090613c2d565b60405180910390fd5b8251600e546115489190613e4a565b8351346115559190613e4a565b1015611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90613a4d565b60405180910390fd5b600d548351826115a69190613dc3565b11156115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de90613bcd565b60405180910390fd5b60005b83518110156116445761163184828151811061160957611608614127565b5b602002602001015184838151811061162457611623614127565b5b6020026020010151611ece565b808061163c90613ff1565b9150506115ea565b50505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116e66118bc565b73ffffffffffffffffffffffffffffffffffffffff1661170461106b565b73ffffffffffffffffffffffffffffffffffffffff161461175a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175190613b4d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c1906139ad565b60405180910390fd5b6117d381611d65565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118495750611848826120be565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661193783610ce3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061198882611850565b6119c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119be90613a2d565b60405180910390fd5b60006119d283610ce3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a4157508373ffffffffffffffffffffffffffffffffffffffff16611a29846107ea565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a525750611a51818561164a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a7b82610ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac890613b6d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b38906139ed565b60405180910390fd5b611b4c8383836121a0565b611b576000826118c4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ba79190613ea4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bfe9190613dc3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611cbf610ccc565b611cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf59061394d565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611d426118bc565b604051611d4f9190613887565b60405180910390a1565b611d62816121f8565b50565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e33610ccc565b15611e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6a90613a6d565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611eb76118bc565b604051611ec49190613887565b60405180910390a1565b611ee882826040518060200160405280600081525061224b565b5050565b6001816000016000828254019250508190555050565b600081600001549050919050565b611f1b848484611a5b565b611f27848484846122a6565b611f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5d9061398d565b60405180910390fd5b50505050565b6060611f7782611850565b611fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fad90613b0d565b60405180910390fd5b6000600a60008481526020019081526020016000208054611fd690613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461200290613f8e565b801561204f5780601f106120245761010080835404028352916020019161204f565b820191906000526020600020905b81548152906001019060200180831161203257829003601f168201915b50505050509050600061206061243d565b90506000815114156120765781925050506120b9565b6000825111156120ab578082604051602001612093929190613834565b604051602081830303815290604052925050506120b9565b6120b48461245d565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061218957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612199575061219882612504565b5b9050919050565b6121a8610ccc565b156121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df90613a6d565b60405180910390fd5b6121f383838361256e565b505050565b61220181612682565b6000600a6000838152602001908152602001600020805461222190613f8e565b90501461224857600a600082815260200190815260200160002060006122479190612de0565b5b50565b6122558383612793565b61226260008484846122a6565b6122a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122989061398d565b60405180910390fd5b505050565b60006122c78473ffffffffffffffffffffffffffffffffffffffff16612961565b15612430578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122f06118bc565b8786866040518563ffffffff1660e01b815260040161231294939291906138a2565b602060405180830381600087803b15801561232c57600080fd5b505af192505050801561235d57506040513d601f19601f8201168201806040525081019061235a91906132ba565b60015b6123e0573d806000811461238d576040519150601f19603f3d011682016040523d82523d6000602084013e612392565b606091505b506000815114156123d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cf9061398d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612435565b600190505b949350505050565b606060405180608001604052806051815260200161489660519139905090565b606061246882611850565b6124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249e90613b8d565b60405180910390fd5b60006124b161243d565b905060008151116124d157604051806020016040528060008152506124fc565b806124db84612974565b6040516020016124ec929190613858565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612579838383612ad5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125bc576125b781612ada565b6125fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125fa576125f98382612b23565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561263e5761263981612c90565b61267d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461267c5761267b8282612d61565b5b5b505050565b600061268d82610ce3565b905061269b816000846121a0565b6126a66000836118c4565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126f69190613ea4565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fa90613aed565b60405180910390fd5b61280c81611850565b1561284c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612843906139cd565b60405180910390fd5b612858600083836121a0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a89190613dc3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606060008214156129bc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ad0565b600082905060005b600082146129ee5780806129d790613ff1565b915050600a826129e79190613e19565b91506129c4565b60008167ffffffffffffffff811115612a0a57612a09614156565b5b6040519080825280601f01601f191660200182016040528015612a3c5781602001600182028036833780820191505090505b5090505b60008514612ac957600182612a559190613ea4565b9150600a85612a64919061403a565b6030612a709190613dc3565b60f81b818381518110612a8657612a85614127565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ac29190613e19565b9450612a40565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b3084610e1b565b612b3a9190613ea4565b9050600060076000848152602001908152602001600020549050818114612c1f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ca49190613ea4565b9050600060096000848152602001908152602001600020549050600060088381548110612cd457612cd3614127565b5b906000526020600020015490508060088381548110612cf657612cf5614127565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612d4557612d446140f8565b5b6001900381819060005260206000200160009055905550505050565b6000612d6c83610e1b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b508054612dec90613f8e565b6000825580601f10612dfe5750612e1d565b601f016020900490600052602060002090810190612e1c9190612e20565b5b50565b5b80821115612e39576000816000905550600101612e21565b5090565b6000612e50612e4b84613cad565b613c88565b90508083825260208201905082856020860282011115612e7357612e7261418a565b5b60005b85811015612ea35781612e898882612f5f565b845260208401935060208301925050600181019050612e76565b5050509392505050565b6000612ec0612ebb84613cd9565b613c88565b90508083825260208201905082856020860282011115612ee357612ee261418a565b5b60005b85811015612f135781612ef9888261303d565b845260208401935060208301925050600181019050612ee6565b5050509392505050565b6000612f30612f2b84613d05565b613c88565b905082815260208101848484011115612f4c57612f4b61418f565b5b612f57848285613f4c565b509392505050565b600081359050612f6e81614839565b92915050565b600082601f830112612f8957612f88614185565b5b8135612f99848260208601612e3d565b91505092915050565b600082601f830112612fb757612fb6614185565b5b8135612fc7848260208601612ead565b91505092915050565b600081359050612fdf81614850565b92915050565b600081359050612ff481614867565b92915050565b60008151905061300981614867565b92915050565b600082601f83011261302457613023614185565b5b8135613034848260208601612f1d565b91505092915050565b60008135905061304c8161487e565b92915050565b60006020828403121561306857613067614199565b5b600061307684828501612f5f565b91505092915050565b6000806040838503121561309657613095614199565b5b60006130a485828601612f5f565b92505060206130b585828601612f5f565b9150509250929050565b6000806000606084860312156130d8576130d7614199565b5b60006130e686828701612f5f565b93505060206130f786828701612f5f565b92505060406131088682870161303d565b9150509250925092565b6000806000806080858703121561312c5761312b614199565b5b600061313a87828801612f5f565b945050602061314b87828801612f5f565b935050604061315c8782880161303d565b925050606085013567ffffffffffffffff81111561317d5761317c614194565b5b6131898782880161300f565b91505092959194509250565b600080604083850312156131ac576131ab614199565b5b60006131ba85828601612f5f565b92505060206131cb85828601612fd0565b9150509250929050565b600080604083850312156131ec576131eb614199565b5b60006131fa85828601612f5f565b925050602061320b8582860161303d565b9150509250929050565b6000806040838503121561322c5761322b614199565b5b600083013567ffffffffffffffff81111561324a57613249614194565b5b61325685828601612f74565b925050602083013567ffffffffffffffff81111561327757613276614194565b5b61328385828601612fa2565b9150509250929050565b6000602082840312156132a3576132a2614199565b5b60006132b184828501612fe5565b91505092915050565b6000602082840312156132d0576132cf614199565b5b60006132de84828501612ffa565b91505092915050565b6000602082840312156132fd576132fc614199565b5b600061330b8482850161303d565b91505092915050565b600061332083836133f4565b905092915050565b61333181613ed8565b82525050565b600061334282613d46565b61334c8185613d74565b93508360208202850161335e85613d36565b8060005b8581101561339a578484038952815161337b8582613314565b945061338683613d67565b925060208a01995050600181019050613362565b50829750879550505050505092915050565b6133b581613eea565b82525050565b60006133c682613d51565b6133d08185613d85565b93506133e0818560208601613f5b565b6133e98161419e565b840191505092915050565b60006133ff82613d5c565b6134098185613d96565b9350613419818560208601613f5b565b6134228161419e565b840191505092915050565b600061343882613d5c565b6134428185613da7565b9350613452818560208601613f5b565b61345b8161419e565b840191505092915050565b600061347182613d5c565b61347b8185613db8565b935061348b818560208601613f5b565b80840191505092915050565b60006134a4601483613da7565b91506134af826141af565b602082019050919050565b60006134c7602b83613da7565b91506134d2826141d8565b604082019050919050565b60006134ea603283613da7565b91506134f582614227565b604082019050919050565b600061350d602683613da7565b915061351882614276565b604082019050919050565b6000613530601c83613da7565b915061353b826142c5565b602082019050919050565b6000613553602483613da7565b915061355e826142ee565b604082019050919050565b6000613576601983613da7565b91506135818261433d565b602082019050919050565b6000613599602c83613da7565b91506135a482614366565b604082019050919050565b60006135bc601083613da7565b91506135c7826143b5565b602082019050919050565b60006135df601083613da7565b91506135ea826143de565b602082019050919050565b6000613602603883613da7565b915061360d82614407565b604082019050919050565b6000613625602a83613da7565b915061363082614456565b604082019050919050565b6000613648602983613da7565b9150613653826144a5565b604082019050919050565b600061366b602083613da7565b9150613676826144f4565b602082019050919050565b600061368e603183613da7565b91506136998261451d565b604082019050919050565b60006136b1602c83613da7565b91506136bc8261456c565b604082019050919050565b60006136d4600583613db8565b91506136df826145bb565b600582019050919050565b60006136f7602083613da7565b9150613702826145e4565b602082019050919050565b600061371a602983613da7565b91506137258261460d565b604082019050919050565b600061373d602f83613da7565b91506137488261465c565b604082019050919050565b6000613760602183613da7565b915061376b826146ab565b604082019050919050565b6000613783601683613da7565b915061378e826146fa565b602082019050919050565b60006137a6603183613da7565b91506137b182614723565b604082019050919050565b60006137c9602c83613da7565b91506137d482614772565b604082019050919050565b60006137ec601c83613da7565b91506137f7826147c1565b602082019050919050565b600061380f603083613da7565b915061381a826147ea565b604082019050919050565b61382e81613f42565b82525050565b60006138408285613466565b915061384c8284613466565b91508190509392505050565b60006138648285613466565b91506138708284613466565b915061387b826136c7565b91508190509392505050565b600060208201905061389c6000830184613328565b92915050565b60006080820190506138b76000830187613328565b6138c46020830186613328565b6138d16040830185613825565b81810360608301526138e381846133bb565b905095945050505050565b600060208201905081810360008301526139088184613337565b905092915050565b600060208201905061392560008301846133ac565b92915050565b60006020820190508181036000830152613945818461342d565b905092915050565b6000602082019050818103600083015261396681613497565b9050919050565b60006020820190508181036000830152613986816134ba565b9050919050565b600060208201905081810360008301526139a6816134dd565b9050919050565b600060208201905081810360008301526139c681613500565b9050919050565b600060208201905081810360008301526139e681613523565b9050919050565b60006020820190508181036000830152613a0681613546565b9050919050565b60006020820190508181036000830152613a2681613569565b9050919050565b60006020820190508181036000830152613a468161358c565b9050919050565b60006020820190508181036000830152613a66816135af565b9050919050565b60006020820190508181036000830152613a86816135d2565b9050919050565b60006020820190508181036000830152613aa6816135f5565b9050919050565b60006020820190508181036000830152613ac681613618565b9050919050565b60006020820190508181036000830152613ae68161363b565b9050919050565b60006020820190508181036000830152613b068161365e565b9050919050565b60006020820190508181036000830152613b2681613681565b9050919050565b60006020820190508181036000830152613b46816136a4565b9050919050565b60006020820190508181036000830152613b66816136ea565b9050919050565b60006020820190508181036000830152613b868161370d565b9050919050565b60006020820190508181036000830152613ba681613730565b9050919050565b60006020820190508181036000830152613bc681613753565b9050919050565b60006020820190508181036000830152613be681613776565b9050919050565b60006020820190508181036000830152613c0681613799565b9050919050565b60006020820190508181036000830152613c26816137bc565b9050919050565b60006020820190508181036000830152613c46816137df565b9050919050565b60006020820190508181036000830152613c6681613802565b9050919050565b6000602082019050613c826000830184613825565b92915050565b6000613c92613ca3565b9050613c9e8282613fc0565b919050565b6000604051905090565b600067ffffffffffffffff821115613cc857613cc7614156565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613cf457613cf3614156565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d2057613d1f614156565b5b613d298261419e565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613dce82613f42565b9150613dd983613f42565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e0e57613e0d61406b565b5b828201905092915050565b6000613e2482613f42565b9150613e2f83613f42565b925082613e3f57613e3e61409a565b5b828204905092915050565b6000613e5582613f42565b9150613e6083613f42565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e9957613e9861406b565b5b828202905092915050565b6000613eaf82613f42565b9150613eba83613f42565b925082821015613ecd57613ecc61406b565b5b828203905092915050565b6000613ee382613f22565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f79578082015181840152602081019050613f5e565b83811115613f88576000848401525b50505050565b60006002820490506001821680613fa657607f821691505b60208210811415613fba57613fb96140c9565b5b50919050565b613fc98261419e565b810181811067ffffffffffffffff82111715613fe857613fe7614156565b5b80604052505050565b6000613ffc82613f42565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561402f5761402e61406b565b5b600182019050919050565b600061404582613f42565b915061405083613f42565b9250826140605761405f61409a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f75676820707269636500000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f752063616e206d696e742061206d6178696d756d206f6620313000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b61484281613ed8565b811461484d57600080fd5b50565b61485981613eea565b811461486457600080fd5b50565b61487081613ef6565b811461487b57600080fd5b50565b61488781613f42565b811461489257600080fd5b5056fe68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d66426245765a34565167616a796a5a54746d61516d4531555164394e737a4a6b5456476f564b4e64415778382fa2646970667358221220551098604d8b0b25d9046a92d90556ced305b19a784f63eda3a4160ae91a7bb964736f6c63430008070033
Deployed ByteCode Sourcemap
47646:3269:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50700:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20509:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22074:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48539:398;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21597:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34025:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22964:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33693:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48259:65;;;;;;;;;;;;;:::i;:::-;;23374:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46066:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34215:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42337:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20203:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48429:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19933:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45090:94;;;;;;;;;;;;;:::i;:::-;;48190:61;;;;;;;;;;;;;:::i;:::-;;48943:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44439:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48331:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20678:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47885:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22367:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49591:459;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23630:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50490:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47848:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49098:481;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22733:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45339:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50700:212;50839:4;50868:36;50892:11;50868:23;:36::i;:::-;50861:43;;50700:212;;;:::o;20509:100::-;20563:13;20596:5;20589:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20509:100;:::o;22074:221::-;22150:7;22178:16;22186:7;22178;:16::i;:::-;22170:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22263:15;:24;22279:7;22263:24;;;;;;;;;;;;;;;;;;;;;22256:31;;22074:221;;;:::o;48539:398::-;48611:15;48639:13;48655:23;48672:5;48655:16;:23::i;:::-;48639:39;;48699:20;48735:5;48722:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48699:42;;48759:9;48754:152;48778:5;48774:1;:9;48754:152;;;48805:15;48823:29;48843:5;48850:1;48823:19;:29::i;:::-;48805:47;;48877:17;48886:7;48877:8;:17::i;:::-;48867:4;48872:1;48867:7;;;;;;;;:::i;:::-;;;;;;;:27;;;;48790:116;48785:3;;;;;:::i;:::-;;;;48754:152;;;;48925:4;48918:11;;;;48539:398;;;:::o;21597:411::-;21678:13;21694:23;21709:7;21694:14;:23::i;:::-;21678:39;;21742:5;21736:11;;:2;:11;;;;21728:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21836:5;21820:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;21845:37;21862:5;21869:12;:10;:12::i;:::-;21845:16;:37::i;:::-;21820:62;21798:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;21979:21;21988:2;21992:7;21979:8;:21::i;:::-;21667:341;21597:411;;:::o;34025:113::-;34086:7;34113:10;:17;;;;34106:24;;34025:113;:::o;22964:339::-;23159:41;23178:12;:10;:12::i;:::-;23192:7;23159:18;:41::i;:::-;23151:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23267:28;23277:4;23283:2;23287:7;23267:9;:28::i;:::-;22964:339;;;:::o;33693:256::-;33790:7;33826:23;33843:5;33826:16;:23::i;:::-;33818:5;:31;33810:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33915:12;:19;33928:5;33915:19;;;;;;;;;;;;;;;:26;33935:5;33915:26;;;;;;;;;;;;33908:33;;33693:256;;;;:::o;48259:65::-;44670:12;:10;:12::i;:::-;44659:23;;:7;:5;:7::i;:::-;:23;;;44651:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48306:10:::1;:8;:10::i;:::-;48259:65::o:0;23374:185::-;23512:39;23529:4;23535:2;23539:7;23512:39;;;;;;;;;;;;:16;:39::i;:::-;23374:185;;;:::o;46066:245::-;46184:41;46203:12;:10;:12::i;:::-;46217:7;46184:18;:41::i;:::-;46176:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;46289:14;46295:7;46289:5;:14::i;:::-;46066:245;:::o;34215:233::-;34290:7;34326:30;:28;:30::i;:::-;34318:5;:38;34310:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34423:10;34434:5;34423:17;;;;;;;;:::i;:::-;;;;;;;;;;34416:24;;34215:233;;;:::o;42337:86::-;42384:4;42408:7;;;;;;;;;;;42401:14;;42337:86;:::o;20203:239::-;20275:7;20295:13;20311:7;:16;20319:7;20311:16;;;;;;;;;;;;;;;;;;;;;20295:32;;20363:1;20346:19;;:5;:19;;;;20338:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20429:5;20422:12;;;20203:239;;;:::o;48429:104::-;44670:12;:10;:12::i;:::-;44659:23;;:7;:5;:7::i;:::-;:23;;;44651:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48513:12:::1;48501:9;:24;;;;48429:104:::0;:::o;19933:208::-;20005:7;20050:1;20033:19;;:5;:19;;;;20025:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20117:9;:16;20127:5;20117:16;;;;;;;;;;;;;;;;20110:23;;19933:208;;;:::o;45090:94::-;44670:12;:10;:12::i;:::-;44659:23;;:7;:5;:7::i;:::-;:23;;;44651:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45155:21:::1;45173:1;45155:9;:21::i;:::-;45090:94::o:0;48190:61::-;44670:12;:10;:12::i;:::-;44659:23;;:7;:5;:7::i;:::-;:23;;;44651:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48235:8:::1;:6;:8::i;:::-;48190:61::o:0;48943:139::-;44670:12;:10;:12::i;:::-;44659:23;;:7;:5;:7::i;:::-;:23;;;44651:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49052:22:::1;49062:2;49066:7;49052:9;:22::i;:::-;48943:139:::0;;:::o;44439:87::-;44485:7;44512:6;;;;;;;;;;;44505:13;;44439:87;:::o;48331:88::-;44670:12;:10;:12::i;:::-;44659:23;;:7;:5;:7::i;:::-;:23;;;44651:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48403:8:::1;48395:5;:16;;;;48331:88:::0;:::o;20678:104::-;20734:13;20767:7;20760:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20678:104;:::o;47885:44::-;;;;:::o;22367:295::-;22482:12;:10;:12::i;:::-;22470:24;;:8;:24;;;;22462:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22582:8;22537:18;:32;22556:12;:10;:12::i;:::-;22537:32;;;;;;;;;;;;;;;:42;22570:8;22537:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22635:8;22606:48;;22621:12;:10;:12::i;:::-;22606:48;;;22645:8;22606:48;;;;;;:::i;:::-;;;;;;;;22367:295;;:::o;49591:459::-;49659:14;49676:13;:11;:13::i;:::-;49659:30;;49715:1;49709:3;:7;49700:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;49797:3;49789:5;;:11;;;;:::i;:::-;49782:3;49770:9;:15;;;;:::i;:::-;:30;;49761:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49858:9;;49851:3;49842:6;:12;;;;:::i;:::-;:25;;49833:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49910:9;49906:137;49925:3;49921:1;:7;49906:137;;;49949:27;:15;:25;:27::i;:::-;49991:40;50001:2;50005:25;:15;:23;:25::i;:::-;49991:9;:40::i;:::-;49930:3;;;;;:::i;:::-;;;;49906:137;;;;49648:402;49591:459;;:::o;23630:328::-;23805:41;23824:12;:10;:12::i;:::-;23838:7;23805:18;:41::i;:::-;23797:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23911:39;23925:4;23931:2;23935:7;23944:5;23911:13;:39::i;:::-;23630:328;;;;:::o;50490:196::-;50617:13;50655:23;50670:7;50655:14;:23::i;:::-;50648:30;;50490:196;;;:::o;47848:30::-;;;;:::o;49098:481::-;49188:14;49205:13;:11;:13::i;:::-;49188:30;;49254:1;49242:2;:9;:13;49233:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49346:2;:9;49338:5;;:17;;;;:::i;:::-;49325:2;:9;49313;:21;;;;:::i;:::-;:42;;49304:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49423:9;;49410:2;:9;49401:6;:18;;;;:::i;:::-;:31;;49392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49479:9;49475:97;49494:2;:9;49490:1;:13;49475:97;;;49529:27;49539:2;49542:1;49539:5;;;;;;;;:::i;:::-;;;;;;;;49546:6;49553:1;49546:9;;;;;;;;:::i;:::-;;;;;;;;49529;:27::i;:::-;49505:3;;;;;:::i;:::-;;;;49475:97;;;;49173:406;49098:481;;:::o;22733:164::-;22830:4;22854:18;:25;22873:5;22854:25;;;;;;;;;;;;;;;:35;22880:8;22854:35;;;;;;;;;;;;;;;;;;;;;;;;;22847:42;;22733:164;;;;:::o;45339:192::-;44670:12;:10;:12::i;:::-;44659:23;;:7;:5;:7::i;:::-;:23;;;44651:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45448:1:::1;45428:22;;:8;:22;;;;45420:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45504:19;45514:8;45504:9;:19::i;:::-;45339:192:::0;:::o;33385:224::-;33487:4;33526:35;33511:50;;;:11;:50;;;;:90;;;;33565:36;33589:11;33565:23;:36::i;:::-;33511:90;33504:97;;33385:224;;;:::o;25468:127::-;25533:4;25585:1;25557:30;;:7;:16;25565:7;25557:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25550:37;;25468:127;;;:::o;15270:98::-;15323:7;15350:10;15343:17;;15270:98;:::o;29450:174::-;29552:2;29525:15;:24;29541:7;29525:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29608:7;29604:2;29570:46;;29579:23;29594:7;29579:14;:23::i;:::-;29570:46;;;;;;;;;;;;29450:174;;:::o;25762:348::-;25855:4;25880:16;25888:7;25880;:16::i;:::-;25872:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25956:13;25972:23;25987:7;25972:14;:23::i;:::-;25956:39;;26025:5;26014:16;;:7;:16;;;:51;;;;26058:7;26034:31;;:20;26046:7;26034:11;:20::i;:::-;:31;;;26014:51;:87;;;;26069:32;26086:5;26093:7;26069:16;:32::i;:::-;26014:87;26006:96;;;25762:348;;;;:::o;28754:578::-;28913:4;28886:31;;:23;28901:7;28886:14;:23::i;:::-;:31;;;28878:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;28996:1;28982:16;;:2;:16;;;;28974:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29052:39;29073:4;29079:2;29083:7;29052:20;:39::i;:::-;29156:29;29173:1;29177:7;29156:8;:29::i;:::-;29217:1;29198:9;:15;29208:4;29198:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29246:1;29229:9;:13;29239:2;29229:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29277:2;29258:7;:16;29266:7;29258:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29316:7;29312:2;29297:27;;29306:4;29297:27;;;;;;;;;;;;28754:578;;;:::o;43396:120::-;42940:8;:6;:8::i;:::-;42932:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;43465:5:::1;43455:7;;:15;;;;;;;;;;;;;;;;;;43486:22;43495:12;:10;:12::i;:::-;43486:22;;;;;;:::i;:::-;;;;;;;;43396:120::o:0;50367:115::-;50454:20;50466:7;50454:11;:20::i;:::-;50367:115;:::o;45539:173::-;45595:16;45614:6;;;;;;;;;;;45595:25;;45640:8;45631:6;;:17;;;;;;;;;;;;;;;;;;45695:8;45664:40;;45685:8;45664:40;;;;;;;;;;;;45584:128;45539:173;:::o;43137:118::-;42663:8;:6;:8::i;:::-;42662:9;42654:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;43207:4:::1;43197:7;;:14;;;;;;;;;;;;;;;;;;43227:20;43234:12;:10;:12::i;:::-;43227:20;;;;;;:::i;:::-;;;;;;;;43137:118::o:0;26452:110::-;26528:26;26538:2;26542:7;26528:26;;;;;;;;;;;;:9;:26::i;:::-;26452:110;;:::o;47173:127::-;47280:1;47262:7;:14;;;:19;;;;;;;;;;;47173:127;:::o;47051:114::-;47116:7;47143;:14;;;47136:21;;47051:114;;;:::o;24840:315::-;24997:28;25007:4;25013:2;25017:7;24997:9;:28::i;:::-;25044:48;25067:4;25073:2;25077:7;25086:5;25044:22;:48::i;:::-;25036:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24840:315;;;;:::o;39858:679::-;39931:13;39965:16;39973:7;39965;:16::i;:::-;39957:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;40048:23;40074:10;:19;40085:7;40074:19;;;;;;;;;;;40048:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40104:18;40125:10;:8;:10::i;:::-;40104:31;;40233:1;40217:4;40211:18;:23;40207:72;;;40258:9;40251:16;;;;;;40207:72;40409:1;40389:9;40383:23;:27;40379:108;;;40458:4;40464:9;40441:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40427:48;;;;;;40379:108;40506:23;40521:7;40506:14;:23::i;:::-;40499:30;;;;39858:679;;;;:::o;19564:305::-;19666:4;19718:25;19703:40;;;:11;:40;;;;:105;;;;19775:33;19760:48;;;:11;:48;;;;19703:105;:158;;;;19825:36;19849:11;19825:23;:36::i;:::-;19703:158;19683:178;;19564:305;;;:::o;50062:227::-;42663:8;:6;:8::i;:::-;42662:9;42654:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;50236:45:::1;50263:4;50269:2;50273:7;50236:26;:45::i;:::-;50062:227:::0;;;:::o;41139:206::-;41208:20;41220:7;41208:11;:20::i;:::-;41282:1;41251:10;:19;41262:7;41251:19;;;;;;;;;;;41245:33;;;;;:::i;:::-;;;:38;41241:97;;41307:10;:19;41318:7;41307:19;;;;;;;;;;;;41300:26;;;;:::i;:::-;41241:97;41139:206;:::o;26789:321::-;26919:18;26925:2;26929:7;26919:5;:18::i;:::-;26970:54;27001:1;27005:2;27009:7;27018:5;26970:22;:54::i;:::-;26948:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;26789:321;;;:::o;30189:799::-;30344:4;30365:15;:2;:13;;;:15::i;:::-;30361:620;;;30417:2;30401:36;;;30438:12;:10;:12::i;:::-;30452:4;30458:7;30467:5;30401:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30397:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30660:1;30643:6;:13;:18;30639:272;;;30686:60;;;;;;;;;;:::i;:::-;;;;;;;;30639:272;30861:6;30855:13;30846:6;30842:2;30838:15;30831:38;30397:529;30534:41;;;30524:51;;;:6;:51;;;;30517:58;;;;;30361:620;30965:4;30958:11;;30189:799;;;;;;;:::o;48002:176::-;48054:13;48080:90;;;;;;;;;;;;;;;;;;;48002:176;:::o;20853:340::-;20926:13;20960:16;20968:7;20960;:16::i;:::-;20952:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21041:21;21065:10;:8;:10::i;:::-;21041:34;;21115:1;21097:7;21091:21;:25;:94;;;;;;;;;;;;;;;;;21143:7;21152:18;:7;:16;:18::i;:::-;21126:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21091:94;21084:101;;;20853:340;;;:::o;18171:157::-;18256:4;18295:25;18280:40;;;:11;:40;;;;18273:47;;18171:157;;;:::o;35061:589::-;35205:45;35232:4;35238:2;35242:7;35205:26;:45::i;:::-;35283:1;35267:18;;:4;:18;;;35263:187;;;35302:40;35334:7;35302:31;:40::i;:::-;35263:187;;;35372:2;35364:10;;:4;:10;;;35360:90;;35391:47;35424:4;35430:7;35391:32;:47::i;:::-;35360:90;35263:187;35478:1;35464:16;;:2;:16;;;35460:183;;;35497:45;35534:7;35497:36;:45::i;:::-;35460:183;;;35570:4;35564:10;;:2;:10;;;35560:83;;35591:40;35619:2;35623:7;35591:27;:40::i;:::-;35560:83;35460:183;35061:589;;;:::o;28057:360::-;28117:13;28133:23;28148:7;28133:14;:23::i;:::-;28117:39;;28169:48;28190:5;28205:1;28209:7;28169:20;:48::i;:::-;28258:29;28275:1;28279:7;28258:8;:29::i;:::-;28320:1;28300:9;:16;28310:5;28300:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;28339:7;:16;28347:7;28339:16;;;;;;;;;;;;28332:23;;;;;;;;;;;28401:7;28397:1;28373:36;;28382:5;28373:36;;;;;;;;;;;;28106:311;28057:360;:::o;27446:382::-;27540:1;27526:16;;:2;:16;;;;27518:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27599:16;27607:7;27599;:16::i;:::-;27598:17;27590:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27661:45;27690:1;27694:2;27698:7;27661:20;:45::i;:::-;27736:1;27719:9;:13;27729:2;27719:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27767:2;27748:7;:16;27756:7;27748:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27812:7;27808:2;27787:33;;27804:1;27787:33;;;;;;;;;;;;27446:382;;:::o;7399:387::-;7459:4;7667:12;7734:7;7722:20;7714:28;;7777:1;7770:4;:8;7763:15;;;7399:387;;;:::o;15710:723::-;15766:13;15996:1;15987:5;:10;15983:53;;;16014:10;;;;;;;;;;;;;;;;;;;;;15983:53;16046:12;16061:5;16046:20;;16077:14;16102:78;16117:1;16109:4;:9;16102:78;;16135:8;;;;;:::i;:::-;;;;16166:2;16158:10;;;;;:::i;:::-;;;16102:78;;;16190:19;16222:6;16212:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16190:39;;16240:154;16256:1;16247:5;:10;16240:154;;16284:1;16274:11;;;;;:::i;:::-;;;16351:2;16343:5;:10;;;;:::i;:::-;16330:2;:24;;;;:::i;:::-;16317:39;;16300:6;16307;16300:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16380:2;16371:11;;;;;:::i;:::-;;;16240:154;;;16418:6;16404:21;;;;;15710:723;;;;:::o;31560:126::-;;;;:::o;36373:164::-;36477:10;:17;;;;36450:15;:24;36466:7;36450:24;;;;;;;;;;;:44;;;;36505:10;36521:7;36505:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36373:164;:::o;37164:988::-;37430:22;37480:1;37455:22;37472:4;37455:16;:22::i;:::-;:26;;;;:::i;:::-;37430:51;;37492:18;37513:17;:26;37531:7;37513:26;;;;;;;;;;;;37492:47;;37660:14;37646:10;:28;37642:328;;37691:19;37713:12;:18;37726:4;37713:18;;;;;;;;;;;;;;;:34;37732:14;37713:34;;;;;;;;;;;;37691:56;;37797:11;37764:12;:18;37777:4;37764:18;;;;;;;;;;;;;;;:30;37783:10;37764:30;;;;;;;;;;;:44;;;;37914:10;37881:17;:30;37899:11;37881:30;;;;;;;;;;;:43;;;;37676:294;37642:328;38066:17;:26;38084:7;38066:26;;;;;;;;;;;38059:33;;;38110:12;:18;38123:4;38110:18;;;;;;;;;;;;;;;:34;38129:14;38110:34;;;;;;;;;;;38103:41;;;37245:907;;37164:988;;:::o;38447:1079::-;38700:22;38745:1;38725:10;:17;;;;:21;;;;:::i;:::-;38700:46;;38757:18;38778:15;:24;38794:7;38778:24;;;;;;;;;;;;38757:45;;39129:19;39151:10;39162:14;39151:26;;;;;;;;:::i;:::-;;;;;;;;;;39129:48;;39215:11;39190:10;39201;39190:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39326:10;39295:15;:28;39311:11;39295:28;;;;;;;;;;;:41;;;;39467:15;:24;39483:7;39467:24;;;;;;;;;;;39460:31;;;39502:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38518:1008;;;38447:1079;:::o;35951:221::-;36036:14;36053:20;36070:2;36053:16;:20::i;:::-;36036:37;;36111:7;36084:12;:16;36097:2;36084:16;;;;;;;;;;;;;;;:24;36101:6;36084:24;;;;;;;;;;;:34;;;;36158:6;36129:17;:26;36147:7;36129:26;;;;;;;;;;;:35;;;;36025:147;35951:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:139::-;1959:5;1997:6;1984:20;1975:29;;2013:33;2040:5;2013:33;:::i;:::-;1913:139;;;;:::o;2075:370::-;2146:5;2195:3;2188:4;2180:6;2176:17;2172:27;2162:122;;2203:79;;:::i;:::-;2162:122;2320:6;2307:20;2345:94;2435:3;2427:6;2420:4;2412:6;2408:17;2345:94;:::i;:::-;2336:103;;2152:293;2075:370;;;;:::o;2468:::-;2539:5;2588:3;2581:4;2573:6;2569:17;2565:27;2555:122;;2596:79;;:::i;:::-;2555:122;2713:6;2700:20;2738:94;2828:3;2820:6;2813:4;2805:6;2801:17;2738:94;:::i;:::-;2729:103;;2545:293;2468:370;;;;:::o;2844:133::-;2887:5;2925:6;2912:20;2903:29;;2941:30;2965:5;2941:30;:::i;:::-;2844:133;;;;:::o;2983:137::-;3028:5;3066:6;3053:20;3044:29;;3082:32;3108:5;3082:32;:::i;:::-;2983:137;;;;:::o;3126:141::-;3182:5;3213:6;3207:13;3198:22;;3229:32;3255:5;3229:32;:::i;:::-;3126:141;;;;:::o;3286:338::-;3341:5;3390:3;3383:4;3375:6;3371:17;3367:27;3357:122;;3398:79;;:::i;:::-;3357:122;3515:6;3502:20;3540:78;3614:3;3606:6;3599:4;3591:6;3587:17;3540:78;:::i;:::-;3531:87;;3347:277;3286:338;;;;:::o;3630:139::-;3676:5;3714:6;3701:20;3692:29;;3730:33;3757:5;3730:33;:::i;:::-;3630:139;;;;:::o;3775:329::-;3834:6;3883:2;3871:9;3862:7;3858:23;3854:32;3851:119;;;3889:79;;:::i;:::-;3851:119;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;3775:329;;;;:::o;4110:474::-;4178:6;4186;4235:2;4223:9;4214:7;4210:23;4206:32;4203:119;;;4241:79;;:::i;:::-;4203:119;4361:1;4386:53;4431:7;4422:6;4411:9;4407:22;4386:53;:::i;:::-;4376:63;;4332:117;4488:2;4514:53;4559:7;4550:6;4539:9;4535:22;4514:53;:::i;:::-;4504:63;;4459:118;4110:474;;;;;:::o;4590:619::-;4667:6;4675;4683;4732:2;4720:9;4711:7;4707:23;4703:32;4700:119;;;4738:79;;:::i;:::-;4700:119;4858:1;4883:53;4928:7;4919:6;4908:9;4904:22;4883:53;:::i;:::-;4873:63;;4829:117;4985:2;5011:53;5056:7;5047:6;5036:9;5032:22;5011:53;:::i;:::-;5001:63;;4956:118;5113:2;5139:53;5184:7;5175:6;5164:9;5160:22;5139:53;:::i;:::-;5129:63;;5084:118;4590:619;;;;;:::o;5215:943::-;5310:6;5318;5326;5334;5383:3;5371:9;5362:7;5358:23;5354:33;5351:120;;;5390:79;;:::i;:::-;5351:120;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5921:2;5910:9;5906:18;5893:32;5952:18;5944:6;5941:30;5938:117;;;5974:79;;:::i;:::-;5938:117;6079:62;6133:7;6124:6;6113:9;6109:22;6079:62;:::i;:::-;6069:72;;5864:287;5215:943;;;;;;;:::o;6164:468::-;6229:6;6237;6286:2;6274:9;6265:7;6261:23;6257:32;6254:119;;;6292:79;;:::i;:::-;6254:119;6412:1;6437:53;6482:7;6473:6;6462:9;6458:22;6437:53;:::i;:::-;6427:63;;6383:117;6539:2;6565:50;6607:7;6598:6;6587:9;6583:22;6565:50;:::i;:::-;6555:60;;6510:115;6164:468;;;;;:::o;6638:474::-;6706:6;6714;6763:2;6751:9;6742:7;6738:23;6734:32;6731:119;;;6769:79;;:::i;:::-;6731:119;6889:1;6914:53;6959:7;6950:6;6939:9;6935:22;6914:53;:::i;:::-;6904:63;;6860:117;7016:2;7042:53;7087:7;7078:6;7067:9;7063:22;7042:53;:::i;:::-;7032:63;;6987:118;6638:474;;;;;:::o;7118:894::-;7236:6;7244;7293:2;7281:9;7272:7;7268:23;7264:32;7261:119;;;7299:79;;:::i;:::-;7261:119;7447:1;7436:9;7432:17;7419:31;7477:18;7469:6;7466:30;7463:117;;;7499:79;;:::i;:::-;7463:117;7604:78;7674:7;7665:6;7654:9;7650:22;7604:78;:::i;:::-;7594:88;;7390:302;7759:2;7748:9;7744:18;7731:32;7790:18;7782:6;7779:30;7776:117;;;7812:79;;:::i;:::-;7776:117;7917:78;7987:7;7978:6;7967:9;7963:22;7917:78;:::i;:::-;7907:88;;7702:303;7118:894;;;;;:::o;8018:327::-;8076:6;8125:2;8113:9;8104:7;8100:23;8096:32;8093:119;;;8131:79;;:::i;:::-;8093:119;8251:1;8276:52;8320:7;8311:6;8300:9;8296:22;8276:52;:::i;:::-;8266:62;;8222:116;8018:327;;;;:::o;8351:349::-;8420:6;8469:2;8457:9;8448:7;8444:23;8440:32;8437:119;;;8475:79;;:::i;:::-;8437:119;8595:1;8620:63;8675:7;8666:6;8655:9;8651:22;8620:63;:::i;:::-;8610:73;;8566:127;8351:349;;;;:::o;8706:329::-;8765:6;8814:2;8802:9;8793:7;8789:23;8785:32;8782:119;;;8820:79;;:::i;:::-;8782:119;8940:1;8965:53;9010:7;9001:6;8990:9;8986:22;8965:53;:::i;:::-;8955:63;;8911:117;8706:329;;;;:::o;9041:196::-;9130:10;9165:66;9227:3;9219:6;9165:66;:::i;:::-;9151:80;;9041:196;;;;:::o;9243:118::-;9330:24;9348:5;9330:24;:::i;:::-;9325:3;9318:37;9243:118;;:::o;9395:991::-;9534:3;9563:64;9621:5;9563:64;:::i;:::-;9643:96;9732:6;9727:3;9643:96;:::i;:::-;9636:103;;9765:3;9810:4;9802:6;9798:17;9793:3;9789:27;9840:66;9900:5;9840:66;:::i;:::-;9929:7;9960:1;9945:396;9970:6;9967:1;9964:13;9945:396;;;10041:9;10035:4;10031:20;10026:3;10019:33;10092:6;10086:13;10120:84;10199:4;10184:13;10120:84;:::i;:::-;10112:92;;10227:70;10290:6;10227:70;:::i;:::-;10217:80;;10326:4;10321:3;10317:14;10310:21;;10005:336;9992:1;9989;9985:9;9980:14;;9945:396;;;9949:14;10357:4;10350:11;;10377:3;10370:10;;9539:847;;;;;9395:991;;;;:::o;10392:109::-;10473:21;10488:5;10473:21;:::i;:::-;10468:3;10461:34;10392:109;;:::o;10507:360::-;10593:3;10621:38;10653:5;10621:38;:::i;:::-;10675:70;10738:6;10733:3;10675:70;:::i;:::-;10668:77;;10754:52;10799:6;10794:3;10787:4;10780:5;10776:16;10754:52;:::i;:::-;10831:29;10853:6;10831:29;:::i;:::-;10826:3;10822:39;10815:46;;10597:270;10507:360;;;;:::o;10873:344::-;10951:3;10979:39;11012:5;10979:39;:::i;:::-;11034:61;11088:6;11083:3;11034:61;:::i;:::-;11027:68;;11104:52;11149:6;11144:3;11137:4;11130:5;11126:16;11104:52;:::i;:::-;11181:29;11203:6;11181:29;:::i;:::-;11176:3;11172:39;11165:46;;10955:262;10873:344;;;;:::o;11223:364::-;11311:3;11339:39;11372:5;11339:39;:::i;:::-;11394:71;11458:6;11453:3;11394:71;:::i;:::-;11387:78;;11474:52;11519:6;11514:3;11507:4;11500:5;11496:16;11474:52;:::i;:::-;11551:29;11573:6;11551:29;:::i;:::-;11546:3;11542:39;11535:46;;11315:272;11223:364;;;;:::o;11593:377::-;11699:3;11727:39;11760:5;11727:39;:::i;:::-;11782:89;11864:6;11859:3;11782:89;:::i;:::-;11775:96;;11880:52;11925:6;11920:3;11913:4;11906:5;11902:16;11880:52;:::i;:::-;11957:6;11952:3;11948:16;11941:23;;11703:267;11593:377;;;;:::o;11976:366::-;12118:3;12139:67;12203:2;12198:3;12139:67;:::i;:::-;12132:74;;12215:93;12304:3;12215:93;:::i;:::-;12333:2;12328:3;12324:12;12317:19;;11976:366;;;:::o;12348:::-;12490:3;12511:67;12575:2;12570:3;12511:67;:::i;:::-;12504:74;;12587:93;12676:3;12587:93;:::i;:::-;12705:2;12700:3;12696:12;12689:19;;12348:366;;;:::o;12720:::-;12862:3;12883:67;12947:2;12942:3;12883:67;:::i;:::-;12876:74;;12959:93;13048:3;12959:93;:::i;:::-;13077:2;13072:3;13068:12;13061:19;;12720:366;;;:::o;13092:::-;13234:3;13255:67;13319:2;13314:3;13255:67;:::i;:::-;13248:74;;13331:93;13420:3;13331:93;:::i;:::-;13449:2;13444:3;13440:12;13433:19;;13092:366;;;:::o;13464:::-;13606:3;13627:67;13691:2;13686:3;13627:67;:::i;:::-;13620:74;;13703:93;13792:3;13703:93;:::i;:::-;13821:2;13816:3;13812:12;13805:19;;13464:366;;;:::o;13836:::-;13978:3;13999:67;14063:2;14058:3;13999:67;:::i;:::-;13992:74;;14075:93;14164:3;14075:93;:::i;:::-;14193:2;14188:3;14184:12;14177:19;;13836:366;;;:::o;14208:::-;14350:3;14371:67;14435:2;14430:3;14371:67;:::i;:::-;14364:74;;14447:93;14536:3;14447:93;:::i;:::-;14565:2;14560:3;14556:12;14549:19;;14208:366;;;:::o;14580:::-;14722:3;14743:67;14807:2;14802:3;14743:67;:::i;:::-;14736:74;;14819:93;14908:3;14819:93;:::i;:::-;14937:2;14932:3;14928:12;14921:19;;14580:366;;;:::o;14952:::-;15094:3;15115:67;15179:2;15174:3;15115:67;:::i;:::-;15108:74;;15191:93;15280:3;15191:93;:::i;:::-;15309:2;15304:3;15300:12;15293:19;;14952:366;;;:::o;15324:::-;15466:3;15487:67;15551:2;15546:3;15487:67;:::i;:::-;15480:74;;15563:93;15652:3;15563:93;:::i;:::-;15681:2;15676:3;15672:12;15665:19;;15324:366;;;:::o;15696:::-;15838:3;15859:67;15923:2;15918:3;15859:67;:::i;:::-;15852:74;;15935:93;16024:3;15935:93;:::i;:::-;16053:2;16048:3;16044:12;16037:19;;15696:366;;;:::o;16068:::-;16210:3;16231:67;16295:2;16290:3;16231:67;:::i;:::-;16224:74;;16307:93;16396:3;16307:93;:::i;:::-;16425:2;16420:3;16416:12;16409:19;;16068:366;;;:::o;16440:::-;16582:3;16603:67;16667:2;16662:3;16603:67;:::i;:::-;16596:74;;16679:93;16768:3;16679:93;:::i;:::-;16797:2;16792:3;16788:12;16781:19;;16440:366;;;:::o;16812:::-;16954:3;16975:67;17039:2;17034:3;16975:67;:::i;:::-;16968:74;;17051:93;17140:3;17051:93;:::i;:::-;17169:2;17164:3;17160:12;17153:19;;16812:366;;;:::o;17184:::-;17326:3;17347:67;17411:2;17406:3;17347:67;:::i;:::-;17340:74;;17423:93;17512:3;17423:93;:::i;:::-;17541:2;17536:3;17532:12;17525:19;;17184:366;;;:::o;17556:::-;17698:3;17719:67;17783:2;17778:3;17719:67;:::i;:::-;17712:74;;17795:93;17884:3;17795:93;:::i;:::-;17913:2;17908:3;17904:12;17897:19;;17556:366;;;:::o;17928:400::-;18088:3;18109:84;18191:1;18186:3;18109:84;:::i;:::-;18102:91;;18202:93;18291:3;18202:93;:::i;:::-;18320:1;18315:3;18311:11;18304:18;;17928:400;;;:::o;18334:366::-;18476:3;18497:67;18561:2;18556:3;18497:67;:::i;:::-;18490:74;;18573:93;18662:3;18573:93;:::i;:::-;18691:2;18686:3;18682:12;18675:19;;18334:366;;;:::o;18706:::-;18848:3;18869:67;18933:2;18928:3;18869:67;:::i;:::-;18862:74;;18945:93;19034:3;18945:93;:::i;:::-;19063:2;19058:3;19054:12;19047:19;;18706:366;;;:::o;19078:::-;19220:3;19241:67;19305:2;19300:3;19241:67;:::i;:::-;19234:74;;19317:93;19406:3;19317:93;:::i;:::-;19435:2;19430:3;19426:12;19419:19;;19078:366;;;:::o;19450:::-;19592:3;19613:67;19677:2;19672:3;19613:67;:::i;:::-;19606:74;;19689:93;19778:3;19689:93;:::i;:::-;19807:2;19802:3;19798:12;19791:19;;19450:366;;;:::o;19822:::-;19964:3;19985:67;20049:2;20044:3;19985:67;:::i;:::-;19978:74;;20061:93;20150:3;20061:93;:::i;:::-;20179:2;20174:3;20170:12;20163:19;;19822:366;;;:::o;20194:::-;20336:3;20357:67;20421:2;20416:3;20357:67;:::i;:::-;20350:74;;20433:93;20522:3;20433:93;:::i;:::-;20551:2;20546:3;20542:12;20535:19;;20194:366;;;:::o;20566:::-;20708:3;20729:67;20793:2;20788:3;20729:67;:::i;:::-;20722:74;;20805:93;20894:3;20805:93;:::i;:::-;20923:2;20918:3;20914:12;20907:19;;20566:366;;;:::o;20938:::-;21080:3;21101:67;21165:2;21160:3;21101:67;:::i;:::-;21094:74;;21177:93;21266:3;21177:93;:::i;:::-;21295:2;21290:3;21286:12;21279:19;;20938:366;;;:::o;21310:::-;21452:3;21473:67;21537:2;21532:3;21473:67;:::i;:::-;21466:74;;21549:93;21638:3;21549:93;:::i;:::-;21667:2;21662:3;21658:12;21651:19;;21310:366;;;:::o;21682:118::-;21769:24;21787:5;21769:24;:::i;:::-;21764:3;21757:37;21682:118;;:::o;21806:435::-;21986:3;22008:95;22099:3;22090:6;22008:95;:::i;:::-;22001:102;;22120:95;22211:3;22202:6;22120:95;:::i;:::-;22113:102;;22232:3;22225:10;;21806:435;;;;;:::o;22247:701::-;22528:3;22550:95;22641:3;22632:6;22550:95;:::i;:::-;22543:102;;22662:95;22753:3;22744:6;22662:95;:::i;:::-;22655:102;;22774:148;22918:3;22774:148;:::i;:::-;22767:155;;22939:3;22932:10;;22247:701;;;;;:::o;22954:222::-;23047:4;23085:2;23074:9;23070:18;23062:26;;23098:71;23166:1;23155:9;23151:17;23142:6;23098:71;:::i;:::-;22954:222;;;;:::o;23182:640::-;23377:4;23415:3;23404:9;23400:19;23392:27;;23429:71;23497:1;23486:9;23482:17;23473:6;23429:71;:::i;:::-;23510:72;23578:2;23567:9;23563:18;23554:6;23510:72;:::i;:::-;23592;23660:2;23649:9;23645:18;23636:6;23592:72;:::i;:::-;23711:9;23705:4;23701:20;23696:2;23685:9;23681:18;23674:48;23739:76;23810:4;23801:6;23739:76;:::i;:::-;23731:84;;23182:640;;;;;;;:::o;23828:413::-;23991:4;24029:2;24018:9;24014:18;24006:26;;24078:9;24072:4;24068:20;24064:1;24053:9;24049:17;24042:47;24106:128;24229:4;24220:6;24106:128;:::i;:::-;24098:136;;23828:413;;;;:::o;24247:210::-;24334:4;24372:2;24361:9;24357:18;24349:26;;24385:65;24447:1;24436:9;24432:17;24423:6;24385:65;:::i;:::-;24247:210;;;;:::o;24463:313::-;24576:4;24614:2;24603:9;24599:18;24591:26;;24663:9;24657:4;24653:20;24649:1;24638:9;24634:17;24627:47;24691:78;24764:4;24755:6;24691:78;:::i;:::-;24683:86;;24463:313;;;;:::o;24782:419::-;24948:4;24986:2;24975:9;24971:18;24963:26;;25035:9;25029:4;25025:20;25021:1;25010:9;25006:17;24999:47;25063:131;25189:4;25063:131;:::i;:::-;25055:139;;24782:419;;;:::o;25207:::-;25373:4;25411:2;25400:9;25396:18;25388:26;;25460:9;25454:4;25450:20;25446:1;25435:9;25431:17;25424:47;25488:131;25614:4;25488:131;:::i;:::-;25480:139;;25207:419;;;:::o;25632:::-;25798:4;25836:2;25825:9;25821:18;25813:26;;25885:9;25879:4;25875:20;25871:1;25860:9;25856:17;25849:47;25913:131;26039:4;25913:131;:::i;:::-;25905:139;;25632:419;;;:::o;26057:::-;26223:4;26261:2;26250:9;26246:18;26238:26;;26310:9;26304:4;26300:20;26296:1;26285:9;26281:17;26274:47;26338:131;26464:4;26338:131;:::i;:::-;26330:139;;26057:419;;;:::o;26482:::-;26648:4;26686:2;26675:9;26671:18;26663:26;;26735:9;26729:4;26725:20;26721:1;26710:9;26706:17;26699:47;26763:131;26889:4;26763:131;:::i;:::-;26755:139;;26482:419;;;:::o;26907:::-;27073:4;27111:2;27100:9;27096:18;27088:26;;27160:9;27154:4;27150:20;27146:1;27135:9;27131:17;27124:47;27188:131;27314:4;27188:131;:::i;:::-;27180:139;;26907:419;;;:::o;27332:::-;27498:4;27536:2;27525:9;27521:18;27513:26;;27585:9;27579:4;27575:20;27571:1;27560:9;27556:17;27549:47;27613:131;27739:4;27613:131;:::i;:::-;27605:139;;27332:419;;;:::o;27757:::-;27923:4;27961:2;27950:9;27946:18;27938:26;;28010:9;28004:4;28000:20;27996:1;27985:9;27981:17;27974:47;28038:131;28164:4;28038:131;:::i;:::-;28030:139;;27757:419;;;:::o;28182:::-;28348:4;28386:2;28375:9;28371:18;28363:26;;28435:9;28429:4;28425:20;28421:1;28410:9;28406:17;28399:47;28463:131;28589:4;28463:131;:::i;:::-;28455:139;;28182:419;;;:::o;28607:::-;28773:4;28811:2;28800:9;28796:18;28788:26;;28860:9;28854:4;28850:20;28846:1;28835:9;28831:17;28824:47;28888:131;29014:4;28888:131;:::i;:::-;28880:139;;28607:419;;;:::o;29032:::-;29198:4;29236:2;29225:9;29221:18;29213:26;;29285:9;29279:4;29275:20;29271:1;29260:9;29256:17;29249:47;29313:131;29439:4;29313:131;:::i;:::-;29305:139;;29032:419;;;:::o;29457:::-;29623:4;29661:2;29650:9;29646:18;29638:26;;29710:9;29704:4;29700:20;29696:1;29685:9;29681:17;29674:47;29738:131;29864:4;29738:131;:::i;:::-;29730:139;;29457:419;;;:::o;29882:::-;30048:4;30086:2;30075:9;30071:18;30063:26;;30135:9;30129:4;30125:20;30121:1;30110:9;30106:17;30099:47;30163:131;30289:4;30163:131;:::i;:::-;30155:139;;29882:419;;;:::o;30307:::-;30473:4;30511:2;30500:9;30496:18;30488:26;;30560:9;30554:4;30550:20;30546:1;30535:9;30531:17;30524:47;30588:131;30714:4;30588:131;:::i;:::-;30580:139;;30307:419;;;:::o;30732:::-;30898:4;30936:2;30925:9;30921:18;30913:26;;30985:9;30979:4;30975:20;30971:1;30960:9;30956:17;30949:47;31013:131;31139:4;31013:131;:::i;:::-;31005:139;;30732:419;;;:::o;31157:::-;31323:4;31361:2;31350:9;31346:18;31338:26;;31410:9;31404:4;31400:20;31396:1;31385:9;31381:17;31374:47;31438:131;31564:4;31438:131;:::i;:::-;31430:139;;31157:419;;;:::o;31582:::-;31748:4;31786:2;31775:9;31771:18;31763:26;;31835:9;31829:4;31825:20;31821:1;31810:9;31806:17;31799:47;31863:131;31989:4;31863:131;:::i;:::-;31855:139;;31582:419;;;:::o;32007:::-;32173:4;32211:2;32200:9;32196:18;32188:26;;32260:9;32254:4;32250:20;32246:1;32235:9;32231:17;32224:47;32288:131;32414:4;32288:131;:::i;:::-;32280:139;;32007:419;;;:::o;32432:::-;32598:4;32636:2;32625:9;32621:18;32613:26;;32685:9;32679:4;32675:20;32671:1;32660:9;32656:17;32649:47;32713:131;32839:4;32713:131;:::i;:::-;32705:139;;32432:419;;;:::o;32857:::-;33023:4;33061:2;33050:9;33046:18;33038:26;;33110:9;33104:4;33100:20;33096:1;33085:9;33081:17;33074:47;33138:131;33264:4;33138:131;:::i;:::-;33130:139;;32857:419;;;:::o;33282:::-;33448:4;33486:2;33475:9;33471:18;33463:26;;33535:9;33529:4;33525:20;33521:1;33510:9;33506:17;33499:47;33563:131;33689:4;33563:131;:::i;:::-;33555:139;;33282:419;;;:::o;33707:::-;33873:4;33911:2;33900:9;33896:18;33888:26;;33960:9;33954:4;33950:20;33946:1;33935:9;33931:17;33924:47;33988:131;34114:4;33988:131;:::i;:::-;33980:139;;33707:419;;;:::o;34132:::-;34298:4;34336:2;34325:9;34321:18;34313:26;;34385:9;34379:4;34375:20;34371:1;34360:9;34356:17;34349:47;34413:131;34539:4;34413:131;:::i;:::-;34405:139;;34132:419;;;:::o;34557:::-;34723:4;34761:2;34750:9;34746:18;34738:26;;34810:9;34804:4;34800:20;34796:1;34785:9;34781:17;34774:47;34838:131;34964:4;34838:131;:::i;:::-;34830:139;;34557:419;;;:::o;34982:::-;35148:4;35186:2;35175:9;35171:18;35163:26;;35235:9;35229:4;35225:20;35221:1;35210:9;35206:17;35199:47;35263:131;35389:4;35263:131;:::i;:::-;35255:139;;34982:419;;;:::o;35407:222::-;35500:4;35538:2;35527:9;35523:18;35515:26;;35551:71;35619:1;35608:9;35604:17;35595:6;35551:71;:::i;:::-;35407:222;;;;:::o;35635:129::-;35669:6;35696:20;;:::i;:::-;35686:30;;35725:33;35753:4;35745:6;35725:33;:::i;:::-;35635:129;;;:::o;35770:75::-;35803:6;35836:2;35830:9;35820:19;;35770:75;:::o;35851:311::-;35928:4;36018:18;36010:6;36007:30;36004:56;;;36040:18;;:::i;:::-;36004:56;36090:4;36082:6;36078:17;36070:25;;36150:4;36144;36140:15;36132:23;;35851:311;;;:::o;36168:::-;36245:4;36335:18;36327:6;36324:30;36321:56;;;36357:18;;:::i;:::-;36321:56;36407:4;36399:6;36395:17;36387:25;;36467:4;36461;36457:15;36449:23;;36168:311;;;:::o;36485:307::-;36546:4;36636:18;36628:6;36625:30;36622:56;;;36658:18;;:::i;:::-;36622:56;36696:29;36718:6;36696:29;:::i;:::-;36688:37;;36780:4;36774;36770:15;36762:23;;36485:307;;;:::o;36798:142::-;36875:4;36898:3;36890:11;;36928:4;36923:3;36919:14;36911:22;;36798:142;;;:::o;36946:124::-;37023:6;37057:5;37051:12;37041:22;;36946:124;;;:::o;37076:98::-;37127:6;37161:5;37155:12;37145:22;;37076:98;;;:::o;37180:99::-;37232:6;37266:5;37260:12;37250:22;;37180:99;;;:::o;37285:123::-;37365:4;37397;37392:3;37388:14;37380:22;;37285:123;;;:::o;37414:194::-;37523:11;37557:6;37552:3;37545:19;37597:4;37592:3;37588:14;37573:29;;37414:194;;;;:::o;37614:168::-;37697:11;37731:6;37726:3;37719:19;37771:4;37766:3;37762:14;37747:29;;37614:168;;;;:::o;37788:159::-;37862:11;37896:6;37891:3;37884:19;37936:4;37931:3;37927:14;37912:29;;37788:159;;;;:::o;37953:169::-;38037:11;38071:6;38066:3;38059:19;38111:4;38106:3;38102:14;38087:29;;37953:169;;;;:::o;38128:148::-;38230:11;38267:3;38252:18;;38128:148;;;;:::o;38282:305::-;38322:3;38341:20;38359:1;38341:20;:::i;:::-;38336:25;;38375:20;38393:1;38375:20;:::i;:::-;38370:25;;38529:1;38461:66;38457:74;38454:1;38451:81;38448:107;;;38535:18;;:::i;:::-;38448:107;38579:1;38576;38572:9;38565:16;;38282:305;;;;:::o;38593:185::-;38633:1;38650:20;38668:1;38650:20;:::i;:::-;38645:25;;38684:20;38702:1;38684:20;:::i;:::-;38679:25;;38723:1;38713:35;;38728:18;;:::i;:::-;38713:35;38770:1;38767;38763:9;38758:14;;38593:185;;;;:::o;38784:348::-;38824:7;38847:20;38865:1;38847:20;:::i;:::-;38842:25;;38881:20;38899:1;38881:20;:::i;:::-;38876:25;;39069:1;39001:66;38997:74;38994:1;38991:81;38986:1;38979:9;38972:17;38968:105;38965:131;;;39076:18;;:::i;:::-;38965:131;39124:1;39121;39117:9;39106:20;;38784:348;;;;:::o;39138:191::-;39178:4;39198:20;39216:1;39198:20;:::i;:::-;39193:25;;39232:20;39250:1;39232:20;:::i;:::-;39227:25;;39271:1;39268;39265:8;39262:34;;;39276:18;;:::i;:::-;39262:34;39321:1;39318;39314:9;39306:17;;39138:191;;;;:::o;39335:96::-;39372:7;39401:24;39419:5;39401:24;:::i;:::-;39390:35;;39335:96;;;:::o;39437:90::-;39471:7;39514:5;39507:13;39500:21;39489:32;;39437:90;;;:::o;39533:149::-;39569:7;39609:66;39602:5;39598:78;39587:89;;39533:149;;;:::o;39688:126::-;39725:7;39765:42;39758:5;39754:54;39743:65;;39688:126;;;:::o;39820:77::-;39857:7;39886:5;39875:16;;39820:77;;;:::o;39903:154::-;39987:6;39982:3;39977;39964:30;40049:1;40040:6;40035:3;40031:16;40024:27;39903:154;;;:::o;40063:307::-;40131:1;40141:113;40155:6;40152:1;40149:13;40141:113;;;40240:1;40235:3;40231:11;40225:18;40221:1;40216:3;40212:11;40205:39;40177:2;40174:1;40170:10;40165:15;;40141:113;;;40272:6;40269:1;40266:13;40263:101;;;40352:1;40343:6;40338:3;40334:16;40327:27;40263:101;40112:258;40063:307;;;:::o;40376:320::-;40420:6;40457:1;40451:4;40447:12;40437:22;;40504:1;40498:4;40494:12;40525:18;40515:81;;40581:4;40573:6;40569:17;40559:27;;40515:81;40643:2;40635:6;40632:14;40612:18;40609:38;40606:84;;;40662:18;;:::i;:::-;40606:84;40427:269;40376:320;;;:::o;40702:281::-;40785:27;40807:4;40785:27;:::i;:::-;40777:6;40773:40;40915:6;40903:10;40900:22;40879:18;40867:10;40864:34;40861:62;40858:88;;;40926:18;;:::i;:::-;40858:88;40966:10;40962:2;40955:22;40745:238;40702:281;;:::o;40989:233::-;41028:3;41051:24;41069:5;41051:24;:::i;:::-;41042:33;;41097:66;41090:5;41087:77;41084:103;;;41167:18;;:::i;:::-;41084:103;41214:1;41207:5;41203:13;41196:20;;40989:233;;;:::o;41228:176::-;41260:1;41277:20;41295:1;41277:20;:::i;:::-;41272:25;;41311:20;41329:1;41311:20;:::i;:::-;41306:25;;41350:1;41340:35;;41355:18;;:::i;:::-;41340:35;41396:1;41393;41389:9;41384:14;;41228:176;;;;:::o;41410:180::-;41458:77;41455:1;41448:88;41555:4;41552:1;41545:15;41579:4;41576:1;41569:15;41596:180;41644:77;41641:1;41634:88;41741:4;41738:1;41731:15;41765:4;41762:1;41755:15;41782:180;41830:77;41827:1;41820:88;41927:4;41924:1;41917:15;41951:4;41948:1;41941:15;41968:180;42016:77;42013:1;42006:88;42113:4;42110:1;42103:15;42137:4;42134:1;42127:15;42154:180;42202:77;42199:1;42192:88;42299:4;42296:1;42289:15;42323:4;42320:1;42313:15;42340:180;42388:77;42385:1;42378:88;42485:4;42482:1;42475:15;42509:4;42506:1;42499:15;42526:117;42635:1;42632;42625:12;42649:117;42758:1;42755;42748:12;42772:117;42881:1;42878;42871:12;42895:117;43004:1;43001;42994:12;43018:117;43127:1;43124;43117:12;43141:102;43182:6;43233:2;43229:7;43224:2;43217:5;43213:14;43209:28;43199:38;;43141:102;;;:::o;43249:170::-;43389:22;43385:1;43377:6;43373:14;43366:46;43249:170;:::o;43425:230::-;43565:34;43561:1;43553:6;43549:14;43542:58;43634:13;43629:2;43621:6;43617:15;43610:38;43425:230;:::o;43661:237::-;43801:34;43797:1;43789:6;43785:14;43778:58;43870:20;43865:2;43857:6;43853:15;43846:45;43661:237;:::o;43904:225::-;44044:34;44040:1;44032:6;44028:14;44021:58;44113:8;44108:2;44100:6;44096:15;44089:33;43904:225;:::o;44135:178::-;44275:30;44271:1;44263:6;44259:14;44252:54;44135:178;:::o;44319:223::-;44459:34;44455:1;44447:6;44443:14;44436:58;44528:6;44523:2;44515:6;44511:15;44504:31;44319:223;:::o;44548:175::-;44688:27;44684:1;44676:6;44672:14;44665:51;44548:175;:::o;44729:231::-;44869:34;44865:1;44857:6;44853:14;44846:58;44938:14;44933:2;44925:6;44921:15;44914:39;44729:231;:::o;44966:166::-;45106:18;45102:1;45094:6;45090:14;45083:42;44966:166;:::o;45138:::-;45278:18;45274:1;45266:6;45262:14;45255:42;45138:166;:::o;45310:243::-;45450:34;45446:1;45438:6;45434:14;45427:58;45519:26;45514:2;45506:6;45502:15;45495:51;45310:243;:::o;45559:229::-;45699:34;45695:1;45687:6;45683:14;45676:58;45768:12;45763:2;45755:6;45751:15;45744:37;45559:229;:::o;45794:228::-;45934:34;45930:1;45922:6;45918:14;45911:58;46003:11;45998:2;45990:6;45986:15;45979:36;45794:228;:::o;46028:182::-;46168:34;46164:1;46156:6;46152:14;46145:58;46028:182;:::o;46216:236::-;46356:34;46352:1;46344:6;46340:14;46333:58;46425:19;46420:2;46412:6;46408:15;46401:44;46216:236;:::o;46458:231::-;46598:34;46594:1;46586:6;46582:14;46575:58;46667:14;46662:2;46654:6;46650:15;46643:39;46458:231;:::o;46695:155::-;46835:7;46831:1;46823:6;46819:14;46812:31;46695:155;:::o;46856:182::-;46996:34;46992:1;46984:6;46980:14;46973:58;46856:182;:::o;47044:228::-;47184:34;47180:1;47172:6;47168:14;47161:58;47253:11;47248:2;47240:6;47236:15;47229:36;47044:228;:::o;47278:234::-;47418:34;47414:1;47406:6;47402:14;47395:58;47487:17;47482:2;47474:6;47470:15;47463:42;47278:234;:::o;47518:220::-;47658:34;47654:1;47646:6;47642:14;47635:58;47727:3;47722:2;47714:6;47710:15;47703:28;47518:220;:::o;47744:172::-;47884:24;47880:1;47872:6;47868:14;47861:48;47744:172;:::o;47922:236::-;48062:34;48058:1;48050:6;48046:14;48039:58;48131:19;48126:2;48118:6;48114:15;48107:44;47922:236;:::o;48164:231::-;48304:34;48300:1;48292:6;48288:14;48281:58;48373:14;48368:2;48360:6;48356:15;48349:39;48164:231;:::o;48401:178::-;48541:30;48537:1;48529:6;48525:14;48518:54;48401:178;:::o;48585:235::-;48725:34;48721:1;48713:6;48709:14;48702:58;48794:18;48789:2;48781:6;48777:15;48770:43;48585:235;:::o;48826:122::-;48899:24;48917:5;48899:24;:::i;:::-;48892:5;48889:35;48879:63;;48938:1;48935;48928:12;48879:63;48826:122;:::o;48954:116::-;49024:21;49039:5;49024:21;:::i;:::-;49017:5;49014:32;49004:60;;49060:1;49057;49050:12;49004:60;48954:116;:::o;49076:120::-;49148:23;49165:5;49148:23;:::i;:::-;49141:5;49138:34;49128:62;;49186:1;49183;49176:12;49128:62;49076:120;:::o;49202:122::-;49275:24;49293:5;49275:24;:::i;:::-;49268:5;49265:35;49255:63;;49314:1;49311;49304:12;49255:63;49202:122;:::o
Swarm Source
ipfs://551098604d8b0b25d9046a92d90556ced305b19a784f63eda3a4160ae91a7bb9