ERC-721
Overview
Max Total Supply
999 ETH
Holders
470
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 ETHLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
WhoIsBanksyV2
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-23 */ // File: node_modules\erc721a\contracts\IERC721A.sol // SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @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() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 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`, * 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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` 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 payable; /** * @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 payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a\contracts\ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ 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: [ERC165](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. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * 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 initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns 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)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @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 virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin\contracts\security\ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: node_modules\operator-filter-registry\src\IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); } // File: node_modules\operator-filter-registry\src\lib\Constants.sol pragma solidity ^0.8.17; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; // File: node_modules\operator-filter-registry\src\OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } /** * @dev A helper function to check if an operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: operator-filter-registry\src\DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} } // File: contracts\BanksyV2.sol pragma solidity >=0.7.0 <0.9.0; interface BanksyV1 { function balanceOf(address owner) external view returns (uint256 balance); } contract WhoIsBanksyV2 is ERC721A, Ownable, ReentrancyGuard, DefaultOperatorFilterer { string public baseURI; string public notRevealedUri; uint256 public cost = 0.0033 ether; uint256 public maxSupply = 999; uint256 public MaxperWallet = 3; uint256 public MaxperWalletWl = 1; bool public paused = true; bool public revealed = false; bool public preSale = true; address public BanksyAddress = 0x2a05aE518D4d94656d014d95C9bBfc206155153b; BanksyV1 public BanksyNFT; mapping (address => uint256) public PublicMintofUser; mapping (address => uint256) public FreeMintofUser; constructor() ERC721A("Who is BanksyV2", "ETH") { BanksyNFT = BanksyV1(BanksyAddress); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } // public /// @dev Public mint function mint(uint256 tokens) public payable nonReentrant { require(!paused, "ETH: oops contract is paused"); require(!preSale, "ETH: Sale Hasn't started yet"); require(tokens <= MaxperWallet, "ETH: max mint amount per tx exceeded"); require(totalSupply() + tokens <= maxSupply, "ETH: We Soldout"); require(PublicMintofUser[_msgSenderERC721A()] + tokens <= MaxperWallet, "ETH: Max NFT Per Wallet exceeded"); require(msg.value >= cost * tokens, "ETH: insufficient funds"); PublicMintofUser[_msgSenderERC721A()] += tokens; _safeMint(_msgSenderERC721A(), tokens); } /// @dev presale mint for whitelisted function presalemint() public payable nonReentrant { require(!paused, "ETH: oops contract is paused"); require(preSale, "ETH: Presale Hasnt't started yet"); require(FreeMintofUser[_msgSenderERC721A()] + 1 <= MaxperWalletWl, "ETH: Max NFT Per Wallet exceeded"); require(totalSupply() + 1 <= maxSupply, "ETH: Whitelist MaxSupply exceeded"); require(BanksyNFT.balanceOf(_msgSenderERC721A()) > 1, "You dont have any nfts"); FreeMintofUser[_msgSenderERC721A()] += 1; _safeMint(_msgSenderERC721A(), 1); } /// @dev use it for giveaway and team mint function airdrop(uint256 _mintAmount, address destination) public onlyOwner nonReentrant { require(totalSupply() + _mintAmount <= maxSupply, "max NFT limit exceeded"); _safeMint(destination, _mintAmount); } /// @notice returns metadata link of tokenid function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721AMetadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _toString(tokenId), ".json")) : ""; } /// @notice return the number minted by an address function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } /// @notice return the tokens owned by an address function tokensOfOwner(address owner) public view returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } //only owner function reveal(bool _state) public onlyOwner { revealed = _state; } /// @dev change the public max per wallet function setMaxPerWallet(uint256 _limit) public onlyOwner { MaxperWallet = _limit; } /// @dev change the whitelist max per wallet function setWlMaxPerWallet(uint256 _limit) public onlyOwner { MaxperWalletWl = _limit; } /// @dev change the public price(amount need to be in wei) function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } /// @dev cut the supply if we dont sold out function setMaxsupply(uint256 _newsupply) public onlyOwner { maxSupply = _newsupply; } /// @dev set your baseuri function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } /// @dev set hidden uri function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } /// @dev to pause and unpause your contract(use booleans true or false) function pause(bool _state) public onlyOwner { paused = _state; } /// @dev activate whitelist sale(use booleans true or false) function togglepreSale(bool _state) external onlyOwner { preSale = _state; } /// @dev withdraw funds from contract function withdraw() public payable onlyOwner nonReentrant { uint256 balance = address(this).balance; payable(0x51C14c89DB72fCf4350c48d8eB3e85C0578Af924).transfer(balance); } /// Opensea Royalties function transferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
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":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BanksyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BanksyNFT","outputs":[{"internalType":"contract BanksyV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"FreeMintofUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxperWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxperWalletWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"PublicMintofUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","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":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalemint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","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":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newsupply","type":"uint256"}],"name":"setMaxsupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setWlMaxPerWallet","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":"bool","name":"_state","type":"bool"}],"name":"togglepreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052660bb9551fc24000600c556103e7600d556003600e556001600f556001601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055506001601060026101000a81548160ff021916908315150217905550732a05ae518d4d94656d014d95c9bbfc206155153b601060036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d257600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600f81526020017f57686f2069732042616e6b7379563200000000000000000000000000000000008152506040518060400160405280600381526020017f455448000000000000000000000000000000000000000000000000000000000081525081600290816200016791906200076b565b5080600390816200017991906200076b565b506200018a6200041a60201b60201c565b6000819055505050620001b2620001a66200042360201b60201c565b6200042b60201b60201c565b600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003af57801562000275576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200023b92919062000897565b600060405180830381600087803b1580156200025657600080fd5b505af11580156200026b573d6000803e3d6000fd5b50505050620003ae565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200032f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002f592919062000897565b600060405180830381600087803b1580156200031057600080fd5b505af115801562000325573d6000803e3d6000fd5b50505050620003ad565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003789190620008c4565b600060405180830381600087803b1580156200039357600080fd5b505af1158015620003a8573d6000803e3d6000fd5b505050505b5b5b5050601060039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620008e1565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200057357607f821691505b6020821081036200058957620005886200052b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005f37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005b4565b620005ff8683620005b4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200064c62000646620006408462000617565b62000621565b62000617565b9050919050565b6000819050919050565b62000668836200062b565b62000680620006778262000653565b848454620005c1565b825550505050565b600090565b6200069762000688565b620006a48184846200065d565b505050565b5b81811015620006cc57620006c06000826200068d565b600181019050620006aa565b5050565b601f8211156200071b57620006e5816200058f565b620006f084620005a4565b8101602085101562000700578190505b620007186200070f85620005a4565b830182620006a9565b50505b505050565b600082821c905092915050565b6000620007406000198460080262000720565b1980831691505092915050565b60006200075b83836200072d565b9150826002028217905092915050565b6200077682620004f1565b67ffffffffffffffff811115620007925762000791620004fc565b5b6200079e82546200055a565b620007ab828285620006d0565b600060209050601f831160018114620007e35760008415620007ce578287015190505b620007da85826200074d565b8655506200084a565b601f198416620007f3866200058f565b60005b828110156200081d57848901518255600182019150602085019450602081019050620007f6565b868310156200083d578489015162000839601f8916826200072d565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200087f8262000852565b9050919050565b620008918162000872565b82525050565b6000604082019050620008ae600083018562000886565b620008bd602083018462000886565b9392505050565b6000602082019050620008db600083018462000886565b92915050565b6141f280620008f16000396000f3fe60806040526004361061027c5760003560e01c806370a082311161014f578063bde0608a116100c1578063e985e9c51161007a578063e985e9c514610937578063f2c4ce1e14610974578063f2fde38b1461099d578063f959660f146109c6578063fea0e058146109d0578063fff8d2fc146109f95761027c565b8063bde0608a14610815578063c87b56dd1461083e578063d5abeb011461087b578063d5c4708f146108a6578063dc33e681146108d1578063e268e4d31461090e5761027c565b806395d89b411161011357806395d89b4114610735578063a0712d6814610760578063a22cb4651461077c578063b88d4fde146107a5578063bc63f02e146107c1578063bd7a1998146107ea5761027c565b806370a0823114610650578063715018a61461068d5780638462151c146106a45780638da5cb5b146106e1578063940cd05b1461070c5761027c565b8063237f8114116101f357806351830227116101ac578063518302271461053e57806355f804b3146105695780635a7adf7f146105925780635c975abb146105bd5780636352211e146105e85780636c0360eb146106255761027c565b8063237f81141461046b57806323b872dd146104a85780633ccfd60b146104c457806341f43434146104ce57806342842e0e146104f957806344a0d68a146105155761027c565b8063081812fc11610245578063081812fc14610368578063081c8c44146103a5578063095ea7b3146103d057806313faede6146103ec578063149835a01461041757806318160ddd146104405761027c565b806277ec051461028157806301ffc9a7146102ac57806302329a29146102e9578063057735131461031257806306fdde031461033d575b600080fd5b34801561028d57600080fd5b50610296610a36565b6040516102a39190612cbf565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190612d46565b610a3c565b6040516102e09190612d8e565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612dd5565b610ace565b005b34801561031e57600080fd5b50610327610af3565b6040516103349190612e43565b60405180910390f35b34801561034957600080fd5b50610352610b19565b60405161035f9190612eee565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190612f3c565b610bab565b60405161039c9190612e43565b60405180910390f35b3480156103b157600080fd5b506103ba610c2a565b6040516103c79190612eee565b60405180910390f35b6103ea60048036038101906103e59190612f95565b610cb8565b005b3480156103f857600080fd5b50610401610dfc565b60405161040e9190612cbf565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190612f3c565b610e02565b005b34801561044c57600080fd5b50610455610e14565b6040516104629190612cbf565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190612fd5565b610e2b565b60405161049f9190612cbf565b60405180910390f35b6104c260048036038101906104bd9190613002565b610e43565b005b6104cc610e92565b005b3480156104da57600080fd5b506104e3610f0d565b6040516104f091906130b4565b60405180910390f35b610513600480360381019061050e9190613002565b610f1f565b005b34801561052157600080fd5b5061053c60048036038101906105379190612f3c565b610f6e565b005b34801561054a57600080fd5b50610553610f80565b6040516105609190612d8e565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190613204565b610f93565b005b34801561059e57600080fd5b506105a7610fae565b6040516105b49190612d8e565b60405180910390f35b3480156105c957600080fd5b506105d2610fc1565b6040516105df9190612d8e565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a9190612f3c565b610fd4565b60405161061c9190612e43565b60405180910390f35b34801561063157600080fd5b5061063a610fe6565b6040516106479190612eee565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190612fd5565b611074565b6040516106849190612cbf565b60405180910390f35b34801561069957600080fd5b506106a261112c565b005b3480156106b057600080fd5b506106cb60048036038101906106c69190612fd5565b611140565b6040516106d8919061330b565b60405180910390f35b3480156106ed57600080fd5b506106f6611283565b6040516107039190612e43565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e9190612dd5565b6112ad565b005b34801561074157600080fd5b5061074a6112d2565b6040516107579190612eee565b60405180910390f35b61077a60048036038101906107759190612f3c565b611364565b005b34801561078857600080fd5b506107a3600480360381019061079e919061332d565b611607565b005b6107bf60048036038101906107ba919061340e565b611712565b005b3480156107cd57600080fd5b506107e860048036038101906107e39190613491565b611763565b005b3480156107f657600080fd5b506107ff6117e0565b60405161080c9190612cbf565b60405180910390f35b34801561082157600080fd5b5061083c60048036038101906108379190612f3c565b6117e6565b005b34801561084a57600080fd5b5061086560048036038101906108609190612f3c565b6117f8565b6040516108729190612eee565b60405180910390f35b34801561088757600080fd5b5061089061194d565b60405161089d9190612cbf565b60405180910390f35b3480156108b257600080fd5b506108bb611953565b6040516108c891906134f2565b60405180910390f35b3480156108dd57600080fd5b506108f860048036038101906108f39190612fd5565b611979565b6040516109059190612cbf565b60405180910390f35b34801561091a57600080fd5b5061093560048036038101906109309190612f3c565b61198b565b005b34801561094357600080fd5b5061095e6004803603810190610959919061350d565b61199d565b60405161096b9190612d8e565b60405180910390f35b34801561098057600080fd5b5061099b60048036038101906109969190613204565b611a31565b005b3480156109a957600080fd5b506109c460048036038101906109bf9190612fd5565b611a4c565b005b6109ce611acf565b005b3480156109dc57600080fd5b506109f760048036038101906109f29190612dd5565b611dc4565b005b348015610a0557600080fd5b50610a206004803603810190610a1b9190612fd5565b611de9565b604051610a2d9190612cbf565b60405180910390f35b600f5481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a9757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac75750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610ad6611e01565b80601060006101000a81548160ff02191690831515021790555050565b601060039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060028054610b289061357c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b549061357c565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b5050505050905090565b6000610bb682611e7f565b610bec576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b8054610c379061357c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c639061357c565b8015610cb05780601f10610c8557610100808354040283529160200191610cb0565b820191906000526020600020905b815481529060010190602001808311610c9357829003601f168201915b505050505081565b6000610cc382610fd4565b90508073ffffffffffffffffffffffffffffffffffffffff16610ce4611ede565b73ffffffffffffffffffffffffffffffffffffffff1614610d4757610d1081610d0b611ede565b61199d565b610d46576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b610e0a611e01565b80600d8190555050565b6000610e1e611ee6565b6001546000540303905090565b60136020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e8157610e8033611eef565b5b610e8c848484611fec565b50505050565b610e9a611e01565b610ea261230e565b60004790507351c14c89db72fcf4350c48d8eb3e85c0578af92473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f01573d6000803e3d6000fd5b5050610f0b61235d565b565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f5d57610f5c33611eef565b5b610f68848484612367565b50505050565b610f76611e01565b80600c8190555050565b601060019054906101000a900460ff1681565b610f9b611e01565b80600a9081610faa919061374f565b5050565b601060029054906101000a900460ff1681565b601060009054906101000a900460ff1681565b6000610fdf82612387565b9050919050565b600a8054610ff39061357c565b80601f016020809104026020016040519081016040528092919081815260200182805461101f9061357c565b801561106c5780601f106110415761010080835404028352916020019161106c565b820191906000526020600020905b81548152906001019060200180831161104f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110db576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611134611e01565b61113e6000612453565b565b6060600080600061115085611074565b905060008167ffffffffffffffff81111561116e5761116d6130d9565b5b60405190808252806020026020018201604052801561119c5781602001602082028036833780820191505090505b5090506111a7612c57565b60006111b1611ee6565b90505b838614611275576111c481612519565b9150816040015161126a57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461120f57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611269578083878060010198508151811061125c5761125b613821565b5b6020026020010181815250505b5b8060010190506111b4565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112b5611e01565b80601060016101000a81548160ff02191690831515021790555050565b6060600380546112e19061357c565b80601f016020809104026020016040519081016040528092919081815260200182805461130d9061357c565b801561135a5780601f1061132f5761010080835404028352916020019161135a565b820191906000526020600020905b81548152906001019060200180831161133d57829003601f168201915b5050505050905090565b61136c61230e565b601060009054906101000a900460ff16156113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b39061389c565b60405180910390fd5b601060029054906101000a900460ff161561140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390613908565b60405180910390fd5b600e54811115611451576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114489061399a565b60405180910390fd5b600d548161145d610e14565b61146791906139e9565b11156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90613a69565b60405180910390fd5b600e5481601260006114b8611ede565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114fd91906139e9565b111561153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590613ad5565b60405180910390fd5b80600c5461154c9190613af5565b34101561158e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158590613b83565b60405180910390fd5b806012600061159b611ede565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115e491906139e9565b925050819055506115fc6115f6611ede565b82612544565b61160461235d565b50565b8060076000611614611ede565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116c1611ede565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117069190612d8e565b60405180910390a35050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117505761174f33611eef565b5b61175c85858585612562565b5050505050565b61176b611e01565b61177361230e565b600d548261177f610e14565b61178991906139e9565b11156117ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c190613bef565b60405180910390fd5b6117d48183612544565b6117dc61235d565b5050565b600e5481565b6117ee611e01565b80600f8190555050565b606061180382611e7f565b611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183990613c81565b60405180910390fd5b60001515601060019054906101000a900460ff161515036118ef57600b805461186a9061357c565b80601f01602080910402602001604051908101604052809291908181526020018280546118969061357c565b80156118e35780601f106118b8576101008083540402835291602001916118e3565b820191906000526020600020905b8154815290600101906020018083116118c657829003601f168201915b50505050509050611948565b60006118f96125d5565b905060008151116119195760405180602001604052806000815250611944565b8061192384612667565b604051602001611934929190613d29565b6040516020818303038152906040525b9150505b919050565b600d5481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611984826126b7565b9050919050565b611993611e01565b80600e8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a39611e01565b80600b9081611a48919061374f565b5050565b611a54611e01565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aba90613dca565b60405180910390fd5b611acc81612453565b50565b611ad761230e565b601060009054906101000a900460ff1615611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e9061389c565b60405180910390fd5b601060029054906101000a900460ff16611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d90613e36565b60405180910390fd5b600f54600160136000611b87611ede565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bcc91906139e9565b1115611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0490613ad5565b60405180910390fd5b600d546001611c1a610e14565b611c2491906139e9565b1115611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c90613ec8565b60405180910390fd5b6001601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231611cad611ede565b6040518263ffffffff1660e01b8152600401611cc99190612e43565b602060405180830381865afa158015611ce6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0a9190613efd565b11611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190613f76565b60405180910390fd5b600160136000611d58611ede565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611da191906139e9565b92505081905550611dba611db3611ede565b6001612544565b611dc261235d565b565b611dcc611e01565b80601060026101000a81548160ff02191690831515021790555050565b60126020528060005260406000206000915090505481565b611e0961270e565b73ffffffffffffffffffffffffffffffffffffffff16611e27611283565b73ffffffffffffffffffffffffffffffffffffffff1614611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490613fe2565b60405180910390fd5b565b600081611e8a611ee6565b11158015611e99575060005482105b8015611ed7575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611fe9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611f66929190614002565b602060405180830381865afa158015611f83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa79190614040565b611fe857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611fdf9190612e43565b60405180910390fd5b5b50565b6000611ff782612387565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461205e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061206a84612716565b91509150612080818761207b611ede565b61273d565b6120cc5761209586612090611ede565b61199d565b6120cb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612132576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61213f8686866001612781565b801561214a57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612218856121f4888887612787565b7c0200000000000000000000000000000000000000000000000000000000176127af565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361229e576000600185019050600060046000838152602001908152602001600020540361229c57600054811461229b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461230686868660016127da565b505050505050565b600260095403612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234a906140b9565b60405180910390fd5b6002600981905550565b6001600981905550565b61238283838360405180602001604052806000815250611712565b505050565b60008082905080612396611ee6565b1161241c5760005481101561241b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612419575b6000810361240f5760046000836001900393508381526020019081526020016000205490506123e5565b809250505061244e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612521612c57565b61253d60046000848152602001908152602001600020546127e0565b9050919050565b61255e828260405180602001604052806000815250612896565b5050565b61256d848484610e43565b60008373ffffffffffffffffffffffffffffffffffffffff163b146125cf5761259884848484612933565b6125ce576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a80546125e49061357c565b80601f01602080910402602001604051908101604052809291908181526020018280546126109061357c565b801561265d5780601f106126325761010080835404028352916020019161265d565b820191906000526020600020905b81548152906001019060200180831161264057829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156126a257600184039350600a81066030018453600a8104905080612680575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861279e868684612a83565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6127e8612c57565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6128a08383612a8c565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461292e57600080549050600083820390505b6128e06000868380600101945086612933565b612916576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106128cd57816000541461292b57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612959611ede565b8786866040518563ffffffff1660e01b815260040161297b949392919061412e565b6020604051808303816000875af19250505080156129b757506040513d601f19601f820116820180604052508101906129b4919061418f565b60015b612a30573d80600081146129e7576040519150601f19603f3d011682016040523d82523d6000602084013e6129ec565b606091505b506000815103612a28576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203612acc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ad96000848385612781565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612b5083612b416000866000612787565b612b4a85612c47565b176127af565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612bf157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612bb6565b5060008203612c2c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612c4260008483856127da565b505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000819050919050565b612cb981612ca6565b82525050565b6000602082019050612cd46000830184612cb0565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d2381612cee565b8114612d2e57600080fd5b50565b600081359050612d4081612d1a565b92915050565b600060208284031215612d5c57612d5b612ce4565b5b6000612d6a84828501612d31565b91505092915050565b60008115159050919050565b612d8881612d73565b82525050565b6000602082019050612da36000830184612d7f565b92915050565b612db281612d73565b8114612dbd57600080fd5b50565b600081359050612dcf81612da9565b92915050565b600060208284031215612deb57612dea612ce4565b5b6000612df984828501612dc0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e2d82612e02565b9050919050565b612e3d81612e22565b82525050565b6000602082019050612e586000830184612e34565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e98578082015181840152602081019050612e7d565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ec082612e5e565b612eca8185612e69565b9350612eda818560208601612e7a565b612ee381612ea4565b840191505092915050565b60006020820190508181036000830152612f088184612eb5565b905092915050565b612f1981612ca6565b8114612f2457600080fd5b50565b600081359050612f3681612f10565b92915050565b600060208284031215612f5257612f51612ce4565b5b6000612f6084828501612f27565b91505092915050565b612f7281612e22565b8114612f7d57600080fd5b50565b600081359050612f8f81612f69565b92915050565b60008060408385031215612fac57612fab612ce4565b5b6000612fba85828601612f80565b9250506020612fcb85828601612f27565b9150509250929050565b600060208284031215612feb57612fea612ce4565b5b6000612ff984828501612f80565b91505092915050565b60008060006060848603121561301b5761301a612ce4565b5b600061302986828701612f80565b935050602061303a86828701612f80565b925050604061304b86828701612f27565b9150509250925092565b6000819050919050565b600061307a61307561307084612e02565b613055565b612e02565b9050919050565b600061308c8261305f565b9050919050565b600061309e82613081565b9050919050565b6130ae81613093565b82525050565b60006020820190506130c960008301846130a5565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61311182612ea4565b810181811067ffffffffffffffff821117156131305761312f6130d9565b5b80604052505050565b6000613143612cda565b905061314f8282613108565b919050565b600067ffffffffffffffff82111561316f5761316e6130d9565b5b61317882612ea4565b9050602081019050919050565b82818337600083830152505050565b60006131a76131a284613154565b613139565b9050828152602081018484840111156131c3576131c26130d4565b5b6131ce848285613185565b509392505050565b600082601f8301126131eb576131ea6130cf565b5b81356131fb848260208601613194565b91505092915050565b60006020828403121561321a57613219612ce4565b5b600082013567ffffffffffffffff81111561323857613237612ce9565b5b613244848285016131d6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61328281612ca6565b82525050565b60006132948383613279565b60208301905092915050565b6000602082019050919050565b60006132b88261324d565b6132c28185613258565b93506132cd83613269565b8060005b838110156132fe5781516132e58882613288565b97506132f0836132a0565b9250506001810190506132d1565b5085935050505092915050565b6000602082019050818103600083015261332581846132ad565b905092915050565b6000806040838503121561334457613343612ce4565b5b600061335285828601612f80565b925050602061336385828601612dc0565b9150509250929050565b600067ffffffffffffffff821115613388576133876130d9565b5b61339182612ea4565b9050602081019050919050565b60006133b16133ac8461336d565b613139565b9050828152602081018484840111156133cd576133cc6130d4565b5b6133d8848285613185565b509392505050565b600082601f8301126133f5576133f46130cf565b5b813561340584826020860161339e565b91505092915050565b6000806000806080858703121561342857613427612ce4565b5b600061343687828801612f80565b945050602061344787828801612f80565b935050604061345887828801612f27565b925050606085013567ffffffffffffffff81111561347957613478612ce9565b5b613485878288016133e0565b91505092959194509250565b600080604083850312156134a8576134a7612ce4565b5b60006134b685828601612f27565b92505060206134c785828601612f80565b9150509250929050565b60006134dc82613081565b9050919050565b6134ec816134d1565b82525050565b600060208201905061350760008301846134e3565b92915050565b6000806040838503121561352457613523612ce4565b5b600061353285828601612f80565b925050602061354385828601612f80565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061359457607f821691505b6020821081036135a7576135a661354d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261360f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135d2565b61361986836135d2565b95508019841693508086168417925050509392505050565b600061364c61364761364284612ca6565b613055565b612ca6565b9050919050565b6000819050919050565b61366683613631565b61367a61367282613653565b8484546135df565b825550505050565b600090565b61368f613682565b61369a81848461365d565b505050565b5b818110156136be576136b3600082613687565b6001810190506136a0565b5050565b601f821115613703576136d4816135ad565b6136dd846135c2565b810160208510156136ec578190505b6137006136f8856135c2565b83018261369f565b50505b505050565b600082821c905092915050565b600061372660001984600802613708565b1980831691505092915050565b600061373f8383613715565b9150826002028217905092915050565b61375882612e5e565b67ffffffffffffffff811115613771576137706130d9565b5b61377b825461357c565b6137868282856136c2565b600060209050601f8311600181146137b957600084156137a7578287015190505b6137b18582613733565b865550613819565b601f1984166137c7866135ad565b60005b828110156137ef578489015182556001820191506020850194506020810190506137ca565b8683101561380c5784890151613808601f891682613715565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4554483a206f6f707320636f6e74726163742069732070617573656400000000600082015250565b6000613886601c83612e69565b915061389182613850565b602082019050919050565b600060208201905081810360008301526138b581613879565b9050919050565b7f4554483a2053616c65204861736e277420737461727465642079657400000000600082015250565b60006138f2601c83612e69565b91506138fd826138bc565b602082019050919050565b60006020820190508181036000830152613921816138e5565b9050919050565b7f4554483a206d6178206d696e7420616d6f756e7420706572207478206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b6000613984602483612e69565b915061398f82613928565b604082019050919050565b600060208201905081810360008301526139b381613977565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139f482612ca6565b91506139ff83612ca6565b9250828201905080821115613a1757613a166139ba565b5b92915050565b7f4554483a20576520536f6c646f75740000000000000000000000000000000000600082015250565b6000613a53600f83612e69565b9150613a5e82613a1d565b602082019050919050565b60006020820190508181036000830152613a8281613a46565b9050919050565b7f4554483a204d6178204e4654205065722057616c6c6574206578636565646564600082015250565b6000613abf602083612e69565b9150613aca82613a89565b602082019050919050565b60006020820190508181036000830152613aee81613ab2565b9050919050565b6000613b0082612ca6565b9150613b0b83612ca6565b9250828202613b1981612ca6565b91508282048414831517613b3057613b2f6139ba565b5b5092915050565b7f4554483a20696e73756666696369656e742066756e6473000000000000000000600082015250565b6000613b6d601783612e69565b9150613b7882613b37565b602082019050919050565b60006020820190508181036000830152613b9c81613b60565b9050919050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b6000613bd9601683612e69565b9150613be482613ba3565b602082019050919050565b60006020820190508181036000830152613c0881613bcc565b9050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b6000613c6b603083612e69565b9150613c7682613c0f565b604082019050919050565b60006020820190508181036000830152613c9a81613c5e565b9050919050565b600081905092915050565b6000613cb782612e5e565b613cc18185613ca1565b9350613cd1818560208601612e7a565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613d13600583613ca1565b9150613d1e82613cdd565b600582019050919050565b6000613d358285613cac565b9150613d418284613cac565b9150613d4c82613d06565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613db4602683612e69565b9150613dbf82613d58565b604082019050919050565b60006020820190508181036000830152613de381613da7565b9050919050565b7f4554483a2050726573616c65204861736e742774207374617274656420796574600082015250565b6000613e20602083612e69565b9150613e2b82613dea565b602082019050919050565b60006020820190508181036000830152613e4f81613e13565b9050919050565b7f4554483a2057686974656c697374204d6178537570706c79206578636565646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eb2602183612e69565b9150613ebd82613e56565b604082019050919050565b60006020820190508181036000830152613ee181613ea5565b9050919050565b600081519050613ef781612f10565b92915050565b600060208284031215613f1357613f12612ce4565b5b6000613f2184828501613ee8565b91505092915050565b7f596f7520646f6e74206861766520616e79206e66747300000000000000000000600082015250565b6000613f60601683612e69565b9150613f6b82613f2a565b602082019050919050565b60006020820190508181036000830152613f8f81613f53565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fcc602083612e69565b9150613fd782613f96565b602082019050919050565b60006020820190508181036000830152613ffb81613fbf565b9050919050565b60006040820190506140176000830185612e34565b6140246020830184612e34565b9392505050565b60008151905061403a81612da9565b92915050565b60006020828403121561405657614055612ce4565b5b60006140648482850161402b565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006140a3601f83612e69565b91506140ae8261406d565b602082019050919050565b600060208201905081810360008301526140d281614096565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614100826140d9565b61410a81856140e4565b935061411a818560208601612e7a565b61412381612ea4565b840191505092915050565b60006080820190506141436000830187612e34565b6141506020830186612e34565b61415d6040830185612cb0565b818103606083015261416f81846140f5565b905095945050505050565b60008151905061418981612d1a565b92915050565b6000602082840312156141a5576141a4612ce4565b5b60006141b38482850161417a565b9150509291505056fea264697066735822122096c2fa92636c47142c89b5515c5463b26b5561608790f7706d6f1a2913d2d60b64736f6c63430008110033
Deployed Bytecode
0x60806040526004361061027c5760003560e01c806370a082311161014f578063bde0608a116100c1578063e985e9c51161007a578063e985e9c514610937578063f2c4ce1e14610974578063f2fde38b1461099d578063f959660f146109c6578063fea0e058146109d0578063fff8d2fc146109f95761027c565b8063bde0608a14610815578063c87b56dd1461083e578063d5abeb011461087b578063d5c4708f146108a6578063dc33e681146108d1578063e268e4d31461090e5761027c565b806395d89b411161011357806395d89b4114610735578063a0712d6814610760578063a22cb4651461077c578063b88d4fde146107a5578063bc63f02e146107c1578063bd7a1998146107ea5761027c565b806370a0823114610650578063715018a61461068d5780638462151c146106a45780638da5cb5b146106e1578063940cd05b1461070c5761027c565b8063237f8114116101f357806351830227116101ac578063518302271461053e57806355f804b3146105695780635a7adf7f146105925780635c975abb146105bd5780636352211e146105e85780636c0360eb146106255761027c565b8063237f81141461046b57806323b872dd146104a85780633ccfd60b146104c457806341f43434146104ce57806342842e0e146104f957806344a0d68a146105155761027c565b8063081812fc11610245578063081812fc14610368578063081c8c44146103a5578063095ea7b3146103d057806313faede6146103ec578063149835a01461041757806318160ddd146104405761027c565b806277ec051461028157806301ffc9a7146102ac57806302329a29146102e9578063057735131461031257806306fdde031461033d575b600080fd5b34801561028d57600080fd5b50610296610a36565b6040516102a39190612cbf565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190612d46565b610a3c565b6040516102e09190612d8e565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612dd5565b610ace565b005b34801561031e57600080fd5b50610327610af3565b6040516103349190612e43565b60405180910390f35b34801561034957600080fd5b50610352610b19565b60405161035f9190612eee565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190612f3c565b610bab565b60405161039c9190612e43565b60405180910390f35b3480156103b157600080fd5b506103ba610c2a565b6040516103c79190612eee565b60405180910390f35b6103ea60048036038101906103e59190612f95565b610cb8565b005b3480156103f857600080fd5b50610401610dfc565b60405161040e9190612cbf565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190612f3c565b610e02565b005b34801561044c57600080fd5b50610455610e14565b6040516104629190612cbf565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190612fd5565b610e2b565b60405161049f9190612cbf565b60405180910390f35b6104c260048036038101906104bd9190613002565b610e43565b005b6104cc610e92565b005b3480156104da57600080fd5b506104e3610f0d565b6040516104f091906130b4565b60405180910390f35b610513600480360381019061050e9190613002565b610f1f565b005b34801561052157600080fd5b5061053c60048036038101906105379190612f3c565b610f6e565b005b34801561054a57600080fd5b50610553610f80565b6040516105609190612d8e565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190613204565b610f93565b005b34801561059e57600080fd5b506105a7610fae565b6040516105b49190612d8e565b60405180910390f35b3480156105c957600080fd5b506105d2610fc1565b6040516105df9190612d8e565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a9190612f3c565b610fd4565b60405161061c9190612e43565b60405180910390f35b34801561063157600080fd5b5061063a610fe6565b6040516106479190612eee565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190612fd5565b611074565b6040516106849190612cbf565b60405180910390f35b34801561069957600080fd5b506106a261112c565b005b3480156106b057600080fd5b506106cb60048036038101906106c69190612fd5565b611140565b6040516106d8919061330b565b60405180910390f35b3480156106ed57600080fd5b506106f6611283565b6040516107039190612e43565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e9190612dd5565b6112ad565b005b34801561074157600080fd5b5061074a6112d2565b6040516107579190612eee565b60405180910390f35b61077a60048036038101906107759190612f3c565b611364565b005b34801561078857600080fd5b506107a3600480360381019061079e919061332d565b611607565b005b6107bf60048036038101906107ba919061340e565b611712565b005b3480156107cd57600080fd5b506107e860048036038101906107e39190613491565b611763565b005b3480156107f657600080fd5b506107ff6117e0565b60405161080c9190612cbf565b60405180910390f35b34801561082157600080fd5b5061083c60048036038101906108379190612f3c565b6117e6565b005b34801561084a57600080fd5b5061086560048036038101906108609190612f3c565b6117f8565b6040516108729190612eee565b60405180910390f35b34801561088757600080fd5b5061089061194d565b60405161089d9190612cbf565b60405180910390f35b3480156108b257600080fd5b506108bb611953565b6040516108c891906134f2565b60405180910390f35b3480156108dd57600080fd5b506108f860048036038101906108f39190612fd5565b611979565b6040516109059190612cbf565b60405180910390f35b34801561091a57600080fd5b5061093560048036038101906109309190612f3c565b61198b565b005b34801561094357600080fd5b5061095e6004803603810190610959919061350d565b61199d565b60405161096b9190612d8e565b60405180910390f35b34801561098057600080fd5b5061099b60048036038101906109969190613204565b611a31565b005b3480156109a957600080fd5b506109c460048036038101906109bf9190612fd5565b611a4c565b005b6109ce611acf565b005b3480156109dc57600080fd5b506109f760048036038101906109f29190612dd5565b611dc4565b005b348015610a0557600080fd5b50610a206004803603810190610a1b9190612fd5565b611de9565b604051610a2d9190612cbf565b60405180910390f35b600f5481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a9757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac75750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610ad6611e01565b80601060006101000a81548160ff02191690831515021790555050565b601060039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060028054610b289061357c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b549061357c565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b5050505050905090565b6000610bb682611e7f565b610bec576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b8054610c379061357c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c639061357c565b8015610cb05780601f10610c8557610100808354040283529160200191610cb0565b820191906000526020600020905b815481529060010190602001808311610c9357829003601f168201915b505050505081565b6000610cc382610fd4565b90508073ffffffffffffffffffffffffffffffffffffffff16610ce4611ede565b73ffffffffffffffffffffffffffffffffffffffff1614610d4757610d1081610d0b611ede565b61199d565b610d46576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b610e0a611e01565b80600d8190555050565b6000610e1e611ee6565b6001546000540303905090565b60136020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e8157610e8033611eef565b5b610e8c848484611fec565b50505050565b610e9a611e01565b610ea261230e565b60004790507351c14c89db72fcf4350c48d8eb3e85c0578af92473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f01573d6000803e3d6000fd5b5050610f0b61235d565b565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f5d57610f5c33611eef565b5b610f68848484612367565b50505050565b610f76611e01565b80600c8190555050565b601060019054906101000a900460ff1681565b610f9b611e01565b80600a9081610faa919061374f565b5050565b601060029054906101000a900460ff1681565b601060009054906101000a900460ff1681565b6000610fdf82612387565b9050919050565b600a8054610ff39061357c565b80601f016020809104026020016040519081016040528092919081815260200182805461101f9061357c565b801561106c5780601f106110415761010080835404028352916020019161106c565b820191906000526020600020905b81548152906001019060200180831161104f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110db576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611134611e01565b61113e6000612453565b565b6060600080600061115085611074565b905060008167ffffffffffffffff81111561116e5761116d6130d9565b5b60405190808252806020026020018201604052801561119c5781602001602082028036833780820191505090505b5090506111a7612c57565b60006111b1611ee6565b90505b838614611275576111c481612519565b9150816040015161126a57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461120f57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611269578083878060010198508151811061125c5761125b613821565b5b6020026020010181815250505b5b8060010190506111b4565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112b5611e01565b80601060016101000a81548160ff02191690831515021790555050565b6060600380546112e19061357c565b80601f016020809104026020016040519081016040528092919081815260200182805461130d9061357c565b801561135a5780601f1061132f5761010080835404028352916020019161135a565b820191906000526020600020905b81548152906001019060200180831161133d57829003601f168201915b5050505050905090565b61136c61230e565b601060009054906101000a900460ff16156113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b39061389c565b60405180910390fd5b601060029054906101000a900460ff161561140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390613908565b60405180910390fd5b600e54811115611451576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114489061399a565b60405180910390fd5b600d548161145d610e14565b61146791906139e9565b11156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90613a69565b60405180910390fd5b600e5481601260006114b8611ede565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114fd91906139e9565b111561153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590613ad5565b60405180910390fd5b80600c5461154c9190613af5565b34101561158e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158590613b83565b60405180910390fd5b806012600061159b611ede565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115e491906139e9565b925050819055506115fc6115f6611ede565b82612544565b61160461235d565b50565b8060076000611614611ede565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116c1611ede565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117069190612d8e565b60405180910390a35050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117505761174f33611eef565b5b61175c85858585612562565b5050505050565b61176b611e01565b61177361230e565b600d548261177f610e14565b61178991906139e9565b11156117ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c190613bef565b60405180910390fd5b6117d48183612544565b6117dc61235d565b5050565b600e5481565b6117ee611e01565b80600f8190555050565b606061180382611e7f565b611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183990613c81565b60405180910390fd5b60001515601060019054906101000a900460ff161515036118ef57600b805461186a9061357c565b80601f01602080910402602001604051908101604052809291908181526020018280546118969061357c565b80156118e35780601f106118b8576101008083540402835291602001916118e3565b820191906000526020600020905b8154815290600101906020018083116118c657829003601f168201915b50505050509050611948565b60006118f96125d5565b905060008151116119195760405180602001604052806000815250611944565b8061192384612667565b604051602001611934929190613d29565b6040516020818303038152906040525b9150505b919050565b600d5481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611984826126b7565b9050919050565b611993611e01565b80600e8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a39611e01565b80600b9081611a48919061374f565b5050565b611a54611e01565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aba90613dca565b60405180910390fd5b611acc81612453565b50565b611ad761230e565b601060009054906101000a900460ff1615611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e9061389c565b60405180910390fd5b601060029054906101000a900460ff16611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d90613e36565b60405180910390fd5b600f54600160136000611b87611ede565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bcc91906139e9565b1115611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0490613ad5565b60405180910390fd5b600d546001611c1a610e14565b611c2491906139e9565b1115611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c90613ec8565b60405180910390fd5b6001601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231611cad611ede565b6040518263ffffffff1660e01b8152600401611cc99190612e43565b602060405180830381865afa158015611ce6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0a9190613efd565b11611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190613f76565b60405180910390fd5b600160136000611d58611ede565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611da191906139e9565b92505081905550611dba611db3611ede565b6001612544565b611dc261235d565b565b611dcc611e01565b80601060026101000a81548160ff02191690831515021790555050565b60126020528060005260406000206000915090505481565b611e0961270e565b73ffffffffffffffffffffffffffffffffffffffff16611e27611283565b73ffffffffffffffffffffffffffffffffffffffff1614611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490613fe2565b60405180910390fd5b565b600081611e8a611ee6565b11158015611e99575060005482105b8015611ed7575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611fe9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611f66929190614002565b602060405180830381865afa158015611f83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa79190614040565b611fe857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611fdf9190612e43565b60405180910390fd5b5b50565b6000611ff782612387565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461205e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061206a84612716565b91509150612080818761207b611ede565b61273d565b6120cc5761209586612090611ede565b61199d565b6120cb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612132576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61213f8686866001612781565b801561214a57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612218856121f4888887612787565b7c0200000000000000000000000000000000000000000000000000000000176127af565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361229e576000600185019050600060046000838152602001908152602001600020540361229c57600054811461229b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461230686868660016127da565b505050505050565b600260095403612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234a906140b9565b60405180910390fd5b6002600981905550565b6001600981905550565b61238283838360405180602001604052806000815250611712565b505050565b60008082905080612396611ee6565b1161241c5760005481101561241b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612419575b6000810361240f5760046000836001900393508381526020019081526020016000205490506123e5565b809250505061244e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612521612c57565b61253d60046000848152602001908152602001600020546127e0565b9050919050565b61255e828260405180602001604052806000815250612896565b5050565b61256d848484610e43565b60008373ffffffffffffffffffffffffffffffffffffffff163b146125cf5761259884848484612933565b6125ce576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a80546125e49061357c565b80601f01602080910402602001604051908101604052809291908181526020018280546126109061357c565b801561265d5780601f106126325761010080835404028352916020019161265d565b820191906000526020600020905b81548152906001019060200180831161264057829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156126a257600184039350600a81066030018453600a8104905080612680575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861279e868684612a83565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6127e8612c57565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6128a08383612a8c565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461292e57600080549050600083820390505b6128e06000868380600101945086612933565b612916576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106128cd57816000541461292b57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612959611ede565b8786866040518563ffffffff1660e01b815260040161297b949392919061412e565b6020604051808303816000875af19250505080156129b757506040513d601f19601f820116820180604052508101906129b4919061418f565b60015b612a30573d80600081146129e7576040519150601f19603f3d011682016040523d82523d6000602084013e6129ec565b606091505b506000815103612a28576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203612acc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ad96000848385612781565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612b5083612b416000866000612787565b612b4a85612c47565b176127af565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612bf157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612bb6565b5060008203612c2c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612c4260008483856127da565b505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000819050919050565b612cb981612ca6565b82525050565b6000602082019050612cd46000830184612cb0565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d2381612cee565b8114612d2e57600080fd5b50565b600081359050612d4081612d1a565b92915050565b600060208284031215612d5c57612d5b612ce4565b5b6000612d6a84828501612d31565b91505092915050565b60008115159050919050565b612d8881612d73565b82525050565b6000602082019050612da36000830184612d7f565b92915050565b612db281612d73565b8114612dbd57600080fd5b50565b600081359050612dcf81612da9565b92915050565b600060208284031215612deb57612dea612ce4565b5b6000612df984828501612dc0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e2d82612e02565b9050919050565b612e3d81612e22565b82525050565b6000602082019050612e586000830184612e34565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e98578082015181840152602081019050612e7d565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ec082612e5e565b612eca8185612e69565b9350612eda818560208601612e7a565b612ee381612ea4565b840191505092915050565b60006020820190508181036000830152612f088184612eb5565b905092915050565b612f1981612ca6565b8114612f2457600080fd5b50565b600081359050612f3681612f10565b92915050565b600060208284031215612f5257612f51612ce4565b5b6000612f6084828501612f27565b91505092915050565b612f7281612e22565b8114612f7d57600080fd5b50565b600081359050612f8f81612f69565b92915050565b60008060408385031215612fac57612fab612ce4565b5b6000612fba85828601612f80565b9250506020612fcb85828601612f27565b9150509250929050565b600060208284031215612feb57612fea612ce4565b5b6000612ff984828501612f80565b91505092915050565b60008060006060848603121561301b5761301a612ce4565b5b600061302986828701612f80565b935050602061303a86828701612f80565b925050604061304b86828701612f27565b9150509250925092565b6000819050919050565b600061307a61307561307084612e02565b613055565b612e02565b9050919050565b600061308c8261305f565b9050919050565b600061309e82613081565b9050919050565b6130ae81613093565b82525050565b60006020820190506130c960008301846130a5565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61311182612ea4565b810181811067ffffffffffffffff821117156131305761312f6130d9565b5b80604052505050565b6000613143612cda565b905061314f8282613108565b919050565b600067ffffffffffffffff82111561316f5761316e6130d9565b5b61317882612ea4565b9050602081019050919050565b82818337600083830152505050565b60006131a76131a284613154565b613139565b9050828152602081018484840111156131c3576131c26130d4565b5b6131ce848285613185565b509392505050565b600082601f8301126131eb576131ea6130cf565b5b81356131fb848260208601613194565b91505092915050565b60006020828403121561321a57613219612ce4565b5b600082013567ffffffffffffffff81111561323857613237612ce9565b5b613244848285016131d6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61328281612ca6565b82525050565b60006132948383613279565b60208301905092915050565b6000602082019050919050565b60006132b88261324d565b6132c28185613258565b93506132cd83613269565b8060005b838110156132fe5781516132e58882613288565b97506132f0836132a0565b9250506001810190506132d1565b5085935050505092915050565b6000602082019050818103600083015261332581846132ad565b905092915050565b6000806040838503121561334457613343612ce4565b5b600061335285828601612f80565b925050602061336385828601612dc0565b9150509250929050565b600067ffffffffffffffff821115613388576133876130d9565b5b61339182612ea4565b9050602081019050919050565b60006133b16133ac8461336d565b613139565b9050828152602081018484840111156133cd576133cc6130d4565b5b6133d8848285613185565b509392505050565b600082601f8301126133f5576133f46130cf565b5b813561340584826020860161339e565b91505092915050565b6000806000806080858703121561342857613427612ce4565b5b600061343687828801612f80565b945050602061344787828801612f80565b935050604061345887828801612f27565b925050606085013567ffffffffffffffff81111561347957613478612ce9565b5b613485878288016133e0565b91505092959194509250565b600080604083850312156134a8576134a7612ce4565b5b60006134b685828601612f27565b92505060206134c785828601612f80565b9150509250929050565b60006134dc82613081565b9050919050565b6134ec816134d1565b82525050565b600060208201905061350760008301846134e3565b92915050565b6000806040838503121561352457613523612ce4565b5b600061353285828601612f80565b925050602061354385828601612f80565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061359457607f821691505b6020821081036135a7576135a661354d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261360f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135d2565b61361986836135d2565b95508019841693508086168417925050509392505050565b600061364c61364761364284612ca6565b613055565b612ca6565b9050919050565b6000819050919050565b61366683613631565b61367a61367282613653565b8484546135df565b825550505050565b600090565b61368f613682565b61369a81848461365d565b505050565b5b818110156136be576136b3600082613687565b6001810190506136a0565b5050565b601f821115613703576136d4816135ad565b6136dd846135c2565b810160208510156136ec578190505b6137006136f8856135c2565b83018261369f565b50505b505050565b600082821c905092915050565b600061372660001984600802613708565b1980831691505092915050565b600061373f8383613715565b9150826002028217905092915050565b61375882612e5e565b67ffffffffffffffff811115613771576137706130d9565b5b61377b825461357c565b6137868282856136c2565b600060209050601f8311600181146137b957600084156137a7578287015190505b6137b18582613733565b865550613819565b601f1984166137c7866135ad565b60005b828110156137ef578489015182556001820191506020850194506020810190506137ca565b8683101561380c5784890151613808601f891682613715565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4554483a206f6f707320636f6e74726163742069732070617573656400000000600082015250565b6000613886601c83612e69565b915061389182613850565b602082019050919050565b600060208201905081810360008301526138b581613879565b9050919050565b7f4554483a2053616c65204861736e277420737461727465642079657400000000600082015250565b60006138f2601c83612e69565b91506138fd826138bc565b602082019050919050565b60006020820190508181036000830152613921816138e5565b9050919050565b7f4554483a206d6178206d696e7420616d6f756e7420706572207478206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b6000613984602483612e69565b915061398f82613928565b604082019050919050565b600060208201905081810360008301526139b381613977565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139f482612ca6565b91506139ff83612ca6565b9250828201905080821115613a1757613a166139ba565b5b92915050565b7f4554483a20576520536f6c646f75740000000000000000000000000000000000600082015250565b6000613a53600f83612e69565b9150613a5e82613a1d565b602082019050919050565b60006020820190508181036000830152613a8281613a46565b9050919050565b7f4554483a204d6178204e4654205065722057616c6c6574206578636565646564600082015250565b6000613abf602083612e69565b9150613aca82613a89565b602082019050919050565b60006020820190508181036000830152613aee81613ab2565b9050919050565b6000613b0082612ca6565b9150613b0b83612ca6565b9250828202613b1981612ca6565b91508282048414831517613b3057613b2f6139ba565b5b5092915050565b7f4554483a20696e73756666696369656e742066756e6473000000000000000000600082015250565b6000613b6d601783612e69565b9150613b7882613b37565b602082019050919050565b60006020820190508181036000830152613b9c81613b60565b9050919050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b6000613bd9601683612e69565b9150613be482613ba3565b602082019050919050565b60006020820190508181036000830152613c0881613bcc565b9050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b6000613c6b603083612e69565b9150613c7682613c0f565b604082019050919050565b60006020820190508181036000830152613c9a81613c5e565b9050919050565b600081905092915050565b6000613cb782612e5e565b613cc18185613ca1565b9350613cd1818560208601612e7a565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613d13600583613ca1565b9150613d1e82613cdd565b600582019050919050565b6000613d358285613cac565b9150613d418284613cac565b9150613d4c82613d06565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613db4602683612e69565b9150613dbf82613d58565b604082019050919050565b60006020820190508181036000830152613de381613da7565b9050919050565b7f4554483a2050726573616c65204861736e742774207374617274656420796574600082015250565b6000613e20602083612e69565b9150613e2b82613dea565b602082019050919050565b60006020820190508181036000830152613e4f81613e13565b9050919050565b7f4554483a2057686974656c697374204d6178537570706c79206578636565646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eb2602183612e69565b9150613ebd82613e56565b604082019050919050565b60006020820190508181036000830152613ee181613ea5565b9050919050565b600081519050613ef781612f10565b92915050565b600060208284031215613f1357613f12612ce4565b5b6000613f2184828501613ee8565b91505092915050565b7f596f7520646f6e74206861766520616e79206e66747300000000000000000000600082015250565b6000613f60601683612e69565b9150613f6b82613f2a565b602082019050919050565b60006020820190508181036000830152613f8f81613f53565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fcc602083612e69565b9150613fd782613f96565b602082019050919050565b60006020820190508181036000830152613ffb81613fbf565b9050919050565b60006040820190506140176000830185612e34565b6140246020830184612e34565b9392505050565b60008151905061403a81612da9565b92915050565b60006020828403121561405657614055612ce4565b5b60006140648482850161402b565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006140a3601f83612e69565b91506140ae8261406d565b602082019050919050565b600060208201905081810360008301526140d281614096565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614100826140d9565b61410a81856140e4565b935061411a818560208601612e7a565b61412381612ea4565b840191505092915050565b60006080820190506141436000830187612e34565b6141506020830186612e34565b61415d6040830185612cb0565b818103606083015261416f81846140f5565b905095945050505050565b60008151905061418981612d1a565b92915050565b6000602082840312156141a5576141a4612ce4565b5b60006141b38482850161417a565b9150509291505056fea264697066735822122096c2fa92636c47142c89b5515c5463b26b5561608790f7706d6f1a2913d2d60b64736f6c63430008110033
Deployed Bytecode Sourcemap
69324:6404:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69589:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18446:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74528:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69721;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19348:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25839:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69446:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25272:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69479:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74068:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15099:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69886:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75044:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74815:190;;;:::i;:::-;;65788:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75257:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73931:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69657:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74196:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69690:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69627:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20741:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69420:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16283:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54251:103;;;;;;;;;;;;;:::i;:::-;;72584:881;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53603:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73487:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19524:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70317:611;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26397:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75478:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71580:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69553:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73766:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71855:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69518:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69799:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72412:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73618:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26788:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74328:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54509:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70975:550;;;:::i;:::-;;74676:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69829:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69589:33;;;;:::o;18446:639::-;18531:4;18870:10;18855:25;;:11;:25;;;;:102;;;;18947:10;18932:25;;:11;:25;;;;18855:102;:179;;;;19024:10;19009:25;;:11;:25;;;;18855:179;18835:199;;18446:639;;;:::o;74528:73::-;53489:13;:11;:13::i;:::-;74589:6:::1;74580;;:15;;;;;;;;;;;;;;;;;;74528:73:::0;:::o;69721:::-;;;;;;;;;;;;;:::o;19348:100::-;19402:13;19435:5;19428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19348:100;:::o;25839:218::-;25915:7;25940:16;25948:7;25940;:16::i;:::-;25935:64;;25965:34;;;;;;;;;;;;;;25935:64;26019:15;:24;26035:7;26019:24;;;;;;;;;;;:30;;;;;;;;;;;;26012:37;;25839:218;;;:::o;69446:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25272:408::-;25361:13;25377:16;25385:7;25377;:16::i;:::-;25361:32;;25433:5;25410:28;;:19;:17;:19::i;:::-;:28;;;25406:175;;25458:44;25475:5;25482:19;:17;:19::i;:::-;25458:16;:44::i;:::-;25453:128;;25530:35;;;;;;;;;;;;;;25453:128;25406:175;25626:2;25593:15;:24;25609:7;25593:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25664:7;25660:2;25644:28;;25653:5;25644:28;;;;;;;;;;;;25350:330;25272:408;;:::o;69479:34::-;;;;:::o;74068:94::-;53489:13;:11;:13::i;:::-;74146:10:::1;74134:9;:22;;;;74068:94:::0;:::o;15099:323::-;15160:7;15388:15;:13;:15::i;:::-;15373:12;;15357:13;;:28;:46;15350:53;;15099:323;:::o;69886:50::-;;;;;;;;;;;;;;;;;:::o;75044:205::-;75187:4;67304:10;67296:18;;:4;:18;;;67292:83;;67331:32;67352:10;67331:20;:32::i;:::-;67292:83;75204:37:::1;75223:4;75229:2;75233:7;75204:18;:37::i;:::-;75044:205:::0;;;;:::o;74815:190::-;53489:13;:11;:13::i;:::-;57413:21:::1;:19;:21::i;:::-;74882:15:::2;74900:21;74882:39;;74938:42;74930:60;;:69;74991:7;74930:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;74873:132;57457:20:::1;:18;:20::i;:::-;74815:190::o:0;65788:143::-;64577:42;65788:143;:::o;75257:213::-;75404:4;67304:10;67296:18;;:4;:18;;;67292:83;;67331:32;67352:10;67331:20;:32::i;:::-;67292:83;75421:41:::1;75444:4;75450:2;75454:7;75421:22;:41::i;:::-;75257:213:::0;;;;:::o;73931:80::-;53489:13;:11;:13::i;:::-;73997:8:::1;73990:4;:15;;;;73931:80:::0;:::o;69657:28::-;;;;;;;;;;;;;:::o;74196:98::-;53489:13;:11;:13::i;:::-;74277:11:::1;74267:7;:21;;;;;;:::i;:::-;;74196:98:::0;:::o;69690:26::-;;;;;;;;;;;;;:::o;69627:25::-;;;;;;;;;;;;;:::o;20741:152::-;20813:7;20856:27;20875:7;20856:18;:27::i;:::-;20833:52;;20741:152;;;:::o;69420:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16283:233::-;16355:7;16396:1;16379:19;;:5;:19;;;16375:60;;16407:28;;;;;;;;;;;;;;16375:60;10442:13;16453:18;:25;16472:5;16453:25;;;;;;;;;;;;;;;;:55;16446:62;;16283:233;;;:::o;54251:103::-;53489:13;:11;:13::i;:::-;54316:30:::1;54343:1;54316:18;:30::i;:::-;54251:103::o:0;72584:881::-;72643:16;72697:19;72731:25;72771:22;72796:16;72806:5;72796:9;:16::i;:::-;72771:41;;72827:25;72869:14;72855:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72827:57;;72899:31;;:::i;:::-;72950:9;72962:15;:13;:15::i;:::-;72950:27;;72945:472;72994:14;72979:11;:29;72945:472;;73046:15;73059:1;73046:12;:15::i;:::-;73034:27;;73084:9;:16;;;73125:8;73080:73;73201:1;73175:28;;:9;:14;;;:28;;;73171:111;;73248:9;:14;;;73228:34;;73171:111;73325:5;73304:26;;:17;:26;;;73300:102;;73381:1;73355:8;73364:13;;;;;;73355:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;73300:102;72945:472;73010:3;;;;;72945:472;;;;73438:8;73431:15;;;;;;;72584:881;;;:::o;53603:87::-;53649:7;53676:6;;;;;;;;;;;53669:13;;53603:87;:::o;73487:78::-;53489:13;:11;:13::i;:::-;73553:6:::1;73542:8;;:17;;;;;;;;;;;;;;;;;;73487:78:::0;:::o;19524:104::-;19580:13;19613:7;19606:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19524:104;:::o;70317:611::-;57413:21;:19;:21::i;:::-;70391:6:::1;;;;;;;;;;;70390:7;70382:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;70446:7;;;;;;;;;;;70445:8;70437:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;70511:12;;70501:6;:22;;70493:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;70605:9;;70595:6;70579:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;70571:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;70699:12;;70689:6;70649:16;:37;70666:19;:17;:19::i;:::-;70649:37;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:62;;70641:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;70783:6;70776:4;;:13;;;;:::i;:::-;70763:9;:26;;70755:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;70867:6;70826:16;:37;70843:19;:17;:19::i;:::-;70826:37;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;70884:38;70894:19;:17;:19::i;:::-;70915:6;70884:9;:38::i;:::-;57457:20:::0;:18;:20::i;:::-;70317:611;:::o;26397:234::-;26544:8;26492:18;:39;26511:19;:17;:19::i;:::-;26492:39;;;;;;;;;;;;;;;:49;26532:8;26492:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26604:8;26568:55;;26583:19;:17;:19::i;:::-;26568:55;;;26614:8;26568:55;;;;;;:::i;:::-;;;;;;;;26397:234;;:::o;75478:247::-;75653:4;67304:10;67296:18;;:4;:18;;;67292:83;;67331:32;67352:10;67331:20;:32::i;:::-;67292:83;75670:47:::1;75693:4;75699:2;75703:7;75712:4;75670:22;:47::i;:::-;75478:247:::0;;;;;:::o;71580:223::-;53489:13;:11;:13::i;:::-;57413:21:::1;:19;:21::i;:::-;71715:9:::2;;71700:11;71684:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;71676:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;71762:35;71772:11;71785;71762:9;:35::i;:::-;57457:20:::1;:18;:20::i;:::-;71580:223:::0;;:::o;69553:31::-;;;;:::o;73766:96::-;53489:13;:11;:13::i;:::-;73850:6:::1;73833:14;:23;;;;73766:96:::0;:::o;71855:492::-;71953:13;71994:16;72002:7;71994;:16::i;:::-;71978:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;72104:5;72092:17;;:8;;;;;;;;;;;:17;;;72089:62;;72129:14;72122:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72089:62;72159:28;72190:10;:8;:10::i;:::-;72159:41;;72245:1;72220:14;72214:28;:32;:127;;;;;;;;;;;;;;;;;72282:14;72298:18;72308:7;72298:9;:18::i;:::-;72265:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72214:127;72207:134;;;71855:492;;;;:::o;69518:30::-;;;;:::o;69799:25::-;;;;;;;;;;;;;:::o;72412:107::-;72470:7;72493:20;72507:5;72493:13;:20::i;:::-;72486:27;;72412:107;;;:::o;73618:92::-;53489:13;:11;:13::i;:::-;73698:6:::1;73683:12;:21;;;;73618:92:::0;:::o;26788:164::-;26885:4;26909:18;:25;26928:5;26909:25;;;;;;;;;;;;;;;:35;26935:8;26909:35;;;;;;;;;;;;;;;;;;;;;;;;;26902:42;;26788:164;;;;:::o;74328:120::-;53489:13;:11;:13::i;:::-;74427:15:::1;74410:14;:32;;;;;;:::i;:::-;;74328:120:::0;:::o;54509:201::-;53489:13;:11;:13::i;:::-;54618:1:::1;54598:22;;:8;:22;;::::0;54590:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;54674:28;54693:8;54674:18;:28::i;:::-;54509:201:::0;:::o;70975:550::-;57413:21;:19;:21::i;:::-;71042:6:::1;;;;;;;;;;;71041:7;71033:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;71096:7;;;;;;;;;;;71088:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;71198:14;;71193:1;71155:14;:35;71170:19;:17;:19::i;:::-;71155:35;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:57;;71147:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;71285:9;;71280:1;71264:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;;71256:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;71390:1;71347:9;;;;;;;;;;;:19;;;71367;:17;:19::i;:::-;71347:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;71339:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;71470:1;71431:14;:35;71446:19;:17;:19::i;:::-;71431:35;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;71480:33;71490:19;:17;:19::i;:::-;71511:1;71480:9;:33::i;:::-;57457:20:::0;:18;:20::i;:::-;70975:550::o;74676:90::-;53489:13;:11;:13::i;:::-;74752:6:::1;74742:7;;:16;;;;;;;;;;;;;;;;;;74676:90:::0;:::o;69829:52::-;;;;;;;;;;;;;;;;;:::o;53768:132::-;53843:12;:10;:12::i;:::-;53832:23;;:7;:5;:7::i;:::-;:23;;;53824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53768:132::o;27210:282::-;27275:4;27331:7;27312:15;:13;:15::i;:::-;:26;;:66;;;;;27365:13;;27355:7;:23;27312:66;:153;;;;;27464:1;11218:8;27416:17;:26;27434:7;27416:26;;;;;;;;;;;;:44;:49;27312:153;27292:173;;27210:282;;;:::o;49518:105::-;49578:7;49605:10;49598:17;;49518:105;:::o;70172:101::-;70237:7;70264:1;70257:8;;70172:101;:::o;67713:647::-;67952:1;64577:42;67904:45;;;:49;67900:453;;;64577:42;68203;;;68254:4;68261:8;68203:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68198:144;;68317:8;68298:28;;;;;;;;;;;:::i;:::-;;;;;;;;68198:144;67900:453;67713:647;:::o;29478:2825::-;29620:27;29650;29669:7;29650:18;:27::i;:::-;29620:57;;29735:4;29694:45;;29710:19;29694:45;;;29690:86;;29748:28;;;;;;;;;;;;;;29690:86;29790:27;29819:23;29846:35;29873:7;29846:26;:35::i;:::-;29789:92;;;;29981:68;30006:15;30023:4;30029:19;:17;:19::i;:::-;29981:24;:68::i;:::-;29976:180;;30069:43;30086:4;30092:19;:17;:19::i;:::-;30069:16;:43::i;:::-;30064:92;;30121:35;;;;;;;;;;;;;;30064:92;29976:180;30187:1;30173:16;;:2;:16;;;30169:52;;30198:23;;;;;;;;;;;;;;30169:52;30234:43;30256:4;30262:2;30266:7;30275:1;30234:21;:43::i;:::-;30370:15;30367:160;;;30510:1;30489:19;30482:30;30367:160;30907:18;:24;30926:4;30907:24;;;;;;;;;;;;;;;;30905:26;;;;;;;;;;;;30976:18;:22;30995:2;30976:22;;;;;;;;;;;;;;;;30974:24;;;;;;;;;;;31298:146;31335:2;31384:45;31399:4;31405:2;31409:19;31384:14;:45::i;:::-;11498:8;31356:73;31298:18;:146::i;:::-;31269:17;:26;31287:7;31269:26;;;;;;;;;;;:175;;;;31615:1;11498:8;31564:19;:47;:52;31560:627;;31637:19;31669:1;31659:7;:11;31637:33;;31826:1;31792:17;:30;31810:11;31792:30;;;;;;;;;;;;:35;31788:384;;31930:13;;31915:11;:28;31911:242;;32110:19;32077:17;:30;32095:11;32077:30;;;;;;;;;;;:52;;;;31911:242;31788:384;31618:569;31560:627;32234:7;32230:2;32215:27;;32224:4;32215:27;;;;;;;;;;;;32253:42;32274:4;32280:2;32284:7;32293:1;32253:20;:42::i;:::-;29609:2694;;;29478:2825;;;:::o;57493:293::-;56895:1;57627:7;;:19;57619:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;56895:1;57760:7;:18;;;;57493:293::o;57794:213::-;56851:1;57977:7;:22;;;;57794:213::o;32399:193::-;32545:39;32562:4;32568:2;32572:7;32545:39;;;;;;;;;;;;:16;:39::i;:::-;32399:193;;;:::o;21896:1275::-;21963:7;21983:12;21998:7;21983:22;;22066:4;22047:15;:13;:15::i;:::-;:23;22043:1061;;22100:13;;22093:4;:20;22089:1015;;;22138:14;22155:17;:23;22173:4;22155:23;;;;;;;;;;;;22138:40;;22272:1;11218:8;22244:6;:24;:29;22240:845;;22909:113;22926:1;22916:6;:11;22909:113;;22969:17;:25;22987:6;;;;;;;22969:25;;;;;;;;;;;;22960:34;;22909:113;;;23055:6;23048:13;;;;;;22240:845;22115:989;22089:1015;22043:1061;23132:31;;;;;;;;;;;;;;21896:1275;;;;:::o;54870:191::-;54944:16;54963:6;;;;;;;;;;;54944:25;;54989:8;54980:6;;:17;;;;;;;;;;;;;;;;;;55044:8;55013:40;;55034:8;55013:40;;;;;;;;;;;;54933:128;54870:191;:::o;21344:161::-;21412:21;;:::i;:::-;21453:44;21472:17;:24;21490:5;21472:24;;;;;;;;;;;;21453:18;:44::i;:::-;21446:51;;21344:161;;;:::o;43350:112::-;43427:27;43437:2;43441:8;43427:27;;;;;;;;;;;;:9;:27::i;:::-;43350:112;;:::o;33190:407::-;33365:31;33378:4;33384:2;33388:7;33365:12;:31::i;:::-;33429:1;33411:2;:14;;;:19;33407:183;;33450:56;33481:4;33487:2;33491:7;33500:5;33450:30;:56::i;:::-;33445:145;;33534:40;;;;;;;;;;;;;;33445:145;33407:183;33190:407;;;;:::o;70062:102::-;70122:13;70151:7;70144:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70062:102;:::o;49725:1745::-;49790:17;50224:4;50217;50211:11;50207:22;50316:1;50310:4;50303:15;50391:4;50388:1;50384:12;50377:19;;50473:1;50468:3;50461:14;50577:3;50816:5;50798:428;50824:1;50798:428;;;50864:1;50859:3;50855:11;50848:18;;51035:2;51029:4;51025:13;51021:2;51017:22;51012:3;51004:36;51129:2;51123:4;51119:13;51111:21;;51196:4;50798:428;51186:25;50798:428;50802:21;51265:3;51260;51256:13;51380:4;51375:3;51371:14;51364:21;;51445:6;51440:3;51433:19;49829:1634;;;49725:1745;;;:::o;16598:178::-;16659:7;10442:13;10580:2;16687:18;:25;16706:5;16687:25;;;;;;;;;;;;;;;;:50;;16686:82;16679:89;;16598:178;;;:::o;52156:98::-;52209:7;52236:10;52229:17;;52156:98;:::o;28373:485::-;28475:27;28504:23;28545:38;28586:15;:24;28602:7;28586:24;;;;;;;;;;;28545:65;;28763:18;28740:41;;28820:19;28814:26;28795:45;;28725:126;28373:485;;;:::o;27601:659::-;27750:11;27915:16;27908:5;27904:28;27895:37;;28075:16;28064:9;28060:32;28047:45;;28225:15;28214:9;28211:30;28203:5;28192:9;28189:20;28186:56;28176:66;;27601:659;;;;;:::o;34259:159::-;;;;;:::o;48827:311::-;48962:7;48982:16;11622:3;49008:19;:41;;48982:68;;11622:3;49076:31;49087:4;49093:2;49097:9;49076:10;:31::i;:::-;49068:40;;:62;;49061:69;;;48827:311;;;;;:::o;23719:450::-;23799:14;23967:16;23960:5;23956:28;23947:37;;24144:5;24130:11;24105:23;24101:41;24098:52;24091:5;24088:63;24078:73;;23719:450;;;;:::o;35083:158::-;;;;;:::o;23270:366::-;23336:31;;:::i;:::-;23413:6;23380:9;:14;;:41;;;;;;;;;;;11101:3;23466:6;:33;;23432:9;:24;;:68;;;;;;;;;;;23558:1;11218:8;23530:6;:24;:29;;23511:9;:16;;:48;;;;;;;;;;;11622:3;23599:6;:28;;23570:9;:19;;:58;;;;;;;;;;;23270:366;;;:::o;42577:689::-;42708:19;42714:2;42718:8;42708:5;:19::i;:::-;42787:1;42769:2;:14;;;:19;42765:483;;42809:11;42823:13;;42809:27;;42855:13;42877:8;42871:3;:14;42855:30;;42904:233;42935:62;42974:1;42978:2;42982:7;;;;;;42991:5;42935:30;:62::i;:::-;42930:167;;43033:40;;;;;;;;;;;;;;42930:167;43132:3;43124:5;:11;42904:233;;43219:3;43202:13;;:20;43198:34;;43224:8;;;43198:34;42790:458;;42765:483;42577:689;;;:::o;35681:716::-;35844:4;35890:2;35865:45;;;35911:19;:17;:19::i;:::-;35932:4;35938:7;35947:5;35865:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35861:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36165:1;36148:6;:13;:18;36144:235;;36194:40;;;;;;;;;;;;;;36144:235;36337:6;36331:13;36322:6;36318:2;36314:15;36307:38;35861:529;36034:54;;;36024:64;;;:6;:64;;;;36017:71;;;35681:716;;;;;;:::o;48528:147::-;48665:6;48528:147;;;;;:::o;36859:2966::-;36932:20;36955:13;;36932:36;;36995:1;36983:8;:13;36979:44;;37005:18;;;;;;;;;;;;;;36979:44;37036:61;37066:1;37070:2;37074:12;37088:8;37036:21;:61::i;:::-;37580:1;10580:2;37550:1;:26;;37549:32;37537:8;:45;37511:18;:22;37530:2;37511:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37859:139;37896:2;37950:33;37973:1;37977:2;37981:1;37950:14;:33::i;:::-;37917:30;37938:8;37917:20;:30::i;:::-;:66;37859:18;:139::i;:::-;37825:17;:31;37843:12;37825:31;;;;;;;;;;;:173;;;;38015:16;38046:11;38075:8;38060:12;:23;38046:37;;38596:16;38592:2;38588:25;38576:37;;38968:12;38928:8;38887:1;38825:25;38766:1;38705;38678:335;39339:1;39325:12;39321:20;39279:346;39380:3;39371:7;39368:16;39279:346;;39598:7;39588:8;39585:1;39558:25;39555:1;39552;39547:59;39433:1;39424:7;39420:15;39409:26;;39279:346;;;39283:77;39670:1;39658:8;:13;39654:45;;39680:19;;;;;;;;;;;;;;39654:45;39732:3;39716:13;:19;;;;37285:2462;;39757:60;39786:1;39790:2;39794:12;39808:8;39757:20;:60::i;:::-;36921:2904;36859:2966;;:::o;24271:324::-;24341:14;24574:1;24564:8;24561:15;24535:24;24531:46;24521:56;;24271:324;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:116::-;2023:21;2038:5;2023:21;:::i;:::-;2016:5;2013:32;2003:60;;2059:1;2056;2049:12;2003:60;1953:116;:::o;2075:133::-;2118:5;2156:6;2143:20;2134:29;;2172:30;2196:5;2172:30;:::i;:::-;2075:133;;;;:::o;2214:323::-;2270:6;2319:2;2307:9;2298:7;2294:23;2290:32;2287:119;;;2325:79;;:::i;:::-;2287:119;2445:1;2470:50;2512:7;2503:6;2492:9;2488:22;2470:50;:::i;:::-;2460:60;;2416:114;2214:323;;;;:::o;2543:126::-;2580:7;2620:42;2613:5;2609:54;2598:65;;2543:126;;;:::o;2675:96::-;2712:7;2741:24;2759:5;2741:24;:::i;:::-;2730:35;;2675:96;;;:::o;2777:118::-;2864:24;2882:5;2864:24;:::i;:::-;2859:3;2852:37;2777:118;;:::o;2901:222::-;2994:4;3032:2;3021:9;3017:18;3009:26;;3045:71;3113:1;3102:9;3098:17;3089:6;3045:71;:::i;:::-;2901:222;;;;:::o;3129:99::-;3181:6;3215:5;3209:12;3199:22;;3129:99;;;:::o;3234:169::-;3318:11;3352:6;3347:3;3340:19;3392:4;3387:3;3383:14;3368:29;;3234:169;;;;:::o;3409:246::-;3490:1;3500:113;3514:6;3511:1;3508:13;3500:113;;;3599:1;3594:3;3590:11;3584:18;3580:1;3575:3;3571:11;3564:39;3536:2;3533:1;3529:10;3524:15;;3500:113;;;3647:1;3638:6;3633:3;3629:16;3622:27;3471:184;3409:246;;;:::o;3661:102::-;3702:6;3753:2;3749:7;3744:2;3737:5;3733:14;3729:28;3719:38;;3661:102;;;:::o;3769:377::-;3857:3;3885:39;3918:5;3885:39;:::i;:::-;3940:71;4004:6;3999:3;3940:71;:::i;:::-;3933:78;;4020:65;4078:6;4073:3;4066:4;4059:5;4055:16;4020:65;:::i;:::-;4110:29;4132:6;4110:29;:::i;:::-;4105:3;4101:39;4094:46;;3861:285;3769:377;;;;:::o;4152:313::-;4265:4;4303:2;4292:9;4288:18;4280:26;;4352:9;4346:4;4342:20;4338:1;4327:9;4323:17;4316:47;4380:78;4453:4;4444:6;4380:78;:::i;:::-;4372:86;;4152:313;;;;:::o;4471:122::-;4544:24;4562:5;4544:24;:::i;:::-;4537:5;4534:35;4524:63;;4583:1;4580;4573:12;4524:63;4471:122;:::o;4599:139::-;4645:5;4683:6;4670:20;4661:29;;4699:33;4726:5;4699:33;:::i;:::-;4599:139;;;;:::o;4744:329::-;4803:6;4852:2;4840:9;4831:7;4827:23;4823:32;4820:119;;;4858:79;;:::i;:::-;4820:119;4978:1;5003:53;5048:7;5039:6;5028:9;5024:22;5003:53;:::i;:::-;4993:63;;4949:117;4744:329;;;;:::o;5079:122::-;5152:24;5170:5;5152:24;:::i;:::-;5145:5;5142:35;5132:63;;5191:1;5188;5181:12;5132:63;5079:122;:::o;5207:139::-;5253:5;5291:6;5278:20;5269:29;;5307:33;5334:5;5307:33;:::i;:::-;5207:139;;;;:::o;5352:474::-;5420:6;5428;5477:2;5465:9;5456:7;5452:23;5448:32;5445:119;;;5483:79;;:::i;:::-;5445:119;5603:1;5628:53;5673:7;5664:6;5653:9;5649:22;5628:53;:::i;:::-;5618:63;;5574:117;5730:2;5756:53;5801:7;5792:6;5781:9;5777:22;5756:53;:::i;:::-;5746:63;;5701:118;5352:474;;;;;:::o;5832:329::-;5891:6;5940:2;5928:9;5919:7;5915:23;5911:32;5908:119;;;5946:79;;:::i;:::-;5908:119;6066:1;6091:53;6136:7;6127:6;6116:9;6112:22;6091:53;:::i;:::-;6081:63;;6037:117;5832:329;;;;:::o;6167:619::-;6244:6;6252;6260;6309:2;6297:9;6288:7;6284:23;6280:32;6277:119;;;6315:79;;:::i;:::-;6277:119;6435:1;6460:53;6505:7;6496:6;6485:9;6481:22;6460:53;:::i;:::-;6450:63;;6406:117;6562:2;6588:53;6633:7;6624:6;6613:9;6609:22;6588:53;:::i;:::-;6578:63;;6533:118;6690:2;6716:53;6761:7;6752:6;6741:9;6737:22;6716:53;:::i;:::-;6706:63;;6661:118;6167:619;;;;;:::o;6792:60::-;6820:3;6841:5;6834:12;;6792:60;;;:::o;6858:142::-;6908:9;6941:53;6959:34;6968:24;6986:5;6968:24;:::i;:::-;6959:34;:::i;:::-;6941:53;:::i;:::-;6928:66;;6858:142;;;:::o;7006:126::-;7056:9;7089:37;7120:5;7089:37;:::i;:::-;7076:50;;7006:126;;;:::o;7138:158::-;7220:9;7253:37;7284:5;7253:37;:::i;:::-;7240:50;;7138:158;;;:::o;7302:195::-;7421:69;7484:5;7421:69;:::i;:::-;7416:3;7409:82;7302:195;;:::o;7503:286::-;7628:4;7666:2;7655:9;7651:18;7643:26;;7679:103;7779:1;7768:9;7764:17;7755:6;7679:103;:::i;:::-;7503:286;;;;:::o;7795:117::-;7904:1;7901;7894:12;7918:117;8027:1;8024;8017:12;8041:180;8089:77;8086:1;8079:88;8186:4;8183:1;8176:15;8210:4;8207:1;8200:15;8227:281;8310:27;8332:4;8310:27;:::i;:::-;8302:6;8298:40;8440:6;8428:10;8425:22;8404:18;8392:10;8389:34;8386:62;8383:88;;;8451:18;;:::i;:::-;8383:88;8491:10;8487:2;8480:22;8270:238;8227:281;;:::o;8514:129::-;8548:6;8575:20;;:::i;:::-;8565:30;;8604:33;8632:4;8624:6;8604:33;:::i;:::-;8514:129;;;:::o;8649:308::-;8711:4;8801:18;8793:6;8790:30;8787:56;;;8823:18;;:::i;:::-;8787:56;8861:29;8883:6;8861:29;:::i;:::-;8853:37;;8945:4;8939;8935:15;8927:23;;8649:308;;;:::o;8963:146::-;9060:6;9055:3;9050;9037:30;9101:1;9092:6;9087:3;9083:16;9076:27;8963:146;;;:::o;9115:425::-;9193:5;9218:66;9234:49;9276:6;9234:49;:::i;:::-;9218:66;:::i;:::-;9209:75;;9307:6;9300:5;9293:21;9345:4;9338:5;9334:16;9383:3;9374:6;9369:3;9365:16;9362:25;9359:112;;;9390:79;;:::i;:::-;9359:112;9480:54;9527:6;9522:3;9517;9480:54;:::i;:::-;9199:341;9115:425;;;;;:::o;9560:340::-;9616:5;9665:3;9658:4;9650:6;9646:17;9642:27;9632:122;;9673:79;;:::i;:::-;9632:122;9790:6;9777:20;9815:79;9890:3;9882:6;9875:4;9867:6;9863:17;9815:79;:::i;:::-;9806:88;;9622:278;9560:340;;;;:::o;9906:509::-;9975:6;10024:2;10012:9;10003:7;9999:23;9995:32;9992:119;;;10030:79;;:::i;:::-;9992:119;10178:1;10167:9;10163:17;10150:31;10208:18;10200:6;10197:30;10194:117;;;10230:79;;:::i;:::-;10194:117;10335:63;10390:7;10381:6;10370:9;10366:22;10335:63;:::i;:::-;10325:73;;10121:287;9906:509;;;;:::o;10421:114::-;10488:6;10522:5;10516:12;10506:22;;10421:114;;;:::o;10541:184::-;10640:11;10674:6;10669:3;10662:19;10714:4;10709:3;10705:14;10690:29;;10541:184;;;;:::o;10731:132::-;10798:4;10821:3;10813:11;;10851:4;10846:3;10842:14;10834:22;;10731:132;;;:::o;10869:108::-;10946:24;10964:5;10946:24;:::i;:::-;10941:3;10934:37;10869:108;;:::o;10983:179::-;11052:10;11073:46;11115:3;11107:6;11073:46;:::i;:::-;11151:4;11146:3;11142:14;11128:28;;10983:179;;;;:::o;11168:113::-;11238:4;11270;11265:3;11261:14;11253:22;;11168:113;;;:::o;11317:732::-;11436:3;11465:54;11513:5;11465:54;:::i;:::-;11535:86;11614:6;11609:3;11535:86;:::i;:::-;11528:93;;11645:56;11695:5;11645:56;:::i;:::-;11724:7;11755:1;11740:284;11765:6;11762:1;11759:13;11740:284;;;11841:6;11835:13;11868:63;11927:3;11912:13;11868:63;:::i;:::-;11861:70;;11954:60;12007:6;11954:60;:::i;:::-;11944:70;;11800:224;11787:1;11784;11780:9;11775:14;;11740:284;;;11744:14;12040:3;12033:10;;11441:608;;;11317:732;;;;:::o;12055:373::-;12198:4;12236:2;12225:9;12221:18;12213:26;;12285:9;12279:4;12275:20;12271:1;12260:9;12256:17;12249:47;12313:108;12416:4;12407:6;12313:108;:::i;:::-;12305:116;;12055:373;;;;:::o;12434:468::-;12499:6;12507;12556:2;12544:9;12535:7;12531:23;12527:32;12524:119;;;12562:79;;:::i;:::-;12524:119;12682:1;12707:53;12752:7;12743:6;12732:9;12728:22;12707:53;:::i;:::-;12697:63;;12653:117;12809:2;12835:50;12877:7;12868:6;12857:9;12853:22;12835:50;:::i;:::-;12825:60;;12780:115;12434:468;;;;;:::o;12908:307::-;12969:4;13059:18;13051:6;13048:30;13045:56;;;13081:18;;:::i;:::-;13045:56;13119:29;13141:6;13119:29;:::i;:::-;13111:37;;13203:4;13197;13193:15;13185:23;;12908:307;;;:::o;13221:423::-;13298:5;13323:65;13339:48;13380:6;13339:48;:::i;:::-;13323:65;:::i;:::-;13314:74;;13411:6;13404:5;13397:21;13449:4;13442:5;13438:16;13487:3;13478:6;13473:3;13469:16;13466:25;13463:112;;;13494:79;;:::i;:::-;13463:112;13584:54;13631:6;13626:3;13621;13584:54;:::i;:::-;13304:340;13221:423;;;;;:::o;13663:338::-;13718:5;13767:3;13760:4;13752:6;13748:17;13744:27;13734:122;;13775:79;;:::i;:::-;13734:122;13892:6;13879:20;13917:78;13991:3;13983:6;13976:4;13968:6;13964:17;13917:78;:::i;:::-;13908:87;;13724:277;13663:338;;;;:::o;14007:943::-;14102:6;14110;14118;14126;14175:3;14163:9;14154:7;14150:23;14146:33;14143:120;;;14182:79;;:::i;:::-;14143:120;14302:1;14327:53;14372:7;14363:6;14352:9;14348:22;14327:53;:::i;:::-;14317:63;;14273:117;14429:2;14455:53;14500:7;14491:6;14480:9;14476:22;14455:53;:::i;:::-;14445:63;;14400:118;14557:2;14583:53;14628:7;14619:6;14608:9;14604:22;14583:53;:::i;:::-;14573:63;;14528:118;14713:2;14702:9;14698:18;14685:32;14744:18;14736:6;14733:30;14730:117;;;14766:79;;:::i;:::-;14730:117;14871:62;14925:7;14916:6;14905:9;14901:22;14871:62;:::i;:::-;14861:72;;14656:287;14007:943;;;;;;;:::o;14956:474::-;15024:6;15032;15081:2;15069:9;15060:7;15056:23;15052:32;15049:119;;;15087:79;;:::i;:::-;15049:119;15207:1;15232:53;15277:7;15268:6;15257:9;15253:22;15232:53;:::i;:::-;15222:63;;15178:117;15334:2;15360:53;15405:7;15396:6;15385:9;15381:22;15360:53;:::i;:::-;15350:63;;15305:118;14956:474;;;;;:::o;15436:143::-;15503:9;15536:37;15567:5;15536:37;:::i;:::-;15523:50;;15436:143;;;:::o;15585:165::-;15689:54;15737:5;15689:54;:::i;:::-;15684:3;15677:67;15585:165;;:::o;15756:256::-;15866:4;15904:2;15893:9;15889:18;15881:26;;15917:88;16002:1;15991:9;15987:17;15978:6;15917:88;:::i;:::-;15756:256;;;;:::o;16018:474::-;16086:6;16094;16143:2;16131:9;16122:7;16118:23;16114:32;16111:119;;;16149:79;;:::i;:::-;16111:119;16269:1;16294:53;16339:7;16330:6;16319:9;16315:22;16294:53;:::i;:::-;16284:63;;16240:117;16396:2;16422:53;16467:7;16458:6;16447:9;16443:22;16422:53;:::i;:::-;16412:63;;16367:118;16018:474;;;;;:::o;16498:180::-;16546:77;16543:1;16536:88;16643:4;16640:1;16633:15;16667:4;16664:1;16657:15;16684:320;16728:6;16765:1;16759:4;16755:12;16745:22;;16812:1;16806:4;16802:12;16833:18;16823:81;;16889:4;16881:6;16877:17;16867:27;;16823:81;16951:2;16943:6;16940:14;16920:18;16917:38;16914:84;;16970:18;;:::i;:::-;16914:84;16735:269;16684:320;;;:::o;17010:141::-;17059:4;17082:3;17074:11;;17105:3;17102:1;17095:14;17139:4;17136:1;17126:18;17118:26;;17010:141;;;:::o;17157:93::-;17194:6;17241:2;17236;17229:5;17225:14;17221:23;17211:33;;17157:93;;;:::o;17256:107::-;17300:8;17350:5;17344:4;17340:16;17319:37;;17256:107;;;;:::o;17369:393::-;17438:6;17488:1;17476:10;17472:18;17511:97;17541:66;17530:9;17511:97;:::i;:::-;17629:39;17659:8;17648:9;17629:39;:::i;:::-;17617:51;;17701:4;17697:9;17690:5;17686:21;17677:30;;17750:4;17740:8;17736:19;17729:5;17726:30;17716:40;;17445:317;;17369:393;;;;;:::o;17768:142::-;17818:9;17851:53;17869:34;17878:24;17896:5;17878:24;:::i;:::-;17869:34;:::i;:::-;17851:53;:::i;:::-;17838:66;;17768:142;;;:::o;17916:75::-;17959:3;17980:5;17973:12;;17916:75;;;:::o;17997:269::-;18107:39;18138:7;18107:39;:::i;:::-;18168:91;18217:41;18241:16;18217:41;:::i;:::-;18209:6;18202:4;18196:11;18168:91;:::i;:::-;18162:4;18155:105;18073:193;17997:269;;;:::o;18272:73::-;18317:3;18272:73;:::o;18351:189::-;18428:32;;:::i;:::-;18469:65;18527:6;18519;18513:4;18469:65;:::i;:::-;18404:136;18351:189;;:::o;18546:186::-;18606:120;18623:3;18616:5;18613:14;18606:120;;;18677:39;18714:1;18707:5;18677:39;:::i;:::-;18650:1;18643:5;18639:13;18630:22;;18606:120;;;18546:186;;:::o;18738:543::-;18839:2;18834:3;18831:11;18828:446;;;18873:38;18905:5;18873:38;:::i;:::-;18957:29;18975:10;18957:29;:::i;:::-;18947:8;18943:44;19140:2;19128:10;19125:18;19122:49;;;19161:8;19146:23;;19122:49;19184:80;19240:22;19258:3;19240:22;:::i;:::-;19230:8;19226:37;19213:11;19184:80;:::i;:::-;18843:431;;18828:446;18738:543;;;:::o;19287:117::-;19341:8;19391:5;19385:4;19381:16;19360:37;;19287:117;;;;:::o;19410:169::-;19454:6;19487:51;19535:1;19531:6;19523:5;19520:1;19516:13;19487:51;:::i;:::-;19483:56;19568:4;19562;19558:15;19548:25;;19461:118;19410:169;;;;:::o;19584:295::-;19660:4;19806:29;19831:3;19825:4;19806:29;:::i;:::-;19798:37;;19868:3;19865:1;19861:11;19855:4;19852:21;19844:29;;19584:295;;;;:::o;19884:1395::-;20001:37;20034:3;20001:37;:::i;:::-;20103:18;20095:6;20092:30;20089:56;;;20125:18;;:::i;:::-;20089:56;20169:38;20201:4;20195:11;20169:38;:::i;:::-;20254:67;20314:6;20306;20300:4;20254:67;:::i;:::-;20348:1;20372:4;20359:17;;20404:2;20396:6;20393:14;20421:1;20416:618;;;;21078:1;21095:6;21092:77;;;21144:9;21139:3;21135:19;21129:26;21120:35;;21092:77;21195:67;21255:6;21248:5;21195:67;:::i;:::-;21189:4;21182:81;21051:222;20386:887;;20416:618;20468:4;20464:9;20456:6;20452:22;20502:37;20534:4;20502:37;:::i;:::-;20561:1;20575:208;20589:7;20586:1;20583:14;20575:208;;;20668:9;20663:3;20659:19;20653:26;20645:6;20638:42;20719:1;20711:6;20707:14;20697:24;;20766:2;20755:9;20751:18;20738:31;;20612:4;20609:1;20605:12;20600:17;;20575:208;;;20811:6;20802:7;20799:19;20796:179;;;20869:9;20864:3;20860:19;20854:26;20912:48;20954:4;20946:6;20942:17;20931:9;20912:48;:::i;:::-;20904:6;20897:64;20819:156;20796:179;21021:1;21017;21009:6;21005:14;21001:22;20995:4;20988:36;20423:611;;;20386:887;;19976:1303;;;19884:1395;;:::o;21285:180::-;21333:77;21330:1;21323:88;21430:4;21427:1;21420:15;21454:4;21451:1;21444:15;21471:178;21611:30;21607:1;21599:6;21595:14;21588:54;21471:178;:::o;21655:366::-;21797:3;21818:67;21882:2;21877:3;21818:67;:::i;:::-;21811:74;;21894:93;21983:3;21894:93;:::i;:::-;22012:2;22007:3;22003:12;21996:19;;21655:366;;;:::o;22027:419::-;22193:4;22231:2;22220:9;22216:18;22208:26;;22280:9;22274:4;22270:20;22266:1;22255:9;22251:17;22244:47;22308:131;22434:4;22308:131;:::i;:::-;22300:139;;22027:419;;;:::o;22452:178::-;22592:30;22588:1;22580:6;22576:14;22569:54;22452:178;:::o;22636:366::-;22778:3;22799:67;22863:2;22858:3;22799:67;:::i;:::-;22792:74;;22875:93;22964:3;22875:93;:::i;:::-;22993:2;22988:3;22984:12;22977:19;;22636:366;;;:::o;23008:419::-;23174:4;23212:2;23201:9;23197:18;23189:26;;23261:9;23255:4;23251:20;23247:1;23236:9;23232:17;23225:47;23289:131;23415:4;23289:131;:::i;:::-;23281:139;;23008:419;;;:::o;23433:223::-;23573:34;23569:1;23561:6;23557:14;23550:58;23642:6;23637:2;23629:6;23625:15;23618:31;23433:223;:::o;23662:366::-;23804:3;23825:67;23889:2;23884:3;23825:67;:::i;:::-;23818:74;;23901:93;23990:3;23901:93;:::i;:::-;24019:2;24014:3;24010:12;24003:19;;23662:366;;;:::o;24034:419::-;24200:4;24238:2;24227:9;24223:18;24215:26;;24287:9;24281:4;24277:20;24273:1;24262:9;24258:17;24251:47;24315:131;24441:4;24315:131;:::i;:::-;24307:139;;24034:419;;;:::o;24459:180::-;24507:77;24504:1;24497:88;24604:4;24601:1;24594:15;24628:4;24625:1;24618:15;24645:191;24685:3;24704:20;24722:1;24704:20;:::i;:::-;24699:25;;24738:20;24756:1;24738:20;:::i;:::-;24733:25;;24781:1;24778;24774:9;24767:16;;24802:3;24799:1;24796:10;24793:36;;;24809:18;;:::i;:::-;24793:36;24645:191;;;;:::o;24842:165::-;24982:17;24978:1;24970:6;24966:14;24959:41;24842:165;:::o;25013:366::-;25155:3;25176:67;25240:2;25235:3;25176:67;:::i;:::-;25169:74;;25252:93;25341:3;25252:93;:::i;:::-;25370:2;25365:3;25361:12;25354:19;;25013:366;;;:::o;25385:419::-;25551:4;25589:2;25578:9;25574:18;25566:26;;25638:9;25632:4;25628:20;25624:1;25613:9;25609:17;25602:47;25666:131;25792:4;25666:131;:::i;:::-;25658:139;;25385:419;;;:::o;25810:182::-;25950:34;25946:1;25938:6;25934:14;25927:58;25810:182;:::o;25998:366::-;26140:3;26161:67;26225:2;26220:3;26161:67;:::i;:::-;26154:74;;26237:93;26326:3;26237:93;:::i;:::-;26355:2;26350:3;26346:12;26339:19;;25998:366;;;:::o;26370:419::-;26536:4;26574:2;26563:9;26559:18;26551:26;;26623:9;26617:4;26613:20;26609:1;26598:9;26594:17;26587:47;26651:131;26777:4;26651:131;:::i;:::-;26643:139;;26370:419;;;:::o;26795:410::-;26835:7;26858:20;26876:1;26858:20;:::i;:::-;26853:25;;26892:20;26910:1;26892:20;:::i;:::-;26887:25;;26947:1;26944;26940:9;26969:30;26987:11;26969:30;:::i;:::-;26958:41;;27148:1;27139:7;27135:15;27132:1;27129:22;27109:1;27102:9;27082:83;27059:139;;27178:18;;:::i;:::-;27059:139;26843:362;26795:410;;;;:::o;27211:173::-;27351:25;27347:1;27339:6;27335:14;27328:49;27211:173;:::o;27390:366::-;27532:3;27553:67;27617:2;27612:3;27553:67;:::i;:::-;27546:74;;27629:93;27718:3;27629:93;:::i;:::-;27747:2;27742:3;27738:12;27731:19;;27390:366;;;:::o;27762:419::-;27928:4;27966:2;27955:9;27951:18;27943:26;;28015:9;28009:4;28005:20;28001:1;27990:9;27986:17;27979:47;28043:131;28169:4;28043:131;:::i;:::-;28035:139;;27762:419;;;:::o;28187:172::-;28327:24;28323:1;28315:6;28311:14;28304:48;28187:172;:::o;28365:366::-;28507:3;28528:67;28592:2;28587:3;28528:67;:::i;:::-;28521:74;;28604:93;28693:3;28604:93;:::i;:::-;28722:2;28717:3;28713:12;28706:19;;28365:366;;;:::o;28737:419::-;28903:4;28941:2;28930:9;28926:18;28918:26;;28990:9;28984:4;28980:20;28976:1;28965:9;28961:17;28954:47;29018:131;29144:4;29018:131;:::i;:::-;29010:139;;28737:419;;;:::o;29162:235::-;29302:34;29298:1;29290:6;29286:14;29279:58;29371:18;29366:2;29358:6;29354:15;29347:43;29162:235;:::o;29403:366::-;29545:3;29566:67;29630:2;29625:3;29566:67;:::i;:::-;29559:74;;29642:93;29731:3;29642:93;:::i;:::-;29760:2;29755:3;29751:12;29744:19;;29403:366;;;:::o;29775:419::-;29941:4;29979:2;29968:9;29964:18;29956:26;;30028:9;30022:4;30018:20;30014:1;30003:9;29999:17;29992:47;30056:131;30182:4;30056:131;:::i;:::-;30048:139;;29775:419;;;:::o;30200:148::-;30302:11;30339:3;30324:18;;30200:148;;;;:::o;30354:390::-;30460:3;30488:39;30521:5;30488:39;:::i;:::-;30543:89;30625:6;30620:3;30543:89;:::i;:::-;30536:96;;30641:65;30699:6;30694:3;30687:4;30680:5;30676:16;30641:65;:::i;:::-;30731:6;30726:3;30722:16;30715:23;;30464:280;30354:390;;;;:::o;30750:155::-;30890:7;30886:1;30878:6;30874:14;30867:31;30750:155;:::o;30911:400::-;31071:3;31092:84;31174:1;31169:3;31092:84;:::i;:::-;31085:91;;31185:93;31274:3;31185:93;:::i;:::-;31303:1;31298:3;31294:11;31287:18;;30911:400;;;:::o;31317:701::-;31598:3;31620:95;31711:3;31702:6;31620:95;:::i;:::-;31613:102;;31732:95;31823:3;31814:6;31732:95;:::i;:::-;31725:102;;31844:148;31988:3;31844:148;:::i;:::-;31837:155;;32009:3;32002:10;;31317:701;;;;;:::o;32024:225::-;32164:34;32160:1;32152:6;32148:14;32141:58;32233:8;32228:2;32220:6;32216:15;32209:33;32024:225;:::o;32255:366::-;32397:3;32418:67;32482:2;32477:3;32418:67;:::i;:::-;32411:74;;32494:93;32583:3;32494:93;:::i;:::-;32612:2;32607:3;32603:12;32596:19;;32255:366;;;:::o;32627:419::-;32793:4;32831:2;32820:9;32816:18;32808:26;;32880:9;32874:4;32870:20;32866:1;32855:9;32851:17;32844:47;32908:131;33034:4;32908:131;:::i;:::-;32900:139;;32627:419;;;:::o;33052:182::-;33192:34;33188:1;33180:6;33176:14;33169:58;33052:182;:::o;33240:366::-;33382:3;33403:67;33467:2;33462:3;33403:67;:::i;:::-;33396:74;;33479:93;33568:3;33479:93;:::i;:::-;33597:2;33592:3;33588:12;33581:19;;33240:366;;;:::o;33612:419::-;33778:4;33816:2;33805:9;33801:18;33793:26;;33865:9;33859:4;33855:20;33851:1;33840:9;33836:17;33829:47;33893:131;34019:4;33893:131;:::i;:::-;33885:139;;33612:419;;;:::o;34037:220::-;34177:34;34173:1;34165:6;34161:14;34154:58;34246:3;34241:2;34233:6;34229:15;34222:28;34037:220;:::o;34263:366::-;34405:3;34426:67;34490:2;34485:3;34426:67;:::i;:::-;34419:74;;34502:93;34591:3;34502:93;:::i;:::-;34620:2;34615:3;34611:12;34604:19;;34263:366;;;:::o;34635:419::-;34801:4;34839:2;34828:9;34824:18;34816:26;;34888:9;34882:4;34878:20;34874:1;34863:9;34859:17;34852:47;34916:131;35042:4;34916:131;:::i;:::-;34908:139;;34635:419;;;:::o;35060:143::-;35117:5;35148:6;35142:13;35133:22;;35164:33;35191:5;35164:33;:::i;:::-;35060:143;;;;:::o;35209:351::-;35279:6;35328:2;35316:9;35307:7;35303:23;35299:32;35296:119;;;35334:79;;:::i;:::-;35296:119;35454:1;35479:64;35535:7;35526:6;35515:9;35511:22;35479:64;:::i;:::-;35469:74;;35425:128;35209:351;;;;:::o;35566:172::-;35706:24;35702:1;35694:6;35690:14;35683:48;35566:172;:::o;35744:366::-;35886:3;35907:67;35971:2;35966:3;35907:67;:::i;:::-;35900:74;;35983:93;36072:3;35983:93;:::i;:::-;36101:2;36096:3;36092:12;36085:19;;35744:366;;;:::o;36116:419::-;36282:4;36320:2;36309:9;36305:18;36297:26;;36369:9;36363:4;36359:20;36355:1;36344:9;36340:17;36333:47;36397:131;36523:4;36397:131;:::i;:::-;36389:139;;36116:419;;;:::o;36541:182::-;36681:34;36677:1;36669:6;36665:14;36658:58;36541:182;:::o;36729:366::-;36871:3;36892:67;36956:2;36951:3;36892:67;:::i;:::-;36885:74;;36968:93;37057:3;36968:93;:::i;:::-;37086:2;37081:3;37077:12;37070:19;;36729:366;;;:::o;37101:419::-;37267:4;37305:2;37294:9;37290:18;37282:26;;37354:9;37348:4;37344:20;37340:1;37329:9;37325:17;37318:47;37382:131;37508:4;37382:131;:::i;:::-;37374:139;;37101:419;;;:::o;37526:332::-;37647:4;37685:2;37674:9;37670:18;37662:26;;37698:71;37766:1;37755:9;37751:17;37742:6;37698:71;:::i;:::-;37779:72;37847:2;37836:9;37832:18;37823:6;37779:72;:::i;:::-;37526:332;;;;;:::o;37864:137::-;37918:5;37949:6;37943:13;37934:22;;37965:30;37989:5;37965:30;:::i;:::-;37864:137;;;;:::o;38007:345::-;38074:6;38123:2;38111:9;38102:7;38098:23;38094:32;38091:119;;;38129:79;;:::i;:::-;38091:119;38249:1;38274:61;38327:7;38318:6;38307:9;38303:22;38274:61;:::i;:::-;38264:71;;38220:125;38007:345;;;;:::o;38358:181::-;38498:33;38494:1;38486:6;38482:14;38475:57;38358:181;:::o;38545:366::-;38687:3;38708:67;38772:2;38767:3;38708:67;:::i;:::-;38701:74;;38784:93;38873:3;38784:93;:::i;:::-;38902:2;38897:3;38893:12;38886:19;;38545:366;;;:::o;38917:419::-;39083:4;39121:2;39110:9;39106:18;39098:26;;39170:9;39164:4;39160:20;39156:1;39145:9;39141:17;39134:47;39198:131;39324:4;39198:131;:::i;:::-;39190:139;;38917:419;;;:::o;39342:98::-;39393:6;39427:5;39421:12;39411:22;;39342:98;;;:::o;39446:168::-;39529:11;39563:6;39558:3;39551:19;39603:4;39598:3;39594:14;39579:29;;39446:168;;;;:::o;39620:373::-;39706:3;39734:38;39766:5;39734:38;:::i;:::-;39788:70;39851:6;39846:3;39788:70;:::i;:::-;39781:77;;39867:65;39925:6;39920:3;39913:4;39906:5;39902:16;39867:65;:::i;:::-;39957:29;39979:6;39957:29;:::i;:::-;39952:3;39948:39;39941:46;;39710:283;39620:373;;;;:::o;39999:640::-;40194:4;40232:3;40221:9;40217:19;40209:27;;40246:71;40314:1;40303:9;40299:17;40290:6;40246:71;:::i;:::-;40327:72;40395:2;40384:9;40380:18;40371:6;40327:72;:::i;:::-;40409;40477:2;40466:9;40462:18;40453:6;40409:72;:::i;:::-;40528:9;40522:4;40518:20;40513:2;40502:9;40498:18;40491:48;40556:76;40627:4;40618:6;40556:76;:::i;:::-;40548:84;;39999:640;;;;;;;:::o;40645:141::-;40701:5;40732:6;40726:13;40717:22;;40748:32;40774:5;40748:32;:::i;:::-;40645:141;;;;:::o;40792:349::-;40861:6;40910:2;40898:9;40889:7;40885:23;40881:32;40878:119;;;40916:79;;:::i;:::-;40878:119;41036:1;41061:63;41116:7;41107:6;41096:9;41092:22;41061:63;:::i;:::-;41051:73;;41007:127;40792:349;;;;:::o
Swarm Source
ipfs://96c2fa92636c47142c89b5515c5463b26b5561608790f7706d6f1a2913d2d60b
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.