ERC-721
NFT
Overview
Max Total Supply
5,000 r.wtf
Holders
2,024
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
7 r.wtfLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ROBOTOWN
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-06 */ /** *Submitted for verification at Etherscan.io on 2022-06-05 */ // SPDX-License-Identifier: MIT /* ,----, ,----.. ,----.. ,/ .`| ,----.. ,--. ,-.----. / / \ ,---,. / / \ ,` .' : / / \ .---. ,--.'| \ / \ / . : ,' .' \ / . : ; ; // . : /. ./| ,--,: : | ; : \ . / ;. \,---.' .' | . / ;. \.'___,/ ,'. / ;. \ .--'. ' ;,`--.'`| ' : | | .\ :. ; / ` ;| | |: |. ; / ` ;| : |. ; / ` ; /__./ \ : || : : | | . : |: |; | ; \ ; |: : : /; | ; \ ; |; |.'; ;; | ; \ ; | .--'. ' \' .: | \ | : | | \ :| : | ; | ': | ; | : | ; | '`----' | || : | ; | '/___/ \ | ' '| : ' '; | | : . /. | ' ' ' :| : \. | ' ' ' : ' : ;. | ' ' ' :; \ \; :' ' ;. ; ; | | \' ; \; / || | . |' ; \; / | | | '' ; \; / | \ ; ` || | | \ | | | ;\ \\ \ ', / ' : '; | \ \ ', / ' : | \ \ ', / . \ .\ ;' : | ; .' : ' | \.' ; : / | | | ; ; : / ; |.' ; : / \ \ ' \ || | '`--' : : :-' \ \ .' | : / \ \ .' '---' \ \ .' : ' |--" ' : | | |.' `---` | | ,' `---` `---` \ \ ; ; |.' `---' `----' '---" '---' */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ 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(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * 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(); 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; } /** * @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); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ 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 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` 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 auxillary 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 auxillary 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; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ 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) { 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; } /** * 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 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, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); 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-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(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. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) 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 or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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. */ 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 or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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 _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // 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)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // 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 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) } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/robo.sol pragma solidity 0.8.12; contract ROBOTOWN is ERC721A, Ownable { using Strings for uint256; uint public constant MAX_TOKENS = 5000; uint public CURR_MINT_COST = 0.008 ether; //---- Round based supplies string private CURR_ROUND_NAME = "ROBO"; uint private CURR_ROUND_SUPPLY = MAX_TOKENS; uint private maxMintAmount = 8; uint private nftPerAddressLimit = 10; uint private freeMints = 2; bool public hasSaleStarted = true; string public baseURI; constructor() ERC721A("robotown", "r.wtf") { setBaseURI("ipfs://QmPK1kRYnhqrThmxej2dF67P1boXuhGJ25ac8WPRbG9ZuZ/"); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function mintNFT(uint _mintAmount) external payable { require(hasSaleStarted == true, "Sale hasn't started"); require(_mintAmount > 0, "Need to mint at least 1 NFT"); require(_mintAmount <= CURR_ROUND_SUPPLY, "We're at max supply!"); if(balanceOf(msg.sender) == 0) { _mintAmount = freeMints; } else { require(msg.value >= CURR_MINT_COST * _mintAmount, "Insufficient funds"); require(_mintAmount <= maxMintAmount, "Max mint amount per transaction exceeded"); require((_mintAmount + balanceOf(msg.sender)) <= nftPerAddressLimit, "Max NFT per address exceeded"); } CURR_ROUND_SUPPLY -= _mintAmount; _safeMint(msg.sender, _mintAmount); } function getInformations() external view returns (string memory, uint, uint, uint, uint,uint,uint, bool,bool) { return (CURR_ROUND_NAME,CURR_ROUND_SUPPLY,0,CURR_MINT_COST,maxMintAmount,nftPerAddressLimit, totalSupply(), hasSaleStarted,false); } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), ".json")) : ''; } //only owner functions function setFreeMints(uint amount) external onlyOwner { freeMints = amount; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function Giveaways(uint numTokens, address recipient) public onlyOwner { require(numTokens <= CURR_ROUND_SUPPLY, "We're at max supply!"); CURR_ROUND_SUPPLY -= numTokens; _safeMint(recipient, numTokens); } function withdraw(uint amount) public onlyOwner { require(payable(msg.sender).send(amount)); } function setSaleStarted(bool _state) public onlyOwner { hasSaleStarted = _state; } }
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":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CURR_MINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"Giveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInformations","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052661c6bf5263400006009556040518060400160405280600481526020017f524f424f00000000000000000000000000000000000000000000000000000000815250600a90805190602001906200005c9291906200034d565b50611388600b556008600c55600a600d556002600e556001600f60006101000a81548160ff0219169083151502179055503480156200009a57600080fd5b506040518060400160405280600881526020017f726f626f746f776e0000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f722e77746600000000000000000000000000000000000000000000000000000081525081600290805190602001906200011f9291906200034d565b508060039080519060200190620001389291906200034d565b5062000149620001a160201b60201c565b60008190555050506200017162000165620001aa60201b60201c565b620001b260201b60201c565b6200019b60405180606001604052806036815260200162003919603691396200027860201b60201c565b620004e5565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000288620001aa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ae6200032360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000307576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fe906200045e565b60405180910390fd5b80601090805190602001906200031f9291906200034d565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200035b90620004af565b90600052602060002090601f0160209004810192826200037f5760008555620003cb565b82601f106200039a57805160ff1916838001178555620003cb565b82800160010185558215620003cb579182015b82811115620003ca578251825591602001919060010190620003ad565b5b509050620003da9190620003de565b5090565b5b80821115620003f9576000816000905550600101620003df565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000446602083620003fd565b915062000453826200040e565b602082019050919050565b60006020820190508181036000830152620004798162000437565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004c857607f821691505b60208210811415620004df57620004de62000480565b5b50919050565b61342480620004f56000396000f3fe6080604052600436106101b75760003560e01c8063715018a6116100ec578063c34278441161008a578063e7db8fb011610064578063e7db8fb0146105f1578063e985e9c51461061a578063f2fde38b14610657578063f47c84c514610680576101b7565b8063c342784414610560578063c87b56dd1461058b578063cc0b8d15146105c8576101b7565b806395d89b41116100c657806395d89b41146104ba578063a22cb465146104e5578063a854ffba1461050e578063b88d4fde14610537576101b7565b8063715018a61461045c5780638da5cb5b14610473578063926427441461049e576101b7565b80632e1a7d4d1161015957806355f804b31161013357806355f804b31461038e5780636352211e146103b75780636c0360eb146103f457806370a082311461041f576101b7565b80632e1a7d4d146103095780633c5e310b1461033257806342842e0e14610365576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a5780631c8b232d146102b557806323b872dd146102e0576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612457565b6106ab565b6040516101f0919061249f565b60405180910390f35b34801561020557600080fd5b5061020e61073d565b60405161021b9190612553565b60405180910390f35b34801561023057600080fd5b5061024b600480360381019061024691906125ab565b6107cf565b6040516102589190612619565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612660565b61084b565b005b34801561029657600080fd5b5061029f6109f2565b6040516102ac91906126af565b60405180910390f35b3480156102c157600080fd5b506102ca610a09565b6040516102d7919061249f565b60405180910390f35b3480156102ec57600080fd5b50610307600480360381019061030291906126ca565b610a1c565b005b34801561031557600080fd5b50610330600480360381019061032b91906125ab565b610a2c565b005b34801561033e57600080fd5b50610347610ae9565b60405161035c9998979695949392919061271d565b60405180910390f35b34801561037157600080fd5b5061038c600480360381019061038791906126ca565b610bca565b005b34801561039a57600080fd5b506103b560048036038101906103b091906128e6565b610bea565b005b3480156103c357600080fd5b506103de60048036038101906103d991906125ab565b610c80565b6040516103eb9190612619565b60405180910390f35b34801561040057600080fd5b50610409610c92565b6040516104169190612553565b60405180910390f35b34801561042b57600080fd5b506104466004803603810190610441919061292f565b610d20565b60405161045391906126af565b60405180910390f35b34801561046857600080fd5b50610471610dd9565b005b34801561047f57600080fd5b50610488610e61565b6040516104959190612619565b60405180910390f35b6104b860048036038101906104b391906125ab565b610e8b565b005b3480156104c657600080fd5b506104cf611098565b6040516104dc9190612553565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190612988565b61112a565b005b34801561051a57600080fd5b50610535600480360381019061053091906129c8565b6112a2565b005b34801561054357600080fd5b5061055e60048036038101906105599190612a96565b61133b565b005b34801561056c57600080fd5b506105756113ae565b60405161058291906126af565b60405180910390f35b34801561059757600080fd5b506105b260048036038101906105ad91906125ab565b6113b4565b6040516105bf9190612553565b60405180910390f35b3480156105d457600080fd5b506105ef60048036038101906105ea9190612b19565b61145b565b005b3480156105fd57600080fd5b50610618600480360381019061061391906125ab565b611543565b005b34801561062657600080fd5b50610641600480360381019061063c9190612b59565b6115c9565b60405161064e919061249f565b60405180910390f35b34801561066357600080fd5b5061067e6004803603810190610679919061292f565b61165d565b005b34801561068c57600080fd5b50610695611755565b6040516106a291906126af565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107365750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461074c90612bc8565b80601f016020809104026020016040519081016040528092919081815260200182805461077890612bc8565b80156107c55780601f1061079a576101008083540402835291602001916107c5565b820191906000526020600020905b8154815290600101906020018083116107a857829003601f168201915b5050505050905090565b60006107da8261175b565b610810576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610856826117ba565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108be576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108dd611888565b73ffffffffffffffffffffffffffffffffffffffff16146109405761090981610904611888565b6115c9565b61093f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109fc611890565b6001546000540303905090565b600f60009054906101000a900460ff1681565b610a27838383611899565b505050565b610a34611c43565b73ffffffffffffffffffffffffffffffffffffffff16610a52610e61565b73ffffffffffffffffffffffffffffffffffffffff1614610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90612c46565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610ae657600080fd5b50565b6060600080600080600080600080600a600b546000600954600c54600d54610b0f6109f2565b600f60009054906101000a900460ff166000888054610b2d90612bc8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5990612bc8565b8015610ba65780601f10610b7b57610100808354040283529160200191610ba6565b820191906000526020600020905b815481529060010190602001808311610b8957829003601f168201915b50505050509850985098509850985098509850985098509850909192939495969798565b610be58383836040518060200160405280600081525061133b565b505050565b610bf2611c43565b73ffffffffffffffffffffffffffffffffffffffff16610c10610e61565b73ffffffffffffffffffffffffffffffffffffffff1614610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d90612c46565b60405180910390fd5b8060109080519060200190610c7c929190612348565b5050565b6000610c8b826117ba565b9050919050565b60108054610c9f90612bc8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccb90612bc8565b8015610d185780601f10610ced57610100808354040283529160200191610d18565b820191906000526020600020905b815481529060010190602001808311610cfb57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d88576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610de1611c43565b73ffffffffffffffffffffffffffffffffffffffff16610dff610e61565b73ffffffffffffffffffffffffffffffffffffffff1614610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90612c46565b60405180910390fd5b610e5f6000611c4b565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60011515600f60009054906101000a900460ff16151514610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890612cb2565b60405180910390fd5b60008111610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b90612d1e565b60405180910390fd5b600b54811115610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090612d8a565b60405180910390fd5b6000610f7433610d20565b1415610f8457600e549050611072565b80600954610f929190612dd9565b341015610fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcb90612e7f565b60405180910390fd5b600c54811115611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090612f11565b60405180910390fd5b600d5461102533610d20565b826110309190612f31565b1115611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890612fd3565b60405180910390fd5b5b80600b60008282546110849190612ff3565b925050819055506110953382611d11565b50565b6060600380546110a790612bc8565b80601f01602080910402602001604051908101604052809291908181526020018280546110d390612bc8565b80156111205780601f106110f557610100808354040283529160200191611120565b820191906000526020600020905b81548152906001019060200180831161110357829003601f168201915b5050505050905090565b611132611888565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611197576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006111a4611888565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611251611888565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611296919061249f565b60405180910390a35050565b6112aa611c43565b73ffffffffffffffffffffffffffffffffffffffff166112c8610e61565b73ffffffffffffffffffffffffffffffffffffffff161461131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131590612c46565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b611346848484611899565b60008373ffffffffffffffffffffffffffffffffffffffff163b146113a85761137184848484611d2f565b6113a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60095481565b60606113bf8261175b565b6113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613099565b60405180910390fd5b6000611408611e80565b905060008151116114285760405180602001604052806000815250611453565b8061143284611f12565b604051602001611443929190613141565b6040516020818303038152906040525b915050919050565b611463611c43565b73ffffffffffffffffffffffffffffffffffffffff16611481610e61565b73ffffffffffffffffffffffffffffffffffffffff16146114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce90612c46565b60405180910390fd5b600b5482111561151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390612d8a565b60405180910390fd5b81600b600082825461152e9190612ff3565b9250508190555061153f8183611d11565b5050565b61154b611c43565b73ffffffffffffffffffffffffffffffffffffffff16611569610e61565b73ffffffffffffffffffffffffffffffffffffffff16146115bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b690612c46565b60405180910390fd5b80600e8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611665611c43565b73ffffffffffffffffffffffffffffffffffffffff16611683610e61565b73ffffffffffffffffffffffffffffffffffffffff16146116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d090612c46565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611740906131e2565b60405180910390fd5b61175281611c4b565b50565b61138881565b600081611766611890565b11158015611775575060005482105b80156117b3575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806117c9611890565b11611851576000548110156118505760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561184e575b6000811415611844576004600083600190039350838152602001908152602001600020549050611819565b8092505050611883565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b60006118a4826117ba565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461190b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661192c611888565b73ffffffffffffffffffffffffffffffffffffffff16148061195b575061195a85611955611888565b6115c9565b5b806119a05750611969611888565b73ffffffffffffffffffffffffffffffffffffffff16611988846107cf565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806119d9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a40576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a4d8585856001612073565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611b4a86612079565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611bd4576000600184019050600060046000838152602001908152602001600020541415611bd2576000548114611bd1578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c3c8585856001612083565b5050505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d2b828260405180602001604052806000815250612089565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d55611888565b8786866040518563ffffffff1660e01b8152600401611d779493929190613257565b6020604051808303816000875af1925050508015611db357506040513d601f19601f82011682018060405250810190611db091906132b8565b60015b611e2d573d8060008114611de3576040519150601f19603f3d011682016040523d82523d6000602084013e611de8565b606091505b50600081511415611e25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060108054611e8f90612bc8565b80601f0160208091040260200160405190810160405280929190818152602001828054611ebb90612bc8565b8015611f085780601f10611edd57610100808354040283529160200191611f08565b820191906000526020600020905b815481529060010190602001808311611eeb57829003601f168201915b5050505050905090565b60606000821415611f5a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061206e565b600082905060005b60008214611f8c578080611f75906132e5565b915050600a82611f85919061335d565b9150611f62565b60008167ffffffffffffffff811115611fa857611fa76127bb565b5b6040519080825280601f01601f191660200182016040528015611fda5781602001600182028036833780820191505090505b5090505b6000851461206757600182611ff39190612ff3565b9150600a85612002919061338e565b603061200e9190612f31565b60f81b818381518110612024576120236133bf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612060919061335d565b9450611fde565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120f6576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612131576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61213e6000858386612073565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16121a36001851461233e565b901b60a042901b6121b386612079565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146122b7575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122676000878480600101955087611d2f565b61229d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106121f85782600054146122b257600080fd5b612322565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106122b8575b8160008190555050506123386000858386612083565b50505050565b6000819050919050565b82805461235490612bc8565b90600052602060002090601f01602090048101928261237657600085556123bd565b82601f1061238f57805160ff19168380011785556123bd565b828001600101855582156123bd579182015b828111156123bc5782518255916020019190600101906123a1565b5b5090506123ca91906123ce565b5090565b5b808211156123e75760008160009055506001016123cf565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612434816123ff565b811461243f57600080fd5b50565b6000813590506124518161242b565b92915050565b60006020828403121561246d5761246c6123f5565b5b600061247b84828501612442565b91505092915050565b60008115159050919050565b61249981612484565b82525050565b60006020820190506124b46000830184612490565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124f45780820151818401526020810190506124d9565b83811115612503576000848401525b50505050565b6000601f19601f8301169050919050565b6000612525826124ba565b61252f81856124c5565b935061253f8185602086016124d6565b61254881612509565b840191505092915050565b6000602082019050818103600083015261256d818461251a565b905092915050565b6000819050919050565b61258881612575565b811461259357600080fd5b50565b6000813590506125a58161257f565b92915050565b6000602082840312156125c1576125c06123f5565b5b60006125cf84828501612596565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612603826125d8565b9050919050565b612613816125f8565b82525050565b600060208201905061262e600083018461260a565b92915050565b61263d816125f8565b811461264857600080fd5b50565b60008135905061265a81612634565b92915050565b60008060408385031215612677576126766123f5565b5b60006126858582860161264b565b925050602061269685828601612596565b9150509250929050565b6126a981612575565b82525050565b60006020820190506126c460008301846126a0565b92915050565b6000806000606084860312156126e3576126e26123f5565b5b60006126f18682870161264b565b93505060206127028682870161264b565b925050604061271386828701612596565b9150509250925092565b6000610120820190508181036000830152612738818c61251a565b9050612747602083018b6126a0565b612754604083018a6126a0565b61276160608301896126a0565b61276e60808301886126a0565b61277b60a08301876126a0565b61278860c08301866126a0565b61279560e0830185612490565b6127a3610100830184612490565b9a9950505050505050505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6127f382612509565b810181811067ffffffffffffffff82111715612812576128116127bb565b5b80604052505050565b60006128256123eb565b905061283182826127ea565b919050565b600067ffffffffffffffff821115612851576128506127bb565b5b61285a82612509565b9050602081019050919050565b82818337600083830152505050565b600061288961288484612836565b61281b565b9050828152602081018484840111156128a5576128a46127b6565b5b6128b0848285612867565b509392505050565b600082601f8301126128cd576128cc6127b1565b5b81356128dd848260208601612876565b91505092915050565b6000602082840312156128fc576128fb6123f5565b5b600082013567ffffffffffffffff81111561291a576129196123fa565b5b612926848285016128b8565b91505092915050565b600060208284031215612945576129446123f5565b5b60006129538482850161264b565b91505092915050565b61296581612484565b811461297057600080fd5b50565b6000813590506129828161295c565b92915050565b6000806040838503121561299f5761299e6123f5565b5b60006129ad8582860161264b565b92505060206129be85828601612973565b9150509250929050565b6000602082840312156129de576129dd6123f5565b5b60006129ec84828501612973565b91505092915050565b600067ffffffffffffffff821115612a1057612a0f6127bb565b5b612a1982612509565b9050602081019050919050565b6000612a39612a34846129f5565b61281b565b905082815260208101848484011115612a5557612a546127b6565b5b612a60848285612867565b509392505050565b600082601f830112612a7d57612a7c6127b1565b5b8135612a8d848260208601612a26565b91505092915050565b60008060008060808587031215612ab057612aaf6123f5565b5b6000612abe8782880161264b565b9450506020612acf8782880161264b565b9350506040612ae087828801612596565b925050606085013567ffffffffffffffff811115612b0157612b006123fa565b5b612b0d87828801612a68565b91505092959194509250565b60008060408385031215612b3057612b2f6123f5565b5b6000612b3e85828601612596565b9250506020612b4f8582860161264b565b9150509250929050565b60008060408385031215612b7057612b6f6123f5565b5b6000612b7e8582860161264b565b9250506020612b8f8582860161264b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612be057607f821691505b60208210811415612bf457612bf3612b99565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c306020836124c5565b9150612c3b82612bfa565b602082019050919050565b60006020820190508181036000830152612c5f81612c23565b9050919050565b7f53616c65206861736e2774207374617274656400000000000000000000000000600082015250565b6000612c9c6013836124c5565b9150612ca782612c66565b602082019050919050565b60006020820190508181036000830152612ccb81612c8f565b9050919050565b7f4e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6000612d08601b836124c5565b9150612d1382612cd2565b602082019050919050565b60006020820190508181036000830152612d3781612cfb565b9050919050565b7f5765277265206174206d617820737570706c7921000000000000000000000000600082015250565b6000612d746014836124c5565b9150612d7f82612d3e565b602082019050919050565b60006020820190508181036000830152612da381612d67565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612de482612575565b9150612def83612575565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e2857612e27612daa565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000612e696012836124c5565b9150612e7482612e33565b602082019050919050565b60006020820190508181036000830152612e9881612e5c565b9050919050565b7f4d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e2060008201527f6578636565646564000000000000000000000000000000000000000000000000602082015250565b6000612efb6028836124c5565b9150612f0682612e9f565b604082019050919050565b60006020820190508181036000830152612f2a81612eee565b9050919050565b6000612f3c82612575565b9150612f4783612575565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f7c57612f7b612daa565b5b828201905092915050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000612fbd601c836124c5565b9150612fc882612f87565b602082019050919050565b60006020820190508181036000830152612fec81612fb0565b9050919050565b6000612ffe82612575565b915061300983612575565b92508282101561301c5761301b612daa565b5b828203905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613083602f836124c5565b915061308e82613027565b604082019050919050565b600060208201905081810360008301526130b281613076565b9050919050565b600081905092915050565b60006130cf826124ba565b6130d981856130b9565b93506130e98185602086016124d6565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061312b6005836130b9565b9150613136826130f5565b600582019050919050565b600061314d82856130c4565b915061315982846130c4565b91506131648261311e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006131cc6026836124c5565b91506131d782613170565b604082019050919050565b600060208201905081810360008301526131fb816131bf565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061322982613202565b613233818561320d565b93506132438185602086016124d6565b61324c81612509565b840191505092915050565b600060808201905061326c600083018761260a565b613279602083018661260a565b61328660408301856126a0565b8181036060830152613298818461321e565b905095945050505050565b6000815190506132b28161242b565b92915050565b6000602082840312156132ce576132cd6123f5565b5b60006132dc848285016132a3565b91505092915050565b60006132f082612575565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561332357613322612daa565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061336882612575565b915061337383612575565b9250826133835761338261332e565b5b828204905092915050565b600061339982612575565b91506133a483612575565b9250826133b4576133b361332e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212200fa60256fc5666ccc8c0fd7799fc19046334186b0824483c3461dd7b1927b2aa64736f6c634300080c0033697066733a2f2f516d504b316b52596e68717254686d78656a32644636375031626f587568474a32356163385750526247395a755a2f
Deployed Bytecode
0x6080604052600436106101b75760003560e01c8063715018a6116100ec578063c34278441161008a578063e7db8fb011610064578063e7db8fb0146105f1578063e985e9c51461061a578063f2fde38b14610657578063f47c84c514610680576101b7565b8063c342784414610560578063c87b56dd1461058b578063cc0b8d15146105c8576101b7565b806395d89b41116100c657806395d89b41146104ba578063a22cb465146104e5578063a854ffba1461050e578063b88d4fde14610537576101b7565b8063715018a61461045c5780638da5cb5b14610473578063926427441461049e576101b7565b80632e1a7d4d1161015957806355f804b31161013357806355f804b31461038e5780636352211e146103b75780636c0360eb146103f457806370a082311461041f576101b7565b80632e1a7d4d146103095780633c5e310b1461033257806342842e0e14610365576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a5780631c8b232d146102b557806323b872dd146102e0576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612457565b6106ab565b6040516101f0919061249f565b60405180910390f35b34801561020557600080fd5b5061020e61073d565b60405161021b9190612553565b60405180910390f35b34801561023057600080fd5b5061024b600480360381019061024691906125ab565b6107cf565b6040516102589190612619565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612660565b61084b565b005b34801561029657600080fd5b5061029f6109f2565b6040516102ac91906126af565b60405180910390f35b3480156102c157600080fd5b506102ca610a09565b6040516102d7919061249f565b60405180910390f35b3480156102ec57600080fd5b50610307600480360381019061030291906126ca565b610a1c565b005b34801561031557600080fd5b50610330600480360381019061032b91906125ab565b610a2c565b005b34801561033e57600080fd5b50610347610ae9565b60405161035c9998979695949392919061271d565b60405180910390f35b34801561037157600080fd5b5061038c600480360381019061038791906126ca565b610bca565b005b34801561039a57600080fd5b506103b560048036038101906103b091906128e6565b610bea565b005b3480156103c357600080fd5b506103de60048036038101906103d991906125ab565b610c80565b6040516103eb9190612619565b60405180910390f35b34801561040057600080fd5b50610409610c92565b6040516104169190612553565b60405180910390f35b34801561042b57600080fd5b506104466004803603810190610441919061292f565b610d20565b60405161045391906126af565b60405180910390f35b34801561046857600080fd5b50610471610dd9565b005b34801561047f57600080fd5b50610488610e61565b6040516104959190612619565b60405180910390f35b6104b860048036038101906104b391906125ab565b610e8b565b005b3480156104c657600080fd5b506104cf611098565b6040516104dc9190612553565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190612988565b61112a565b005b34801561051a57600080fd5b50610535600480360381019061053091906129c8565b6112a2565b005b34801561054357600080fd5b5061055e60048036038101906105599190612a96565b61133b565b005b34801561056c57600080fd5b506105756113ae565b60405161058291906126af565b60405180910390f35b34801561059757600080fd5b506105b260048036038101906105ad91906125ab565b6113b4565b6040516105bf9190612553565b60405180910390f35b3480156105d457600080fd5b506105ef60048036038101906105ea9190612b19565b61145b565b005b3480156105fd57600080fd5b50610618600480360381019061061391906125ab565b611543565b005b34801561062657600080fd5b50610641600480360381019061063c9190612b59565b6115c9565b60405161064e919061249f565b60405180910390f35b34801561066357600080fd5b5061067e6004803603810190610679919061292f565b61165d565b005b34801561068c57600080fd5b50610695611755565b6040516106a291906126af565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107365750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461074c90612bc8565b80601f016020809104026020016040519081016040528092919081815260200182805461077890612bc8565b80156107c55780601f1061079a576101008083540402835291602001916107c5565b820191906000526020600020905b8154815290600101906020018083116107a857829003601f168201915b5050505050905090565b60006107da8261175b565b610810576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610856826117ba565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108be576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108dd611888565b73ffffffffffffffffffffffffffffffffffffffff16146109405761090981610904611888565b6115c9565b61093f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109fc611890565b6001546000540303905090565b600f60009054906101000a900460ff1681565b610a27838383611899565b505050565b610a34611c43565b73ffffffffffffffffffffffffffffffffffffffff16610a52610e61565b73ffffffffffffffffffffffffffffffffffffffff1614610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90612c46565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610ae657600080fd5b50565b6060600080600080600080600080600a600b546000600954600c54600d54610b0f6109f2565b600f60009054906101000a900460ff166000888054610b2d90612bc8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5990612bc8565b8015610ba65780601f10610b7b57610100808354040283529160200191610ba6565b820191906000526020600020905b815481529060010190602001808311610b8957829003601f168201915b50505050509850985098509850985098509850985098509850909192939495969798565b610be58383836040518060200160405280600081525061133b565b505050565b610bf2611c43565b73ffffffffffffffffffffffffffffffffffffffff16610c10610e61565b73ffffffffffffffffffffffffffffffffffffffff1614610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d90612c46565b60405180910390fd5b8060109080519060200190610c7c929190612348565b5050565b6000610c8b826117ba565b9050919050565b60108054610c9f90612bc8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccb90612bc8565b8015610d185780601f10610ced57610100808354040283529160200191610d18565b820191906000526020600020905b815481529060010190602001808311610cfb57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d88576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610de1611c43565b73ffffffffffffffffffffffffffffffffffffffff16610dff610e61565b73ffffffffffffffffffffffffffffffffffffffff1614610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90612c46565b60405180910390fd5b610e5f6000611c4b565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60011515600f60009054906101000a900460ff16151514610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890612cb2565b60405180910390fd5b60008111610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b90612d1e565b60405180910390fd5b600b54811115610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090612d8a565b60405180910390fd5b6000610f7433610d20565b1415610f8457600e549050611072565b80600954610f929190612dd9565b341015610fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcb90612e7f565b60405180910390fd5b600c54811115611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090612f11565b60405180910390fd5b600d5461102533610d20565b826110309190612f31565b1115611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890612fd3565b60405180910390fd5b5b80600b60008282546110849190612ff3565b925050819055506110953382611d11565b50565b6060600380546110a790612bc8565b80601f01602080910402602001604051908101604052809291908181526020018280546110d390612bc8565b80156111205780601f106110f557610100808354040283529160200191611120565b820191906000526020600020905b81548152906001019060200180831161110357829003601f168201915b5050505050905090565b611132611888565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611197576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006111a4611888565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611251611888565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611296919061249f565b60405180910390a35050565b6112aa611c43565b73ffffffffffffffffffffffffffffffffffffffff166112c8610e61565b73ffffffffffffffffffffffffffffffffffffffff161461131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131590612c46565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b611346848484611899565b60008373ffffffffffffffffffffffffffffffffffffffff163b146113a85761137184848484611d2f565b6113a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60095481565b60606113bf8261175b565b6113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613099565b60405180910390fd5b6000611408611e80565b905060008151116114285760405180602001604052806000815250611453565b8061143284611f12565b604051602001611443929190613141565b6040516020818303038152906040525b915050919050565b611463611c43565b73ffffffffffffffffffffffffffffffffffffffff16611481610e61565b73ffffffffffffffffffffffffffffffffffffffff16146114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce90612c46565b60405180910390fd5b600b5482111561151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390612d8a565b60405180910390fd5b81600b600082825461152e9190612ff3565b9250508190555061153f8183611d11565b5050565b61154b611c43565b73ffffffffffffffffffffffffffffffffffffffff16611569610e61565b73ffffffffffffffffffffffffffffffffffffffff16146115bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b690612c46565b60405180910390fd5b80600e8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611665611c43565b73ffffffffffffffffffffffffffffffffffffffff16611683610e61565b73ffffffffffffffffffffffffffffffffffffffff16146116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d090612c46565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611740906131e2565b60405180910390fd5b61175281611c4b565b50565b61138881565b600081611766611890565b11158015611775575060005482105b80156117b3575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806117c9611890565b11611851576000548110156118505760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561184e575b6000811415611844576004600083600190039350838152602001908152602001600020549050611819565b8092505050611883565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b60006118a4826117ba565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461190b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661192c611888565b73ffffffffffffffffffffffffffffffffffffffff16148061195b575061195a85611955611888565b6115c9565b5b806119a05750611969611888565b73ffffffffffffffffffffffffffffffffffffffff16611988846107cf565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806119d9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a40576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a4d8585856001612073565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611b4a86612079565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611bd4576000600184019050600060046000838152602001908152602001600020541415611bd2576000548114611bd1578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c3c8585856001612083565b5050505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d2b828260405180602001604052806000815250612089565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d55611888565b8786866040518563ffffffff1660e01b8152600401611d779493929190613257565b6020604051808303816000875af1925050508015611db357506040513d601f19601f82011682018060405250810190611db091906132b8565b60015b611e2d573d8060008114611de3576040519150601f19603f3d011682016040523d82523d6000602084013e611de8565b606091505b50600081511415611e25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060108054611e8f90612bc8565b80601f0160208091040260200160405190810160405280929190818152602001828054611ebb90612bc8565b8015611f085780601f10611edd57610100808354040283529160200191611f08565b820191906000526020600020905b815481529060010190602001808311611eeb57829003601f168201915b5050505050905090565b60606000821415611f5a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061206e565b600082905060005b60008214611f8c578080611f75906132e5565b915050600a82611f85919061335d565b9150611f62565b60008167ffffffffffffffff811115611fa857611fa76127bb565b5b6040519080825280601f01601f191660200182016040528015611fda5781602001600182028036833780820191505090505b5090505b6000851461206757600182611ff39190612ff3565b9150600a85612002919061338e565b603061200e9190612f31565b60f81b818381518110612024576120236133bf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612060919061335d565b9450611fde565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120f6576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612131576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61213e6000858386612073565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16121a36001851461233e565b901b60a042901b6121b386612079565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146122b7575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122676000878480600101955087611d2f565b61229d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106121f85782600054146122b257600080fd5b612322565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106122b8575b8160008190555050506123386000858386612083565b50505050565b6000819050919050565b82805461235490612bc8565b90600052602060002090601f01602090048101928261237657600085556123bd565b82601f1061238f57805160ff19168380011785556123bd565b828001600101855582156123bd579182015b828111156123bc5782518255916020019190600101906123a1565b5b5090506123ca91906123ce565b5090565b5b808211156123e75760008160009055506001016123cf565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612434816123ff565b811461243f57600080fd5b50565b6000813590506124518161242b565b92915050565b60006020828403121561246d5761246c6123f5565b5b600061247b84828501612442565b91505092915050565b60008115159050919050565b61249981612484565b82525050565b60006020820190506124b46000830184612490565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124f45780820151818401526020810190506124d9565b83811115612503576000848401525b50505050565b6000601f19601f8301169050919050565b6000612525826124ba565b61252f81856124c5565b935061253f8185602086016124d6565b61254881612509565b840191505092915050565b6000602082019050818103600083015261256d818461251a565b905092915050565b6000819050919050565b61258881612575565b811461259357600080fd5b50565b6000813590506125a58161257f565b92915050565b6000602082840312156125c1576125c06123f5565b5b60006125cf84828501612596565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612603826125d8565b9050919050565b612613816125f8565b82525050565b600060208201905061262e600083018461260a565b92915050565b61263d816125f8565b811461264857600080fd5b50565b60008135905061265a81612634565b92915050565b60008060408385031215612677576126766123f5565b5b60006126858582860161264b565b925050602061269685828601612596565b9150509250929050565b6126a981612575565b82525050565b60006020820190506126c460008301846126a0565b92915050565b6000806000606084860312156126e3576126e26123f5565b5b60006126f18682870161264b565b93505060206127028682870161264b565b925050604061271386828701612596565b9150509250925092565b6000610120820190508181036000830152612738818c61251a565b9050612747602083018b6126a0565b612754604083018a6126a0565b61276160608301896126a0565b61276e60808301886126a0565b61277b60a08301876126a0565b61278860c08301866126a0565b61279560e0830185612490565b6127a3610100830184612490565b9a9950505050505050505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6127f382612509565b810181811067ffffffffffffffff82111715612812576128116127bb565b5b80604052505050565b60006128256123eb565b905061283182826127ea565b919050565b600067ffffffffffffffff821115612851576128506127bb565b5b61285a82612509565b9050602081019050919050565b82818337600083830152505050565b600061288961288484612836565b61281b565b9050828152602081018484840111156128a5576128a46127b6565b5b6128b0848285612867565b509392505050565b600082601f8301126128cd576128cc6127b1565b5b81356128dd848260208601612876565b91505092915050565b6000602082840312156128fc576128fb6123f5565b5b600082013567ffffffffffffffff81111561291a576129196123fa565b5b612926848285016128b8565b91505092915050565b600060208284031215612945576129446123f5565b5b60006129538482850161264b565b91505092915050565b61296581612484565b811461297057600080fd5b50565b6000813590506129828161295c565b92915050565b6000806040838503121561299f5761299e6123f5565b5b60006129ad8582860161264b565b92505060206129be85828601612973565b9150509250929050565b6000602082840312156129de576129dd6123f5565b5b60006129ec84828501612973565b91505092915050565b600067ffffffffffffffff821115612a1057612a0f6127bb565b5b612a1982612509565b9050602081019050919050565b6000612a39612a34846129f5565b61281b565b905082815260208101848484011115612a5557612a546127b6565b5b612a60848285612867565b509392505050565b600082601f830112612a7d57612a7c6127b1565b5b8135612a8d848260208601612a26565b91505092915050565b60008060008060808587031215612ab057612aaf6123f5565b5b6000612abe8782880161264b565b9450506020612acf8782880161264b565b9350506040612ae087828801612596565b925050606085013567ffffffffffffffff811115612b0157612b006123fa565b5b612b0d87828801612a68565b91505092959194509250565b60008060408385031215612b3057612b2f6123f5565b5b6000612b3e85828601612596565b9250506020612b4f8582860161264b565b9150509250929050565b60008060408385031215612b7057612b6f6123f5565b5b6000612b7e8582860161264b565b9250506020612b8f8582860161264b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612be057607f821691505b60208210811415612bf457612bf3612b99565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c306020836124c5565b9150612c3b82612bfa565b602082019050919050565b60006020820190508181036000830152612c5f81612c23565b9050919050565b7f53616c65206861736e2774207374617274656400000000000000000000000000600082015250565b6000612c9c6013836124c5565b9150612ca782612c66565b602082019050919050565b60006020820190508181036000830152612ccb81612c8f565b9050919050565b7f4e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6000612d08601b836124c5565b9150612d1382612cd2565b602082019050919050565b60006020820190508181036000830152612d3781612cfb565b9050919050565b7f5765277265206174206d617820737570706c7921000000000000000000000000600082015250565b6000612d746014836124c5565b9150612d7f82612d3e565b602082019050919050565b60006020820190508181036000830152612da381612d67565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612de482612575565b9150612def83612575565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e2857612e27612daa565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000612e696012836124c5565b9150612e7482612e33565b602082019050919050565b60006020820190508181036000830152612e9881612e5c565b9050919050565b7f4d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e2060008201527f6578636565646564000000000000000000000000000000000000000000000000602082015250565b6000612efb6028836124c5565b9150612f0682612e9f565b604082019050919050565b60006020820190508181036000830152612f2a81612eee565b9050919050565b6000612f3c82612575565b9150612f4783612575565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f7c57612f7b612daa565b5b828201905092915050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000612fbd601c836124c5565b9150612fc882612f87565b602082019050919050565b60006020820190508181036000830152612fec81612fb0565b9050919050565b6000612ffe82612575565b915061300983612575565b92508282101561301c5761301b612daa565b5b828203905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613083602f836124c5565b915061308e82613027565b604082019050919050565b600060208201905081810360008301526130b281613076565b9050919050565b600081905092915050565b60006130cf826124ba565b6130d981856130b9565b93506130e98185602086016124d6565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061312b6005836130b9565b9150613136826130f5565b600582019050919050565b600061314d82856130c4565b915061315982846130c4565b91506131648261311e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006131cc6026836124c5565b91506131d782613170565b604082019050919050565b600060208201905081810360008301526131fb816131bf565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061322982613202565b613233818561320d565b93506132438185602086016124d6565b61324c81612509565b840191505092915050565b600060808201905061326c600083018761260a565b613279602083018661260a565b61328660408301856126a0565b8181036060830152613298818461321e565b905095945050505050565b6000815190506132b28161242b565b92915050565b6000602082840312156132ce576132cd6123f5565b5b60006132dc848285016132a3565b91505092915050565b60006132f082612575565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561332357613322612daa565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061336882612575565b915061337383612575565b9250826133835761338261332e565b5b828204905092915050565b600061339982612575565b91506133a483612575565b9250826133b4576133b361332e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212200fa60256fc5666ccc8c0fd7799fc19046334186b0824483c3461dd7b1927b2aa64736f6c634300080c0033
Deployed Bytecode Sourcemap
45797:2842:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17038:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22051:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24119:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23579:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16092:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46194:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25005:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48444:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47385:251;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;25246:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48124:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21840:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46234:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17717:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44918:103;;;;;;;;;;;;;:::i;:::-;;44267:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46596:781;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22220:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24395:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48549:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25502:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45918:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47641:354;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48224:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48030:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24774:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45176:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45873:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17038:615;17123:4;17438:10;17423:25;;:11;:25;;;;:102;;;;17515:10;17500:25;;:11;:25;;;;17423:102;:179;;;;17592:10;17577:25;;:11;:25;;;;17423:179;17403:199;;17038:615;;;:::o;22051:100::-;22105:13;22138:5;22131:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22051:100;:::o;24119:204::-;24187:7;24212:16;24220:7;24212;:16::i;:::-;24207:64;;24237:34;;;;;;;;;;;;;;24207:64;24291:15;:24;24307:7;24291:24;;;;;;;;;;;;;;;;;;;;;24284:31;;24119:204;;;:::o;23579:474::-;23652:13;23684:27;23703:7;23684:18;:27::i;:::-;23652:61;;23734:5;23728:11;;:2;:11;;;23724:48;;;23748:24;;;;;;;;;;;;;;23724:48;23812:5;23789:28;;:19;:17;:19::i;:::-;:28;;;23785:175;;23837:44;23854:5;23861:19;:17;:19::i;:::-;23837:16;:44::i;:::-;23832:128;;23909:35;;;;;;;;;;;;;;23832:128;23785:175;23999:2;23972:15;:24;23988:7;23972:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24037:7;24033:2;24017:28;;24026:5;24017:28;;;;;;;;;;;;23641:412;23579:474;;:::o;16092:315::-;16145:7;16373:15;:13;:15::i;:::-;16358:12;;16342:13;;:28;:46;16335:53;;16092:315;:::o;46194:33::-;;;;;;;;;;;;;:::o;25005:170::-;25139:28;25149:4;25155:2;25159:7;25139:9;:28::i;:::-;25005:170;;;:::o;48444:99::-;44498:12;:10;:12::i;:::-;44487:23;;:7;:5;:7::i;:::-;:23;;;44479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48513:10:::1;48505:24;;:32;48530:6;48505:32;;;;;;;;;;;;;;;;;;;;;;;48497:41;;;::::0;::::1;;48444:99:::0;:::o;47385:251::-;47435:13;47450:4;47456;47462;47468;47473;47478;47484;47489;47510:15;47526:17;;47544:1;47546:14;;47561:13;;47575:18;;47595:13;:11;:13::i;:::-;47610:14;;;;;;;;;;;47625:5;47502:129;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47385:251;;;;;;;;;:::o;25246:185::-;25384:39;25401:4;25407:2;25411:7;25384:39;;;;;;;;;;;;:16;:39::i;:::-;25246:185;;;:::o;48124:95::-;44498:12;:10;:12::i;:::-;44487:23;;:7;:5;:7::i;:::-;:23;;;44479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48203:11:::1;48193:7;:21;;;;;;;;;;;;:::i;:::-;;48124:95:::0;:::o;21840:144::-;21904:7;21947:27;21966:7;21947:18;:27::i;:::-;21924:52;;21840:144;;;:::o;46234:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17717:224::-;17781:7;17822:1;17805:19;;:5;:19;;;17801:60;;;17833:28;;;;;;;;;;;;;;17801:60;13056:13;17879:18;:25;17898:5;17879:25;;;;;;;;;;;;;;;;:54;17872:61;;17717:224;;;:::o;44918:103::-;44498:12;:10;:12::i;:::-;44487:23;;:7;:5;:7::i;:::-;:23;;;44479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44983:30:::1;45010:1;44983:18;:30::i;:::-;44918:103::o:0;44267:87::-;44313:7;44340:6;;;;;;;;;;;44333:13;;44267:87;:::o;46596:781::-;46683:4;46665:22;;:14;;;;;;;;;;;:22;;;46657:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;46738:1;46724:11;:15;46716:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;46805:17;;46790:11;:32;;46782:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;46900:1;46875:21;46885:10;46875:9;:21::i;:::-;:26;46872:419;;;46941:9;;46927:23;;46872:419;;;47039:11;47022:14;;:28;;;;:::i;:::-;47009:9;:41;;47001:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;47111:13;;47096:11;:28;;47088:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47228:18;;47202:21;47212:10;47202:9;:21::i;:::-;47187:11;:36;;;;:::i;:::-;47186:60;;47178:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;46872:419;47318:11;47297:17;;:32;;;;;;;:::i;:::-;;;;;;;;47334:34;47344:10;47356:11;47334:9;:34::i;:::-;46596:781;:::o;22220:104::-;22276:13;22309:7;22302:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22220:104;:::o;24395:308::-;24506:19;:17;:19::i;:::-;24494:31;;:8;:31;;;24490:61;;;24534:17;;;;;;;;;;;;;;24490:61;24616:8;24564:18;:39;24583:19;:17;:19::i;:::-;24564:39;;;;;;;;;;;;;;;:49;24604:8;24564:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;24676:8;24640:55;;24655:19;:17;:19::i;:::-;24640:55;;;24686:8;24640:55;;;;;;:::i;:::-;;;;;;;;24395:308;;:::o;48549:87::-;44498:12;:10;:12::i;:::-;44487:23;;:7;:5;:7::i;:::-;:23;;;44479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48625:6:::1;48608:14;;:23;;;;;;;;;;;;;;;;;;48549:87:::0;:::o;25502:396::-;25669:28;25679:4;25685:2;25689:7;25669:9;:28::i;:::-;25730:1;25712:2;:14;;;:19;25708:183;;25751:56;25782:4;25788:2;25792:7;25801:5;25751:30;:56::i;:::-;25746:145;;25835:40;;;;;;;;;;;;;;25746:145;25708:183;25502:396;;;;:::o;45918:40::-;;;;:::o;47641:354::-;47715:13;47743:17;47751:8;47743:7;:17::i;:::-;47735:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;47819:28;47850:10;:8;:10::i;:::-;47819:41;;47903:1;47878:14;47872:28;:32;:118;;;;;;;;;;;;;;;;;47935:14;47951:19;:8;:17;:19::i;:::-;47918:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47872:118;47865:125;;;47641:354;;;:::o;48224:215::-;44498:12;:10;:12::i;:::-;44487:23;;:7;:5;:7::i;:::-;:23;;;44479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48321:17:::1;;48308:9;:30;;48300:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48389:9;48368:17;;:30;;;;;;;:::i;:::-;;;;;;;;48403:31;48413:9;48424;48403;:31::i;:::-;48224:215:::0;;:::o;48030:91::-;44498:12;:10;:12::i;:::-;44487:23;;:7;:5;:7::i;:::-;:23;;;44479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48107:6:::1;48095:9;:18;;;;48030:91:::0;:::o;24774:164::-;24871:4;24895:18;:25;24914:5;24895:25;;;;;;;;;;;;;;;:35;24921:8;24895:35;;;;;;;;;;;;;;;;;;;;;;;;;24888:42;;24774:164;;;;:::o;45176:201::-;44498:12;:10;:12::i;:::-;44487:23;;:7;:5;:7::i;:::-;:23;;;44479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45285:1:::1;45265:22;;:8;:22;;;;45257:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45341:28;45360:8;45341:18;:28::i;:::-;45176:201:::0;:::o;45873:38::-;45907:4;45873:38;:::o;26153:273::-;26210:4;26266:7;26247:15;:13;:15::i;:::-;:26;;:66;;;;;26300:13;;26290:7;:23;26247:66;:152;;;;;26398:1;13826:8;26351:17;:26;26369:7;26351:26;;;;;;;;;;;;:43;:48;26247:152;26227:172;;26153:273;;;:::o;19355:1129::-;19422:7;19442:12;19457:7;19442:22;;19525:4;19506:15;:13;:15::i;:::-;:23;19502:915;;19559:13;;19552:4;:20;19548:869;;;19597:14;19614:17;:23;19632:4;19614:23;;;;;;;;;;;;19597:40;;19730:1;13826:8;19703:6;:23;:28;19699:699;;;20222:113;20239:1;20229:6;:11;20222:113;;;20282:17;:25;20300:6;;;;;;;20282:25;;;;;;;;;;;;20273:34;;20222:113;;;20368:6;20361:13;;;;;;19699:699;19574:843;19548:869;19502:915;20445:31;;;;;;;;;;;;;;19355:1129;;;;:::o;40135:105::-;40195:7;40222:10;40215:17;;40135:105;:::o;46499:92::-;46564:7;46585:1;46578:8;;46499:92;:::o;31392:2515::-;31507:27;31537;31556:7;31537:18;:27::i;:::-;31507:57;;31622:4;31581:45;;31597:19;31581:45;;;31577:86;;31635:28;;;;;;;;;;;;;;31577:86;31676:22;31725:4;31702:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;31746:43;31763:4;31769:19;:17;:19::i;:::-;31746:16;:43::i;:::-;31702:87;:147;;;;31830:19;:17;:19::i;:::-;31806:43;;:20;31818:7;31806:11;:20::i;:::-;:43;;;31702:147;31676:174;;31868:17;31863:66;;31894:35;;;;;;;;;;;;;;31863:66;31958:1;31944:16;;:2;:16;;;31940:52;;;31969:23;;;;;;;;;;;;;;31940:52;32005:43;32027:4;32033:2;32037:7;32046:1;32005:21;:43::i;:::-;32121:15;:24;32137:7;32121:24;;;;;;;;;;;;32114:31;;;;;;;;;;;32513:18;:24;32532:4;32513:24;;;;;;;;;;;;;;;;32511:26;;;;;;;;;;;;32582:18;:22;32601:2;32582:22;;;;;;;;;;;;;;;;32580:24;;;;;;;;;;;14108:8;13710:3;32963:15;:41;;32921:21;32939:2;32921:17;:21::i;:::-;:84;:128;32875:17;:26;32893:7;32875:26;;;;;;;;;;;:174;;;;33219:1;14108:8;33169:19;:46;:51;33165:626;;;33241:19;33273:1;33263:7;:11;33241:33;;33430:1;33396:17;:30;33414:11;33396:30;;;;;;;;;;;;:35;33392:384;;;33534:13;;33519:11;:28;33515:242;;33714:19;33681:17;:30;33699:11;33681:30;;;;;;;;;;;:52;;;;33515:242;33392:384;33222:569;33165:626;33838:7;33834:2;33819:27;;33828:4;33819:27;;;;;;;;;;;;33857:42;33878:4;33884:2;33888:7;33897:1;33857:20;:42::i;:::-;31496:2411;;31392:2515;;;:::o;42991:98::-;43044:7;43071:10;43064:17;;42991:98;:::o;45537:191::-;45611:16;45630:6;;;;;;;;;;;45611:25;;45656:8;45647:6;;:17;;;;;;;;;;;;;;;;;;45711:8;45680:40;;45701:8;45680:40;;;;;;;;;;;;45600:128;45537:191;:::o;26510:104::-;26579:27;26589:2;26593:8;26579:27;;;;;;;;;;;;:9;:27::i;:::-;26510:104;;:::o;37604:716::-;37767:4;37813:2;37788:45;;;37834:19;:17;:19::i;:::-;37855:4;37861:7;37870:5;37788:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37784:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38088:1;38071:6;:13;:18;38067:235;;;38117:40;;;;;;;;;;;;;;38067:235;38260:6;38254:13;38245:6;38241:2;38237:15;38230:38;37784:529;37957:54;;;37947:64;;;:6;:64;;;;37940:71;;;37604:716;;;;;;:::o;46395:99::-;46455:13;46482:7;46475:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46395:99;:::o;2206:723::-;2262:13;2492:1;2483:5;:10;2479:53;;;2510:10;;;;;;;;;;;;;;;;;;;;;2479:53;2542:12;2557:5;2542:20;;2573:14;2598:78;2613:1;2605:4;:9;2598:78;;2631:8;;;;;:::i;:::-;;;;2662:2;2654:10;;;;;:::i;:::-;;;2598:78;;;2686:19;2718:6;2708:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2686:39;;2736:154;2752:1;2743:5;:10;2736:154;;2780:1;2770:11;;;;;:::i;:::-;;;2847:2;2839:5;:10;;;;:::i;:::-;2826:2;:24;;;;:::i;:::-;2813:39;;2796:6;2803;2796:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2876:2;2867:11;;;;;:::i;:::-;;;2736:154;;;2914:6;2900:21;;;;;2206:723;;;;:::o;38968:159::-;;;;;:::o;23140:148::-;23204:14;23265:5;23255:15;;23140:148;;;:::o;39786:158::-;;;;;:::o;26987:2236::-;27110:20;27133:13;;27110:36;;27175:1;27161:16;;:2;:16;;;27157:48;;;27186:19;;;;;;;;;;;;;;27157:48;27232:1;27220:8;:13;27216:44;;;27242:18;;;;;;;;;;;;;;27216:44;27273:61;27303:1;27307:2;27311:12;27325:8;27273:21;:61::i;:::-;27877:1;13193:2;27848:1;:25;;27847:31;27835:8;:44;27809:18;:22;27828:2;27809:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;13973:3;28278:29;28305:1;28293:8;:13;28278:14;:29::i;:::-;:56;;13710:3;28215:15;:41;;28173:21;28191:2;28173:17;:21::i;:::-;:84;:162;28122:17;:31;28140:12;28122:31;;;;;;;;;;;:213;;;;28352:20;28375:12;28352:35;;28402:11;28431:8;28416:12;:23;28402:37;;28478:1;28460:2;:14;;;:19;28456:635;;28500:313;28556:12;28552:2;28531:38;;28548:1;28531:38;;;;;;;;;;;;28597:69;28636:1;28640:2;28644:14;;;;;;28660:5;28597:30;:69::i;:::-;28592:174;;28702:40;;;;;;;;;;;;;;28592:174;28808:3;28793:12;:18;28500:313;;28894:12;28877:13;;:29;28873:43;;28908:8;;;28873:43;28456:635;;;28957:119;29013:14;;;;;;29009:2;28988:40;;29005:1;28988:40;;;;;;;;;;;;29071:3;29056:12;:18;28957:119;;28456:635;29121:12;29105:13;:28;;;;27586:1559;;29155:60;29184:1;29188:2;29192:12;29206:8;29155:20;:60::i;:::-;27099:2124;26987:2236;;;:::o;23375:142::-;23433:14;23494:5;23484:15;;23375:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:1175::-;6240:4;6278:3;6267:9;6263:19;6255:27;;6328:9;6322:4;6318:20;6314:1;6303:9;6299:17;6292:47;6356:78;6429:4;6420:6;6356:78;:::i;:::-;6348:86;;6444:72;6512:2;6501:9;6497:18;6488:6;6444:72;:::i;:::-;6526;6594:2;6583:9;6579:18;6570:6;6526:72;:::i;:::-;6608;6676:2;6665:9;6661:18;6652:6;6608:72;:::i;:::-;6690:73;6758:3;6747:9;6743:19;6734:6;6690:73;:::i;:::-;6773;6841:3;6830:9;6826:19;6817:6;6773:73;:::i;:::-;6856;6924:3;6913:9;6909:19;6900:6;6856:73;:::i;:::-;6939:67;7001:3;6990:9;6986:19;6977:6;6939:67;:::i;:::-;7016;7078:3;7067:9;7063:19;7054:6;7016:67;:::i;:::-;5915:1175;;;;;;;;;;;;:::o;7096:117::-;7205:1;7202;7195:12;7219:117;7328:1;7325;7318:12;7342:180;7390:77;7387:1;7380:88;7487:4;7484:1;7477:15;7511:4;7508:1;7501:15;7528:281;7611:27;7633:4;7611:27;:::i;:::-;7603:6;7599:40;7741:6;7729:10;7726:22;7705:18;7693:10;7690:34;7687:62;7684:88;;;7752:18;;:::i;:::-;7684:88;7792:10;7788:2;7781:22;7571:238;7528:281;;:::o;7815:129::-;7849:6;7876:20;;:::i;:::-;7866:30;;7905:33;7933:4;7925:6;7905:33;:::i;:::-;7815:129;;;:::o;7950:308::-;8012:4;8102:18;8094:6;8091:30;8088:56;;;8124:18;;:::i;:::-;8088:56;8162:29;8184:6;8162:29;:::i;:::-;8154:37;;8246:4;8240;8236:15;8228:23;;7950:308;;;:::o;8264:154::-;8348:6;8343:3;8338;8325:30;8410:1;8401:6;8396:3;8392:16;8385:27;8264:154;;;:::o;8424:412::-;8502:5;8527:66;8543:49;8585:6;8543:49;:::i;:::-;8527:66;:::i;:::-;8518:75;;8616:6;8609:5;8602:21;8654:4;8647:5;8643:16;8692:3;8683:6;8678:3;8674:16;8671:25;8668:112;;;8699:79;;:::i;:::-;8668:112;8789:41;8823:6;8818:3;8813;8789:41;:::i;:::-;8508:328;8424:412;;;;;:::o;8856:340::-;8912:5;8961:3;8954:4;8946:6;8942:17;8938:27;8928:122;;8969:79;;:::i;:::-;8928:122;9086:6;9073:20;9111:79;9186:3;9178:6;9171:4;9163:6;9159:17;9111:79;:::i;:::-;9102:88;;8918:278;8856:340;;;;:::o;9202:509::-;9271:6;9320:2;9308:9;9299:7;9295:23;9291:32;9288:119;;;9326:79;;:::i;:::-;9288:119;9474:1;9463:9;9459:17;9446:31;9504:18;9496:6;9493:30;9490:117;;;9526:79;;:::i;:::-;9490:117;9631:63;9686:7;9677:6;9666:9;9662:22;9631:63;:::i;:::-;9621:73;;9417:287;9202:509;;;;:::o;9717:329::-;9776:6;9825:2;9813:9;9804:7;9800:23;9796:32;9793:119;;;9831:79;;:::i;:::-;9793:119;9951:1;9976:53;10021:7;10012:6;10001:9;9997:22;9976:53;:::i;:::-;9966:63;;9922:117;9717:329;;;;:::o;10052:116::-;10122:21;10137:5;10122:21;:::i;:::-;10115:5;10112:32;10102:60;;10158:1;10155;10148:12;10102:60;10052:116;:::o;10174:133::-;10217:5;10255:6;10242:20;10233:29;;10271:30;10295:5;10271:30;:::i;:::-;10174:133;;;;:::o;10313:468::-;10378:6;10386;10435:2;10423:9;10414:7;10410:23;10406:32;10403:119;;;10441:79;;:::i;:::-;10403:119;10561:1;10586:53;10631:7;10622:6;10611:9;10607:22;10586:53;:::i;:::-;10576:63;;10532:117;10688:2;10714:50;10756:7;10747:6;10736:9;10732:22;10714:50;:::i;:::-;10704:60;;10659:115;10313:468;;;;;:::o;10787:323::-;10843:6;10892:2;10880:9;10871:7;10867:23;10863:32;10860:119;;;10898:79;;:::i;:::-;10860:119;11018:1;11043:50;11085:7;11076:6;11065:9;11061:22;11043:50;:::i;:::-;11033:60;;10989:114;10787:323;;;;:::o;11116:307::-;11177:4;11267:18;11259:6;11256:30;11253:56;;;11289:18;;:::i;:::-;11253:56;11327:29;11349:6;11327:29;:::i;:::-;11319:37;;11411:4;11405;11401:15;11393:23;;11116:307;;;:::o;11429:410::-;11506:5;11531:65;11547:48;11588:6;11547:48;:::i;:::-;11531:65;:::i;:::-;11522:74;;11619:6;11612:5;11605:21;11657:4;11650:5;11646:16;11695:3;11686:6;11681:3;11677:16;11674:25;11671:112;;;11702:79;;:::i;:::-;11671:112;11792:41;11826:6;11821:3;11816;11792:41;:::i;:::-;11512:327;11429:410;;;;;:::o;11858:338::-;11913:5;11962:3;11955:4;11947:6;11943:17;11939:27;11929:122;;11970:79;;:::i;:::-;11929:122;12087:6;12074:20;12112:78;12186:3;12178:6;12171:4;12163:6;12159:17;12112:78;:::i;:::-;12103:87;;11919:277;11858:338;;;;:::o;12202:943::-;12297:6;12305;12313;12321;12370:3;12358:9;12349:7;12345:23;12341:33;12338:120;;;12377:79;;:::i;:::-;12338:120;12497:1;12522:53;12567:7;12558:6;12547:9;12543:22;12522:53;:::i;:::-;12512:63;;12468:117;12624:2;12650:53;12695:7;12686:6;12675:9;12671:22;12650:53;:::i;:::-;12640:63;;12595:118;12752:2;12778:53;12823:7;12814:6;12803:9;12799:22;12778:53;:::i;:::-;12768:63;;12723:118;12908:2;12897:9;12893:18;12880:32;12939:18;12931:6;12928:30;12925:117;;;12961:79;;:::i;:::-;12925:117;13066:62;13120:7;13111:6;13100:9;13096:22;13066:62;:::i;:::-;13056:72;;12851:287;12202:943;;;;;;;:::o;13151:474::-;13219:6;13227;13276:2;13264:9;13255:7;13251:23;13247:32;13244:119;;;13282:79;;:::i;:::-;13244:119;13402:1;13427:53;13472:7;13463:6;13452:9;13448:22;13427:53;:::i;:::-;13417:63;;13373:117;13529:2;13555:53;13600:7;13591:6;13580:9;13576:22;13555:53;:::i;:::-;13545:63;;13500:118;13151:474;;;;;:::o;13631:::-;13699:6;13707;13756:2;13744:9;13735:7;13731:23;13727:32;13724:119;;;13762:79;;:::i;:::-;13724:119;13882:1;13907:53;13952:7;13943:6;13932:9;13928:22;13907:53;:::i;:::-;13897:63;;13853:117;14009:2;14035:53;14080:7;14071:6;14060:9;14056:22;14035:53;:::i;:::-;14025:63;;13980:118;13631:474;;;;;:::o;14111:180::-;14159:77;14156:1;14149:88;14256:4;14253:1;14246:15;14280:4;14277:1;14270:15;14297:320;14341:6;14378:1;14372:4;14368:12;14358:22;;14425:1;14419:4;14415:12;14446:18;14436:81;;14502:4;14494:6;14490:17;14480:27;;14436:81;14564:2;14556:6;14553:14;14533:18;14530:38;14527:84;;;14583:18;;:::i;:::-;14527:84;14348:269;14297:320;;;:::o;14623:182::-;14763:34;14759:1;14751:6;14747:14;14740:58;14623:182;:::o;14811:366::-;14953:3;14974:67;15038:2;15033:3;14974:67;:::i;:::-;14967:74;;15050:93;15139:3;15050:93;:::i;:::-;15168:2;15163:3;15159:12;15152:19;;14811:366;;;:::o;15183:419::-;15349:4;15387:2;15376:9;15372:18;15364:26;;15436:9;15430:4;15426:20;15422:1;15411:9;15407:17;15400:47;15464:131;15590:4;15464:131;:::i;:::-;15456:139;;15183:419;;;:::o;15608:169::-;15748:21;15744:1;15736:6;15732:14;15725:45;15608:169;:::o;15783:366::-;15925:3;15946:67;16010:2;16005:3;15946:67;:::i;:::-;15939:74;;16022:93;16111:3;16022:93;:::i;:::-;16140:2;16135:3;16131:12;16124:19;;15783:366;;;:::o;16155:419::-;16321:4;16359:2;16348:9;16344:18;16336:26;;16408:9;16402:4;16398:20;16394:1;16383:9;16379:17;16372:47;16436:131;16562:4;16436:131;:::i;:::-;16428:139;;16155:419;;;:::o;16580:177::-;16720:29;16716:1;16708:6;16704:14;16697:53;16580:177;:::o;16763:366::-;16905:3;16926:67;16990:2;16985:3;16926:67;:::i;:::-;16919:74;;17002:93;17091:3;17002:93;:::i;:::-;17120:2;17115:3;17111:12;17104:19;;16763:366;;;:::o;17135:419::-;17301:4;17339:2;17328:9;17324:18;17316:26;;17388:9;17382:4;17378:20;17374:1;17363:9;17359:17;17352:47;17416:131;17542:4;17416:131;:::i;:::-;17408:139;;17135:419;;;:::o;17560:170::-;17700:22;17696:1;17688:6;17684:14;17677:46;17560:170;:::o;17736:366::-;17878:3;17899:67;17963:2;17958:3;17899:67;:::i;:::-;17892:74;;17975:93;18064:3;17975:93;:::i;:::-;18093:2;18088:3;18084:12;18077:19;;17736:366;;;:::o;18108:419::-;18274:4;18312:2;18301:9;18297:18;18289:26;;18361:9;18355:4;18351:20;18347:1;18336:9;18332:17;18325:47;18389:131;18515:4;18389:131;:::i;:::-;18381:139;;18108:419;;;:::o;18533:180::-;18581:77;18578:1;18571:88;18678:4;18675:1;18668:15;18702:4;18699:1;18692:15;18719:348;18759:7;18782:20;18800:1;18782:20;:::i;:::-;18777:25;;18816:20;18834:1;18816:20;:::i;:::-;18811:25;;19004:1;18936:66;18932:74;18929:1;18926:81;18921:1;18914:9;18907:17;18903:105;18900:131;;;19011:18;;:::i;:::-;18900:131;19059:1;19056;19052:9;19041:20;;18719:348;;;;:::o;19073:168::-;19213:20;19209:1;19201:6;19197:14;19190:44;19073:168;:::o;19247:366::-;19389:3;19410:67;19474:2;19469:3;19410:67;:::i;:::-;19403:74;;19486:93;19575:3;19486:93;:::i;:::-;19604:2;19599:3;19595:12;19588:19;;19247:366;;;:::o;19619:419::-;19785:4;19823:2;19812:9;19808:18;19800:26;;19872:9;19866:4;19862:20;19858:1;19847:9;19843:17;19836:47;19900:131;20026:4;19900:131;:::i;:::-;19892:139;;19619:419;;;:::o;20044:227::-;20184:34;20180:1;20172:6;20168:14;20161:58;20253:10;20248:2;20240:6;20236:15;20229:35;20044:227;:::o;20277:366::-;20419:3;20440:67;20504:2;20499:3;20440:67;:::i;:::-;20433:74;;20516:93;20605:3;20516:93;:::i;:::-;20634:2;20629:3;20625:12;20618:19;;20277:366;;;:::o;20649:419::-;20815:4;20853:2;20842:9;20838:18;20830:26;;20902:9;20896:4;20892:20;20888:1;20877:9;20873:17;20866:47;20930:131;21056:4;20930:131;:::i;:::-;20922:139;;20649:419;;;:::o;21074:305::-;21114:3;21133:20;21151:1;21133:20;:::i;:::-;21128:25;;21167:20;21185:1;21167:20;:::i;:::-;21162:25;;21321:1;21253:66;21249:74;21246:1;21243:81;21240:107;;;21327:18;;:::i;:::-;21240:107;21371:1;21368;21364:9;21357:16;;21074:305;;;;:::o;21385:178::-;21525:30;21521:1;21513:6;21509:14;21502:54;21385:178;:::o;21569:366::-;21711:3;21732:67;21796:2;21791:3;21732:67;:::i;:::-;21725:74;;21808:93;21897:3;21808:93;:::i;:::-;21926:2;21921:3;21917:12;21910:19;;21569:366;;;:::o;21941:419::-;22107:4;22145:2;22134:9;22130:18;22122:26;;22194:9;22188:4;22184:20;22180:1;22169:9;22165:17;22158:47;22222:131;22348:4;22222:131;:::i;:::-;22214:139;;21941:419;;;:::o;22366:191::-;22406:4;22426:20;22444:1;22426:20;:::i;:::-;22421:25;;22460:20;22478:1;22460:20;:::i;:::-;22455:25;;22499:1;22496;22493:8;22490:34;;;22504:18;;:::i;:::-;22490:34;22549:1;22546;22542:9;22534:17;;22366:191;;;;:::o;22563:234::-;22703:34;22699:1;22691:6;22687:14;22680:58;22772:17;22767:2;22759:6;22755:15;22748:42;22563:234;:::o;22803:366::-;22945:3;22966:67;23030:2;23025:3;22966:67;:::i;:::-;22959:74;;23042:93;23131:3;23042:93;:::i;:::-;23160:2;23155:3;23151:12;23144:19;;22803:366;;;:::o;23175:419::-;23341:4;23379:2;23368:9;23364:18;23356:26;;23428:9;23422:4;23418:20;23414:1;23403:9;23399:17;23392:47;23456:131;23582:4;23456:131;:::i;:::-;23448:139;;23175:419;;;:::o;23600:148::-;23702:11;23739:3;23724:18;;23600:148;;;;:::o;23754:377::-;23860:3;23888:39;23921:5;23888:39;:::i;:::-;23943:89;24025:6;24020:3;23943:89;:::i;:::-;23936:96;;24041:52;24086:6;24081:3;24074:4;24067:5;24063:16;24041:52;:::i;:::-;24118:6;24113:3;24109:16;24102:23;;23864:267;23754:377;;;;:::o;24137:155::-;24277:7;24273:1;24265:6;24261:14;24254:31;24137:155;:::o;24298:400::-;24458:3;24479:84;24561:1;24556:3;24479:84;:::i;:::-;24472:91;;24572:93;24661:3;24572:93;:::i;:::-;24690:1;24685:3;24681:11;24674:18;;24298:400;;;:::o;24704:701::-;24985:3;25007:95;25098:3;25089:6;25007:95;:::i;:::-;25000:102;;25119:95;25210:3;25201:6;25119:95;:::i;:::-;25112:102;;25231:148;25375:3;25231:148;:::i;:::-;25224:155;;25396:3;25389:10;;24704:701;;;;;:::o;25411:225::-;25551:34;25547:1;25539:6;25535:14;25528:58;25620:8;25615:2;25607:6;25603:15;25596:33;25411:225;:::o;25642:366::-;25784:3;25805:67;25869:2;25864:3;25805:67;:::i;:::-;25798:74;;25881:93;25970:3;25881:93;:::i;:::-;25999:2;25994:3;25990:12;25983:19;;25642:366;;;:::o;26014:419::-;26180:4;26218:2;26207:9;26203:18;26195:26;;26267:9;26261:4;26257:20;26253:1;26242:9;26238:17;26231:47;26295:131;26421:4;26295:131;:::i;:::-;26287:139;;26014:419;;;:::o;26439:98::-;26490:6;26524:5;26518:12;26508:22;;26439:98;;;:::o;26543:168::-;26626:11;26660:6;26655:3;26648:19;26700:4;26695:3;26691:14;26676:29;;26543:168;;;;:::o;26717:360::-;26803:3;26831:38;26863:5;26831:38;:::i;:::-;26885:70;26948:6;26943:3;26885:70;:::i;:::-;26878:77;;26964:52;27009:6;27004:3;26997:4;26990:5;26986:16;26964:52;:::i;:::-;27041:29;27063:6;27041:29;:::i;:::-;27036:3;27032:39;27025:46;;26807:270;26717:360;;;;:::o;27083:640::-;27278:4;27316:3;27305:9;27301:19;27293:27;;27330:71;27398:1;27387:9;27383:17;27374:6;27330:71;:::i;:::-;27411:72;27479:2;27468:9;27464:18;27455:6;27411:72;:::i;:::-;27493;27561:2;27550:9;27546:18;27537:6;27493:72;:::i;:::-;27612:9;27606:4;27602:20;27597:2;27586:9;27582:18;27575:48;27640:76;27711:4;27702:6;27640:76;:::i;:::-;27632:84;;27083:640;;;;;;;:::o;27729:141::-;27785:5;27816:6;27810:13;27801:22;;27832:32;27858:5;27832:32;:::i;:::-;27729:141;;;;:::o;27876:349::-;27945:6;27994:2;27982:9;27973:7;27969:23;27965:32;27962:119;;;28000:79;;:::i;:::-;27962:119;28120:1;28145:63;28200:7;28191:6;28180:9;28176:22;28145:63;:::i;:::-;28135:73;;28091:127;27876:349;;;;:::o;28231:233::-;28270:3;28293:24;28311:5;28293:24;:::i;:::-;28284:33;;28339:66;28332:5;28329:77;28326:103;;;28409:18;;:::i;:::-;28326:103;28456:1;28449:5;28445:13;28438:20;;28231:233;;;:::o;28470:180::-;28518:77;28515:1;28508:88;28615:4;28612:1;28605:15;28639:4;28636:1;28629:15;28656:185;28696:1;28713:20;28731:1;28713:20;:::i;:::-;28708:25;;28747:20;28765:1;28747:20;:::i;:::-;28742:25;;28786:1;28776:35;;28791:18;;:::i;:::-;28776:35;28833:1;28830;28826:9;28821:14;;28656:185;;;;:::o;28847:176::-;28879:1;28896:20;28914:1;28896:20;:::i;:::-;28891:25;;28930:20;28948:1;28930:20;:::i;:::-;28925:25;;28969:1;28959:35;;28974:18;;:::i;:::-;28959:35;29015:1;29012;29008:9;29003:14;;28847:176;;;;:::o;29029:180::-;29077:77;29074:1;29067:88;29174:4;29171:1;29164:15;29198:4;29195:1;29188:15
Swarm Source
ipfs://0fa60256fc5666ccc8c0fd7799fc19046334186b0824483c3461dd7b1927b2aa
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.