Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
104 Meta$heroesGenesis
Holders
36
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 Meta$heroesGenesisLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Meta$heroesGenesis
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-29 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.7; library MerkleProof { function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { computedHash = _efficientHash(computedHash, proofElement); } else { computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } abstract contract ReentrancyGuard { uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } modifier nonReentrant() { require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); _status = _ENTERED; _; _status = _NOT_ENTERED; } } library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; function toString(uint256 value) internal pure returns (string memory) { 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); } 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); } 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); } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _transferOwnership(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @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); // ============================== // IERC721Metadata // ============================== /** * @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); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ using SafeMath for uint256; function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { curr=curr.sub(1); packed = _packedOwnerships[curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), 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-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 { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } contract Meta$heroesGenesis is ERC721A, Ownable { using Strings for uint256; using SafeMath for uint256; uint256 public collectionSize = 3333; string public uri = "https://bafkreihzjcji4jfelbxd2ew2nidx666mhx2en4khmxdss54674huldkysq.ipfs.nftstorage.link/"; bool public reveal = false; uint256 public price = 0.095 ether; uint256 public price_WL = 0.085 ether; bool public status = false; bool public status_WL = false; uint256 public mint_perTxn = 10; uint256 public mint_perAdd = 30; uint256 public mint_perAdd_WL = 10; bytes32 public merkleRoot = 0x69a961d0acd6efadcb5d05033eca8d6ef9523f395bfe03b751cd78af1dab5539; function setMerkleRoot(bytes32 m) public onlyOwner{ merkleRoot = m; } constructor() ERC721A("Meta$heroes Genesis", "Meta$heroesGenesis") { _safeMint(0xc344657A67eE162990D2800549468b488C0FD8DE, 31); } function giveaway(address recipient, uint256 quantity) public onlyOwner { require(totalSupply().add(quantity) <= collectionSize, "Giveaway exceeds current batch!!!"); _safeMint(recipient, quantity); } function mint_WL(uint256 quantity, bytes32[] calldata merkleproof) public payable { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify( merkleproof, merkleRoot, leaf),"Not whitelisted"); require(status_WL, "Whitelist Minting not active!!"); require(quantity <= mint_perTxn && quantity > 0, "Invalid mint quantity!!"); require(numberMinted(msg.sender).add(quantity) <= mint_perAdd_WL && quantity > 0, "Invalid mint quantity!!"); require(msg.value >= quantity.mul(price_WL), "Insufficient eth sent for mint!!"); require(totalSupply().add(quantity) <= collectionSize, "Mint exceeds Collection size!!"); _safeMint(msg.sender, quantity); } function mint(uint256 quantity) public payable { require(status, "Public Minting not active!!"); require(quantity <= mint_perTxn && quantity > 0, "Invalid mint quantity!!"); require(numberMinted(msg.sender).add(quantity) <= mint_perAdd && quantity > 0, "Invalid mint quantity!!"); require(msg.value >= quantity.mul(price), "Insufficient eth sent for mint!!"); require(totalSupply().add(quantity) <= collectionSize, "Mint exceeds Collection size!!"); _safeMint(msg.sender, quantity); } function switchWL() public onlyOwner { status_WL = !status_WL; } function switchPublic() public onlyOwner { status = !status; } function setBaseURI(string memory baseURI) public onlyOwner { uri = baseURI; } function setReveal(string memory uri_) public onlyOwner() { reveal = true; uri = uri_; } function setPrice(uint256 number) public onlyOwner() { price = number; } function setPrice_WL(uint256 number) public onlyOwner() { price_WL = number; } function setMaxPerTx(uint256 number) public onlyOwner { mint_perTxn = number; } function setMaxPerAdd(uint256 number) public onlyOwner { mint_perAdd = number; } function setMaxPerAdd_WL(uint256 number) public onlyOwner { mint_perAdd_WL = number; } function withdraw() public onlyOwner { (bool response, ) = payable(msg.sender).call{value: address(this).balance}(""); require(response, "Reward distribution failed"); } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); if(reveal) return string(abi.encodePacked(uri, (tokenId).toString(), ".json")); return uri; } function _startTokenId() pure internal override returns (uint256) { return 1; } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleproof","type":"bytes32[]"}],"name":"mint_WL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint_perAdd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_perAdd_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_perTxn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setMaxPerAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setMaxPerAdd_WL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"m","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setPrice_WL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"status_WL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052610d0560095560405180608001604052806059815260200162004aff60599139600a90805190602001906200003b92919062000793565b506000600b60006101000a81548160ff02191690831515021790555067015181ff25a98000600c5567012dfb0cb5e88000600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff021916908315150217905550600a600f55601e601055600a6011557f69a961d0acd6efadcb5d05033eca8d6ef9523f395bfe03b751cd78af1dab553960001b601255348015620000e857600080fd5b506040518060400160405280601381526020017f4d657461246865726f65732047656e65736973000000000000000000000000008152506040518060400160405280601281526020017f4d657461246865726f657347656e65736973000000000000000000000000000081525081600290805190602001906200016d92919062000793565b5080600390805190602001906200018692919062000793565b5062000197620001ec60201b60201c565b6000819055505050620001bf620001b3620001f560201b60201c565b620001fd60201b60201c565b620001e673c344657a67ee162990d2800549468b488c0fd8de601f620002c360201b60201c565b62000a94565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002e5828260405180602001604052806000815250620002e960201b60201c565b5050565b620002fb83836200039a60201b60201c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146200039557600080549050600083820390505b6200034460008683806001019450866200059960201b60201c565b6200037b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110620003295781600054146200039257600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000408576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141562000444576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200045960008483856200070b60201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550620004e883620004ca60008660006200071160201b60201c565b620004db856200074160201b60201c565b176200075160201b60201c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106200050c578060008190555050506200059460008483856200077c60201b60201c565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005c76200078260201b60201c565b8786866040518563ffffffff1660e01b8152600401620005eb9493929190620008ef565b602060405180830381600087803b1580156200060657600080fd5b505af19250505080156200063a57506040513d601f19601f820116820180604052508101906200063791906200085a565b60015b620006b8573d80600081146200066d576040519150601f19603f3d011682016040523d82523d6000602084013e62000672565b606091505b50600081511415620006b0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b60008060e883901c905060e8620007308686846200078a60201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b828054620007a190620009ff565b90600052602060002090601f016020900481019282620007c5576000855562000811565b82601f10620007e057805160ff191683800117855562000811565b8280016001018555821562000811579182015b8281111562000810578251825591602001919060010190620007f3565b5b50905062000820919062000824565b5090565b5b808211156200083f57600081600090555060010162000825565b5090565b600081519050620008548162000a7a565b92915050565b60006020828403121562000873576200087262000a64565b5b6000620008838482850162000843565b91505092915050565b62000897816200095f565b82525050565b6000620008aa8262000943565b620008b681856200094e565b9350620008c8818560208601620009c9565b620008d38162000a69565b840191505092915050565b620008e981620009bf565b82525050565b60006080820190506200090660008301876200088c565b6200091560208301866200088c565b620009246040830185620008de565b81810360608301526200093881846200089d565b905095945050505050565b600081519050919050565b600082825260208201905092915050565b60006200096c826200099f565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620009e9578082015181840152602081019050620009cc565b83811115620009f9576000848401525b50505050565b6000600282049050600182168062000a1857607f821691505b6020821081141562000a2f5762000a2e62000a35565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b62000a858162000973565b811462000a9157600080fd5b50565b61405b8062000aa46000396000f3fe60806040526004361061025c5760003560e01c806371b3056c11610144578063b8315db3116100b6578063dc33e6811161007a578063dc33e68114610868578063e985e9c5146108a5578063eac989f8146108e2578063f1224b541461090d578063f2fde38b14610938578063f63f0a2b146109615761025c565b8063b8315db314610783578063b88d4fde146107ae578063c6f6f216146107d7578063c87b56dd14610800578063d32e1ca61461083d5761025c565b80639be70091116101085780639be70091146106a3578063a035b1fe146106bf578063a0712d68146106ea578063a22cb46514610706578063a475b5dd1461072f578063b7e7bb791461075a5761025c565b806371b3056c146105d05780637cb64759146105fb5780638da5cb5b1461062457806391b7f5ed1461064f57806395d89b41146106785761025c565b806323b872dd116101dd57806355f804b3116101a157806355f804b3146104d657806358c76daf146104ff5780636352211e1461052857806368eec7b31461056557806370a082311461057c578063715018a6146105b95761025c565b806323b872dd146104175780632eb4a7ab146104405780633ccfd60b1461046b57806342842e0e1461048257806345c0f533146104ab5761025c565b8063081812fc11610224578063081812fc14610332578063095ea7b31461036f57806318160ddd146103985780631eb5ef5d146103c3578063200d2ed2146103ec5761025c565b806301ffc9a71461026157806302470e4e1461029e578063037bbbb9146102b5578063050225ea146102de57806306fdde0314610307575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613165565b61098c565b6040516102959190613697565b60405180910390f35b3480156102aa57600080fd5b506102b3610a1e565b005b3480156102c157600080fd5b506102dc60048036038101906102d79190613208565b610ac6565b005b3480156102ea57600080fd5b50610305600480360381019061030091906130f8565b610b4c565b005b34801561031357600080fd5b5061031c610c34565b60405161032991906136cd565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613208565b610cc6565b6040516103669190613630565b60405180910390f35b34801561037b57600080fd5b50610396600480360381019061039191906130f8565b610d42565b005b3480156103a457600080fd5b506103ad610e83565b6040516103ba919061384f565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e591906131bf565b610e9a565b005b3480156103f857600080fd5b50610401610f4b565b60405161040e9190613697565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190612fe2565b610f5e565b005b34801561044c57600080fd5b50610455611283565b60405161046291906136b2565b60405180910390f35b34801561047757600080fd5b50610480611289565b005b34801561048e57600080fd5b506104a960048036038101906104a49190612fe2565b6113b4565b005b3480156104b757600080fd5b506104c06113d4565b6040516104cd919061384f565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906131bf565b6113da565b005b34801561050b57600080fd5b5061052660048036038101906105219190613208565b611470565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613208565b6114f6565b60405161055c9190613630565b60405180910390f35b34801561057157600080fd5b5061057a611508565b005b34801561058857600080fd5b506105a3600480360381019061059e9190612f75565b6115b0565b6040516105b0919061384f565b60405180910390f35b3480156105c557600080fd5b506105ce611669565b005b3480156105dc57600080fd5b506105e56116f1565b6040516105f2919061384f565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190613138565b6116f7565b005b34801561063057600080fd5b5061063961177d565b6040516106469190613630565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613208565b6117a7565b005b34801561068457600080fd5b5061068d61182d565b60405161069a91906136cd565b60405180910390f35b6106bd60048036038101906106b89190613235565b6118bf565b005b3480156106cb57600080fd5b506106d4611b47565b6040516106e1919061384f565b60405180910390f35b61070460048036038101906106ff9190613208565b611b4d565b005b34801561071257600080fd5b5061072d600480360381019061072891906130b8565b611d1a565b005b34801561073b57600080fd5b50610744611e92565b6040516107519190613697565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190613208565b611ea5565b005b34801561078f57600080fd5b50610798611f2b565b6040516107a5919061384f565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190613035565b611f31565b005b3480156107e357600080fd5b506107fe60048036038101906107f99190613208565b611fa4565b005b34801561080c57600080fd5b5061082760048036038101906108229190613208565b61202a565b60405161083491906136cd565b60405180910390f35b34801561084957600080fd5b5061085261214e565b60405161085f919061384f565b60405180910390f35b34801561087457600080fd5b5061088f600480360381019061088a9190612f75565b612154565b60405161089c919061384f565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190612fa2565b612166565b6040516108d99190613697565b60405180910390f35b3480156108ee57600080fd5b506108f76121fa565b60405161090491906136cd565b60405180910390f35b34801561091957600080fd5b50610922612288565b60405161092f919061384f565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190612f75565b61228e565b005b34801561096d57600080fd5b50610976612386565b6040516109839190613697565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a175750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610a26612399565b73ffffffffffffffffffffffffffffffffffffffff16610a4461177d565b73ffffffffffffffffffffffffffffffffffffffff1614610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a91906137ef565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b610ace612399565b73ffffffffffffffffffffffffffffffffffffffff16610aec61177d565b73ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906137ef565b60405180910390fd5b80600d8190555050565b610b54612399565b73ffffffffffffffffffffffffffffffffffffffff16610b7261177d565b73ffffffffffffffffffffffffffffffffffffffff1614610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf906137ef565b60405180910390fd5b600954610be582610bd7610e83565b6123a190919063ffffffff16565b1115610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d9061370f565b60405180910390fd5b610c3082826123b7565b5050565b606060028054610c4390613b29565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f90613b29565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050905090565b6000610cd1826123d5565b610d07576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d4d826114f6565b90508073ffffffffffffffffffffffffffffffffffffffff16610d6e612434565b73ffffffffffffffffffffffffffffffffffffffff1614610dd157610d9a81610d95612434565b612166565b610dd0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e8d61243c565b6001546000540303905090565b610ea2612399565b73ffffffffffffffffffffffffffffffffffffffff16610ec061177d565b73ffffffffffffffffffffffffffffffffffffffff1614610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d906137ef565b60405180910390fd5b6001600b60006101000a81548160ff02191690831515021790555080600a9080519060200190610f47929190612d1e565b5050565b600e60009054906101000a900460ff1681565b6000610f6982612445565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610fdc84612522565b91509150610ff28187610fed612434565b612544565b61103e5761100786611002612434565b612166565b61103d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156110a5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110b28686866001612588565b80156110bd57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061118b8561116788888761258e565b7c0200000000000000000000000000000000000000000000000000000000176125b6565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611213576000600185019050600060046000838152602001908152602001600020541415611211576000548114611210578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461127b86868660016125e1565b505050505050565b60125481565b611291612399565b73ffffffffffffffffffffffffffffffffffffffff166112af61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc906137ef565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161132b9061361b565b60006040518083038185875af1925050503d8060008114611368576040519150601f19603f3d011682016040523d82523d6000602084013e61136d565b606091505b50509050806113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a8906137cf565b60405180910390fd5b50565b6113cf83838360405180602001604052806000815250611f31565b505050565b60095481565b6113e2612399565b73ffffffffffffffffffffffffffffffffffffffff1661140061177d565b73ffffffffffffffffffffffffffffffffffffffff1614611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144d906137ef565b60405180910390fd5b80600a908051906020019061146c929190612d1e565b5050565b611478612399565b73ffffffffffffffffffffffffffffffffffffffff1661149661177d565b73ffffffffffffffffffffffffffffffffffffffff16146114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e3906137ef565b60405180910390fd5b8060108190555050565b600061150182612445565b9050919050565b611510612399565b73ffffffffffffffffffffffffffffffffffffffff1661152e61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b906137ef565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611618576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611671612399565b73ffffffffffffffffffffffffffffffffffffffff1661168f61177d565b73ffffffffffffffffffffffffffffffffffffffff16146116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc906137ef565b60405180910390fd5b6116ef60006125e7565b565b60105481565b6116ff612399565b73ffffffffffffffffffffffffffffffffffffffff1661171d61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a906137ef565b60405180910390fd5b8060128190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117af612399565b73ffffffffffffffffffffffffffffffffffffffff166117cd61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a906137ef565b60405180910390fd5b80600c8190555050565b60606003805461183c90613b29565b80601f016020809104026020016040519081016040528092919081815260200182805461186890613b29565b80156118b55780601f1061188a576101008083540402835291602001916118b5565b820191906000526020600020905b81548152906001019060200180831161189857829003601f168201915b5050505050905090565b6000336040516020016118d291906135d1565b604051602081830303815290604052805190602001209050611938838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601254836126ad565b611977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196e906137af565b60405180910390fd5b600e60019054906101000a900460ff166119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd9061376f565b60405180910390fd5b600f5484111580156119d85750600084115b611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e9061372f565b60405180910390fd5b601154611a3585611a2733612154565b6123a190919063ffffffff16565b11158015611a435750600084115b611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a799061372f565b60405180910390fd5b611a97600d54856126c490919063ffffffff16565b341015611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad09061374f565b60405180910390fd5b600954611af685611ae8610e83565b6123a190919063ffffffff16565b1115611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e9061378f565b60405180910390fd5b611b4133856123b7565b50505050565b600c5481565b600e60009054906101000a900460ff16611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b939061382f565b60405180910390fd5b600f548111158015611bae5750600081115b611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be49061372f565b60405180910390fd5b601054611c0b82611bfd33612154565b6123a190919063ffffffff16565b11158015611c195750600081115b611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f9061372f565b60405180910390fd5b611c6d600c54826126c490919063ffffffff16565b341015611caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca69061374f565b60405180910390fd5b600954611ccc82611cbe610e83565b6123a190919063ffffffff16565b1115611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d049061378f565b60405180910390fd5b611d1733826123b7565b50565b611d22612434565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d87576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d94612434565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e41612434565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e869190613697565b60405180910390a35050565b600b60009054906101000a900460ff1681565b611ead612399565b73ffffffffffffffffffffffffffffffffffffffff16611ecb61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f18906137ef565b60405180910390fd5b8060118190555050565b60115481565b611f3c848484610f5e565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f9e57611f67848484846126da565b611f9d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611fac612399565b73ffffffffffffffffffffffffffffffffffffffff16611fca61177d565b73ffffffffffffffffffffffffffffffffffffffff1614612020576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612017906137ef565b60405180910390fd5b80600f8190555050565b6060612035826123d5565b612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b9061380f565b60405180910390fd5b600b60009054906101000a900460ff16156120bb57600a6120948361283a565b6040516020016120a59291906135ec565b6040516020818303038152906040529050612149565b600a80546120c890613b29565b80601f01602080910402602001604051908101604052809291908181526020018280546120f490613b29565b80156121415780601f1061211657610100808354040283529160200191612141565b820191906000526020600020905b81548152906001019060200180831161212457829003601f168201915b505050505090505b919050565b600f5481565b600061215f8261299b565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a805461220790613b29565b80601f016020809104026020016040519081016040528092919081815260200182805461223390613b29565b80156122805780601f1061225557610100808354040283529160200191612280565b820191906000526020600020905b81548152906001019060200180831161226357829003601f168201915b505050505081565b600d5481565b612296612399565b73ffffffffffffffffffffffffffffffffffffffff166122b461177d565b73ffffffffffffffffffffffffffffffffffffffff161461230a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612301906137ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561237a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612371906136ef565b60405180910390fd5b612383816125e7565b50565b600e60019054906101000a900460ff1681565b600033905090565b600081836123af9190613954565b905092915050565b6123d18282604051806020016040528060008152506129f2565b5050565b6000816123e061243c565b111580156123ef575060005482105b801561242d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061245461243c565b116124eb576000548110156124ea5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156124e8575b60008114156124de576124c1600183612a8f90919063ffffffff16565b9150600460008381526020019081526020016000205490506124a4565b809250505061251d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86125a5868684612aa5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826126ba8584612aae565b1490509392505050565b600081836126d291906139db565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612700612434565b8786866040518563ffffffff1660e01b8152600401612722949392919061364b565b602060405180830381600087803b15801561273c57600080fd5b505af192505050801561276d57506040513d601f19601f8201168201806040525081019061276a9190613192565b60015b6127e7573d806000811461279d576040519150601f19603f3d011682016040523d82523d6000602084013e6127a2565b606091505b506000815114156127df576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612882576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612996565b600082905060005b600082146128b457808061289d90613b8c565b915050600a826128ad91906139aa565b915061288a565b60008167ffffffffffffffff8111156128d0576128cf613ce6565b5b6040519080825280601f01601f1916602001820160405280156129025781602001600182028036833780820191505090505b5090505b6000851461298f5760018261291b9190613a35565b9150600a8561292a9190613bf9565b60306129369190613954565b60f81b81838151811061294c5761294b613cb7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561298891906139aa565b9450612906565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6129fc8383612b23565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a8a57600080549050600083820390505b612a3c60008683806001019450866126da565b612a72576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a29578160005414612a8757600080fd5b50505b505050565b60008183612a9d9190613a35565b905092915050565b60009392505050565b60008082905060005b8451811015612b18576000858281518110612ad557612ad4613cb7565b5b60200260200101519050808311612af757612af08382612cf7565b9250612b04565b612b018184612cf7565b92505b508080612b1090613b8c565b915050612ab7565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b90576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612bcb576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bd86000848385612588565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c4f83612c40600086600061258e565b612c4985612d0e565b176125b6565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612c7357806000819055505050612cf260008483856125e1565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b828054612d2a90613b29565b90600052602060002090601f016020900481019282612d4c5760008555612d93565b82601f10612d6557805160ff1916838001178555612d93565b82800160010185558215612d93579182015b82811115612d92578251825591602001919060010190612d77565b5b509050612da09190612da4565b5090565b5b80821115612dbd576000816000905550600101612da5565b5090565b6000612dd4612dcf8461388f565b61386a565b905082815260208101848484011115612df057612def613d24565b5b612dfb848285613ae7565b509392505050565b6000612e16612e11846138c0565b61386a565b905082815260208101848484011115612e3257612e31613d24565b5b612e3d848285613ae7565b509392505050565b600081359050612e5481613fb2565b92915050565b60008083601f840112612e7057612e6f613d1a565b5b8235905067ffffffffffffffff811115612e8d57612e8c613d15565b5b602083019150836020820283011115612ea957612ea8613d1f565b5b9250929050565b600081359050612ebf81613fc9565b92915050565b600081359050612ed481613fe0565b92915050565b600081359050612ee981613ff7565b92915050565b600081519050612efe81613ff7565b92915050565b600082601f830112612f1957612f18613d1a565b5b8135612f29848260208601612dc1565b91505092915050565b600082601f830112612f4757612f46613d1a565b5b8135612f57848260208601612e03565b91505092915050565b600081359050612f6f8161400e565b92915050565b600060208284031215612f8b57612f8a613d2e565b5b6000612f9984828501612e45565b91505092915050565b60008060408385031215612fb957612fb8613d2e565b5b6000612fc785828601612e45565b9250506020612fd885828601612e45565b9150509250929050565b600080600060608486031215612ffb57612ffa613d2e565b5b600061300986828701612e45565b935050602061301a86828701612e45565b925050604061302b86828701612f60565b9150509250925092565b6000806000806080858703121561304f5761304e613d2e565b5b600061305d87828801612e45565b945050602061306e87828801612e45565b935050604061307f87828801612f60565b925050606085013567ffffffffffffffff8111156130a05761309f613d29565b5b6130ac87828801612f04565b91505092959194509250565b600080604083850312156130cf576130ce613d2e565b5b60006130dd85828601612e45565b92505060206130ee85828601612eb0565b9150509250929050565b6000806040838503121561310f5761310e613d2e565b5b600061311d85828601612e45565b925050602061312e85828601612f60565b9150509250929050565b60006020828403121561314e5761314d613d2e565b5b600061315c84828501612ec5565b91505092915050565b60006020828403121561317b5761317a613d2e565b5b600061318984828501612eda565b91505092915050565b6000602082840312156131a8576131a7613d2e565b5b60006131b684828501612eef565b91505092915050565b6000602082840312156131d5576131d4613d2e565b5b600082013567ffffffffffffffff8111156131f3576131f2613d29565b5b6131ff84828501612f32565b91505092915050565b60006020828403121561321e5761321d613d2e565b5b600061322c84828501612f60565b91505092915050565b60008060006040848603121561324e5761324d613d2e565b5b600061325c86828701612f60565b935050602084013567ffffffffffffffff81111561327d5761327c613d29565b5b61328986828701612e5a565b92509250509250925092565b61329e81613a69565b82525050565b6132b56132b082613a69565b613bd5565b82525050565b6132c481613a7b565b82525050565b6132d381613a87565b82525050565b60006132e482613906565b6132ee818561391c565b93506132fe818560208601613af6565b61330781613d33565b840191505092915050565b600061331d82613911565b6133278185613938565b9350613337818560208601613af6565b61334081613d33565b840191505092915050565b600061335682613911565b6133608185613949565b9350613370818560208601613af6565b80840191505092915050565b6000815461338981613b29565b6133938186613949565b945060018216600081146133ae57600181146133bf576133f2565b60ff198316865281860193506133f2565b6133c8856138f1565b60005b838110156133ea578154818901526001820191506020810190506133cb565b838801955050505b50505092915050565b6000613408602683613938565b915061341382613d51565b604082019050919050565b600061342b602183613938565b915061343682613da0565b604082019050919050565b600061344e601783613938565b915061345982613def565b602082019050919050565b6000613471602083613938565b915061347c82613e18565b602082019050919050565b6000613494601e83613938565b915061349f82613e41565b602082019050919050565b60006134b7601e83613938565b91506134c282613e6a565b602082019050919050565b60006134da600f83613938565b91506134e582613e93565b602082019050919050565b60006134fd601a83613938565b915061350882613ebc565b602082019050919050565b6000613520600583613949565b915061352b82613ee5565b600582019050919050565b6000613543602083613938565b915061354e82613f0e565b602082019050919050565b6000613566602f83613938565b915061357182613f37565b604082019050919050565b6000613589601b83613938565b915061359482613f86565b602082019050919050565b60006135ac60008361392d565b91506135b782613faf565b600082019050919050565b6135cb81613add565b82525050565b60006135dd82846132a4565b60148201915081905092915050565b60006135f8828561337c565b9150613604828461334b565b915061360f82613513565b91508190509392505050565b60006136268261359f565b9150819050919050565b60006020820190506136456000830184613295565b92915050565b60006080820190506136606000830187613295565b61366d6020830186613295565b61367a60408301856135c2565b818103606083015261368c81846132d9565b905095945050505050565b60006020820190506136ac60008301846132bb565b92915050565b60006020820190506136c760008301846132ca565b92915050565b600060208201905081810360008301526136e78184613312565b905092915050565b60006020820190508181036000830152613708816133fb565b9050919050565b600060208201905081810360008301526137288161341e565b9050919050565b6000602082019050818103600083015261374881613441565b9050919050565b6000602082019050818103600083015261376881613464565b9050919050565b6000602082019050818103600083015261378881613487565b9050919050565b600060208201905081810360008301526137a8816134aa565b9050919050565b600060208201905081810360008301526137c8816134cd565b9050919050565b600060208201905081810360008301526137e8816134f0565b9050919050565b6000602082019050818103600083015261380881613536565b9050919050565b6000602082019050818103600083015261382881613559565b9050919050565b600060208201905081810360008301526138488161357c565b9050919050565b600060208201905061386460008301846135c2565b92915050565b6000613874613885565b90506138808282613b5b565b919050565b6000604051905090565b600067ffffffffffffffff8211156138aa576138a9613ce6565b5b6138b382613d33565b9050602081019050919050565b600067ffffffffffffffff8211156138db576138da613ce6565b5b6138e482613d33565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061395f82613add565b915061396a83613add565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561399f5761399e613c2a565b5b828201905092915050565b60006139b582613add565b91506139c083613add565b9250826139d0576139cf613c59565b5b828204905092915050565b60006139e682613add565b91506139f183613add565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2a57613a29613c2a565b5b828202905092915050565b6000613a4082613add565b9150613a4b83613add565b925082821015613a5e57613a5d613c2a565b5b828203905092915050565b6000613a7482613abd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b14578082015181840152602081019050613af9565b83811115613b23576000848401525b50505050565b60006002820490506001821680613b4157607f821691505b60208210811415613b5557613b54613c88565b5b50919050565b613b6482613d33565b810181811067ffffffffffffffff82111715613b8357613b82613ce6565b5b80604052505050565b6000613b9782613add565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bca57613bc9613c2a565b5b600182019050919050565b6000613be082613be7565b9050919050565b6000613bf282613d44565b9050919050565b6000613c0482613add565b9150613c0f83613add565b925082613c1f57613c1e613c59565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f476976656177617920657863656564732063757272656e74206261746368212160008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e74207175616e746974792121000000000000000000600082015250565b7f496e73756666696369656e74206574682073656e7420666f72206d696e742121600082015250565b7f57686974656c697374204d696e74696e67206e6f742061637469766521210000600082015250565b7f4d696e74206578636565647320436f6c6c656374696f6e2073697a6521210000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f52657761726420646973747269627574696f6e206661696c6564000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5075626c6963204d696e74696e67206e6f742061637469766521210000000000600082015250565b50565b613fbb81613a69565b8114613fc657600080fd5b50565b613fd281613a7b565b8114613fdd57600080fd5b50565b613fe981613a87565b8114613ff457600080fd5b50565b61400081613a91565b811461400b57600080fd5b50565b61401781613add565b811461402257600080fd5b5056fea2646970667358221220f42efafa83de5fe45f4c0e6f68bdc85e842189e472989486581c7bf60b37087564736f6c6343000807003368747470733a2f2f6261666b726569687a6a636a69346a66656c627864326577326e6964783636366d687832656e346b686d78647373353436373468756c646b7973712e697066732e6e667473746f726167652e6c696e6b2f
Deployed Bytecode
0x60806040526004361061025c5760003560e01c806371b3056c11610144578063b8315db3116100b6578063dc33e6811161007a578063dc33e68114610868578063e985e9c5146108a5578063eac989f8146108e2578063f1224b541461090d578063f2fde38b14610938578063f63f0a2b146109615761025c565b8063b8315db314610783578063b88d4fde146107ae578063c6f6f216146107d7578063c87b56dd14610800578063d32e1ca61461083d5761025c565b80639be70091116101085780639be70091146106a3578063a035b1fe146106bf578063a0712d68146106ea578063a22cb46514610706578063a475b5dd1461072f578063b7e7bb791461075a5761025c565b806371b3056c146105d05780637cb64759146105fb5780638da5cb5b1461062457806391b7f5ed1461064f57806395d89b41146106785761025c565b806323b872dd116101dd57806355f804b3116101a157806355f804b3146104d657806358c76daf146104ff5780636352211e1461052857806368eec7b31461056557806370a082311461057c578063715018a6146105b95761025c565b806323b872dd146104175780632eb4a7ab146104405780633ccfd60b1461046b57806342842e0e1461048257806345c0f533146104ab5761025c565b8063081812fc11610224578063081812fc14610332578063095ea7b31461036f57806318160ddd146103985780631eb5ef5d146103c3578063200d2ed2146103ec5761025c565b806301ffc9a71461026157806302470e4e1461029e578063037bbbb9146102b5578063050225ea146102de57806306fdde0314610307575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613165565b61098c565b6040516102959190613697565b60405180910390f35b3480156102aa57600080fd5b506102b3610a1e565b005b3480156102c157600080fd5b506102dc60048036038101906102d79190613208565b610ac6565b005b3480156102ea57600080fd5b50610305600480360381019061030091906130f8565b610b4c565b005b34801561031357600080fd5b5061031c610c34565b60405161032991906136cd565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613208565b610cc6565b6040516103669190613630565b60405180910390f35b34801561037b57600080fd5b50610396600480360381019061039191906130f8565b610d42565b005b3480156103a457600080fd5b506103ad610e83565b6040516103ba919061384f565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e591906131bf565b610e9a565b005b3480156103f857600080fd5b50610401610f4b565b60405161040e9190613697565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190612fe2565b610f5e565b005b34801561044c57600080fd5b50610455611283565b60405161046291906136b2565b60405180910390f35b34801561047757600080fd5b50610480611289565b005b34801561048e57600080fd5b506104a960048036038101906104a49190612fe2565b6113b4565b005b3480156104b757600080fd5b506104c06113d4565b6040516104cd919061384f565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906131bf565b6113da565b005b34801561050b57600080fd5b5061052660048036038101906105219190613208565b611470565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613208565b6114f6565b60405161055c9190613630565b60405180910390f35b34801561057157600080fd5b5061057a611508565b005b34801561058857600080fd5b506105a3600480360381019061059e9190612f75565b6115b0565b6040516105b0919061384f565b60405180910390f35b3480156105c557600080fd5b506105ce611669565b005b3480156105dc57600080fd5b506105e56116f1565b6040516105f2919061384f565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190613138565b6116f7565b005b34801561063057600080fd5b5061063961177d565b6040516106469190613630565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613208565b6117a7565b005b34801561068457600080fd5b5061068d61182d565b60405161069a91906136cd565b60405180910390f35b6106bd60048036038101906106b89190613235565b6118bf565b005b3480156106cb57600080fd5b506106d4611b47565b6040516106e1919061384f565b60405180910390f35b61070460048036038101906106ff9190613208565b611b4d565b005b34801561071257600080fd5b5061072d600480360381019061072891906130b8565b611d1a565b005b34801561073b57600080fd5b50610744611e92565b6040516107519190613697565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190613208565b611ea5565b005b34801561078f57600080fd5b50610798611f2b565b6040516107a5919061384f565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190613035565b611f31565b005b3480156107e357600080fd5b506107fe60048036038101906107f99190613208565b611fa4565b005b34801561080c57600080fd5b5061082760048036038101906108229190613208565b61202a565b60405161083491906136cd565b60405180910390f35b34801561084957600080fd5b5061085261214e565b60405161085f919061384f565b60405180910390f35b34801561087457600080fd5b5061088f600480360381019061088a9190612f75565b612154565b60405161089c919061384f565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190612fa2565b612166565b6040516108d99190613697565b60405180910390f35b3480156108ee57600080fd5b506108f76121fa565b60405161090491906136cd565b60405180910390f35b34801561091957600080fd5b50610922612288565b60405161092f919061384f565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190612f75565b61228e565b005b34801561096d57600080fd5b50610976612386565b6040516109839190613697565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a175750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610a26612399565b73ffffffffffffffffffffffffffffffffffffffff16610a4461177d565b73ffffffffffffffffffffffffffffffffffffffff1614610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a91906137ef565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b610ace612399565b73ffffffffffffffffffffffffffffffffffffffff16610aec61177d565b73ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906137ef565b60405180910390fd5b80600d8190555050565b610b54612399565b73ffffffffffffffffffffffffffffffffffffffff16610b7261177d565b73ffffffffffffffffffffffffffffffffffffffff1614610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf906137ef565b60405180910390fd5b600954610be582610bd7610e83565b6123a190919063ffffffff16565b1115610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d9061370f565b60405180910390fd5b610c3082826123b7565b5050565b606060028054610c4390613b29565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f90613b29565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b5050505050905090565b6000610cd1826123d5565b610d07576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d4d826114f6565b90508073ffffffffffffffffffffffffffffffffffffffff16610d6e612434565b73ffffffffffffffffffffffffffffffffffffffff1614610dd157610d9a81610d95612434565b612166565b610dd0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e8d61243c565b6001546000540303905090565b610ea2612399565b73ffffffffffffffffffffffffffffffffffffffff16610ec061177d565b73ffffffffffffffffffffffffffffffffffffffff1614610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d906137ef565b60405180910390fd5b6001600b60006101000a81548160ff02191690831515021790555080600a9080519060200190610f47929190612d1e565b5050565b600e60009054906101000a900460ff1681565b6000610f6982612445565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610fdc84612522565b91509150610ff28187610fed612434565b612544565b61103e5761100786611002612434565b612166565b61103d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156110a5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110b28686866001612588565b80156110bd57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061118b8561116788888761258e565b7c0200000000000000000000000000000000000000000000000000000000176125b6565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611213576000600185019050600060046000838152602001908152602001600020541415611211576000548114611210578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461127b86868660016125e1565b505050505050565b60125481565b611291612399565b73ffffffffffffffffffffffffffffffffffffffff166112af61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc906137ef565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161132b9061361b565b60006040518083038185875af1925050503d8060008114611368576040519150601f19603f3d011682016040523d82523d6000602084013e61136d565b606091505b50509050806113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a8906137cf565b60405180910390fd5b50565b6113cf83838360405180602001604052806000815250611f31565b505050565b60095481565b6113e2612399565b73ffffffffffffffffffffffffffffffffffffffff1661140061177d565b73ffffffffffffffffffffffffffffffffffffffff1614611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144d906137ef565b60405180910390fd5b80600a908051906020019061146c929190612d1e565b5050565b611478612399565b73ffffffffffffffffffffffffffffffffffffffff1661149661177d565b73ffffffffffffffffffffffffffffffffffffffff16146114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e3906137ef565b60405180910390fd5b8060108190555050565b600061150182612445565b9050919050565b611510612399565b73ffffffffffffffffffffffffffffffffffffffff1661152e61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b906137ef565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611618576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611671612399565b73ffffffffffffffffffffffffffffffffffffffff1661168f61177d565b73ffffffffffffffffffffffffffffffffffffffff16146116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc906137ef565b60405180910390fd5b6116ef60006125e7565b565b60105481565b6116ff612399565b73ffffffffffffffffffffffffffffffffffffffff1661171d61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a906137ef565b60405180910390fd5b8060128190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117af612399565b73ffffffffffffffffffffffffffffffffffffffff166117cd61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a906137ef565b60405180910390fd5b80600c8190555050565b60606003805461183c90613b29565b80601f016020809104026020016040519081016040528092919081815260200182805461186890613b29565b80156118b55780601f1061188a576101008083540402835291602001916118b5565b820191906000526020600020905b81548152906001019060200180831161189857829003601f168201915b5050505050905090565b6000336040516020016118d291906135d1565b604051602081830303815290604052805190602001209050611938838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601254836126ad565b611977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196e906137af565b60405180910390fd5b600e60019054906101000a900460ff166119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd9061376f565b60405180910390fd5b600f5484111580156119d85750600084115b611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e9061372f565b60405180910390fd5b601154611a3585611a2733612154565b6123a190919063ffffffff16565b11158015611a435750600084115b611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a799061372f565b60405180910390fd5b611a97600d54856126c490919063ffffffff16565b341015611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad09061374f565b60405180910390fd5b600954611af685611ae8610e83565b6123a190919063ffffffff16565b1115611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e9061378f565b60405180910390fd5b611b4133856123b7565b50505050565b600c5481565b600e60009054906101000a900460ff16611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b939061382f565b60405180910390fd5b600f548111158015611bae5750600081115b611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be49061372f565b60405180910390fd5b601054611c0b82611bfd33612154565b6123a190919063ffffffff16565b11158015611c195750600081115b611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f9061372f565b60405180910390fd5b611c6d600c54826126c490919063ffffffff16565b341015611caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca69061374f565b60405180910390fd5b600954611ccc82611cbe610e83565b6123a190919063ffffffff16565b1115611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d049061378f565b60405180910390fd5b611d1733826123b7565b50565b611d22612434565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d87576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d94612434565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e41612434565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e869190613697565b60405180910390a35050565b600b60009054906101000a900460ff1681565b611ead612399565b73ffffffffffffffffffffffffffffffffffffffff16611ecb61177d565b73ffffffffffffffffffffffffffffffffffffffff1614611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f18906137ef565b60405180910390fd5b8060118190555050565b60115481565b611f3c848484610f5e565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f9e57611f67848484846126da565b611f9d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611fac612399565b73ffffffffffffffffffffffffffffffffffffffff16611fca61177d565b73ffffffffffffffffffffffffffffffffffffffff1614612020576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612017906137ef565b60405180910390fd5b80600f8190555050565b6060612035826123d5565b612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b9061380f565b60405180910390fd5b600b60009054906101000a900460ff16156120bb57600a6120948361283a565b6040516020016120a59291906135ec565b6040516020818303038152906040529050612149565b600a80546120c890613b29565b80601f01602080910402602001604051908101604052809291908181526020018280546120f490613b29565b80156121415780601f1061211657610100808354040283529160200191612141565b820191906000526020600020905b81548152906001019060200180831161212457829003601f168201915b505050505090505b919050565b600f5481565b600061215f8261299b565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a805461220790613b29565b80601f016020809104026020016040519081016040528092919081815260200182805461223390613b29565b80156122805780601f1061225557610100808354040283529160200191612280565b820191906000526020600020905b81548152906001019060200180831161226357829003601f168201915b505050505081565b600d5481565b612296612399565b73ffffffffffffffffffffffffffffffffffffffff166122b461177d565b73ffffffffffffffffffffffffffffffffffffffff161461230a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612301906137ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561237a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612371906136ef565b60405180910390fd5b612383816125e7565b50565b600e60019054906101000a900460ff1681565b600033905090565b600081836123af9190613954565b905092915050565b6123d18282604051806020016040528060008152506129f2565b5050565b6000816123e061243c565b111580156123ef575060005482105b801561242d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061245461243c565b116124eb576000548110156124ea5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156124e8575b60008114156124de576124c1600183612a8f90919063ffffffff16565b9150600460008381526020019081526020016000205490506124a4565b809250505061251d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86125a5868684612aa5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826126ba8584612aae565b1490509392505050565b600081836126d291906139db565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612700612434565b8786866040518563ffffffff1660e01b8152600401612722949392919061364b565b602060405180830381600087803b15801561273c57600080fd5b505af192505050801561276d57506040513d601f19601f8201168201806040525081019061276a9190613192565b60015b6127e7573d806000811461279d576040519150601f19603f3d011682016040523d82523d6000602084013e6127a2565b606091505b506000815114156127df576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612882576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612996565b600082905060005b600082146128b457808061289d90613b8c565b915050600a826128ad91906139aa565b915061288a565b60008167ffffffffffffffff8111156128d0576128cf613ce6565b5b6040519080825280601f01601f1916602001820160405280156129025781602001600182028036833780820191505090505b5090505b6000851461298f5760018261291b9190613a35565b9150600a8561292a9190613bf9565b60306129369190613954565b60f81b81838151811061294c5761294b613cb7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561298891906139aa565b9450612906565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6129fc8383612b23565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a8a57600080549050600083820390505b612a3c60008683806001019450866126da565b612a72576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a29578160005414612a8757600080fd5b50505b505050565b60008183612a9d9190613a35565b905092915050565b60009392505050565b60008082905060005b8451811015612b18576000858281518110612ad557612ad4613cb7565b5b60200260200101519050808311612af757612af08382612cf7565b9250612b04565b612b018184612cf7565b92505b508080612b1090613b8c565b915050612ab7565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b90576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612bcb576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bd86000848385612588565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c4f83612c40600086600061258e565b612c4985612d0e565b176125b6565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612c7357806000819055505050612cf260008483856125e1565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b828054612d2a90613b29565b90600052602060002090601f016020900481019282612d4c5760008555612d93565b82601f10612d6557805160ff1916838001178555612d93565b82800160010185558215612d93579182015b82811115612d92578251825591602001919060010190612d77565b5b509050612da09190612da4565b5090565b5b80821115612dbd576000816000905550600101612da5565b5090565b6000612dd4612dcf8461388f565b61386a565b905082815260208101848484011115612df057612def613d24565b5b612dfb848285613ae7565b509392505050565b6000612e16612e11846138c0565b61386a565b905082815260208101848484011115612e3257612e31613d24565b5b612e3d848285613ae7565b509392505050565b600081359050612e5481613fb2565b92915050565b60008083601f840112612e7057612e6f613d1a565b5b8235905067ffffffffffffffff811115612e8d57612e8c613d15565b5b602083019150836020820283011115612ea957612ea8613d1f565b5b9250929050565b600081359050612ebf81613fc9565b92915050565b600081359050612ed481613fe0565b92915050565b600081359050612ee981613ff7565b92915050565b600081519050612efe81613ff7565b92915050565b600082601f830112612f1957612f18613d1a565b5b8135612f29848260208601612dc1565b91505092915050565b600082601f830112612f4757612f46613d1a565b5b8135612f57848260208601612e03565b91505092915050565b600081359050612f6f8161400e565b92915050565b600060208284031215612f8b57612f8a613d2e565b5b6000612f9984828501612e45565b91505092915050565b60008060408385031215612fb957612fb8613d2e565b5b6000612fc785828601612e45565b9250506020612fd885828601612e45565b9150509250929050565b600080600060608486031215612ffb57612ffa613d2e565b5b600061300986828701612e45565b935050602061301a86828701612e45565b925050604061302b86828701612f60565b9150509250925092565b6000806000806080858703121561304f5761304e613d2e565b5b600061305d87828801612e45565b945050602061306e87828801612e45565b935050604061307f87828801612f60565b925050606085013567ffffffffffffffff8111156130a05761309f613d29565b5b6130ac87828801612f04565b91505092959194509250565b600080604083850312156130cf576130ce613d2e565b5b60006130dd85828601612e45565b92505060206130ee85828601612eb0565b9150509250929050565b6000806040838503121561310f5761310e613d2e565b5b600061311d85828601612e45565b925050602061312e85828601612f60565b9150509250929050565b60006020828403121561314e5761314d613d2e565b5b600061315c84828501612ec5565b91505092915050565b60006020828403121561317b5761317a613d2e565b5b600061318984828501612eda565b91505092915050565b6000602082840312156131a8576131a7613d2e565b5b60006131b684828501612eef565b91505092915050565b6000602082840312156131d5576131d4613d2e565b5b600082013567ffffffffffffffff8111156131f3576131f2613d29565b5b6131ff84828501612f32565b91505092915050565b60006020828403121561321e5761321d613d2e565b5b600061322c84828501612f60565b91505092915050565b60008060006040848603121561324e5761324d613d2e565b5b600061325c86828701612f60565b935050602084013567ffffffffffffffff81111561327d5761327c613d29565b5b61328986828701612e5a565b92509250509250925092565b61329e81613a69565b82525050565b6132b56132b082613a69565b613bd5565b82525050565b6132c481613a7b565b82525050565b6132d381613a87565b82525050565b60006132e482613906565b6132ee818561391c565b93506132fe818560208601613af6565b61330781613d33565b840191505092915050565b600061331d82613911565b6133278185613938565b9350613337818560208601613af6565b61334081613d33565b840191505092915050565b600061335682613911565b6133608185613949565b9350613370818560208601613af6565b80840191505092915050565b6000815461338981613b29565b6133938186613949565b945060018216600081146133ae57600181146133bf576133f2565b60ff198316865281860193506133f2565b6133c8856138f1565b60005b838110156133ea578154818901526001820191506020810190506133cb565b838801955050505b50505092915050565b6000613408602683613938565b915061341382613d51565b604082019050919050565b600061342b602183613938565b915061343682613da0565b604082019050919050565b600061344e601783613938565b915061345982613def565b602082019050919050565b6000613471602083613938565b915061347c82613e18565b602082019050919050565b6000613494601e83613938565b915061349f82613e41565b602082019050919050565b60006134b7601e83613938565b91506134c282613e6a565b602082019050919050565b60006134da600f83613938565b91506134e582613e93565b602082019050919050565b60006134fd601a83613938565b915061350882613ebc565b602082019050919050565b6000613520600583613949565b915061352b82613ee5565b600582019050919050565b6000613543602083613938565b915061354e82613f0e565b602082019050919050565b6000613566602f83613938565b915061357182613f37565b604082019050919050565b6000613589601b83613938565b915061359482613f86565b602082019050919050565b60006135ac60008361392d565b91506135b782613faf565b600082019050919050565b6135cb81613add565b82525050565b60006135dd82846132a4565b60148201915081905092915050565b60006135f8828561337c565b9150613604828461334b565b915061360f82613513565b91508190509392505050565b60006136268261359f565b9150819050919050565b60006020820190506136456000830184613295565b92915050565b60006080820190506136606000830187613295565b61366d6020830186613295565b61367a60408301856135c2565b818103606083015261368c81846132d9565b905095945050505050565b60006020820190506136ac60008301846132bb565b92915050565b60006020820190506136c760008301846132ca565b92915050565b600060208201905081810360008301526136e78184613312565b905092915050565b60006020820190508181036000830152613708816133fb565b9050919050565b600060208201905081810360008301526137288161341e565b9050919050565b6000602082019050818103600083015261374881613441565b9050919050565b6000602082019050818103600083015261376881613464565b9050919050565b6000602082019050818103600083015261378881613487565b9050919050565b600060208201905081810360008301526137a8816134aa565b9050919050565b600060208201905081810360008301526137c8816134cd565b9050919050565b600060208201905081810360008301526137e8816134f0565b9050919050565b6000602082019050818103600083015261380881613536565b9050919050565b6000602082019050818103600083015261382881613559565b9050919050565b600060208201905081810360008301526138488161357c565b9050919050565b600060208201905061386460008301846135c2565b92915050565b6000613874613885565b90506138808282613b5b565b919050565b6000604051905090565b600067ffffffffffffffff8211156138aa576138a9613ce6565b5b6138b382613d33565b9050602081019050919050565b600067ffffffffffffffff8211156138db576138da613ce6565b5b6138e482613d33565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061395f82613add565b915061396a83613add565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561399f5761399e613c2a565b5b828201905092915050565b60006139b582613add565b91506139c083613add565b9250826139d0576139cf613c59565b5b828204905092915050565b60006139e682613add565b91506139f183613add565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2a57613a29613c2a565b5b828202905092915050565b6000613a4082613add565b9150613a4b83613add565b925082821015613a5e57613a5d613c2a565b5b828203905092915050565b6000613a7482613abd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b14578082015181840152602081019050613af9565b83811115613b23576000848401525b50505050565b60006002820490506001821680613b4157607f821691505b60208210811415613b5557613b54613c88565b5b50919050565b613b6482613d33565b810181811067ffffffffffffffff82111715613b8357613b82613ce6565b5b80604052505050565b6000613b9782613add565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bca57613bc9613c2a565b5b600182019050919050565b6000613be082613be7565b9050919050565b6000613bf282613d44565b9050919050565b6000613c0482613add565b9150613c0f83613add565b925082613c1f57613c1e613c59565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f476976656177617920657863656564732063757272656e74206261746368212160008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e74207175616e746974792121000000000000000000600082015250565b7f496e73756666696369656e74206574682073656e7420666f72206d696e742121600082015250565b7f57686974656c697374204d696e74696e67206e6f742061637469766521210000600082015250565b7f4d696e74206578636565647320436f6c6c656374696f6e2073697a6521210000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f52657761726420646973747269627574696f6e206661696c6564000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5075626c6963204d696e74696e67206e6f742061637469766521210000000000600082015250565b50565b613fbb81613a69565b8114613fc657600080fd5b50565b613fd281613a7b565b8114613fdd57600080fd5b50565b613fe981613a87565b8114613ff457600080fd5b50565b61400081613a91565b811461400b57600080fd5b50565b61401781613add565b811461402257600080fd5b5056fea2646970667358221220f42efafa83de5fe45f4c0e6f68bdc85e842189e472989486581c7bf60b37087564736f6c63430008070033
Deployed Bytecode Sourcemap
54563:4114:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24353:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57069:78;;;;;;;;;;;;;:::i;:::-;;57548:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55506:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30078:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32024:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31572:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23407:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57337:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54970:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41289:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55162:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57958:192;;;;;;;;;;;;;:::i;:::-;;32914:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54685:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57237:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57749:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29867:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57153:76;;;;;;;;;;;;;:::i;:::-;;25032:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10114:103;;;;;;;;;;;;;:::i;:::-;;55081:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55263:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9891:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57456:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30247:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55737:763;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54883:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56508:553;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32300:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54848:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57849:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55119:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33170:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57648:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58158:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55041:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58561:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32679:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54730:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54924:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10226:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55003:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24353:615;24438:4;24753:10;24738:25;;:11;:25;;;;:102;;;;24830:10;24815:25;;:11;:25;;;;24738:102;:179;;;;24907:10;24892:25;;:11;:25;;;;24738:179;24718:199;;24353:615;;;:::o;57069:78::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57130:9:::1;;;;;;;;;;;57129:10;57117:9;;:22;;;;;;;;;;;;;;;;;;57069:78::o:0;57548:92::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57626:6:::1;57615:8;:17;;;;57548:92:::0;:::o;55506:223::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55628:14:::1;;55597:27;55615:8;55597:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:45;;55589:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;55691:30;55701:9;55712:8;55691:9;:30::i;:::-;55506:223:::0;;:::o;30078:100::-;30132:13;30165:5;30158:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30078:100;:::o;32024:204::-;32092:7;32117:16;32125:7;32117;:16::i;:::-;32112:64;;32142:34;;;;;;;;;;;;;;32112:64;32196:15;:24;32212:7;32196:24;;;;;;;;;;;;;;;;;;;;;32189:31;;32024:204;;;:::o;31572:386::-;31645:13;31661:16;31669:7;31661;:16::i;:::-;31645:32;;31717:5;31694:28;;:19;:17;:19::i;:::-;:28;;;31690:175;;31742:44;31759:5;31766:19;:17;:19::i;:::-;31742:16;:44::i;:::-;31737:128;;31814:35;;;;;;;;;;;;;;31737:128;31690:175;31904:2;31877:15;:24;31893:7;31877:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31942:7;31938:2;31922:28;;31931:5;31922:28;;;;;;;;;;;;31634:324;31572:386;;:::o;23407:315::-;23460:7;23688:15;:13;:15::i;:::-;23673:12;;23657:13;;:28;:46;23650:53;;23407:315;:::o;57337:111::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57415:4:::1;57406:6;;:13;;;;;;;;;;;;;;;;;;57436:4;57430:3;:10;;;;;;;;;;;;:::i;:::-;;57337:111:::0;:::o;54970:26::-;;;;;;;;;;;;;:::o;41289:2800::-;41423:27;41453;41472:7;41453:18;:27::i;:::-;41423:57;;41538:4;41497:45;;41513:19;41497:45;;;41493:86;;41551:28;;;;;;;;;;;;;;41493:86;41593:27;41622:23;41649:28;41669:7;41649:19;:28::i;:::-;41592:85;;;;41777:62;41796:15;41813:4;41819:19;:17;:19::i;:::-;41777:18;:62::i;:::-;41772:174;;41859:43;41876:4;41882:19;:17;:19::i;:::-;41859:16;:43::i;:::-;41854:92;;41911:35;;;;;;;;;;;;;;41854:92;41772:174;41977:1;41963:16;;:2;:16;;;41959:52;;;41988:23;;;;;;;;;;;;;;41959:52;42024:43;42046:4;42052:2;42056:7;42065:1;42024:21;:43::i;:::-;42160:15;42157:160;;;42300:1;42279:19;42272:30;42157:160;42695:18;:24;42714:4;42695:24;;;;;;;;;;;;;;;;42693:26;;;;;;;;;;;;42764:18;:22;42783:2;42764:22;;;;;;;;;;;;;;;;42762:24;;;;;;;;;;;43086:145;43123:2;43171:45;43186:4;43192:2;43196:19;43171:14;:45::i;:::-;20635:8;43144:72;43086:18;:145::i;:::-;43057:17;:26;43075:7;43057:26;;;;;;;;;;;:174;;;;43401:1;20635:8;43351:19;:46;:51;43347:626;;;43423:19;43455:1;43445:7;:11;43423:33;;43612:1;43578:17;:30;43596:11;43578:30;;;;;;;;;;;;:35;43574:384;;;43716:13;;43701:11;:28;43697:242;;43896:19;43863:17;:30;43881:11;43863:30;;;;;;;;;;;:52;;;;43697:242;43574:384;43404:569;43347:626;44020:7;44016:2;44001:27;;44010:4;44001:27;;;;;;;;;;;;44039:42;44060:4;44066:2;44070:7;44079:1;44039:20;:42::i;:::-;41412:2677;;;41289:2800;;;:::o;55162:94::-;;;;:::o;57958:192::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58007:13:::1;58034:10;58026:24;;58058:21;58026:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58006:78;;;58103:8;58095:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;57995:155;57958:192::o:0;32914:185::-;33052:39;33069:4;33075:2;33079:7;33052:39;;;;;;;;;;;;:16;:39::i;:::-;32914:185;;;:::o;54685:36::-;;;;:::o;57237:92::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57314:7:::1;57308:3;:13;;;;;;;;;;;;:::i;:::-;;57237:92:::0;:::o;57749:94::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57829:6:::1;57815:11;:20;;;;57749:94:::0;:::o;29867:144::-;29931:7;29974:27;29993:7;29974:18;:27::i;:::-;29951:52;;29867:144;;;:::o;57153:76::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57215:6:::1;;;;;;;;;;;57214:7;57205:6;;:16;;;;;;;;;;;;;;;;;;57153:76::o:0;25032:224::-;25096:7;25137:1;25120:19;;:5;:19;;;25116:60;;;25148:28;;;;;;;;;;;;;;25116:60;19587:13;25194:18;:25;25213:5;25194:25;;;;;;;;;;;;;;;;:54;25187:61;;25032:224;;;:::o;10114:103::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10179:30:::1;10206:1;10179:18;:30::i;:::-;10114:103::o:0;55081:31::-;;;;:::o;55263:83::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55337:1:::1;55324:10;:14;;;;55263:83:::0;:::o;9891:87::-;9937:7;9964:6;;;;;;;;;;;9957:13;;9891:87;:::o;57456:86::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57528:6:::1;57520:5;:14;;;;57456:86:::0;:::o;30247:104::-;30303:13;30336:7;30329:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30247:104;:::o;55737:763::-;55830:12;55872:10;55855:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;55845:39;;;;;;55830:54;;55903:50;55923:11;;55903:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55936:10;;55948:4;55903:18;:50::i;:::-;55895:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56001:9;;;;;;;;;;;55993:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;56076:11;;56064:8;:23;;:39;;;;;56102:1;56091:8;:12;56064:39;56056:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56192:14;;56150:38;56179:8;56150:24;56163:10;56150:12;:24::i;:::-;:28;;:38;;;;:::i;:::-;:56;;:72;;;;;56221:1;56210:8;:12;56150:72;56142:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;56282:22;56295:8;;56282;:12;;:22;;;;:::i;:::-;56269:9;:35;;56261:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;56391:14;;56360:27;56378:8;56360:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:45;;56352:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;56461:31;56471:10;56483:8;56461:9;:31::i;:::-;55819:681;55737:763;;;:::o;54883:34::-;;;;:::o;56508:553::-;56574:6;;;;;;;;;;;56566:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;56643:11;;56631:8;:23;;:39;;;;;56669:1;56658:8;:12;56631:39;56623:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56759:11;;56717:38;56746:8;56717:24;56730:10;56717:12;:24::i;:::-;:28;;:38;;;;:::i;:::-;:53;;:69;;;;;56785:1;56774:8;:12;56717:69;56709:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;56846:19;56859:5;;56846:8;:12;;:19;;;;:::i;:::-;56833:9;:32;;56825:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56952:14;;56921:27;56939:8;56921:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:45;;56913:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;57022:31;57032:10;57044:8;57022:9;:31::i;:::-;56508:553;:::o;32300:308::-;32411:19;:17;:19::i;:::-;32399:31;;:8;:31;;;32395:61;;;32439:17;;;;;;;;;;;;;;32395:61;32521:8;32469:18;:39;32488:19;:17;:19::i;:::-;32469:39;;;;;;;;;;;;;;;:49;32509:8;32469:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32581:8;32545:55;;32560:19;:17;:19::i;:::-;32545:55;;;32591:8;32545:55;;;;;;:::i;:::-;;;;;;;;32300:308;;:::o;54848:26::-;;;;;;;;;;;;;:::o;57849:100::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57935:6:::1;57918:14;:23;;;;57849:100:::0;:::o;55119:34::-;;;;:::o;33170:399::-;33337:31;33350:4;33356:2;33360:7;33337:12;:31::i;:::-;33401:1;33383:2;:14;;;:19;33379:183;;33422:56;33453:4;33459:2;33463:7;33472:5;33422:30;:56::i;:::-;33417:145;;33506:40;;;;;;;;;;;;;;33417:145;33379:183;33170:399;;;;:::o;57648:93::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57727:6:::1;57713:11;:20;;;;57648:93:::0;:::o;58158:298::-;58223:13;58257:16;58265:7;58257;:16::i;:::-;58249:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;58339:6;;;;;;;;;;;58336:91;;;58391:3;58396:20;58397:7;58396:18;:20::i;:::-;58374:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58360:67;;;;58336:91;58445:3;58438:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58158:298;;;;:::o;55041:31::-;;;;:::o;58561:113::-;58619:7;58646:20;58660:5;58646:13;:20::i;:::-;58639:27;;58561:113;;;:::o;32679:164::-;32776:4;32800:18;:25;32819:5;32800:25;;;;;;;;;;;;;;;:35;32826:8;32800:35;;;;;;;;;;;;;;;;;;;;;;;;;32793:42;;32679:164;;;;:::o;54730:111::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54924:37::-;;;;:::o;10226:201::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10335:1:::1;10315:22;;:8;:22;;;;10307:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10391:28;10410:8;10391:18;:28::i;:::-;10226:201:::0;:::o;55003:29::-;;;;;;;;;;;;;:::o;9434:98::-;9487:7;9514:10;9507:17;;9434:98;:::o;3384:::-;3442:7;3473:1;3469;:5;;;;:::i;:::-;3462:12;;3384:98;;;;:::o;34181:104::-;34250:27;34260:2;34264:8;34250:27;;;;;;;;;;;;:9;:27::i;:::-;34181:104;;:::o;33824:273::-;33881:4;33937:7;33918:15;:13;:15::i;:::-;:26;;:66;;;;;33971:13;;33961:7;:23;33918:66;:152;;;;;34069:1;20357:8;34022:17;:26;34040:7;34022:26;;;;;;;;;;;;:43;:48;33918:152;33898:172;;33824:273;;;:::o;52385:105::-;52445:7;52472:10;52465:17;;52385:105;:::o;58462:93::-;58519:7;58546:1;58539:8;;58462:93;:::o;26739:1174::-;26806:7;26826:12;26841:7;26826:22;;26909:4;26890:15;:13;:15::i;:::-;:23;26886:960;;26943:13;;26936:4;:20;26932:914;;;26981:14;26998:17;:23;27016:4;26998:23;;;;;;;;;;;;26981:40;;27114:1;20357:8;27087:6;:23;:28;27083:744;;;27606:158;27623:1;27613:6;:11;27606:158;;;27662:11;27671:1;27662:4;:8;;:11;;;;:::i;:::-;27657:16;;27713:17;:23;27731:4;27713:23;;;;;;;;;;;;27704:32;;27606:158;;;27797:6;27790:13;;;;;;27083:744;26958:888;26932:914;26886:960;27874:31;;;;;;;;;;;;;;26739:1174;;;;:::o;39625:652::-;39720:27;39749:23;39790:53;39846:15;39790:71;;40032:7;40026:4;40019:21;40067:22;40061:4;40054:36;40143:4;40137;40127:21;40104:44;;40239:19;40233:26;40214:45;;39970:300;39625:652;;;:::o;40390:645::-;40532:11;40694:15;40688:4;40684:26;40676:34;;40853:15;40842:9;40838:31;40825:44;;41000:15;40989:9;40986:30;40979:4;40968:9;40965:19;40962:55;40952:65;;40390:645;;;;;:::o;51218:159::-;;;;;:::o;49530:309::-;49665:7;49685:16;20758:3;49711:19;:40;;49685:67;;20758:3;49778:31;49789:4;49795:2;49799:9;49778:10;:31::i;:::-;49770:40;;:61;;49763:68;;;49530:309;;;;;:::o;29358:447::-;29438:14;29606:15;29599:5;29595:27;29586:36;;29780:5;29766:11;29742:22;29738:40;29735:51;29728:5;29725:62;29715:72;;29358:447;;;;:::o;52036:158::-;;;;;:::o;10436:191::-;10510:16;10529:6;;;;;;;;;;;10510:25;;10555:8;10546:6;;:17;;;;;;;;;;;;;;;;;;10610:8;10579:40;;10600:8;10579:40;;;;;;;;;;;;10499:128;10436:191;:::o;85:190::-;210:4;263;234:25;247:5;254:4;234:12;:25::i;:::-;:33;227:40;;85:190;;;;;:::o;4122:98::-;4180:7;4211:1;4207;:5;;;;:::i;:::-;4200:12;;4122:98;;;;:::o;48040:716::-;48203:4;48249:2;48224:45;;;48270:19;:17;:19::i;:::-;48291:4;48297:7;48306:5;48224:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48220:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48524:1;48507:6;:13;:18;48503:235;;;48553:40;;;;;;;;;;;;;;48503:235;48696:6;48690:13;48681:6;48677:2;48673:15;48666:38;48220:529;48393:54;;;48383:64;;;:6;:64;;;;48376:71;;;48040:716;;;;;;:::o;8051:533::-;8107:13;8147:1;8138:5;:10;8134:53;;;8165:10;;;;;;;;;;;;;;;;;;;;;8134:53;8197:12;8212:5;8197:20;;8228:14;8253:78;8268:1;8260:4;:9;8253:78;;8286:8;;;;;:::i;:::-;;;;8317:2;8309:10;;;;;:::i;:::-;;;8253:78;;;8341:19;8373:6;8363:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8341:39;;8391:154;8407:1;8398:5;:10;8391:154;;8435:1;8425:11;;;;;:::i;:::-;;;8502:2;8494:5;:10;;;;:::i;:::-;8481:2;:24;;;;:::i;:::-;8468:39;;8451:6;8458;8451:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8531:2;8522:11;;;;;:::i;:::-;;;8391:154;;;8569:6;8555:21;;;;;8051:533;;;;:::o;25338:176::-;25399:7;19587:13;19724:2;25427:18;:25;25446:5;25427:25;;;;;;;;;;;;;;;;:49;;25426:80;25419:87;;25338:176;;;:::o;34701:681::-;34824:19;34830:2;34834:8;34824:5;:19::i;:::-;34903:1;34885:2;:14;;;:19;34881:483;;34925:11;34939:13;;34925:27;;34971:13;34993:8;34987:3;:14;34971:30;;35020:233;35051:62;35090:1;35094:2;35098:7;;;;;;35107:5;35051:30;:62::i;:::-;35046:167;;35149:40;;;;;;;;;;;;;;35046:167;35248:3;35240:5;:11;35020:233;;35335:3;35318:13;;:20;35314:34;;35340:8;;;35314:34;34906:458;;34881:483;34701:681;;;:::o;3765:98::-;3823:7;3854:1;3850;:5;;;;:::i;:::-;3843:12;;3765:98;;;;:::o;50415:147::-;50552:6;50415:147;;;;;:::o;280:517::-;363:7;383:20;406:4;383:27;;426:9;421:339;445:5;:12;441:1;:16;421:339;;;479:20;502:5;508:1;502:8;;;;;;;;:::i;:::-;;;;;;;;479:31;;545:12;529;:28;525:224;;593:42;608:12;622;593:14;:42::i;:::-;578:57;;525:224;;;691:42;706:12;720;691:14;:42::i;:::-;676:57;;525:224;464:296;459:3;;;;;:::i;:::-;;;;421:339;;;;777:12;770:19;;;280:517;;;;:::o;35655:1529::-;35720:20;35743:13;;35720:36;;35785:1;35771:16;;:2;:16;;;35767:48;;;35796:19;;;;;;;;;;;;;;35767:48;35842:1;35830:8;:13;35826:44;;;35852:18;;;;;;;;;;;;;;35826:44;35883:61;35913:1;35917:2;35921:12;35935:8;35883:21;:61::i;:::-;36426:1;19724:2;36397:1;:25;;36396:31;36384:8;:44;36358:18;:22;36377:2;36358:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;36705:139;36742:2;36796:33;36819:1;36823:2;36827:1;36796:14;:33::i;:::-;36763:30;36784:8;36763:20;:30::i;:::-;:66;36705:18;:139::i;:::-;36671:17;:31;36689:12;36671:31;;;;;;;;;;;:173;;;;36861:15;36879:12;36861:30;;36906:11;36935:8;36920:12;:23;36906:37;;36958:101;37010:9;;;;;;37006:2;36985:35;;37002:1;36985:35;;;;;;;;;;;;37054:3;37044:7;:13;36958:101;;37091:3;37075:13;:19;;;;36132:974;;37116:60;37145:1;37149:2;37153:12;37167:8;37116:20;:60::i;:::-;35709:1475;35655:1529;;:::o;805:224::-;873:13;936:1;930:4;923:15;965:1;959:4;952:15;1006:4;1000;990:21;981:30;;805:224;;;;:::o;31188:322::-;31258:14;31489:1;31479:8;31476:15;31451:23;31447:45;31437:55;;31188:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:329::-;6415:6;6464:2;6452:9;6443:7;6439:23;6435:32;6432:119;;;6470:79;;:::i;:::-;6432:119;6590:1;6615:53;6660:7;6651:6;6640:9;6636:22;6615:53;:::i;:::-;6605:63;;6561:117;6356:329;;;;:::o;6691:327::-;6749:6;6798:2;6786:9;6777:7;6773:23;6769:32;6766:119;;;6804:79;;:::i;:::-;6766:119;6924:1;6949:52;6993:7;6984:6;6973:9;6969:22;6949:52;:::i;:::-;6939:62;;6895:116;6691:327;;;;:::o;7024:349::-;7093:6;7142:2;7130:9;7121:7;7117:23;7113:32;7110:119;;;7148:79;;:::i;:::-;7110:119;7268:1;7293:63;7348:7;7339:6;7328:9;7324:22;7293:63;:::i;:::-;7283:73;;7239:127;7024:349;;;;:::o;7379:509::-;7448:6;7497:2;7485:9;7476:7;7472:23;7468:32;7465:119;;;7503:79;;:::i;:::-;7465:119;7651:1;7640:9;7636:17;7623:31;7681:18;7673:6;7670:30;7667:117;;;7703:79;;:::i;:::-;7667:117;7808:63;7863:7;7854:6;7843:9;7839:22;7808:63;:::i;:::-;7798:73;;7594:287;7379:509;;;;:::o;7894:329::-;7953:6;8002:2;7990:9;7981:7;7977:23;7973:32;7970:119;;;8008:79;;:::i;:::-;7970:119;8128:1;8153:53;8198:7;8189:6;8178:9;8174:22;8153:53;:::i;:::-;8143:63;;8099:117;7894:329;;;;:::o;8229:704::-;8324:6;8332;8340;8389:2;8377:9;8368:7;8364:23;8360:32;8357:119;;;8395:79;;:::i;:::-;8357:119;8515:1;8540:53;8585:7;8576:6;8565:9;8561:22;8540:53;:::i;:::-;8530:63;;8486:117;8670:2;8659:9;8655:18;8642:32;8701:18;8693:6;8690:30;8687:117;;;8723:79;;:::i;:::-;8687:117;8836:80;8908:7;8899:6;8888:9;8884:22;8836:80;:::i;:::-;8818:98;;;;8613:313;8229:704;;;;;:::o;8939:118::-;9026:24;9044:5;9026:24;:::i;:::-;9021:3;9014:37;8939:118;;:::o;9063:157::-;9168:45;9188:24;9206:5;9188:24;:::i;:::-;9168:45;:::i;:::-;9163:3;9156:58;9063:157;;:::o;9226:109::-;9307:21;9322:5;9307:21;:::i;:::-;9302:3;9295:34;9226:109;;:::o;9341:118::-;9428:24;9446:5;9428:24;:::i;:::-;9423:3;9416:37;9341:118;;:::o;9465:360::-;9551:3;9579:38;9611:5;9579:38;:::i;:::-;9633:70;9696:6;9691:3;9633:70;:::i;:::-;9626:77;;9712:52;9757:6;9752:3;9745:4;9738:5;9734:16;9712:52;:::i;:::-;9789:29;9811:6;9789:29;:::i;:::-;9784:3;9780:39;9773:46;;9555:270;9465:360;;;;:::o;9831:364::-;9919:3;9947:39;9980:5;9947:39;:::i;:::-;10002:71;10066:6;10061:3;10002:71;:::i;:::-;9995:78;;10082:52;10127:6;10122:3;10115:4;10108:5;10104:16;10082:52;:::i;:::-;10159:29;10181:6;10159:29;:::i;:::-;10154:3;10150:39;10143:46;;9923:272;9831:364;;;;:::o;10201:377::-;10307:3;10335:39;10368:5;10335:39;:::i;:::-;10390:89;10472:6;10467:3;10390:89;:::i;:::-;10383:96;;10488:52;10533:6;10528:3;10521:4;10514:5;10510:16;10488:52;:::i;:::-;10565:6;10560:3;10556:16;10549:23;;10311:267;10201:377;;;;:::o;10608:845::-;10711:3;10748:5;10742:12;10777:36;10803:9;10777:36;:::i;:::-;10829:89;10911:6;10906:3;10829:89;:::i;:::-;10822:96;;10949:1;10938:9;10934:17;10965:1;10960:137;;;;11111:1;11106:341;;;;10927:520;;10960:137;11044:4;11040:9;11029;11025:25;11020:3;11013:38;11080:6;11075:3;11071:16;11064:23;;10960:137;;11106:341;11173:38;11205:5;11173:38;:::i;:::-;11233:1;11247:154;11261:6;11258:1;11255:13;11247:154;;;11335:7;11329:14;11325:1;11320:3;11316:11;11309:35;11385:1;11376:7;11372:15;11361:26;;11283:4;11280:1;11276:12;11271:17;;11247:154;;;11430:6;11425:3;11421:16;11414:23;;11113:334;;10927:520;;10715:738;;10608:845;;;;:::o;11459:366::-;11601:3;11622:67;11686:2;11681:3;11622:67;:::i;:::-;11615:74;;11698:93;11787:3;11698:93;:::i;:::-;11816:2;11811:3;11807:12;11800:19;;11459:366;;;:::o;11831:::-;11973:3;11994:67;12058:2;12053:3;11994:67;:::i;:::-;11987:74;;12070:93;12159:3;12070:93;:::i;:::-;12188:2;12183:3;12179:12;12172:19;;11831:366;;;:::o;12203:::-;12345:3;12366:67;12430:2;12425:3;12366:67;:::i;:::-;12359:74;;12442:93;12531:3;12442:93;:::i;:::-;12560:2;12555:3;12551:12;12544:19;;12203:366;;;:::o;12575:::-;12717:3;12738:67;12802:2;12797:3;12738:67;:::i;:::-;12731:74;;12814:93;12903:3;12814:93;:::i;:::-;12932:2;12927:3;12923:12;12916:19;;12575:366;;;:::o;12947:::-;13089:3;13110:67;13174:2;13169:3;13110:67;:::i;:::-;13103:74;;13186:93;13275:3;13186:93;:::i;:::-;13304:2;13299:3;13295:12;13288:19;;12947:366;;;:::o;13319:::-;13461:3;13482:67;13546:2;13541:3;13482:67;:::i;:::-;13475:74;;13558:93;13647:3;13558:93;:::i;:::-;13676:2;13671:3;13667:12;13660:19;;13319:366;;;:::o;13691:::-;13833:3;13854:67;13918:2;13913:3;13854:67;:::i;:::-;13847:74;;13930:93;14019:3;13930:93;:::i;:::-;14048:2;14043:3;14039:12;14032:19;;13691:366;;;:::o;14063:::-;14205:3;14226:67;14290:2;14285:3;14226:67;:::i;:::-;14219:74;;14302:93;14391:3;14302:93;:::i;:::-;14420:2;14415:3;14411:12;14404:19;;14063:366;;;:::o;14435:400::-;14595:3;14616:84;14698:1;14693:3;14616:84;:::i;:::-;14609:91;;14709:93;14798:3;14709:93;:::i;:::-;14827:1;14822:3;14818:11;14811:18;;14435:400;;;:::o;14841:366::-;14983:3;15004:67;15068:2;15063:3;15004:67;:::i;:::-;14997:74;;15080:93;15169:3;15080:93;:::i;:::-;15198:2;15193:3;15189:12;15182:19;;14841:366;;;:::o;15213:::-;15355:3;15376:67;15440:2;15435:3;15376:67;:::i;:::-;15369:74;;15452:93;15541:3;15452:93;:::i;:::-;15570:2;15565:3;15561:12;15554:19;;15213:366;;;:::o;15585:::-;15727:3;15748:67;15812:2;15807:3;15748:67;:::i;:::-;15741:74;;15824:93;15913:3;15824:93;:::i;:::-;15942:2;15937:3;15933:12;15926:19;;15585:366;;;:::o;15957:398::-;16116:3;16137:83;16218:1;16213:3;16137:83;:::i;:::-;16130:90;;16229:93;16318:3;16229:93;:::i;:::-;16347:1;16342:3;16338:11;16331:18;;15957:398;;;:::o;16361:118::-;16448:24;16466:5;16448:24;:::i;:::-;16443:3;16436:37;16361:118;;:::o;16485:256::-;16597:3;16612:75;16683:3;16674:6;16612:75;:::i;:::-;16712:2;16707:3;16703:12;16696:19;;16732:3;16725:10;;16485:256;;;;:::o;16747:695::-;17025:3;17047:92;17135:3;17126:6;17047:92;:::i;:::-;17040:99;;17156:95;17247:3;17238:6;17156:95;:::i;:::-;17149:102;;17268:148;17412:3;17268:148;:::i;:::-;17261:155;;17433:3;17426:10;;16747:695;;;;;:::o;17448:379::-;17632:3;17654:147;17797:3;17654:147;:::i;:::-;17647:154;;17818:3;17811:10;;17448:379;;;:::o;17833:222::-;17926:4;17964:2;17953:9;17949:18;17941:26;;17977:71;18045:1;18034:9;18030:17;18021:6;17977:71;:::i;:::-;17833:222;;;;:::o;18061:640::-;18256:4;18294:3;18283:9;18279:19;18271:27;;18308:71;18376:1;18365:9;18361:17;18352:6;18308:71;:::i;:::-;18389:72;18457:2;18446:9;18442:18;18433:6;18389:72;:::i;:::-;18471;18539:2;18528:9;18524:18;18515:6;18471:72;:::i;:::-;18590:9;18584:4;18580:20;18575:2;18564:9;18560:18;18553:48;18618:76;18689:4;18680:6;18618:76;:::i;:::-;18610:84;;18061:640;;;;;;;:::o;18707:210::-;18794:4;18832:2;18821:9;18817:18;18809:26;;18845:65;18907:1;18896:9;18892:17;18883:6;18845:65;:::i;:::-;18707:210;;;;:::o;18923:222::-;19016:4;19054:2;19043:9;19039:18;19031:26;;19067:71;19135:1;19124:9;19120:17;19111:6;19067:71;:::i;:::-;18923:222;;;;:::o;19151:313::-;19264:4;19302:2;19291:9;19287:18;19279:26;;19351:9;19345:4;19341:20;19337:1;19326:9;19322:17;19315:47;19379:78;19452:4;19443:6;19379:78;:::i;:::-;19371:86;;19151:313;;;;:::o;19470:419::-;19636:4;19674:2;19663:9;19659:18;19651:26;;19723:9;19717:4;19713:20;19709:1;19698:9;19694:17;19687:47;19751:131;19877:4;19751:131;:::i;:::-;19743:139;;19470:419;;;:::o;19895:::-;20061:4;20099:2;20088:9;20084:18;20076:26;;20148:9;20142:4;20138:20;20134:1;20123:9;20119:17;20112:47;20176:131;20302:4;20176:131;:::i;:::-;20168:139;;19895:419;;;:::o;20320:::-;20486:4;20524:2;20513:9;20509:18;20501:26;;20573:9;20567:4;20563:20;20559:1;20548:9;20544:17;20537:47;20601:131;20727:4;20601:131;:::i;:::-;20593:139;;20320:419;;;:::o;20745:::-;20911:4;20949:2;20938:9;20934:18;20926:26;;20998:9;20992:4;20988:20;20984:1;20973:9;20969:17;20962:47;21026:131;21152:4;21026:131;:::i;:::-;21018:139;;20745:419;;;:::o;21170:::-;21336:4;21374:2;21363:9;21359:18;21351:26;;21423:9;21417:4;21413:20;21409:1;21398:9;21394:17;21387:47;21451:131;21577:4;21451:131;:::i;:::-;21443:139;;21170:419;;;:::o;21595:::-;21761:4;21799:2;21788:9;21784:18;21776:26;;21848:9;21842:4;21838:20;21834:1;21823:9;21819:17;21812:47;21876:131;22002:4;21876:131;:::i;:::-;21868:139;;21595:419;;;:::o;22020:::-;22186:4;22224:2;22213:9;22209:18;22201:26;;22273:9;22267:4;22263:20;22259:1;22248:9;22244:17;22237:47;22301:131;22427:4;22301:131;:::i;:::-;22293:139;;22020:419;;;:::o;22445:::-;22611:4;22649:2;22638:9;22634:18;22626:26;;22698:9;22692:4;22688:20;22684:1;22673:9;22669:17;22662:47;22726:131;22852:4;22726:131;:::i;:::-;22718:139;;22445:419;;;:::o;22870:::-;23036:4;23074:2;23063:9;23059:18;23051:26;;23123:9;23117:4;23113:20;23109:1;23098:9;23094:17;23087:47;23151:131;23277:4;23151:131;:::i;:::-;23143:139;;22870:419;;;:::o;23295:::-;23461:4;23499:2;23488:9;23484:18;23476:26;;23548:9;23542:4;23538:20;23534:1;23523:9;23519:17;23512:47;23576:131;23702:4;23576:131;:::i;:::-;23568:139;;23295:419;;;:::o;23720:::-;23886:4;23924:2;23913:9;23909:18;23901:26;;23973:9;23967:4;23963:20;23959:1;23948:9;23944:17;23937:47;24001:131;24127:4;24001:131;:::i;:::-;23993:139;;23720:419;;;:::o;24145:222::-;24238:4;24276:2;24265:9;24261:18;24253:26;;24289:71;24357:1;24346:9;24342:17;24333:6;24289:71;:::i;:::-;24145:222;;;;:::o;24373:129::-;24407:6;24434:20;;:::i;:::-;24424:30;;24463:33;24491:4;24483:6;24463:33;:::i;:::-;24373:129;;;:::o;24508:75::-;24541:6;24574:2;24568:9;24558:19;;24508:75;:::o;24589:307::-;24650:4;24740:18;24732:6;24729:30;24726:56;;;24762:18;;:::i;:::-;24726:56;24800:29;24822:6;24800:29;:::i;:::-;24792:37;;24884:4;24878;24874:15;24866:23;;24589:307;;;:::o;24902:308::-;24964:4;25054:18;25046:6;25043:30;25040:56;;;25076:18;;:::i;:::-;25040:56;25114:29;25136:6;25114:29;:::i;:::-;25106:37;;25198:4;25192;25188:15;25180:23;;24902:308;;;:::o;25216:141::-;25265:4;25288:3;25280:11;;25311:3;25308:1;25301:14;25345:4;25342:1;25332:18;25324:26;;25216:141;;;:::o;25363:98::-;25414:6;25448:5;25442:12;25432:22;;25363:98;;;:::o;25467:99::-;25519:6;25553:5;25547:12;25537:22;;25467:99;;;:::o;25572:168::-;25655:11;25689:6;25684:3;25677:19;25729:4;25724:3;25720:14;25705:29;;25572:168;;;;:::o;25746:147::-;25847:11;25884:3;25869:18;;25746:147;;;;:::o;25899:169::-;25983:11;26017:6;26012:3;26005:19;26057:4;26052:3;26048:14;26033:29;;25899:169;;;;:::o;26074:148::-;26176:11;26213:3;26198:18;;26074:148;;;;:::o;26228:305::-;26268:3;26287:20;26305:1;26287:20;:::i;:::-;26282:25;;26321:20;26339:1;26321:20;:::i;:::-;26316:25;;26475:1;26407:66;26403:74;26400:1;26397:81;26394:107;;;26481:18;;:::i;:::-;26394:107;26525:1;26522;26518:9;26511:16;;26228:305;;;;:::o;26539:185::-;26579:1;26596:20;26614:1;26596:20;:::i;:::-;26591:25;;26630:20;26648:1;26630:20;:::i;:::-;26625:25;;26669:1;26659:35;;26674:18;;:::i;:::-;26659:35;26716:1;26713;26709:9;26704:14;;26539:185;;;;:::o;26730:348::-;26770:7;26793:20;26811:1;26793:20;:::i;:::-;26788:25;;26827:20;26845:1;26827:20;:::i;:::-;26822:25;;27015:1;26947:66;26943:74;26940:1;26937:81;26932:1;26925:9;26918:17;26914:105;26911:131;;;27022:18;;:::i;:::-;26911:131;27070:1;27067;27063:9;27052:20;;26730:348;;;;:::o;27084:191::-;27124:4;27144:20;27162:1;27144:20;:::i;:::-;27139:25;;27178:20;27196:1;27178:20;:::i;:::-;27173:25;;27217:1;27214;27211:8;27208:34;;;27222:18;;:::i;:::-;27208:34;27267:1;27264;27260:9;27252:17;;27084:191;;;;:::o;27281:96::-;27318:7;27347:24;27365:5;27347:24;:::i;:::-;27336:35;;27281:96;;;:::o;27383:90::-;27417:7;27460:5;27453:13;27446:21;27435:32;;27383:90;;;:::o;27479:77::-;27516:7;27545:5;27534:16;;27479:77;;;:::o;27562:149::-;27598:7;27638:66;27631:5;27627:78;27616:89;;27562:149;;;:::o;27717:126::-;27754:7;27794:42;27787:5;27783:54;27772:65;;27717:126;;;:::o;27849:77::-;27886:7;27915:5;27904:16;;27849:77;;;:::o;27932:154::-;28016:6;28011:3;28006;27993:30;28078:1;28069:6;28064:3;28060:16;28053:27;27932:154;;;:::o;28092:307::-;28160:1;28170:113;28184:6;28181:1;28178:13;28170:113;;;28269:1;28264:3;28260:11;28254:18;28250:1;28245:3;28241:11;28234:39;28206:2;28203:1;28199:10;28194:15;;28170:113;;;28301:6;28298:1;28295:13;28292:101;;;28381:1;28372:6;28367:3;28363:16;28356:27;28292:101;28141:258;28092:307;;;:::o;28405:320::-;28449:6;28486:1;28480:4;28476:12;28466:22;;28533:1;28527:4;28523:12;28554:18;28544:81;;28610:4;28602:6;28598:17;28588:27;;28544:81;28672:2;28664:6;28661:14;28641:18;28638:38;28635:84;;;28691:18;;:::i;:::-;28635:84;28456:269;28405:320;;;:::o;28731:281::-;28814:27;28836:4;28814:27;:::i;:::-;28806:6;28802:40;28944:6;28932:10;28929:22;28908:18;28896:10;28893:34;28890:62;28887:88;;;28955:18;;:::i;:::-;28887:88;28995:10;28991:2;28984:22;28774:238;28731:281;;:::o;29018:233::-;29057:3;29080:24;29098:5;29080:24;:::i;:::-;29071:33;;29126:66;29119:5;29116:77;29113:103;;;29196:18;;:::i;:::-;29113:103;29243:1;29236:5;29232:13;29225:20;;29018:233;;;:::o;29257:100::-;29296:7;29325:26;29345:5;29325:26;:::i;:::-;29314:37;;29257:100;;;:::o;29363:94::-;29402:7;29431:20;29445:5;29431:20;:::i;:::-;29420:31;;29363:94;;;:::o;29463:176::-;29495:1;29512:20;29530:1;29512:20;:::i;:::-;29507:25;;29546:20;29564:1;29546:20;:::i;:::-;29541:25;;29585:1;29575:35;;29590:18;;:::i;:::-;29575:35;29631:1;29628;29624:9;29619:14;;29463:176;;;;:::o;29645:180::-;29693:77;29690:1;29683:88;29790:4;29787:1;29780:15;29814:4;29811:1;29804:15;29831:180;29879:77;29876:1;29869:88;29976:4;29973:1;29966:15;30000:4;29997:1;29990:15;30017:180;30065:77;30062:1;30055:88;30162:4;30159:1;30152:15;30186:4;30183:1;30176:15;30203:180;30251:77;30248:1;30241:88;30348:4;30345:1;30338:15;30372:4;30369:1;30362:15;30389:180;30437:77;30434:1;30427:88;30534:4;30531:1;30524:15;30558:4;30555:1;30548:15;30575:117;30684:1;30681;30674:12;30698:117;30807:1;30804;30797:12;30821:117;30930:1;30927;30920:12;30944:117;31053:1;31050;31043:12;31067:117;31176:1;31173;31166:12;31190:117;31299:1;31296;31289:12;31313:102;31354:6;31405:2;31401:7;31396:2;31389:5;31385:14;31381:28;31371:38;;31313:102;;;:::o;31421:94::-;31454:8;31502:5;31498:2;31494:14;31473:35;;31421:94;;;:::o;31521:225::-;31661:34;31657:1;31649:6;31645:14;31638:58;31730:8;31725:2;31717:6;31713:15;31706:33;31521:225;:::o;31752:220::-;31892:34;31888:1;31880:6;31876:14;31869:58;31961:3;31956:2;31948:6;31944:15;31937:28;31752:220;:::o;31978:173::-;32118:25;32114:1;32106:6;32102:14;32095:49;31978:173;:::o;32157:182::-;32297:34;32293:1;32285:6;32281:14;32274:58;32157:182;:::o;32345:180::-;32485:32;32481:1;32473:6;32469:14;32462:56;32345:180;:::o;32531:::-;32671:32;32667:1;32659:6;32655:14;32648:56;32531:180;:::o;32717:165::-;32857:17;32853:1;32845:6;32841:14;32834:41;32717:165;:::o;32888:176::-;33028:28;33024:1;33016:6;33012:14;33005:52;32888:176;:::o;33070:155::-;33210:7;33206:1;33198:6;33194:14;33187:31;33070:155;:::o;33231:182::-;33371:34;33367:1;33359:6;33355:14;33348:58;33231:182;:::o;33419:234::-;33559:34;33555:1;33547:6;33543:14;33536:58;33628:17;33623:2;33615:6;33611:15;33604:42;33419:234;:::o;33659:177::-;33799:29;33795:1;33787:6;33783:14;33776:53;33659:177;:::o;33842:114::-;;:::o;33962:122::-;34035:24;34053:5;34035:24;:::i;:::-;34028:5;34025:35;34015:63;;34074:1;34071;34064:12;34015:63;33962:122;:::o;34090:116::-;34160:21;34175:5;34160:21;:::i;:::-;34153:5;34150:32;34140:60;;34196:1;34193;34186:12;34140:60;34090:116;:::o;34212:122::-;34285:24;34303:5;34285:24;:::i;:::-;34278:5;34275:35;34265:63;;34324:1;34321;34314:12;34265:63;34212:122;:::o;34340:120::-;34412:23;34429:5;34412:23;:::i;:::-;34405:5;34402:34;34392:62;;34450:1;34447;34440:12;34392:62;34340:120;:::o;34466:122::-;34539:24;34557:5;34539:24;:::i;:::-;34532:5;34529:35;34519:63;;34578:1;34575;34568:12;34519:63;34466:122;:::o
Swarm Source
ipfs://f42efafa83de5fe45f4c0e6f68bdc85e842189e472989486581c7bf60b370875
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.