Contract
0xb680b9861f73b30d86bdc248376d9566ade3fd35
1
Contract Overview
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
FantomSquadMainCollection
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2022-01-21 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.10; // Sources flattened with hardhat v2.8.2 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } // File @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require( oldAllowance >= value, "SafeERC20: decreased allowance below zero" ); uint256 newAllowance = oldAllowance - value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall( data, "SafeERC20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } // File @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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) /** * @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) /** * @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/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @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) /** * @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 v4.4.1 (token/ERC721/ERC721.sol) /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: 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/interfaces/IERC165.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) // File @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol) /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts v4.4.0 (token/common/ERC2981.sol) /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File @openzeppelin/contracts/token/ERC721/extensions/ERC721Royalty.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Royalty.sol) /** * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC721Royalty is ERC2981, ERC721 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); _resetTokenRoyalty(tokenId); } } // File @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) /** * @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) /** * @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/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) /** * @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 internal _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/token/ERC721/extensions/ERC721Pausable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) /** * @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 v4.4.1 (access/AccessControl.sol) /** * @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 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 { 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 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/proxy/Clones.sol // OpenZeppelin Contracts v4.4.1 (proxy/Clones.sol) /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore( ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000 ) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore( add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000 ) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore( ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000 ) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore( add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000 ) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { assembly { let ptr := mload(0x40) mstore( ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000 ) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore( add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000 ) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } } // File contracts/interfaces/IPaymentSplitter.sol interface IPaymentSplitter { function initialize(address[] memory payees, uint256[] memory shares_) external; function count() external view returns (uint256); function totalShares() external view returns (uint256); function totalReleased() external view returns (uint256); function totalReleased(IERC20 token) external view returns (uint256); function shares(address account) external view returns (uint256); function released(address account) external view returns (uint256); function released(IERC20 token, address account) external view returns (uint256); function payee(uint256 index) external view returns (address); function pending(address account) external view returns (uint256); function pending(IERC20 token, address account) external view returns (uint256); function release(address payable account) external; function release(IERC20 token, address account) external; } // File contracts/interfaces/IERC721Snapshot.sol interface IERC721Snapshot { function initialize(IERC721Enumerable nft) external; function holders(uint256 index) external view returns (address); function length() external view returns (uint256); } // File contracts/ERC721/ERC721.sol interface IBlockTimeTracker { function average() external view returns (uint256); } interface FSMP is IERC721Enumerable { function tokenPartner(uint256 tokenId) external returns (uint256 _partnerId); } contract FantomSquadMainCollection is ERC721Enumerable, ERC721Royalty, ERC721Pausable, AccessControl { using SafeERC20 for IERC20; using Strings for uint256; using Clones for address; using Address for address; event RoyaltyDeployed( address indexed _contract, uint256 indexed _tokenId, address indexed recipient ); event RoyaltyDistributed( address indexed _contract, uint256 indexed _tokenId ); event SnapshotComplete( address indexed _contract, address indexed _collection ); // fee settings uint256 public MINTING_FEE = 52 ether; // supply settings uint256 public MAX_SUPPLY = 2600; // 51 to account for the diamond pass // URI settings string private BASE_URI = "https://fsmp-cdn.authtokens.com/main_collection/schema/"; // Pauser role ID bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); // TokenURI Helper role ID bytes32 public constant SERVICE_ROLE = keccak256("SERVICE_ROLE"); // BlockTimeTracker for randomization IBlockTimeTracker private constant tracker = IBlockTimeTracker(0x706e05D2b47cc6B1fb615EE76DD3789d2329E22e); // Payment splitter for proxy address private constant PaymentSplitter = 0xD4247a1B968a42765a662B0405bC62B8f3Aa899e; // ERC721Snapshot for proxy address private constant SnapshotMaker = 0xFb06Be8DD9373C2B48c4E8f2a7AEcC444F0c4E05; // random seed for used in tokenURI generation uint256 private immutable RANDOM_SEED; // Christmas Squad address private constant fsx21 = 0x098AB05dC406a6b171C7B295152aeB34AfEC9c34; // Gold Mint Passes address private constant fsgmp = 0x4B128fcEA7F8fE4EA7591584554AdEB309BA0a77; // Normal/Partner Mint Passes address private constant fsmp = 0x0358382CA3455f7c9cD9B0524C9CCf7ABC4a7350; modifier overridePause() { bool wasPaused = paused(); if (wasPaused) { _unpause(); } _; if (wasPaused) { _pause(); } } IERC721Snapshot private normalSnapshot; IERC721Snapshot private goldSnapshot; bool _goldSnapshotCompleted; modifier GoldSnapshotCompleted() { require(_goldSnapshotCompleted, "gold snapshot not taken"); _; } bool _normalSnapshotCompleted; modifier NormalSnapshotCompleted() { require(_normalSnapshotCompleted, "normal snapshot not taken"); _; } uint256 public currentNormalPosition = 0; uint256 public currentGoldPosition = 0; mapping(uint256 => uint256) public tokenPartner; // holds the mapping of splits for the royalties mapping(uint256 => IPaymentSplitter) private royalties; mapping(address => uint256) private knownRoyalties; address private deployer; modifier NotDeployer() { require(_msgSender() != deployer, "deployer cannot issue this command"); _; } constructor() ERC721("FantomSquad Main Collection", "FSMC") { deployer = _msgSender(); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); _setupRole(SERVICE_ROLE, _msgSender()); _setupRole(SERVICE_ROLE, 0xe60E6506d73C15C10DF4fA90380BBc6291152c41); RANDOM_SEED = uint256( keccak256( abi.encodePacked( _msgSender(), block.timestamp, block.number, address(this), tracker.average() ) ) ); // launch in a paused state to prevent bot harvesting _pause(); } /****** SNAPSHOTTING FOR AIRDROPS ******/ /** * @dev Takes a snapshot of the current Fantom Minting Pass holders */ function takeNormalSnapshot() public onlyRole(DEFAULT_ADMIN_ROLE) { normalSnapshot = IERC721Snapshot(SnapshotMaker.clone()); normalSnapshot.initialize(IERC721Enumerable(fsmp)); _normalSnapshotCompleted = true; emit SnapshotComplete(address(normalSnapshot), fsmp); } /** * @dev Takes a snapshot of the current Fantom Gold Minting Pass holders */ function takeGoldSnapshot() public onlyRole(DEFAULT_ADMIN_ROLE) { goldSnapshot = IERC721Snapshot(SnapshotMaker.clone()); goldSnapshot.initialize(IERC721Enumerable(fsgmp)); _goldSnapshotCompleted = true; emit SnapshotComplete(address(goldSnapshot), fsgmp); } /****** AIRDROPS ******/ /** * @dev Airdrops NFTs minted to Fantom Gold Minting Pass holders - this is iterative */ function airdropGold(uint256 _count) public onlyRole(DEFAULT_ADMIN_ROLE) GoldSnapshotCompleted overridePause { uint256 count = goldSnapshot.length(); require(currentGoldPosition < count, "normal airdrop completed"); uint256 completed = 0; for ( currentGoldPosition; currentGoldPosition < count; currentGoldPosition++ ) { address owner = goldSnapshot.holders(currentGoldPosition); if (!owner.isContract()) { _mintNFT(owner, owner); completed += 1; } if (completed == _count) { // limit the batches to 10 due to gas constraints break; } } if (completed != 0) { currentGoldPosition += 1; // if we minted, we need to move ahead one so our next round doesn't mess up } } /** * @dev Airdrops NFTs minted to Fantom Minting Pass holders - this is iterative */ function airdropNormal(uint256 _count) public onlyRole(DEFAULT_ADMIN_ROLE) NormalSnapshotCompleted overridePause { uint256 count = normalSnapshot.length(); require(currentNormalPosition < count, "normal airdrop completed"); uint256 completed = 0; for ( currentNormalPosition; currentNormalPosition < count; currentNormalPosition++ ) { address owner = normalSnapshot.holders(currentNormalPosition); if (!owner.isContract()) { uint256 tokenId = _mintNFT(owner, owner); tokenPartner[tokenId] = FSMP(fsmp).tokenPartner( currentNormalPosition + 1 ); completed += 1; } if (completed == _count) { // limit the batches to 10 due to gas constraints break; } } if (completed != 0) { currentNormalPosition += 1; // if we minted, we need to move ahead one so our next round doesn't mess up } } /****** ROYALTY HANDLING ******/ /** * @dev clones the payment splitter so that we can supply a single address * (the splitter proxy) for royalty information that is distributed to two * parties (this contract and the minter) */ function _constructPaymentSplitter(uint256 tokenId, address account) internal { // if we have already constructed a payment splitter for the given // account, do not create another one, just use the existing one if (knownRoyalties[account] != 0) { royalties[tokenId] = royalties[knownRoyalties[account]]; } else { address[] memory parties = new address[](2); parties[0] = address(this); parties[1] = account; uint256[] memory shares = new uint256[](2); shares[0] = 3; shares[1] = 2; royalties[tokenId] = IPaymentSplitter(PaymentSplitter.clone()); royalties[tokenId].initialize(parties, shares); // link the account so we know about it later knownRoyalties[account] = tokenId; } emit RoyaltyDeployed(address(royalties[tokenId]), tokenId, account); } /** * @dev calls the proxy payment splitter and pays any royalties that are * currently sitting in the proxy contract to the royalty receivers * based on their held share */ function royaltyDistribute(uint256 tokenId) public { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (royaltyPending(tokenId) == 0) { return; } IPaymentSplitter splitter = royalties[tokenId]; for (uint256 i = 0; i < splitter.count(); ++i) { splitter.release(payable(splitter.payee(i))); } emit RoyaltyDistributed(address(splitter), tokenId); } /** * @dev checks if there are any royalties pending distribution for the * given tokenID */ function royaltyPending(uint256 tokenId) public view returns (uint256) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); uint256 due = 0; IPaymentSplitter splitter = royalties[tokenId]; for (uint256 i = 0; i < splitter.count(); ++i) { due += splitter.pending(splitter.payee(i)); } return due; } /****** BASIC SETTING METHODS ******/ function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } /****** FEE SETTING METHODS ******/ function setMintFee(uint256 _fee) public onlyRole(DEFAULT_ADMIN_ROLE) { MINTING_FEE = _fee; } /****** URI SETTINGS ******/ /** * @dev updates the base URI for the token metadata to the provided URI */ function setBaseURI(string memory URI) public onlyRole(DEFAULT_ADMIN_ROLE) { BASE_URI = URI; } /** * @dev Generates a masked token URI so that people cannot guess what the next * NFT result will be */ function _generateTokenURI(uint256 tokenId) internal view returns (string memory) { return uint256( keccak256( abi.encodePacked(RANDOM_SEED.toString(), tokenId.toString()) ) ).toHexString(32); } /** * @dev the metadata URI for the provided token Id */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); return string( abi.encodePacked(BASE_URI, _generateTokenURI(tokenId), ".json") ); } /** * @dev returns the token masked URI for the given token Id */ function tokenMaskedURI(uint256 tokenId) public view onlyRole(SERVICE_ROLE) returns (string memory) { return _generateTokenURI(tokenId); } /****** GENERAL OPERATION METHODS ******/ /** * @dev checks to make sure that the specified account currently * has a mintpass or a christmas bat in their wallet */ function passHolder(address account) public view returns (bool) { uint256 balance = IERC721Enumerable(fsx21).balanceOf(account); balance += IERC721Enumerable(fsmp).balanceOf(account); balance += IERC721Enumerable(fsgmp).balanceOf(account); return (balance != 0); } /** * @dev standard mint function that regular users call while * paying the appropriate mint fee to mint a NFT */ function mint() public payable returns (uint256) { require(msg.value == MINTING_FEE, "Wrong amount of FTM sent"); bool _passHolder = passHolder(_msgSender()); if (paused()) { // if we are paused and they don't hold a mintpass or xmas nft, fail require(_passHolder, "ERC721: contract paused"); } bool wasPaused = paused(); if (_passHolder && wasPaused) { _paused = false; } uint256 tokenId = _mintNFT(_msgSender(), _msgSender()); if (_passHolder && wasPaused) { _paused = true; } return tokenId; } /** * @dev mint process for admins only that allows overriding the * requirement for paying for the mint, allows minting while paused, * and mints the NFT directly to the wallet address specified */ function mintAdmin(address _to) public onlyRole(DEFAULT_ADMIN_ROLE) overridePause returns (uint256) { return _mintNFT(_to, _to); } /** * @dev mint a batch of the count size sent to the provided address. * Like the mintAdmin, this overrides the requirement for paying for * the mints, allows minting while paused, and mints the NFTs directly * to the wallet address specified */ function mintBatch(uint256 count, address _to) public onlyRole(DEFAULT_ADMIN_ROLE) overridePause returns (uint256[] memory) { uint256[] memory tokenIds = new uint256[](count); for (uint256 i = 0; i < count; ++i) { tokenIds[i] = _mintNFT(_to, _to); } return tokenIds; } /** * @dev Internal mint NFT method to sets up the actual NFT */ function _mintNFT(address _to, address _royaltyReceiver) internal returns (uint256) { uint256 supply = totalSupply(); require(supply + 1 <= MAX_SUPPLY, "mint completed"); uint256 tokenId = supply + 1; _constructPaymentSplitter(tokenId, _royaltyReceiver); _safeMint(_to, tokenId); _setTokenRoyalty(tokenId, address(royalties[tokenId]), 500); // @ 500 basis points (5%) return tokenId; } /** * @dev sends the full balance held by this contract to the caller */ function withdraw() public onlyRole(DEFAULT_ADMIN_ROLE) NotDeployer { require(address(this).balance != 0, "contract has no balance"); payable(_msgSender()).transfer(address(this).balance); } /** * @dev sends the full balance of the given token held by this contract to the caller */ function withdraw(IERC20 token) public onlyRole(DEFAULT_ADMIN_ROLE) NotDeployer { require( token.balanceOf(address(this)) != 0, "contract has no balance of token" ); token.safeTransfer(_msgSender(), token.balanceOf(address(this))); } receive() external payable {} /****** INTERNAL OVERRIDES ******/ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721Royalty) { super._burn(tokenId); } function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, ERC721, ERC721Enumerable, ERC721Royalty) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"_contract","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"RoyaltyDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"RoyaltyDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":true,"internalType":"address","name":"_collection","type":"address"}],"name":"SnapshotComplete","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":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTING_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"airdropGold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"airdropNormal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentGoldPosition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentNormalPosition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"mintBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"account","type":"address"}],"name":"passHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"royaltyDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"royaltyPending","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":"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":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"takeGoldSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"takeNormalSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenMaskedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"","type":"uint256"}],"name":"tokenPartner","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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6802d1a51c7e00500000600e55610a28600f55610100604052603760a08181529062005d6960c03980516200003d91601091602090910190620003aa565b50600060135560006014553480156200005557600080fd5b50604080518082018252601b81527f46616e746f6d5371756164204d61696e20436f6c6c656374696f6e000000000060208083019182528351808501909452600484526346534d4360e01b908401528151919291620000b791600291620003aa565b508051620000cd906003906020840190620003aa565b5050600c805460ff1916905550601880546001600160a01b03191633908117909155620000fd9060009062000258565b620001297f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a3362000258565b6200014460008051602062005d498339815191523362000258565b6200017360008051602062005d4983398151915273e60e6506d73c15c10df4fa90380bbc6291152c4162000258565b3342433073706e05d2b47cc6b1fb615ee76dd3789d2329e22e6001600160a01b031663b250717a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f0919062000450565b6040516001600160601b0319606096871b8116602083015260348201959095526054810193909352931b9091166074820152608881019190915260a80160408051601f1981840301815291905280516020909101206080526200025262000268565b620004a7565b62000264828262000306565b5050565b600c5460ff1615620002b35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002e93390565b6040516001600160a01b03909116815260200160405180910390a1565b6000828152600d602090815260408083206001600160a01b038516845290915290205460ff1662000264576000828152600d602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620003663390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b828054620003b8906200046a565b90600052602060002090601f016020900481019282620003dc576000855562000427565b82601f10620003f757805160ff191683800117855562000427565b8280016001018555821562000427579182015b82811115620004275782518255916020019190600101906200040a565b506200043592915062000439565b5090565b5b808211156200043557600081556001016200043a565b6000602082840312156200046357600080fd5b5051919050565b600181811c908216806200047f57607f821691505b60208210811415620004a157634e487b7160e01b600052602260045260246000fd5b50919050565b608051615886620004c3600039600061357601526158866000f3fe6080604052600436106103175760003560e01c80635c975abb1161019a578063a22cb465116100e1578063d0888d441161008a578063e63ab1e911610064578063e63ab1e91461090c578063e985e9c514610940578063eddd0d9c1461099657600080fd5b8063d0888d44146108b6578063d547741f146108d6578063d642b4b1146108f657600080fd5b8063b88d4fde116100bb578063b88d4fde14610849578063bc4f1a7e14610869578063c87b56dd1461089657600080fd5b8063a22cb465146107fe578063ab22f5911461081e578063b32d08111461083457600080fd5b80638cd0c0431161014357806395d89b411161011d57806395d89b41146107a0578063a20e7d47146107b5578063a217fddf146107e957600080fd5b80638cd0c0431461071857806391d148541461072d5780639391d1ac1461078057600080fd5b806370a082311161017457806370a08231146106c3578063808fd37b146106e35780638456cb591461070357600080fd5b80635c975abb146106755780636352211e1461068d5780636dfac00e146106ad57600080fd5b806332cb6b0c1161025e5780634f6ccce71161020757806355f804b3116101e157806355f804b3146106155780635604b26d146106355780635b5973061461065557600080fd5b80634f6ccce7146105a8578063518ada07146105c857806351cff8d9146105f557600080fd5b80633f4ba83a116102385780633f4ba83a1461055357806342842e0e14610568578063487458511461058857600080fd5b806332cb6b0c1461050857806336568abe1461051e5780633ccfd60b1461053e57600080fd5b80631964c68c116102c05780632a55205a1161029a5780632a55205a1461047c5780632f2ff15d146104c85780632f745c59146104e857600080fd5b80631964c68c1461040c57806323b872dd1461042c578063248a9ca31461044c57600080fd5b8063095ea7b3116102f1578063095ea7b3146103bf5780631249c58b146103e157806318160ddd146103f757600080fd5b806301ffc9a71461032357806306fdde0314610358578063081812fc1461037a57600080fd5b3661031e57005b600080fd5b34801561032f57600080fd5b5061034361033e366004614f35565b6109b6565b60405190151581526020015b60405180910390f35b34801561036457600080fd5b5061036d6109c7565b60405161034f9190614fc8565b34801561038657600080fd5b5061039a610395366004614fdb565b610a59565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034f565b3480156103cb57600080fd5b506103df6103da366004615016565b610b38565b005b6103e9610cc5565b60405190815260200161034f565b34801561040357600080fd5b50600a546103e9565b34801561041857600080fd5b506103e9610427366004614fdb565b610e4f565b34801561043857600080fd5b506103df610447366004615042565b6110e6565b34801561045857600080fd5b506103e9610467366004614fdb565b6000908152600d602052604090206001015490565b34801561048857600080fd5b5061049c610497366004615083565b611187565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161034f565b3480156104d457600080fd5b506103df6104e33660046150a5565b61127e565b3480156104f457600080fd5b506103e9610503366004615016565b6112a4565b34801561051457600080fd5b506103e9600f5481565b34801561052a57600080fd5b506103df6105393660046150a5565b611373565b34801561054a57600080fd5b506103df611426565b34801561055f57600080fd5b506103df611583565b34801561057457600080fd5b506103df610583366004615042565b6115b9565b34801561059457600080fd5b5061036d6105a3366004614fdb565b6115d4565b3480156105b457600080fd5b506103e96105c3366004614fdb565b611613565b3480156105d457600080fd5b506103e96105e3366004614fdb565b60156020526000908152604090205481565b34801561060157600080fd5b506103df6106103660046150d5565b6116d1565b34801561062157600080fd5b506103df6106303660046151b5565b61193f565b34801561064157600080fd5b506103df610650366004614fdb565b61195e565b34801561066157600080fd5b506103436106703660046150d5565b611c2a565b34801561068157600080fd5b50600c5460ff16610343565b34801561069957600080fd5b5061039a6106a8366004614fdb565b611e38565b3480156106b957600080fd5b506103e960145481565b3480156106cf57600080fd5b506103e96106de3660046150d5565b611eea565b3480156106ef57600080fd5b506103df6106fe366004614fdb565b611fb8565b34801561070f57600080fd5b506103df61234f565b34801561072457600080fd5b506103df612382565b34801561073957600080fd5b506103436107483660046150a5565b6000918252600d6020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561078c57600080fd5b506103df61079b366004614fdb565b612506565b3480156107ac57600080fd5b5061036d6127d3565b3480156107c157600080fd5b506103e97fd8a7a79547af723ee3e12b59a480111268d8969c634e1a34a144d2c8b91d635b81565b3480156107f557600080fd5b506103e9600081565b34801561080a57600080fd5b506103df61081936600461520c565b6127e2565b34801561082a57600080fd5b506103e960135481565b34801561084057600080fd5b506103df6127ed565b34801561085557600080fd5b506103df61086436600461523a565b612971565b34801561087557600080fd5b506108896108843660046150a5565b612a19565b60405161034f91906152f5565b3480156108a257600080fd5b5061036d6108b1366004614fdb565b612ae7565b3480156108c257600080fd5b506103e96108d13660046150d5565b612bcd565b3480156108e257600080fd5b506103df6108f13660046150a5565b612c19565b34801561090257600080fd5b506103e9600e5481565b34801561091857600080fd5b506103e97f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b34801561094c57600080fd5b5061034361095b366004615308565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156109a257600080fd5b506103df6109b1366004614fdb565b612c3f565b60006109c182612c51565b92915050565b6060600280546109d690615336565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0290615336565b8015610a4f5780601f10610a2457610100808354040283529160200191610a4f565b820191906000526020600020905b815481529060010190602001808311610a3257829003601f168201915b5050505050905090565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16610b0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610b4382611e38565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b06565b3373ffffffffffffffffffffffffffffffffffffffff82161480610c2a5750610c2a813361095b565b610cb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b06565b610cc08383612ca7565b505050565b6000600e543414610d32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f57726f6e6720616d6f756e74206f662046544d2073656e7400000000000000006044820152606401610b06565b6000610d3d33611c2a565b9050610d4b600c5460ff1690565b15610db75780610db7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4552433732313a20636f6e7472616374207061757365640000000000000000006044820152606401610b06565b6000610dc5600c5460ff1690565b9050818015610dd15750805b15610dff57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b6000610e0b3333612d47565b9050828015610e175750815b15610e4857600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b9392505050565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16610f00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b06565b60008281526016602052604081205473ffffffffffffffffffffffffffffffffffffffff16815b8173ffffffffffffffffffffffffffffffffffffffff166306661abd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f969190615384565b8110156110dd576040517f8b83209b0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff831690635eebea20908290638b83209b90602401602060405180830381865afa158015611010573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611034919061539d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa15801561109d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c19190615384565b6110cb90846153e9565b92506110d681615401565b9050610f27565b50909392505050565b6110f03382612e2a565b61117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b06565b610cc0838383612f96565b600082815260016020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff1692820192909252829161124257506040805180820190915260005473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b602081015160009061271090611266906bffffffffffffffffffffffff168761543a565b61127091906154a6565b915196919550909350505050565b6000828152600d602052604090206001015461129a8133613208565b610cc083836132da565b60006112af83611eea565b821061133d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b06565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b73ffffffffffffffffffffffffffffffffffffffff81163314611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610b06565b61142282826133ce565b5050565b60006114328133613208565b60185473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156114f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f6465706c6f7965722063616e6e6f74206973737565207468697320636f6d6d6160448201527f6e640000000000000000000000000000000000000000000000000000000000006064820152608401610b06565b47611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f636f6e747261637420686173206e6f2062616c616e63650000000000000000006044820152606401610b06565b60405133904780156108fc02916000818181858888f19350505050158015611422573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6115ae8133613208565b6115b6613489565b50565b610cc083838360405180602001604052806000815250612971565b60607fd8a7a79547af723ee3e12b59a480111268d8969c634e1a34a144d2c8b91d635b6116018133613208565b61160a8361356a565b91505b50919050565b600061161e600a5490565b82106116ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b06565b600a82815481106116bf576116bf6154ba565b90600052602060002001549050919050565b60006116dd8133613208565b60185473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f6465706c6f7965722063616e6e6f74206973737565207468697320636f6d6d6160448201527f6e640000000000000000000000000000000000000000000000000000000000006064820152608401610b06565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118299190615384565b61188f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f636f6e747261637420686173206e6f2062616c616e6365206f6620746f6b656e6044820152606401610b06565b611422336040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa1580156118fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119219190615384565b73ffffffffffffffffffffffffffffffffffffffff851691906135f0565b600061194b8133613208565b8151610cc0906010906020850190614e6e565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16611a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b06565b611a1881610e4f565b611a1f5750565b60008181526016602052604081205473ffffffffffffffffffffffffffffffffffffffff16905b8173ffffffffffffffffffffffffffffffffffffffff166306661abd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab59190615384565b811015611be2576040517f8b83209b0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906319165587908290638b83209b90602401602060405180830381865afa158015611b2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b53919061539d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401600060405180830381600087803b158015611bb957600080fd5b505af1158015611bcd573d6000803e3d6000fd5b5050505080611bdb90615401565b9050611a46565b50604051829073ffffffffffffffffffffffffffffffffffffffff8316907fc34f30165071f2be6258315cf60279fa343e720cdf6a8b91c1660270d201ea6d90600090a35050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152600090819073098ab05dc406a6b171c7b295152aeb34afec9c34906370a0823190602401602060405180830381865afa158015611cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd19190615384565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152909150730358382ca3455f7c9cd9b0524c9ccf7abc4a7350906370a0823190602401602060405180830381865afa158015611d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d769190615384565b611d8090826153e9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152909150734b128fcea7f8fe4ea7591584554adeb309ba0a77906370a0823190602401602060405180830381865afa158015611e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e259190615384565b611e2f90826153e9565b15159392505050565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16806109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b06565b600073ffffffffffffffffffffffffffffffffffffffff8216611f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b06565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b6000611fc48133613208565b6012547501000000000000000000000000000000000000000000900460ff16612049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6e6f726d616c20736e617073686f74206e6f742074616b656e000000000000006044820152606401610b06565b6000612057600c5460ff1690565b9050801561206757612067613489565b601154604080517f1f7b6d32000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691631f7b6d329160048083019260209291908290030181865afa1580156120d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120fb9190615384565b90508060135410612168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6e6f726d616c2061697264726f7020636f6d706c6574656400000000000000006044820152606401610b06565b60005b816013541015612320576011546013546040517f2a11ced0000000000000000000000000000000000000000000000000000000008152600481019190915260009173ffffffffffffffffffffffffffffffffffffffff1690632a11ced090602401602060405180830381865afa1580156121e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220d919061539d565b905073ffffffffffffffffffffffffffffffffffffffff81163b6122f75760006122378283612d47565b9050730358382ca3455f7c9cd9b0524c9ccf7abc4a735073ffffffffffffffffffffffffffffffffffffffff1663518ada07601354600161227891906153e9565b6040518263ffffffff1660e01b815260040161229691815260200190565b6020604051808303816000875af11580156122b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d99190615384565b6000828152601560205260409020556122f36001846153e9565b9250505b858214156123055750612320565b506013805490600061231683615401565b919050555061216b565b801561233f5760016013600082825461233991906153e9565b90915550505b50508015610cc057610cc061367d565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61237a8133613208565b6115b661367d565b600061238e8133613208565b6123ab73fb06be8dd9373c2b48c4e8f2a7aecc444f0c4e0561373d565b601280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691821790556040517fc4d66de8000000000000000000000000000000000000000000000000000000008152734b128fcea7f8fe4ea7591584554adeb309ba0a77600482015263c4d66de890602401600060405180830381600087803b15801561245257600080fd5b505af1158015612466573d6000803e3d6000fd5b5050601280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff81167401000000000000000000000000000000000000000017909155604051734b128fcea7f8fe4ea7591584554adeb309ba0a77935073ffffffffffffffffffffffffffffffffffffffff90911691507f42731d26336a8a9290f9f66157c245c1818d806e34c76dd18d3472fc5bdac54890600090a350565b60006125128133613208565b60125474010000000000000000000000000000000000000000900460ff16612596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f676f6c6420736e617073686f74206e6f742074616b656e0000000000000000006044820152606401610b06565b60006125a4600c5460ff1690565b905080156125b4576125b4613489565b601254604080517f1f7b6d32000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691631f7b6d329160048083019260209291908290030181865afa158015612624573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126489190615384565b905080601454106126b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6e6f726d616c2061697264726f7020636f6d706c6574656400000000000000006044820152606401610b06565b60005b8160145410156127ba576012546014546040517f2a11ced0000000000000000000000000000000000000000000000000000000008152600481019190915260009173ffffffffffffffffffffffffffffffffffffffff1690632a11ced090602401602060405180830381865afa158015612736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275a919061539d565b905073ffffffffffffffffffffffffffffffffffffffff81163b612791576127828182612d47565b5061278e6001836153e9565b91505b8582141561279f57506127ba565b50601480549060006127b083615401565b91905055506126b8565b801561233f5760016014600082825461233991906153e9565b6060600380546109d690615336565b61142233838361381f565b60006127f98133613208565b61281673fb06be8dd9373c2b48c4e8f2a7aecc444f0c4e0561373d565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691821790556040517fc4d66de8000000000000000000000000000000000000000000000000000000008152730358382ca3455f7c9cd9b0524c9ccf7abc4a7350600482015263c4d66de890602401600060405180830381600087803b1580156128bd57600080fd5b505af11580156128d1573d6000803e3d6000fd5b5050601280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555050601154604051730358382ca3455f7c9cd9b0524c9ccf7abc4a73509173ffffffffffffffffffffffffffffffffffffffff16907f42731d26336a8a9290f9f66157c245c1818d806e34c76dd18d3472fc5bdac54890600090a350565b61297b3383612e2a565b612a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b06565b612a138484848461394d565b50505050565b60606000612a278133613208565b6000612a35600c5460ff1690565b90508015612a4557612a45613489565b60008567ffffffffffffffff811115612a6057612a606150f2565b604051908082528060200260200182016040528015612a89578160200160208202803683370190505b50905060005b86811015612ace57612aa18687612d47565b828281518110612ab357612ab36154ba565b6020908102919091010152612ac781615401565b9050612a8f565b5092508015612adf57612adf61367d565b505092915050565b60008181526004602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16612b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b06565b6010612ba68361356a565b604051602001612bb7929190615505565b6040516020818303038152906040529050919050565b600080612bda8133613208565b6000612be8600c5460ff1690565b90508015612bf857612bf8613489565b612c028485612d47565b92508015612c1257612c1261367d565b5050919050565b6000828152600d6020526040902060010154612c358133613208565b610cc083836133ce565b6000612c4b8133613208565b50600e55565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806109c157506109c1826139f0565b600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190612d0182611e38565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612d53600a5490565b600f54909150612d648260016153e9565b1115612dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6d696e7420636f6d706c657465640000000000000000000000000000000000006044820152606401610b06565b6000612dd98260016153e9565b9050612de581856139fb565b612def8582613cfb565b600081815260166020526040902054612e2290829073ffffffffffffffffffffffffffffffffffffffff166101f4613d15565b949350505050565b60008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16612edb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b06565b6000612ee683611e38565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f5557508373ffffffffffffffffffffffffffffffffffffffff16612f3d84610a59565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e22575073ffffffffffffffffffffffffffffffffffffffff80821660009081526007602090815260408083209388168352929052205460ff16612e22565b8273ffffffffffffffffffffffffffffffffffffffff16612fb682611e38565b73ffffffffffffffffffffffffffffffffffffffff1614613059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610b06565b73ffffffffffffffffffffffffffffffffffffffff82166130fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b06565b613106838383613e9f565b613111600082612ca7565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260056020526040812080546001929061314790849061560f565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604081208054600192906131829084906153e9565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000828152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611422576132608173ffffffffffffffffffffffffffffffffffffffff166014613eaa565b61326b836020613eaa565b60405160200161327c929190615626565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610b0691600401614fc8565b6000828152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611422576000828152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556133703390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615611422576000828152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600c5460ff166134f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b06565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60606109c1602061359a7f00000000000000000000000000000000000000000000000000000000000000006140ed565b6135a3856140ed565b6040516020016135b49291906156a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090613eaa565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610cc090849061421f565b600c5460ff16156136ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b06565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586135403390565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff811661381a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f455243313136373a20637265617465206661696c6564000000000000000000006044820152606401610b06565b919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b06565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526007602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613958848484612f96565b6139648484848461432b565b612a13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b06565b60006109c18261451b565b73ffffffffffffffffffffffffffffffffffffffff811660009081526017602052604090205415613a905773ffffffffffffffffffffffffffffffffffffffff8082166000908152601760209081526040808320548352601690915280822054858352912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055613ca2565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613ac557613ac56154ba565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508181600181518110613b1357613b136154ba565b73ffffffffffffffffffffffffffffffffffffffff929092166020928302919091018201526040805160028082526060820183526000939192909183019080368337019050509050600381600081518110613b7057613b706154ba565b602002602001018181525050600281600181518110613b9157613b916154ba565b6020908102919091010152613bb973d4247a1b968a42765a662b0405bc62b8f3aa899e61373d565b6000858152601660205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff939093169283179055517f7fbbe46f000000000000000000000000000000000000000000000000000000008152637fbbe46f90613c4590859085906004016156d6565b600060405180830381600087803b158015613c5f57600080fd5b505af1158015613c73573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff841660009081526017602052604090208590555050505b60008281526016602052604080822054905173ffffffffffffffffffffffffffffffffffffffff808516938693909116917fafa098bd63d0c6b0ddc6f328aba242372f2fe7974da70f45af0745ce98162f5c9190a45050565b611422828260405180602001604052806000815250614571565b6127106bffffffffffffffffffffffff82161115613db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610b06565b73ffffffffffffffffffffffffffffffffffffffff8216613e32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610b06565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff93841681526bffffffffffffffffffffffff9283166020808301918252600096875260019052919094209351905190911674010000000000000000000000000000000000000000029116179055565b610cc0838383614614565b60606000613eb983600261543a565b613ec49060026153e9565b67ffffffffffffffff811115613edc57613edc6150f2565b6040519080825280601f01601f191660200182016040528015613f06576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613f3d57613f3d6154ba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613fa057613fa06154ba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000613fdc84600261543a565b613fe79060016153e9565b90505b6001811115614084577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110614028576140286154ba565b1a60f81b82828151811061403e5761403e6154ba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361407d81615743565b9050613fea565b508315610e48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b06565b60608161412d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115614157578061414181615401565b91506141509050600a836154a6565b9150614131565b60008167ffffffffffffffff811115614172576141726150f2565b6040519080825280601f01601f19166020018201604052801561419c576020820181803683370190505b5090505b8415612e22576141b160018361560f565b91506141be600a86615778565b6141c99060306153e9565b60f81b8183815181106141de576141de6154ba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350614218600a866154a6565b94506141a0565b6000614281826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166146b29092919063ffffffff16565b805190915015610cc0578080602001905181019061429f919061578c565b610cc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b06565b600073ffffffffffffffffffffffffffffffffffffffff84163b15614510576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906143a29033908990889088906004016157a9565b6020604051808303816000875af19250505080156143fb575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526143f8918101906157e8565b60015b6144c5573d808015614429576040519150601f19603f3d011682016040523d82523d6000602084013e61442e565b606091505b5080516144bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b06565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612e22565b506001949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806109c157506109c1826146c1565b61457b8383614763565b614588600084848461432b565b610cc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b06565b61461f838383614931565b600c5460ff1615610cc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201527f68696c65207061757365640000000000000000000000000000000000000000006064820152608401610b06565b6060612e228484600085614a37565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061475457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806109c157506109c182614bcd565b73ffffffffffffffffffffffffffffffffffffffff82166147e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b06565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff161561486c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b06565b61487860008383613e9f565b73ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604081208054600192906148ae9084906153e9565b909155505060008181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b73ffffffffffffffffffffffffffffffffffffffff83166149995761499481600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b6149d6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146149d6576149d68382614c64565b73ffffffffffffffffffffffffffffffffffffffff82166149fa57610cc081614d1b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610cc057610cc08282614dca565b606082471015614ac9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b06565b73ffffffffffffffffffffffffffffffffffffffff85163b614b47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b06565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051614b709190615805565b60006040518083038185875af1925050503d8060008114614bad576040519150601f19603f3d011682016040523d82523d6000602084013e614bb2565b606091505b5091509150614bc2828286614e1b565b979650505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806109c157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146109c1565b60006001614c7184611eea565b614c7b919061560f565b600083815260096020526040902054909150808214614cdb5773ffffffffffffffffffffffffffffffffffffffff841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b50600091825260096020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600881528383209183525290812055565b600a54600090614d2d9060019061560f565b6000838152600b6020526040812054600a8054939450909284908110614d5557614d556154ba565b9060005260206000200154905080600a8381548110614d7657614d766154ba565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a805480614dae57614dae615821565b6001900381819060005260206000200160009055905550505050565b6000614dd583611eea565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b60608315614e2a575081610e48565b825115614e3a5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b069190614fc8565b828054614e7a90615336565b90600052602060002090601f016020900481019282614e9c5760008555614ee2565b82601f10614eb557805160ff1916838001178555614ee2565b82800160010185558215614ee2579182015b82811115614ee2578251825591602001919060010190614ec7565b50614eee929150614ef2565b5090565b5b80821115614eee5760008155600101614ef3565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146115b657600080fd5b600060208284031215614f4757600080fd5b8135610e4881614f07565b60005b83811015614f6d578181015183820152602001614f55565b83811115612a135750506000910152565b60008151808452614f96816020860160208601614f52565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610e486020830184614f7e565b600060208284031215614fed57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146115b657600080fd5b6000806040838503121561502957600080fd5b823561503481614ff4565b946020939093013593505050565b60008060006060848603121561505757600080fd5b833561506281614ff4565b9250602084013561507281614ff4565b929592945050506040919091013590565b6000806040838503121561509657600080fd5b50508035926020909101359150565b600080604083850312156150b857600080fd5b8235915060208301356150ca81614ff4565b809150509250929050565b6000602082840312156150e757600080fd5b8135610e4881614ff4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561513c5761513c6150f2565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615182576151826150f2565b8160405280935085815286868601111561519b57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156151c757600080fd5b813567ffffffffffffffff8111156151de57600080fd5b8201601f810184136151ef57600080fd5b612e2284823560208401615121565b80151581146115b657600080fd5b6000806040838503121561521f57600080fd5b823561522a81614ff4565b915060208301356150ca816151fe565b6000806000806080858703121561525057600080fd5b843561525b81614ff4565b9350602085013561526b81614ff4565b925060408501359150606085013567ffffffffffffffff81111561528e57600080fd5b8501601f8101871361529f57600080fd5b6152ae87823560208401615121565b91505092959194509250565b600081518084526020808501945080840160005b838110156152ea578151875295820195908201906001016152ce565b509495945050505050565b602081526000610e4860208301846152ba565b6000806040838503121561531b57600080fd5b823561532681614ff4565b915060208301356150ca81614ff4565b600181811c9082168061534a57607f821691505b6020821081141561160d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006020828403121561539657600080fd5b5051919050565b6000602082840312156153af57600080fd5b8151610e4881614ff4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156153fc576153fc6153ba565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615433576154336153ba565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615472576154726153ba565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826154b5576154b5615477565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081516154fb818560208601614f52565b9290920192915050565b600080845481600182811c91508083168061552157607f831692505b602080841082141561555a577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561556e576001811461559d576155ca565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506155ca565b60008b81526020902060005b868110156155c25781548b8201529085019083016155a9565b505084890196505b5050505050506156066155dd82866154e9565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b600082821015615621576156216153ba565b500390565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161565e816017850160208801614f52565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161569b816028840160208801614f52565b01602801949350505050565b600083516156b9818460208801614f52565b8351908301906156cd818360208801614f52565b01949350505050565b604080825283519082018190526000906020906060840190828701845b8281101561572557815173ffffffffffffffffffffffffffffffffffffffff16845292840192908401906001016156f3565b5050508381038285015261573981866152ba565b9695505050505050565b600081615752576157526153ba565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60008261578757615787615477565b500690565b60006020828403121561579e57600080fd5b8151610e48816151fe565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526157396080830184614f7e565b6000602082840312156157fa57600080fd5b8151610e4881614f07565b60008251615817818460208701614f52565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220036c7b32c2160a977cad397617200354d5547daa028ca661da6f2e696b0298f164736f6c634300080b0033d8a7a79547af723ee3e12b59a480111268d8969c634e1a34a144d2c8b91d635b68747470733a2f2f66736d702d63646e2e61757468746f6b656e732e636f6d2f6d61696e5f636f6c6c656374696f6e2f736368656d612f
Deployed ByteCode Sourcemap
78559:15901:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94198:259;;;;;;;;;;-1:-1:-1;94198:259:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;94198:259:0;;;;;;;;30642:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32335:308::-;;;;;;;;;;-1:-1:-1;32335:308:0;;;;;:::i;:::-;;:::i;:::-;;;1831:42:1;1819:55;;;1801:74;;1789:2;1774:18;32335:308:0;1655:226:1;31858:411:0;;;;;;;;;;-1:-1:-1;31858:411:0;;;;;:::i;:::-;;:::i;:::-;;90669:666;;;:::i;:::-;;;2511:25:1;;;2499:2;2484:18;90669:666:0;2365:177:1;53234:113:0;;;;;;;;;;-1:-1:-1;53322:10:0;:17;53234:113;;87743:441;;;;;;;;;;-1:-1:-1;87743:441:0;;;;;:::i;:::-;;:::i;33254:376::-;;;;;;;;;;-1:-1:-1;33254:376:0;;;;;:::i;:::-;;:::i;69262:123::-;;;;;;;;;;-1:-1:-1;69262:123:0;;;;;:::i;:::-;69328:7;69355:12;;;:6;:12;;;;;:22;;;;69262:123;46201:490;;;;;;;;;;-1:-1:-1;46201:490:0;;;;;:::i;:::-;;:::i;:::-;;;;3832:42:1;3820:55;;;3802:74;;3907:2;3892:18;;3885:34;;;;3775:18;46201:490:0;3628:297:1;69647:188:0;;;;;;;;;;-1:-1:-1;69647:188:0;;;;;:::i;:::-;;:::i;52815:343::-;;;;;;;;;;-1:-1:-1;52815:343:0;;;;;:::i;:::-;;:::i;79272:32::-;;;;;;;;;;;;;;;;70777:287;;;;;;;;;;-1:-1:-1;70777:287:0;;;;;:::i;:::-;;:::i;93087:215::-;;;;;;;;;;;;;:::i;88318:77::-;;;;;;;;;;;;;:::i;33701:185::-;;;;;;;;;;-1:-1:-1;33701:185:0;;;;;:::i;:::-;;:::i;89820:193::-;;;;;;;;;;-1:-1:-1;89820:193:0;;;;;:::i;:::-;;:::i;53424:320::-;;;;;;;;;;-1:-1:-1;53424:320:0;;;;;:::i;:::-;;:::i;81275:47::-;;;;;;;;;;-1:-1:-1;81275:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;93419:325;;;;;;;;;;-1:-1:-1;93419:325:0;;;;;:::i;:::-;;:::i;88692:108::-;;;;;;;;;;-1:-1:-1;88692:108:0;;;;;:::i;:::-;;:::i;87104:515::-;;;;;;;;;;-1:-1:-1;87104:515:0;;;;;:::i;:::-;;:::i;90216:307::-;;;;;;;;;;-1:-1:-1;90216:307:0;;;;;:::i;:::-;;:::i;59944:86::-;;;;;;;;;;-1:-1:-1;60015:7:0;;;;59944:86;;30249:326;;;;;;;;;;-1:-1:-1;30249:326:0;;;;;:::i;:::-;;:::i;81228:38::-;;;;;;;;;;;;;;;;29892:295;;;;;;;;;;-1:-1:-1;29892:295:0;;;;;:::i;:::-;;:::i;84499:1149::-;;;;;;;;;;-1:-1:-1;84499:1149:0;;;;;:::i;:::-;;:::i;88237:73::-;;;;;;;;;;;;;:::i;82968:298::-;;;;;;;;;;;;;:::i;68106:180::-;;;;;;;;;;-1:-1:-1;68106:180:0;;;;;:::i;:::-;68220:4;68249:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;;;;68106:180;83414:974;;;;;;;;;;-1:-1:-1;83414:974:0;;;;;:::i;:::-;;:::i;30811:104::-;;;;;;;;;;;;;:::i;79599:64::-;;;;;;;;;;;;79638:25;79599:64;;67121:49;;;;;;;;;;-1:-1:-1;67121:49:0;67166:4;67121:49;;32715:187;;;;;;;;;;-1:-1:-1;32715:187:0;;;;;:::i;:::-;;:::i;81181:40::-;;;;;;;;;;;;;;;;82558:306;;;;;;;;;;;;;:::i;33957:365::-;;;;;;;;;;-1:-1:-1;33957:365:0;;;;;:::i;:::-;;:::i;92046:367::-;;;;;;;;;;-1:-1:-1;92046:367:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;89340:389::-;;;;;;;;;;-1:-1:-1;89340:389:0;;;;;:::i;:::-;;:::i;91571:185::-;;;;;;;;;;-1:-1:-1;91571:185:0;;;;;:::i;:::-;;:::i;70080:190::-;;;;;;;;;;-1:-1:-1;70080:190:0;;;;;:::i;:::-;;:::i;79202:37::-;;;;;;;;;;;;;;;;79496:62;;;;;;;;;;;;79534:24;79496:62;;32973:214;;;;;;;;;;-1:-1:-1;32973:214:0;;;;;:::i;:::-;33144:25;;;;33115:4;33144:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32973:214;88446:107;;;;;;;;;;-1:-1:-1;88446:107:0;;;;;:::i;:::-;;:::i;94198:259::-;94384:4;94413:36;94437:11;94413:23;:36::i;:::-;94406:43;94198:259;-1:-1:-1;;94198:259:0:o;30642:100::-;30696:13;30729:5;30722:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30642:100;:::o;32335:308::-;32456:7;35958:16;;;:7;:16;;;;;;:30;:16;32481:110;;;;;;;9481:2:1;32481:110:0;;;9463:21:1;9520:2;9500:18;;;9493:30;9559:34;9539:18;;;9532:62;9630:14;9610:18;;;9603:42;9662:19;;32481:110:0;;;;;;;;;-1:-1:-1;32611:24:0;;;;:15;:24;;;;;;;;;32335:308::o;31858:411::-;31939:13;31955:23;31970:7;31955:14;:23::i;:::-;31939:39;;32003:5;31997:11;;:2;:11;;;;31989:57;;;;;;;9894:2:1;31989:57:0;;;9876:21:1;9933:2;9913:18;;;9906:30;9972:34;9952:18;;;9945:62;10043:3;10023:18;;;10016:31;10064:19;;31989:57:0;9692:397:1;31989:57:0;24818:10;32081:21;;;;;:62;;-1:-1:-1;32106:37:0;32123:5;24818:10;32973:214;:::i;32106:37::-;32059:168;;;;;;;10296:2:1;32059:168:0;;;10278:21:1;10335:2;10315:18;;;10308:30;10374:34;10354:18;;;10347:62;10445:26;10425:18;;;10418:54;10489:19;;32059:168:0;10094:420:1;32059:168:0;32240:21;32249:2;32253:7;32240:8;:21::i;:::-;31928:341;31858:411;;:::o;90669:666::-;90709:7;90750:11;;90737:9;:24;90729:61;;;;;;;10721:2:1;90729:61:0;;;10703:21:1;10760:2;10740:18;;;10733:30;10799:26;10779:18;;;10772:54;10843:18;;90729:61:0;10519:348:1;90729:61:0;90803:16;90822:24;24818:10;90216:307;:::i;90822:24::-;90803:43;;90863:8;60015:7;;;;;59944:86;90863:8;90859:170;;;90978:11;90970:47;;;;;;;11074:2:1;90970:47:0;;;11056:21:1;11113:2;11093:18;;;11086:30;11152:25;11132:18;;;11125:53;11195:18;;90970:47:0;10872:347:1;90970:47:0;91041:14;91058:8;60015:7;;;;;59944:86;91058:8;91041:25;;91083:11;:24;;;;;91098:9;91083:24;91079:72;;;91124:7;:15;;;;;;91079:72;91163:15;91181:36;24818:10;;91181:8;:36::i;:::-;91163:54;;91234:11;:24;;;;;91249:9;91234:24;91230:71;;;91275:7;:14;;;;91285:4;91275:14;;;91230:71;91320:7;90669:666;-1:-1:-1;;;90669:666:0:o;87743:441::-;87805:7;35958:16;;;:7;:16;;;;;;:30;:16;87825:113;;;;;;;11426:2:1;87825:113:0;;;11408:21:1;11465:2;11445:18;;;11438:30;11504:34;11484:18;;;11477:62;11575:17;11555:18;;;11548:45;11610:19;;87825:113:0;11224:411:1;87825:113:0;87951:11;88007:18;;;:9;:18;;;;;;;;87951:11;88038:116;88062:8;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;88058:1;:20;88038:116;;;88124:17;;;;;;;;2511:25:1;;;88107:16:0;;;;;;;;88124:14;;2484:18:1;;88124:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;88107:35;;;;;;;;;;1831:42:1;1819:55;;;88107:35:0;;;1801:74:1;1774:18;;88107:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;88100:42;;;;:::i;:::-;;-1:-1:-1;88080:3:0;;;:::i;:::-;;;88038:116;;;-1:-1:-1;88173:3:0;;87743:441;-1:-1:-1;;;87743:441:0:o;33254:376::-;33463:41;24818:10;33496:7;33463:18;:41::i;:::-;33441:140;;;;;;;12809:2:1;33441:140:0;;;12791:21:1;12848:2;12828:18;;;12821:30;12887:34;12867:18;;;12860:62;12958:19;12938:18;;;12931:47;12995:19;;33441:140:0;12607:413:1;33441:140:0;33594:28;33604:4;33610:2;33614:7;33594:9;:28::i;46201:490::-;46328:7;46391:27;;;:17;:27;;;;;;;;46362:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;46328:7;;46431:92;;-1:-1:-1;46482:29:0;;;;;;;;;-1:-1:-1;46482:29:0;;;;;;;;;;;;;;;46431:92;46573:23;;;;46535:21;;47057:5;;46560:36;;46559:71;46560:36;:10;:36;:::i;:::-;46559:71;;;;:::i;:::-;46651:16;;;;;-1:-1:-1;46201:490:0;;-1:-1:-1;;;;46201:490:0:o;69647:188::-;69328:7;69355:12;;;:6;:12;;;;;:22;;;67612:30;67623:4;24818:10;67612;:30::i;:::-;69802:25:::1;69813:4;69819:7;69802:10;:25::i;52815:343::-:0;52957:7;53012:23;53029:5;53012:16;:23::i;:::-;53004:5;:31;52982:124;;;;;;;13774:2:1;52982:124:0;;;13756:21:1;13813:2;13793:18;;;13786:30;13852:34;13832:18;;;13825:62;13923:13;13903:18;;;13896:41;13954:19;;52982:124:0;13572:407:1;52982:124:0;-1:-1:-1;53124:19:0;;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;52815:343::o;70777:287::-;70919:23;;;24818:10;70919:23;70897:120;;;;;;;14186:2:1;70897:120:0;;;14168:21:1;14225:2;14205:18;;;14198:30;14264:34;14244:18;;;14237:62;14335:17;14315:18;;;14308:45;14370:19;;70897:120:0;13984:411:1;70897:120:0;71030:26;71042:4;71048:7;71030:11;:26::i;:::-;70777:287;;:::o;93087:215::-;67166:4;67612:30;67166:4;24818:10;67612;:30::i;:::-;81594:8:::1;::::0;::::1;;24818:10:::0;81578:24:::1;;;;81570:71;;;::::0;::::1;::::0;;14602:2:1;81570:71:0::1;::::0;::::1;14584:21:1::0;14641:2;14621:18;;;14614:30;14680:34;14660:18;;;14653:62;14751:4;14731:18;;;14724:32;14773:19;;81570:71:0::1;14400:398:1::0;81570:71:0::1;93174:21:::2;93166:62;;;::::0;::::2;::::0;;15005:2:1;93166:62:0::2;::::0;::::2;14987:21:1::0;15044:2;15024:18;;;15017:30;15083:25;15063:18;;;15056:53;15126:18;;93166:62:0::2;14803:347:1::0;93166:62:0::2;93241:53;::::0;24818:10;;93272:21:::2;93241:53:::0;::::2;;;::::0;::::2;::::0;;;93272:21;24818:10;93241:53;::::2;;;;;;;;;;;;;::::0;::::2;;;;88318:77:::0;79534:24;67612:30;79534:24;24818:10;67612;:30::i;:::-;88377:10:::1;:8;:10::i;:::-;88318:77:::0;:::o;33701:185::-;33839:39;33856:4;33862:2;33866:7;33839:39;;;;;;;;;;;;:16;:39::i;89820:193::-;89941:13;79638:25;67612:30;79638:25;24818:10;67612;:30::i;:::-;89979:26:::1;89997:7;89979:17;:26::i;:::-;89972:33;;67653:1;89820:193:::0;;;;:::o;53424:320::-;53544:7;53599:30;53322:10;:17;;53234:113;53599:30;53591:5;:38;53569:132;;;;;;;15357:2:1;53569:132:0;;;15339:21:1;15396:2;15376:18;;;15369:30;15435:34;15415:18;;;15408:62;15506:14;15486:18;;;15479:42;15538:19;;53569:132:0;15155:408:1;53569:132:0;53719:10;53730:5;53719:17;;;;;;;;:::i;:::-;;;;;;;;;53712:24;;53424:320;;;:::o;93419:325::-;67166:4;67612:30;67166:4;24818:10;67612;:30::i;:::-;81594:8:::1;::::0;::::1;;24818:10:::0;81578:24:::1;;;;81570:71;;;::::0;::::1;::::0;;14602:2:1;81570:71:0::1;::::0;::::1;14584:21:1::0;14641:2;14621:18;;;14614:30;14680:34;14660:18;;;14653:62;14751:4;14731:18;;;14724:32;14773:19;;81570:71:0::1;14400:398:1::0;81570:71:0::1;93564:30:::2;::::0;;;;93588:4:::2;93564:30;::::0;::::2;1801:74:1::0;93564:15:0::2;::::0;::::2;::::0;::::2;::::0;1774:18:1;;93564:30:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;93542:117;;;::::0;::::2;::::0;;15959:2:1;93542:117:0::2;::::0;::::2;15941:21:1::0;;;15978:18;;;15971:30;16037:34;16017:18;;;16010:62;16089:18;;93542:117:0::2;15757:356:1::0;93542:117:0::2;93672:64;24818:10:::0;93705:30:::2;::::0;;;;93729:4:::2;93705:30;::::0;::::2;1801:74:1::0;93705:15:0::2;::::0;::::2;::::0;::::2;::::0;1774:18:1;;93705:30:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;93672:18;::::0;::::2;::::0;:64;:18:::2;:64::i;88692:108::-:0;67166:4;67612:30;67166:4;24818:10;67612;:30::i;:::-;88778:14;;::::1;::::0;:8:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;87104:515::-:0;35934:4;35958:16;;;:7;:16;;;;;;:30;:16;87166:113;;;;;;;11426:2:1;87166:113:0;;;11408:21:1;11465:2;11445:18;;;11438:30;11504:34;11484:18;;;11477:62;11575:17;11555:18;;;11548:45;11610:19;;87166:113:0;11224:411:1;87166:113:0;87296:23;87311:7;87296:14;:23::i;:::-;87292:67;;87104:515;:::o;87292:67::-;87371:25;87399:18;;;:9;:18;;;;;;;;;87430:118;87454:8;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;87450:1;:20;87430:118;;;87517:17;;;;;;;;2511:25:1;;;87492:16:0;;;;;;;;87517:14;;2484:18:1;;87517:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;87492:44;;;;;;;;;;1831:42:1;1819:55;;;87492:44:0;;;1801:74:1;1774:18;;87492:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87472:3;;;;:::i;:::-;;;87430:118;;;-1:-1:-1;87565:46:0;;87603:7;;87565:46;;;;;;;;;87155:464;87104:515;:::o;90216:307::-;90309:43;;;;;1831:42:1;1819:55;;90309:43:0;;;1801:74:1;90274:4:0;;;;80266:42;;90309:34;;1774:18:1;;90309:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90374:42;;;;;1831::1;1819:55;;90374:42:0;;;1801:74:1;90291:61:0;;-1:-1:-1;80493:42:0;;90374:33;;1774:18:1;;90374:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90363:53;;;;:::i;:::-;90438:43;;;;;1831:42:1;1819:55;;90438:43:0;;;1801:74:1;90363:53:0;;-1:-1:-1;80375:42:0;;90438:34;;1774:18:1;;90438:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90427:54;;;;:::i;:::-;90502:12;;;90216:307;-1:-1:-1;;;90216:307:0:o;30249:326::-;30366:7;30407:16;;;:7;:16;;;;;;;;30456:19;30434:110;;;;;;;16567:2:1;30434:110:0;;;16549:21:1;16606:2;16586:18;;;16579:30;16645:34;16625:18;;;16618:62;16716:11;16696:18;;;16689:39;16745:19;;30434:110:0;16365:405:1;29892:295:0;30009:7;30056:19;;;30034:111;;;;;;;16977:2:1;30034:111:0;;;16959:21:1;17016:2;16996:18;;;16989:30;17055:34;17035:18;;;17028:62;17126:12;17106:18;;;17099:40;17156:19;;30034:111:0;16775:406:1;30034:111:0;-1:-1:-1;30163:16:0;;;;;;:9;:16;;;;;;;29892:295::o;84499:1149::-;67166:4;67612:30;67166:4;24818:10;67612;:30::i;:::-;81099:24:::1;::::0;;;::::1;;;81091:62;;;::::0;::::1;::::0;;17388:2:1;81091:62:0::1;::::0;::::1;17370:21:1::0;17427:2;17407:18;;;17400:30;17466:27;17446:18;;;17439:55;17511:18;;81091:62:0::1;17186:349:1::0;81091:62:0::1;80580:14:::2;80597:8;60015:7:::0;;;;;59944:86;80597:8:::2;80580:25;;80620:9;80616:52;;;80646:10;:8;:10::i;:::-;84680:14:::3;::::0;:23:::3;::::0;;;;;;;84664:13:::3;::::0;84680:14:::3;;::::0;:21:::3;::::0;:23:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;:14;:23:::3;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84664:39;;84746:5;84722:21;;:29;84714:66;;;::::0;::::3;::::0;;17742:2:1;84714:66:0::3;::::0;::::3;17724:21:1::0;17781:2;17761:18;;;17754:30;17820:26;17800:18;;;17793:54;17864:18;;84714:66:0::3;17540:348:1::0;84714:66:0::3;84793:17;84825:656;84904:5;84880:21;;:29;84825:656;;;84990:14;::::0;85013:21:::3;::::0;84990:45:::3;::::0;;;;::::3;::::0;::::3;2511:25:1::0;;;;84974:13:0::3;::::0;84990:14:::3;;::::0;:22:::3;::::0;2484:18:1;;84990:45:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84974:61:::0;-1:-1:-1;85057:16:0::3;::::0;::::3;4553:19:::0;85052:270:::3;;85096:15;85114:22;85123:5;85130;85114:8;:22::i;:::-;85096:40;;80493:42;85181:23;;;85227:21;;85251:1;85227:25;;;;:::i;:::-;85181:90;;;;;;;;;;;;;2511:25:1::0;;2499:2;2484:18;;2365:177;85181:90:0::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85157:21;::::0;;;:12:::3;:21;::::0;;;;:114;85292:14:::3;85305:1;85292:14:::0;::::3;:::i;:::-;;;85077:245;85052:270;85355:6;85342:9;:19;85338:132;;;85449:5;;;85338:132;-1:-1:-1::0;84924:21:0::3;:23:::0;;;:21:::3;:23;::::0;::::3;:::i;:::-;;;;;;84825:656;;;85495:14:::0;;85491:150:::3;;85551:1;85526:21;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;85491:150:0::3;84653:995;;80694:9:::2;80690:50;;;80720:8;:6;:8::i;88237:73::-:0;79534:24;67612:30;79534:24;24818:10;67612;:30::i;:::-;88294:8:::1;:6;:8::i;82968:298::-:0;67166:4;67612:30;67166:4;24818:10;67612;:30::i;:::-;83074:21:::1;80060:42;83074:19;:21::i;:::-;83043:12;:53:::0;;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;83107:49:::1;::::0;;;;80375:42:::1;83107:49;::::0;::::1;1801:74:1::0;83107:23:0::1;::::0;1774:18:1;;83107:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;83167:22:0::1;:29:::0;;;;::::1;::::0;::::1;::::0;;;83212:46:::1;::::0;80375:42:::1;::::0;-1:-1:-1;83212:46:0::1;83237:12:::0;;;;-1:-1:-1;83212:46:0::1;::::0;83167:29;;83212:46:::1;82968:298:::0;:::o;83414:974::-;67166:4;67612:30;67166:4;24818:10;67612;:30::i;:::-;80931:22:::1;::::0;;;::::1;;;80923:58;;;::::0;::::1;::::0;;18352:2:1;80923:58:0::1;::::0;::::1;18334:21:1::0;18391:2;18371:18;;;18364:30;18430:25;18410:18;;;18403:53;18473:18;;80923:58:0::1;18150:347:1::0;80923:58:0::1;80580:14:::2;80597:8;60015:7:::0;;;;;59944:86;80597:8:::2;80580:25;;80620:9;80616:52;;;80646:10;:8;:10::i;:::-;83591:12:::3;::::0;:21:::3;::::0;;;;;;;83575:13:::3;::::0;83591:12:::3;;::::0;:19:::3;::::0;:21:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;:12;:21:::3;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83575:37;;83653:5;83631:19;;:27;83623:64;;;::::0;::::3;::::0;;17742:2:1;83623:64:0::3;::::0;::::3;17724:21:1::0;17781:2;17761:18;;;17754:30;17820:26;17800:18;;;17793:54;17864:18;;83623:64:0::3;17540:348:1::0;83623:64:0::3;83700:17;83732:491;83807:5;83785:19;;:27;83732:491;;;83891:12;::::0;83912:19:::3;::::0;83891:41:::3;::::0;;;;::::3;::::0;::::3;2511:25:1::0;;;;83875:13:0::3;::::0;83891:12:::3;;::::0;:20:::3;::::0;2484:18:1;;83891:41:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83875:57:::0;-1:-1:-1;83954:16:0::3;::::0;::::3;4553:19:::0;83949:115:::3;;83993:22;84002:5;84009;83993:8;:22::i;:::-;-1:-1:-1::0;84034:14:0::3;84047:1;84034:14:::0;::::3;:::i;:::-;;;83949:115;84097:6;84084:9;:19;84080:132;;;84191:5;;;84080:132;-1:-1:-1::0;83827:19:0::3;:21:::0;;;:19:::3;:21;::::0;::::3;:::i;:::-;;;;;;83732:491;;;84237:14:::0;;84233:148:::3;;84291:1;84268:19;;:24;;;;;;;:::i;30811:104::-:0;30867:13;30900:7;30893:14;;;;;:::i;32715:187::-;32842:52;24818:10;32875:8;32885;32842:18;:52::i;82558:306::-;67166:4;67612:30;67166:4;24818:10;67612;:30::i;:::-;82668:21:::1;80060:42;82668:19;:21::i;:::-;82635:14;:55:::0;;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;82701:50:::1;::::0;;;;80493:42:::1;82701:50;::::0;::::1;1801:74:1::0;82701:25:0::1;::::0;1774:18:1;;82701:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;82762:24:0::1;:31:::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;82834:14:0::1;::::0;82809:47:::1;::::0;80493:42:::1;::::0;82809:47:::1;82834:14;::::0;82809:47:::1;::::0;82762:31;;82809:47:::1;82558:306:::0;:::o;33957:365::-;34146:41;24818:10;34179:7;34146:18;:41::i;:::-;34124:140;;;;;;;12809:2:1;34124:140:0;;;12791:21:1;12848:2;12828:18;;;12821:30;12887:34;12867:18;;;12860:62;12958:19;12938:18;;;12931:47;12995:19;;34124:140:0;12607:413:1;34124:140:0;34275:39;34289:4;34295:2;34299:7;34308:5;34275:13;:39::i;:::-;33957:365;;;;:::o;92046:367::-;92188:16;67166:4;67612:30;67166:4;24818:10;67612;:30::i;:::-;80580:14:::1;80597:8;60015:7:::0;;;;;59944:86;80597:8:::1;80580:25;;80620:9;80616:52;;;80646:10;:8;:10::i;:::-;92222:25:::2;92264:5;92250:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;92250:20:0::2;;92222:48;;92288:9;92283:95;92307:5;92303:1;:9;92283:95;;;92348:18;92357:3;92362;92348:8;:18::i;:::-;92334:8;92343:1;92334:11;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;:32;92314:3:::2;::::0;::::2;:::i;:::-;;;92283:95;;;-1:-1:-1::0;92397:8:0;-1:-1:-1;80694:9:0::1;80690:50;;;80720:8;:6;:8::i;:::-;80569:178;92046:367:::0;;;;;:::o;89340:389::-;35934:4;35958:16;;;:7;:16;;;;;;89441:13;;35958:30;:16;89472:113;;;;;;;11426:2:1;89472:113:0;;;11408:21:1;11465:2;11445:18;;;11438:30;11504:34;11484:18;;;11477:62;11575:17;11555:18;;;11548:45;11610:19;;89472:113:0;11224:411:1;89472:113:0;89660:8;89670:26;89688:7;89670:17;:26::i;:::-;89643:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;89598:123;;89340:389;;;:::o;91571:185::-;91698:7;;67612:30;91698:7;24818:10;67612;:30::i;:::-;80580:14:::1;80597:8;60015:7:::0;;;;;59944:86;80597:8:::1;80580:25;;80620:9;80616:52;;;80646:10;:8;:10::i;:::-;91730:18:::2;91739:3;91744;91730:8;:18::i;:::-;91723:25;;80694:9:::1;80690:50;;;80720:8;:6;:8::i;:::-;80569:178;91571:185:::0;;;;:::o;70080:190::-;69328:7;69355:12;;;:6;:12;;;;;:22;;;67612:30;67623:4;24818:10;67612;:30::i;:::-;70236:26:::1;70248:4;70254:7;70236:11;:26::i;88446:107::-:0;67166:4;67612:30;67166:4;24818:10;67612;:30::i;:::-;-1:-1:-1;88527:11:0::1;:18:::0;88446:107::o;67734:280::-;67864:4;67906:47;;;67921:32;67906:47;;:100;;;67970:36;67994:11;67970:23;:36::i;40156:174::-;40231:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;40285:23;40231:24;40285:14;:23::i;:::-;40276:46;;;;;;;;;;;;40156:174;;:::o;92503:486::-;92596:7;92621:14;92638:13;53322:10;:17;;53234:113;92638:13;92684:10;;92621:30;;-1:-1:-1;92670:10:0;92621:30;92679:1;92670:10;:::i;:::-;:24;;92662:51;;;;;;;20559:2:1;92662:51:0;;;20541:21:1;20598:2;20578:18;;;20571:30;20637:16;20617:18;;;20610:44;20671:18;;92662:51:0;20357:338:1;92662:51:0;92726:15;92744:10;:6;92753:1;92744:10;:::i;:::-;92726:28;;92767:52;92793:7;92802:16;92767:25;:52::i;:::-;92832:23;92842:3;92847:7;92832:9;:23::i;:::-;92902:18;;;;:9;:18;;;;;;92868:59;;92885:7;;92902:18;;92923:3;92868:16;:59::i;:::-;92974:7;92503:486;-1:-1:-1;;;;92503:486:0:o;36163:452::-;36292:4;35958:16;;;:7;:16;;;;;;:30;:16;36314:110;;;;;;;20902:2:1;36314:110:0;;;20884:21:1;20941:2;20921:18;;;20914:30;20980:34;20960:18;;;20953:62;21051:14;21031:18;;;21024:42;21083:19;;36314:110:0;20700:408:1;36314:110:0;36435:13;36451:23;36466:7;36451:14;:23::i;:::-;36435:39;;36504:5;36493:16;;:7;:16;;;:64;;;;36550:7;36526:31;;:20;36538:7;36526:11;:20::i;:::-;:31;;;36493:64;:113;;;-1:-1:-1;33144:25:0;;;;33115:4;33144:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;36574:32;32973:214;39376:662;39549:4;39522:31;;:23;39537:7;39522:14;:23::i;:::-;:31;;;39500:118;;;;;;;21315:2:1;39500:118:0;;;21297:21:1;21354:2;21334:18;;;21327:30;21393:34;21373:18;;;21366:62;21464:7;21444:18;;;21437:35;21489:19;;39500:118:0;21113:401:1;39500:118:0;39637:16;;;39629:65;;;;;;;21721:2:1;39629:65:0;;;21703:21:1;21760:2;21740:18;;;21733:30;21799:34;21779:18;;;21772:62;21870:6;21850:18;;;21843:34;21894:19;;39629:65:0;21519:400:1;39629:65:0;39707:39;39728:4;39734:2;39738:7;39707:20;:39::i;:::-;39811:29;39828:1;39832:7;39811:8;:29::i;:::-;39853:15;;;;;;;:9;:15;;;;;:20;;39872:1;;39853:15;:20;;39872:1;;39853:20;:::i;:::-;;;;-1:-1:-1;;39884:13:0;;;;;;;:9;:13;;;;;:18;;39901:1;;39884:13;:18;;39901:1;;39884:18;:::i;:::-;;;;-1:-1:-1;;39913:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;39952:27;;39913:16;;39952:27;;;;;;;31928:341;31858:411;;:::o;68576:497::-;68220:4;68249:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;68652:414;;68845:41;68873:7;68845:41;;68883:2;68845:19;:41::i;:::-;68959:38;68987:4;68994:2;68959:19;:38::i;:::-;68750:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;68696:358;;;;;;;;:::i;72347:238::-;68220:4;68249:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;72426:152;;72470:12;;;;:6;:12;;;;;;;;:29;;;;;;;;;;:36;;;;72502:4;72470:36;;;72553:12;24818:10;;24738:98;72553:12;72526:40;;72544:7;72526:40;;72538:4;72526:40;;;;;;;;;;72347:238;;:::o;72717:239::-;68220:4;68249:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;72797:152;;;72872:5;72840:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;:37;;;;;;72897:40;24818:10;;72840:12;;72897:40;;72872:5;72897:40;72717:239;;:::o;61003:120::-;60015:7;;;;60539:41;;;;;;;23047:2:1;60539:41:0;;;23029:21:1;23086:2;23066:18;;;23059:30;23125:22;23105:18;;;23098:50;23165:18;;60539:41:0;22845:344:1;60539:41:0;61062:7:::1;:15:::0;;;::::1;::::0;;61093:22:::1;24818:10:::0;61102:12:::1;61093:22;::::0;1831:42:1;1819:55;;;1801:74;;1789:2;1774:18;61093:22:0::1;;;;;;;61003:120::o:0;88937:321::-;89031:13;89082:168;89247:2;89157:22;:11;:20;:22::i;:::-;89181:18;:7;:16;:18::i;:::-;89140:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;89108:111;;89140:60;89108:111;;;;;89082:164;:168::i;12658:248::-;12829:58;;;3832:42:1;3820:55;;12829:58:0;;;3802:74:1;3892:18;;;;3885:34;;;12829:58:0;;;;;;;;;;3775:18:1;;;;12829:58:0;;;;;;;;;;12852:23;12829:58;;;12775:123;;12809:5;;12775:19;:123::i;60744:118::-;60015:7;;;;60269:9;60261:38;;;;;;;23871:2:1;60261:38:0;;;23853:21:1;23910:2;23890:18;;;23883:30;23949:18;23929;;;23922:46;23985:18;;60261:38:0;23669:340:1;60261:38:0;60804:7:::1;:14:::0;;;::::1;60814:4;60804:14;::::0;;60834:20:::1;60841:12;24818:10:::0;;24738:98;73937:622;73994:16;74064:4;74058:11;74130:66;74108:3;74083:128;74258:14;74252:4;74248:25;74241:4;74236:3;74232:14;74225:49;74346:66;74322:4;74317:3;74313:14;74288:139;74468:4;74463:3;74460:1;74453:20;74441:32;-1:-1:-1;;74502:22:0;;;74494:57;;;;;;;24216:2:1;74494:57:0;;;24198:21:1;24255:2;24235:18;;;24228:30;24294:24;24274:18;;;24267:52;24336:18;;74494:57:0;24014:346:1;74494:57:0;73937:622;;;:::o;40472:315::-;40627:8;40618:17;;:5;:17;;;;40610:55;;;;;;;24567:2:1;40610:55:0;;;24549:21:1;24606:2;24586:18;;;24579:30;24645:27;24625:18;;;24618:55;24690:18;;40610:55:0;24365:349:1;40610:55:0;40676:25;;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;40738:41;;586::1;;;40738::0;;559:18:1;40738:41:0;;;;;;;40472:315;;;:::o;35204:352::-;35361:28;35371:4;35377:2;35381:7;35361:9;:28::i;:::-;35422:48;35445:4;35451:2;35455:7;35464:5;35422:22;:48::i;:::-;35400:148;;;;;;;24921:2:1;35400:148:0;;;24903:21:1;24960:2;24940:18;;;24933:30;24999:34;24979:18;;;24972:62;25070:20;25050:18;;;25043:48;25108:19;;35400:148:0;24719:414:1;49900:220:0;50047:4;50076:36;50100:11;50076:23;:36::i;85921:972::-;86178:23;;;;;;;:14;:23;;;;;;:28;86174:632;;86254:23;;;;86244:34;86254:23;;;:14;:23;;;;;;;;;86244:34;;:9;:34;;;;;;;86223:18;;;;;:55;;;;86244:34;;;;86223:55;;;86174:632;;;86338:16;;;86352:1;86338:16;;;;;;;;86311:24;;86338:16;;;;;;;;;;-1:-1:-1;86338:16:0;86311:43;;86390:4;86369:7;86377:1;86369:10;;;;;;;;:::i;:::-;;;;;;:26;;;;;;;;;;;86423:7;86410;86418:1;86410:10;;;;;;;;:::i;:::-;:20;;;;;:10;;;;;;;;;;:20;86473:16;;;86487:1;86473:16;;;;;;;;86447:23;;86473:16;;86487:1;;86473:16;;;;;;;;;-1:-1:-1;86473:16:0;86447:42;;86516:1;86504:6;86511:1;86504:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;86544:1;86532:6;86539:1;86532:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;86600:23;79926:42;86600:21;:23::i;:::-;86562:18;;;;:9;:18;;;;;;;:62;;;;;;;;;;;;;;86639:46;;;;:29;;:46;;86669:7;;86678:6;;86639:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;86761:23:0;;;;;;;:14;:23;;;;;:33;;;-1:-1:-1;;;86174:632:0;86847:18;;;;:9;:18;;;;;;;86823:62;;;;;;;86868:7;;86847:18;;;;86823:62;;86847:18;86823:62;85921:972;;:::o;36957:110::-;37033:26;37043:2;37047:7;37033:26;;;;;;;;;;;;:9;:26::i;48228:427::-;47057:5;48394:33;;;;;48372:125;;;;;;;26200:2:1;48372:125:0;;;26182:21:1;26239:2;26219:18;;;26212:30;26278:34;26258:18;;;26251:62;26349:12;26329:18;;;26322:40;26379:19;;48372:125:0;25998:406:1;48372:125:0;48516:22;;;48508:62;;;;;;;26611:2:1;48508:62:0;;;26593:21:1;26650:2;26630:18;;;26623:30;26689:29;26669:18;;;26662:57;26736:18;;48508:62:0;26409:351:1;48508:62:0;48612:35;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48583:26:0;;;:17;:26;;;;;;:64;;;;;;;;;;;;;;48228:427::o;93831:239::-;94017:45;94044:4;94050:2;94054:7;94017:26;:45::i;26588:483::-;26690:13;26721:19;26753:10;26757:6;26753:1;:10;:::i;:::-;:14;;26766:1;26753:14;:::i;:::-;26743:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26743:25:0;;26721:47;;26779:15;:6;26786:1;26779:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;;26805;:6;26812:1;26805:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;-1:-1:-1;26836:9:0;26848:10;26852:6;26848:1;:10;:::i;:::-;:14;;26861:1;26848:14;:::i;:::-;26836:26;;26831:135;26868:1;26864;:5;26831:135;;;26903:12;26916:5;26924:3;26916:11;26903:25;;;;;;;:::i;:::-;;;;26891:6;26898:1;26891:9;;;;;;;;:::i;:::-;;;;:37;;;;;;;;;;-1:-1:-1;26953:1:0;26943:11;;;;;26871:3;;;:::i;:::-;;;26831:135;;;-1:-1:-1;26984:10:0;;26976:55;;;;;;;27168:2:1;26976:55:0;;;27150:21:1;;;27187:18;;;27180:30;27246:34;27226:18;;;27219:62;27298:18;;26976:55:0;26966:356:1;25287:723:0;25343:13;25564:10;25560:53;;-1:-1:-1;;25591:10:0;;;;;;;;;;;;;;;;;;25287:723::o;25560:53::-;25638:5;25623:12;25679:78;25686:9;;25679:78;;25712:8;;;;:::i;:::-;;-1:-1:-1;25735:10:0;;-1:-1:-1;25743:2:0;25735:10;;:::i;:::-;;;25679:78;;;25767:19;25799:6;25789:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25789:17:0;;25767:39;;25817:154;25824:10;;25817:154;;25851:11;25861:1;25851:11;;:::i;:::-;;-1:-1:-1;25920:10:0;25928:2;25920:5;:10;:::i;:::-;25907:24;;:2;:24;:::i;:::-;25894:39;;25877:6;25884;25877:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;25948:11:0;25957:2;25948:11;;:::i;:::-;;;25817:154;;15625:802;16049:23;16075:106;16117:4;16075:106;;;;;;;;;;;;;;;;;16083:5;16075:27;;;;:106;;;;;:::i;:::-;16196:17;;16049:132;;-1:-1:-1;16196:21:0;16192:228;;16311:10;16300:30;;;;;;;;;;;;:::i;:::-;16274:134;;;;;;;27896:2:1;16274:134:0;;;27878:21:1;27935:2;27915:18;;;27908:30;27974:34;27954:18;;;27947:62;28045:12;28025:18;;;28018:40;28075:19;;16274:134:0;27694:406:1;41352:980:0;41507:4;41528:13;;;4553:19;:23;41524:801;;41581:175;;;;;:36;;;;;;:175;;24818:10;;41675:4;;41702:7;;41732:5;;41581:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41581:175:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41560:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41939:13:0;;41935:320;;41982:108;;;;;24921:2:1;41982:108:0;;;24903:21:1;24960:2;24940:18;;;24933:30;24999:34;24979:18;;;24972:62;25070:20;25050:18;;;25043:48;25108:19;;41982:108:0;24719:414:1;41935:320:0;42205:6;42199:13;42190:6;42186:2;42182:15;42175:38;41560:710;41820:51;;41830:41;41820:51;;-1:-1:-1;41813:58:0;;41524:801;-1:-1:-1;42309:4:0;41352:980;;;;;;:::o;52431:300::-;52578:4;52620:50;;;52635:35;52620:50;;:103;;;52687:36;52711:11;52687:23;:36::i;37294:321::-;37424:18;37430:2;37434:7;37424:5;:18::i;:::-;37475:54;37506:1;37510:2;37514:7;37523:5;37475:22;:54::i;:::-;37453:154;;;;;;;24921:2:1;37453:154:0;;;24903:21:1;24960:2;24940:18;;;24933:30;24999:34;24979:18;;;24972:62;25070:20;25050:18;;;25043:48;25108:19;;37453:154:0;24719:414:1;61774:275:0;61918:45;61945:4;61951:2;61955:7;61918:26;:45::i;:::-;60015:7;;;;61984:9;61976:65;;;;;;;29089:2:1;61976:65:0;;;29071:21:1;29128:2;29108:18;;;29101:30;29167:34;29147:18;;;29140:62;29238:13;29218:18;;;29211:41;29269:19;;61976:65:0;28887:407:1;7100:229:0;7237:12;7269:52;7291:6;7299:4;7305:1;7308:12;7269:21;:52::i;29473:355::-;29620:4;29662:40;;;29677:25;29662:40;;:105;;-1:-1:-1;29719:48:0;;;29734:33;29719:48;29662:105;:158;;;;29784:36;29808:11;29784:23;:36::i;37951:439::-;38031:16;;;38023:61;;;;;;;29501:2:1;38023:61:0;;;29483:21:1;;;29520:18;;;29513:30;29579:34;29559:18;;;29552:62;29631:18;;38023:61:0;29299:356:1;38023:61:0;35934:4;35958:16;;;:7;:16;;;;;;:30;:16;:30;38095:58;;;;;;;29862:2:1;38095:58:0;;;29844:21:1;29901:2;29881:18;;;29874:30;29940;29920:18;;;29913:58;29988:18;;38095:58:0;29660:352:1;38095:58:0;38166:45;38195:1;38199:2;38203:7;38166:20;:45::i;:::-;38224:13;;;;;;;:9;:13;;;;;:18;;38241:1;;38224:13;:18;;38241:1;;38224:18;:::i;:::-;;;;-1:-1:-1;;38253:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;38292:33;;38253:16;;;38292:33;;38253:16;;38292:33;70777:287;;:::o;54357:589::-;54563:18;;;54559:187;;54598:40;54630:7;55773:10;:17;;55746:24;;;;:15;:24;;;;;:44;;;55801:24;;;;;;;;;;;;55669:164;54598:40;54559:187;;;54668:2;54660:10;;:4;:10;;;54656:90;;54687:47;54720:4;54726:7;54687:32;:47::i;:::-;54760:16;;;54756:183;;54793:45;54830:7;54793:36;:45::i;54756:183::-;54866:4;54860:10;;:2;:10;;;54856:83;;54887:40;54915:2;54919:7;54887:27;:40::i;8316:571::-;8486:12;8558:5;8533:21;:30;;8511:118;;;;;;;30219:2:1;8511:118:0;;;30201:21:1;30258:2;30238:18;;;30231:30;30297:34;30277:18;;;30270:62;30368:8;30348:18;;;30341:36;30394:19;;8511:118:0;30017:402:1;8511:118:0;4553:19;;;;8640:60;;;;;;;30626:2:1;8640:60:0;;;30608:21:1;30665:2;30645:18;;;30638:30;30704:31;30684:18;;;30677:59;30753:18;;8640:60:0;30424:353:1;8640:60:0;8714:12;8728:23;8755:6;:11;;8774:5;8795:4;8755:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8713:97;;;;8828:51;8845:7;8854:10;8866:12;8828:16;:51::i;:::-;8821:58;8316:571;-1:-1:-1;;;;;;;8316:571:0:o;45855:291::-;46002:4;46044:41;;;46059:26;46044:41;;:94;;-1:-1:-1;28085:25:0;28070:40;;;;46102:36;27911:207;56460:1002;56740:22;56790:1;56765:22;56782:4;56765:16;:22::i;:::-;:26;;;;:::i;:::-;56802:18;56823:26;;;:17;:26;;;;;;56740:51;;-1:-1:-1;56956:28:0;;;56952:328;;57023:18;;;57001:19;57023:18;;;:12;:18;;;;;;;;:34;;;;;;;;;57074:30;;;;;;:44;;;57191:30;;:17;:30;;;;;:43;;;56952:328;-1:-1:-1;57376:26:0;;;;:17;:26;;;;;;;;57369:33;;;57420:18;;;;;;:12;:18;;;;;:34;;;;;;;57413:41;56460:1002::o;57757:1079::-;58035:10;:17;58010:22;;58035:21;;58055:1;;58035:21;:::i;:::-;58067:18;58088:24;;;:15;:24;;;;;;58461:10;:26;;58010:46;;-1:-1:-1;58088:24:0;;58010:46;;58461:26;;;;;;:::i;:::-;;;;;;;;;58439:48;;58525:11;58500:10;58511;58500:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;58605:28;;;:15;:28;;;;;;;:41;;;58777:24;;;;;58770:31;58812:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;57828:1008;;;57757:1079;:::o;55247:221::-;55332:14;55349:20;55366:2;55349:16;:20::i;:::-;55380:16;;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;55425:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;55247:221:0:o;11276:712::-;11426:12;11455:7;11451:530;;;-1:-1:-1;11486:10:0;11479:17;;11451:530;11600:17;;:21;11596:374;;11798:10;11792:17;11859:15;11846:10;11842:2;11838:19;11831:44;11596:374;11941:12;11934:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:328::-;954:3;992:5;986:12;1019:6;1014:3;1007:19;1035:63;1091:6;1084:4;1079:3;1075:14;1068:4;1061:5;1057:16;1035:63;:::i;:::-;1143:2;1131:15;1148:66;1127:88;1118:98;;;;1218:4;1114:109;;901:328;-1:-1:-1;;901:328:1:o;1234:231::-;1383:2;1372:9;1365:21;1346:4;1403:56;1455:2;1444:9;1440:18;1432:6;1403:56;:::i;1470:180::-;1529:6;1582:2;1570:9;1561:7;1557:23;1553:32;1550:52;;;1598:1;1595;1588:12;1550:52;-1:-1:-1;1621:23:1;;1470:180;-1:-1:-1;1470:180:1:o;1886:154::-;1972:42;1965:5;1961:54;1954:5;1951:65;1941:93;;2030:1;2027;2020:12;2045:315;2113:6;2121;2174:2;2162:9;2153:7;2149:23;2145:32;2142:52;;;2190:1;2187;2180:12;2142:52;2229:9;2216:23;2248:31;2273:5;2248:31;:::i;:::-;2298:5;2350:2;2335:18;;;;2322:32;;-1:-1:-1;;;2045:315:1:o;2547:456::-;2624:6;2632;2640;2693:2;2681:9;2672:7;2668:23;2664:32;2661:52;;;2709:1;2706;2699:12;2661:52;2748:9;2735:23;2767:31;2792:5;2767:31;:::i;:::-;2817:5;-1:-1:-1;2874:2:1;2859:18;;2846:32;2887:33;2846:32;2887:33;:::i;:::-;2547:456;;2939:7;;-1:-1:-1;;;2993:2:1;2978:18;;;;2965:32;;2547:456::o;3375:248::-;3443:6;3451;3504:2;3492:9;3483:7;3479:23;3475:32;3472:52;;;3520:1;3517;3510:12;3472:52;-1:-1:-1;;3543:23:1;;;3613:2;3598:18;;;3585:32;;-1:-1:-1;3375:248:1:o;3930:315::-;3998:6;4006;4059:2;4047:9;4038:7;4034:23;4030:32;4027:52;;;4075:1;4072;4065:12;4027:52;4111:9;4098:23;4088:33;;4171:2;4160:9;4156:18;4143:32;4184:31;4209:5;4184:31;:::i;:::-;4234:5;4224:15;;;3930:315;;;;;:::o;4250:260::-;4322:6;4375:2;4363:9;4354:7;4350:23;4346:32;4343:52;;;4391:1;4388;4381:12;4343:52;4430:9;4417:23;4449:31;4474:5;4449:31;:::i;4515:184::-;4567:77;4564:1;4557:88;4664:4;4661:1;4654:15;4688:4;4685:1;4678:15;4704:691;4769:5;4799:18;4840:2;4832:6;4829:14;4826:40;;;4846:18;;:::i;:::-;4980:2;4974:9;5046:2;5034:15;;4885:66;5030:24;;;5056:2;5026:33;5022:42;5010:55;;;5080:18;;;5100:22;;;5077:46;5074:72;;;5126:18;;:::i;:::-;5166:10;5162:2;5155:22;5195:6;5186:15;;5225:6;5217;5210:22;5265:3;5256:6;5251:3;5247:16;5244:25;5241:45;;;5282:1;5279;5272:12;5241:45;5332:6;5327:3;5320:4;5312:6;5308:17;5295:44;5387:1;5380:4;5371:6;5363;5359:19;5355:30;5348:41;;;;4704:691;;;;;:::o;5400:451::-;5469:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:52;;;5538:1;5535;5528:12;5490:52;5578:9;5565:23;5611:18;5603:6;5600:30;5597:50;;;5643:1;5640;5633:12;5597:50;5666:22;;5719:4;5711:13;;5707:27;-1:-1:-1;5697:55:1;;5748:1;5745;5738:12;5697:55;5771:74;5837:7;5832:2;5819:16;5814:2;5810;5806:11;5771:74;:::i;6108:118::-;6194:5;6187:13;6180:21;6173:5;6170:32;6160:60;;6216:1;6213;6206:12;6231:382;6296:6;6304;6357:2;6345:9;6336:7;6332:23;6328:32;6325:52;;;6373:1;6370;6363:12;6325:52;6412:9;6399:23;6431:31;6456:5;6431:31;:::i;:::-;6481:5;-1:-1:-1;6538:2:1;6523:18;;6510:32;6551:30;6510:32;6551:30;:::i;6618:795::-;6713:6;6721;6729;6737;6790:3;6778:9;6769:7;6765:23;6761:33;6758:53;;;6807:1;6804;6797:12;6758:53;6846:9;6833:23;6865:31;6890:5;6865:31;:::i;:::-;6915:5;-1:-1:-1;6972:2:1;6957:18;;6944:32;6985:33;6944:32;6985:33;:::i;:::-;7037:7;-1:-1:-1;7091:2:1;7076:18;;7063:32;;-1:-1:-1;7146:2:1;7131:18;;7118:32;7173:18;7162:30;;7159:50;;;7205:1;7202;7195:12;7159:50;7228:22;;7281:4;7273:13;;7269:27;-1:-1:-1;7259:55:1;;7310:1;7307;7300:12;7259:55;7333:74;7399:7;7394:2;7381:16;7376:2;7372;7368:11;7333:74;:::i;:::-;7323:84;;;6618:795;;;;;;;:::o;7738:435::-;7791:3;7829:5;7823:12;7856:6;7851:3;7844:19;7882:4;7911:2;7906:3;7902:12;7895:19;;7948:2;7941:5;7937:14;7969:1;7979:169;7993:6;7990:1;7987:13;7979:169;;;8054:13;;8042:26;;8088:12;;;;8123:15;;;;8015:1;8008:9;7979:169;;;-1:-1:-1;8164:3:1;;7738:435;-1:-1:-1;;;;;7738:435:1:o;8178:261::-;8357:2;8346:9;8339:21;8320:4;8377:56;8429:2;8418:9;8414:18;8406:6;8377:56;:::i;8444:388::-;8512:6;8520;8573:2;8561:9;8552:7;8548:23;8544:32;8541:52;;;8589:1;8586;8579:12;8541:52;8628:9;8615:23;8647:31;8672:5;8647:31;:::i;:::-;8697:5;-1:-1:-1;8754:2:1;8739:18;;8726:32;8767:33;8726:32;8767:33;:::i;8837:437::-;8916:1;8912:12;;;;8959;;;8980:61;;9034:4;9026:6;9022:17;9012:27;;8980:61;9087:2;9079:6;9076:14;9056:18;9053:38;9050:218;;;9124:77;9121:1;9114:88;9225:4;9222:1;9215:15;9253:4;9250:1;9243:15;11640:184;11710:6;11763:2;11751:9;11742:7;11738:23;11734:32;11731:52;;;11779:1;11776;11769:12;11731:52;-1:-1:-1;11802:16:1;;11640:184;-1:-1:-1;11640:184:1:o;11829:251::-;11899:6;11952:2;11940:9;11931:7;11927:23;11923:32;11920:52;;;11968:1;11965;11958:12;11920:52;12000:9;11994:16;12019:31;12044:5;12019:31;:::i;12085:184::-;12137:77;12134:1;12127:88;12234:4;12231:1;12224:15;12258:4;12255:1;12248:15;12274:128;12314:3;12345:1;12341:6;12338:1;12335:13;12332:39;;;12351:18;;:::i;:::-;-1:-1:-1;12387:9:1;;12274:128::o;12407:195::-;12446:3;12477:66;12470:5;12467:77;12464:103;;;12547:18;;:::i;:::-;-1:-1:-1;12594:1:1;12583:13;;12407:195::o;13025:228::-;13065:7;13191:1;13123:66;13119:74;13116:1;13113:81;13108:1;13101:9;13094:17;13090:105;13087:131;;;13198:18;;:::i;:::-;-1:-1:-1;13238:9:1;;13025:228::o;13258:184::-;13310:77;13307:1;13300:88;13407:4;13404:1;13397:15;13431:4;13428:1;13421:15;13447:120;13487:1;13513;13503:35;;13518:18;;:::i;:::-;-1:-1:-1;13552:9:1;;13447:120::o;15568:184::-;15620:77;15617:1;15610:88;15717:4;15714:1;15707:15;15741:4;15738:1;15731:15;18628:185;18670:3;18708:5;18702:12;18723:52;18768:6;18763:3;18756:4;18749:5;18745:16;18723:52;:::i;:::-;18791:16;;;;;18628:185;-1:-1:-1;;18628:185:1:o;18936:1416::-;19213:3;19242:1;19275:6;19269:13;19305:3;19327:1;19355:9;19351:2;19347:18;19337:28;;19415:2;19404:9;19400:18;19437;19427:61;;19481:4;19473:6;19469:17;19459:27;;19427:61;19507:2;19555;19547:6;19544:14;19524:18;19521:38;19518:222;;;19594:77;19589:3;19582:90;19695:4;19692:1;19685:15;19725:4;19720:3;19713:17;19518:222;19756:18;19783:162;;;;19959:1;19954:320;;;;19749:525;;19783:162;19831:66;19820:9;19816:82;19811:3;19804:95;19928:6;19923:3;19919:16;19912:23;;19783:162;;19954:320;18575:1;18568:14;;;18612:4;18599:18;;20049:1;20063:165;20077:6;20074:1;20071:13;20063:165;;;20155:14;;20142:11;;;20135:35;20198:16;;;;20092:10;;20063:165;;;20067:3;;20257:6;20252:3;20248:16;20241:23;;19749:525;;;;;;;20290:56;20315:30;20341:3;20333:6;20315:30;:::i;:::-;18890:7;18878:20;;18923:1;18914:11;;18818:113;20290:56;20283:63;18936:1416;-1:-1:-1;;;;;18936:1416:1:o;21924:125::-;21964:4;21992:1;21989;21986:8;21983:34;;;21997:18;;:::i;:::-;-1:-1:-1;22034:9:1;;21924:125::o;22054:786::-;22465:25;22460:3;22453:38;22435:3;22520:6;22514:13;22536:62;22591:6;22586:2;22581:3;22577:12;22570:4;22562:6;22558:17;22536:62;:::i;:::-;22662:19;22657:2;22617:16;;;22649:11;;;22642:40;22707:13;;22729:63;22707:13;22778:2;22770:11;;22763:4;22751:17;;22729:63;:::i;:::-;22812:17;22831:2;22808:26;;22054:786;-1:-1:-1;;;;22054:786:1:o;23194:470::-;23373:3;23411:6;23405:13;23427:53;23473:6;23468:3;23461:4;23453:6;23449:17;23427:53;:::i;:::-;23543:13;;23502:16;;;;23565:57;23543:13;23502:16;23599:4;23587:17;;23565:57;:::i;:::-;23638:20;;23194:470;-1:-1:-1;;;;23194:470:1:o;25138:855::-;25406:2;25418:21;;;25488:13;;25391:18;;;25510:22;;;25358:4;;25585;;25563:2;25548:18;;;25612:15;;;25358:4;25655:218;25669:6;25666:1;25663:13;25655:218;;;25734:13;;25749:42;25730:62;25718:75;;25813:12;;;;25848:15;;;;25691:1;25684:9;25655:218;;;25659:3;;;25918:9;25913:3;25909:19;25904:2;25893:9;25889:18;25882:47;25946:41;25983:3;25975:6;25946:41;:::i;:::-;25938:49;25138:855;-1:-1:-1;;;;;;25138:855:1:o;26765:196::-;26804:3;26832:5;26822:39;;26841:18;;:::i;:::-;-1:-1:-1;26888:66:1;26877:78;;26765:196::o;27327:112::-;27359:1;27385;27375:35;;27390:18;;:::i;:::-;-1:-1:-1;27424:9:1;;27327:112::o;27444:245::-;27511:6;27564:2;27552:9;27543:7;27539:23;27535:32;27532:52;;;27580:1;27577;27570:12;27532:52;27612:9;27606:16;27631:28;27653:5;27631:28;:::i;28105:523::-;28299:4;28328:42;28409:2;28401:6;28397:15;28386:9;28379:34;28461:2;28453:6;28449:15;28444:2;28433:9;28429:18;28422:43;;28501:6;28496:2;28485:9;28481:18;28474:34;28544:3;28539:2;28528:9;28524:18;28517:31;28565:57;28617:3;28606:9;28602:19;28594:6;28565:57;:::i;28633:249::-;28702:6;28755:2;28743:9;28734:7;28730:23;28726:32;28723:52;;;28771:1;28768;28761:12;28723:52;28803:9;28797:16;28822:30;28846:5;28822:30;:::i;30782:274::-;30911:3;30949:6;30943:13;30965:53;31011:6;31006:3;30999:4;30991:6;30987:17;30965:53;:::i;:::-;31034:16;;;;;30782:274;-1:-1:-1;;30782:274:1:o;31061:184::-;31113:77;31110:1;31103:88;31210:4;31207:1;31200:15;31234:4;31231:1;31224:15
Swarm Source
ipfs://036c7b32c2160a977cad397617200354d5547daa028ca661da6f2e696b0298f1
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 |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.