Contract Overview
Balance:
0 FTM
My Name Tag:
Not Available
TokenTracker:
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x04755c410d5543b315ff634371c196697dccc97d1a6dbbbe586b690aaef0ebab | 8752539 | 337 days 18 hrs ago | 0x8bbbd749c1c71ad2ff4f4a3cf90bb0865054c8e2 | Contract Creation | 0 FTM |
[ Download CSV Export ]
Contract Name:
FemaleMock
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2022-04-22 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @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(); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @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]; } } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @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()); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @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); } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: contracts/mocks/ERC721Minter.sol pragma solidity ^0.8.4; contract ERC721Minter is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, AccessControl, ERC721Burnable { using Counters for Counters.Counter; bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); Counters.Counter private _tokenIdCounter; constructor(string memory name, string memory symbol) ERC721(name, symbol) { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(PAUSER_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); } function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } function safeMint(address to, string memory uri) public onlyRole(MINTER_ROLE) { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) whenNotPaused { 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, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } } // File: contracts/interfaces/IWoolf.sol pragma solidity ^0.8.0; // Reference to external contract interface IWoolf is IERC721 { // struct to store each token's traits struct SheepWolf { bool isSheep; uint8 fur; uint8 head; uint8 ears; uint8 eyes; uint8 nose; uint8 mouth; uint8 neck; uint8 feet; uint8 alphaIndex; } function getPaidTokens() external view returns (uint256); function getTokenTraits(uint256 tokenId) external view returns (SheepWolf memory); } // File: @openzeppelin/contracts/utils/Base64.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } } // File: contracts/utils/Creatures.sol pragma solidity ^0.8.0; library Creatures { function createURIFrom( string[12] memory creatureAttributes, string[12] memory creatureImages, uint256 tokenId ) internal pure returns (string memory) { string memory attrJson; string memory attrSvg; (attrJson, attrSvg) = _jsonSvgFrom(creatureAttributes, creatureImages); return string( abi.encodePacked( "data:application/json;base64,", Base64.encode( abi.encodePacked( "{", '"name" : "', creatureAttributes[2], " ", creatureAttributes[1], " #", Strings.toString(tokenId), '",', '"description" : ' '"Fantom Wolf Game Revival",', '"image" : "', attrSvg, '","attributes" : ', attrJson, "}" ) ) ) ); } function traitNames() internal pure returns (string[12] memory) { string[12] memory names = [ "Gender", "Class", "Age", "Fur", "Head", "Ears", "Eyes", "Nose", "Mouth", "Neck", "Feet", "Alpha" ]; return names; } function _jsonSvgFrom( string[12] memory creatureAttributes, string[12] memory creatureImages ) private pure returns (string memory, string memory) { string memory json = string(abi.encodePacked("[")); string memory svg = string( abi.encodePacked( '<svg width="100%" height="100%" version="1.1" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">' ) ); for (uint8 i = 0; i < 12; i++) { json = string( abi.encodePacked( json, _jsonFor(_nameFor(i), creatureAttributes[i]), i < 12 - 1 ? "," : "]" ) ); if ( keccak256(abi.encodePacked(creatureImages[i])) != _emptyString() ) { svg = string(abi.encodePacked(svg, _tagFor(creatureImages[i]))); } } svg = string( abi.encodePacked( "data:image/svg+xml;base64,", Base64.encode(abi.encodePacked(svg, "</svg>")) ) ); return (json, svg); } function _jsonFor(string memory trait, string memory value) private pure returns (string memory) { return string( abi.encodePacked( '{ "trait_type" : "', trait, '", "value" : "', value, '" }' ) ); } function _nameFor(uint8 trait) private pure returns (string memory) { return traitNames()[trait]; } function _tagFor(string memory image) private pure returns (string memory) { return string( abi.encodePacked( '<image x="4" y="4" width="32" height="32" image-rendering="pixelated" preserveAspectRatio="xMidYMid" xlink:href="data:image/png;base64,', image, '"/>' ) ); } function _emptyString() private pure returns (bytes32) { string memory empty = ""; return keccak256(abi.encodePacked(empty)); } } // File: contracts/mocks/MaleMock.sol pragma solidity ^0.8.0; contract MaleMock is IWoolf, ERC721Minter { mapping(uint256 => SheepWolf) _tokenTraits; mapping(string => mapping(string => uint8)) _sheepTraitNames; mapping(string => mapping(string => string)) _sheepTraitImages; mapping(string => mapping(string => uint8)) _wolfTraitNames; mapping(string => mapping(string => string)) _wolfTraitImages; constructor(string memory name, string memory symbol) ERC721Minter(name, symbol) {} function getPaidTokens() external pure override(IWoolf) returns (uint256) { return 0; } function getImageFor( bool sheep, string memory trait, string memory name ) external view returns (string memory) { if (sheep) { return _sheepTraitImages[trait][name]; } else { return _wolfTraitImages[trait][name]; } } function getValueFor( bool sheep, string memory trait, string memory name ) external view returns (uint256) { if (sheep) { return _sheepTraitNames[trait][name]; } else { return _wolfTraitNames[trait][name]; } } function setTrait( bool sheep, string memory trait, string[] memory names, string[] memory images ) external { for (uint8 i = 0; i < names.length; i++) { if (sheep) { _sheepTraitNames[trait][names[i]] = i; _sheepTraitImages[trait][names[i]] = images[i]; } else { _wolfTraitNames[trait][names[i]] = i; _wolfTraitImages[trait][names[i]] = images[i]; } } } function getTokenTraits(uint256 tokenId) external view returns (SheepWolf memory) { return _tokenTraits[tokenId]; } function setTokenTraits( uint256 tokenId, bool sheep, uint8[9] memory traitsArray ) external { _tokenTraits[tokenId] = _tokenTraitsFrom(sheep, traitsArray); } function setTokenTraits( uint256 tokenId, bool sheep, bool male, string[9] memory traitsArray ) external { _tokenTraits[tokenId] = _tokenTraitsFrom(sheep, traitsArray); string[12] memory attributes; attributes[0] = male ? "Male" : "Female"; attributes[1] = sheep ? "Sheep" : "Wolf"; attributes[2] = "Adult"; for (uint256 i = 0; i < 9; i++) { attributes[i + 3] = traitsArray[i]; } string[12] memory images = _imagesFor(sheep, attributes); _setTokenURI( tokenId, Creatures.createURIFrom(attributes, images, tokenId) ); } function _imagesFor(bool sheep, string[12] memory traits) private view returns (string[12] memory) { string[12] memory images; for (uint256 i = 0; i < 12; i++) { images[i] = sheep ? _sheepTraitImages[Creatures.traitNames()[i]][traits[i]] : _wolfTraitImages[Creatures.traitNames()[i]][traits[i]]; } return images; } function _tokenTraitsFrom(bool sheep, string[9] memory traitsArray) private view returns (SheepWolf memory) { SheepWolf memory sheepWolf; sheepWolf.isSheep = sheep; sheepWolf.fur = sheep ? _sheepTraitNames["Fur"][traitsArray[0]] : _wolfTraitNames["Fur"][traitsArray[0]]; sheepWolf.head = sheep ? _sheepTraitNames["Head"][traitsArray[1]] : _wolfTraitNames["Head"][traitsArray[1]]; sheepWolf.ears = sheep ? _sheepTraitNames["Ears"][traitsArray[2]] : _wolfTraitNames["Ears"][traitsArray[2]]; sheepWolf.eyes = sheep ? _sheepTraitNames["Eyes"][traitsArray[3]] : _wolfTraitNames["Eyes"][traitsArray[3]]; sheepWolf.nose = sheep ? _sheepTraitNames["Nose"][traitsArray[4]] : _wolfTraitNames["Nose"][traitsArray[4]]; sheepWolf.mouth = sheep ? _sheepTraitNames["Mouth"][traitsArray[5]] : _wolfTraitNames["Mouth"][traitsArray[5]]; sheepWolf.neck = sheep ? _sheepTraitNames["Neck"][traitsArray[6]] : _wolfTraitNames["Neck"][traitsArray[6]]; sheepWolf.feet = sheep ? _sheepTraitNames["Feet"][traitsArray[7]] : _wolfTraitNames["Feet"][traitsArray[7]]; sheepWolf.alphaIndex = sheep ? _sheepTraitNames["Alpha"][traitsArray[8]] : _wolfTraitNames["Alpha"][traitsArray[8]]; return sheepWolf; } function _tokenTraitsFrom(bool sheep, uint8[9] memory traitsArray) private pure returns (SheepWolf memory) { SheepWolf memory sheepWolf; sheepWolf.isSheep = sheep; sheepWolf.fur = traitsArray[0]; sheepWolf.head = traitsArray[1]; sheepWolf.ears = traitsArray[2]; sheepWolf.eyes = traitsArray[3]; sheepWolf.nose = traitsArray[4]; sheepWolf.mouth = traitsArray[5]; sheepWolf.neck = traitsArray[6]; sheepWolf.feet = traitsArray[7]; sheepWolf.alphaIndex = traitsArray[8]; return sheepWolf; } } // File: contracts/mocks/FemaleMock.sol pragma solidity ^0.8.0; contract FemaleMock is MaleMock { constructor() MaleMock("Female Mock", "FEMALE") {} }
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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"sheep","type":"bool"},{"internalType":"string","name":"trait","type":"string"},{"internalType":"string","name":"name","type":"string"}],"name":"getImageFor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaidTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTraits","outputs":[{"components":[{"internalType":"bool","name":"isSheep","type":"bool"},{"internalType":"uint8","name":"fur","type":"uint8"},{"internalType":"uint8","name":"head","type":"uint8"},{"internalType":"uint8","name":"ears","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"nose","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"neck","type":"uint8"},{"internalType":"uint8","name":"feet","type":"uint8"},{"internalType":"uint8","name":"alphaIndex","type":"uint8"}],"internalType":"struct IWoolf.SheepWolf","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"sheep","type":"bool"},{"internalType":"string","name":"trait","type":"string"},{"internalType":"string","name":"name","type":"string"}],"name":"getValueFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","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":"tokenId","type":"uint256"},{"internalType":"bool","name":"sheep","type":"bool"},{"internalType":"uint8[9]","name":"traitsArray","type":"uint8[9]"}],"name":"setTokenTraits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"sheep","type":"bool"},{"internalType":"bool","name":"male","type":"bool"},{"internalType":"string[9]","name":"traitsArray","type":"string[9]"}],"name":"setTokenTraits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"sheep","type":"bool"},{"internalType":"string","name":"trait","type":"string"},{"internalType":"string[]","name":"names","type":"string[]"},{"internalType":"string[]","name":"images","type":"string[]"}],"name":"setTrait","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600b81526020016a46656d616c65204d6f636b60a81b8152506040518060400160405280600681526020016546454d414c4560d01b81525081818181816000908051906020019062000071929190620001a8565b50805162000087906001906020840190620001a8565b5050600b805460ff1916905550620000a160003362000103565b620000cd7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a3362000103565b620000f97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63362000103565b505050506200028b565b6000828152600c602090815260408083206001600160a01b038516845290915290205460ff16620001a4576000828152600c602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620001633390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b828054620001b6906200024e565b90600052602060002090601f016020900481019282620001da576000855562000225565b82601f10620001f557805160ff191683800117855562000225565b8280016001018555821562000225579182015b828111156200022557825182559160200191906001019062000208565b506200023392915062000237565b5090565b5b8082111562000233576000815560010162000238565b600181811c908216806200026357607f821691505b602082108114156200028557634e487b7160e01b600052602260045260246000fd5b50919050565b61454c806200029b6000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c806370a0823111610125578063b88d4fde116100ad578063d2cbfab91161007c578063d2cbfab91461047b578063d53913931461048e578063d547741f146104b5578063e63ab1e9146104c8578063e985e9c5146104ef57600080fd5b8063b88d4fde1461042f578063c87b56dd14610442578063ca70017614610455578063d204c45e1461046857600080fd5b806394e56847116100f457806394e56847146103d957806395d89b41146103f9578063a217fddf14610401578063a22cb46514610409578063a511fdde1461041c57600080fd5b806370a08231146103985780637627d07b146103ab5780638456cb59146103be57806391d14854146103c657600080fd5b806336568abe116101a857806342966c681161017757806342966c68146103415780634e493b9e146103545780634f6ccce7146103675780635c975abb1461037a5780636352211e1461038557600080fd5b806336568abe1461030c5780633f4ba83a1461031f5780634018b1f81461032757806342842e0e1461032e57600080fd5b806318160ddd116101ef57806318160ddd1461029e57806323b872dd146102b0578063248a9ca3146102c35780632f2ff15d146102e65780632f745c59146102f957600080fd5b806301ffc9a71461022157806306fdde0314610249578063081812fc1461025e578063095ea7b314610289575b600080fd5b61023461022f36600461370c565b61052b565b60405190151581526020015b60405180910390f35b61025161053c565b6040516102409190613781565b61027161026c366004613794565b6105ce565b6040516001600160a01b039091168152602001610240565b61029c6102973660046137c9565b61065b565b005b6008545b604051908152602001610240565b61029c6102be3660046137f3565b610771565b6102a26102d1366004613794565b6000908152600c602052604090206001015490565b61029c6102f436600461382f565b6107a3565b6102a26103073660046137c9565b6107c9565b61029c61031a36600461382f565b61085f565b61029c6108dd565b60006102a2565b61029c61033c3660046137f3565b610913565b61029c61034f366004613794565b61092e565b610251610362366004613954565b6109a5565b6102a2610375366004613794565b610a8e565b600b5460ff16610234565b610271610393366004613794565b610b21565b6102a26103a63660046139c8565b610b98565b61029c6103b93660046139e3565b610c1f565b61029c610d8f565b6102346103d436600461382f565b610dc2565b6103ec6103e7366004613794565b610ded565b6040516102409190613a71565b610251610eaa565b6102a2600081565b61029c610417366004613b35565b610eb9565b61029c61042a366004613bfe565b610ec4565b61029c61043d366004613c97565b6110d6565b610251610450366004613794565b61110e565b6102a2610463366004613954565b611119565b61029c610476366004613d07565b611177565b61029c610489366004613d55565b6111d1565b6102a27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61029c6104c336600461382f565b611449565b6102a27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6102346104fd366004613e1d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b60006105368261146f565b92915050565b60606000805461054b90613e47565b80601f016020809104026020016040519081016040528092919081815260200182805461057790613e47565b80156105c45780601f10610599576101008083540402835291602001916105c4565b820191906000526020600020905b8154815290600101906020018083116105a757829003601f168201915b5050505050905090565b60006105d982611494565b61063f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061066682610b21565b9050806001600160a01b0316836001600160a01b031614156106d45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610636565b336001600160a01b03821614806106f057506106f081336104fd565b6107625760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610636565b61076c83836114b1565b505050565b61077c335b8261151f565b6107985760405162461bcd60e51b815260040161063690613e82565b61076c838383611609565b6000828152600c60205260409020600101546107bf81336117b0565b61076c8383611814565b60006107d483610b98565b82106108365760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610636565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b03811633146108cf5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610636565b6108d9828261189a565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61090881336117b0565b610910611901565b50565b61076c838383604051806020016040528060008152506110d6565b61093733610776565b61099c5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610636565b61091081611994565b60608315610a77576010836040516109bd9190613eef565b9081526020016040518091039020826040516109d99190613eef565b908152602001604051809103902080546109f290613e47565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1e90613e47565b8015610a6b5780601f10610a4057610100808354040283529160200191610a6b565b820191906000526020600020905b815481529060010190602001808311610a4e57829003601f168201915b50505050509050610a87565b6012836040516109bd9190613eef565b9392505050565b6000610a9960085490565b8210610afc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610636565b60088281548110610b0f57610b0f613f0b565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806105365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610636565b60006001600160a01b038216610c035760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610636565b506001600160a01b031660009081526003602052604090205490565b610c29828261199d565b600e600085815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff16021790555060e08201518160000160076101000a81548160ff021916908360ff1602179055506101008201518160000160086101000a81548160ff021916908360ff1602179055506101208201518160000160096101000a81548160ff021916908360ff160217905550905050505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610dba81336117b0565b610910611a34565b6000918252600c602090815260408084206001600160a01b0393909316845291905290205460ff1690565b610df56135ab565b506000908152600e6020908152604091829020825161014081018452905460ff808216151583526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152640100000000810484166080830152650100000000008104841660a083015266010000000000008104841660c0830152600160381b8104841660e0830152600160401b8104841692820192909252600160481b90910490911661012082015290565b60606001805461054b90613e47565b6108d9338383611aaf565b60005b82518160ff1610156110cf578415610fcd5780600f85604051610eea9190613eef565b9081526020016040518091039020848360ff1681518110610f0d57610f0d613f0b565b6020026020010151604051610f229190613eef565b908152604051908190036020019020805460ff92831660ff19909116179055825183918316908110610f5657610f56613f0b565b6020026020010151601085604051610f6e9190613eef565b9081526020016040518091039020848360ff1681518110610f9157610f91613f0b565b6020026020010151604051610fa69190613eef565b90815260200160405180910390209080519060200190610fc79291906135ff565b506110bd565b80601185604051610fde9190613eef565b9081526020016040518091039020848360ff168151811061100157611001613f0b565b60200260200101516040516110169190613eef565b908152604051908190036020019020805460ff92831660ff1990911617905582518391831690811061104a5761104a613f0b565b60200260200101516012856040516110629190613eef565b9081526020016040518091039020848360ff168151811061108557611085613f0b565b602002602001015160405161109a9190613eef565b908152602001604051809103902090805190602001906110bb9291906135ff565b505b806110c781613f37565b915050610ec7565b5050505050565b6110e0338361151f565b6110fc5760405162461bcd60e51b815260040161063690613e82565b61110884848484611b7e565b50505050565b606061053682611bb1565b6000831561116757600f836040516111319190613eef565b90815260200160405180910390208260405161114d9190613eef565b9081526040519081900360200190205460ff169050610a87565b6011836040516111319190613eef565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66111a281336117b0565b60006111ad600d5490565b90506111bd600d80546001019055565b6111c78482611d20565b6111088184611d3a565b6111db8382611dc5565b6000858152600e60209081526040918290208351815492850151938501516060860151608087015160a088015160c089015160e08a0151610100808c0151610120909c015161ffff19909a1697151561ff0019169790971760ff9a8b169097029690961763ffff0000191662010000958a169590950263ff0000001916949094176301000000938916939093029290921765ffff0000000019166401000000009188169190910265ff000000000019161765010000000000918716919091021767ffff000000000000191666010000000000009186169190910267ff00000000000000191617600160381b918516919091021769ffff00000000000000001916600160401b9484169490940269ff000000000000000000191693909317600160481b9290911691909102179055611310613683565b82611339576040518060400160405280600681526020016546656d616c6560d01b815250611357565b604051806040016040528060048152602001634d616c6560e01b8152505b81528361138057604051806040016040528060048152602001632bb7b63360e11b81525061139f565b60405180604001604052806005815260200164053686565760dc1b8152505b602082810191909152604080518082018252600581526410591d5b1d60da1b9281019290925282015260005b600981101561141e578281600981106113e6576113e6613f0b565b6020020151826113f7836003613f57565b600c811061140757611407613f0b565b60200201528061141681613f6f565b9150506113cb565b50600061142b8583612390565b90506114418661143c84848a61254b565b611d3a565b505050505050565b6000828152600c602052604090206001015461146581336117b0565b61076c838361189a565b60006001600160e01b03198216637965db0b60e01b14806105365750610536826125cb565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114e682610b21565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061152a82611494565b61158b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610636565b600061159683610b21565b9050806001600160a01b0316846001600160a01b031614806115d15750836001600160a01b03166115c6846105ce565b6001600160a01b0316145b8061160157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661161c82610b21565b6001600160a01b0316146116805760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610636565b6001600160a01b0382166116e25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610636565b6116ed8383836125f0565b6116f86000826114b1565b6001600160a01b0383166000908152600360205260408120805460019290611721908490613f8a565b90915550506001600160a01b038216600090815260036020526040812080546001929061174f908490613f57565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6117ba8282610dc2565b6108d9576117d2816001600160a01b03166014612641565b6117dd836020612641565b6040516020016117ee929190613fa1565b60408051601f198184030181529082905262461bcd60e51b825261063691600401613781565b61181e8282610dc2565b6108d9576000828152600c602090815260408083206001600160a01b03851684529091529020805460ff191660011790556118563390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6118a48282610dc2565b156108d9576000828152600c602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b5460ff1661194a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610636565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610910816127dd565b6119a56135ab565b6119ad6135ab565b921515835250805160ff908116602080850191909152820151811660408085019190915282015181166060808501919091528201518116608080850191909152820151811660a080850191909152820151811660c080850191909152820151811660e080850191909152820151811661010080850191909152909101511661012082015290565b600b5460ff1615611a7a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610636565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119773390565b816001600160a01b0316836001600160a01b03161415611b115760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610636565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b89848484611609565b611b958484848461281d565b6111085760405162461bcd60e51b815260040161063690614016565b6060611bbc82611494565b611c225760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610636565b6000828152600a602052604081208054611c3b90613e47565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6790613e47565b8015611cb45780601f10611c8957610100808354040283529160200191611cb4565b820191906000526020600020905b815481529060010190602001808311611c9757829003601f168201915b505050505090506000611cd260408051602081019091526000815290565b9050805160001415611ce5575092915050565b815115611d17578082604051602001611cff929190614068565b60405160208183030381529060405292505050919050565b6116018461291b565b6108d98282604051806020016040528060008152506129f2565b611d4382611494565b611da65760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610636565b6000828152600a60209081526040909120825161076c928401906135ff565b611dcd6135ab565b611dd56135ab565b831515815283611e24576040805162233ab960e91b815260116003820152905190819003602301812084519091611e0c9190613eef565b9081526040519081900360200190205460ff16611e65565b6040805162233ab960e91b8152600f6003820152905190819003602301812084519091611e519190613eef565b9081526040519081900360200190205460ff165b60ff16602082015283611eba57604051631219585960e21b81526011906004019081526040516020918190038201812091850151611ea291613eef565b9081526040519081900360200190205460ff16611efe565b604051631219585960e21b8152600f906004019081526040516020918190038201812091850151611eea91613eef565b9081526040519081900360200190205460ff165b60ff16604082015283611f505760408051634561727360e01b815260116004820152815190819003602401812091850151611f3891613eef565b9081526040519081900360200190205460ff16611f91565b60408051634561727360e01b8152600f6004820152815190819003602401812091850151611f7d91613eef565b9081526040519081900360200190205460ff165b60ff16606082015283611fed57604051634579657360e01b81526011906004019081526040519081900360200190208360036020020151604051611fd59190613eef565b9081526040519081900360200190205460ff16612038565b604051634579657360e01b8152600f9060040190815260405190819003602001902083600360200201516040516120249190613eef565b9081526040519081900360200190205460ff165b60ff1660808201528361209457604051634e6f736560e01b8152601190600401908152604051908190036020019020836004602002015160405161207c9190613eef565b9081526040519081900360200190205460ff166120df565b604051634e6f736560e01b8152600f9060040190815260405190819003602001902083600460200201516040516120cb9190613eef565b9081526040519081900360200190205460ff165b60ff1660a08201528361213c576040516409adeeae8d60db1b815260119060050190815260405190819003602001902083600560200201516040516121249190613eef565b9081526040519081900360200190205460ff16612188565b6040516409adeeae8d60db1b8152600f9060050190815260405190819003602001902083600560200201516040516121749190613eef565b9081526040519081900360200190205460ff165b60ff1660c0820152836121e457604051634e65636b60e01b815260119060040190815260405190819003602001902083600660200201516040516121cc9190613eef565b9081526040519081900360200190205460ff1661222f565b604051634e65636b60e01b8152600f90600401908152604051908190036020019020836006602002015160405161221b9190613eef565b9081526040519081900360200190205460ff165b60ff1660e08201528361228b57604051631199595d60e21b815260119060040190815260405190819003602001902083600760200201516040516122739190613eef565b9081526040519081900360200190205460ff166122d6565b604051631199595d60e21b8152600f9060040190815260405190819003602001902083600760200201516040516122c29190613eef565b9081526040519081900360200190205460ff165b60ff16610100820152836123345760405164416c70686160d81b8152601190600501908152604051908190036020019020836008602002015160405161231c9190613eef565b9081526040519081900360200190205460ff16612380565b60405164416c70686160d81b8152600f90600501908152604051908190036020019020836008602002015160405161236c9190613eef565b9081526040519081900360200190205460ff165b60ff166101208201529392505050565b612398613683565b6123a0613683565b60005b600c81101561254357846124235760126123bb612a25565b82600c81106123cc576123cc613f0b565b60200201516040516123de9190613eef565b90815260200160405180910390208482600c81106123fe576123fe613f0b565b60200201516040516124109190613eef565b9081526020016040518091039020612491565b601061242d612a25565b82600c811061243e5761243e613f0b565b60200201516040516124509190613eef565b90815260200160405180910390208482600c811061247057612470613f0b565b60200201516040516124829190613eef565b90815260200160405180910390205b805461249c90613e47565b80601f01602080910402602001604051908101604052809291908181526020018280546124c890613e47565b80156125155780601f106124ea57610100808354040283529160200191612515565b820191906000526020600020905b8154815290600101906020018083116124f857829003601f168201915b50505050508282600c811061252c5761252c613f0b565b60200201528061253b81613f6f565b9150506123a3565b509392505050565b606080606061255a8686612b9b565b604088015160208901519294509092506125a19161257787612e23565b848660405160200161258d959493929190614097565b604051602081830303815290604052612f21565b6040516020016125b191906141af565b604051602081830303815290604052925050509392505050565b60006001600160e01b0319821663780e9d6360e01b1480610536575061053682613075565b600b5460ff16156126365760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610636565b61076c8383836130c5565b606060006126508360026141f4565b61265b906002613f57565b67ffffffffffffffff8111156126735761267361386b565b6040519080825280601f01601f19166020018201604052801561269d576020820181803683370190505b509050600360fc1b816000815181106126b8576126b8613f0b565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106126e7576126e7613f0b565b60200101906001600160f81b031916908160001a905350600061270b8460026141f4565b612716906001613f57565b90505b600181111561278e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061274a5761274a613f0b565b1a60f81b82828151811061276057612760613f0b565b60200101906001600160f81b031916908160001a90535060049490941c9361278781614213565b9050612719565b508315610a875760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610636565b6127e68161317d565b6000818152600a6020526040902080546127ff90613e47565b159050610910576000818152600a60205260408120610910916136ab565b60006001600160a01b0384163b1561291057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061286190339089908890889060040161422a565b6020604051808303816000875af192505050801561289c575060408051601f3d908101601f1916820190925261289991810190614267565b60015b6128f6573d8080156128ca576040519150601f19603f3d011682016040523d82523d6000602084013e6128cf565b606091505b5080516128ee5760405162461bcd60e51b815260040161063690614016565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611601565b506001949350505050565b606061292682611494565b61298a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610636565b60006129a160408051602081019091526000815290565b905060008151116129c15760405180602001604052806000815250610a87565b806129cb84612e23565b6040516020016129dc929190614068565b6040516020818303038152906040529392505050565b6129fc8383613224565b612a09600084848461281d565b61076c5760405162461bcd60e51b815260040161063690614016565b612a2d613683565b50604080516101c081018252600661018082019081526523b2b73232b960d11b6101a0830152815281518083018352600580825264436c61737360d81b602083810191909152808401929092528351808501855260038082526241676560e81b82850152848601919091528451808601865290815262233ab960e91b818401526060840152835180850185526004808252631219585960e21b82850152608085019190915284518086018652818152634561727360e01b8185015260a085015284518086018652818152634579657360e01b8185015260c085015284518086018652818152634e6f736560e01b8185015260e0850152845180860186528281526409adeeae8d60db1b8185015261010085015284518086018652818152634e65636b60e01b8185015261012085015284518086018652908152631199595d60e21b818401526101408401528351808501909452835264416c70686160d81b9083015261016081019190915290565b6060806000604051602001612bb790605b60f81b815260010190565b60405160208183030381529060405290506000604051602001612c88907f3c7376672077696474683d223130302522206865696768743d2231303025222081527f76657273696f6e3d22312e31222076696577426f783d2230203020343020343060208201527f2220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f60408201527f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77332e60608201526f37b93397989c9c9c97bc3634b735911f60811b608082015260900190565b604051602081830303815290604052905060005b600c8160ff161015612de15782612cd4612cb583613363565b898460ff16600c8110612cca57612cca613f0b565b602002015161338c565b600b8360ff1610612cfe57604051806040016040528060018152602001605d60f81b815250612d19565b604051806040016040528060018152602001600b60fa1b8152505b604051602001612d2b93929190614284565b6040516020818303038152906040529250612d446133b8565b868260ff16600c8110612d5957612d59613f0b565b6020020151604051602001612d6e9190613eef565b6040516020818303038152906040528051906020012014612dcf5781612dac878360ff16600c8110612da257612da2613f0b565b60200201516133f2565b604051602001612dbd929190614068565b60405160208183030381529060405291505b80612dd981613f37565b915050612c9c565b50612df68160405160200161258d91906142c7565b604051602001612e0691906142f1565b60408051808303601f190181529190529196919550909350505050565b606081612e475750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e715780612e5b81613f6f565b9150612e6a9050600a8361434c565b9150612e4b565b60008167ffffffffffffffff811115612e8c57612e8c61386b565b6040519080825280601f01601f191660200182016040528015612eb6576020820181803683370190505b5090505b841561160157612ecb600183613f8a565b9150612ed8600a86614360565b612ee3906030613f57565b60f81b818381518110612ef857612ef8613f0b565b60200101906001600160f81b031916908160001a905350612f1a600a8661434c565b9450612eba565b6060815160001415612f4157505060408051602081019091526000815290565b60006040518060600160405280604081526020016144d76040913990506000600384516002612f709190613f57565b612f7a919061434c565b612f859060046141f4565b67ffffffffffffffff811115612f9d57612f9d61386b565b6040519080825280601f01601f191660200182016040528015612fc7576020820181803683370190505b509050600182016020820185865187015b80821015613033576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250612fd8565b505060038651066001811461304f57600281146130625761306a565b603d6001830353603d600283035361306a565b603d60018303535b509195945050505050565b60006001600160e01b031982166380ac58cd60e01b14806130a657506001600160e01b03198216635b5e139f60e01b145b8061053657506301ffc9a760e01b6001600160e01b0319831614610536565b6001600160a01b0383166131205761311b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613143565b816001600160a01b0316836001600160a01b03161461314357613143838261341b565b6001600160a01b03821661315a5761076c816134b8565b826001600160a01b0316826001600160a01b03161461076c5761076c8282613567565b600061318882610b21565b9050613196816000846125f0565b6131a16000836114b1565b6001600160a01b03811660009081526003602052604081208054600192906131ca908490613f8a565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03821661327a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610636565b61328381611494565b156132d05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610636565b6132dc600083836125f0565b6001600160a01b0382166000908152600360205260408120805460019290613305908490613f57565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606061336d612a25565b8260ff16600c811061338157613381613f0b565b602002015192915050565b606082826040516020016133a1929190614374565b604051602081830303815290604052905092915050565b6040805160208082018352600080835292516133d691839101613eef565b6040516020818303038152906040528051906020012091505090565b60608160405160200161340591906143ec565b6040516020818303038152906040529050919050565b6000600161342884610b98565b6134329190613f8a565b600083815260076020526040902054909150808214613485576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906134ca90600190613f8a565b600083815260096020526040812054600880549394509092849081106134f2576134f2613f0b565b90600052602060002001549050806008838154811061351357613513613f0b565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061354b5761354b6144c0565b6001900381819060005260206000200160009055905550505050565b600061357283610b98565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b82805461360b90613e47565b90600052602060002090601f01602090048101928261362d5760008555613673565b82601f1061364657805160ff1916838001178555613673565b82800160010185558215613673579182015b82811115613673578251825591602001919060010190613658565b5061367f9291506136e1565b5090565b604051806101800160405280600c905b60608152602001906001900390816136935790505090565b5080546136b790613e47565b6000825580601f106136c7575050565b601f01602090049060005260206000209081019061091091905b5b8082111561367f57600081556001016136e2565b6001600160e01b03198116811461091057600080fd5b60006020828403121561371e57600080fd5b8135610a87816136f6565b60005b8381101561374457818101518382015260200161372c565b838111156111085750506000910152565b6000815180845261376d816020860160208601613729565b601f01601f19169290920160200192915050565b602081526000610a876020830184613755565b6000602082840312156137a657600080fd5b5035919050565b80356001600160a01b03811681146137c457600080fd5b919050565b600080604083850312156137dc57600080fd5b6137e5836137ad565b946020939093013593505050565b60008060006060848603121561380857600080fd5b613811846137ad565b925061381f602085016137ad565b9150604084013590509250925092565b6000806040838503121561384257600080fd5b82359150613852602084016137ad565b90509250929050565b803580151581146137c457600080fd5b634e487b7160e01b600052604160045260246000fd5b604051610120810167ffffffffffffffff811182821017156138a5576138a561386b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156138d4576138d461386b565b604052919050565b600067ffffffffffffffff8311156138f6576138f661386b565b613909601f8401601f19166020016138ab565b905082815283838301111561391d57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261394557600080fd5b610a87838335602085016138dc565b60008060006060848603121561396957600080fd5b6139728461385b565b9250602084013567ffffffffffffffff8082111561398f57600080fd5b61399b87838801613934565b935060408601359150808211156139b157600080fd5b506139be86828701613934565b9150509250925092565b6000602082840312156139da57600080fd5b610a87826137ad565b60008060006101608085870312156139fa57600080fd5b843593506020613a0b81870161385b565b935086605f870112613a1c57600080fd5b613a24613881565b918601918088841115613a3657600080fd5b604088015b84811015613a6257803560ff81168114613a555760008081fd5b8352918301918301613a3b565b50809450505050509250925092565b81511515815261014081016020830151613a90602084018260ff169052565b506040830151613aa5604084018260ff169052565b506060830151613aba606084018260ff169052565b506080830151613acf608084018260ff169052565b5060a0830151613ae460a084018260ff169052565b5060c0830151613af960c084018260ff169052565b5060e0830151613b0e60e084018260ff169052565b506101008381015160ff908116918401919091526101209384015116929091019190915290565b60008060408385031215613b4857600080fd5b613b51836137ad565b91506138526020840161385b565b600082601f830112613b7057600080fd5b8135602067ffffffffffffffff80831115613b8d57613b8d61386b565b8260051b613b9c8382016138ab565b9384528581018301938381019088861115613bb657600080fd5b84880192505b85831015613bf257823584811115613bd45760008081fd5b613be28a87838c0101613934565b8352509184019190840190613bbc565b98975050505050505050565b60008060008060808587031215613c1457600080fd5b613c1d8561385b565b9350602085013567ffffffffffffffff80821115613c3a57600080fd5b613c4688838901613934565b94506040870135915080821115613c5c57600080fd5b613c6888838901613b5f565b93506060870135915080821115613c7e57600080fd5b50613c8b87828801613b5f565b91505092959194509250565b60008060008060808587031215613cad57600080fd5b613cb6856137ad565b9350613cc4602086016137ad565b925060408501359150606085013567ffffffffffffffff811115613ce757600080fd5b8501601f81018713613cf857600080fd5b613c8b878235602084016138dc565b60008060408385031215613d1a57600080fd5b613d23836137ad565b9150602083013567ffffffffffffffff811115613d3f57600080fd5b613d4b85828601613934565b9150509250929050565b60008060008060808587031215613d6b57600080fd5b843593506020613d7c81870161385b565b9350613d8a6040870161385b565b9250606086013567ffffffffffffffff80821115613da757600080fd5b818801915088601f830112613dbb57600080fd5b613dc3613881565b8061012084018b811115613dd657600080fd5b845b81811015613e0a57803585811115613df05760008081fd5b613dfc8e828901613934565b855250928601928601613dd8565b5050809550505050505092959194509250565b60008060408385031215613e3057600080fd5b613e39836137ad565b9150613852602084016137ad565b600181811c90821680613e5b57607f821691505b60208210811415613e7c57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008151613ee5818560208601613729565b9290920192915050565b60008251613f01818460208701613729565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff811415613f4e57613f4e613f21565b60010192915050565b60008219821115613f6a57613f6a613f21565b500190565b6000600019821415613f8357613f83613f21565b5060010190565b600082821015613f9c57613f9c613f21565b500390565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613fd9816017850160208801613729565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161400a816028840160208801613729565b01602801949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000835161407a818460208801613729565b83519083019061408e818360208801613729565b01949350505050565b607b60f81b815269113730b6b291101d101160b11b600182015285516000906140c781600b850160208b01613729565b600160fd1b600b9184019182015286516140e881600c840160208b01613729565b61202360f01b600c9290910191820152855161410b81600e840160208a01613729565b61088b60f21b9101600e8101919091527f226465736372697074696f6e22203a202246616e746f6d20576f6c662047616d60108201526a194814995d9a5d985b088b60aa1b60308201526a1134b6b0b3b291101d101160a91b603b820152613bf26141a261419c61417f6046850189613ed3565b70011161130ba3a3934b13aba32b991101d1607d1b815260110190565b86613ed3565b607d60f81b815260010190565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516141e781601d850160208701613729565b91909101601d0192915050565b600081600019048311821515161561420e5761420e613f21565b500290565b60008161422257614222613f21565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061425d90830184613755565b9695505050505050565b60006020828403121561427957600080fd5b8151610a87816136f6565b60008451614296818460208901613729565b8451908301906142aa818360208901613729565b84519101906142bd818360208801613729565b0195945050505050565b600082516142d9818460208701613729565b651e17b9bb339f60d11b920191825250600601919050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000081526000825161432981601a850160208701613729565b91909101601a0192915050565b634e487b7160e01b600052601260045260246000fd5b60008261435b5761435b614336565b500490565b60008261436f5761436f614336565b500690565b713d90113a3930b4ba2fba3cb83291101d101160711b815282516000906143a2816012850160208801613729565b6d111610113b30b63ab291101d101160911b60129184019182015283516143d0816020808501908801613729565b6222207d60e81b60209290910191820152602301949350505050565b7f3c696d61676520783d22342220793d2234222077696474683d2233322220686581527f696768743d2233322220696d6167652d72656e646572696e673d22706978656c60208201527f6174656422207072657365727665417370656374526174696f3d22784d69645960408201527f4d69642220786c696e6b3a687265663d22646174613a696d6167652f706e673b60608201526618985cd94d8d0b60ca1b6080820152600082516144a6816087850160208701613729565b6211179f60e91b6087939091019283015250608a01919050565b634e487b7160e01b600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122050ccb9ac5cf8266d96dad731eef306f5d9590606167671ce68b8faac55f94ff264736f6c634300080c0033
Deployed ByteCode Sourcemap
76147:92:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61938:227;;;;;;:::i;:::-;;:::i;:::-;;;661:14:1;;654:22;636:41;;624:2;609:18;61938:227:0;;;;;;;;22547:100;;;:::i;:::-;;;;;;;:::i;24106:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1810:32:1;;;1792:51;;1780:2;1765:18;24106:221:0;1646:203:1;23629:411:0;;;;;;:::i;:::-;;:::i;:::-;;37443:113;37531:10;:17;37443:113;;;2437:25:1;;;2425:2;2410:18;37443:113:0;2291:177:1;24856:339:0;;;;;;:::i;:::-;;:::i;54327:131::-;;;;;;:::i;:::-;54401:7;54428:12;;;:6;:12;;;;;:22;;;;54327:131;54720:147;;;;;;:::i;:::-;;:::i;37111:256::-;;;;;;:::i;:::-;;:::i;55768:218::-;;;;;;:::i;:::-;;:::i;60917:77::-;;;:::i;71086:101::-;71151:7;71086:101;;25266:185;;;;;;:::i;:::-;;:::i;58419:245::-;;;;;;:::i;:::-;;:::i;71195:308::-;;;;;;:::i;:::-;;:::i;37633:233::-;;;;;;:::i;:::-;;:::i;46084:86::-;46155:7;;;;46084:86;;22241:239;;;;;;:::i;:::-;;:::i;21971:208::-;;;;;;:::i;:::-;;:::i;72520:204::-;;;;;;:::i;:::-;;:::i;60836:73::-;;;:::i;53196:147::-;;;;;;:::i;:::-;;:::i;72351:161::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22716:104::-;;;:::i;52287:49::-;;52332:4;52287:49;;24399:155;;;;;;:::i;:::-;;:::i;71819:524::-;;;;;;:::i;:::-;;:::i;25522:328::-;;;;;;:::i;:::-;;:::i;61734:196::-;;;;;;:::i;:::-;;:::i;71511:300::-;;;;;;:::i;:::-;;:::i;61002:271::-;;;;;;:::i;:::-;;:::i;72732:693::-;;;;;;:::i;:::-;;:::i;60482:62::-;;60520:24;60482:62;;55112:149;;;;;;:::i;:::-;;:::i;60413:62::-;;60451:24;60413:62;;24625:164;;;;;;:::i;:::-;-1:-1:-1;;;;;24746:25:0;;;24722:4;24746:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24625:164;61938:227;62092:4;62121:36;62145:11;62121:23;:36::i;:::-;62114:43;61938:227;-1:-1:-1;;61938:227:0:o;22547:100::-;22601:13;22634:5;22627:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22547:100;:::o;24106:221::-;24182:7;24210:16;24218:7;24210;:16::i;:::-;24202:73;;;;-1:-1:-1;;;24202:73:0;;13287:2:1;24202:73:0;;;13269:21:1;13326:2;13306:18;;;13299:30;13365:34;13345:18;;;13338:62;-1:-1:-1;;;13416:18:1;;;13409:42;13468:19;;24202:73:0;;;;;;;;;-1:-1:-1;24295:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24295:24:0;;24106:221::o;23629:411::-;23710:13;23726:23;23741:7;23726:14;:23::i;:::-;23710:39;;23774:5;-1:-1:-1;;;;;23768:11:0;:2;-1:-1:-1;;;;;23768:11:0;;;23760:57;;;;-1:-1:-1;;;23760:57:0;;13700:2:1;23760:57:0;;;13682:21:1;13739:2;13719:18;;;13712:30;13778:34;13758:18;;;13751:62;-1:-1:-1;;;13829:18:1;;;13822:31;13870:19;;23760:57:0;13498:397:1;23760:57:0;16912:10;-1:-1:-1;;;;;23852:21:0;;;;:62;;-1:-1:-1;23877:37:0;23894:5;16912:10;24625:164;:::i;23877:37::-;23830:168;;;;-1:-1:-1;;;23830:168:0;;14102:2:1;23830:168:0;;;14084:21:1;14141:2;14121:18;;;14114:30;14180:34;14160:18;;;14153:62;14251:26;14231:18;;;14224:54;14295:19;;23830:168:0;13900:420:1;23830:168:0;24011:21;24020:2;24024:7;24011:8;:21::i;:::-;23699:341;23629:411;;:::o;24856:339::-;25051:41;16912:10;25070:12;25084:7;25051:18;:41::i;:::-;25043:103;;;;-1:-1:-1;;;25043:103:0;;;;;;;:::i;:::-;25159:28;25169:4;25175:2;25179:7;25159:9;:28::i;54720:147::-;54401:7;54428:12;;;:6;:12;;;;;:22;;;52778:30;52789:4;16912:10;52778;:30::i;:::-;54834:25:::1;54845:4;54851:7;54834:10;:25::i;37111:256::-:0;37208:7;37244:23;37261:5;37244:16;:23::i;:::-;37236:5;:31;37228:87;;;;-1:-1:-1;;;37228:87:0;;14945:2:1;37228:87:0;;;14927:21:1;14984:2;14964:18;;;14957:30;15023:34;15003:18;;;14996:62;-1:-1:-1;;;15074:18:1;;;15067:41;15125:19;;37228:87:0;14743:407:1;37228:87:0;-1:-1:-1;;;;;;37333:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37111:256::o;55768:218::-;-1:-1:-1;;;;;55864:23:0;;16912:10;55864:23;55856:83;;;;-1:-1:-1;;;55856:83:0;;15357:2:1;55856:83:0;;;15339:21:1;15396:2;15376:18;;;15369:30;15435:34;15415:18;;;15408:62;-1:-1:-1;;;15486:18:1;;;15479:45;15541:19;;55856:83:0;15155:411:1;55856:83:0;55952:26;55964:4;55970:7;55952:11;:26::i;:::-;55768:218;;:::o;60917:77::-;60451:24;52778:30;60451:24;16912:10;52778;:30::i;:::-;60976:10:::1;:8;:10::i;:::-;60917:77:::0;:::o;25266:185::-;25404:39;25421:4;25427:2;25431:7;25404:39;;;;;;;;;;;;:16;:39::i;58419:245::-;58537:41;16912:10;58556:12;16832:98;58537:41;58529:102;;;;-1:-1:-1;;;58529:102:0;;15773:2:1;58529:102:0;;;15755:21:1;15812:2;15792:18;;;15785:30;15851:34;15831:18;;;15824:62;-1:-1:-1;;;15902:18:1;;;15895:46;15958:19;;58529:102:0;15571:412:1;58529:102:0;58642:14;58648:7;58642:5;:14::i;71195:308::-;71326:13;71356:5;71352:144;;;71385:17;71403:5;71385:24;;;;;;:::i;:::-;;;;;;;;;;;;;71410:4;71385:30;;;;;;:::i;:::-;;;;;;;;;;;;;71378:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71352:144;71455:16;71472:5;71455:23;;;;;;:::i;71352:144::-;71195:308;;;;;:::o;37633:233::-;37708:7;37744:30;37531:10;:17;;37443:113;37744:30;37736:5;:38;37728:95;;;;-1:-1:-1;;;37728:95:0;;16661:2:1;37728:95:0;;;16643:21:1;16700:2;16680:18;;;16673:30;16739:34;16719:18;;;16712:62;-1:-1:-1;;;16790:18:1;;;16783:42;16842:19;;37728:95:0;16459:408:1;37728:95:0;37841:10;37852:5;37841:17;;;;;;;;:::i;:::-;;;;;;;;;37834:24;;37633:233;;;:::o;22241:239::-;22313:7;22349:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22349:16:0;22384:19;22376:73;;;;-1:-1:-1;;;22376:73:0;;17206:2:1;22376:73:0;;;17188:21:1;17245:2;17225:18;;;17218:30;17284:34;17264:18;;;17257:62;-1:-1:-1;;;17335:18:1;;;17328:39;17384:19;;22376:73:0;17004:405:1;21971:208:0;22043:7;-1:-1:-1;;;;;22071:19:0;;22063:74;;;;-1:-1:-1;;;22063:74:0;;17616:2:1;22063:74:0;;;17598:21:1;17655:2;17635:18;;;17628:30;17694:34;17674:18;;;17667:62;-1:-1:-1;;;17745:18:1;;;17738:40;17795:19;;22063:74:0;17414:406:1;22063:74:0;-1:-1:-1;;;;;;22155:16:0;;;;;:9;:16;;;;;;;21971:208::o;72520:204::-;72680:36;72697:5;72704:11;72680:16;:36::i;:::-;72656:12;:21;72669:7;72656:21;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72520:204;;;:::o;60836:73::-;60451:24;52778:30;60451:24;16912:10;52778;:30::i;:::-;60893:8:::1;:6;:8::i;53196:147::-:0;53282:4;53306:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;53306:29:0;;;;;;;;;;;;;;;53196:147::o;72351:161::-;72442:16;;:::i;:::-;-1:-1:-1;72483:21:0;;;;:12;:21;;;;;;;;;72476:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72476:28:0;;;;;;;;-1:-1:-1;;;72476:28:0;;;;;;;;;;;-1:-1:-1;;;72476:28:0;;;;;;;;;;;72351:161::o;22716:104::-;22772:13;22805:7;22798:14;;;;;:::i;24399:155::-;24494:52;16912:10;24527:8;24537;24494:18;:52::i;71819:524::-;71985:7;71980:356;72002:5;:12;71998:1;:16;;;71980:356;;;72040:5;72036:289;;;72102:1;72066:16;72083:5;72066:23;;;;;;:::i;:::-;;;;;;;;;;;;;72090:5;72096:1;72090:8;;;;;;;;;;:::i;:::-;;;;;;;72066:33;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;;;;;-1:-1:-1;;72066:37:0;;;;;;72159:9;;:6;;:9;;;;;;;;;:::i;:::-;;;;;;;72122:17;72140:5;72122:24;;;;;;:::i;:::-;;;;;;;;;;;;;72147:5;72153:1;72147:8;;;;;;;;;;:::i;:::-;;;;;;;72122:34;;;;;;:::i;:::-;;;;;;;;;;;;;:46;;;;;;;;;;;;:::i;:::-;;72036:289;;;72244:1;72209:15;72225:5;72209:22;;;;;;:::i;:::-;;;;;;;;;;;;;72232:5;72238:1;72232:8;;;;;;;;;;:::i;:::-;;;;;;;72209:32;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;;;;-1:-1:-1;;72209:36:0;;;;;;72300:9;;:6;;:9;;;;;;;;;:::i;:::-;;;;;;;72264:16;72281:5;72264:23;;;;;;:::i;:::-;;;;;;;;;;;;;72288:5;72294:1;72288:8;;;;;;;;;;:::i;:::-;;;;;;;72264:33;;;;;;:::i;:::-;;;;;;;;;;;;;:45;;;;;;;;;;;;:::i;:::-;;72036:289;72016:3;;;;:::i;:::-;;;;71980:356;;;;71819:524;;;;:::o;25522:328::-;25697:41;16912:10;25730:7;25697:18;:41::i;:::-;25689:103;;;;-1:-1:-1;;;25689:103:0;;;;;;;:::i;:::-;25803:39;25817:4;25823:2;25827:7;25836:5;25803:13;:39::i;:::-;25522:328;;;;:::o;61734:196::-;61861:13;61899:23;61914:7;61899:14;:23::i;71511:300::-;71642:7;71666:5;71662:142;;;71695:16;71712:5;71695:23;;;;;;:::i;:::-;;;;;;;;;;;;;71719:4;71695:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;71688:36:0;;71662:142;71764:15;71780:5;71764:22;;;;;;:::i;61002:271::-;60520:24;52778:30;60520:24;16912:10;52778;:30::i;:::-;61114:15:::1;61132:25;:15;59635:14:::0;;59543:114;61132:25:::1;61114:43;;61168:27;:15;59754:19:::0;;59772:1;59754:19;;;59665:127;61168:27:::1;61206:22;61216:2;61220:7;61206:9;:22::i;:::-;61239:26;61252:7;61261:3;61239:12;:26::i;72732:693::-:0;72913:36;72930:5;72937:11;72913:16;:36::i;:::-;72889:21;;;;:12;:21;;;;;;;;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72889:60:0;;;;;;-1:-1:-1;;72889:60:0;;;;;;;;;;;;;;;;-1:-1:-1;;72889:60:0;;;;;;;;;-1:-1:-1;;72889:60:0;;;;;;;;;;;;;;;;;-1:-1:-1;;72889:60:0;;;;;;;;;-1:-1:-1;;72889:60:0;;;;;;;;;;;-1:-1:-1;;72889:60:0;;;;;;;;;-1:-1:-1;;72889:60:0;;-1:-1:-1;;;72889:60:0;;;;;;;;-1:-1:-1;;72889:60:0;-1:-1:-1;;;72889:60:0;;;;;;;-1:-1:-1;;72889:60:0;;;;;-1:-1:-1;;;72889:60:0;;;;;;;;;;;72960:28;;:::i;:::-;73015:4;:24;;;;;;;;;;;;;;;-1:-1:-1;;;73015:24:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73015:24:0;;;;72999:40;;73066:5;:24;;;;;;;;;;;;;;;-1:-1:-1;;;73066:24:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73066:24:0;;;;73050:13;;;;:40;;;;73101:23;;;;;;;;;;;-1:-1:-1;;;73101:23:0;;;;;;;:13;;:23;-1:-1:-1;73135:93:0;73159:1;73155;:5;73135:93;;;73202:11;73214:1;73202:14;;;;;;;:::i;:::-;;;;;73182:10;73193:5;:1;73197;73193:5;:::i;:::-;73182:17;;;;;;;:::i;:::-;;;;:34;73162:3;;;;:::i;:::-;;;;73135:93;;;;73238:24;73265:29;73276:5;73283:10;73265;:29::i;:::-;73238:56;;73305:112;73332:7;73354:52;73378:10;73390:6;73398:7;73354:23;:52::i;:::-;73305:12;:112::i;:::-;72878:547;;72732:693;;;;:::o;55112:149::-;54401:7;54428:12;;;:6;:12;;;;;:22;;;52778:30;52789:4;16912:10;52778;:30::i;:::-;55227:26:::1;55239:4;55245:7;55227:11;:26::i;52900:204::-:0;52985:4;-1:-1:-1;;;;;;53009:47:0;;-1:-1:-1;;;53009:47:0;;:87;;;53060:36;53084:11;53060:23;:36::i;27360:127::-;27425:4;27449:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27449:16:0;:30;;;27360:127::o;31506:174::-;31581:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31581:29:0;-1:-1:-1;;;;;31581:29:0;;;;;;;;:24;;31635:23;31581:24;31635:14;:23::i;:::-;-1:-1:-1;;;;;31626:46:0;;;;;;;;;;;31506:174;;:::o;27654:348::-;27747:4;27772:16;27780:7;27772;:16::i;:::-;27764:73;;;;-1:-1:-1;;;27764:73:0;;18612:2:1;27764:73:0;;;18594:21:1;18651:2;18631:18;;;18624:30;18690:34;18670:18;;;18663:62;-1:-1:-1;;;18741:18:1;;;18734:42;18793:19;;27764:73:0;18410:408:1;27764:73:0;27848:13;27864:23;27879:7;27864:14;:23::i;:::-;27848:39;;27917:5;-1:-1:-1;;;;;27906:16:0;:7;-1:-1:-1;;;;;27906:16:0;;:51;;;;27950:7;-1:-1:-1;;;;;27926:31:0;:20;27938:7;27926:11;:20::i;:::-;-1:-1:-1;;;;;27926:31:0;;27906:51;:87;;;-1:-1:-1;;;;;;24746:25:0;;;24722:4;24746:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27961:32;27898:96;27654:348;-1:-1:-1;;;;27654:348:0:o;30763:625::-;30922:4;-1:-1:-1;;;;;30895:31:0;:23;30910:7;30895:14;:23::i;:::-;-1:-1:-1;;;;;30895:31:0;;30887:81;;;;-1:-1:-1;;;30887:81:0;;19025:2:1;30887:81:0;;;19007:21:1;19064:2;19044:18;;;19037:30;19103:34;19083:18;;;19076:62;-1:-1:-1;;;19154:18:1;;;19147:35;19199:19;;30887:81:0;18823:401:1;30887:81:0;-1:-1:-1;;;;;30987:16:0;;30979:65;;;;-1:-1:-1;;;30979:65:0;;19431:2:1;30979:65:0;;;19413:21:1;19470:2;19450:18;;;19443:30;19509:34;19489:18;;;19482:62;-1:-1:-1;;;19560:18:1;;;19553:34;19604:19;;30979:65:0;19229:400:1;30979:65:0;31057:39;31078:4;31084:2;31088:7;31057:20;:39::i;:::-;31161:29;31178:1;31182:7;31161:8;:29::i;:::-;-1:-1:-1;;;;;31203:15:0;;;;;;:9;:15;;;;;:20;;31222:1;;31203:15;:20;;31222:1;;31203:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31234:13:0;;;;;;:9;:13;;;;;:18;;31251:1;;31234:13;:18;;31251:1;;31234:18;:::i;:::-;;;;-1:-1:-1;;31263:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31263:21:0;-1:-1:-1;;;;;31263:21:0;;;;;;;;;31302:27;;31263:16;;31302:27;;;;;;;23699:341;23629:411;;:::o;53633:505::-;53722:22;53730:4;53736:7;53722;:22::i;:::-;53717:414;;53910:41;53938:7;-1:-1:-1;;;;;53910:41:0;53948:2;53910:19;:41::i;:::-;54024:38;54052:4;54059:2;54024:19;:38::i;:::-;53815:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;53815:270:0;;;;;;;;;;-1:-1:-1;;;53761:358:0;;;;;;;:::i;57269:238::-;57353:22;57361:4;57367:7;57353;:22::i;:::-;57348:152;;57392:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;57392:29:0;;;;;;;;;:36;;-1:-1:-1;;57392:36:0;57424:4;57392:36;;;57475:12;16912:10;;16832:98;57475:12;-1:-1:-1;;;;;57448:40:0;57466:7;-1:-1:-1;;;;;57448:40:0;57460:4;57448:40;;;;;;;;;;57269:238;;:::o;57639:239::-;57723:22;57731:4;57737:7;57723;:22::i;:::-;57719:152;;;57794:5;57762:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;57762:29:0;;;;;;;;;;:37;;-1:-1:-1;;57762:37:0;;;57819:40;16912:10;;57762:12;;57819:40;;57794:5;57819:40;57639:239;;:::o;47143:120::-;46155:7;;;;46679:41;;;;-1:-1:-1;;;46679:41:0;;20757:2:1;46679:41:0;;;20739:21:1;20796:2;20776:18;;;20769:30;-1:-1:-1;;;20815:18:1;;;20808:50;20875:18;;46679:41:0;20555:344:1;46679:41:0;47202:7:::1;:15:::0;;-1:-1:-1;;47202:15:0::1;::::0;;47233:22:::1;16912:10:::0;47242:12:::1;47233:22;::::0;-1:-1:-1;;;;;1810:32:1;;;1792:51;;1780:2;1765:18;47233:22:0::1;;;;;;;47143:120::o:0;61588:138::-;61698:20;61710:7;61698:11;:20::i;75435:631::-;75551:16;;:::i;:::-;75585:26;;:::i;:::-;75622:25;;;;;-1:-1:-1;75674:14:0;;75658:30;;;;75674:14;75658:13;;;:30;;;;75716:14;;;75699:31;;:14;;;;:31;;;;75758:14;;;75741:31;;:14;;;;:31;;;;75800:14;;;75783:31;;:14;;;;:31;;;;75842:14;;;75825:31;;:14;;;;:31;;;;75885:14;;;75867:32;;:15;;;;:32;;;;75927:14;;;75910:31;;:14;;;;:31;;;;75969:14;;;75952:31;;:14;;;;:31;;;;76017:14;;;;75994:37;:20;;;:37;75622:25;75435:631::o;46884:118::-;46155:7;;;;46409:9;46401:38;;;;-1:-1:-1;;;46401:38:0;;21106:2:1;46401:38:0;;;21088:21:1;21145:2;21125:18;;;21118:30;-1:-1:-1;;;21164:18:1;;;21157:46;21220:18;;46401:38:0;20904:340:1;46401:38:0;46944:7:::1;:14:::0;;-1:-1:-1;;46944:14:0::1;46954:4;46944:14;::::0;;46974:20:::1;46981:12;16912:10:::0;;16832:98;31822:315;31977:8;-1:-1:-1;;;;;31968:17:0;:5;-1:-1:-1;;;;;31968:17:0;;;31960:55;;;;-1:-1:-1;;;31960:55:0;;21451:2:1;31960:55:0;;;21433:21:1;21490:2;21470:18;;;21463:30;21529:27;21509:18;;;21502:55;21574:18;;31960:55:0;21249:349:1;31960:55:0;-1:-1:-1;;;;;32026:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32026:46:0;;;;;;;;;;32088:41;;636::1;;;32088::0;;609:18:1;32088:41:0;;;;;;;31822:315;;;:::o;26732:::-;26889:28;26899:4;26905:2;26909:7;26889:9;:28::i;:::-;26936:48;26959:4;26965:2;26969:7;26978:5;26936:22;:48::i;:::-;26928:111;;;;-1:-1:-1;;;26928:111:0;;;;;;;:::i;43460:679::-;43533:13;43567:16;43575:7;43567;:16::i;:::-;43559:78;;;;-1:-1:-1;;;43559:78:0;;22224:2:1;43559:78:0;;;22206:21:1;22263:2;22243:18;;;22236:30;22302:34;22282:18;;;22275:62;-1:-1:-1;;;22353:18:1;;;22346:47;22410:19;;43559:78:0;22022:413:1;43559:78:0;43650:23;43676:19;;;:10;:19;;;;;43650:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43706:18;43727:10;23550:9;;;;;;;;;-1:-1:-1;23550:9:0;;;23473:94;43727:10;43706:31;;43819:4;43813:18;43835:1;43813:23;43809:72;;;-1:-1:-1;43860:9:0;43460:679;-1:-1:-1;;43460:679:0:o;43809:72::-;43985:23;;:27;43981:108;;44060:4;44066:9;44043:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44029:48;;;;43460:679;;;:::o;43981:108::-;44108:23;44123:7;44108:14;:23::i;28344:110::-;28420:26;28430:2;28434:7;28420:26;;;;;;;;;;;;:9;:26::i;44295:217::-;44395:16;44403:7;44395;:16::i;:::-;44387:75;;;;-1:-1:-1;;;44387:75:0;;23117:2:1;44387:75:0;;;23099:21:1;23156:2;23136:18;;;23129:30;23195:34;23175:18;;;23168:62;-1:-1:-1;;;23246:18:1;;;23239:44;23300:19;;44387:75:0;22915:410:1;44387:75:0;44473:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;73875:1552::-;73992:16;;:::i;:::-;74026:26;;:::i;:::-;74063:25;;;;;74083:5;74115:114;;74191:22;;;-1:-1:-1;;;23532:18:1;;74191:15:0;23575:1:1;23566:11;;74191:22:0;;;;;;;;;;;74214:14;;74191:22;;:38;;74214:14;74191:38;:::i;:::-;;;;;;;;;;;;;;;;;74115:114;;;74136:23;;;-1:-1:-1;;;23532:18:1;;74136:16:0;23575:1:1;23566:11;;74136:23:0;;;;;;;;;;;74160:14;;74136:23;;:39;;74160:14;74136:39;:::i;:::-;;;;;;;;;;;;;;;;;74115:114;74099:130;;:13;;;:130;74257:5;:116;;74334:23;;-1:-1:-1;;;23790:19:1;;74334:15:0;;23834:1:1;23825:11;74334:23:0;;;;;;;;;;;;;;74358:14;;;;74334:39;;;:::i;:::-;;;;;;;;;;;;;;;;;74257:116;;;74278:24;;-1:-1:-1;;;23790:19:1;;74278:16:0;;23834:1:1;23825:11;74278:24:0;;;;;;;;;;;;;;74303:14;;;;74278:40;;;:::i;:::-;;;;;;;;;;;;;;;;;74257:116;74240:133;;:14;;;:133;74401:5;:116;;74478:23;;;-1:-1:-1;;;24049:19:1;;74478:15:0;24093:1:1;24084:11;;74478:23:0;;;;;;;;;;;74502:14;;;;74478:39;;;:::i;:::-;;;;;;;;;;;;;;;;;74401:116;;;74422:24;;;-1:-1:-1;;;24049:19:1;;74422:16:0;24093:1:1;24084:11;;74422:24:0;;;;;;;;;;;74447:14;;;;74422:40;;;:::i;:::-;;;;;;;;;;;;;;;;;74401:116;74384:133;;:14;;;:133;74545:5;:116;;74622:23;;-1:-1:-1;;;24308:19:1;;74622:15:0;;24352:1:1;24343:11;74622:23:0;;;;;;;;;;;;;74646:11;74658:1;74646:14;;;;74622:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;74545:116;;;74566:24;;-1:-1:-1;;;24308:19:1;;74566:16:0;;24352:1:1;24343:11;74566:24:0;;;;;;;;;;;;;74591:11;74603:1;74591:14;;;;74566:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;74545:116;74528:133;;:14;;;:133;74689:5;:116;;74766:23;;-1:-1:-1;;;24567:19:1;;74766:15:0;;24611:1:1;24602:11;74766:23:0;;;;;;;;;;;;;74790:11;74802:1;74790:14;;;;74766:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;74689:116;;;74710:24;;-1:-1:-1;;;24567:19:1;;74710:16:0;;24611:1:1;24602:11;74710:24:0;;;;;;;;;;;;;74735:11;74747:1;74735:14;;;;74710:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;74689:116;74672:133;;:14;;;:133;74834:5;:118;;74912:24;;-1:-1:-1;;;24826:20:1;;74912:15:0;;24871:1:1;24862:11;74912:24:0;;;;;;;;;;;;;74937:11;74949:1;74937:14;;;;74912:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;74834:118;;;74855:25;;-1:-1:-1;;;24826:20:1;;74855:16:0;;24871:1:1;24862:11;74855:25:0;;;;;;;;;;;;;74881:11;74893:1;74881:14;;;;74855:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;74834:118;74816:136;;:15;;;:136;74980:5;:116;;75057:23;;-1:-1:-1;;;25086:19:1;;75057:15:0;;25130:1:1;25121:11;75057:23:0;;;;;;;;;;;;;75081:11;75093:1;75081:14;;;;75057:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;74980:116;;;75001:24;;-1:-1:-1;;;25086:19:1;;75001:16:0;;25130:1:1;25121:11;75001:24:0;;;;;;;;;;;;;75026:11;75038:1;75026:14;;;;75001:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;74980:116;74963:133;;:14;;;:133;75124:5;:116;;75201:23;;-1:-1:-1;;;25345:19:1;;75201:15:0;;25389:1:1;25380:11;75201:23:0;;;;;;;;;;;;;75225:11;75237:1;75225:14;;;;75201:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;75124:116;;;75145:24;;-1:-1:-1;;;25345:19:1;;75145:16:0;;25389:1:1;25380:11;75145:24:0;;;;;;;;;;;;;75170:11;75182:1;75170:14;;;;75145:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;75124:116;75107:133;;:14;;;:133;75274:5;:118;;75352:24;;-1:-1:-1;;;25604:20:1;;75352:15:0;;25649:1:1;25640:11;75352:24:0;;;;;;;;;;;;;75377:11;75389:1;75377:14;;;;75352:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;75274:118;;;75295:25;;-1:-1:-1;;;25604:20:1;;75295:16:0;;25649:1:1;25640:11;75295:25:0;;;;;;;;;;;;;75321:11;75333:1;75321:14;;;;75295:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;75274:118;75251:141;;:20;;;:141;:20;73875:1552;-1:-1:-1;;;73875:1552:0:o;73433:434::-;73540:17;;:::i;:::-;73575:24;;:::i;:::-;73615:9;73610:226;73634:2;73630:1;:6;73610:226;;;73670:5;:154;;73770:16;73787:22;:20;:22::i;:::-;73810:1;73787:25;;;;;;;:::i;:::-;;;;;73770:43;;;;;;:::i;:::-;;;;;;;;;;;;;73814:6;73821:1;73814:9;;;;;;;:::i;:::-;;;;;73770:54;;;;;;:::i;:::-;;;;;;;;;;;;;73670:154;;;73695:17;73713:22;:20;:22::i;:::-;73736:1;73713:25;;;;;;;:::i;:::-;;;;;73695:44;;;;;;:::i;:::-;;;;;;;;;;;;;73740:6;73747:1;73740:9;;;;;;;:::i;:::-;;;;;73695:55;;;;;;:::i;:::-;;;;;;;;;;;;;73670:154;73658:166;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;73665:1;73658:9;;;;;;;:::i;:::-;;;;:166;73638:3;;;;:::i;:::-;;;;73610:226;;;-1:-1:-1;73853:6:0;73433:434;-1:-1:-1;;;73433:434:0:o;66499:1281::-;66668:13;66694:22;66727:21;66781:48;66794:18;66814:14;66781:12;:48::i;:::-;67142:21;;;;;67228;;;66759:70;;-1:-1:-1;66759:70:0;;-1:-1:-1;66978:760:0;;67315:25;67332:7;67315:16;:25::i;:::-;67558:7;67646:8;67018:697;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66978:13;:760::i;:::-;66885:872;;;;;;;;:::i;:::-;;;;;;;;;;;;;66840:932;;;;66499:1281;;;;;:::o;36803:224::-;36905:4;-1:-1:-1;;;;;;36929:50:0;;-1:-1:-1;;;36929:50:0;;:90;;;36983:36;37007:11;36983:23;:36::i;61281:229::-;46155:7;;;;46409:9;46401:38;;;;-1:-1:-1;;;46401:38:0;;21106:2:1;46401:38:0;;;21088:21:1;21145:2;21125:18;;;21118:30;-1:-1:-1;;;21164:18:1;;;21157:46;21220:18;;46401:38:0;20904:340:1;46401:38:0;61457:45:::1;61484:4;61490:2;61494:7;61457:26;:45::i;18712:451::-:0;18787:13;18813:19;18845:10;18849:6;18845:1;:10;:::i;:::-;:14;;18858:1;18845:14;:::i;:::-;18835:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18835:25:0;;18813:47;;-1:-1:-1;;;18871:6:0;18878:1;18871:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;18871:15:0;;;;;;;;;-1:-1:-1;;;18897:6:0;18904:1;18897:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;18897:15:0;;;;;;;;-1:-1:-1;18928:9:0;18940:10;18944:6;18940:1;:10;:::i;:::-;:14;;18953:1;18940:14;:::i;:::-;18928:26;;18923:135;18960:1;18956;:5;18923:135;;;-1:-1:-1;;;19008:5:0;19016:3;19008:11;18995:25;;;;;;;:::i;:::-;;;;18983:6;18990:1;18983:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;18983:37:0;;;;;;;;-1:-1:-1;19045:1:0;19035:11;;;;;18963:3;;;:::i;:::-;;;18923:135;;;-1:-1:-1;19076:10:0;;19068:55;;;;-1:-1:-1;;;19068:55:0;;29282:2:1;19068:55:0;;;29264:21:1;;;29301:18;;;29294:30;29360:34;29340:18;;;29333:62;29412:18;;19068:55:0;29080:356:1;44741:206:0;44810:20;44822:7;44810:11;:20::i;:::-;44853:19;;;;:10;:19;;;;;44847:33;;;;;:::i;:::-;:38;;-1:-1:-1;44843:97:0;;44909:19;;;;:10;:19;;;;;44902:26;;;:::i;32702:799::-;32857:4;-1:-1:-1;;;;;32878:13:0;;9178:19;:23;32874:620;;32914:72;;-1:-1:-1;;;32914:72:0;;-1:-1:-1;;;;;32914:36:0;;;;;:72;;16912:10;;32965:4;;32971:7;;32980:5;;32914:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32914:72:0;;;;;;;;-1:-1:-1;;32914:72:0;;;;;;;;;;;;:::i;:::-;;;32910:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33156:13:0;;33152:272;;33199:60;;-1:-1:-1;;;33199:60:0;;;;;;;:::i;33152:272::-;33374:6;33368:13;33359:6;33355:2;33351:15;33344:38;32910:529;-1:-1:-1;;;;;;33037:51:0;-1:-1:-1;;;33037:51:0;;-1:-1:-1;33030:58:0;;32874:620;-1:-1:-1;33478:4:0;32702:799;;;;;;:::o;22891:334::-;22964:13;22998:16;23006:7;22998;:16::i;:::-;22990:76;;;;-1:-1:-1;;;22990:76:0;;30402:2:1;22990:76:0;;;30384:21:1;30441:2;30421:18;;;30414:30;30480:34;30460:18;;;30453:62;-1:-1:-1;;;30531:18:1;;;30524:45;30586:19;;22990:76:0;30200:411:1;22990:76:0;23079:21;23103:10;23550:9;;;;;;;;;-1:-1:-1;23550:9:0;;;23473:94;23103:10;23079:34;;23155:1;23137:7;23131:21;:25;:86;;;;;;;;;;;;;;;;;23183:7;23192:18;:7;:16;:18::i;:::-;23166:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23124:93;22891:334;-1:-1:-1;;;22891:334:0:o;28681:321::-;28811:18;28817:2;28821:7;28811:5;:18::i;:::-;28862:54;28893:1;28897:2;28901:7;28910:5;28862:22;:54::i;:::-;28840:154;;;;-1:-1:-1;;;28840:154:0;;;;;;;:::i;67788:398::-;67833:17;;:::i;:::-;-1:-1:-1;67863:292:0;;;;;;;;;;;;;;;-1:-1:-1;;;67863:292:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;67863:292:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67863:292:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67863:292:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67863:292:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67863:292:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67863:292:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67863:292:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67863:292:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67863:292:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67863:292:0;;;;-1:-1:-1;;;67863:292:0;;;;;;;;;;;-1:-1:-1;;;67863:292:0;;;;-1:-1:-1;;;67863:292:0;;;;;67788:398::o;68194:1223::-;68335:13;68350;68376:18;68404:21;;;;;;-1:-1:-1;;;30818:16:1;;30859:1;30850:11;;30616:251;68404:21:0;;;;;;;;;;;;;68376:50;;68437:17;68478:196;;;;;;31086:66:1;31074:79;;31183:66;31178:2;31169:12;;31162:88;31280:66;31275:2;31266:12;;31259:88;31377:66;31372:2;31363:12;;31356:88;-1:-1:-1;;;31469:3:1;31460:13;;31453:67;31545:3;31536:13;;30872:683;68478:196:0;;;;;;;;;;;;;68437:248;;68701:7;68696:493;68718:2;68714:1;:6;;;68696:493;;;68813:4;68840:44;68849:11;68858:1;68849:8;:11::i;:::-;68862:18;68881:1;68862:21;;;;;;;;;:::i;:::-;;;;;68840:8;:44::i;:::-;68911:6;68907:1;:10;;;:22;;;;;;;;;;;;;;;-1:-1:-1;;;68907:22:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68907:22:0;;;;68774:174;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68742:221;;69050:14;:12;:14::i;:::-;69027;69042:1;69027:17;;;;;;;;;:::i;:::-;;;;;69010:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;69000:46;;;;;;:64;68978:200;;69129:3;69134:26;69142:14;69157:1;69142:17;;;;;;;;;:::i;:::-;;;;;69134:7;:26::i;:::-;69112:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69099:63;;68978:200;68722:3;;;;:::i;:::-;;;;68696:493;;;;69308:46;69339:3;69322:31;;;;;;;;:::i;69308:46::-;69226:143;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;69226:143:0;;;;;;69399:4;;69226:143;;-1:-1:-1;68194:1223:0;;-1:-1:-1;;;;68194:1223:0:o;17411:723::-;17467:13;17688:10;17684:53;;-1:-1:-1;;17715:10:0;;;;;;;;;;;;-1:-1:-1;;;17715:10:0;;;;;17411:723::o;17684:53::-;17762:5;17747:12;17803:78;17810:9;;17803:78;;17836:8;;;;:::i;:::-;;-1:-1:-1;17859:10:0;;-1:-1:-1;17867:2:0;17859:10;;:::i;:::-;;;17803:78;;;17891:19;17923:6;17913:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17913:17:0;;17891:39;;17941:154;17948:10;;17941:154;;17975:11;17985:1;17975:11;;:::i;:::-;;-1:-1:-1;18044:10:0;18052:2;18044:5;:10;:::i;:::-;18031:24;;:2;:24;:::i;:::-;18018:39;;18001:6;18008;18001:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18001:56:0;;;;;;;;-1:-1:-1;18072:11:0;18081:2;18072:11;;:::i;:::-;;;17941:154;;63339:3053;63397:13;63634:4;:11;63649:1;63634:16;63630:31;;;-1:-1:-1;;63652:9:0;;;;;;;;;-1:-1:-1;63652:9:0;;;63339:3053::o;63630:31::-;63714:19;63736:6;;;;;;;;;;;;;;;;;63714:28;;64153:20;64212:1;64193:4;:11;64207:1;64193:15;;;;:::i;:::-;64192:21;;;;:::i;:::-;64187:27;;:1;:27;:::i;:::-;64176:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64176:39:0;;64153:62;;64351:1;64344:5;64340:13;64455:2;64447:6;64443:15;64566:4;64618;64612:11;64606:4;64602:22;64528:1432;64652:6;64643:7;64640:19;64528:1432;;;64758:1;64749:7;64745:15;64734:26;;64797:7;64791:14;65450:4;65442:5;65438:2;65434:14;65430:25;65420:8;65416:40;65410:47;65399:9;65391:67;65504:1;65493:9;65489:17;65476:30;;65596:4;65588:5;65584:2;65580:14;65576:25;65566:8;65562:40;65556:47;65545:9;65537:67;65650:1;65639:9;65635:17;65622:30;;65741:4;65733:5;65730:1;65726:13;65722:24;65712:8;65708:39;65702:46;65691:9;65683:66;65795:1;65784:9;65780:17;65767:30;;65878:4;65871:5;65867:16;65857:8;65853:31;65847:38;65836:9;65828:58;;65932:1;65921:9;65917:17;65904:30;;64528:1432;;;64532:107;;66122:1;66115:4;66109:11;66105:19;66143:1;66138:123;;;;66280:1;66275:73;;;;66098:250;;66138:123;66191:4;66187:1;66176:9;66172:17;66164:32;66241:4;66237:1;66226:9;66222:17;66214:32;66138:123;;66275:73;66328:4;66324:1;66313:9;66309:17;66301:32;66098:250;-1:-1:-1;66378:6:0;;63339:3053;-1:-1:-1;;;;;63339:3053:0:o;21602:305::-;21704:4;-1:-1:-1;;;;;;21741:40:0;;-1:-1:-1;;;21741:40:0;;:105;;-1:-1:-1;;;;;;;21798:48:0;;-1:-1:-1;;;21798:48:0;21741:105;:158;;;-1:-1:-1;;;;;;;;;;20142:40:0;;;21863:36;20033:157;38479:589;-1:-1:-1;;;;;38685:18:0;;38681:187;;38720:40;38752:7;39895:10;:17;;39868:24;;;;:15;:24;;;;;:44;;;39923:24;;;;;;;;;;;;39791:164;38720:40;38681:187;;;38790:2;-1:-1:-1;;;;;38782:10:0;:4;-1:-1:-1;;;;;38782:10:0;;38778:90;;38809:47;38842:4;38848:7;38809:32;:47::i;:::-;-1:-1:-1;;;;;38882:16:0;;38878:183;;38915:45;38952:7;38915:36;:45::i;38878:183::-;38988:4;-1:-1:-1;;;;;38982:10:0;:2;-1:-1:-1;;;;;38982:10:0;;38978:83;;39009:40;39037:2;39041:7;39009:27;:40::i;30006:420::-;30066:13;30082:23;30097:7;30082:14;:23::i;:::-;30066:39;;30118:48;30139:5;30154:1;30158:7;30118:20;:48::i;:::-;30207:29;30224:1;30228:7;30207:8;:29::i;:::-;-1:-1:-1;;;;;30249:16:0;;;;;;:9;:16;;;;;:21;;30269:1;;30249:16;:21;;30269:1;;30249:21;:::i;:::-;;;;-1:-1:-1;;30288:16:0;;;;:7;:16;;;;;;30281:23;;-1:-1:-1;;;;;;30281:23:0;;;30322:36;30296:7;;30288:16;-1:-1:-1;;;;;30322:36:0;;;;;30288:16;;30322:36;55768:218;;:::o;29338:439::-;-1:-1:-1;;;;;29418:16:0;;29410:61;;;;-1:-1:-1;;;29410:61:0;;33704:2:1;29410:61:0;;;33686:21:1;;;33723:18;;;33716:30;33782:34;33762:18;;;33755:62;33834:18;;29410:61:0;33502:356:1;29410:61:0;29491:16;29499:7;29491;:16::i;:::-;29490:17;29482:58;;;;-1:-1:-1;;;29482:58:0;;34065:2:1;29482:58:0;;;34047:21:1;34104:2;34084:18;;;34077:30;34143;34123:18;;;34116:58;34191:18;;29482:58:0;33863:352:1;29482:58:0;29553:45;29582:1;29586:2;29590:7;29553:20;:45::i;:::-;-1:-1:-1;;;;;29611:13:0;;;;;;:9;:13;;;;;:18;;29628:1;;29611:13;:18;;29628:1;;29611:18;:::i;:::-;;;;-1:-1:-1;;29640:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29640:21:0;-1:-1:-1;;;;;29640:21:0;;;;;;;;29679:33;;29640:16;;;29679:33;;29640:16;;29679:33;55768:218;;:::o;69842:113::-;69895:13;69928:12;:10;:12::i;:::-;69941:5;69928:19;;;;;;;;;:::i;:::-;;;;;;69842:113;-1:-1:-1;;69842:113:0:o;69425:409::-;69534:13;69692:5;69759;69610:201;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69565:261;;69425:409;;;;:::o;70376:150::-;70442:24;;;;;;;;;70422:7;70442:24;;;70494:23;;;;70442:24;;70494:23;;:::i;:::-;;;;;;;;;;;;;70484:34;;;;;;70477:41;;;70376:150;:::o;69963:405::-;70023:13;70293:5;70094:251;;;;;;;;:::i;:::-;;;;;;;;;;;;;70049:311;;69963:405;;;:::o;40582:988::-;40848:22;40898:1;40873:22;40890:4;40873:16;:22::i;:::-;:26;;;;:::i;:::-;40910:18;40931:26;;;:17;:26;;;;;;40848:51;;-1:-1:-1;41064:28:0;;;41060:328;;-1:-1:-1;;;;;41131:18:0;;41109:19;41131:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41182:30;;;;;;:44;;;41299:30;;:17;:30;;;;;:43;;;41060:328;-1:-1:-1;41484:26:0;;;;:17;:26;;;;;;;;41477:33;;;-1:-1:-1;;;;;41528:18:0;;;;;:12;:18;;;;;:34;;;;;;;41521:41;40582:988::o;41865:1079::-;42143:10;:17;42118:22;;42143:21;;42163:1;;42143:21;:::i;:::-;42175:18;42196:24;;;:15;:24;;;;;;42569:10;:26;;42118:46;;-1:-1:-1;42196:24:0;;42118:46;;42569:26;;;;;;:::i;:::-;;;;;;;;;42547:48;;42633:11;42608:10;42619;42608:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;42713:28;;;:15;:28;;;;;;;:41;;;42885:24;;;;;42878:31;42920:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41936:1008;;;41865:1079;:::o;39369:221::-;39454:14;39471:20;39488:2;39471:16;:20::i;:::-;-1:-1:-1;;;;;39502:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39547:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39369:221:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;688:258::-;760:1;770:113;784:6;781:1;778:13;770:113;;;860:11;;;854:18;841:11;;;834:39;806:2;799:10;770:113;;;901:6;898:1;895:13;892:48;;;-1:-1:-1;;936:1:1;918:16;;911:27;688:258::o;951:269::-;1004:3;1042:5;1036:12;1069:6;1064:3;1057:19;1085:63;1141:6;1134:4;1129:3;1125:14;1118:4;1111:5;1107:16;1085:63;:::i;:::-;1202:2;1181:15;-1:-1:-1;;1177:29:1;1168:39;;;;1209:4;1164:50;;951:269;-1:-1:-1;;951:269:1:o;1225:231::-;1374:2;1363:9;1356:21;1337:4;1394:56;1446:2;1435:9;1431:18;1423:6;1394:56;:::i;1461:180::-;1520:6;1573:2;1561:9;1552:7;1548:23;1544:32;1541:52;;;1589:1;1586;1579:12;1541:52;-1:-1:-1;1612:23:1;;1461:180;-1:-1:-1;1461:180:1:o;1854:173::-;1922:20;;-1:-1:-1;;;;;1971:31:1;;1961:42;;1951:70;;2017:1;2014;2007:12;1951:70;1854:173;;;:::o;2032:254::-;2100:6;2108;2161:2;2149:9;2140:7;2136:23;2132:32;2129:52;;;2177:1;2174;2167:12;2129:52;2200:29;2219:9;2200:29;:::i;:::-;2190:39;2276:2;2261:18;;;;2248:32;;-1:-1:-1;;;2032:254:1:o;2473:328::-;2550:6;2558;2566;2619:2;2607:9;2598:7;2594:23;2590:32;2587:52;;;2635:1;2632;2625:12;2587:52;2658:29;2677:9;2658:29;:::i;:::-;2648:39;;2706:38;2740:2;2729:9;2725:18;2706:38;:::i;:::-;2696:48;;2791:2;2780:9;2776:18;2763:32;2753:42;;2473:328;;;;;:::o;3173:254::-;3241:6;3249;3302:2;3290:9;3281:7;3277:23;3273:32;3270:52;;;3318:1;3315;3308:12;3270:52;3354:9;3341:23;3331:33;;3383:38;3417:2;3406:9;3402:18;3383:38;:::i;:::-;3373:48;;3173:254;;;;;:::o;3432:160::-;3497:20;;3553:13;;3546:21;3536:32;;3526:60;;3582:1;3579;3572:12;3597:127;3658:10;3653:3;3649:20;3646:1;3639:31;3689:4;3686:1;3679:15;3713:4;3710:1;3703:15;3729:252;3801:2;3795:9;3843:3;3831:16;;3877:18;3862:34;;3898:22;;;3859:62;3856:88;;;3924:18;;:::i;:::-;3960:2;3953:22;3729:252;:::o;3986:275::-;4057:2;4051:9;4122:2;4103:13;;-1:-1:-1;;4099:27:1;4087:40;;4157:18;4142:34;;4178:22;;;4139:62;4136:88;;;4204:18;;:::i;:::-;4240:2;4233:22;3986:275;;-1:-1:-1;3986:275:1:o;4266:407::-;4331:5;4365:18;4357:6;4354:30;4351:56;;;4387:18;;:::i;:::-;4425:57;4470:2;4449:15;;-1:-1:-1;;4445:29:1;4476:4;4441:40;4425:57;:::i;:::-;4416:66;;4505:6;4498:5;4491:21;4545:3;4536:6;4531:3;4527:16;4524:25;4521:45;;;4562:1;4559;4552:12;4521:45;4611:6;4606:3;4599:4;4592:5;4588:16;4575:43;4665:1;4658:4;4649:6;4642:5;4638:18;4634:29;4627:40;4266:407;;;;;:::o;4678:222::-;4721:5;4774:3;4767:4;4759:6;4755:17;4751:27;4741:55;;4792:1;4789;4782:12;4741:55;4814:80;4890:3;4881:6;4868:20;4861:4;4853:6;4849:17;4814:80;:::i;4905:611::-;4999:6;5007;5015;5068:2;5056:9;5047:7;5043:23;5039:32;5036:52;;;5084:1;5081;5074:12;5036:52;5107:26;5123:9;5107:26;:::i;:::-;5097:36;;5184:2;5173:9;5169:18;5156:32;5207:18;5248:2;5240:6;5237:14;5234:34;;;5264:1;5261;5254:12;5234:34;5287:50;5329:7;5320:6;5309:9;5305:22;5287:50;:::i;:::-;5277:60;;5390:2;5379:9;5375:18;5362:32;5346:48;;5419:2;5409:8;5406:16;5403:36;;;5435:1;5432;5425:12;5403:36;;5458:52;5502:7;5491:8;5480:9;5476:24;5458:52;:::i;:::-;5448:62;;;4905:611;;;;;:::o;5521:186::-;5580:6;5633:2;5621:9;5612:7;5608:23;5604:32;5601:52;;;5649:1;5646;5639:12;5601:52;5672:29;5691:9;5672:29;:::i;5712:936::-;5807:6;5815;5823;5854:3;5898:2;5886:9;5877:7;5873:23;5869:32;5866:52;;;5914:1;5911;5904:12;5866:52;5950:9;5937:23;5927:33;;5979:2;6000:35;6031:2;6020:9;6016:18;6000:35;:::i;:::-;5990:45;;6078:7;6073:2;6062:9;6058:18;6054:32;6044:60;;6100:1;6097;6090:12;6044:60;6124:22;;:::i;:::-;6194:18;;;;6168:3;6224:19;;;6221:39;;;6256:1;6253;6246:12;6221:39;6295:2;6284:9;6280:18;6307:311;6323:6;6318:3;6315:15;6307:311;;;6403:3;6390:17;6451:4;6444:5;6440:16;6433:5;6430:27;6420:125;;6499:1;6528:2;6524;6517:14;6420:125;6558:18;;6596:12;;;;6340;;6307:311;;;6311:3;6637:5;6627:15;;;;;;5712:936;;;;;:::o;6733:1348::-;6950:13;;470;463:21;451:34;;6921:3;6906:19;;7022:4;7014:6;7010:17;7004:24;7037:52;7083:4;7072:9;7068:20;7054:12;6720:4;6709:16;6697:29;;6653:75;7037:52;;7138:4;7130:6;7126:17;7120:24;7153:54;7201:4;7190:9;7186:20;7170:14;6720:4;6709:16;6697:29;;6653:75;7153:54;;7256:4;7248:6;7244:17;7238:24;7271:54;7319:4;7308:9;7304:20;7288:14;6720:4;6709:16;6697:29;;6653:75;7271:54;;7374:4;7366:6;7362:17;7356:24;7389:54;7437:4;7426:9;7422:20;7406:14;6720:4;6709:16;6697:29;;6653:75;7389:54;;7492:4;7484:6;7480:17;7474:24;7507:54;7555:4;7544:9;7540:20;7524:14;6720:4;6709:16;6697:29;;6653:75;7507:54;;7610:4;7602:6;7598:17;7592:24;7625:54;7673:4;7662:9;7658:20;7642:14;6720:4;6709:16;6697:29;;6653:75;7625:54;;7728:4;7720:6;7716:17;7710:24;7743:54;7791:4;7780:9;7776:20;7760:14;6720:4;6709:16;6697:29;;6653:75;7743:54;-1:-1:-1;7816:6:1;7859:15;;;7853:22;6720:4;6709:16;;;7917:18;;;6697:29;;;;7955:6;7998:15;;;7992:22;6709:16;8056:18;;;;6697:29;;;;6733:1348;:::o;8086:254::-;8151:6;8159;8212:2;8200:9;8191:7;8187:23;8183:32;8180:52;;;8228:1;8225;8218:12;8180:52;8251:29;8270:9;8251:29;:::i;:::-;8241:39;;8299:35;8330:2;8319:9;8315:18;8299:35;:::i;8345:943::-;8398:5;8451:3;8444:4;8436:6;8432:17;8428:27;8418:55;;8469:1;8466;8459:12;8418:55;8505:6;8492:20;8531:4;8554:18;8591:2;8587;8584:10;8581:36;;;8597:18;;:::i;:::-;8643:2;8640:1;8636:10;8666:28;8690:2;8686;8682:11;8666:28;:::i;:::-;8728:15;;;8798;;;8794:24;;;8759:12;;;;8830:15;;;8827:35;;;8858:1;8855;8848:12;8827:35;8894:2;8886:6;8882:15;8871:26;;8906:353;8922:6;8917:3;8914:15;8906:353;;;9008:3;8995:17;9044:2;9031:11;9028:19;9025:109;;;9088:1;9117:2;9113;9106:14;9025:109;9159:57;9212:3;9207:2;9193:11;9185:6;9181:24;9177:33;9159:57;:::i;:::-;9147:70;;-1:-1:-1;8939:12:1;;;;9237;;;;8906:353;;;9277:5;8345:943;-1:-1:-1;;;;;;;;8345:943:1:o;9293:882::-;9456:6;9464;9472;9480;9533:3;9521:9;9512:7;9508:23;9504:33;9501:53;;;9550:1;9547;9540:12;9501:53;9573:26;9589:9;9573:26;:::i;:::-;9563:36;;9650:2;9639:9;9635:18;9622:32;9673:18;9714:2;9706:6;9703:14;9700:34;;;9730:1;9727;9720:12;9700:34;9753:50;9795:7;9786:6;9775:9;9771:22;9753:50;:::i;:::-;9743:60;;9856:2;9845:9;9841:18;9828:32;9812:48;;9885:2;9875:8;9872:16;9869:36;;;9901:1;9898;9891:12;9869:36;9924:62;9978:7;9967:8;9956:9;9952:24;9924:62;:::i;:::-;9914:72;;10039:2;10028:9;10024:18;10011:32;9995:48;;10068:2;10058:8;10055:16;10052:36;;;10084:1;10081;10074:12;10052:36;;10107:62;10161:7;10150:8;10139:9;10135:24;10107:62;:::i;:::-;10097:72;;;9293:882;;;;;;;:::o;10180:667::-;10275:6;10283;10291;10299;10352:3;10340:9;10331:7;10327:23;10323:33;10320:53;;;10369:1;10366;10359:12;10320:53;10392:29;10411:9;10392:29;:::i;:::-;10382:39;;10440:38;10474:2;10463:9;10459:18;10440:38;:::i;:::-;10430:48;;10525:2;10514:9;10510:18;10497:32;10487:42;;10580:2;10569:9;10565:18;10552:32;10607:18;10599:6;10596:30;10593:50;;;10639:1;10636;10629:12;10593:50;10662:22;;10715:4;10707:13;;10703:27;-1:-1:-1;10693:55:1;;10744:1;10741;10734:12;10693:55;10767:74;10833:7;10828:2;10815:16;10810:2;10806;10802:11;10767:74;:::i;10852:396::-;10930:6;10938;10991:2;10979:9;10970:7;10966:23;10962:32;10959:52;;;11007:1;11004;10997:12;10959:52;11030:29;11049:9;11030:29;:::i;:::-;11020:39;;11110:2;11099:9;11095:18;11082:32;11137:18;11129:6;11126:30;11123:50;;;11169:1;11166;11159:12;11123:50;11192;11234:7;11225:6;11214:9;11210:22;11192:50;:::i;:::-;11182:60;;;10852:396;;;;;:::o;11253:1177::-;11366:6;11374;11382;11390;11443:3;11431:9;11422:7;11418:23;11414:33;11411:53;;;11460:1;11457;11450:12;11411:53;11496:9;11483:23;11473:33;;11525:2;11546:35;11577:2;11566:9;11562:18;11546:35;:::i;:::-;11536:45;;11600:35;11631:2;11620:9;11616:18;11600:35;:::i;:::-;11590:45;;11686:2;11675:9;11671:18;11658:32;11709:18;11750:2;11742:6;11739:14;11736:34;;;11766:1;11763;11756:12;11736:34;11804:6;11793:9;11789:22;11779:32;;11849:7;11842:4;11838:2;11834:13;11830:27;11820:55;;11871:1;11868;11861:12;11820:55;11895:22;;:::i;:::-;11939:3;11973;11969:2;11965:12;12000:7;11992:6;11989:19;11986:39;;;12021:1;12018;12011:12;11986:39;12045:2;12056:344;12072:6;12067:3;12064:15;12056:344;;;12158:3;12145:17;12194:2;12181:11;12178:19;12175:109;;;12238:1;12267:2;12263;12256:14;12175:109;12309:48;12349:7;12335:11;12331:2;12327:20;12309:48;:::i;:::-;12297:61;;-1:-1:-1;12378:12:1;;;;12089;;12056:344;;;12060:3;;12419:5;12409:15;;;;;;;11253:1177;;;;;;;:::o;12435:260::-;12503:6;12511;12564:2;12552:9;12543:7;12539:23;12535:32;12532:52;;;12580:1;12577;12570:12;12532:52;12603:29;12622:9;12603:29;:::i;:::-;12593:39;;12651:38;12685:2;12674:9;12670:18;12651:38;:::i;12700:380::-;12779:1;12775:12;;;;12822;;;12843:61;;12897:4;12889:6;12885:17;12875:27;;12843:61;12950:2;12942:6;12939:14;12919:18;12916:38;12913:161;;;12996:10;12991:3;12987:20;12984:1;12977:31;13031:4;13028:1;13021:15;13059:4;13056:1;13049:15;12913:161;;12700:380;;;:::o;14325:413::-;14527:2;14509:21;;;14566:2;14546:18;;;14539:30;14605:34;14600:2;14585:18;;14578:62;-1:-1:-1;;;14671:2:1;14656:18;;14649:47;14728:3;14713:19;;14325:413::o;15988:185::-;16030:3;16068:5;16062:12;16083:52;16128:6;16123:3;16116:4;16109:5;16105:16;16083:52;:::i;:::-;16151:16;;;;;15988:185;-1:-1:-1;;15988:185:1:o;16178:276::-;16309:3;16347:6;16341:13;16363:53;16409:6;16404:3;16397:4;16389:6;16385:17;16363:53;:::i;:::-;16432:16;;;;;16178:276;-1:-1:-1;;16178:276:1:o;16872:127::-;16933:10;16928:3;16924:20;16921:1;16914:31;16964:4;16961:1;16954:15;16988:4;16985:1;16978:15;17825:127;17886:10;17881:3;17877:20;17874:1;17867:31;17917:4;17914:1;17907:15;17941:4;17938:1;17931:15;17957:175;17994:3;18038:4;18031:5;18027:16;18067:4;18058:7;18055:17;18052:43;;;18075:18;;:::i;:::-;18124:1;18111:15;;17957:175;-1:-1:-1;;17957:175:1:o;18137:128::-;18177:3;18208:1;18204:6;18201:1;18198:13;18195:39;;;18214:18;;:::i;:::-;-1:-1:-1;18250:9:1;;18137:128::o;18270:135::-;18309:3;-1:-1:-1;;18330:17:1;;18327:43;;;18350:18;;:::i;:::-;-1:-1:-1;18397:1:1;18386:13;;18270:135::o;19634:125::-;19674:4;19702:1;19699;19696:8;19693:34;;;19707:18;;:::i;:::-;-1:-1:-1;19744:9:1;;19634:125::o;19764:786::-;20175:25;20170:3;20163:38;20145:3;20230:6;20224:13;20246:62;20301:6;20296:2;20291:3;20287:12;20280:4;20272:6;20268:17;20246:62;:::i;:::-;-1:-1:-1;;;20367:2:1;20327:16;;;20359:11;;;20352:40;20417:13;;20439:63;20417:13;20488:2;20480:11;;20473:4;20461:17;;20439:63;:::i;:::-;20522:17;20541:2;20518:26;;19764:786;-1:-1:-1;;;;19764:786:1:o;21603:414::-;21805:2;21787:21;;;21844:2;21824:18;;;21817:30;21883:34;21878:2;21863:18;;21856:62;-1:-1:-1;;;21949:2:1;21934:18;;21927:48;22007:3;21992:19;;21603:414::o;22440:470::-;22619:3;22657:6;22651:13;22673:53;22719:6;22714:3;22707:4;22699:6;22695:17;22673:53;:::i;:::-;22789:13;;22748:16;;;;22811:57;22789:13;22748:16;22845:4;22833:17;;22811:57;:::i;:::-;22884:20;;22440:470;-1:-1:-1;;;;22440:470:1:o;26095:2213::-;-1:-1:-1;;;27345:16:1;;-1:-1:-1;;;27386:1:1;27377:11;;27370:53;27446:13;;-1:-1:-1;;27468:62:1;27446:13;27518:2;27509:12;;27502:4;27490:17;;27468:62;:::i;:::-;-1:-1:-1;;;27589:2:1;27549:16;;;27581:11;;;27574:24;27623:13;;27645:63;27623:13;27694:2;27686:11;;27679:4;27667:17;;27645:63;:::i;:::-;-1:-1:-1;;;27768:2:1;27727:17;;;;27760:11;;;27753:25;27803:13;;27825:63;27803:13;27874:2;27866:11;;27859:4;27847:17;;27825:63;:::i;:::-;-1:-1:-1;;;27907:17:1;;27948:2;27940:11;;27933:35;;;;27997:66;27992:2;27984:11;;27977:87;-1:-1:-1;;;28088:2:1;28080:11;;28073:55;-1:-1:-1;;;28294:2:1;28286:11;;25727:47;28144:158;28174:127;28200:100;28230:69;25790:12;;;28248:6;28230:69;:::i;:::-;-1:-1:-1;;;25878:59:1;;25962:2;25953:12;;25813:158;28200:100;28192:6;28174:127;:::i;:::-;-1:-1:-1;;;26041:16:1;;26082:1;26073:11;;25976:114;28313:448;28575:31;28570:3;28563:44;28545:3;28636:6;28630:13;28652:62;28707:6;28702:2;28697:3;28693:12;28686:4;28678:6;28674:17;28652:62;:::i;:::-;28734:16;;;;28752:2;28730:25;;28313:448;-1:-1:-1;;28313:448:1:o;28766:168::-;28806:7;28872:1;28868;28864:6;28860:14;28857:1;28854:21;28849:1;28842:9;28835:17;28831:45;28828:71;;;28879:18;;:::i;:::-;-1:-1:-1;28919:9:1;;28766:168::o;28939:136::-;28978:3;29006:5;28996:39;;29015:18;;:::i;:::-;-1:-1:-1;;;29051:18:1;;28939:136::o;29441:500::-;-1:-1:-1;;;;;29710:15:1;;;29692:34;;29762:15;;29757:2;29742:18;;29735:43;29809:2;29794:18;;29787:34;;;29857:3;29852:2;29837:18;;29830:31;;;29635:4;;29878:57;;29915:19;;29907:6;29878:57;:::i;:::-;29870:65;29441:500;-1:-1:-1;;;;;;29441:500:1:o;29946:249::-;30015:6;30068:2;30056:9;30047:7;30043:23;30039:32;30036:52;;;30084:1;30081;30074:12;30036:52;30116:9;30110:16;30135:30;30159:5;30135:30;:::i;31560:664::-;31787:3;31825:6;31819:13;31841:53;31887:6;31882:3;31875:4;31867:6;31863:17;31841:53;:::i;:::-;31957:13;;31916:16;;;;31979:57;31957:13;31916:16;32013:4;32001:17;;31979:57;:::i;:::-;32103:13;;32058:20;;;32125:57;32103:13;32058:20;32159:4;32147:17;;32125:57;:::i;:::-;32198:20;;31560:664;-1:-1:-1;;;;;31560:664:1:o;32229:444::-;32461:3;32499:6;32493:13;32515:53;32561:6;32556:3;32549:4;32541:6;32537:17;32515:53;:::i;:::-;-1:-1:-1;;;32590:16:1;;32615:23;;;-1:-1:-1;32665:1:1;32654:13;;32229:444;-1:-1:-1;32229:444:1:o;32678:445::-;32940:28;32935:3;32928:41;32910:3;32998:6;32992:13;33014:62;33069:6;33064:2;33059:3;33055:12;33048:4;33040:6;33036:17;33014:62;:::i;:::-;33096:16;;;;33114:2;33092:25;;32678:445;-1:-1:-1;;32678:445:1:o;33128:127::-;33189:10;33184:3;33180:20;33177:1;33170:31;33220:4;33217:1;33210:15;33244:4;33241:1;33234:15;33260:120;33300:1;33326;33316:35;;33331:18;;:::i;:::-;-1:-1:-1;33365:9:1;;33260:120::o;33385:112::-;33417:1;33443;33433:35;;33448:18;;:::i;:::-;-1:-1:-1;33482:9:1;;33385:112::o;34220:1003::-;-1:-1:-1;;;34720:61:1;;34804:13;;34702:3;;34826:62;34804:13;34876:2;34867:12;;34860:4;34848:17;;34826:62;:::i;:::-;-1:-1:-1;;;34947:2:1;34907:16;;;34939:11;;;34932:61;35018:13;;35040:65;35018:13;35089:4;35081:13;;;;35062:17;;35040:65;:::i;:::-;-1:-1:-1;;;35165:4:1;35124:17;;;;35157:13;;;35150:40;35214:2;35206:11;;34220:1003;-1:-1:-1;;;;34220:1003:1:o;35228:985::-;35591:66;35586:3;35579:79;35688:66;35683:2;35678:3;35674:12;35667:88;35785:66;35780:2;35775:3;35771:12;35764:88;35882:66;35877:2;35872:3;35868:12;35861:88;-1:-1:-1;;;35974:3:1;35969;35965:13;35958:32;35561:3;36019:6;36013:13;36035:61;36089:6;36083:3;36078;36074:13;36069:2;36061:6;36057:15;36035:61;:::i;:::-;-1:-1:-1;;;36155:3:1;36115:16;;;;36147:12;;;36140:39;-1:-1:-1;36203:3:1;36195:12;;35228:985;-1:-1:-1;35228:985:1:o;36218:127::-;36279:10;36274:3;36270:20;36267:1;36260:31;36310:4;36307:1;36300:15;36334:4;36331:1;36324:15
Swarm Source
ipfs://50ccb9ac5cf8266d96dad731eef306f5d9590606167671ce68b8faac55f94ff2
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|