Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 10 from a total of 10 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 15731555 | 730 days ago | IN | 0 ETH | 0.00172268 | ||||
Transfer Ownersh... | 15520518 | 760 days ago | IN | 0 ETH | 0.00019024 | ||||
Safe Transfer Fr... | 15519367 | 760 days ago | IN | 0 ETH | 0.00061757 | ||||
Change Base URI | 15497487 | 763 days ago | IN | 0 ETH | 0.00122379 | ||||
Move To Chain | 15497389 | 763 days ago | IN | 0 ETH | 0.00367284 | ||||
Move To Chain | 15497352 | 763 days ago | IN | 0 ETH | 0.00873095 | ||||
Set Approval For... | 15476963 | 767 days ago | IN | 0 ETH | 0.00042182 | ||||
Change Base URI | 15397746 | 779 days ago | IN | 0 ETH | 0.00079935 | ||||
Mint | 15370679 | 784 days ago | IN | 0 ETH | 0.00696914 | ||||
0x60806040 | 15370651 | 784 days ago | IN | 0 ETH | 0.0550571 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PaniniMegaCracksNFTEthereum
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./PaniniMegaCracksNFT.sol"; contract PaniniMegaCracksNFTEthereum is PaniniMegaCracksNFT { event MoveDone(uint256 tokenId, string code, address owner); constructor(string memory _baseURI) PaniniMegaCracksNFT(_baseURI) {} /** * Verifies user's authorisation to mint the token on this contract and mints it as the final stage of * the bridging process. */ function moveToChain(uint256 _tokenId, string memory _code, address _tokenOwner, bytes memory _sig) external { require(!_exists(_tokenId), "Token already exists on this chain!"); bytes memory message = abi.encode(_tokenId, _code, _tokenOwner); address signer = getSigner(message, _sig); require(owner() == signer, "Signer is not contract owner!"); _safeMint(_tokenOwner, _tokenId); idToCode[_tokenId] = _code; emit MoveDone(_tokenId, _code, _tokenOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./vendor/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "./vendor/@openzeppelin/contracts/metatx/ERC2771Context.sol"; import "./vendor/@openzeppelin/contracts/access/Ownable.sol"; import "./vendor/@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; abstract contract PaniniMegaCracksNFT is ERC721Enumerable, Ownable { using ECDSA for bytes32; mapping(uint256 => string) idToCode; string currentBaseURI; constructor(string memory _baseURI) ERC721("PaniniMegaCracksNFT", "MGK") { currentBaseURI = _baseURI; } function changeBaseURI(string memory _newBaseURI) external onlyOwner { currentBaseURI = _newBaseURI; } function exists(uint256 _tokenId) external view returns (bool) { return _exists(_tokenId); } /** * Mints tokens with specified code ids to specified addresses. * The generated tokenIds are mapped to the token codes. */ function mint(address[] memory _receivers, string[] memory _codes) external onlyOwner { for (uint256 i = 0; i < _receivers.length; i++) { string memory tokenCode = _codes[i]; uint256 tokenId = codeToId(tokenCode); _safeMint(_receivers[i], tokenId); idToCode[tokenId] = tokenCode; } } /** * Creates the URI for the specified token. */ function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Requesting URI for nonexistent token"); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, idToCode[_tokenId], ".json")) : ""; } /* INTERNAL FUNCTIONS */ /** * Creates an uint256 tokenId for the specified token code. */ function codeToId(string memory _code) internal pure returns (uint256) { return uint256(keccak256(abi.encode(_code))); } /** * Recovers the signer of the specified signature. */ function getSigner(bytes memory message, bytes memory _signature) internal pure returns (address) { bytes32 messageHash = keccak256(message); bytes32 signedHash = messageHash.toEthSignedMessageHash(); return signedHash.recover(_signature); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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.5.0) (metatx/ERC2771Context.sol) pragma solidity ^0.8.9; import "../utils/Context.sol"; /** * @dev Context variant with ERC2771 support. */ abstract contract ERC2771Context is Context { /// @custom:oz-upgrades-unsafe-allow state-variable-immutable address private immutable _trustedForwarder; /// @custom:oz-upgrades-unsafe-allow constructor constructor(address trustedForwarder) { _trustedForwarder = trustedForwarder; } function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return forwarder == _trustedForwarder; } function _msgSender() internal view virtual override returns (address sender) { if (isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return super._msgSender(); } } function _msgData() internal view virtual override returns (bytes calldata) { if (isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return super._msgData(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/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 private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/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 be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev 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 (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 // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// 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.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// 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 // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// 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 // 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); }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "london", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"code","type":"string"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"MoveDone","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_receivers","type":"address[]"},{"internalType":"string[]","name":"_codes","type":"string[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_code","type":"string"},{"internalType":"address","name":"_tokenOwner","type":"address"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"moveToChain","outputs":[],"stateMutability":"nonpayable","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":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004add38038062004add833981810160405281019062000037919062000365565b806040518060400160405280601381526020017f50616e696e694d656761437261636b734e4654000000000000000000000000008152506040518060400160405280600381526020017f4d474b00000000000000000000000000000000000000000000000000000000008152508160009081620000b5919062000601565b508060019081620000c7919062000601565b505050620000ea620000de6200010460201b60201c565b6200010c60201b60201c565b80600c9081620000fb919062000601565b505050620006e8565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200023b82620001f0565b810181811067ffffffffffffffff821117156200025d576200025c62000201565b5b80604052505050565b600062000272620001d2565b905062000280828262000230565b919050565b600067ffffffffffffffff821115620002a357620002a262000201565b5b620002ae82620001f0565b9050602081019050919050565b60005b83811015620002db578082015181840152602081019050620002be565b60008484015250505050565b6000620002fe620002f88462000285565b62000266565b9050828152602081018484840111156200031d576200031c620001eb565b5b6200032a848285620002bb565b509392505050565b600082601f8301126200034a5762000349620001e6565b5b81516200035c848260208601620002e7565b91505092915050565b6000602082840312156200037e576200037d620001dc565b5b600082015167ffffffffffffffff8111156200039f576200039e620001e1565b5b620003ad8482850162000332565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200040957607f821691505b6020821081036200041f576200041e620003c1565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200044a565b6200049586836200044a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004e2620004dc620004d684620004ad565b620004b7565b620004ad565b9050919050565b6000819050919050565b620004fe83620004c1565b620005166200050d82620004e9565b84845462000457565b825550505050565b600090565b6200052d6200051e565b6200053a818484620004f3565b505050565b5b8181101562000562576200055660008262000523565b60018101905062000540565b5050565b601f821115620005b1576200057b8162000425565b62000586846200043a565b8101602085101562000596578190505b620005ae620005a5856200043a565b8301826200053f565b50505b505050565b600082821c905092915050565b6000620005d660001984600802620005b6565b1980831691505092915050565b6000620005f18383620005c3565b9150826002028217905092915050565b6200060c82620003b6565b67ffffffffffffffff81111562000628576200062762000201565b5b620006348254620003f0565b6200064182828562000566565b600060209050601f83116001811462000679576000841562000664578287015190505b620006708582620005e3565b865550620006e0565b601f198416620006898662000425565b60005b82811015620006b3578489015182556001820191506020850194506020810190506200068c565b86831015620006d35784890151620006cf601f891682620005c3565b8355505b6001600288020188555050505b505050505050565b6143e580620006f86000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80634f558e79116100c357806395d89b411161007c57806395d89b41146103ae578063a22cb465146103cc578063b88d4fde146103e8578063c87b56dd14610404578063e985e9c514610434578063f2fde38b146104645761014d565b80634f558e79146102c65780634f6ccce7146102f65780636352211e1461032657806370a0823114610356578063715018a6146103865780638da5cb5b146103905761014d565b806318160ddd1161011557806318160ddd1461020857806323b872dd146102265780632f745c591461024257806339a0c6f91461027257806342842e0e1461028e5780634c7bc5cf146102aa5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d05780630ebab902146101ec575b600080fd5b61016c60048036038101906101679190612690565b610480565b60405161017991906126d8565b60405180910390f35b61018a6104fa565b6040516101979190612783565b60405180910390f35b6101ba60048036038101906101b591906127db565b61058c565b6040516101c79190612849565b60405180910390f35b6101ea60048036038101906101e59190612890565b610611565b005b61020660048036038101906102019190612aa6565b610728565b005b61021061088a565b60405161021d9190612b54565b60405180910390f35b610240600480360381019061023b9190612b6f565b610897565b005b61025c60048036038101906102579190612890565b6108f7565b6040516102699190612b54565b60405180910390f35b61028c60048036038101906102879190612bc2565b61099c565b005b6102a860048036038101906102a39190612b6f565b610a2b565b005b6102c460048036038101906102bf9190612db4565b610a4b565b005b6102e060048036038101906102db91906127db565b610b5e565b6040516102ed91906126d8565b60405180910390f35b610310600480360381019061030b91906127db565b610b70565b60405161031d9190612b54565b60405180910390f35b610340600480360381019061033b91906127db565b610be1565b60405161034d9190612849565b60405180910390f35b610370600480360381019061036b9190612e2c565b610c92565b60405161037d9190612b54565b60405180910390f35b61038e610d49565b005b610398610dd1565b6040516103a59190612849565b60405180910390f35b6103b6610dfb565b6040516103c39190612783565b60405180910390f35b6103e660048036038101906103e19190612e85565b610e8d565b005b61040260048036038101906103fd9190612ec5565b610ea3565b005b61041e600480360381019061041991906127db565b610f05565b60405161042b9190612783565b60405180910390f35b61044e60048036038101906104499190612f48565b610fb7565b60405161045b91906126d8565b60405180910390f35b61047e60048036038101906104799190612e2c565b61104b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104f357506104f282611142565b5b9050919050565b60606000805461050990612fb7565b80601f016020809104026020016040519081016040528092919081815260200182805461053590612fb7565b80156105825780601f1061055757610100808354040283529160200191610582565b820191906000526020600020905b81548152906001019060200180831161056557829003601f168201915b5050505050905090565b600061059782611224565b6105d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cd9061305a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061061c82610be1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361068c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610683906130ec565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106ab611290565b73ffffffffffffffffffffffffffffffffffffffff1614806106da57506106d9816106d4611290565b610fb7565b5b610719576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107109061317e565b60405180910390fd5b6107238383611298565b505050565b61073184611224565b15610771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076890613210565b60405180910390fd5b600084848460405160200161078893929190613230565b604051602081830303815290604052905060006107a58284611351565b90508073ffffffffffffffffffffffffffffffffffffffff166107c6610dd1565b73ffffffffffffffffffffffffffffffffffffffff161461081c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610813906132ba565b60405180910390fd5b6108268487611388565b84600b600088815260200190815260200160002090816108469190613486565b507f3376155ec02e105eccfbdfb72e9cfb09a919cc6bd8039c6da914b070bc2da1a286868660405161087a93929190613230565b60405180910390a1505050505050565b6000600880549050905090565b6108a86108a2611290565b826113a6565b6108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de906135ca565b60405180910390fd5b6108f2838383611484565b505050565b600061090283610c92565b8210610943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093a9061365c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109a4611290565b73ffffffffffffffffffffffffffffffffffffffff166109c2610dd1565b73ffffffffffffffffffffffffffffffffffffffff1614610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f906136c8565b60405180910390fd5b80600c9081610a279190613486565b5050565b610a4683838360405180602001604052806000815250610ea3565b505050565b610a53611290565b73ffffffffffffffffffffffffffffffffffffffff16610a71610dd1565b73ffffffffffffffffffffffffffffffffffffffff1614610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe906136c8565b60405180910390fd5b60005b8251811015610b59576000828281518110610ae857610ae76136e8565b5b602002602001015190506000610afd826116ea565b9050610b23858481518110610b1557610b146136e8565b5b602002602001015182611388565b81600b60008381526020019081526020016000209081610b439190613486565b5050508080610b5190613746565b915050610aca565b505050565b6000610b6982611224565b9050919050565b6000610b7a61088a565b8210610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb290613800565b60405180910390fd5b60088281548110610bcf57610bce6136e8565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090613892565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf990613924565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d51611290565b73ffffffffffffffffffffffffffffffffffffffff16610d6f610dd1565b73ffffffffffffffffffffffffffffffffffffffff1614610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc906136c8565b60405180910390fd5b610dcf600061171d565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e0a90612fb7565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3690612fb7565b8015610e835780601f10610e5857610100808354040283529160200191610e83565b820191906000526020600020905b815481529060010190602001808311610e6657829003601f168201915b5050505050905090565b610e9f610e98611290565b83836117e3565b5050565b610eb4610eae611290565b836113a6565b610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea906135ca565b60405180910390fd5b610eff8484848461194f565b50505050565b6060610f1082611224565b610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f46906139b6565b60405180910390fd5b6000600c8054610f5e90612fb7565b905011610f7a5760405180602001604052806000815250610fb0565b600c600b6000848152602001908152602001600020604051602001610fa0929190613ab0565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611053611290565b73ffffffffffffffffffffffffffffffffffffffff16611071610dd1565b73ffffffffffffffffffffffffffffffffffffffff16146110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be906136c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d90613b51565b60405180910390fd5b61113f8161171d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061120d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061121d575061121c826119ab565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661130b83610be1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008083805190602001209050600061136982611a15565b905061137e8482611a4590919063ffffffff16565b9250505092915050565b6113a2828260405180602001604052806000815250611a6c565b5050565b60006113b182611224565b6113f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e790613be3565b60405180910390fd5b60006113fb83610be1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061143d575061143c8185610fb7565b5b8061147b57508373ffffffffffffffffffffffffffffffffffffffff166114638461058c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166114a482610be1565b73ffffffffffffffffffffffffffffffffffffffff16146114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190613c75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090613d07565b60405180910390fd5b611574838383611ac7565b61157f600082611298565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115cf9190613d27565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116269190613d5b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116e5838383611bd9565b505050565b6000816040516020016116fd9190612783565b6040516020818303038152906040528051906020012060001c9050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184890613ddb565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161194291906126d8565b60405180910390a3505050565b61195a848484611484565b61196684848484611bde565b6119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c90613e6d565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081604051602001611a289190613f04565b604051602081830303815290604052805190602001209050919050565b6000806000611a548585611d65565b91509150611a6181611de6565b819250505092915050565b611a768383611fb2565b611a836000848484611bde565b611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990613e6d565b60405180910390fd5b505050565b611ad283838361218b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b1457611b0f81612190565b611b53565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611b5257611b5183826121d9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b9557611b9081612346565b611bd4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611bd357611bd28282612417565b5b5b505050565b505050565b6000611bff8473ffffffffffffffffffffffffffffffffffffffff16612496565b15611d58578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c28611290565b8786866040518563ffffffff1660e01b8152600401611c4a9493929190613f7f565b6020604051808303816000875af1925050508015611c8657506040513d601f19601f82011682018060405250810190611c839190613fe0565b60015b611d08573d8060008114611cb6576040519150601f19603f3d011682016040523d82523d6000602084013e611cbb565b606091505b506000815103611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf790613e6d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611d5d565b600190505b949350505050565b6000806041835103611da65760008060006020860151925060408601519150606086015160001a9050611d9a878285856124b9565b94509450505050611ddf565b6040835103611dd6576000806020850151915060408501519050611dcb8683836125c5565b935093505050611ddf565b60006002915091505b9250929050565b60006004811115611dfa57611df961400d565b5b816004811115611e0d57611e0c61400d565b5b0315611faf5760016004811115611e2757611e2661400d565b5b816004811115611e3a57611e3961400d565b5b03611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7190614088565b60405180910390fd5b60026004811115611e8e57611e8d61400d565b5b816004811115611ea157611ea061400d565b5b03611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed8906140f4565b60405180910390fd5b60036004811115611ef557611ef461400d565b5b816004811115611f0857611f0761400d565b5b03611f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3f90614186565b60405180910390fd5b600480811115611f5b57611f5a61400d565b5b816004811115611f6e57611f6d61400d565b5b03611fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa590614218565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201890614284565b60405180910390fd5b61202a81611224565b1561206a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612061906142f0565b60405180910390fd5b61207660008383611ac7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c69190613d5b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461218760008383611bd9565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016121e684610c92565b6121f09190613d27565b90506000600760008481526020019081526020016000205490508181146122d5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061235a9190613d27565b905060006009600084815260200190815260200160002054905060006008838154811061238a576123896136e8565b5b9060005260206000200154905080600883815481106123ac576123ab6136e8565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806123fb576123fa614310565b5b6001900381819060005260206000200160009055905550505050565b600061242283610c92565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156124f45760006003915091506125bc565b601b8560ff161415801561250c5750601c8560ff1614155b1561251e5760006004915091506125bc565b600060018787878760405160008152602001604052604051612543949392919061436a565b6020604051602081039080840390855afa158015612565573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125b3576000600192509250506125bc565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6126089190613d5b565b9050612616878288856124b9565b935093505050935093915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61266d81612638565b811461267857600080fd5b50565b60008135905061268a81612664565b92915050565b6000602082840312156126a6576126a561262e565b5b60006126b48482850161267b565b91505092915050565b60008115159050919050565b6126d2816126bd565b82525050565b60006020820190506126ed60008301846126c9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561272d578082015181840152602081019050612712565b60008484015250505050565b6000601f19601f8301169050919050565b6000612755826126f3565b61275f81856126fe565b935061276f81856020860161270f565b61277881612739565b840191505092915050565b6000602082019050818103600083015261279d818461274a565b905092915050565b6000819050919050565b6127b8816127a5565b81146127c357600080fd5b50565b6000813590506127d5816127af565b92915050565b6000602082840312156127f1576127f061262e565b5b60006127ff848285016127c6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061283382612808565b9050919050565b61284381612828565b82525050565b600060208201905061285e600083018461283a565b92915050565b61286d81612828565b811461287857600080fd5b50565b60008135905061288a81612864565b92915050565b600080604083850312156128a7576128a661262e565b5b60006128b58582860161287b565b92505060206128c6858286016127c6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61291282612739565b810181811067ffffffffffffffff82111715612931576129306128da565b5b80604052505050565b6000612944612624565b90506129508282612909565b919050565b600067ffffffffffffffff8211156129705761296f6128da565b5b61297982612739565b9050602081019050919050565b82818337600083830152505050565b60006129a86129a384612955565b61293a565b9050828152602081018484840111156129c4576129c36128d5565b5b6129cf848285612986565b509392505050565b600082601f8301126129ec576129eb6128d0565b5b81356129fc848260208601612995565b91505092915050565b600067ffffffffffffffff821115612a2057612a1f6128da565b5b612a2982612739565b9050602081019050919050565b6000612a49612a4484612a05565b61293a565b905082815260208101848484011115612a6557612a646128d5565b5b612a70848285612986565b509392505050565b600082601f830112612a8d57612a8c6128d0565b5b8135612a9d848260208601612a36565b91505092915050565b60008060008060808587031215612ac057612abf61262e565b5b6000612ace878288016127c6565b945050602085013567ffffffffffffffff811115612aef57612aee612633565b5b612afb878288016129d7565b9350506040612b0c8782880161287b565b925050606085013567ffffffffffffffff811115612b2d57612b2c612633565b5b612b3987828801612a78565b91505092959194509250565b612b4e816127a5565b82525050565b6000602082019050612b696000830184612b45565b92915050565b600080600060608486031215612b8857612b8761262e565b5b6000612b968682870161287b565b9350506020612ba78682870161287b565b9250506040612bb8868287016127c6565b9150509250925092565b600060208284031215612bd857612bd761262e565b5b600082013567ffffffffffffffff811115612bf657612bf5612633565b5b612c02848285016129d7565b91505092915050565b600067ffffffffffffffff821115612c2657612c256128da565b5b602082029050602081019050919050565b600080fd5b6000612c4f612c4a84612c0b565b61293a565b90508083825260208201905060208402830185811115612c7257612c71612c37565b5b835b81811015612c9b5780612c87888261287b565b845260208401935050602081019050612c74565b5050509392505050565b600082601f830112612cba57612cb96128d0565b5b8135612cca848260208601612c3c565b91505092915050565b600067ffffffffffffffff821115612cee57612ced6128da565b5b602082029050602081019050919050565b6000612d12612d0d84612cd3565b61293a565b90508083825260208201905060208402830185811115612d3557612d34612c37565b5b835b81811015612d7c57803567ffffffffffffffff811115612d5a57612d596128d0565b5b808601612d6789826129d7565b85526020850194505050602081019050612d37565b5050509392505050565b600082601f830112612d9b57612d9a6128d0565b5b8135612dab848260208601612cff565b91505092915050565b60008060408385031215612dcb57612dca61262e565b5b600083013567ffffffffffffffff811115612de957612de8612633565b5b612df585828601612ca5565b925050602083013567ffffffffffffffff811115612e1657612e15612633565b5b612e2285828601612d86565b9150509250929050565b600060208284031215612e4257612e4161262e565b5b6000612e508482850161287b565b91505092915050565b612e62816126bd565b8114612e6d57600080fd5b50565b600081359050612e7f81612e59565b92915050565b60008060408385031215612e9c57612e9b61262e565b5b6000612eaa8582860161287b565b9250506020612ebb85828601612e70565b9150509250929050565b60008060008060808587031215612edf57612ede61262e565b5b6000612eed8782880161287b565b9450506020612efe8782880161287b565b9350506040612f0f878288016127c6565b925050606085013567ffffffffffffffff811115612f3057612f2f612633565b5b612f3c87828801612a78565b91505092959194509250565b60008060408385031215612f5f57612f5e61262e565b5b6000612f6d8582860161287b565b9250506020612f7e8582860161287b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612fcf57607f821691505b602082108103612fe257612fe1612f88565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613044602c836126fe565b915061304f82612fe8565b604082019050919050565b6000602082019050818103600083015261307381613037565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006130d66021836126fe565b91506130e18261307a565b604082019050919050565b60006020820190508181036000830152613105816130c9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006131686038836126fe565b91506131738261310c565b604082019050919050565b600060208201905081810360008301526131978161315b565b9050919050565b7f546f6b656e20616c726561647920657869737473206f6e20746869732063686160008201527f696e210000000000000000000000000000000000000000000000000000000000602082015250565b60006131fa6023836126fe565b91506132058261319e565b604082019050919050565b60006020820190508181036000830152613229816131ed565b9050919050565b60006060820190506132456000830186612b45565b8181036020830152613257818561274a565b9050613266604083018461283a565b949350505050565b7f5369676e6572206973206e6f7420636f6e7472616374206f776e657221000000600082015250565b60006132a4601d836126fe565b91506132af8261326e565b602082019050919050565b600060208201905081810360008301526132d381613297565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261333c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826132ff565b61334686836132ff565b95508019841693508086168417925050509392505050565b6000819050919050565b600061338361337e613379846127a5565b61335e565b6127a5565b9050919050565b6000819050919050565b61339d83613368565b6133b16133a98261338a565b84845461330c565b825550505050565b600090565b6133c66133b9565b6133d1818484613394565b505050565b5b818110156133f5576133ea6000826133be565b6001810190506133d7565b5050565b601f82111561343a5761340b816132da565b613414846132ef565b81016020851015613423578190505b61343761342f856132ef565b8301826133d6565b50505b505050565b600082821c905092915050565b600061345d6000198460080261343f565b1980831691505092915050565b6000613476838361344c565b9150826002028217905092915050565b61348f826126f3565b67ffffffffffffffff8111156134a8576134a76128da565b5b6134b28254612fb7565b6134bd8282856133f9565b600060209050601f8311600181146134f057600084156134de578287015190505b6134e8858261346a565b865550613550565b601f1984166134fe866132da565b60005b8281101561352657848901518255600182019150602085019450602081019050613501565b86831015613543578489015161353f601f89168261344c565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006135b46031836126fe565b91506135bf82613558565b604082019050919050565b600060208201905081810360008301526135e3816135a7565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613646602b836126fe565b9150613651826135ea565b604082019050919050565b6000602082019050818103600083015261367581613639565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136b26020836126fe565b91506136bd8261367c565b602082019050919050565b600060208201905081810360008301526136e1816136a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613751826127a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361378357613782613717565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006137ea602c836126fe565b91506137f58261378e565b604082019050919050565b60006020820190508181036000830152613819816137dd565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061387c6029836126fe565b915061388782613820565b604082019050919050565b600060208201905081810360008301526138ab8161386f565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061390e602a836126fe565b9150613919826138b2565b604082019050919050565b6000602082019050818103600083015261393d81613901565b9050919050565b7f52657175657374696e672055524920666f72206e6f6e6578697374656e74207460008201527f6f6b656e00000000000000000000000000000000000000000000000000000000602082015250565b60006139a06024836126fe565b91506139ab82613944565b604082019050919050565b600060208201905081810360008301526139cf81613993565b9050919050565b600081905092915050565b600081546139ee81612fb7565b6139f881866139d6565b94506001821660008114613a135760018114613a2857613a5b565b60ff1983168652811515820286019350613a5b565b613a31856132da565b60005b83811015613a5357815481890152600182019150602081019050613a34565b838801955050505b50505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613a9a6005836139d6565b9150613aa582613a64565b600582019050919050565b6000613abc82856139e1565b9150613ac882846139e1565b9150613ad382613a8d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b3b6026836126fe565b9150613b4682613adf565b604082019050919050565b60006020820190508181036000830152613b6a81613b2e565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613bcd602c836126fe565b9150613bd882613b71565b604082019050919050565b60006020820190508181036000830152613bfc81613bc0565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613c5f6025836126fe565b9150613c6a82613c03565b604082019050919050565b60006020820190508181036000830152613c8e81613c52565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613cf16024836126fe565b9150613cfc82613c95565b604082019050919050565b60006020820190508181036000830152613d2081613ce4565b9050919050565b6000613d32826127a5565b9150613d3d836127a5565b9250828203905081811115613d5557613d54613717565b5b92915050565b6000613d66826127a5565b9150613d71836127a5565b9250828201905080821115613d8957613d88613717565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613dc56019836126fe565b9150613dd082613d8f565b602082019050919050565b60006020820190508181036000830152613df481613db8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613e576032836126fe565b9150613e6282613dfb565b604082019050919050565b60006020820190508181036000830152613e8681613e4a565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613ec3601c836139d6565b9150613ece82613e8d565b601c82019050919050565b6000819050919050565b6000819050919050565b613efe613ef982613ed9565b613ee3565b82525050565b6000613f0f82613eb6565b9150613f1b8284613eed565b60208201915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000613f5182613f2a565b613f5b8185613f35565b9350613f6b81856020860161270f565b613f7481612739565b840191505092915050565b6000608082019050613f94600083018761283a565b613fa1602083018661283a565b613fae6040830185612b45565b8181036060830152613fc08184613f46565b905095945050505050565b600081519050613fda81612664565b92915050565b600060208284031215613ff657613ff561262e565b5b600061400484828501613fcb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006140726018836126fe565b915061407d8261403c565b602082019050919050565b600060208201905081810360008301526140a181614065565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006140de601f836126fe565b91506140e9826140a8565b602082019050919050565b6000602082019050818103600083015261410d816140d1565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006141706022836126fe565b915061417b82614114565b604082019050919050565b6000602082019050818103600083015261419f81614163565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006142026022836126fe565b915061420d826141a6565b604082019050919050565b60006020820190508181036000830152614231816141f5565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061426e6020836126fe565b915061427982614238565b602082019050919050565b6000602082019050818103600083015261429d81614261565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006142da601c836126fe565b91506142e5826142a4565b602082019050919050565b60006020820190508181036000830152614309816142cd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61434881613ed9565b82525050565b600060ff82169050919050565b6143648161434e565b82525050565b600060808201905061437f600083018761433f565b61438c602083018661435b565b614399604083018561433f565b6143a6606083018461433f565b9594505050505056fea26469706673582212207c1f12f05e842939b1395d8b30c6ec2a043aac83ac43ef11f41985f4eeccf52364736f6c6343000810003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d524a67544579646f66574e71465455775341434d63704d6631696b3157437845703441713268755832766f752f00000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80634f558e79116100c357806395d89b411161007c57806395d89b41146103ae578063a22cb465146103cc578063b88d4fde146103e8578063c87b56dd14610404578063e985e9c514610434578063f2fde38b146104645761014d565b80634f558e79146102c65780634f6ccce7146102f65780636352211e1461032657806370a0823114610356578063715018a6146103865780638da5cb5b146103905761014d565b806318160ddd1161011557806318160ddd1461020857806323b872dd146102265780632f745c591461024257806339a0c6f91461027257806342842e0e1461028e5780634c7bc5cf146102aa5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d05780630ebab902146101ec575b600080fd5b61016c60048036038101906101679190612690565b610480565b60405161017991906126d8565b60405180910390f35b61018a6104fa565b6040516101979190612783565b60405180910390f35b6101ba60048036038101906101b591906127db565b61058c565b6040516101c79190612849565b60405180910390f35b6101ea60048036038101906101e59190612890565b610611565b005b61020660048036038101906102019190612aa6565b610728565b005b61021061088a565b60405161021d9190612b54565b60405180910390f35b610240600480360381019061023b9190612b6f565b610897565b005b61025c60048036038101906102579190612890565b6108f7565b6040516102699190612b54565b60405180910390f35b61028c60048036038101906102879190612bc2565b61099c565b005b6102a860048036038101906102a39190612b6f565b610a2b565b005b6102c460048036038101906102bf9190612db4565b610a4b565b005b6102e060048036038101906102db91906127db565b610b5e565b6040516102ed91906126d8565b60405180910390f35b610310600480360381019061030b91906127db565b610b70565b60405161031d9190612b54565b60405180910390f35b610340600480360381019061033b91906127db565b610be1565b60405161034d9190612849565b60405180910390f35b610370600480360381019061036b9190612e2c565b610c92565b60405161037d9190612b54565b60405180910390f35b61038e610d49565b005b610398610dd1565b6040516103a59190612849565b60405180910390f35b6103b6610dfb565b6040516103c39190612783565b60405180910390f35b6103e660048036038101906103e19190612e85565b610e8d565b005b61040260048036038101906103fd9190612ec5565b610ea3565b005b61041e600480360381019061041991906127db565b610f05565b60405161042b9190612783565b60405180910390f35b61044e60048036038101906104499190612f48565b610fb7565b60405161045b91906126d8565b60405180910390f35b61047e60048036038101906104799190612e2c565b61104b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104f357506104f282611142565b5b9050919050565b60606000805461050990612fb7565b80601f016020809104026020016040519081016040528092919081815260200182805461053590612fb7565b80156105825780601f1061055757610100808354040283529160200191610582565b820191906000526020600020905b81548152906001019060200180831161056557829003601f168201915b5050505050905090565b600061059782611224565b6105d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cd9061305a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061061c82610be1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361068c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610683906130ec565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106ab611290565b73ffffffffffffffffffffffffffffffffffffffff1614806106da57506106d9816106d4611290565b610fb7565b5b610719576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107109061317e565b60405180910390fd5b6107238383611298565b505050565b61073184611224565b15610771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076890613210565b60405180910390fd5b600084848460405160200161078893929190613230565b604051602081830303815290604052905060006107a58284611351565b90508073ffffffffffffffffffffffffffffffffffffffff166107c6610dd1565b73ffffffffffffffffffffffffffffffffffffffff161461081c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610813906132ba565b60405180910390fd5b6108268487611388565b84600b600088815260200190815260200160002090816108469190613486565b507f3376155ec02e105eccfbdfb72e9cfb09a919cc6bd8039c6da914b070bc2da1a286868660405161087a93929190613230565b60405180910390a1505050505050565b6000600880549050905090565b6108a86108a2611290565b826113a6565b6108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de906135ca565b60405180910390fd5b6108f2838383611484565b505050565b600061090283610c92565b8210610943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093a9061365c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109a4611290565b73ffffffffffffffffffffffffffffffffffffffff166109c2610dd1565b73ffffffffffffffffffffffffffffffffffffffff1614610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f906136c8565b60405180910390fd5b80600c9081610a279190613486565b5050565b610a4683838360405180602001604052806000815250610ea3565b505050565b610a53611290565b73ffffffffffffffffffffffffffffffffffffffff16610a71610dd1565b73ffffffffffffffffffffffffffffffffffffffff1614610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe906136c8565b60405180910390fd5b60005b8251811015610b59576000828281518110610ae857610ae76136e8565b5b602002602001015190506000610afd826116ea565b9050610b23858481518110610b1557610b146136e8565b5b602002602001015182611388565b81600b60008381526020019081526020016000209081610b439190613486565b5050508080610b5190613746565b915050610aca565b505050565b6000610b6982611224565b9050919050565b6000610b7a61088a565b8210610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb290613800565b60405180910390fd5b60088281548110610bcf57610bce6136e8565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090613892565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf990613924565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d51611290565b73ffffffffffffffffffffffffffffffffffffffff16610d6f610dd1565b73ffffffffffffffffffffffffffffffffffffffff1614610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc906136c8565b60405180910390fd5b610dcf600061171d565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e0a90612fb7565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3690612fb7565b8015610e835780601f10610e5857610100808354040283529160200191610e83565b820191906000526020600020905b815481529060010190602001808311610e6657829003601f168201915b5050505050905090565b610e9f610e98611290565b83836117e3565b5050565b610eb4610eae611290565b836113a6565b610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea906135ca565b60405180910390fd5b610eff8484848461194f565b50505050565b6060610f1082611224565b610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f46906139b6565b60405180910390fd5b6000600c8054610f5e90612fb7565b905011610f7a5760405180602001604052806000815250610fb0565b600c600b6000848152602001908152602001600020604051602001610fa0929190613ab0565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611053611290565b73ffffffffffffffffffffffffffffffffffffffff16611071610dd1565b73ffffffffffffffffffffffffffffffffffffffff16146110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be906136c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d90613b51565b60405180910390fd5b61113f8161171d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061120d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061121d575061121c826119ab565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661130b83610be1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008083805190602001209050600061136982611a15565b905061137e8482611a4590919063ffffffff16565b9250505092915050565b6113a2828260405180602001604052806000815250611a6c565b5050565b60006113b182611224565b6113f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e790613be3565b60405180910390fd5b60006113fb83610be1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061143d575061143c8185610fb7565b5b8061147b57508373ffffffffffffffffffffffffffffffffffffffff166114638461058c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166114a482610be1565b73ffffffffffffffffffffffffffffffffffffffff16146114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190613c75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090613d07565b60405180910390fd5b611574838383611ac7565b61157f600082611298565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115cf9190613d27565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116269190613d5b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116e5838383611bd9565b505050565b6000816040516020016116fd9190612783565b6040516020818303038152906040528051906020012060001c9050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184890613ddb565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161194291906126d8565b60405180910390a3505050565b61195a848484611484565b61196684848484611bde565b6119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c90613e6d565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081604051602001611a289190613f04565b604051602081830303815290604052805190602001209050919050565b6000806000611a548585611d65565b91509150611a6181611de6565b819250505092915050565b611a768383611fb2565b611a836000848484611bde565b611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990613e6d565b60405180910390fd5b505050565b611ad283838361218b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b1457611b0f81612190565b611b53565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611b5257611b5183826121d9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b9557611b9081612346565b611bd4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611bd357611bd28282612417565b5b5b505050565b505050565b6000611bff8473ffffffffffffffffffffffffffffffffffffffff16612496565b15611d58578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c28611290565b8786866040518563ffffffff1660e01b8152600401611c4a9493929190613f7f565b6020604051808303816000875af1925050508015611c8657506040513d601f19601f82011682018060405250810190611c839190613fe0565b60015b611d08573d8060008114611cb6576040519150601f19603f3d011682016040523d82523d6000602084013e611cbb565b606091505b506000815103611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf790613e6d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611d5d565b600190505b949350505050565b6000806041835103611da65760008060006020860151925060408601519150606086015160001a9050611d9a878285856124b9565b94509450505050611ddf565b6040835103611dd6576000806020850151915060408501519050611dcb8683836125c5565b935093505050611ddf565b60006002915091505b9250929050565b60006004811115611dfa57611df961400d565b5b816004811115611e0d57611e0c61400d565b5b0315611faf5760016004811115611e2757611e2661400d565b5b816004811115611e3a57611e3961400d565b5b03611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7190614088565b60405180910390fd5b60026004811115611e8e57611e8d61400d565b5b816004811115611ea157611ea061400d565b5b03611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed8906140f4565b60405180910390fd5b60036004811115611ef557611ef461400d565b5b816004811115611f0857611f0761400d565b5b03611f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3f90614186565b60405180910390fd5b600480811115611f5b57611f5a61400d565b5b816004811115611f6e57611f6d61400d565b5b03611fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa590614218565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201890614284565b60405180910390fd5b61202a81611224565b1561206a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612061906142f0565b60405180910390fd5b61207660008383611ac7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c69190613d5b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461218760008383611bd9565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016121e684610c92565b6121f09190613d27565b90506000600760008481526020019081526020016000205490508181146122d5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061235a9190613d27565b905060006009600084815260200190815260200160002054905060006008838154811061238a576123896136e8565b5b9060005260206000200154905080600883815481106123ac576123ab6136e8565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806123fb576123fa614310565b5b6001900381819060005260206000200160009055905550505050565b600061242283610c92565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156124f45760006003915091506125bc565b601b8560ff161415801561250c5750601c8560ff1614155b1561251e5760006004915091506125bc565b600060018787878760405160008152602001604052604051612543949392919061436a565b6020604051602081039080840390855afa158015612565573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125b3576000600192509250506125bc565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6126089190613d5b565b9050612616878288856124b9565b935093505050935093915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61266d81612638565b811461267857600080fd5b50565b60008135905061268a81612664565b92915050565b6000602082840312156126a6576126a561262e565b5b60006126b48482850161267b565b91505092915050565b60008115159050919050565b6126d2816126bd565b82525050565b60006020820190506126ed60008301846126c9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561272d578082015181840152602081019050612712565b60008484015250505050565b6000601f19601f8301169050919050565b6000612755826126f3565b61275f81856126fe565b935061276f81856020860161270f565b61277881612739565b840191505092915050565b6000602082019050818103600083015261279d818461274a565b905092915050565b6000819050919050565b6127b8816127a5565b81146127c357600080fd5b50565b6000813590506127d5816127af565b92915050565b6000602082840312156127f1576127f061262e565b5b60006127ff848285016127c6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061283382612808565b9050919050565b61284381612828565b82525050565b600060208201905061285e600083018461283a565b92915050565b61286d81612828565b811461287857600080fd5b50565b60008135905061288a81612864565b92915050565b600080604083850312156128a7576128a661262e565b5b60006128b58582860161287b565b92505060206128c6858286016127c6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61291282612739565b810181811067ffffffffffffffff82111715612931576129306128da565b5b80604052505050565b6000612944612624565b90506129508282612909565b919050565b600067ffffffffffffffff8211156129705761296f6128da565b5b61297982612739565b9050602081019050919050565b82818337600083830152505050565b60006129a86129a384612955565b61293a565b9050828152602081018484840111156129c4576129c36128d5565b5b6129cf848285612986565b509392505050565b600082601f8301126129ec576129eb6128d0565b5b81356129fc848260208601612995565b91505092915050565b600067ffffffffffffffff821115612a2057612a1f6128da565b5b612a2982612739565b9050602081019050919050565b6000612a49612a4484612a05565b61293a565b905082815260208101848484011115612a6557612a646128d5565b5b612a70848285612986565b509392505050565b600082601f830112612a8d57612a8c6128d0565b5b8135612a9d848260208601612a36565b91505092915050565b60008060008060808587031215612ac057612abf61262e565b5b6000612ace878288016127c6565b945050602085013567ffffffffffffffff811115612aef57612aee612633565b5b612afb878288016129d7565b9350506040612b0c8782880161287b565b925050606085013567ffffffffffffffff811115612b2d57612b2c612633565b5b612b3987828801612a78565b91505092959194509250565b612b4e816127a5565b82525050565b6000602082019050612b696000830184612b45565b92915050565b600080600060608486031215612b8857612b8761262e565b5b6000612b968682870161287b565b9350506020612ba78682870161287b565b9250506040612bb8868287016127c6565b9150509250925092565b600060208284031215612bd857612bd761262e565b5b600082013567ffffffffffffffff811115612bf657612bf5612633565b5b612c02848285016129d7565b91505092915050565b600067ffffffffffffffff821115612c2657612c256128da565b5b602082029050602081019050919050565b600080fd5b6000612c4f612c4a84612c0b565b61293a565b90508083825260208201905060208402830185811115612c7257612c71612c37565b5b835b81811015612c9b5780612c87888261287b565b845260208401935050602081019050612c74565b5050509392505050565b600082601f830112612cba57612cb96128d0565b5b8135612cca848260208601612c3c565b91505092915050565b600067ffffffffffffffff821115612cee57612ced6128da565b5b602082029050602081019050919050565b6000612d12612d0d84612cd3565b61293a565b90508083825260208201905060208402830185811115612d3557612d34612c37565b5b835b81811015612d7c57803567ffffffffffffffff811115612d5a57612d596128d0565b5b808601612d6789826129d7565b85526020850194505050602081019050612d37565b5050509392505050565b600082601f830112612d9b57612d9a6128d0565b5b8135612dab848260208601612cff565b91505092915050565b60008060408385031215612dcb57612dca61262e565b5b600083013567ffffffffffffffff811115612de957612de8612633565b5b612df585828601612ca5565b925050602083013567ffffffffffffffff811115612e1657612e15612633565b5b612e2285828601612d86565b9150509250929050565b600060208284031215612e4257612e4161262e565b5b6000612e508482850161287b565b91505092915050565b612e62816126bd565b8114612e6d57600080fd5b50565b600081359050612e7f81612e59565b92915050565b60008060408385031215612e9c57612e9b61262e565b5b6000612eaa8582860161287b565b9250506020612ebb85828601612e70565b9150509250929050565b60008060008060808587031215612edf57612ede61262e565b5b6000612eed8782880161287b565b9450506020612efe8782880161287b565b9350506040612f0f878288016127c6565b925050606085013567ffffffffffffffff811115612f3057612f2f612633565b5b612f3c87828801612a78565b91505092959194509250565b60008060408385031215612f5f57612f5e61262e565b5b6000612f6d8582860161287b565b9250506020612f7e8582860161287b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612fcf57607f821691505b602082108103612fe257612fe1612f88565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613044602c836126fe565b915061304f82612fe8565b604082019050919050565b6000602082019050818103600083015261307381613037565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006130d66021836126fe565b91506130e18261307a565b604082019050919050565b60006020820190508181036000830152613105816130c9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006131686038836126fe565b91506131738261310c565b604082019050919050565b600060208201905081810360008301526131978161315b565b9050919050565b7f546f6b656e20616c726561647920657869737473206f6e20746869732063686160008201527f696e210000000000000000000000000000000000000000000000000000000000602082015250565b60006131fa6023836126fe565b91506132058261319e565b604082019050919050565b60006020820190508181036000830152613229816131ed565b9050919050565b60006060820190506132456000830186612b45565b8181036020830152613257818561274a565b9050613266604083018461283a565b949350505050565b7f5369676e6572206973206e6f7420636f6e7472616374206f776e657221000000600082015250565b60006132a4601d836126fe565b91506132af8261326e565b602082019050919050565b600060208201905081810360008301526132d381613297565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261333c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826132ff565b61334686836132ff565b95508019841693508086168417925050509392505050565b6000819050919050565b600061338361337e613379846127a5565b61335e565b6127a5565b9050919050565b6000819050919050565b61339d83613368565b6133b16133a98261338a565b84845461330c565b825550505050565b600090565b6133c66133b9565b6133d1818484613394565b505050565b5b818110156133f5576133ea6000826133be565b6001810190506133d7565b5050565b601f82111561343a5761340b816132da565b613414846132ef565b81016020851015613423578190505b61343761342f856132ef565b8301826133d6565b50505b505050565b600082821c905092915050565b600061345d6000198460080261343f565b1980831691505092915050565b6000613476838361344c565b9150826002028217905092915050565b61348f826126f3565b67ffffffffffffffff8111156134a8576134a76128da565b5b6134b28254612fb7565b6134bd8282856133f9565b600060209050601f8311600181146134f057600084156134de578287015190505b6134e8858261346a565b865550613550565b601f1984166134fe866132da565b60005b8281101561352657848901518255600182019150602085019450602081019050613501565b86831015613543578489015161353f601f89168261344c565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006135b46031836126fe565b91506135bf82613558565b604082019050919050565b600060208201905081810360008301526135e3816135a7565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613646602b836126fe565b9150613651826135ea565b604082019050919050565b6000602082019050818103600083015261367581613639565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136b26020836126fe565b91506136bd8261367c565b602082019050919050565b600060208201905081810360008301526136e1816136a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613751826127a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361378357613782613717565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006137ea602c836126fe565b91506137f58261378e565b604082019050919050565b60006020820190508181036000830152613819816137dd565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061387c6029836126fe565b915061388782613820565b604082019050919050565b600060208201905081810360008301526138ab8161386f565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061390e602a836126fe565b9150613919826138b2565b604082019050919050565b6000602082019050818103600083015261393d81613901565b9050919050565b7f52657175657374696e672055524920666f72206e6f6e6578697374656e74207460008201527f6f6b656e00000000000000000000000000000000000000000000000000000000602082015250565b60006139a06024836126fe565b91506139ab82613944565b604082019050919050565b600060208201905081810360008301526139cf81613993565b9050919050565b600081905092915050565b600081546139ee81612fb7565b6139f881866139d6565b94506001821660008114613a135760018114613a2857613a5b565b60ff1983168652811515820286019350613a5b565b613a31856132da565b60005b83811015613a5357815481890152600182019150602081019050613a34565b838801955050505b50505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613a9a6005836139d6565b9150613aa582613a64565b600582019050919050565b6000613abc82856139e1565b9150613ac882846139e1565b9150613ad382613a8d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b3b6026836126fe565b9150613b4682613adf565b604082019050919050565b60006020820190508181036000830152613b6a81613b2e565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613bcd602c836126fe565b9150613bd882613b71565b604082019050919050565b60006020820190508181036000830152613bfc81613bc0565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613c5f6025836126fe565b9150613c6a82613c03565b604082019050919050565b60006020820190508181036000830152613c8e81613c52565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613cf16024836126fe565b9150613cfc82613c95565b604082019050919050565b60006020820190508181036000830152613d2081613ce4565b9050919050565b6000613d32826127a5565b9150613d3d836127a5565b9250828203905081811115613d5557613d54613717565b5b92915050565b6000613d66826127a5565b9150613d71836127a5565b9250828201905080821115613d8957613d88613717565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613dc56019836126fe565b9150613dd082613d8f565b602082019050919050565b60006020820190508181036000830152613df481613db8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613e576032836126fe565b9150613e6282613dfb565b604082019050919050565b60006020820190508181036000830152613e8681613e4a565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613ec3601c836139d6565b9150613ece82613e8d565b601c82019050919050565b6000819050919050565b6000819050919050565b613efe613ef982613ed9565b613ee3565b82525050565b6000613f0f82613eb6565b9150613f1b8284613eed565b60208201915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000613f5182613f2a565b613f5b8185613f35565b9350613f6b81856020860161270f565b613f7481612739565b840191505092915050565b6000608082019050613f94600083018761283a565b613fa1602083018661283a565b613fae6040830185612b45565b8181036060830152613fc08184613f46565b905095945050505050565b600081519050613fda81612664565b92915050565b600060208284031215613ff657613ff561262e565b5b600061400484828501613fcb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006140726018836126fe565b915061407d8261403c565b602082019050919050565b600060208201905081810360008301526140a181614065565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006140de601f836126fe565b91506140e9826140a8565b602082019050919050565b6000602082019050818103600083015261410d816140d1565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006141706022836126fe565b915061417b82614114565b604082019050919050565b6000602082019050818103600083015261419f81614163565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006142026022836126fe565b915061420d826141a6565b604082019050919050565b60006020820190508181036000830152614231816141f5565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061426e6020836126fe565b915061427982614238565b602082019050919050565b6000602082019050818103600083015261429d81614261565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006142da601c836126fe565b91506142e5826142a4565b602082019050919050565b60006020820190508181036000830152614309816142cd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61434881613ed9565b82525050565b600060ff82169050919050565b6143648161434e565b82525050565b600060808201905061437f600083018761433f565b61438c602083018661435b565b614399604083018561433f565b6143a6606083018461433f565b9594505050505056fea26469706673582212207c1f12f05e842939b1395d8b30c6ec2a043aac83ac43ef11f41985f4eeccf52364736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d524a67544579646f66574e71465455775341434d63704d6631696b3157437845703441713268755832766f752f00000000000000000000
-----Decoded View---------------
Arg [0] : _baseURI (string): ipfs://QmRJgTEydofWNqFTUwSACMcpMf1ik1WCxEp4Aq2huX2vou/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d524a67544579646f66574e71465455775341434d63704d
Arg [3] : 6631696b3157437845703441713268755832766f752f00000000000000000000
Deployed Bytecode Sourcemap
95:844:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:222:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2488:98:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4000:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3538:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;439:498:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1615:111:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4727:330:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1291:253:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;629:108:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5123:179:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;980:317:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;741:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1798:230:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2191:235:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1929:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:2;;;:::i;:::-;;1036:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2650:102:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4284:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5368:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1359:280:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4503:162:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;990:222:7;1092:4;1130:35;1115:50;;;:11;:50;;;;:90;;;;1169:36;1193:11;1169:23;:36::i;:::-;1115:90;1108:97;;990:222;;;:::o;2488:98:4:-;2542:13;2574:5;2567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:98;:::o;4000:217::-;4076:7;4103:16;4111:7;4103;:16::i;:::-;4095:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4186:15;:24;4202:7;4186:24;;;;;;;;;;;;;;;;;;;;;4179:31;;4000:217;;;:::o;3538:401::-;3618:13;3634:23;3649:7;3634:14;:23::i;:::-;3618:39;;3681:5;3675:11;;:2;:11;;;3667:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3772:5;3756:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3781:37;3798:5;3805:12;:10;:12::i;:::-;3781:16;:37::i;:::-;3756:62;3735:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3911:21;3920:2;3924:7;3911:8;:21::i;:::-;3608:331;3538:401;;:::o;439:498:1:-;563:17;571:8;563:7;:17::i;:::-;562:18;554:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;631:20;665:8;675:5;682:11;654:40;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;631:63;;705:14;722:24;732:7;741:4;722:9;:24::i;:::-;705:41;;772:6;761:17;;:7;:5;:7::i;:::-;:17;;;753:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;819:32;829:11;842:8;819:9;:32::i;:::-;878:5;857:8;:18;866:8;857:18;;;;;;;;;;;:26;;;;;;:::i;:::-;;894:38;903:8;913:5;920:11;894:38;;;;;;;;:::i;:::-;;;;;;;;548:389;;439:498;;;;:::o;1615:111:7:-;1676:7;1702:10;:17;;;;1695:24;;1615:111;:::o;4727:330:4:-;4916:41;4935:12;:10;:12::i;:::-;4949:7;4916:18;:41::i;:::-;4908:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5022:28;5032:4;5038:2;5042:7;5022:9;:28::i;:::-;4727:330;;;:::o;1291:253:7:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1511:12;:19;1524:5;1511:19;;;;;;;;;;;;;;;:26;1531:5;1511:26;;;;;;;;;;;;1504:33;;1291:253;;;;:::o;629:108:0:-;1259:12:2;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;721:11:0::1;704:14;:28;;;;;;:::i;:::-;;629:108:::0;:::o;5123:179:4:-;5256:39;5273:4;5279:2;5283:7;5256:39;;;;;;;;;;;;:16;:39::i;:::-;5123:179;;;:::o;980:317:0:-;1259:12:2;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1077:9:0::1;1072:221;1096:10;:17;1092:1;:21;1072:221;;;1128:23;1154:6;1161:1;1154:9;;;;;;;;:::i;:::-;;;;;;;;1128:35;;1171:15;1189:19;1198:9;1189:8;:19::i;:::-;1171:37;;1216:33;1226:10;1237:1;1226:13;;;;;;;;:::i;:::-;;;;;;;;1241:7;1216:9;:33::i;:::-;1277:9;1257:8;:17;1266:7;1257:17;;;;;;;;;;;:29;;;;;;:::i;:::-;;1120:173;;1115:3;;;;;:::i;:::-;;;;1072:221;;;;980:317:::0;;:::o;741:98::-;798:4;817:17;825:8;817:7;:17::i;:::-;810:24;;741:98;;;:::o;1798:230:7:-;1873:7;1908:30;:28;:30::i;:::-;1900:5;:38;1892:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2004:10;2015:5;2004:17;;;;;;;;:::i;:::-;;;;;;;;;;1997:24;;1798:230;;;:::o;2191:235:4:-;2263:7;2282:13;2298:7;:16;2306:7;2298:16;;;;;;;;;;;;;;;;;;;;;2282:32;;2349:1;2332:19;;:5;:19;;;2324:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2414:5;2407:12;;;2191:235;;;:::o;1929:205::-;2001:7;2045:1;2028:19;;:5;:19;;;2020:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2111:9;:16;2121:5;2111:16;;;;;;;;;;;;;;;;2104:23;;1929:205;;;:::o;1668:101:2:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;1036:85::-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;2650:102:4:-;2706:13;2738:7;2731:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2650:102;:::o;4284:153::-;4378:52;4397:12;:10;:12::i;:::-;4411:8;4421;4378:18;:52::i;:::-;4284:153;;:::o;5368:320::-;5537:41;5556:12;:10;:12::i;:::-;5570:7;5537:18;:41::i;:::-;5529:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5642:39;5656:4;5662:2;5666:7;5675:5;5642:13;:39::i;:::-;5368:320;;;;:::o;1359:280:0:-;1425:13;1454:17;1462:8;1454:7;:17::i;:::-;1446:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;1556:1;1531:14;1525:28;;;;;:::i;:::-;;;:32;:109;;;;;;;;;;;;;;;;;1584:14;1600:8;:18;1609:8;1600:18;;;;;;;;;;;1567:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1525:109;1518:116;;1359:280;;;:::o;4503:162:4:-;4600:4;4623:18;:25;4642:5;4623:25;;;;;;;;;;;;;;;:35;4649:8;4623:35;;;;;;;;;;;;;;;;;;;;;;;;;4616:42;;4503:162;;;;:::o;1918:198:2:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;::::0;1998:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;1570:300:4:-;1672:4;1722:25;1707:40;;;:11;:40;;;;:104;;;;1778:33;1763:48;;;:11;:48;;;;1707:104;:156;;;;1827:36;1851:11;1827:23;:36::i;:::-;1707:156;1688:175;;1570:300;;;:::o;7160:125::-;7225:4;7276:1;7248:30;;:7;:16;7256:7;7248:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7241:37;;7160:125;;;:::o;640:96:11:-;693:7;719:10;712:17;;640:96;:::o;11169:171:4:-;11270:2;11243:15;:24;11259:7;11243:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11325:7;11321:2;11287:46;;11296:23;11311:7;11296:14;:23::i;:::-;11287:46;;;;;;;;;;;;11169:171;;:::o;1940:255:0:-;2029:7;2044:19;2076:7;2066:18;;;;;;2044:40;;2090:18;2111:36;:11;:34;:36::i;:::-;2090:57;;2160:30;2179:10;2160;:18;;:30;;;;:::i;:::-;2153:37;;;;1940:255;;;;:::o;8117:108:4:-;8192:26;8202:2;8206:7;8192:26;;;;;;;;;;;;:9;:26::i;:::-;8117:108;;:::o;7443:344::-;7536:4;7560:16;7568:7;7560;:16::i;:::-;7552:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7635:13;7651:23;7666:7;7651:14;:23::i;:::-;7635:39;;7703:5;7692:16;;:7;:16;;;:52;;;;7712:32;7729:5;7736:7;7712:16;:32::i;:::-;7692:52;:87;;;;7772:7;7748:31;;:20;7760:7;7748:11;:20::i;:::-;:31;;;7692:87;7684:96;;;7443:344;;;;:::o;10453:605::-;10607:4;10580:31;;:23;10595:7;10580:14;:23::i;:::-;:31;;;10572:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10685:1;10671:16;;:2;:16;;;10663:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10739:39;10760:4;10766:2;10770:7;10739:20;:39::i;:::-;10840:29;10857:1;10861:7;10840:8;:29::i;:::-;10899:1;10880:9;:15;10890:4;10880:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10927:1;10910:9;:13;10920:2;10910:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10957:2;10938:7;:16;10946:7;10938:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10994:7;10990:2;10975:27;;10984:4;10975:27;;;;;;;;;;;;11013:38;11033:4;11039:2;11043:7;11013:19;:38::i;:::-;10453:605;;;:::o;1745:126:0:-;1807:7;1858:5;1847:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;1837:28;;;;;;1829:37;;1822:44;;1745:126;;;:::o;2270:187:2:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;11475:307:4:-;11625:8;11616:17;;:5;:17;;;11608:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11711:8;11673:18;:25;11692:5;11673:25;;;;;;;;;;;;;;;:35;11699:8;11673:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11756:8;11734:41;;11749:5;11734:41;;;11766:8;11734:41;;;;;;:::i;:::-;;;;;;;;11475:307;;;:::o;6550:::-;6701:28;6711:4;6717:2;6721:7;6701:9;:28::i;:::-;6747:48;6770:4;6776:2;6780:7;6789:5;6747:22;:48::i;:::-;6739:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6550:307;;;;:::o;829:155:14:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;8012:265:13:-;8081:7;8264:4;8211:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;8201:69;;;;;;8194:76;;8012:265;;;:::o;4308:227::-;4386:7;4406:17;4425:18;4447:27;4458:4;4464:9;4447:10;:27::i;:::-;4405:69;;;;4484:18;4496:5;4484:11;:18::i;:::-;4519:9;4512:16;;;;4308:227;;;;:::o;8446:311:4:-;8571:18;8577:2;8581:7;8571:5;:18::i;:::-;8620:54;8651:1;8655:2;8659:7;8668:5;8620:22;:54::i;:::-;8599:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8446:311;;;:::o;2624:572:7:-;2763:45;2790:4;2796:2;2800:7;2763:26;:45::i;:::-;2839:1;2823:18;;:4;:18;;;2819:183;;2857:40;2889:7;2857:31;:40::i;:::-;2819:183;;;2926:2;2918:10;;:4;:10;;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;2914:88;2819:183;3029:1;3015:16;;:2;:16;;;3011:179;;3047:45;3084:7;3047:36;:45::i;:::-;3011:179;;;3119:4;3113:10;;:2;:10;;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;:::-;3109:81;3011:179;2624:572;;;:::o;14163:121:4:-;;;;:::o;12335:778::-;12485:4;12505:15;:2;:13;;;:15::i;:::-;12501:606;;;12556:2;12540:36;;;12577:12;:10;:12::i;:::-;12591:4;12597:7;12606:5;12540:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12536:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12796:1;12779:6;:13;:18;12775:266;;12821:60;;;;;;;;;;:::i;:::-;;;;;;;;12775:266;12993:6;12987:13;12978:6;12974:2;12970:15;12963:38;12536:519;12672:41;;;12662:51;;;:6;:51;;;;12655:58;;;;;12501:606;13092:4;13085:11;;12335:778;;;;;;;:::o;2243:1279:13:-;2324:7;2333:12;2574:2;2554:9;:16;:22;2550:966;;2592:9;2615;2638:7;2843:4;2832:9;2828:20;2822:27;2817:32;;2892:4;2881:9;2877:20;2871:27;2866:32;;2949:4;2938:9;2934:20;2928:27;2925:1;2920:36;2915:41;;2990:25;3001:4;3007:1;3010;3013;2990:10;:25::i;:::-;2983:32;;;;;;;;;2550:966;3056:2;3036:9;:16;:22;3032:484;;3074:9;3097:10;3305:4;3294:9;3290:20;3284:27;3279:32;;3355:4;3344:9;3340:20;3334:27;3328:33;;3395:23;3406:4;3412:1;3415:2;3395:10;:23::i;:::-;3388:30;;;;;;;;3032:484;3465:1;3469:35;3449:56;;;;2243:1279;;;;;;:::o;548:631::-;625:20;616:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;612:561;661:7;612:561;721:29;712:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;708:465;;766:34;;;;;;;;;;:::i;:::-;;;;;;;;708:465;830:35;821:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;817:356;;881:41;;;;;;;;;;:::i;:::-;;;;;;;;817:356;952:30;943:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;939:234;;998:44;;;;;;;;;;:::i;:::-;;;;;;;;939:234;1072:30;1063:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;1059:114;;1118:44;;;;;;;;;;:::i;:::-;;;;;;;;1059:114;548:631;;:::o;9079:427:4:-;9172:1;9158:16;;:2;:16;;;9150:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9230:16;9238:7;9230;:16::i;:::-;9229:17;9221:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9290:45;9319:1;9323:2;9327:7;9290:20;:45::i;:::-;9363:1;9346:9;:13;9356:2;9346:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9393:2;9374:7;:16;9382:7;9374:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9436:7;9432:2;9411:33;;9428:1;9411:33;;;;;;;;;;;;9455:44;9483:1;9487:2;9491:7;9455:19;:44::i;:::-;9079:427;;:::o;13669:122::-;;;;:::o;3902:161:7:-;4005:10;:17;;;;3978:15;:24;3994:7;3978:24;;;;;;;;;;;:44;;;;4032:10;4048:7;4032:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3902:161;:::o;4680:970::-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;4942:51;;5003:18;5024:17;:26;5042:7;5024:26;;;;;;;;;;;;5003:47;;5168:14;5154:10;:28;5150:323;;5198:19;5220:12;:18;5233:4;5220:18;;;;;;;;;;;;;;;:34;5239:14;5220:34;;;;;;;;;;;;5198:56;;5302:11;5269:12;:18;5282:4;5269:18;;;;;;;;;;;;;;;:30;5288:10;5269:30;;;;;;;;;;;:44;;;;5418:10;5385:17;:30;5403:11;5385:30;;;;;;;;;;;:43;;;;5184:289;5150:323;5566:17;:26;5584:7;5566:26;;;;;;;;;;;5559:33;;;5609:12;:18;5622:4;5609:18;;;;;;;;;;;;;;;:34;5628:14;5609:34;;;;;;;;;;;5602:41;;;4761:889;;4680:970;;:::o;5938:1061::-;6187:22;6232:1;6212:10;:17;;;;:21;;;;:::i;:::-;6187:46;;6243:18;6264:15;:24;6280:7;6264:24;;;;;;;;;;;;6243:45;;6610:19;6632:10;6643:14;6632:26;;;;;;;;:::i;:::-;;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6804:10;6773:15;:28;6789:11;6773:28;;;;;;;;;;;:41;;;;6942:15;:24;6958:7;6942:24;;;;;;;;;;;6935:31;;;6976:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6009:990;;;5938:1061;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;3574:37;;3648:7;3621:12;:16;3634:2;3621:16;;;;;;;;;;;;;;;:24;3638:6;3621:24;;;;;;;;;;;:34;;;;3694:6;3665:17;:26;3683:7;3665:26;;;;;;;;;;;:35;;;;3564:143;3490:217;;:::o;1175:320:10:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;5716:1603:13:-;5842:7;5851:12;6766:66;6761:1;6753:10;;:79;6749:161;;;6864:1;6868:30;6848:51;;;;;;6749:161;6928:2;6923:1;:7;;;;:18;;;;;6939:2;6934:1;:7;;;;6923:18;6919:100;;;6973:1;6977:30;6957:51;;;;;;6919:100;7113:14;7130:24;7140:4;7146:1;7149;7152;7130:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7113:41;;7186:1;7168:20;;:6;:20;;;7164:101;;7220:1;7224:29;7204:50;;;;;;;7164:101;7283:6;7291:20;7275:37;;;;;5716:1603;;;;;;;;:::o;4789:336::-;4899:7;4908:12;4932:9;4957:66;4949:75;;4944:2;:80;4932:92;;5034:7;5073:2;5066:3;5059:2;5051:11;;:18;;5050:25;;;;:::i;:::-;5034:42;;5093:25;5104:4;5110:1;5113;5116;5093:10;:25::i;:::-;5086:32;;;;;;4789:336;;;;;;:::o;7:75:16:-;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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:180;5184:77;5181:1;5174:88;5281:4;5278:1;5271:15;5305:4;5302:1;5295:15;5322:281;5405:27;5427:4;5405:27;:::i;:::-;5397:6;5393:40;5535:6;5523:10;5520:22;5499:18;5487:10;5484:34;5481:62;5478:88;;;5546:18;;:::i;:::-;5478:88;5586:10;5582:2;5575:22;5365:238;5322:281;;:::o;5609:129::-;5643:6;5670:20;;:::i;:::-;5660:30;;5699:33;5727:4;5719:6;5699:33;:::i;:::-;5609:129;;;:::o;5744:308::-;5806:4;5896:18;5888:6;5885:30;5882:56;;;5918:18;;:::i;:::-;5882:56;5956:29;5978:6;5956:29;:::i;:::-;5948:37;;6040:4;6034;6030:15;6022:23;;5744:308;;;:::o;6058:146::-;6155:6;6150:3;6145;6132:30;6196:1;6187:6;6182:3;6178:16;6171:27;6058:146;;;:::o;6210:425::-;6288:5;6313:66;6329:49;6371:6;6329:49;:::i;:::-;6313:66;:::i;:::-;6304:75;;6402:6;6395:5;6388:21;6440:4;6433:5;6429:16;6478:3;6469:6;6464:3;6460:16;6457:25;6454:112;;;6485:79;;:::i;:::-;6454:112;6575:54;6622:6;6617:3;6612;6575:54;:::i;:::-;6294:341;6210:425;;;;;:::o;6655:340::-;6711:5;6760:3;6753:4;6745:6;6741:17;6737:27;6727:122;;6768:79;;:::i;:::-;6727:122;6885:6;6872:20;6910:79;6985:3;6977:6;6970:4;6962:6;6958:17;6910:79;:::i;:::-;6901:88;;6717:278;6655:340;;;;:::o;7001:307::-;7062:4;7152:18;7144:6;7141:30;7138:56;;;7174:18;;:::i;:::-;7138:56;7212:29;7234:6;7212:29;:::i;:::-;7204:37;;7296:4;7290;7286:15;7278:23;;7001:307;;;:::o;7314:423::-;7391:5;7416:65;7432:48;7473:6;7432:48;:::i;:::-;7416:65;:::i;:::-;7407:74;;7504:6;7497:5;7490:21;7542:4;7535:5;7531:16;7580:3;7571:6;7566:3;7562:16;7559:25;7556:112;;;7587:79;;:::i;:::-;7556:112;7677:54;7724:6;7719:3;7714;7677:54;:::i;:::-;7397:340;7314:423;;;;;:::o;7756:338::-;7811:5;7860:3;7853:4;7845:6;7841:17;7837:27;7827:122;;7868:79;;:::i;:::-;7827:122;7985:6;7972:20;8010:78;8084:3;8076:6;8069:4;8061:6;8057:17;8010:78;:::i;:::-;8001:87;;7817:277;7756:338;;;;:::o;8100:1123::-;8205:6;8213;8221;8229;8278:3;8266:9;8257:7;8253:23;8249:33;8246:120;;;8285:79;;:::i;:::-;8246:120;8405:1;8430:53;8475:7;8466:6;8455:9;8451:22;8430:53;:::i;:::-;8420:63;;8376:117;8560:2;8549:9;8545:18;8532:32;8591:18;8583:6;8580:30;8577:117;;;8613:79;;:::i;:::-;8577:117;8718:63;8773:7;8764:6;8753:9;8749:22;8718:63;:::i;:::-;8708:73;;8503:288;8830:2;8856:53;8901:7;8892:6;8881:9;8877:22;8856:53;:::i;:::-;8846:63;;8801:118;8986:2;8975:9;8971:18;8958:32;9017:18;9009:6;9006:30;9003:117;;;9039:79;;:::i;:::-;9003:117;9144:62;9198:7;9189:6;9178:9;9174:22;9144:62;:::i;:::-;9134:72;;8929:287;8100:1123;;;;;;;:::o;9229:118::-;9316:24;9334:5;9316:24;:::i;:::-;9311:3;9304:37;9229:118;;:::o;9353:222::-;9446:4;9484:2;9473:9;9469:18;9461:26;;9497:71;9565:1;9554:9;9550:17;9541:6;9497:71;:::i;:::-;9353:222;;;;:::o;9581:619::-;9658:6;9666;9674;9723:2;9711:9;9702:7;9698:23;9694:32;9691:119;;;9729:79;;:::i;:::-;9691:119;9849:1;9874:53;9919:7;9910:6;9899:9;9895:22;9874:53;:::i;:::-;9864:63;;9820:117;9976:2;10002:53;10047:7;10038:6;10027:9;10023:22;10002:53;:::i;:::-;9992:63;;9947:118;10104:2;10130:53;10175:7;10166:6;10155:9;10151:22;10130:53;:::i;:::-;10120:63;;10075:118;9581:619;;;;;:::o;10206:509::-;10275:6;10324:2;10312:9;10303:7;10299:23;10295:32;10292:119;;;10330:79;;:::i;:::-;10292:119;10478:1;10467:9;10463:17;10450:31;10508:18;10500:6;10497:30;10494:117;;;10530:79;;:::i;:::-;10494:117;10635:63;10690:7;10681:6;10670:9;10666:22;10635:63;:::i;:::-;10625:73;;10421:287;10206:509;;;;:::o;10721:311::-;10798:4;10888:18;10880:6;10877:30;10874:56;;;10910:18;;:::i;:::-;10874:56;10960:4;10952:6;10948:17;10940:25;;11020:4;11014;11010:15;11002:23;;10721:311;;;:::o;11038:117::-;11147:1;11144;11137:12;11178:710;11274:5;11299:81;11315:64;11372:6;11315:64;:::i;:::-;11299:81;:::i;:::-;11290:90;;11400:5;11429:6;11422:5;11415:21;11463:4;11456:5;11452:16;11445:23;;11516:4;11508:6;11504:17;11496:6;11492:30;11545:3;11537:6;11534:15;11531:122;;;11564:79;;:::i;:::-;11531:122;11679:6;11662:220;11696:6;11691:3;11688:15;11662:220;;;11771:3;11800:37;11833:3;11821:10;11800:37;:::i;:::-;11795:3;11788:50;11867:4;11862:3;11858:14;11851:21;;11738:144;11722:4;11717:3;11713:14;11706:21;;11662:220;;;11666:21;11280:608;;11178:710;;;;;:::o;11911:370::-;11982:5;12031:3;12024:4;12016:6;12012:17;12008:27;11998:122;;12039:79;;:::i;:::-;11998:122;12156:6;12143:20;12181:94;12271:3;12263:6;12256:4;12248:6;12244:17;12181:94;:::i;:::-;12172:103;;11988:293;11911:370;;;;:::o;12287:321::-;12374:4;12464:18;12456:6;12453:30;12450:56;;;12486:18;;:::i;:::-;12450:56;12536:4;12528:6;12524:17;12516:25;;12596:4;12590;12586:15;12578:23;;12287:321;;;:::o;12630:945::-;12736:5;12761:91;12777:74;12844:6;12777:74;:::i;:::-;12761:91;:::i;:::-;12752:100;;12872:5;12901:6;12894:5;12887:21;12935:4;12928:5;12924:16;12917:23;;12988:4;12980:6;12976:17;12968:6;12964:30;13017:3;13009:6;13006:15;13003:122;;;13036:79;;:::i;:::-;13003:122;13151:6;13134:435;13168:6;13163:3;13160:15;13134:435;;;13257:3;13244:17;13293:18;13280:11;13277:35;13274:122;;;13315:79;;:::i;:::-;13274:122;13439:11;13431:6;13427:24;13477:47;13520:3;13508:10;13477:47;:::i;:::-;13472:3;13465:60;13554:4;13549:3;13545:14;13538:21;;13210:359;;13194:4;13189:3;13185:14;13178:21;;13134:435;;;13138:21;12742:833;;12630:945;;;;;:::o;13597:390::-;13678:5;13727:3;13720:4;13712:6;13708:17;13704:27;13694:122;;13735:79;;:::i;:::-;13694:122;13852:6;13839:20;13877:104;13977:3;13969:6;13962:4;13954:6;13950:17;13877:104;:::i;:::-;13868:113;;13684:303;13597:390;;;;:::o;13993:914::-;14121:6;14129;14178:2;14166:9;14157:7;14153:23;14149:32;14146:119;;;14184:79;;:::i;:::-;14146:119;14332:1;14321:9;14317:17;14304:31;14362:18;14354:6;14351:30;14348:117;;;14384:79;;:::i;:::-;14348:117;14489:78;14559:7;14550:6;14539:9;14535:22;14489:78;:::i;:::-;14479:88;;14275:302;14644:2;14633:9;14629:18;14616:32;14675:18;14667:6;14664:30;14661:117;;;14697:79;;:::i;:::-;14661:117;14802:88;14882:7;14873:6;14862:9;14858:22;14802:88;:::i;:::-;14792:98;;14587:313;13993:914;;;;;:::o;14913:329::-;14972:6;15021:2;15009:9;15000:7;14996:23;14992:32;14989:119;;;15027:79;;:::i;:::-;14989:119;15147:1;15172:53;15217:7;15208:6;15197:9;15193:22;15172:53;:::i;:::-;15162:63;;15118:117;14913:329;;;;:::o;15248:116::-;15318:21;15333:5;15318:21;:::i;:::-;15311:5;15308:32;15298:60;;15354:1;15351;15344:12;15298:60;15248:116;:::o;15370:133::-;15413:5;15451:6;15438:20;15429:29;;15467:30;15491:5;15467:30;:::i;:::-;15370:133;;;;:::o;15509:468::-;15574:6;15582;15631:2;15619:9;15610:7;15606:23;15602:32;15599:119;;;15637:79;;:::i;:::-;15599:119;15757:1;15782:53;15827:7;15818:6;15807:9;15803:22;15782:53;:::i;:::-;15772:63;;15728:117;15884:2;15910:50;15952:7;15943:6;15932:9;15928:22;15910:50;:::i;:::-;15900:60;;15855:115;15509:468;;;;;:::o;15983:943::-;16078:6;16086;16094;16102;16151:3;16139:9;16130:7;16126:23;16122:33;16119:120;;;16158:79;;:::i;:::-;16119:120;16278:1;16303:53;16348:7;16339:6;16328:9;16324:22;16303:53;:::i;:::-;16293:63;;16249:117;16405:2;16431:53;16476:7;16467:6;16456:9;16452:22;16431:53;:::i;:::-;16421:63;;16376:118;16533:2;16559:53;16604:7;16595:6;16584:9;16580:22;16559:53;:::i;:::-;16549:63;;16504:118;16689:2;16678:9;16674:18;16661:32;16720:18;16712:6;16709:30;16706:117;;;16742:79;;:::i;:::-;16706:117;16847:62;16901:7;16892:6;16881:9;16877:22;16847:62;:::i;:::-;16837:72;;16632:287;15983:943;;;;;;;:::o;16932:474::-;17000:6;17008;17057:2;17045:9;17036:7;17032:23;17028:32;17025:119;;;17063:79;;:::i;:::-;17025:119;17183:1;17208:53;17253:7;17244:6;17233:9;17229:22;17208:53;:::i;:::-;17198:63;;17154:117;17310:2;17336:53;17381:7;17372:6;17361:9;17357:22;17336:53;:::i;:::-;17326:63;;17281:118;16932:474;;;;;:::o;17412:180::-;17460:77;17457:1;17450:88;17557:4;17554:1;17547:15;17581:4;17578:1;17571:15;17598:320;17642:6;17679:1;17673:4;17669:12;17659:22;;17726:1;17720:4;17716:12;17747:18;17737:81;;17803:4;17795:6;17791:17;17781:27;;17737:81;17865:2;17857:6;17854:14;17834:18;17831:38;17828:84;;17884:18;;:::i;:::-;17828:84;17649:269;17598:320;;;:::o;17924:231::-;18064:34;18060:1;18052:6;18048:14;18041:58;18133:14;18128:2;18120:6;18116:15;18109:39;17924:231;:::o;18161:366::-;18303:3;18324:67;18388:2;18383:3;18324:67;:::i;:::-;18317:74;;18400:93;18489:3;18400:93;:::i;:::-;18518:2;18513:3;18509:12;18502:19;;18161:366;;;:::o;18533:419::-;18699:4;18737:2;18726:9;18722:18;18714:26;;18786:9;18780:4;18776:20;18772:1;18761:9;18757:17;18750:47;18814:131;18940:4;18814:131;:::i;:::-;18806:139;;18533:419;;;:::o;18958:220::-;19098:34;19094:1;19086:6;19082:14;19075:58;19167:3;19162:2;19154:6;19150:15;19143:28;18958:220;:::o;19184:366::-;19326:3;19347:67;19411:2;19406:3;19347:67;:::i;:::-;19340:74;;19423:93;19512:3;19423:93;:::i;:::-;19541:2;19536:3;19532:12;19525:19;;19184:366;;;:::o;19556:419::-;19722:4;19760:2;19749:9;19745:18;19737:26;;19809:9;19803:4;19799:20;19795:1;19784:9;19780:17;19773:47;19837:131;19963:4;19837:131;:::i;:::-;19829:139;;19556:419;;;:::o;19981:243::-;20121:34;20117:1;20109:6;20105:14;20098:58;20190:26;20185:2;20177:6;20173:15;20166:51;19981:243;:::o;20230:366::-;20372:3;20393:67;20457:2;20452:3;20393:67;:::i;:::-;20386:74;;20469:93;20558:3;20469:93;:::i;:::-;20587:2;20582:3;20578:12;20571:19;;20230:366;;;:::o;20602:419::-;20768:4;20806:2;20795:9;20791:18;20783:26;;20855:9;20849:4;20845:20;20841:1;20830:9;20826:17;20819:47;20883:131;21009:4;20883:131;:::i;:::-;20875:139;;20602:419;;;:::o;21027:222::-;21167:34;21163:1;21155:6;21151:14;21144:58;21236:5;21231:2;21223:6;21219:15;21212:30;21027:222;:::o;21255:366::-;21397:3;21418:67;21482:2;21477:3;21418:67;:::i;:::-;21411:74;;21494:93;21583:3;21494:93;:::i;:::-;21612:2;21607:3;21603:12;21596:19;;21255:366;;;:::o;21627:419::-;21793:4;21831:2;21820:9;21816:18;21808:26;;21880:9;21874:4;21870:20;21866:1;21855:9;21851:17;21844:47;21908:131;22034:4;21908:131;:::i;:::-;21900:139;;21627:419;;;:::o;22052:533::-;22221:4;22259:2;22248:9;22244:18;22236:26;;22272:71;22340:1;22329:9;22325:17;22316:6;22272:71;:::i;:::-;22390:9;22384:4;22380:20;22375:2;22364:9;22360:18;22353:48;22418:78;22491:4;22482:6;22418:78;:::i;:::-;22410:86;;22506:72;22574:2;22563:9;22559:18;22550:6;22506:72;:::i;:::-;22052:533;;;;;;:::o;22591:179::-;22731:31;22727:1;22719:6;22715:14;22708:55;22591:179;:::o;22776:366::-;22918:3;22939:67;23003:2;22998:3;22939:67;:::i;:::-;22932:74;;23015:93;23104:3;23015:93;:::i;:::-;23133:2;23128:3;23124:12;23117:19;;22776:366;;;:::o;23148:419::-;23314:4;23352:2;23341:9;23337:18;23329:26;;23401:9;23395:4;23391:20;23387:1;23376:9;23372:17;23365:47;23429:131;23555:4;23429:131;:::i;:::-;23421:139;;23148:419;;;:::o;23573:141::-;23622:4;23645:3;23637:11;;23668:3;23665:1;23658:14;23702:4;23699:1;23689:18;23681:26;;23573:141;;;:::o;23720:93::-;23757:6;23804:2;23799;23792:5;23788:14;23784:23;23774:33;;23720:93;;;:::o;23819:107::-;23863:8;23913:5;23907:4;23903:16;23882:37;;23819:107;;;;:::o;23932:393::-;24001:6;24051:1;24039:10;24035:18;24074:97;24104:66;24093:9;24074:97;:::i;:::-;24192:39;24222:8;24211:9;24192:39;:::i;:::-;24180:51;;24264:4;24260:9;24253:5;24249:21;24240:30;;24313:4;24303:8;24299:19;24292:5;24289:30;24279:40;;24008:317;;23932:393;;;;;:::o;24331:60::-;24359:3;24380:5;24373:12;;24331:60;;;:::o;24397:142::-;24447:9;24480:53;24498:34;24507:24;24525:5;24507:24;:::i;:::-;24498:34;:::i;:::-;24480:53;:::i;:::-;24467:66;;24397:142;;;:::o;24545:75::-;24588:3;24609:5;24602:12;;24545:75;;;:::o;24626:269::-;24736:39;24767:7;24736:39;:::i;:::-;24797:91;24846:41;24870:16;24846:41;:::i;:::-;24838:6;24831:4;24825:11;24797:91;:::i;:::-;24791:4;24784:105;24702:193;24626:269;;;:::o;24901:73::-;24946:3;24901:73;:::o;24980:189::-;25057:32;;:::i;:::-;25098:65;25156:6;25148;25142:4;25098:65;:::i;:::-;25033:136;24980:189;;:::o;25175:186::-;25235:120;25252:3;25245:5;25242:14;25235:120;;;25306:39;25343:1;25336:5;25306:39;:::i;:::-;25279:1;25272:5;25268:13;25259:22;;25235:120;;;25175:186;;:::o;25367:543::-;25468:2;25463:3;25460:11;25457:446;;;25502:38;25534:5;25502:38;:::i;:::-;25586:29;25604:10;25586:29;:::i;:::-;25576:8;25572:44;25769:2;25757:10;25754:18;25751:49;;;25790:8;25775:23;;25751:49;25813:80;25869:22;25887:3;25869:22;:::i;:::-;25859:8;25855:37;25842:11;25813:80;:::i;:::-;25472:431;;25457:446;25367:543;;;:::o;25916:117::-;25970:8;26020:5;26014:4;26010:16;25989:37;;25916:117;;;;:::o;26039:169::-;26083:6;26116:51;26164:1;26160:6;26152:5;26149:1;26145:13;26116:51;:::i;:::-;26112:56;26197:4;26191;26187:15;26177:25;;26090:118;26039:169;;;;:::o;26213:295::-;26289:4;26435:29;26460:3;26454:4;26435:29;:::i;:::-;26427:37;;26497:3;26494:1;26490:11;26484:4;26481:21;26473:29;;26213:295;;;;:::o;26513:1395::-;26630:37;26663:3;26630:37;:::i;:::-;26732:18;26724:6;26721:30;26718:56;;;26754:18;;:::i;:::-;26718:56;26798:38;26830:4;26824:11;26798:38;:::i;:::-;26883:67;26943:6;26935;26929:4;26883:67;:::i;:::-;26977:1;27001:4;26988:17;;27033:2;27025:6;27022:14;27050:1;27045:618;;;;27707:1;27724:6;27721:77;;;27773:9;27768:3;27764:19;27758:26;27749:35;;27721:77;27824:67;27884:6;27877:5;27824:67;:::i;:::-;27818:4;27811:81;27680:222;27015:887;;27045:618;27097:4;27093:9;27085:6;27081:22;27131:37;27163:4;27131:37;:::i;:::-;27190:1;27204:208;27218:7;27215:1;27212:14;27204:208;;;27297:9;27292:3;27288:19;27282:26;27274:6;27267:42;27348:1;27340:6;27336:14;27326:24;;27395:2;27384:9;27380:18;27367:31;;27241:4;27238:1;27234:12;27229:17;;27204:208;;;27440:6;27431:7;27428:19;27425:179;;;27498:9;27493:3;27489:19;27483:26;27541:48;27583:4;27575:6;27571:17;27560:9;27541:48;:::i;:::-;27533:6;27526:64;27448:156;27425:179;27650:1;27646;27638:6;27634:14;27630:22;27624:4;27617:36;27052:611;;;27015:887;;26605:1303;;;26513:1395;;:::o;27914:236::-;28054:34;28050:1;28042:6;28038:14;28031:58;28123:19;28118:2;28110:6;28106:15;28099:44;27914:236;:::o;28156:366::-;28298:3;28319:67;28383:2;28378:3;28319:67;:::i;:::-;28312:74;;28395:93;28484:3;28395:93;:::i;:::-;28513:2;28508:3;28504:12;28497:19;;28156:366;;;:::o;28528:419::-;28694:4;28732:2;28721:9;28717:18;28709:26;;28781:9;28775:4;28771:20;28767:1;28756:9;28752:17;28745:47;28809:131;28935:4;28809:131;:::i;:::-;28801:139;;28528:419;;;:::o;28953:230::-;29093:34;29089:1;29081:6;29077:14;29070:58;29162:13;29157:2;29149:6;29145:15;29138:38;28953:230;:::o;29189:366::-;29331:3;29352:67;29416:2;29411:3;29352:67;:::i;:::-;29345:74;;29428:93;29517:3;29428:93;:::i;:::-;29546:2;29541:3;29537:12;29530:19;;29189:366;;;:::o;29561:419::-;29727:4;29765:2;29754:9;29750:18;29742:26;;29814:9;29808:4;29804:20;29800:1;29789:9;29785:17;29778:47;29842:131;29968:4;29842:131;:::i;:::-;29834:139;;29561:419;;;:::o;29986:182::-;30126:34;30122:1;30114:6;30110:14;30103:58;29986:182;:::o;30174:366::-;30316:3;30337:67;30401:2;30396:3;30337:67;:::i;:::-;30330:74;;30413:93;30502:3;30413:93;:::i;:::-;30531:2;30526:3;30522:12;30515:19;;30174:366;;;:::o;30546:419::-;30712:4;30750:2;30739:9;30735:18;30727:26;;30799:9;30793:4;30789:20;30785:1;30774:9;30770:17;30763:47;30827:131;30953:4;30827:131;:::i;:::-;30819:139;;30546:419;;;:::o;30971:180::-;31019:77;31016:1;31009:88;31116:4;31113:1;31106:15;31140:4;31137:1;31130:15;31157:180;31205:77;31202:1;31195:88;31302:4;31299:1;31292:15;31326:4;31323:1;31316:15;31343:233;31382:3;31405:24;31423:5;31405:24;:::i;:::-;31396:33;;31451:66;31444:5;31441:77;31438:103;;31521:18;;:::i;:::-;31438:103;31568:1;31561:5;31557:13;31550:20;;31343:233;;;:::o;31582:231::-;31722:34;31718:1;31710:6;31706:14;31699:58;31791:14;31786:2;31778:6;31774:15;31767:39;31582:231;:::o;31819:366::-;31961:3;31982:67;32046:2;32041:3;31982:67;:::i;:::-;31975:74;;32058:93;32147:3;32058:93;:::i;:::-;32176:2;32171:3;32167:12;32160:19;;31819:366;;;:::o;32191:419::-;32357:4;32395:2;32384:9;32380:18;32372:26;;32444:9;32438:4;32434:20;32430:1;32419:9;32415:17;32408:47;32472:131;32598:4;32472:131;:::i;:::-;32464:139;;32191:419;;;:::o;32616:228::-;32756:34;32752:1;32744:6;32740:14;32733:58;32825:11;32820:2;32812:6;32808:15;32801:36;32616:228;:::o;32850:366::-;32992:3;33013:67;33077:2;33072:3;33013:67;:::i;:::-;33006:74;;33089:93;33178:3;33089:93;:::i;:::-;33207:2;33202:3;33198:12;33191:19;;32850:366;;;:::o;33222:419::-;33388:4;33426:2;33415:9;33411:18;33403:26;;33475:9;33469:4;33465:20;33461:1;33450:9;33446:17;33439:47;33503:131;33629:4;33503:131;:::i;:::-;33495:139;;33222:419;;;:::o;33647:229::-;33787:34;33783:1;33775:6;33771:14;33764:58;33856:12;33851:2;33843:6;33839:15;33832:37;33647:229;:::o;33882:366::-;34024:3;34045:67;34109:2;34104:3;34045:67;:::i;:::-;34038:74;;34121:93;34210:3;34121:93;:::i;:::-;34239:2;34234:3;34230:12;34223:19;;33882:366;;;:::o;34254:419::-;34420:4;34458:2;34447:9;34443:18;34435:26;;34507:9;34501:4;34497:20;34493:1;34482:9;34478:17;34471:47;34535:131;34661:4;34535:131;:::i;:::-;34527:139;;34254:419;;;:::o;34679:223::-;34819:34;34815:1;34807:6;34803:14;34796:58;34888:6;34883:2;34875:6;34871:15;34864:31;34679:223;:::o;34908:366::-;35050:3;35071:67;35135:2;35130:3;35071:67;:::i;:::-;35064:74;;35147:93;35236:3;35147:93;:::i;:::-;35265:2;35260:3;35256:12;35249:19;;34908:366;;;:::o;35280:419::-;35446:4;35484:2;35473:9;35469:18;35461:26;;35533:9;35527:4;35523:20;35519:1;35508:9;35504:17;35497:47;35561:131;35687:4;35561:131;:::i;:::-;35553:139;;35280:419;;;:::o;35705:148::-;35807:11;35844:3;35829:18;;35705:148;;;;:::o;35883:874::-;35986:3;36023:5;36017:12;36052:36;36078:9;36052:36;:::i;:::-;36104:89;36186:6;36181:3;36104:89;:::i;:::-;36097:96;;36224:1;36213:9;36209:17;36240:1;36235:166;;;;36415:1;36410:341;;;;36202:549;;36235:166;36319:4;36315:9;36304;36300:25;36295:3;36288:38;36381:6;36374:14;36367:22;36359:6;36355:35;36350:3;36346:45;36339:52;;36235:166;;36410:341;36477:38;36509:5;36477:38;:::i;:::-;36537:1;36551:154;36565:6;36562:1;36559:13;36551:154;;;36639:7;36633:14;36629:1;36624:3;36620:11;36613:35;36689:1;36680:7;36676:15;36665:26;;36587:4;36584:1;36580:12;36575:17;;36551:154;;;36734:6;36729:3;36725:16;36718:23;;36417:334;;36202:549;;35990:767;;35883:874;;;;:::o;36763:155::-;36903:7;36899:1;36891:6;36887:14;36880:31;36763:155;:::o;36924:400::-;37084:3;37105:84;37187:1;37182:3;37105:84;:::i;:::-;37098:91;;37198:93;37287:3;37198:93;:::i;:::-;37316:1;37311:3;37307:11;37300:18;;36924:400;;;:::o;37330:689::-;37605:3;37627:92;37715:3;37706:6;37627:92;:::i;:::-;37620:99;;37736:92;37824:3;37815:6;37736:92;:::i;:::-;37729:99;;37845:148;37989:3;37845:148;:::i;:::-;37838:155;;38010:3;38003:10;;37330:689;;;;;:::o;38025:225::-;38165:34;38161:1;38153:6;38149:14;38142:58;38234:8;38229:2;38221:6;38217:15;38210:33;38025:225;:::o;38256:366::-;38398:3;38419:67;38483:2;38478:3;38419:67;:::i;:::-;38412:74;;38495:93;38584:3;38495:93;:::i;:::-;38613:2;38608:3;38604:12;38597:19;;38256:366;;;:::o;38628:419::-;38794:4;38832:2;38821:9;38817:18;38809:26;;38881:9;38875:4;38871:20;38867:1;38856:9;38852:17;38845:47;38909:131;39035:4;38909:131;:::i;:::-;38901:139;;38628:419;;;:::o;39053:231::-;39193:34;39189:1;39181:6;39177:14;39170:58;39262:14;39257:2;39249:6;39245:15;39238:39;39053:231;:::o;39290:366::-;39432:3;39453:67;39517:2;39512:3;39453:67;:::i;:::-;39446:74;;39529:93;39618:3;39529:93;:::i;:::-;39647:2;39642:3;39638:12;39631:19;;39290:366;;;:::o;39662:419::-;39828:4;39866:2;39855:9;39851:18;39843:26;;39915:9;39909:4;39905:20;39901:1;39890:9;39886:17;39879:47;39943:131;40069:4;39943:131;:::i;:::-;39935:139;;39662:419;;;:::o;40087:224::-;40227:34;40223:1;40215:6;40211:14;40204:58;40296:7;40291:2;40283:6;40279:15;40272:32;40087:224;:::o;40317:366::-;40459:3;40480:67;40544:2;40539:3;40480:67;:::i;:::-;40473:74;;40556:93;40645:3;40556:93;:::i;:::-;40674:2;40669:3;40665:12;40658:19;;40317:366;;;:::o;40689:419::-;40855:4;40893:2;40882:9;40878:18;40870:26;;40942:9;40936:4;40932:20;40928:1;40917:9;40913:17;40906:47;40970:131;41096:4;40970:131;:::i;:::-;40962:139;;40689:419;;;:::o;41114:223::-;41254:34;41250:1;41242:6;41238:14;41231:58;41323:6;41318:2;41310:6;41306:15;41299:31;41114:223;:::o;41343:366::-;41485:3;41506:67;41570:2;41565:3;41506:67;:::i;:::-;41499:74;;41582:93;41671:3;41582:93;:::i;:::-;41700:2;41695:3;41691:12;41684:19;;41343:366;;;:::o;41715:419::-;41881:4;41919:2;41908:9;41904:18;41896:26;;41968:9;41962:4;41958:20;41954:1;41943:9;41939:17;41932:47;41996:131;42122:4;41996:131;:::i;:::-;41988:139;;41715:419;;;:::o;42140:194::-;42180:4;42200:20;42218:1;42200:20;:::i;:::-;42195:25;;42234:20;42252:1;42234:20;:::i;:::-;42229:25;;42278:1;42275;42271:9;42263:17;;42302:1;42296:4;42293:11;42290:37;;;42307:18;;:::i;:::-;42290:37;42140:194;;;;:::o;42340:191::-;42380:3;42399:20;42417:1;42399:20;:::i;:::-;42394:25;;42433:20;42451:1;42433:20;:::i;:::-;42428:25;;42476:1;42473;42469:9;42462:16;;42497:3;42494:1;42491:10;42488:36;;;42504:18;;:::i;:::-;42488:36;42340:191;;;;:::o;42537:175::-;42677:27;42673:1;42665:6;42661:14;42654:51;42537:175;:::o;42718:366::-;42860:3;42881:67;42945:2;42940:3;42881:67;:::i;:::-;42874:74;;42957:93;43046:3;42957:93;:::i;:::-;43075:2;43070:3;43066:12;43059:19;;42718:366;;;:::o;43090:419::-;43256:4;43294:2;43283:9;43279:18;43271:26;;43343:9;43337:4;43333:20;43329:1;43318:9;43314:17;43307:47;43371:131;43497:4;43371:131;:::i;:::-;43363:139;;43090:419;;;:::o;43515:237::-;43655:34;43651:1;43643:6;43639:14;43632:58;43724:20;43719:2;43711:6;43707:15;43700:45;43515:237;:::o;43758:366::-;43900:3;43921:67;43985:2;43980:3;43921:67;:::i;:::-;43914:74;;43997:93;44086:3;43997:93;:::i;:::-;44115:2;44110:3;44106:12;44099:19;;43758:366;;;:::o;44130:419::-;44296:4;44334:2;44323:9;44319:18;44311:26;;44383:9;44377:4;44373:20;44369:1;44358:9;44354:17;44347:47;44411:131;44537:4;44411:131;:::i;:::-;44403:139;;44130:419;;;:::o;44555:214::-;44695:66;44691:1;44683:6;44679:14;44672:90;44555:214;:::o;44775:402::-;44935:3;44956:85;45038:2;45033:3;44956:85;:::i;:::-;44949:92;;45050:93;45139:3;45050:93;:::i;:::-;45168:2;45163:3;45159:12;45152:19;;44775:402;;;:::o;45183:77::-;45220:7;45249:5;45238:16;;45183:77;;;:::o;45266:79::-;45305:7;45334:5;45323:16;;45266:79;;;:::o;45351:157::-;45456:45;45476:24;45494:5;45476:24;:::i;:::-;45456:45;:::i;:::-;45451:3;45444:58;45351:157;;:::o;45514:522::-;45727:3;45749:148;45893:3;45749:148;:::i;:::-;45742:155;;45907:75;45978:3;45969:6;45907:75;:::i;:::-;46007:2;46002:3;45998:12;45991:19;;46027:3;46020:10;;45514:522;;;;:::o;46042:98::-;46093:6;46127:5;46121:12;46111:22;;46042:98;;;:::o;46146:168::-;46229:11;46263:6;46258:3;46251:19;46303:4;46298:3;46294:14;46279:29;;46146:168;;;;:::o;46320:373::-;46406:3;46434:38;46466:5;46434:38;:::i;:::-;46488:70;46551:6;46546:3;46488:70;:::i;:::-;46481:77;;46567:65;46625:6;46620:3;46613:4;46606:5;46602:16;46567:65;:::i;:::-;46657:29;46679:6;46657:29;:::i;:::-;46652:3;46648:39;46641:46;;46410:283;46320:373;;;;:::o;46699:640::-;46894:4;46932:3;46921:9;46917:19;46909:27;;46946:71;47014:1;47003:9;46999:17;46990:6;46946:71;:::i;:::-;47027:72;47095:2;47084:9;47080:18;47071:6;47027:72;:::i;:::-;47109;47177:2;47166:9;47162:18;47153:6;47109:72;:::i;:::-;47228:9;47222:4;47218:20;47213:2;47202:9;47198:18;47191:48;47256:76;47327:4;47318:6;47256:76;:::i;:::-;47248:84;;46699:640;;;;;;;:::o;47345:141::-;47401:5;47432:6;47426:13;47417:22;;47448:32;47474:5;47448:32;:::i;:::-;47345:141;;;;:::o;47492:349::-;47561:6;47610:2;47598:9;47589:7;47585:23;47581:32;47578:119;;;47616:79;;:::i;:::-;47578:119;47736:1;47761:63;47816:7;47807:6;47796:9;47792:22;47761:63;:::i;:::-;47751:73;;47707:127;47492:349;;;;:::o;47847:180::-;47895:77;47892:1;47885:88;47992:4;47989:1;47982:15;48016:4;48013:1;48006:15;48033:174;48173:26;48169:1;48161:6;48157:14;48150:50;48033:174;:::o;48213:366::-;48355:3;48376:67;48440:2;48435:3;48376:67;:::i;:::-;48369:74;;48452:93;48541:3;48452:93;:::i;:::-;48570:2;48565:3;48561:12;48554:19;;48213:366;;;:::o;48585:419::-;48751:4;48789:2;48778:9;48774:18;48766:26;;48838:9;48832:4;48828:20;48824:1;48813:9;48809:17;48802:47;48866:131;48992:4;48866:131;:::i;:::-;48858:139;;48585:419;;;:::o;49010:181::-;49150:33;49146:1;49138:6;49134:14;49127:57;49010:181;:::o;49197:366::-;49339:3;49360:67;49424:2;49419:3;49360:67;:::i;:::-;49353:74;;49436:93;49525:3;49436:93;:::i;:::-;49554:2;49549:3;49545:12;49538:19;;49197:366;;;:::o;49569:419::-;49735:4;49773:2;49762:9;49758:18;49750:26;;49822:9;49816:4;49812:20;49808:1;49797:9;49793:17;49786:47;49850:131;49976:4;49850:131;:::i;:::-;49842:139;;49569:419;;;:::o;49994:221::-;50134:34;50130:1;50122:6;50118:14;50111:58;50203:4;50198:2;50190:6;50186:15;50179:29;49994:221;:::o;50221:366::-;50363:3;50384:67;50448:2;50443:3;50384:67;:::i;:::-;50377:74;;50460:93;50549:3;50460:93;:::i;:::-;50578:2;50573:3;50569:12;50562:19;;50221:366;;;:::o;50593:419::-;50759:4;50797:2;50786:9;50782:18;50774:26;;50846:9;50840:4;50836:20;50832:1;50821:9;50817:17;50810:47;50874:131;51000:4;50874:131;:::i;:::-;50866:139;;50593:419;;;:::o;51018:221::-;51158:34;51154:1;51146:6;51142:14;51135:58;51227:4;51222:2;51214:6;51210:15;51203:29;51018:221;:::o;51245:366::-;51387:3;51408:67;51472:2;51467:3;51408:67;:::i;:::-;51401:74;;51484:93;51573:3;51484:93;:::i;:::-;51602:2;51597:3;51593:12;51586:19;;51245:366;;;:::o;51617:419::-;51783:4;51821:2;51810:9;51806:18;51798:26;;51870:9;51864:4;51860:20;51856:1;51845:9;51841:17;51834:47;51898:131;52024:4;51898:131;:::i;:::-;51890:139;;51617:419;;;:::o;52042:182::-;52182:34;52178:1;52170:6;52166:14;52159:58;52042:182;:::o;52230:366::-;52372:3;52393:67;52457:2;52452:3;52393:67;:::i;:::-;52386:74;;52469:93;52558:3;52469:93;:::i;:::-;52587:2;52582:3;52578:12;52571:19;;52230:366;;;:::o;52602:419::-;52768:4;52806:2;52795:9;52791:18;52783:26;;52855:9;52849:4;52845:20;52841:1;52830:9;52826:17;52819:47;52883:131;53009:4;52883:131;:::i;:::-;52875:139;;52602:419;;;:::o;53027:178::-;53167:30;53163:1;53155:6;53151:14;53144:54;53027:178;:::o;53211:366::-;53353:3;53374:67;53438:2;53433:3;53374:67;:::i;:::-;53367:74;;53450:93;53539:3;53450:93;:::i;:::-;53568:2;53563:3;53559:12;53552:19;;53211:366;;;:::o;53583:419::-;53749:4;53787:2;53776:9;53772:18;53764:26;;53836:9;53830:4;53826:20;53822:1;53811:9;53807:17;53800:47;53864:131;53990:4;53864:131;:::i;:::-;53856:139;;53583:419;;;:::o;54008:180::-;54056:77;54053:1;54046:88;54153:4;54150:1;54143:15;54177:4;54174:1;54167:15;54194:118;54281:24;54299:5;54281:24;:::i;:::-;54276:3;54269:37;54194:118;;:::o;54318:86::-;54353:7;54393:4;54386:5;54382:16;54371:27;;54318:86;;;:::o;54410:112::-;54493:22;54509:5;54493:22;:::i;:::-;54488:3;54481:35;54410:112;;:::o;54528:545::-;54701:4;54739:3;54728:9;54724:19;54716:27;;54753:71;54821:1;54810:9;54806:17;54797:6;54753:71;:::i;:::-;54834:68;54898:2;54887:9;54883:18;54874:6;54834:68;:::i;:::-;54912:72;54980:2;54969:9;54965:18;54956:6;54912:72;:::i;:::-;54994;55062:2;55051:9;55047:18;55038:6;54994:72;:::i;:::-;54528:545;;;;;;;:::o
Swarm Source
ipfs://7c1f12f05e842939b1395d8b30c6ec2a043aac83ac43ef11f41985f4eeccf523
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.