ERC-721
Overview
Max Total Supply
400 VERSE
Holders
118
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 VERSELoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LondonToken
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "./Ownable.sol"; import "./ERC721.sol"; import "./ERC2981PerTokenRoyalties.sol"; import {DefaultOperatorFilterer} from "./DefaultOperatorFilterer.sol"; /// @custom:security-contact [email protected] contract LondonToken is ERC721, Ownable, ERC2981PerTokenRoyalties, DefaultOperatorFilterer { constructor( string memory uri_, address minter_, address gatewayManager_, string memory contractName_ ) ERC721(contractName_, "VERSE", uri_) { mintingManager = minter_; gatewayManager = gatewayManager_; } uint256 public totalSupply; /** * @dev OS Operator filtering */ function setApprovalForAll( address operator, bool approved ) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } /** * @dev OS Operator filtering */ function approve( address operator, uint256 tokenId ) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } /** * @dev OS Operator filtering */ function transferFrom( address from, address to, uint256 tokenId ) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } /** * @dev OS Operator filtering */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } /** * @dev OS Operator filtering */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } address public mintingManager; address public gatewayManager; /** * @dev Creates a token with `id`, and assigns them to `to`. * In addition it sets the royalties for `royaltyRecipient` of the value `royaltyValue`. * Method emits two transfer events. * * Emits a {Transfer} event. * * Requirements: * * - `to` cannot be the zero address. */ function mintWithCreator( address creator, address to, uint256 tokenId, string memory cid, address royaltyRecipient, uint256 royaltyValue ) public onlyMinter { require(to != address(0), "mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _balances[to] += 1; totalSupply += 1; _owners[tokenId] = to; _cids[tokenId] = cid; if (royaltyValue > 0) { _setTokenRoyalty(tokenId, royaltyRecipient, royaltyValue); } emit Transfer(address(0), creator, tokenId); emit Transfer(creator, to, tokenId); } /** * @dev Creates a token with `id`, and assigns them to `to`. * In addition it sets the royalties for `royaltyRecipient` of the value `royaltyValue`. * Method emits two transfer events. * * Emits a {Transfer} events for intermediate artist. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function batchMintWithCreator( address[] memory to, address creator, uint256[] memory tokenIds, string[] memory tokenCids, address royaltyRecipient, uint256 royaltyValue ) public onlyMinter { require( tokenIds.length == to.length && tokenIds.length == tokenCids.length, "Arrays length mismatch" ); for (uint256 i = 0; i < tokenIds.length; i++) { mintWithCreator( creator, to[i], tokenIds[i], tokenCids[i], royaltyRecipient, royaltyValue ); } } modifier onlyMinter() { require(msg.sender == mintingManager); _; } modifier onlyGatewayManager() { require(msg.sender == gatewayManager); _; } function tokenURI( uint256 tokenId ) public view override(ERC721) returns (string memory) { return super.tokenURI(tokenId); } /** * @dev Checks for supported interface. * */ function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC721, ERC2981Base) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev Sets royalties for `tokenId` and `tokenRecipient` with royalty value `royaltyValue`. * */ function setRoyalties( uint256 tokenId, address royaltyRecipient, uint256 royaltyValue ) public onlyOwner { _setTokenRoyalty(tokenId, royaltyRecipient, royaltyValue); } /** * @dev Sets new minter for the contract. * */ function setMintingManager(address minter_) public onlyOwner { mintingManager = minter_; } /** * @dev Sets new gateway manager for the contract. * */ function setGatewayManager(address gatewayManager_) public onlyOwner { gatewayManager = gatewayManager_; } /** * @dev Sets base URI for metadata. * */ function setURI(string memory newuri) public onlyGatewayManager { _setURI(newuri); } /** * @dev Sets IPFS cid metadata hash for token id `tokenId`. * */ function setCID( uint256 tokenId, string memory cid ) public onlyGatewayManager { _cids[tokenId] = cid; } /** * @dev Sets IPFS cid metadata hash for token id `tokenId`. * */ function setCIDs( uint256[] memory tokenIds, string[] memory cids_ ) public onlyGatewayManager { require( tokenIds.length == cids_.length, "ERC1155: Arrays length mismatch" ); for (uint256 i = 0; i < tokenIds.length; i++) { _cids[tokenIds[i]] = cids_[i]; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {OperatorFilterer} from "./OperatorFilterer.sol"; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.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; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "./ERC165.sol"; import "./IERC2981Royalties.sol"; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 abstract contract ERC2981Base is ERC165, IERC2981Royalties { struct RoyaltyInfo { address recipient; uint24 amount; } /// @inheritdoc ERC165 function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC2981Royalties).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "./ERC165.sol"; import "./ERC2981Base.sol"; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 abstract contract ERC2981PerTokenRoyalties is ERC2981Base { mapping(uint256 => RoyaltyInfo) internal _royalties; /// @dev Sets token royalties /// @param tokenId the token id fir which we register the royalties /// @param recipient recipient of the royalties /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0) function _setTokenRoyalty( uint256 tokenId, address recipient, uint256 value ) internal { require(value <= 10000, "ERC2981Royalties: Too high"); _royalties[tokenId] = RoyaltyInfo(recipient, uint24(value)); } /// @inheritdoc IERC2981Royalties function royaltyInfo(uint256 tokenId, uint256 value) external view override returns (address receiver, uint256 royaltyAmount) { RoyaltyInfo memory royalties = _royalties[tokenId]; receiver = royalties.recipient; royaltyAmount = (value * royalties.amount) / 10000; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity 0.8.13; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.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 public _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) public _owners; // Mapping owner address to token count mapping(address => uint256) public _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; // Mapping from token ID to the IPFS cid mapping(uint256 => string) public _cids; // Used as the URI for all token types by relying on ID substitution, e.g. string public _baseUri; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor( string memory name_, string memory symbol_, string memory uri_ ) { _name = name_; _symbol = symbol_; _baseUri = uri_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf( address owner ) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: address zero is not a valid owner" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf( uint256 tokenId ) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI( uint256 tokenId ) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseUri; return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, _cids[tokenId])) : ""; } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism */ function _setURI(string memory newuri_) internal virtual { _baseUri = newuri_; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved( uint256 tokenId ) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll( address operator, bool approved ) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll( address owner, address operator ) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner( address spender, uint256 tokenId ) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev 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, string memory cid ) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; _cids[tokenId] = cid; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner" ); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 /* firstTokenId */, uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; /// @title IERC2981Royalties /// @dev Interface for the ERC2981 - Token Royalty standard interface IERC2981Royalties { /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _value - the sale price of the NFT asset specified by _tokenId /// @return _receiver - address of who should be sent the royalty payment /// @return _royaltyAmount - the royalty payment amount for value sale price function royaltyInfo(uint256 _tokenId, uint256 _value) external view returns (address _receiver, uint256 _royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"uri_","type":"string"},{"internalType":"address","name":"minter_","type":"address"},{"internalType":"address","name":"gatewayManager_","type":"address"},{"internalType":"string","name":"contractName_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_cids","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenCids","type":"string[]"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"batchMintWithCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gatewayManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"mintWithCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cid","type":"string"}],"name":"setCID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"cids_","type":"string[]"}],"name":"setCIDs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gatewayManager_","type":"address"}],"name":"setGatewayManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"setMintingManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004a1238038062004a128339818101604052810190620000379190620006f7565b733cc6cdda760b79bafa08df41ecfa224f810dceb66001826040518060400160405280600581526020017f56455253450000000000000000000000000000000000000000000000000000008152508782600090805190602001906200009e92919062000445565b508160019080519060200190620000b792919062000445565b508060079080519060200190620000d092919062000445565b50505050620000f4620000e86200037760201b60201c565b6200037f60201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002e9578015620001af576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000175929190620007b8565b600060405180830381600087803b1580156200019057600080fd5b505af1158015620001a5573d6000803e3d6000fd5b50505050620002e8565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000269576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200022f929190620007b8565b600060405180830381600087803b1580156200024a57600080fd5b505af11580156200025f573d6000803e3d6000fd5b50505050620002e7565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002b29190620007e5565b600060405180830381600087803b158015620002cd57600080fd5b505af1158015620002e2573d6000803e3d6000fd5b505050505b5b5b505082600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505062000866565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004539062000831565b90600052602060002090601f016020900481019282620004775760008555620004c3565b82601f106200049257805160ff1916838001178555620004c3565b82800160010185558215620004c3579182015b82811115620004c2578251825591602001919060010190620004a5565b5b509050620004d29190620004d6565b5090565b5b80821115620004f1576000816000905550600101620004d7565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200055e8262000513565b810181811067ffffffffffffffff8211171562000580576200057f62000524565b5b80604052505050565b600062000595620004f5565b9050620005a3828262000553565b919050565b600067ffffffffffffffff821115620005c657620005c562000524565b5b620005d18262000513565b9050602081019050919050565b60005b83811015620005fe578082015181840152602081019050620005e1565b838111156200060e576000848401525b50505050565b60006200062b6200062584620005a8565b62000589565b9050828152602081018484840111156200064a57620006496200050e565b5b62000657848285620005de565b509392505050565b600082601f83011262000677576200067662000509565b5b81516200068984826020860162000614565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006bf8262000692565b9050919050565b620006d181620006b2565b8114620006dd57600080fd5b50565b600081519050620006f181620006c6565b92915050565b60008060008060808587031215620007145762000713620004ff565b5b600085015167ffffffffffffffff81111562000735576200073462000504565b5b62000743878288016200065f565b94505060206200075687828801620006e0565b93505060406200076987828801620006e0565b925050606085015167ffffffffffffffff8111156200078d576200078c62000504565b5b6200079b878288016200065f565b91505092959194509250565b620007b281620006b2565b82525050565b6000604082019050620007cf6000830185620007a7565b620007de6020830184620007a7565b9392505050565b6000602082019050620007fc6000830184620007a7565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200084a57607f821691505b60208210810362000860576200085f62000802565b5b50919050565b61419c80620008766000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806370a082311161011a5780639e426399116100ad578063d0414c9d1161007c578063d0414c9d146105e8578063d28d885214610606578063e2c7f33814610624578063e985e9c514610640578063f2fde38b1461067057610206565b80639e42639914610564578063a22cb46514610580578063b88d4fde1461059c578063c87b56dd146105b857610206565b80638d2bb093116100e95780638d2bb093146104dc5780638da5cb5b146104f857806395d89b4114610516578063992924a61461053457610206565b806370a0823114610456578063715018a6146104865780637d1bbf7b1461049057806382295a2d146104c057610206565b8063337648b21161019d57806342842e0e1161016c57806342842e0e146103a057806358884432146103bc5780636352211e146103da5780636c52c3fb1461040a5780636ebcf6071461042657610206565b8063337648b21461032c5780633a330022146103485780633e63eb2a1461036457806341f434341461038257610206565b8063095ea7b3116101d9578063095ea7b3146102a557806318160ddd146102c157806323b872dd146102df5780632a55205a146102fb57610206565b806301ffc9a71461020b57806302fe53051461023b57806306fdde0314610257578063081812fc14610275575b600080fd5b610225600480360381019061022091906128a9565b61068c565b60405161023291906128f1565b60405180910390f35b61025560048036038101906102509190612a52565b61069e565b005b61025f610704565b60405161026c9190612b23565b60405180910390f35b61028f600480360381019061028a9190612b7b565b610796565b60405161029c9190612be9565b60405180910390f35b6102bf60048036038101906102ba9190612c30565b6107dc565b005b6102c96107f5565b6040516102d69190612c7f565b60405180910390f35b6102f960048036038101906102f49190612c9a565b6107fb565b005b61031560048036038101906103109190612ced565b61084a565b604051610323929190612d2d565b60405180910390f35b61034660048036038101906103419190612eff565b61091b565b005b610362600480360381019061035d9190612f77565b610a39565b005b61036c610a85565b6040516103799190612b23565b60405180910390f35b61038a610b13565b6040516103979190613003565b60405180910390f35b6103ba60048036038101906103b59190612c9a565b610b25565b005b6103c4610b74565b6040516103d19190612be9565b60405180910390f35b6103f460048036038101906103ef9190612b7b565b610b9a565b6040516104019190612be9565b60405180910390f35b610424600480360381019061041f9190612f77565b610c20565b005b610440600480360381019061043b9190612f77565b610c6c565b60405161044d9190612c7f565b60405180910390f35b610470600480360381019061046b9190612f77565b610c84565b60405161047d9190612c7f565b60405180910390f35b61048e610d3b565b005b6104aa60048036038101906104a59190612b7b565b610d4f565b6040516104b79190612b23565b60405180910390f35b6104da60048036038101906104d5919061301e565b610def565b005b6104f660048036038101906104f1919061307a565b610e75565b005b610500611146565b60405161050d9190612be9565b60405180910390f35b61051e611170565b60405161052b9190612b23565b60405180910390f35b61054e60048036038101906105499190612b7b565b611202565b60405161055b9190612be9565b60405180910390f35b61057e600480360381019061057991906131e6565b611235565b005b61059a600480360381019061059591906132f3565b611364565b005b6105b660048036038101906105b191906133d4565b61137d565b005b6105d260048036038101906105cd9190612b7b565b6113ce565b6040516105df9190612b23565b60405180910390f35b6105f06113e0565b6040516105fd9190612be9565b60405180910390f35b61060e611406565b60405161061b9190612b23565b60405180910390f35b61063e60048036038101906106399190613457565b611494565b005b61065a600480360381019061065591906134aa565b6114ac565b60405161066791906128f1565b60405180910390f35b61068a60048036038101906106859190612f77565b611540565b005b6000610697826115c3565b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106f857600080fd5b6107018161163d565b50565b60606000805461071390613519565b80601f016020809104026020016040519081016040528092919081815260200182805461073f90613519565b801561078c5780601f106107615761010080835404028352916020019161078c565b820191906000526020600020905b81548152906001019060200180831161076f57829003601f168201915b5050505050905090565b60006107a182611657565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b816107e6816116a2565b6107f0838361179f565b505050565b600a5481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461083957610838336116a2565b5b6108448484846118b6565b50505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff16856109079190613579565b6109119190613602565b9150509250929050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461097557600080fd5b80518251146109b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b09061367f565b60405180910390fd5b60005b8251811015610a34578181815181106109d8576109d761369f565b5b6020026020010151600660008584815181106109f7576109f661369f565b5b602002602001015181526020019081526020016000209080519060200190610a2092919061279a565b508080610a2c906136ce565b9150506109bc565b505050565b610a41611916565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60078054610a9290613519565b80601f0160208091040260200160405190810160405280929190818152602001828054610abe90613519565b8015610b0b5780601f10610ae057610100808354040283529160200191610b0b565b820191906000526020600020905b815481529060010190602001808311610aee57829003601f168201915b505050505081565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b6357610b62336116a2565b5b610b6e848484611994565b50505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610ba6836119b4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0e90613762565b60405180910390fd5b80915050919050565b610c28611916565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60036020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb906137f4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d43611916565b610d4d60006119f1565b565b60066020528060005260406000206000915090508054610d6e90613519565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9a90613519565b8015610de75780601f10610dbc57610100808354040283529160200191610de7565b820191906000526020600020905b815481529060010190602001808311610dca57829003601f168201915b505050505081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e4957600080fd5b80600660008481526020019081526020016000209080519060200190610e7092919061279a565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ecf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590613860565b60405180910390fd5b610f4784611ab7565b15610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e906138cc565b60405180910390fd5b6001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fd791906138ec565b925050819055506001600a6000828254610ff191906138ec565b92505081905550846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260066000868152602001908152602001600020908051906020019061107192919061279a565b50600081111561108757611086848383611af8565b5b838673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461117f90613519565b80601f01602080910402602001604051908101604052809291908181526020018280546111ab90613519565b80156111f85780601f106111cd576101008083540402835291602001916111f8565b820191906000526020600020905b8154815290600101906020018083116111db57829003601f168201915b5050505050905090565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461128f57600080fd5b855184511480156112a1575082518451145b6112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d79061398e565b60405180910390fd5b60005b845181101561135b57611348868883815181106113035761130261369f565b5b602002602001015187848151811061131e5761131d61369f565b5b60200260200101518785815181106113395761133861369f565b5b60200260200101518787610e75565b8080611353906136ce565b9150506112e3565b50505050505050565b8161136e816116a2565b6113788383611bf4565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113bb576113ba336116a2565b5b6113c785858585611c0a565b5050505050565b60606113d982611c6c565b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000805461141390613519565b80601f016020809104026020016040519081016040528092919081815260200182805461143f90613519565b801561148c5780601f106114615761010080835404028352916020019161148c565b820191906000526020600020905b81548152906001019060200180831161146f57829003601f168201915b505050505081565b61149c611916565b6114a7838383611af8565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611548611916565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae90613a20565b60405180910390fd5b6115c0816119f1565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611636575061163582611d61565b5b9050919050565b806007908051906020019061165392919061279a565b5050565b61166081611ab7565b61169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169690613762565b60405180910390fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561179c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611719929190613a40565b602060405180830381865afa158015611736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175a9190613a7e565b61179b57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016117929190612be9565b60405180910390fd5b5b50565b60006117aa82610b9a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181190613b1d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611839611e43565b73ffffffffffffffffffffffffffffffffffffffff161480611868575061186781611862611e43565b6114ac565b5b6118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189e90613baf565b60405180910390fd5b6118b18383611e4b565b505050565b6118c76118c1611e43565b82611f04565b611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd90613c41565b60405180910390fd5b611911838383611f99565b505050565b61191e611e43565b73ffffffffffffffffffffffffffffffffffffffff1661193c611146565b73ffffffffffffffffffffffffffffffffffffffff1614611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198990613cad565b60405180910390fd5b565b6119af8383836040518060200160405280600081525061137d565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff16611ad9836119b4565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612710811115611b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3490613d19565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff168152506009600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff160217905550905050505050565b611c06611bff611e43565b8383612292565b5050565b611c1b611c15611e43565b83611f04565b611c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5190613c41565b60405180910390fd5b611c66848484846123fe565b50505050565b6060611c7782611657565b600060078054611c8690613519565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb290613519565b8015611cff5780601f10611cd457610100808354040283529160200191611cff565b820191906000526020600020905b815481529060010190602001808311611ce257829003601f168201915b505050505090506000815111611d245760405180602001604052806000815250611d59565b8060066000858152602001908152602001600020604051602001611d49929190613e09565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e2c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e3c5750611e3b8261245a565b5b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ebe83610b9a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611f1083610b9a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f525750611f5181856114ac565b5b80611f9057508373ffffffffffffffffffffffffffffffffffffffff16611f7884610796565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611fb982610b9a565b73ffffffffffffffffffffffffffffffffffffffff161461200f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200690613e9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361207e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207590613f31565b60405180910390fd5b61208b83838360016124c4565b8273ffffffffffffffffffffffffffffffffffffffff166120ab82610b9a565b73ffffffffffffffffffffffffffffffffffffffff1614612101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f890613e9f565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461228d83838360016125ea565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f790613f9d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123f191906128f1565b60405180910390a3505050565b612409848484611f99565b612415848484846125f0565b612454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244b9061402f565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60018111156125e457600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146125585780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612550919061404f565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125e35780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125db91906138ec565b925050819055505b5b50505050565b50505050565b60006126118473ffffffffffffffffffffffffffffffffffffffff16612777565b1561276a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261263a611e43565b8786866040518563ffffffff1660e01b815260040161265c94939291906140d8565b6020604051808303816000875af192505050801561269857506040513d601f19601f820116820180604052508101906126959190614139565b60015b61271a573d80600081146126c8576040519150601f19603f3d011682016040523d82523d6000602084013e6126cd565b606091505b506000815103612712576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127099061402f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061276f565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546127a690613519565b90600052602060002090601f0160209004810192826127c8576000855561280f565b82601f106127e157805160ff191683800117855561280f565b8280016001018555821561280f579182015b8281111561280e5782518255916020019190600101906127f3565b5b50905061281c9190612820565b5090565b5b80821115612839576000816000905550600101612821565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61288681612851565b811461289157600080fd5b50565b6000813590506128a38161287d565b92915050565b6000602082840312156128bf576128be612847565b5b60006128cd84828501612894565b91505092915050565b60008115159050919050565b6128eb816128d6565b82525050565b600060208201905061290660008301846128e2565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61295f82612916565b810181811067ffffffffffffffff8211171561297e5761297d612927565b5b80604052505050565b600061299161283d565b905061299d8282612956565b919050565b600067ffffffffffffffff8211156129bd576129bc612927565b5b6129c682612916565b9050602081019050919050565b82818337600083830152505050565b60006129f56129f0846129a2565b612987565b905082815260208101848484011115612a1157612a10612911565b5b612a1c8482856129d3565b509392505050565b600082601f830112612a3957612a3861290c565b5b8135612a498482602086016129e2565b91505092915050565b600060208284031215612a6857612a67612847565b5b600082013567ffffffffffffffff811115612a8657612a8561284c565b5b612a9284828501612a24565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ad5578082015181840152602081019050612aba565b83811115612ae4576000848401525b50505050565b6000612af582612a9b565b612aff8185612aa6565b9350612b0f818560208601612ab7565b612b1881612916565b840191505092915050565b60006020820190508181036000830152612b3d8184612aea565b905092915050565b6000819050919050565b612b5881612b45565b8114612b6357600080fd5b50565b600081359050612b7581612b4f565b92915050565b600060208284031215612b9157612b90612847565b5b6000612b9f84828501612b66565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bd382612ba8565b9050919050565b612be381612bc8565b82525050565b6000602082019050612bfe6000830184612bda565b92915050565b612c0d81612bc8565b8114612c1857600080fd5b50565b600081359050612c2a81612c04565b92915050565b60008060408385031215612c4757612c46612847565b5b6000612c5585828601612c1b565b9250506020612c6685828601612b66565b9150509250929050565b612c7981612b45565b82525050565b6000602082019050612c946000830184612c70565b92915050565b600080600060608486031215612cb357612cb2612847565b5b6000612cc186828701612c1b565b9350506020612cd286828701612c1b565b9250506040612ce386828701612b66565b9150509250925092565b60008060408385031215612d0457612d03612847565b5b6000612d1285828601612b66565b9250506020612d2385828601612b66565b9150509250929050565b6000604082019050612d426000830185612bda565b612d4f6020830184612c70565b9392505050565b600067ffffffffffffffff821115612d7157612d70612927565b5b602082029050602081019050919050565b600080fd5b6000612d9a612d9584612d56565b612987565b90508083825260208201905060208402830185811115612dbd57612dbc612d82565b5b835b81811015612de65780612dd28882612b66565b845260208401935050602081019050612dbf565b5050509392505050565b600082601f830112612e0557612e0461290c565b5b8135612e15848260208601612d87565b91505092915050565b600067ffffffffffffffff821115612e3957612e38612927565b5b602082029050602081019050919050565b6000612e5d612e5884612e1e565b612987565b90508083825260208201905060208402830185811115612e8057612e7f612d82565b5b835b81811015612ec757803567ffffffffffffffff811115612ea557612ea461290c565b5b808601612eb28982612a24565b85526020850194505050602081019050612e82565b5050509392505050565b600082601f830112612ee657612ee561290c565b5b8135612ef6848260208601612e4a565b91505092915050565b60008060408385031215612f1657612f15612847565b5b600083013567ffffffffffffffff811115612f3457612f3361284c565b5b612f4085828601612df0565b925050602083013567ffffffffffffffff811115612f6157612f6061284c565b5b612f6d85828601612ed1565b9150509250929050565b600060208284031215612f8d57612f8c612847565b5b6000612f9b84828501612c1b565b91505092915050565b6000819050919050565b6000612fc9612fc4612fbf84612ba8565b612fa4565b612ba8565b9050919050565b6000612fdb82612fae565b9050919050565b6000612fed82612fd0565b9050919050565b612ffd81612fe2565b82525050565b60006020820190506130186000830184612ff4565b92915050565b6000806040838503121561303557613034612847565b5b600061304385828601612b66565b925050602083013567ffffffffffffffff8111156130645761306361284c565b5b61307085828601612a24565b9150509250929050565b60008060008060008060c0878903121561309757613096612847565b5b60006130a589828a01612c1b565b96505060206130b689828a01612c1b565b95505060406130c789828a01612b66565b945050606087013567ffffffffffffffff8111156130e8576130e761284c565b5b6130f489828a01612a24565b935050608061310589828a01612c1b565b92505060a061311689828a01612b66565b9150509295509295509295565b600067ffffffffffffffff82111561313e5761313d612927565b5b602082029050602081019050919050565b600061316261315d84613123565b612987565b9050808382526020820190506020840283018581111561318557613184612d82565b5b835b818110156131ae578061319a8882612c1b565b845260208401935050602081019050613187565b5050509392505050565b600082601f8301126131cd576131cc61290c565b5b81356131dd84826020860161314f565b91505092915050565b60008060008060008060c0878903121561320357613202612847565b5b600087013567ffffffffffffffff8111156132215761322061284c565b5b61322d89828a016131b8565b965050602061323e89828a01612c1b565b955050604087013567ffffffffffffffff81111561325f5761325e61284c565b5b61326b89828a01612df0565b945050606087013567ffffffffffffffff81111561328c5761328b61284c565b5b61329889828a01612ed1565b93505060806132a989828a01612c1b565b92505060a06132ba89828a01612b66565b9150509295509295509295565b6132d0816128d6565b81146132db57600080fd5b50565b6000813590506132ed816132c7565b92915050565b6000806040838503121561330a57613309612847565b5b600061331885828601612c1b565b9250506020613329858286016132de565b9150509250929050565b600067ffffffffffffffff82111561334e5761334d612927565b5b61335782612916565b9050602081019050919050565b600061337761337284613333565b612987565b90508281526020810184848401111561339357613392612911565b5b61339e8482856129d3565b509392505050565b600082601f8301126133bb576133ba61290c565b5b81356133cb848260208601613364565b91505092915050565b600080600080608085870312156133ee576133ed612847565b5b60006133fc87828801612c1b565b945050602061340d87828801612c1b565b935050604061341e87828801612b66565b925050606085013567ffffffffffffffff81111561343f5761343e61284c565b5b61344b878288016133a6565b91505092959194509250565b6000806000606084860312156134705761346f612847565b5b600061347e86828701612b66565b935050602061348f86828701612c1b565b92505060406134a086828701612b66565b9150509250925092565b600080604083850312156134c1576134c0612847565b5b60006134cf85828601612c1b565b92505060206134e085828601612c1b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061353157607f821691505b602082108103613544576135436134ea565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061358482612b45565b915061358f83612b45565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135c8576135c761354a565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061360d82612b45565b915061361883612b45565b925082613628576136276135d3565b5b828204905092915050565b7f455243313135353a20417272617973206c656e677468206d69736d6174636800600082015250565b6000613669601f83612aa6565b915061367482613633565b602082019050919050565b600060208201905081810360008301526136988161365c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006136d982612b45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361370b5761370a61354a565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061374c601883612aa6565b915061375782613716565b602082019050919050565b6000602082019050818103600083015261377b8161373f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006137de602983612aa6565b91506137e982613782565b604082019050919050565b6000602082019050818103600083015261380d816137d1565b9050919050565b7f6d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b600061384a601883612aa6565b915061385582613814565b602082019050919050565b600060208201905081810360008301526138798161383d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006138b6601c83612aa6565b91506138c182613880565b602082019050919050565b600060208201905081810360008301526138e5816138a9565b9050919050565b60006138f782612b45565b915061390283612b45565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139375761393661354a565b5b828201905092915050565b7f417272617973206c656e677468206d69736d6174636800000000000000000000600082015250565b6000613978601683612aa6565b915061398382613942565b602082019050919050565b600060208201905081810360008301526139a78161396b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613a0a602683612aa6565b9150613a15826139ae565b604082019050919050565b60006020820190508181036000830152613a39816139fd565b9050919050565b6000604082019050613a556000830185612bda565b613a626020830184612bda565b9392505050565b600081519050613a78816132c7565b92915050565b600060208284031215613a9457613a93612847565b5b6000613aa284828501613a69565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b07602183612aa6565b9150613b1282613aab565b604082019050919050565b60006020820190508181036000830152613b3681613afa565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613b99603d83612aa6565b9150613ba482613b3d565b604082019050919050565b60006020820190508181036000830152613bc881613b8c565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613c2b602d83612aa6565b9150613c3682613bcf565b604082019050919050565b60006020820190508181036000830152613c5a81613c1e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c97602083612aa6565b9150613ca282613c61565b602082019050919050565b60006020820190508181036000830152613cc681613c8a565b9050919050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b6000613d03601a83612aa6565b9150613d0e82613ccd565b602082019050919050565b60006020820190508181036000830152613d3281613cf6565b9050919050565b600081905092915050565b6000613d4f82612a9b565b613d598185613d39565b9350613d69818560208601612ab7565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613d9781613519565b613da18186613d39565b94506001821660008114613dbc5760018114613dcd57613e00565b60ff19831686528186019350613e00565b613dd685613d75565b60005b83811015613df857815481890152600182019150602081019050613dd9565b838801955050505b50505092915050565b6000613e158285613d44565b9150613e218284613d8a565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613e89602583612aa6565b9150613e9482613e2d565b604082019050919050565b60006020820190508181036000830152613eb881613e7c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f1b602483612aa6565b9150613f2682613ebf565b604082019050919050565b60006020820190508181036000830152613f4a81613f0e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613f87601983612aa6565b9150613f9282613f51565b602082019050919050565b60006020820190508181036000830152613fb681613f7a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614019603283612aa6565b915061402482613fbd565b604082019050919050565b600060208201905081810360008301526140488161400c565b9050919050565b600061405a82612b45565b915061406583612b45565b9250828210156140785761407761354a565b5b828203905092915050565b600081519050919050565b600082825260208201905092915050565b60006140aa82614083565b6140b4818561408e565b93506140c4818560208601612ab7565b6140cd81612916565b840191505092915050565b60006080820190506140ed6000830187612bda565b6140fa6020830186612bda565b6141076040830185612c70565b8181036060830152614119818461409f565b905095945050505050565b6000815190506141338161287d565b92915050565b60006020828403121561414f5761414e612847565b5b600061415d84828501614124565b9150509291505056fea264697066735822122055d79e382d32c920b872b8a54477136de4107c58507a4cadaa3a80b94f81353564736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de60000000000000000000000001bfe7452477accc0188c34b3a4e8e3b15bf671b000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e48656c6c6f204d6f64756c6f206279204e6174205361726b69737369616e0000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c806370a082311161011a5780639e426399116100ad578063d0414c9d1161007c578063d0414c9d146105e8578063d28d885214610606578063e2c7f33814610624578063e985e9c514610640578063f2fde38b1461067057610206565b80639e42639914610564578063a22cb46514610580578063b88d4fde1461059c578063c87b56dd146105b857610206565b80638d2bb093116100e95780638d2bb093146104dc5780638da5cb5b146104f857806395d89b4114610516578063992924a61461053457610206565b806370a0823114610456578063715018a6146104865780637d1bbf7b1461049057806382295a2d146104c057610206565b8063337648b21161019d57806342842e0e1161016c57806342842e0e146103a057806358884432146103bc5780636352211e146103da5780636c52c3fb1461040a5780636ebcf6071461042657610206565b8063337648b21461032c5780633a330022146103485780633e63eb2a1461036457806341f434341461038257610206565b8063095ea7b3116101d9578063095ea7b3146102a557806318160ddd146102c157806323b872dd146102df5780632a55205a146102fb57610206565b806301ffc9a71461020b57806302fe53051461023b57806306fdde0314610257578063081812fc14610275575b600080fd5b610225600480360381019061022091906128a9565b61068c565b60405161023291906128f1565b60405180910390f35b61025560048036038101906102509190612a52565b61069e565b005b61025f610704565b60405161026c9190612b23565b60405180910390f35b61028f600480360381019061028a9190612b7b565b610796565b60405161029c9190612be9565b60405180910390f35b6102bf60048036038101906102ba9190612c30565b6107dc565b005b6102c96107f5565b6040516102d69190612c7f565b60405180910390f35b6102f960048036038101906102f49190612c9a565b6107fb565b005b61031560048036038101906103109190612ced565b61084a565b604051610323929190612d2d565b60405180910390f35b61034660048036038101906103419190612eff565b61091b565b005b610362600480360381019061035d9190612f77565b610a39565b005b61036c610a85565b6040516103799190612b23565b60405180910390f35b61038a610b13565b6040516103979190613003565b60405180910390f35b6103ba60048036038101906103b59190612c9a565b610b25565b005b6103c4610b74565b6040516103d19190612be9565b60405180910390f35b6103f460048036038101906103ef9190612b7b565b610b9a565b6040516104019190612be9565b60405180910390f35b610424600480360381019061041f9190612f77565b610c20565b005b610440600480360381019061043b9190612f77565b610c6c565b60405161044d9190612c7f565b60405180910390f35b610470600480360381019061046b9190612f77565b610c84565b60405161047d9190612c7f565b60405180910390f35b61048e610d3b565b005b6104aa60048036038101906104a59190612b7b565b610d4f565b6040516104b79190612b23565b60405180910390f35b6104da60048036038101906104d5919061301e565b610def565b005b6104f660048036038101906104f1919061307a565b610e75565b005b610500611146565b60405161050d9190612be9565b60405180910390f35b61051e611170565b60405161052b9190612b23565b60405180910390f35b61054e60048036038101906105499190612b7b565b611202565b60405161055b9190612be9565b60405180910390f35b61057e600480360381019061057991906131e6565b611235565b005b61059a600480360381019061059591906132f3565b611364565b005b6105b660048036038101906105b191906133d4565b61137d565b005b6105d260048036038101906105cd9190612b7b565b6113ce565b6040516105df9190612b23565b60405180910390f35b6105f06113e0565b6040516105fd9190612be9565b60405180910390f35b61060e611406565b60405161061b9190612b23565b60405180910390f35b61063e60048036038101906106399190613457565b611494565b005b61065a600480360381019061065591906134aa565b6114ac565b60405161066791906128f1565b60405180910390f35b61068a60048036038101906106859190612f77565b611540565b005b6000610697826115c3565b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106f857600080fd5b6107018161163d565b50565b60606000805461071390613519565b80601f016020809104026020016040519081016040528092919081815260200182805461073f90613519565b801561078c5780601f106107615761010080835404028352916020019161078c565b820191906000526020600020905b81548152906001019060200180831161076f57829003601f168201915b5050505050905090565b60006107a182611657565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b816107e6816116a2565b6107f0838361179f565b505050565b600a5481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461083957610838336116a2565b5b6108448484846118b6565b50505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff16856109079190613579565b6109119190613602565b9150509250929050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461097557600080fd5b80518251146109b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b09061367f565b60405180910390fd5b60005b8251811015610a34578181815181106109d8576109d761369f565b5b6020026020010151600660008584815181106109f7576109f661369f565b5b602002602001015181526020019081526020016000209080519060200190610a2092919061279a565b508080610a2c906136ce565b9150506109bc565b505050565b610a41611916565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60078054610a9290613519565b80601f0160208091040260200160405190810160405280929190818152602001828054610abe90613519565b8015610b0b5780601f10610ae057610100808354040283529160200191610b0b565b820191906000526020600020905b815481529060010190602001808311610aee57829003601f168201915b505050505081565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b6357610b62336116a2565b5b610b6e848484611994565b50505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610ba6836119b4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0e90613762565b60405180910390fd5b80915050919050565b610c28611916565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60036020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb906137f4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d43611916565b610d4d60006119f1565b565b60066020528060005260406000206000915090508054610d6e90613519565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9a90613519565b8015610de75780601f10610dbc57610100808354040283529160200191610de7565b820191906000526020600020905b815481529060010190602001808311610dca57829003601f168201915b505050505081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e4957600080fd5b80600660008481526020019081526020016000209080519060200190610e7092919061279a565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ecf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590613860565b60405180910390fd5b610f4784611ab7565b15610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e906138cc565b60405180910390fd5b6001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fd791906138ec565b925050819055506001600a6000828254610ff191906138ec565b92505081905550846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260066000868152602001908152602001600020908051906020019061107192919061279a565b50600081111561108757611086848383611af8565b5b838673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461117f90613519565b80601f01602080910402602001604051908101604052809291908181526020018280546111ab90613519565b80156111f85780601f106111cd576101008083540402835291602001916111f8565b820191906000526020600020905b8154815290600101906020018083116111db57829003601f168201915b5050505050905090565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461128f57600080fd5b855184511480156112a1575082518451145b6112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d79061398e565b60405180910390fd5b60005b845181101561135b57611348868883815181106113035761130261369f565b5b602002602001015187848151811061131e5761131d61369f565b5b60200260200101518785815181106113395761133861369f565b5b60200260200101518787610e75565b8080611353906136ce565b9150506112e3565b50505050505050565b8161136e816116a2565b6113788383611bf4565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113bb576113ba336116a2565b5b6113c785858585611c0a565b5050505050565b60606113d982611c6c565b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000805461141390613519565b80601f016020809104026020016040519081016040528092919081815260200182805461143f90613519565b801561148c5780601f106114615761010080835404028352916020019161148c565b820191906000526020600020905b81548152906001019060200180831161146f57829003601f168201915b505050505081565b61149c611916565b6114a7838383611af8565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611548611916565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae90613a20565b60405180910390fd5b6115c0816119f1565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611636575061163582611d61565b5b9050919050565b806007908051906020019061165392919061279a565b5050565b61166081611ab7565b61169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169690613762565b60405180910390fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561179c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611719929190613a40565b602060405180830381865afa158015611736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175a9190613a7e565b61179b57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016117929190612be9565b60405180910390fd5b5b50565b60006117aa82610b9a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181190613b1d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611839611e43565b73ffffffffffffffffffffffffffffffffffffffff161480611868575061186781611862611e43565b6114ac565b5b6118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189e90613baf565b60405180910390fd5b6118b18383611e4b565b505050565b6118c76118c1611e43565b82611f04565b611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd90613c41565b60405180910390fd5b611911838383611f99565b505050565b61191e611e43565b73ffffffffffffffffffffffffffffffffffffffff1661193c611146565b73ffffffffffffffffffffffffffffffffffffffff1614611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198990613cad565b60405180910390fd5b565b6119af8383836040518060200160405280600081525061137d565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff16611ad9836119b4565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612710811115611b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3490613d19565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff168152506009600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff160217905550905050505050565b611c06611bff611e43565b8383612292565b5050565b611c1b611c15611e43565b83611f04565b611c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5190613c41565b60405180910390fd5b611c66848484846123fe565b50505050565b6060611c7782611657565b600060078054611c8690613519565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb290613519565b8015611cff5780601f10611cd457610100808354040283529160200191611cff565b820191906000526020600020905b815481529060010190602001808311611ce257829003601f168201915b505050505090506000815111611d245760405180602001604052806000815250611d59565b8060066000858152602001908152602001600020604051602001611d49929190613e09565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e2c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e3c5750611e3b8261245a565b5b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ebe83610b9a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611f1083610b9a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f525750611f5181856114ac565b5b80611f9057508373ffffffffffffffffffffffffffffffffffffffff16611f7884610796565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611fb982610b9a565b73ffffffffffffffffffffffffffffffffffffffff161461200f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200690613e9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361207e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207590613f31565b60405180910390fd5b61208b83838360016124c4565b8273ffffffffffffffffffffffffffffffffffffffff166120ab82610b9a565b73ffffffffffffffffffffffffffffffffffffffff1614612101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f890613e9f565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461228d83838360016125ea565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f790613f9d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123f191906128f1565b60405180910390a3505050565b612409848484611f99565b612415848484846125f0565b612454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244b9061402f565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60018111156125e457600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146125585780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612550919061404f565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125e35780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125db91906138ec565b925050819055505b5b50505050565b50505050565b60006126118473ffffffffffffffffffffffffffffffffffffffff16612777565b1561276a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261263a611e43565b8786866040518563ffffffff1660e01b815260040161265c94939291906140d8565b6020604051808303816000875af192505050801561269857506040513d601f19601f820116820180604052508101906126959190614139565b60015b61271a573d80600081146126c8576040519150601f19603f3d011682016040523d82523d6000602084013e6126cd565b606091505b506000815103612712576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127099061402f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061276f565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546127a690613519565b90600052602060002090601f0160209004810192826127c8576000855561280f565b82601f106127e157805160ff191683800117855561280f565b8280016001018555821561280f579182015b8281111561280e5782518255916020019190600101906127f3565b5b50905061281c9190612820565b5090565b5b80821115612839576000816000905550600101612821565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61288681612851565b811461289157600080fd5b50565b6000813590506128a38161287d565b92915050565b6000602082840312156128bf576128be612847565b5b60006128cd84828501612894565b91505092915050565b60008115159050919050565b6128eb816128d6565b82525050565b600060208201905061290660008301846128e2565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61295f82612916565b810181811067ffffffffffffffff8211171561297e5761297d612927565b5b80604052505050565b600061299161283d565b905061299d8282612956565b919050565b600067ffffffffffffffff8211156129bd576129bc612927565b5b6129c682612916565b9050602081019050919050565b82818337600083830152505050565b60006129f56129f0846129a2565b612987565b905082815260208101848484011115612a1157612a10612911565b5b612a1c8482856129d3565b509392505050565b600082601f830112612a3957612a3861290c565b5b8135612a498482602086016129e2565b91505092915050565b600060208284031215612a6857612a67612847565b5b600082013567ffffffffffffffff811115612a8657612a8561284c565b5b612a9284828501612a24565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ad5578082015181840152602081019050612aba565b83811115612ae4576000848401525b50505050565b6000612af582612a9b565b612aff8185612aa6565b9350612b0f818560208601612ab7565b612b1881612916565b840191505092915050565b60006020820190508181036000830152612b3d8184612aea565b905092915050565b6000819050919050565b612b5881612b45565b8114612b6357600080fd5b50565b600081359050612b7581612b4f565b92915050565b600060208284031215612b9157612b90612847565b5b6000612b9f84828501612b66565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bd382612ba8565b9050919050565b612be381612bc8565b82525050565b6000602082019050612bfe6000830184612bda565b92915050565b612c0d81612bc8565b8114612c1857600080fd5b50565b600081359050612c2a81612c04565b92915050565b60008060408385031215612c4757612c46612847565b5b6000612c5585828601612c1b565b9250506020612c6685828601612b66565b9150509250929050565b612c7981612b45565b82525050565b6000602082019050612c946000830184612c70565b92915050565b600080600060608486031215612cb357612cb2612847565b5b6000612cc186828701612c1b565b9350506020612cd286828701612c1b565b9250506040612ce386828701612b66565b9150509250925092565b60008060408385031215612d0457612d03612847565b5b6000612d1285828601612b66565b9250506020612d2385828601612b66565b9150509250929050565b6000604082019050612d426000830185612bda565b612d4f6020830184612c70565b9392505050565b600067ffffffffffffffff821115612d7157612d70612927565b5b602082029050602081019050919050565b600080fd5b6000612d9a612d9584612d56565b612987565b90508083825260208201905060208402830185811115612dbd57612dbc612d82565b5b835b81811015612de65780612dd28882612b66565b845260208401935050602081019050612dbf565b5050509392505050565b600082601f830112612e0557612e0461290c565b5b8135612e15848260208601612d87565b91505092915050565b600067ffffffffffffffff821115612e3957612e38612927565b5b602082029050602081019050919050565b6000612e5d612e5884612e1e565b612987565b90508083825260208201905060208402830185811115612e8057612e7f612d82565b5b835b81811015612ec757803567ffffffffffffffff811115612ea557612ea461290c565b5b808601612eb28982612a24565b85526020850194505050602081019050612e82565b5050509392505050565b600082601f830112612ee657612ee561290c565b5b8135612ef6848260208601612e4a565b91505092915050565b60008060408385031215612f1657612f15612847565b5b600083013567ffffffffffffffff811115612f3457612f3361284c565b5b612f4085828601612df0565b925050602083013567ffffffffffffffff811115612f6157612f6061284c565b5b612f6d85828601612ed1565b9150509250929050565b600060208284031215612f8d57612f8c612847565b5b6000612f9b84828501612c1b565b91505092915050565b6000819050919050565b6000612fc9612fc4612fbf84612ba8565b612fa4565b612ba8565b9050919050565b6000612fdb82612fae565b9050919050565b6000612fed82612fd0565b9050919050565b612ffd81612fe2565b82525050565b60006020820190506130186000830184612ff4565b92915050565b6000806040838503121561303557613034612847565b5b600061304385828601612b66565b925050602083013567ffffffffffffffff8111156130645761306361284c565b5b61307085828601612a24565b9150509250929050565b60008060008060008060c0878903121561309757613096612847565b5b60006130a589828a01612c1b565b96505060206130b689828a01612c1b565b95505060406130c789828a01612b66565b945050606087013567ffffffffffffffff8111156130e8576130e761284c565b5b6130f489828a01612a24565b935050608061310589828a01612c1b565b92505060a061311689828a01612b66565b9150509295509295509295565b600067ffffffffffffffff82111561313e5761313d612927565b5b602082029050602081019050919050565b600061316261315d84613123565b612987565b9050808382526020820190506020840283018581111561318557613184612d82565b5b835b818110156131ae578061319a8882612c1b565b845260208401935050602081019050613187565b5050509392505050565b600082601f8301126131cd576131cc61290c565b5b81356131dd84826020860161314f565b91505092915050565b60008060008060008060c0878903121561320357613202612847565b5b600087013567ffffffffffffffff8111156132215761322061284c565b5b61322d89828a016131b8565b965050602061323e89828a01612c1b565b955050604087013567ffffffffffffffff81111561325f5761325e61284c565b5b61326b89828a01612df0565b945050606087013567ffffffffffffffff81111561328c5761328b61284c565b5b61329889828a01612ed1565b93505060806132a989828a01612c1b565b92505060a06132ba89828a01612b66565b9150509295509295509295565b6132d0816128d6565b81146132db57600080fd5b50565b6000813590506132ed816132c7565b92915050565b6000806040838503121561330a57613309612847565b5b600061331885828601612c1b565b9250506020613329858286016132de565b9150509250929050565b600067ffffffffffffffff82111561334e5761334d612927565b5b61335782612916565b9050602081019050919050565b600061337761337284613333565b612987565b90508281526020810184848401111561339357613392612911565b5b61339e8482856129d3565b509392505050565b600082601f8301126133bb576133ba61290c565b5b81356133cb848260208601613364565b91505092915050565b600080600080608085870312156133ee576133ed612847565b5b60006133fc87828801612c1b565b945050602061340d87828801612c1b565b935050604061341e87828801612b66565b925050606085013567ffffffffffffffff81111561343f5761343e61284c565b5b61344b878288016133a6565b91505092959194509250565b6000806000606084860312156134705761346f612847565b5b600061347e86828701612b66565b935050602061348f86828701612c1b565b92505060406134a086828701612b66565b9150509250925092565b600080604083850312156134c1576134c0612847565b5b60006134cf85828601612c1b565b92505060206134e085828601612c1b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061353157607f821691505b602082108103613544576135436134ea565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061358482612b45565b915061358f83612b45565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135c8576135c761354a565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061360d82612b45565b915061361883612b45565b925082613628576136276135d3565b5b828204905092915050565b7f455243313135353a20417272617973206c656e677468206d69736d6174636800600082015250565b6000613669601f83612aa6565b915061367482613633565b602082019050919050565b600060208201905081810360008301526136988161365c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006136d982612b45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361370b5761370a61354a565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061374c601883612aa6565b915061375782613716565b602082019050919050565b6000602082019050818103600083015261377b8161373f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006137de602983612aa6565b91506137e982613782565b604082019050919050565b6000602082019050818103600083015261380d816137d1565b9050919050565b7f6d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b600061384a601883612aa6565b915061385582613814565b602082019050919050565b600060208201905081810360008301526138798161383d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006138b6601c83612aa6565b91506138c182613880565b602082019050919050565b600060208201905081810360008301526138e5816138a9565b9050919050565b60006138f782612b45565b915061390283612b45565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139375761393661354a565b5b828201905092915050565b7f417272617973206c656e677468206d69736d6174636800000000000000000000600082015250565b6000613978601683612aa6565b915061398382613942565b602082019050919050565b600060208201905081810360008301526139a78161396b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613a0a602683612aa6565b9150613a15826139ae565b604082019050919050565b60006020820190508181036000830152613a39816139fd565b9050919050565b6000604082019050613a556000830185612bda565b613a626020830184612bda565b9392505050565b600081519050613a78816132c7565b92915050565b600060208284031215613a9457613a93612847565b5b6000613aa284828501613a69565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b07602183612aa6565b9150613b1282613aab565b604082019050919050565b60006020820190508181036000830152613b3681613afa565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613b99603d83612aa6565b9150613ba482613b3d565b604082019050919050565b60006020820190508181036000830152613bc881613b8c565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613c2b602d83612aa6565b9150613c3682613bcf565b604082019050919050565b60006020820190508181036000830152613c5a81613c1e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c97602083612aa6565b9150613ca282613c61565b602082019050919050565b60006020820190508181036000830152613cc681613c8a565b9050919050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b6000613d03601a83612aa6565b9150613d0e82613ccd565b602082019050919050565b60006020820190508181036000830152613d3281613cf6565b9050919050565b600081905092915050565b6000613d4f82612a9b565b613d598185613d39565b9350613d69818560208601612ab7565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613d9781613519565b613da18186613d39565b94506001821660008114613dbc5760018114613dcd57613e00565b60ff19831686528186019350613e00565b613dd685613d75565b60005b83811015613df857815481890152600182019150602081019050613dd9565b838801955050505b50505092915050565b6000613e158285613d44565b9150613e218284613d8a565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613e89602583612aa6565b9150613e9482613e2d565b604082019050919050565b60006020820190508181036000830152613eb881613e7c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f1b602483612aa6565b9150613f2682613ebf565b604082019050919050565b60006020820190508181036000830152613f4a81613f0e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613f87601983612aa6565b9150613f9282613f51565b602082019050919050565b60006020820190508181036000830152613fb681613f7a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614019603283612aa6565b915061402482613fbd565b604082019050919050565b600060208201905081810360008301526140488161400c565b9050919050565b600061405a82612b45565b915061406583612b45565b9250828210156140785761407761354a565b5b828203905092915050565b600081519050919050565b600082825260208201905092915050565b60006140aa82614083565b6140b4818561408e565b93506140c4818560208601612ab7565b6140cd81612916565b840191505092915050565b60006080820190506140ed6000830187612bda565b6140fa6020830186612bda565b6141076040830185612c70565b8181036060830152614119818461409f565b905095945050505050565b6000815190506141338161287d565b92915050565b60006020828403121561414f5761414e612847565b5b600061415d84828501614124565b9150509291505056fea264697066735822122055d79e382d32c920b872b8a54477136de4107c58507a4cadaa3a80b94f81353564736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de60000000000000000000000001bfe7452477accc0188c34b3a4e8e3b15bf671b000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e48656c6c6f204d6f64756c6f206279204e6174205361726b69737369616e0000
-----Decoded View---------------
Arg [0] : uri_ (string): ipfs://
Arg [1] : minter_ (address): 0xe445Fb0297F7D1f507dF708185946210eB6a9DE6
Arg [2] : gatewayManager_ (address): 0x1BFe7452477Accc0188c34B3a4e8E3B15bF671B0
Arg [3] : contractName_ (string): Hello Modulo by Nat Sarkissian
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de6
Arg [2] : 0000000000000000000000001bfe7452477accc0188c34b3a4e8e3b15bf671b0
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [5] : 697066733a2f2f00000000000000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [7] : 48656c6c6f204d6f64756c6f206279204e6174205361726b69737369616e0000
Deployed Bytecode Sourcemap
266:6115:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4642:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5610:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2753:98:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4159:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;981:177:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;646:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1214:191;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;836:329:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;6029:350:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5423:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1379:22:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;737:142:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1461:199:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1954:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2458:233:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5237:102:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;925:44:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2149:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:16;;;:::i;:::-;;1254:39:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5799:137:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2358:677;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1194:85:16;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2915:102:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;832:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3544:676:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;729:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1716:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4420:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1990:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;711:19:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4954:208:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4648:184:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2074:198:16;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4642:186:13;4762:4;4785:36;4809:11;4785:23;:36::i;:::-;4778:43;;4642:186;;;:::o;5610:96::-;4381:14;;;;;;;;;;;4367:28;;:10;:28;;;4359:37;;;;;;5684:15:::1;5692:6;5684:7;:15::i;:::-;5610:96:::0;:::o;2753:98:6:-;2807:13;2839:5;2832:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2753:98;:::o;4159:181::-;4249:7;4268:23;4283:7;4268:14;:23::i;:::-;4309:15;:24;4325:7;4309:24;;;;;;;;;;;;;;;;;;;;;4302:31;;4159:181;;;:::o;981:177:13:-;1099:8;2227:30:15;2248:8;2227:20;:30::i;:::-;1119:32:13::1;1133:8;1143:7;1119:13;:32::i;:::-;981:177:::0;;;:::o;646:26::-;;;;:::o;1214:191::-;1345:4;2062:10:15;2054:18;;:4;:18;;;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;2050:81;1361:37:13::1;1380:4;1386:2;1390:7;1361:18;:37::i;:::-;1214:191:::0;;;;:::o;836:329:5:-;953:16;971:21;1008:28;1039:10;:19;1050:7;1039:19;;;;;;;;;;;1008:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1079:9;:19;;;1068:30;;1153:5;1133:9;:16;;;1125:24;;:5;:24;;;;:::i;:::-;1124:34;;;;:::i;:::-;1108:50;;998:167;836:329;;;;;:::o;6029:350:13:-;4381:14;;;;;;;;;;;4367:28;;:10;:28;;;4359:37;;;;;;6194:5:::1;:12;6175:8;:15;:31;6154:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;6278:9;6273:100;6297:8;:15;6293:1;:19;6273:100;;;6354:5;6360:1;6354:8;;;;;;;;:::i;:::-;;;;;;;;6333:5;:18;6339:8;6348:1;6339:11;;;;;;;;:::i;:::-;;;;;;;;6333:18;;;;;;;;;;;:29;;;;;;;;;;;;:::i;:::-;;6314:3;;;;;:::i;:::-;;;;6273:100;;;;6029:350:::0;;:::o;5423:118::-;1087:13:16;:11;:13::i;:::-;5519:15:13::1;5502:14;;:32;;;;;;;;;;;;;;;;;;5423:118:::0;:::o;1379:22:6:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;737:142:15:-;836:42;737:142;:::o;1461:199:13:-;1596:4;2062:10:15;2054:18;;:4;:18;;;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;2050:81;1612:41:13::1;1635:4;1641:2;1645:7;1612:22;:41::i;:::-;1461:199:::0;;;;:::o;1954:29::-;;;;;;;;;;;;;:::o;2458:233:6:-;2544:7;2563:13;2579:17;2588:7;2579:8;:17::i;:::-;2563:33;;2631:1;2614:19;;:5;:19;;;2606:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2679:5;2672:12;;;2458:233;;;:::o;5237:102:13:-;1087:13:16;:11;:13::i;:::-;5325:7:13::1;5308:14;;:24;;;;;;;;;;;;;;;;;;5237:102:::0;:::o;925:44:6:-;;;;;;;;;;;;;;;;;:::o;2149:252::-;2235:7;2292:1;2275:19;;:5;:19;;;2254:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2378:9;:16;2388:5;2378:16;;;;;;;;;;;;;;;;2371:23;;2149:252;;;:::o;1824:101:16:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;1254:39:6:-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5799:137:13:-;4381:14;;;;;;;;;;;4367:28;;:10;:28;;;4359:37;;;;;;5926:3:::1;5909:5;:14;5915:7;5909:14;;;;;;;;;;;:20;;;;;;;;;;;;:::i;:::-;;5799:137:::0;;:::o;2358:677::-;4280:14;;;;;;;;;;;4266:28;;:10;:28;;;4258:37;;;;;;2600:1:::1;2586:16;;:2;:16;;::::0;2578:53:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2650:16;2658:7;2650;:16::i;:::-;2649:17;2641:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2727:1;2710:9;:13;2720:2;2710:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;2753:1;2738:11;;:16;;;;;;;:::i;:::-;;;;;;;;2783:2;2764:7;:16;2772:7;2764:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;2812:3;2795:5;:14;2801:7;2795:14;;;;;;;;;;;:20;;;;;;;;;;;;:::i;:::-;;2845:1;2830:12;:16;2826:104;;;2862:57;2879:7;2888:16;2906:12;2862:16;:57::i;:::-;2826:104;2975:7;2966;2945:38;;2962:1;2945:38;;;;;;;;;;;;3020:7;3016:2;2998:30;;3007:7;2998:30;;;;;;;;;;;;2358:677:::0;;;;;;:::o;1194:85:16:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;2915:102:6:-;2971:13;3003:7;2996:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2915:102;:::o;832:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;3544:676:13:-;4280:14;;;;;;;;;;;4266:28;;:10;:28;;;4258:37;;;;;;3836:2:::1;:9;3817:8;:15;:28;:67;;;;;3868:9;:16;3849:8;:15;:35;3817:67;3796:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;3948:9;3943:271;3967:8;:15;3963:1;:19;3943:271;;;4003:200;4036:7;4061:2;4064:1;4061:5;;;;;;;;:::i;:::-;;;;;;;;4084:8;4093:1;4084:11;;;;;;;;:::i;:::-;;;;;;;;4113:9;4123:1;4113:12;;;;;;;;:::i;:::-;;;;;;;;4143:16;4177:12;4003:15;:200::i;:::-;3984:3;;;;;:::i;:::-;;;;3943:271;;;;3544:676:::0;;;;;;:::o;729:196::-;855:8;2227:30:15;2248:8;2227:20;:30::i;:::-;875:43:13::1;899:8;909;875:23;:43::i;:::-;729:196:::0;;;:::o;1716:232::-;1878:4;2062:10:15;2054:18;;:4;:18;;;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;2050:81;1894:47:13::1;1917:4;1923:2;1927:7;1936:4;1894:22;:47::i;:::-;1716:232:::0;;;;;:::o;4420:149::-;4507:13;4539:23;4554:7;4539:14;:23::i;:::-;4532:30;;4420:149;;;:::o;1990:29::-;;;;;;;;;;;;;:::o;711:19:6:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4954:208:13:-;1087:13:16;:11;:13::i;:::-;5098:57:13::1;5115:7;5124:16;5142:12;5098:16;:57::i;:::-;4954:208:::0;;;:::o;4648:184:6:-;4767:4;4790:18;:25;4809:5;4790:25;;;;;;;;;;;;;;;:35;4816:8;4790:35;;;;;;;;;;;;;;;;;;;;;;;;;4783:42;;4648:184;;;;:::o;2074:198:16:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;::::0;2154:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;365:273:4:-;490:4;544:35;529:50;;;:11;:50;;;;:102;;;;595:36;619:11;595:23;:36::i;:::-;529:102;510:121;;365:273;;;:::o;3543:92:6:-;3621:7;3610:8;:18;;;;;;;;;;;;:::i;:::-;;3543:92;:::o;13075:133::-;13156:16;13164:7;13156;:16::i;:::-;13148:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;13075:133;:::o;2281:412:15:-;2518:1;836:42;2470:45;;;:49;2466:221;;;836:42;2540;;;2591:4;2598:8;2540:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2535:142;;2653:8;2634:28;;;;;;;;;;;:::i;:::-;;;;;;;;2535:142;2466:221;2281:412;:::o;3692:406:6:-;3772:13;3788:23;3803:7;3788:14;:23::i;:::-;3772:39;;3835:5;3829:11;;:2;:11;;;3821:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3926:5;3910:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3935:37;3952:5;3959:12;:10;:12::i;:::-;3935:16;:37::i;:::-;3910:62;3889:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;4070:21;4079:2;4083:7;4070:8;:21::i;:::-;3762:336;3692:406;;:::o;4894:360::-;5096:41;5115:12;:10;:12::i;:::-;5129:7;5096:18;:41::i;:::-;5075:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;5219:28;5229:4;5235:2;5239:7;5219:9;:28::i;:::-;4894:360;;;:::o;1352:130:16:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;5320:179:6:-;5453:39;5470:4;5476:2;5480:7;5453:39;;;;;;;;;;;;:16;:39::i;:::-;5320:179;;;:::o;7222:115::-;7288:7;7314;:16;7322:7;7314:16;;;;;;;;;;;;;;;;;;;;;7307:23;;7222:115;;;:::o;2426:187:16:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;7640:126:6:-;7705:4;7757:1;7728:31;;:17;7737:7;7728:8;:17::i;:::-;:31;;;;7721:38;;7640:126;;;:::o;537:255:5:-;680:5;671;:14;;663:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;748:37;;;;;;;;760:9;748:37;;;;;;778:5;748:37;;;;;726:10;:19;737:7;726:19;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;537:255;;;:::o;4407:175:6:-;4523:52;4542:12;:10;:12::i;:::-;4556:8;4566;4523:18;:52::i;:::-;4407:175;;:::o;5565:348::-;5746:41;5765:12;:10;:12::i;:::-;5779:7;5746:18;:41::i;:::-;5725:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;5868:38;5882:4;5888:2;5892:7;5901:4;5868:13;:38::i;:::-;5565:348;;;;:::o;3083:328::-;3170:13;3195:23;3210:7;3195:14;:23::i;:::-;3229:21;3253:8;3229:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3314:1;3296:7;3290:21;:25;:114;;;;;;;;;;;;;;;;;3358:7;3367:5;:14;3373:7;3367:14;;;;;;;;;;;3341:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3290:114;3271:133;;;3083:328;;;:::o;1776:314::-;1892:4;1942:25;1927:40;;;:11;:40;;;;:104;;;;1998:33;1983:48;;;:11;:48;;;;1927:104;:156;;;;2047:36;2071:11;2047:23;:36::i;:::-;1927:156;1908:175;;1776:314;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;12377:171:6:-;12478:2;12451:15;:24;12467:7;12451:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12533:7;12529:2;12495:46;;12504:23;12519:7;12504:14;:23::i;:::-;12495:46;;;;;;;;;;;;12377:171;;:::o;7924:307::-;8039:4;8055:13;8071:23;8086:7;8071:14;:23::i;:::-;8055:39;;8123:5;8112:16;;:7;:16;;;:64;;;;8144:32;8161:5;8168:7;8144:16;:32::i;:::-;8112:64;:111;;;;8216:7;8192:31;;:20;8204:7;8192:11;:20::i;:::-;:31;;;8112:111;8104:120;;;7924:307;;;;:::o;10964:1301::-;11131:4;11104:31;;:23;11119:7;11104:14;:23::i;:::-;:31;;;11083:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;11230:1;11216:16;;:2;:16;;;11208:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11284:42;11305:4;11311:2;11315:7;11324:1;11284:20;:42::i;:::-;11466:4;11439:31;;:23;11454:7;11439:14;:23::i;:::-;:31;;;11418:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;11602:15;:24;11618:7;11602:24;;;;;;;;;;;;11595:31;;;;;;;;;;;12089:1;12070:9;:15;12080:4;12070:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;12121:1;12104:9;:13;12114:2;12104:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;12161:2;12142:7;:16;12150:7;12142:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;12198:7;12194:2;12179:27;;12188:4;12179:27;;;;;;;;;;;;12217:41;12237:4;12243:2;12247:7;12256:1;12217:19;:41::i;:::-;10964:1301;;;:::o;12684:307::-;12834:8;12825:17;;:5;:17;;;12817:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;12920:8;12882:18;:25;12901:5;12882:25;;;;;;;;;;;;;;;:35;12908:8;12882:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;12965:8;12943:41;;12958:5;12943:41;;;12975:8;12943:41;;;;;;:::i;:::-;;;;;;;;12684:307;;;:::o;6774:339::-;6924:28;6934:4;6940:2;6944:7;6924:9;:28::i;:::-;6983:47;7006:4;7012:2;7016:7;7025:4;6983:22;:47::i;:::-;6962:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;6774:339;;;;:::o;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;15479:396:6:-;15663:1;15651:9;:13;15647:222;;;15700:1;15684:18;;:4;:18;;;15680:85;;15741:9;15722;:15;15732:4;15722:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;15680:85;15796:1;15782:16;;:2;:16;;;15778:81;;15835:9;15818;:13;15828:2;15818:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;15778:81;15647:222;15479:396;;;;:::o;16581:153::-;;;;;:::o;13760:1003::-;13909:4;13929:15;:2;:13;;;:15::i;:::-;13925:832;;;13996:2;13980:36;;;14038:12;:10;:12::i;:::-;14072:4;14098:7;14127:4;13980:169;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;13960:745;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14345:1;14328:6;:13;:18;14324:367;;14370:106;;;;;;;;;;:::i;:::-;;;;;;;;14324:367;14643:6;14637:13;14628:6;14624:2;14620:15;14613:38;13960:745;14221:41;;;14211:51;;;:6;:51;;;;14204:58;;;;;13925:832;14742:4;14735:11;;13760:1003;;;;;;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:18:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:154::-;2878:6;2873:3;2868;2855:30;2940:1;2931:6;2926:3;2922:16;2915:27;2794:154;;;:::o;2954:412::-;3032:5;3057:66;3073:49;3115:6;3073:49;:::i;:::-;3057:66;:::i;:::-;3048:75;;3146:6;3139:5;3132:21;3184:4;3177:5;3173:16;3222:3;3213:6;3208:3;3204:16;3201:25;3198:112;;;3229:79;;:::i;:::-;3198:112;3319:41;3353:6;3348:3;3343;3319:41;:::i;:::-;3038:328;2954:412;;;;;:::o;3386:340::-;3442:5;3491:3;3484:4;3476:6;3472:17;3468:27;3458:122;;3499:79;;:::i;:::-;3458:122;3616:6;3603:20;3641:79;3716:3;3708:6;3701:4;3693:6;3689:17;3641:79;:::i;:::-;3632:88;;3448:278;3386:340;;;;:::o;3732:509::-;3801:6;3850:2;3838:9;3829:7;3825:23;3821:32;3818:119;;;3856:79;;:::i;:::-;3818:119;4004:1;3993:9;3989:17;3976:31;4034:18;4026:6;4023:30;4020:117;;;4056:79;;:::i;:::-;4020:117;4161:63;4216:7;4207:6;4196:9;4192:22;4161:63;:::i;:::-;4151:73;;3947:287;3732:509;;;;:::o;4247:99::-;4299:6;4333:5;4327:12;4317:22;;4247:99;;;:::o;4352:169::-;4436:11;4470:6;4465:3;4458:19;4510:4;4505:3;4501:14;4486:29;;4352:169;;;;:::o;4527:307::-;4595:1;4605:113;4619:6;4616:1;4613:13;4605:113;;;4704:1;4699:3;4695:11;4689:18;4685:1;4680:3;4676:11;4669:39;4641:2;4638:1;4634:10;4629:15;;4605:113;;;4736:6;4733:1;4730:13;4727:101;;;4816:1;4807:6;4802:3;4798:16;4791:27;4727:101;4576:258;4527:307;;;:::o;4840:364::-;4928:3;4956:39;4989:5;4956:39;:::i;:::-;5011:71;5075:6;5070:3;5011:71;:::i;:::-;5004:78;;5091:52;5136:6;5131:3;5124:4;5117:5;5113:16;5091:52;:::i;:::-;5168:29;5190:6;5168:29;:::i;:::-;5163:3;5159:39;5152:46;;4932:272;4840:364;;;;:::o;5210:313::-;5323:4;5361:2;5350:9;5346:18;5338:26;;5410:9;5404:4;5400:20;5396:1;5385:9;5381:17;5374:47;5438:78;5511:4;5502:6;5438:78;:::i;:::-;5430:86;;5210:313;;;;:::o;5529:77::-;5566:7;5595:5;5584:16;;5529:77;;;:::o;5612:122::-;5685:24;5703:5;5685:24;:::i;:::-;5678:5;5675:35;5665:63;;5724:1;5721;5714:12;5665:63;5612:122;:::o;5740:139::-;5786:5;5824:6;5811:20;5802:29;;5840:33;5867:5;5840:33;:::i;:::-;5740:139;;;;:::o;5885:329::-;5944:6;5993:2;5981:9;5972:7;5968:23;5964:32;5961:119;;;5999:79;;:::i;:::-;5961:119;6119:1;6144:53;6189:7;6180:6;6169:9;6165:22;6144:53;:::i;:::-;6134:63;;6090:117;5885:329;;;;:::o;6220:126::-;6257:7;6297:42;6290:5;6286:54;6275:65;;6220:126;;;:::o;6352:96::-;6389:7;6418:24;6436:5;6418:24;:::i;:::-;6407:35;;6352:96;;;:::o;6454:118::-;6541:24;6559:5;6541:24;:::i;:::-;6536:3;6529:37;6454:118;;:::o;6578:222::-;6671:4;6709:2;6698:9;6694:18;6686:26;;6722:71;6790:1;6779:9;6775:17;6766:6;6722:71;:::i;:::-;6578:222;;;;:::o;6806:122::-;6879:24;6897:5;6879:24;:::i;:::-;6872:5;6869:35;6859:63;;6918:1;6915;6908:12;6859:63;6806:122;:::o;6934:139::-;6980:5;7018:6;7005:20;6996:29;;7034:33;7061:5;7034:33;:::i;:::-;6934:139;;;;:::o;7079:474::-;7147:6;7155;7204:2;7192:9;7183:7;7179:23;7175:32;7172:119;;;7210:79;;:::i;:::-;7172:119;7330:1;7355:53;7400:7;7391:6;7380:9;7376:22;7355:53;:::i;:::-;7345:63;;7301:117;7457:2;7483:53;7528:7;7519:6;7508:9;7504:22;7483:53;:::i;:::-;7473:63;;7428:118;7079:474;;;;;:::o;7559:118::-;7646:24;7664:5;7646:24;:::i;:::-;7641:3;7634:37;7559:118;;:::o;7683:222::-;7776:4;7814:2;7803:9;7799:18;7791:26;;7827:71;7895:1;7884:9;7880:17;7871:6;7827:71;:::i;:::-;7683:222;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:474::-;8604:6;8612;8661:2;8649:9;8640:7;8636:23;8632:32;8629:119;;;8667:79;;:::i;:::-;8629:119;8787:1;8812:53;8857:7;8848:6;8837:9;8833:22;8812:53;:::i;:::-;8802:63;;8758:117;8914:2;8940:53;8985:7;8976:6;8965:9;8961:22;8940:53;:::i;:::-;8930:63;;8885:118;8536:474;;;;;:::o;9016:332::-;9137:4;9175:2;9164:9;9160:18;9152:26;;9188:71;9256:1;9245:9;9241:17;9232:6;9188:71;:::i;:::-;9269:72;9337:2;9326:9;9322:18;9313:6;9269:72;:::i;:::-;9016:332;;;;;:::o;9354:311::-;9431:4;9521:18;9513:6;9510:30;9507:56;;;9543:18;;:::i;:::-;9507:56;9593:4;9585:6;9581:17;9573:25;;9653:4;9647;9643:15;9635:23;;9354:311;;;:::o;9671:117::-;9780:1;9777;9770:12;9811:710;9907:5;9932:81;9948:64;10005:6;9948:64;:::i;:::-;9932:81;:::i;:::-;9923:90;;10033:5;10062:6;10055:5;10048:21;10096:4;10089:5;10085:16;10078:23;;10149:4;10141:6;10137:17;10129:6;10125:30;10178:3;10170:6;10167:15;10164:122;;;10197:79;;:::i;:::-;10164:122;10312:6;10295:220;10329:6;10324:3;10321:15;10295:220;;;10404:3;10433:37;10466:3;10454:10;10433:37;:::i;:::-;10428:3;10421:50;10500:4;10495:3;10491:14;10484:21;;10371:144;10355:4;10350:3;10346:14;10339:21;;10295:220;;;10299:21;9913:608;;9811:710;;;;;:::o;10544:370::-;10615:5;10664:3;10657:4;10649:6;10645:17;10641:27;10631:122;;10672:79;;:::i;:::-;10631:122;10789:6;10776:20;10814:94;10904:3;10896:6;10889:4;10881:6;10877:17;10814:94;:::i;:::-;10805:103;;10621:293;10544:370;;;;:::o;10920:321::-;11007:4;11097:18;11089:6;11086:30;11083:56;;;11119:18;;:::i;:::-;11083:56;11169:4;11161:6;11157:17;11149:25;;11229:4;11223;11219:15;11211:23;;10920:321;;;:::o;11263:945::-;11369:5;11394:91;11410:74;11477:6;11410:74;:::i;:::-;11394:91;:::i;:::-;11385:100;;11505:5;11534:6;11527:5;11520:21;11568:4;11561:5;11557:16;11550:23;;11621:4;11613:6;11609:17;11601:6;11597:30;11650:3;11642:6;11639:15;11636:122;;;11669:79;;:::i;:::-;11636:122;11784:6;11767:435;11801:6;11796:3;11793:15;11767:435;;;11890:3;11877:17;11926:18;11913:11;11910:35;11907:122;;;11948:79;;:::i;:::-;11907:122;12072:11;12064:6;12060:24;12110:47;12153:3;12141:10;12110:47;:::i;:::-;12105:3;12098:60;12187:4;12182:3;12178:14;12171:21;;11843:359;;11827:4;11822:3;11818:14;11811:21;;11767:435;;;11771:21;11375:833;;11263:945;;;;;:::o;12230:390::-;12311:5;12360:3;12353:4;12345:6;12341:17;12337:27;12327:122;;12368:79;;:::i;:::-;12327:122;12485:6;12472:20;12510:104;12610:3;12602:6;12595:4;12587:6;12583:17;12510:104;:::i;:::-;12501:113;;12317:303;12230:390;;;;:::o;12626:914::-;12754:6;12762;12811:2;12799:9;12790:7;12786:23;12782:32;12779:119;;;12817:79;;:::i;:::-;12779:119;12965:1;12954:9;12950:17;12937:31;12995:18;12987:6;12984:30;12981:117;;;13017:79;;:::i;:::-;12981:117;13122:78;13192:7;13183:6;13172:9;13168:22;13122:78;:::i;:::-;13112:88;;12908:302;13277:2;13266:9;13262:18;13249:32;13308:18;13300:6;13297:30;13294:117;;;13330:79;;:::i;:::-;13294:117;13435:88;13515:7;13506:6;13495:9;13491:22;13435:88;:::i;:::-;13425:98;;13220:313;12626:914;;;;;:::o;13546:329::-;13605:6;13654:2;13642:9;13633:7;13629:23;13625:32;13622:119;;;13660:79;;:::i;:::-;13622:119;13780:1;13805:53;13850:7;13841:6;13830:9;13826:22;13805:53;:::i;:::-;13795:63;;13751:117;13546:329;;;;:::o;13881:60::-;13909:3;13930:5;13923:12;;13881:60;;;:::o;13947:142::-;13997:9;14030:53;14048:34;14057:24;14075:5;14057:24;:::i;:::-;14048:34;:::i;:::-;14030:53;:::i;:::-;14017:66;;13947:142;;;:::o;14095:126::-;14145:9;14178:37;14209:5;14178:37;:::i;:::-;14165:50;;14095:126;;;:::o;14227:158::-;14309:9;14342:37;14373:5;14342:37;:::i;:::-;14329:50;;14227:158;;;:::o;14391:195::-;14510:69;14573:5;14510:69;:::i;:::-;14505:3;14498:82;14391:195;;:::o;14592:286::-;14717:4;14755:2;14744:9;14740:18;14732:26;;14768:103;14868:1;14857:9;14853:17;14844:6;14768:103;:::i;:::-;14592:286;;;;:::o;14884:654::-;14962:6;14970;15019:2;15007:9;14998:7;14994:23;14990:32;14987:119;;;15025:79;;:::i;:::-;14987:119;15145:1;15170:53;15215:7;15206:6;15195:9;15191:22;15170:53;:::i;:::-;15160:63;;15116:117;15300:2;15289:9;15285:18;15272:32;15331:18;15323:6;15320:30;15317:117;;;15353:79;;:::i;:::-;15317:117;15458:63;15513:7;15504:6;15493:9;15489:22;15458:63;:::i;:::-;15448:73;;15243:288;14884:654;;;;;:::o;15544:1237::-;15658:6;15666;15674;15682;15690;15698;15747:3;15735:9;15726:7;15722:23;15718:33;15715:120;;;15754:79;;:::i;:::-;15715:120;15874:1;15899:53;15944:7;15935:6;15924:9;15920:22;15899:53;:::i;:::-;15889:63;;15845:117;16001:2;16027:53;16072:7;16063:6;16052:9;16048:22;16027:53;:::i;:::-;16017:63;;15972:118;16129:2;16155:53;16200:7;16191:6;16180:9;16176:22;16155:53;:::i;:::-;16145:63;;16100:118;16285:2;16274:9;16270:18;16257:32;16316:18;16308:6;16305:30;16302:117;;;16338:79;;:::i;:::-;16302:117;16443:63;16498:7;16489:6;16478:9;16474:22;16443:63;:::i;:::-;16433:73;;16228:288;16555:3;16582:53;16627:7;16618:6;16607:9;16603:22;16582:53;:::i;:::-;16572:63;;16526:119;16684:3;16711:53;16756:7;16747:6;16736:9;16732:22;16711:53;:::i;:::-;16701:63;;16655:119;15544:1237;;;;;;;;:::o;16787:311::-;16864:4;16954:18;16946:6;16943:30;16940:56;;;16976:18;;:::i;:::-;16940:56;17026:4;17018:6;17014:17;17006:25;;17086:4;17080;17076:15;17068:23;;16787:311;;;:::o;17121:710::-;17217:5;17242:81;17258:64;17315:6;17258:64;:::i;:::-;17242:81;:::i;:::-;17233:90;;17343:5;17372:6;17365:5;17358:21;17406:4;17399:5;17395:16;17388:23;;17459:4;17451:6;17447:17;17439:6;17435:30;17488:3;17480:6;17477:15;17474:122;;;17507:79;;:::i;:::-;17474:122;17622:6;17605:220;17639:6;17634:3;17631:15;17605:220;;;17714:3;17743:37;17776:3;17764:10;17743:37;:::i;:::-;17738:3;17731:50;17810:4;17805:3;17801:14;17794:21;;17681:144;17665:4;17660:3;17656:14;17649:21;;17605:220;;;17609:21;17223:608;;17121:710;;;;;:::o;17854:370::-;17925:5;17974:3;17967:4;17959:6;17955:17;17951:27;17941:122;;17982:79;;:::i;:::-;17941:122;18099:6;18086:20;18124:94;18214:3;18206:6;18199:4;18191:6;18187:17;18124:94;:::i;:::-;18115:103;;17931:293;17854:370;;;;:::o;18230:1707::-;18419:6;18427;18435;18443;18451;18459;18508:3;18496:9;18487:7;18483:23;18479:33;18476:120;;;18515:79;;:::i;:::-;18476:120;18663:1;18652:9;18648:17;18635:31;18693:18;18685:6;18682:30;18679:117;;;18715:79;;:::i;:::-;18679:117;18820:78;18890:7;18881:6;18870:9;18866:22;18820:78;:::i;:::-;18810:88;;18606:302;18947:2;18973:53;19018:7;19009:6;18998:9;18994:22;18973:53;:::i;:::-;18963:63;;18918:118;19103:2;19092:9;19088:18;19075:32;19134:18;19126:6;19123:30;19120:117;;;19156:79;;:::i;:::-;19120:117;19261:78;19331:7;19322:6;19311:9;19307:22;19261:78;:::i;:::-;19251:88;;19046:303;19416:2;19405:9;19401:18;19388:32;19447:18;19439:6;19436:30;19433:117;;;19469:79;;:::i;:::-;19433:117;19574:88;19654:7;19645:6;19634:9;19630:22;19574:88;:::i;:::-;19564:98;;19359:313;19711:3;19738:53;19783:7;19774:6;19763:9;19759:22;19738:53;:::i;:::-;19728:63;;19682:119;19840:3;19867:53;19912:7;19903:6;19892:9;19888:22;19867:53;:::i;:::-;19857:63;;19811:119;18230:1707;;;;;;;;:::o;19943:116::-;20013:21;20028:5;20013:21;:::i;:::-;20006:5;20003:32;19993:60;;20049:1;20046;20039:12;19993:60;19943:116;:::o;20065:133::-;20108:5;20146:6;20133:20;20124:29;;20162:30;20186:5;20162:30;:::i;:::-;20065:133;;;;:::o;20204:468::-;20269:6;20277;20326:2;20314:9;20305:7;20301:23;20297:32;20294:119;;;20332:79;;:::i;:::-;20294:119;20452:1;20477:53;20522:7;20513:6;20502:9;20498:22;20477:53;:::i;:::-;20467:63;;20423:117;20579:2;20605:50;20647:7;20638:6;20627:9;20623:22;20605:50;:::i;:::-;20595:60;;20550:115;20204:468;;;;;:::o;20678:307::-;20739:4;20829:18;20821:6;20818:30;20815:56;;;20851:18;;:::i;:::-;20815:56;20889:29;20911:6;20889:29;:::i;:::-;20881:37;;20973:4;20967;20963:15;20955:23;;20678:307;;;:::o;20991:410::-;21068:5;21093:65;21109:48;21150:6;21109:48;:::i;:::-;21093:65;:::i;:::-;21084:74;;21181:6;21174:5;21167:21;21219:4;21212:5;21208:16;21257:3;21248:6;21243:3;21239:16;21236:25;21233:112;;;21264:79;;:::i;:::-;21233:112;21354:41;21388:6;21383:3;21378;21354:41;:::i;:::-;21074:327;20991:410;;;;;:::o;21420:338::-;21475:5;21524:3;21517:4;21509:6;21505:17;21501:27;21491:122;;21532:79;;:::i;:::-;21491:122;21649:6;21636:20;21674:78;21748:3;21740:6;21733:4;21725:6;21721:17;21674:78;:::i;:::-;21665:87;;21481:277;21420:338;;;;:::o;21764:943::-;21859:6;21867;21875;21883;21932:3;21920:9;21911:7;21907:23;21903:33;21900:120;;;21939:79;;:::i;:::-;21900:120;22059:1;22084:53;22129:7;22120:6;22109:9;22105:22;22084:53;:::i;:::-;22074:63;;22030:117;22186:2;22212:53;22257:7;22248:6;22237:9;22233:22;22212:53;:::i;:::-;22202:63;;22157:118;22314:2;22340:53;22385:7;22376:6;22365:9;22361:22;22340:53;:::i;:::-;22330:63;;22285:118;22470:2;22459:9;22455:18;22442:32;22501:18;22493:6;22490:30;22487:117;;;22523:79;;:::i;:::-;22487:117;22628:62;22682:7;22673:6;22662:9;22658:22;22628:62;:::i;:::-;22618:72;;22413:287;21764:943;;;;;;;:::o;22713:619::-;22790:6;22798;22806;22855:2;22843:9;22834:7;22830:23;22826:32;22823:119;;;22861:79;;:::i;:::-;22823:119;22981:1;23006:53;23051:7;23042:6;23031:9;23027:22;23006:53;:::i;:::-;22996:63;;22952:117;23108:2;23134:53;23179:7;23170:6;23159:9;23155:22;23134:53;:::i;:::-;23124:63;;23079:118;23236:2;23262:53;23307:7;23298:6;23287:9;23283:22;23262:53;:::i;:::-;23252:63;;23207:118;22713:619;;;;;:::o;23338:474::-;23406:6;23414;23463:2;23451:9;23442:7;23438:23;23434:32;23431:119;;;23469:79;;:::i;:::-;23431:119;23589:1;23614:53;23659:7;23650:6;23639:9;23635:22;23614:53;:::i;:::-;23604:63;;23560:117;23716:2;23742:53;23787:7;23778:6;23767:9;23763:22;23742:53;:::i;:::-;23732:63;;23687:118;23338:474;;;;;:::o;23818:180::-;23866:77;23863:1;23856:88;23963:4;23960:1;23953:15;23987:4;23984:1;23977:15;24004:320;24048:6;24085:1;24079:4;24075:12;24065:22;;24132:1;24126:4;24122:12;24153:18;24143:81;;24209:4;24201:6;24197:17;24187:27;;24143:81;24271:2;24263:6;24260:14;24240:18;24237:38;24234:84;;24290:18;;:::i;:::-;24234:84;24055:269;24004:320;;;:::o;24330:180::-;24378:77;24375:1;24368:88;24475:4;24472:1;24465:15;24499:4;24496:1;24489:15;24516:348;24556:7;24579:20;24597:1;24579:20;:::i;:::-;24574:25;;24613:20;24631:1;24613:20;:::i;:::-;24608:25;;24801:1;24733:66;24729:74;24726:1;24723:81;24718:1;24711:9;24704:17;24700:105;24697:131;;;24808:18;;:::i;:::-;24697:131;24856:1;24853;24849:9;24838:20;;24516:348;;;;:::o;24870:180::-;24918:77;24915:1;24908:88;25015:4;25012:1;25005:15;25039:4;25036:1;25029:15;25056:185;25096:1;25113:20;25131:1;25113:20;:::i;:::-;25108:25;;25147:20;25165:1;25147:20;:::i;:::-;25142:25;;25186:1;25176:35;;25191:18;;:::i;:::-;25176:35;25233:1;25230;25226:9;25221:14;;25056:185;;;;:::o;25247:181::-;25387:33;25383:1;25375:6;25371:14;25364:57;25247:181;:::o;25434:366::-;25576:3;25597:67;25661:2;25656:3;25597:67;:::i;:::-;25590:74;;25673:93;25762:3;25673:93;:::i;:::-;25791:2;25786:3;25782:12;25775:19;;25434:366;;;:::o;25806:419::-;25972:4;26010:2;25999:9;25995:18;25987:26;;26059:9;26053:4;26049:20;26045:1;26034:9;26030:17;26023:47;26087:131;26213:4;26087:131;:::i;:::-;26079:139;;25806:419;;;:::o;26231:180::-;26279:77;26276:1;26269:88;26376:4;26373:1;26366:15;26400:4;26397:1;26390:15;26417:233;26456:3;26479:24;26497:5;26479:24;:::i;:::-;26470:33;;26525:66;26518:5;26515:77;26512:103;;26595:18;;:::i;:::-;26512:103;26642:1;26635:5;26631:13;26624:20;;26417:233;;;:::o;26656:174::-;26796:26;26792:1;26784:6;26780:14;26773:50;26656:174;:::o;26836:366::-;26978:3;26999:67;27063:2;27058:3;26999:67;:::i;:::-;26992:74;;27075:93;27164:3;27075:93;:::i;:::-;27193:2;27188:3;27184:12;27177:19;;26836:366;;;:::o;27208:419::-;27374:4;27412:2;27401:9;27397:18;27389:26;;27461:9;27455:4;27451:20;27447:1;27436:9;27432:17;27425:47;27489:131;27615:4;27489:131;:::i;:::-;27481:139;;27208:419;;;:::o;27633:228::-;27773:34;27769:1;27761:6;27757:14;27750:58;27842:11;27837:2;27829:6;27825:15;27818:36;27633:228;:::o;27867:366::-;28009:3;28030:67;28094:2;28089:3;28030:67;:::i;:::-;28023:74;;28106:93;28195:3;28106:93;:::i;:::-;28224:2;28219:3;28215:12;28208:19;;27867:366;;;:::o;28239:419::-;28405:4;28443:2;28432:9;28428:18;28420:26;;28492:9;28486:4;28482:20;28478:1;28467:9;28463:17;28456:47;28520:131;28646:4;28520:131;:::i;:::-;28512:139;;28239:419;;;:::o;28664:174::-;28804:26;28800:1;28792:6;28788:14;28781:50;28664:174;:::o;28844:366::-;28986:3;29007:67;29071:2;29066:3;29007:67;:::i;:::-;29000:74;;29083:93;29172:3;29083:93;:::i;:::-;29201:2;29196:3;29192:12;29185:19;;28844:366;;;:::o;29216:419::-;29382:4;29420:2;29409:9;29405:18;29397:26;;29469:9;29463:4;29459:20;29455:1;29444:9;29440:17;29433:47;29497:131;29623:4;29497:131;:::i;:::-;29489:139;;29216:419;;;:::o;29641:178::-;29781:30;29777:1;29769:6;29765:14;29758:54;29641:178;:::o;29825:366::-;29967:3;29988:67;30052:2;30047:3;29988:67;:::i;:::-;29981:74;;30064:93;30153:3;30064:93;:::i;:::-;30182:2;30177:3;30173:12;30166:19;;29825:366;;;:::o;30197:419::-;30363:4;30401:2;30390:9;30386:18;30378:26;;30450:9;30444:4;30440:20;30436:1;30425:9;30421:17;30414:47;30478:131;30604:4;30478:131;:::i;:::-;30470:139;;30197:419;;;:::o;30622:305::-;30662:3;30681:20;30699:1;30681:20;:::i;:::-;30676:25;;30715:20;30733:1;30715:20;:::i;:::-;30710:25;;30869:1;30801:66;30797:74;30794:1;30791:81;30788:107;;;30875:18;;:::i;:::-;30788:107;30919:1;30916;30912:9;30905:16;;30622:305;;;;:::o;30933:172::-;31073:24;31069:1;31061:6;31057:14;31050:48;30933:172;:::o;31111:366::-;31253:3;31274:67;31338:2;31333:3;31274:67;:::i;:::-;31267:74;;31350:93;31439:3;31350:93;:::i;:::-;31468:2;31463:3;31459:12;31452:19;;31111:366;;;:::o;31483:419::-;31649:4;31687:2;31676:9;31672:18;31664:26;;31736:9;31730:4;31726:20;31722:1;31711:9;31707:17;31700:47;31764:131;31890:4;31764:131;:::i;:::-;31756:139;;31483:419;;;:::o;31908:225::-;32048:34;32044:1;32036:6;32032:14;32025:58;32117:8;32112:2;32104:6;32100:15;32093:33;31908:225;:::o;32139:366::-;32281:3;32302:67;32366:2;32361:3;32302:67;:::i;:::-;32295:74;;32378:93;32467:3;32378:93;:::i;:::-;32496:2;32491:3;32487:12;32480:19;;32139:366;;;:::o;32511:419::-;32677:4;32715:2;32704:9;32700:18;32692:26;;32764:9;32758:4;32754:20;32750:1;32739:9;32735:17;32728:47;32792:131;32918:4;32792:131;:::i;:::-;32784:139;;32511:419;;;:::o;32936:332::-;33057:4;33095:2;33084:9;33080:18;33072:26;;33108:71;33176:1;33165:9;33161:17;33152:6;33108:71;:::i;:::-;33189:72;33257:2;33246:9;33242:18;33233:6;33189:72;:::i;:::-;32936:332;;;;;:::o;33274:137::-;33328:5;33359:6;33353:13;33344:22;;33375:30;33399:5;33375:30;:::i;:::-;33274:137;;;;:::o;33417:345::-;33484:6;33533:2;33521:9;33512:7;33508:23;33504:32;33501:119;;;33539:79;;:::i;:::-;33501:119;33659:1;33684:61;33737:7;33728:6;33717:9;33713:22;33684:61;:::i;:::-;33674:71;;33630:125;33417:345;;;;:::o;33768:220::-;33908:34;33904:1;33896:6;33892:14;33885:58;33977:3;33972:2;33964:6;33960:15;33953:28;33768:220;:::o;33994:366::-;34136:3;34157:67;34221:2;34216:3;34157:67;:::i;:::-;34150:74;;34233:93;34322:3;34233:93;:::i;:::-;34351:2;34346:3;34342:12;34335:19;;33994:366;;;:::o;34366:419::-;34532:4;34570:2;34559:9;34555:18;34547:26;;34619:9;34613:4;34609:20;34605:1;34594:9;34590:17;34583:47;34647:131;34773:4;34647:131;:::i;:::-;34639:139;;34366:419;;;:::o;34791:248::-;34931:34;34927:1;34919:6;34915:14;34908:58;35000:31;34995:2;34987:6;34983:15;34976:56;34791:248;:::o;35045:366::-;35187:3;35208:67;35272:2;35267:3;35208:67;:::i;:::-;35201:74;;35284:93;35373:3;35284:93;:::i;:::-;35402:2;35397:3;35393:12;35386:19;;35045:366;;;:::o;35417:419::-;35583:4;35621:2;35610:9;35606:18;35598:26;;35670:9;35664:4;35660:20;35656:1;35645:9;35641:17;35634:47;35698:131;35824:4;35698:131;:::i;:::-;35690:139;;35417:419;;;:::o;35842:232::-;35982:34;35978:1;35970:6;35966:14;35959:58;36051:15;36046:2;36038:6;36034:15;36027:40;35842:232;:::o;36080:366::-;36222:3;36243:67;36307:2;36302:3;36243:67;:::i;:::-;36236:74;;36319:93;36408:3;36319:93;:::i;:::-;36437:2;36432:3;36428:12;36421:19;;36080:366;;;:::o;36452:419::-;36618:4;36656:2;36645:9;36641:18;36633:26;;36705:9;36699:4;36695:20;36691:1;36680:9;36676:17;36669:47;36733:131;36859:4;36733:131;:::i;:::-;36725:139;;36452:419;;;:::o;36877:182::-;37017:34;37013:1;37005:6;37001:14;36994:58;36877:182;:::o;37065:366::-;37207:3;37228:67;37292:2;37287:3;37228:67;:::i;:::-;37221:74;;37304:93;37393:3;37304:93;:::i;:::-;37422:2;37417:3;37413:12;37406:19;;37065:366;;;:::o;37437:419::-;37603:4;37641:2;37630:9;37626:18;37618:26;;37690:9;37684:4;37680:20;37676:1;37665:9;37661:17;37654:47;37718:131;37844:4;37718:131;:::i;:::-;37710:139;;37437:419;;;:::o;37862:176::-;38002:28;37998:1;37990:6;37986:14;37979:52;37862:176;:::o;38044:366::-;38186:3;38207:67;38271:2;38266:3;38207:67;:::i;:::-;38200:74;;38283:93;38372:3;38283:93;:::i;:::-;38401:2;38396:3;38392:12;38385:19;;38044:366;;;:::o;38416:419::-;38582:4;38620:2;38609:9;38605:18;38597:26;;38669:9;38663:4;38659:20;38655:1;38644:9;38640:17;38633:47;38697:131;38823:4;38697:131;:::i;:::-;38689:139;;38416:419;;;:::o;38841:148::-;38943:11;38980:3;38965:18;;38841:148;;;;:::o;38995:377::-;39101:3;39129:39;39162:5;39129:39;:::i;:::-;39184:89;39266:6;39261:3;39184:89;:::i;:::-;39177:96;;39282:52;39327:6;39322:3;39315:4;39308:5;39304:16;39282:52;:::i;:::-;39359:6;39354:3;39350:16;39343:23;;39105:267;38995:377;;;;:::o;39378:141::-;39427:4;39450:3;39442:11;;39473:3;39470:1;39463:14;39507:4;39504:1;39494:18;39486:26;;39378:141;;;:::o;39549:845::-;39652:3;39689:5;39683:12;39718:36;39744:9;39718:36;:::i;:::-;39770:89;39852:6;39847:3;39770:89;:::i;:::-;39763:96;;39890:1;39879:9;39875:17;39906:1;39901:137;;;;40052:1;40047:341;;;;39868:520;;39901:137;39985:4;39981:9;39970;39966:25;39961:3;39954:38;40021:6;40016:3;40012:16;40005:23;;39901:137;;40047:341;40114:38;40146:5;40114:38;:::i;:::-;40174:1;40188:154;40202:6;40199:1;40196:13;40188:154;;;40276:7;40270:14;40266:1;40261:3;40257:11;40250:35;40326:1;40317:7;40313:15;40302:26;;40224:4;40221:1;40217:12;40212:17;;40188:154;;;40371:6;40366:3;40362:16;40355:23;;40054:334;;39868:520;;39656:738;;39549:845;;;;:::o;40400:429::-;40577:3;40599:95;40690:3;40681:6;40599:95;:::i;:::-;40592:102;;40711:92;40799:3;40790:6;40711:92;:::i;:::-;40704:99;;40820:3;40813:10;;40400:429;;;;;:::o;40835:224::-;40975:34;40971:1;40963:6;40959:14;40952:58;41044:7;41039:2;41031:6;41027:15;41020:32;40835:224;:::o;41065:366::-;41207:3;41228:67;41292:2;41287:3;41228:67;:::i;:::-;41221:74;;41304:93;41393:3;41304:93;:::i;:::-;41422:2;41417:3;41413:12;41406:19;;41065:366;;;:::o;41437:419::-;41603:4;41641:2;41630:9;41626:18;41618:26;;41690:9;41684:4;41680:20;41676:1;41665:9;41661:17;41654:47;41718:131;41844:4;41718:131;:::i;:::-;41710:139;;41437:419;;;:::o;41862:223::-;42002:34;41998:1;41990:6;41986:14;41979:58;42071:6;42066:2;42058:6;42054:15;42047:31;41862:223;:::o;42091:366::-;42233:3;42254:67;42318:2;42313:3;42254:67;:::i;:::-;42247:74;;42330:93;42419:3;42330:93;:::i;:::-;42448:2;42443:3;42439:12;42432:19;;42091:366;;;:::o;42463:419::-;42629:4;42667:2;42656:9;42652:18;42644:26;;42716:9;42710:4;42706:20;42702:1;42691:9;42687:17;42680:47;42744:131;42870:4;42744:131;:::i;:::-;42736:139;;42463:419;;;:::o;42888:175::-;43028:27;43024:1;43016:6;43012:14;43005:51;42888:175;:::o;43069:366::-;43211:3;43232:67;43296:2;43291:3;43232:67;:::i;:::-;43225:74;;43308:93;43397:3;43308:93;:::i;:::-;43426:2;43421:3;43417:12;43410:19;;43069:366;;;:::o;43441:419::-;43607:4;43645:2;43634:9;43630:18;43622:26;;43694:9;43688:4;43684:20;43680:1;43669:9;43665:17;43658:47;43722:131;43848:4;43722:131;:::i;:::-;43714:139;;43441:419;;;:::o;43866:237::-;44006:34;44002:1;43994:6;43990:14;43983:58;44075:20;44070:2;44062:6;44058:15;44051:45;43866:237;:::o;44109:366::-;44251:3;44272:67;44336:2;44331:3;44272:67;:::i;:::-;44265:74;;44348:93;44437:3;44348:93;:::i;:::-;44466:2;44461:3;44457:12;44450:19;;44109:366;;;:::o;44481:419::-;44647:4;44685:2;44674:9;44670:18;44662:26;;44734:9;44728:4;44724:20;44720:1;44709:9;44705:17;44698:47;44762:131;44888:4;44762:131;:::i;:::-;44754:139;;44481:419;;;:::o;44906:191::-;44946:4;44966:20;44984:1;44966:20;:::i;:::-;44961:25;;45000:20;45018:1;45000:20;:::i;:::-;44995:25;;45039:1;45036;45033:8;45030:34;;;45044:18;;:::i;:::-;45030:34;45089:1;45086;45082:9;45074:17;;44906:191;;;;:::o;45103:98::-;45154:6;45188:5;45182:12;45172:22;;45103:98;;;:::o;45207:168::-;45290:11;45324:6;45319:3;45312:19;45364:4;45359:3;45355:14;45340:29;;45207:168;;;;:::o;45381:360::-;45467:3;45495:38;45527:5;45495:38;:::i;:::-;45549:70;45612:6;45607:3;45549:70;:::i;:::-;45542:77;;45628:52;45673:6;45668:3;45661:4;45654:5;45650:16;45628:52;:::i;:::-;45705:29;45727:6;45705:29;:::i;:::-;45700:3;45696:39;45689:46;;45471:270;45381:360;;;;:::o;45747:640::-;45942:4;45980:3;45969:9;45965:19;45957:27;;45994:71;46062:1;46051:9;46047:17;46038:6;45994:71;:::i;:::-;46075:72;46143:2;46132:9;46128:18;46119:6;46075:72;:::i;:::-;46157;46225:2;46214:9;46210:18;46201:6;46157:72;:::i;:::-;46276:9;46270:4;46266:20;46261:2;46250:9;46246:18;46239:48;46304:76;46375:4;46366:6;46304:76;:::i;:::-;46296:84;;45747:640;;;;;;;:::o;46393:141::-;46449:5;46480:6;46474:13;46465:22;;46496:32;46522:5;46496:32;:::i;:::-;46393:141;;;;:::o;46540:349::-;46609:6;46658:2;46646:9;46637:7;46633:23;46629:32;46626:119;;;46664:79;;:::i;:::-;46626:119;46784:1;46809:63;46864:7;46855:6;46844:9;46840:22;46809:63;:::i;:::-;46799:73;;46755:127;46540:349;;;;:::o
Swarm Source
ipfs://55d79e382d32c920b872b8a54477136de4107c58507a4cadaa3a80b94f813535
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.