ERC-721
Overview
Max Total Supply
10,000 ICK
Holders
1,272
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 ICKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ICHOR
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-09 */ // 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/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // 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: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.2 // 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(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // 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; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @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; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](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.2 // 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 { // Reference type for token approval. 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 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 { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _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]`. 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 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 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 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. 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`. ) 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 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // 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: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override 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; } } } // File: contracts/ichor.sol // Dev: https://twitter.com/MatthewPaquette pragma solidity ^0.8.4; contract ICHOR is ERC721AQueryable, Ownable, Pausable { uint256 public MAX_MINTS = 100; uint256 public MAX_SUPPLY = 10000; uint256 public price = 0.006 ether; string public baseURI; mapping (address => bool) public _whiteList; mapping (address => bool) public _badList; mapping (address => bool) public _claimed; uint256 public claimCounterWL; uint256 public claimCounterBAD; uint256 badQuantity = 3; uint256 wlQuantity = 1; bool public _wlClaimPause = false; bool public _badClaimPause = false; uint256 public mintCounter = 0; uint256 public claimCounter = 0; uint256 public airDropCounter = 0; constructor() ERC721A("ICHOR", "ICK") { toggleAllMintPause(); } function mint(uint256 quantity) external payable whenNotPaused { // _safeMint's second argument now takes in a quantity, not a tokenId. require(quantity + _numberMinted(msg.sender) <= MAX_MINTS, "mint: Exceeded the limit per wallet"); require(totalSupply() + quantity <= MAX_SUPPLY, "mint: Not enough tokens left"); require(msg.value >= (price * quantity), "mint: Not enough ether sent"); mintCounter += quantity; _safeMint(msg.sender, quantity); } function BADclaim() external whenNotPaused { require(_badClaimPause == false, "BADclaim: Claim Paused"); require(_claimed[msg.sender] == false, "BADclaim: wallet already claimed."); require(_badList[msg.sender] == true, "BADclaim: wallet is not BAD wallet."); require(badQuantity + _numberMinted(msg.sender) <= MAX_MINTS, "mint: Exceeded the limit per wallet"); require(totalSupply() + badQuantity <= MAX_SUPPLY, "mint: Not enough tokens left"); _claimed[msg.sender] = true; claimCounter += badQuantity; _safeMint(msg.sender, badQuantity); } function wlClaim() external whenNotPaused { require(_wlClaimPause == false, "wlClaim: Claim paused"); require(_claimed[msg.sender] == false, "wlClaim: wallet already claimed."); require(_whiteList[msg.sender] == true, "wlClaim: wallet is not whitelisted."); require(wlQuantity + _numberMinted(msg.sender) <= MAX_MINTS, "mint: Exceeded the limit per wallet"); require(totalSupply() + wlQuantity <= MAX_SUPPLY, "mint: Not enough tokens left"); _claimed[msg.sender] = true; claimCounter += wlQuantity; _safeMint(msg.sender, wlQuantity); } function airDrop(address[] calldata addrs, uint256 quantity) external onlyOwner { uint256 len = addrs.length; require(totalSupply() + (quantity * len) <= MAX_SUPPLY, "airDrop: Not enough tokens to airdrop"); airDropCounter += quantity * len; for (uint256 i = 0; i < len; i++) { _safeMint(addrs[i], quantity); } } function addWhitelist(address[] calldata wallets) external onlyOwner { uint256 len = wallets.length; for (uint i = 0; i < len; i++) { _whiteList[wallets[i]] = true; } } function addBADlist(address[] calldata wallets) external onlyOwner { uint256 len = wallets.length; for (uint i = 0; i < len; i++) { _badList[wallets[i]] = true; } } function updateWLClaimAmount(uint256 amount) external onlyOwner { wlQuantity = amount; } function updateBADClaimAmount(uint256 amount) external onlyOwner { badQuantity = amount; } function pauseWL(bool state) external onlyOwner { _wlClaimPause = state; } function pauseBAD(bool state) external onlyOwner { _badClaimPause = state; } function _baseURI() internal view override returns (string memory) { return baseURI; } function _startTokenId() internal pure override returns (uint256) { return 1; } function setPrice(uint256 _price) external onlyOwner { price = _price; } function setMaxMint(uint256 _max) external onlyOwner { MAX_MINTS = _max; } function toggleAllMintPause() public onlyOwner { paused() ? _unpause() : _pause(); } function setBaseURI(string memory _uri) external onlyOwner { baseURI = _uri; } function updateMaxSupply(uint256 _max) external onlyOwner { MAX_SUPPLY = _max; } function withdraw() external onlyOwner { require(address(this).balance > 0, "withdraw: contract balance must be greater than 0"); uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BADclaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_badClaimPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_badList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_wlClaimPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addBADlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airDropCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimCounterBAD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimCounterWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"pauseBAD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"pauseWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","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":[],"name":"toggleAllMintPause","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateBADClaimAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateWLClaimAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlClaim","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526064600955612710600a55661550f7dca70000600b55600360125560016013556000601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff0219169083151502179055506000601555600060165560006017553480156200007657600080fd5b506040518060400160405280600581526020017f4943484f520000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f49434b00000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000fb92919062000508565b5080600390805190602001906200011492919062000508565b50620001256200017e60201b60201c565b60008190555050506200014d620001416200018760201b60201c565b6200018f60201b60201c565b6000600860146101000a81548160ff021916908315150217905550620001786200025560201b60201c565b620007e6565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000265620002a360201b60201c565b620002756200033460201b60201c565b62000290576200028a6200034b60201b60201c565b620002a1565b620002a0620003c060201b60201c565b5b565b620002b36200018760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002d96200043560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000329906200069f565b60405180910390fd5b565b6000600860149054906101000a900460ff16905090565b6200035b6200045f60201b60201c565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620003a76200018760201b60201c565b604051620003b691906200063e565b60405180910390a1565b620003d0620004b460201b60201c565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6200041c6200018760201b60201c565b6040516200042b91906200063e565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200046f6200033460201b60201c565b15620004b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004a9906200067d565b60405180910390fd5b565b620004c46200033460201b60201c565b62000506576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004fd906200065b565b60405180910390fd5b565b828054620005169062000706565b90600052602060002090601f0160209004810192826200053a576000855562000586565b82601f106200055557805160ff191683800117855562000586565b8280016001018555821562000586579182015b828111156200058557825182559160200191906001019062000568565b5b50905062000595919062000599565b5090565b5b80821115620005b45760008160009055506001016200059a565b5090565b620005c381620006d2565b82525050565b6000620005d8601483620006c1565b9150620005e5826200076b565b602082019050919050565b6000620005ff601083620006c1565b91506200060c8262000794565b602082019050919050565b600062000626602083620006c1565b91506200063382620007bd565b602082019050919050565b6000602082019050620006556000830184620005b8565b92915050565b600060208201905081810360008301526200067681620005c9565b9050919050565b600060208201905081810360008301526200069881620005f0565b9050919050565b60006020820190508181036000830152620006ba8162000617565b9050919050565b600082825260208201905092915050565b6000620006df82620006e6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200071f57607f821691505b602082108114156200073657620007356200073c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614a0a80620007f66000396000f3fe6080604052600436106102ff5760003560e01c806370a0823111610190578063c23dc68f116100dc578063e985e9c511610095578063f103b4331161006f578063f103b43314610b5d578063f2fde38b14610b86578063fd1fc4a014610baf578063fdb3403314610bd8576102ff565b8063e985e9c514610ace578063edac985b14610b0b578063ee8024b414610b34576102ff565b8063c23dc68f146109aa578063c477e30c146109e7578063c87b56dd146109fe578063cce132d114610a3b578063d463a10c14610a66578063dd896a1c14610a91576102ff565b806391b7f5ed11610149578063a035b1fe11610123578063a035b1fe14610911578063a0712d681461093c578063a22cb46514610958578063b88d4fde14610981576102ff565b806391b7f5ed1461088057806395d89b41146108a957806399a2557a146108d4576102ff565b806370a082311461076e578063715018a6146107ab57806373be8f92146107c25780638462151c146107ed57806386dc38e81461082a5780638da5cb5b14610855576102ff565b80633ccfd60b1161024f57806355f804b3116102085780635d9a20a6116101e25780635d9a20a6146106c65780636352211e146106dd5780636a632c571461071a5780636c0360eb14610743576102ff565b806355f804b3146106355780635bbb21771461065e5780635c975abb1461069b576102ff565b80633ccfd60b1461054b57806342842e0e1461056257806346aa52ce1461058b5780634efa8f17146105b6578063545d9d0e146105e1578063547520fe1461060c576102ff565b80631ff55b4a116102bc578063274a32d311610296578063274a32d3146104b557806332cb6b0c146104cc57806333fbb436146104f7578063345765f914610522576102ff565b80631ff55b4a1461043a57806323b872dd14610463578063262f2ad41461048c576102ff565b806301ffc9a71461030457806305d60ffb1461034157806306fdde031461037e578063081812fc146103a9578063095ea7b3146103e657806318160ddd1461040f575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906138fb565b610c15565b6040516103389190613f58565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906135be565b610ca7565b6040516103759190613f58565b60405180910390f35b34801561038a57600080fd5b50610393610cc7565b6040516103a09190613f73565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb919061399e565b610d59565b6040516103dd9190613ead565b60405180910390f35b3480156103f257600080fd5b5061040d60048036038101906104089190613741565b610dd8565b005b34801561041b57600080fd5b50610424610f1c565b6040516104319190614190565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c91906137d4565b610f33565b005b34801561046f57600080fd5b5061048a6004803603810190610485919061362b565b610fe6565b005b34801561049857600080fd5b506104b360048036038101906104ae919061399e565b61130b565b005b3480156104c157600080fd5b506104ca61131d565b005b3480156104d857600080fd5b506104e1611349565b6040516104ee9190614190565b60405180910390f35b34801561050357600080fd5b5061050c61134f565b6040516105199190613f58565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906138ce565b611362565b005b34801561055757600080fd5b50610560611387565b005b34801561056e57600080fd5b506105896004803603810190610584919061362b565b611421565b005b34801561059757600080fd5b506105a0611441565b6040516105ad9190614190565b60405180910390f35b3480156105c257600080fd5b506105cb611447565b6040516105d89190614190565b60405180910390f35b3480156105ed57600080fd5b506105f661144d565b6040516106039190614190565b60405180910390f35b34801561061857600080fd5b50610633600480360381019061062e919061399e565b611453565b005b34801561064157600080fd5b5061065c60048036038101906106579190613955565b611465565b005b34801561066a57600080fd5b5061068560048036038101906106809190613881565b611487565b6040516106929190613f14565b60405180910390f35b3480156106a757600080fd5b506106b061154a565b6040516106bd9190613f58565b60405180910390f35b3480156106d257600080fd5b506106db611561565b005b3480156106e957600080fd5b5061070460048036038101906106ff919061399e565b611819565b6040516107119190613ead565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c91906138ce565b61182b565b005b34801561074f57600080fd5b50610758611850565b6040516107659190613f73565b60405180910390f35b34801561077a57600080fd5b50610795600480360381019061079091906135be565b6118de565b6040516107a29190614190565b60405180910390f35b3480156107b757600080fd5b506107c0611997565b005b3480156107ce57600080fd5b506107d76119ab565b6040516107e49190614190565b60405180910390f35b3480156107f957600080fd5b50610814600480360381019061080f91906135be565b6119b1565b6040516108219190613f36565b60405180910390f35b34801561083657600080fd5b5061083f611afb565b60405161084c9190613f58565b60405180910390f35b34801561086157600080fd5b5061086a611b0e565b6040516108779190613ead565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a2919061399e565b611b38565b005b3480156108b557600080fd5b506108be611b4a565b6040516108cb9190613f73565b60405180910390f35b3480156108e057600080fd5b506108fb60048036038101906108f69190613781565b611bdc565b6040516109089190613f36565b60405180910390f35b34801561091d57600080fd5b50610926611df0565b6040516109339190614190565b60405180910390f35b6109566004803603810190610951919061399e565b611df6565b005b34801561096457600080fd5b5061097f600480360381019061097a9190613701565b611f23565b005b34801561098d57600080fd5b506109a860048036038101906109a3919061367e565b61209b565b005b3480156109b657600080fd5b506109d160048036038101906109cc919061399e565b61210e565b6040516109de9190614175565b60405180910390f35b3480156109f357600080fd5b506109fc612178565b005b348015610a0a57600080fd5b50610a256004803603810190610a20919061399e565b612430565b604051610a329190613f73565b60405180910390f35b348015610a4757600080fd5b50610a506124cf565b604051610a5d9190614190565b60405180910390f35b348015610a7257600080fd5b50610a7b6124d5565b604051610a889190614190565b60405180910390f35b348015610a9d57600080fd5b50610ab86004803603810190610ab391906135be565b6124db565b604051610ac59190613f58565b60405180910390f35b348015610ada57600080fd5b50610af56004803603810190610af091906135eb565b6124fb565b604051610b029190613f58565b60405180910390f35b348015610b1757600080fd5b50610b326004803603810190610b2d91906137d4565b61258f565b005b348015610b4057600080fd5b50610b5b6004803603810190610b56919061399e565b612642565b005b348015610b6957600080fd5b50610b846004803603810190610b7f919061399e565b612654565b005b348015610b9257600080fd5b50610bad6004803603810190610ba891906135be565b612666565b005b348015610bbb57600080fd5b50610bd66004803603810190610bd19190613821565b6126ea565b005b348015610be457600080fd5b50610bff6004803603810190610bfa91906135be565b6127d6565b604051610c0c9190613f58565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c7057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ca05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b606060028054610cd690614470565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0290614470565b8015610d4f5780601f10610d2457610100808354040283529160200191610d4f565b820191906000526020600020905b815481529060010190602001808311610d3257829003601f168201915b5050505050905090565b6000610d64826127f6565b610d9a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610de382611819565b90508073ffffffffffffffffffffffffffffffffffffffff16610e04612855565b73ffffffffffffffffffffffffffffffffffffffff1614610e6757610e3081610e2b612855565b6124fb565b610e66576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610f2661285d565b6001546000540303905090565b610f3b612866565b600082829050905060005b81811015610fe0576001600e6000868685818110610f6757610f6661457a565b5b9050602002016020810190610f7c91906135be565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fd8906144d3565b915050610f46565b50505050565b6000610ff1826128e4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611058576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611064846129b2565b9150915061107a8187611075612855565b6129d9565b6110c65761108f8661108a612855565b6124fb565b6110c5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561112d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61113a8686866001612a1d565b801561114557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611213856111ef888887612a23565b7c020000000000000000000000000000000000000000000000000000000017612a4b565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561129b576000600185019050600060046000838152602001908152602001600020541415611299576000548114611298578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113038686866001612a76565b505050505050565b611313612866565b8060128190555050565b611325612866565b61132d61154a565b61133e57611339612a7c565b611347565b611346612adf565b5b565b600a5481565b601460009054906101000a900460ff1681565b61136a612866565b80601460006101000a81548160ff02191690831515021790555050565b61138f612866565b600047116113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990614155565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561141d573d6000803e3d6000fd5b5050565b61143c8383836040518060200160405280600081525061209b565b505050565b60155481565b60165481565b60115481565b61145b612866565b8060098190555050565b61146d612866565b80600c90805190602001906114839291906132d7565b5050565b6060600083839050905060008167ffffffffffffffff8111156114ad576114ac6145a9565b5b6040519080825280602002602001820160405280156114e657816020015b6114d361335d565b8152602001906001900390816114cb5790505b50905060005b82811461153e576115158686838181106115095761150861457a565b5b9050602002013561210e565b8282815181106115285761152761457a565b5b60200260200101819052508060010190506114ec565b50809250505092915050565b6000600860149054906101000a900460ff16905090565b611569612b42565b60001515601460019054906101000a900460ff161515146115bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b690613fd5565b60405180910390fd5b60001515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611649906140f5565b60405180910390fd5b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc906140d5565b60405180910390fd5b6009546116f133612b8c565b6012546116fe91906142e7565b111561173f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173690614035565b60405180910390fd5b600a5460125461174d610f1c565b61175791906142e7565b1115611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90614095565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506012546016600082825461180491906142e7565b9250508190555061181733601254612be3565b565b6000611824826128e4565b9050919050565b611833612866565b80601460016101000a81548160ff02191690831515021790555050565b600c805461185d90614470565b80601f016020809104026020016040519081016040528092919081815260200182805461188990614470565b80156118d65780601f106118ab576101008083540402835291602001916118d6565b820191906000526020600020905b8154815290600101906020018083116118b957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611946576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61199f612866565b6119a96000612c01565b565b60175481565b606060008060006119c1856118de565b905060008167ffffffffffffffff8111156119df576119de6145a9565b5b604051908082528060200260200182016040528015611a0d5781602001602082028036833780820191505090505b509050611a1861335d565b6000611a2261285d565b90505b838614611aed57611a3581612cc7565b9150816040015115611a4657611ae2565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611a8657816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611ae15780838780600101985081518110611ad457611ad361457a565b5b6020026020010181815250505b5b806001019050611a25565b508195505050505050919050565b601460019054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b40612866565b80600b8190555050565b606060038054611b5990614470565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8590614470565b8015611bd25780601f10611ba757610100808354040283529160200191611bd2565b820191906000526020600020905b815481529060010190602001808311611bb557829003601f168201915b5050505050905090565b6060818310611c17576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611c22612cf2565b9050611c2c61285d565b851015611c3e57611c3b61285d565b94505b80841115611c4a578093505b6000611c55876118de565b905084861015611c78576000868603905081811015611c72578091505b50611c7d565b600090505b60008167ffffffffffffffff811115611c9957611c986145a9565b5b604051908082528060200260200182016040528015611cc75781602001602082028036833780820191505090505b5090506000821415611cdf5780945050505050611de9565b6000611cea8861210e565b905060008160400151611cff57816000015190505b60008990505b888114158015611d155750848714155b15611ddb57611d2381612cc7565b9250826040015115611d3457611dd0565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611d7457826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dcf5780848880600101995081518110611dc257611dc161457a565b5b6020026020010181815250505b5b806001019050611d05565b508583528296505050505050505b9392505050565b600b5481565b611dfe612b42565b600954611e0a33612b8c565b82611e1591906142e7565b1115611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614035565b60405180910390fd5b600a5481611e62610f1c565b611e6c91906142e7565b1115611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea490614095565b60405180910390fd5b80600b54611ebb919061433d565b341015611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490613ff5565b60405180910390fd5b8060156000828254611f0f91906142e7565b92505081905550611f203382612be3565b50565b611f2b612855565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f90576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611f9d612855565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661204a612855565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161208f9190613f58565b60405180910390a35050565b6120a6848484610fe6565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612108576120d184848484612cfb565b612107576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61211661335d565b61211e61335d565b61212661285d565b83108061213a5750612136612cf2565b8310155b156121485780915050612173565b61215183612cc7565b90508060400151156121665780915050612173565b61216f83612e5b565b9150505b919050565b612180612b42565b60001515601460009054906101000a900460ff161515146121d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cd90614015565b60405180910390fd5b60001515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226090614055565b60405180910390fd5b60011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146122fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f390614135565b60405180910390fd5b60095461230833612b8c565b60135461231591906142e7565b1115612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d90614035565b60405180910390fd5b600a54601354612364610f1c565b61236e91906142e7565b11156123af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a690614095565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506013546016600082825461241b91906142e7565b9250508190555061242e33601354612be3565b565b606061243b826127f6565b612471576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061247b612e7b565b905060008151141561249c57604051806020016040528060008152506124c7565b806124a684612f0d565b6040516020016124b7929190613e89565b6040516020818303038152906040525b915050919050565b60095481565b60105481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612597612866565b600082829050905060005b8181101561263c576001600d60008686858181106125c3576125c261457a565b5b90506020020160208101906125d891906135be565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612634906144d3565b9150506125a2565b50505050565b61264a612866565b8060138190555050565b61265c612866565b80600a8190555050565b61266e612866565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d590613fb5565b60405180910390fd5b6126e781612c01565b50565b6126f2612866565b6000838390509050600a548183612709919061433d565b612711610f1c565b61271b91906142e7565b111561275c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612753906140b5565b60405180910390fd5b8082612768919061433d565b6017600082825461277991906142e7565b9250508190555060005b818110156127cf576127bc8585838181106127a1576127a061457a565b5b90506020020160208101906127b691906135be565b84612be3565b80806127c7906144d3565b915050612783565b5050505050565b600e6020528060005260406000206000915054906101000a900460ff1681565b60008161280161285d565b11158015612810575060005482105b801561284e575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b61286e612f5d565b73ffffffffffffffffffffffffffffffffffffffff1661288c611b0e565b73ffffffffffffffffffffffffffffffffffffffff16146128e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d990614115565b60405180910390fd5b565b600080829050806128f361285d565b1161297b5760005481101561297a5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612978575b600081141561296e576004600083600190039350838152602001908152602001600020549050612943565b80925050506129ad565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612a3a868684612f65565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612a84612b42565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ac8612f5d565b604051612ad59190613ead565b60405180910390a1565b612ae7612f6e565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612b2b612f5d565b604051612b389190613ead565b60405180910390a1565b612b4a61154a565b15612b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8190614075565b60405180910390fd5b565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612bfd828260405180602001604052806000815250612fb7565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ccf61335d565b612ceb6004600084815260200190815260200160002054613054565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d21612855565b8786866040518563ffffffff1660e01b8152600401612d439493929190613ec8565b602060405180830381600087803b158015612d5d57600080fd5b505af1925050508015612d8e57506040513d601f19601f82011682018060405250810190612d8b9190613928565b60015b612e08573d8060008114612dbe576040519150601f19603f3d011682016040523d82523d6000602084013e612dc3565b606091505b50600081511415612e00576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612e6361335d565b612e74612e6f836128e4565b613054565b9050919050565b6060600c8054612e8a90614470565b80601f0160208091040260200160405190810160405280929190818152602001828054612eb690614470565b8015612f035780601f10612ed857610100808354040283529160200191612f03565b820191906000526020600020905b815481529060010190602001808311612ee657829003601f168201915b5050505050905090565b606060806040510190508060405280825b600115612f4957600183039250600a81066030018353600a8104905080612f4457612f49565b612f1e565b508181036020830392508083525050919050565b600033905090565b60009392505050565b612f7661154a565b612fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fac90613f95565b60405180910390fd5b565b612fc1838361310a565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461304f57600080549050600083820390505b6130016000868380600101945086612cfb565b613037576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612fee57816000541461304c57600080fd5b50505b505050565b61305c61335d565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600080549050600082141561314b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131586000848385612a1d565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131cf836131c06000866000612a23565b6131c9856132c7565b17612a4b565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461327057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613235565b5060008214156132ac576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506132c26000848385612a76565b505050565b60006001821460e11b9050919050565b8280546132e390614470565b90600052602060002090601f016020900481019282613305576000855561334c565b82601f1061331e57805160ff191683800117855561334c565b8280016001018555821561334c579182015b8281111561334b578251825591602001919060010190613330565b5b50905061335991906133ac565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156133c55760008160009055506001016133ad565b5090565b60006133dc6133d7846141d0565b6141ab565b9050828152602081018484840111156133f8576133f76145e7565b5b61340384828561442e565b509392505050565b600061341e61341984614201565b6141ab565b90508281526020810184848401111561343a576134396145e7565b5b61344584828561442e565b509392505050565b60008135905061345c81614978565b92915050565b60008083601f840112613478576134776145dd565b5b8235905067ffffffffffffffff811115613495576134946145d8565b5b6020830191508360208202830111156134b1576134b06145e2565b5b9250929050565b60008083601f8401126134ce576134cd6145dd565b5b8235905067ffffffffffffffff8111156134eb576134ea6145d8565b5b602083019150836020820283011115613507576135066145e2565b5b9250929050565b60008135905061351d8161498f565b92915050565b600081359050613532816149a6565b92915050565b600081519050613547816149a6565b92915050565b600082601f830112613562576135616145dd565b5b81356135728482602086016133c9565b91505092915050565b600082601f8301126135905761358f6145dd565b5b81356135a084826020860161340b565b91505092915050565b6000813590506135b8816149bd565b92915050565b6000602082840312156135d4576135d36145f1565b5b60006135e28482850161344d565b91505092915050565b60008060408385031215613602576136016145f1565b5b60006136108582860161344d565b92505060206136218582860161344d565b9150509250929050565b600080600060608486031215613644576136436145f1565b5b60006136528682870161344d565b93505060206136638682870161344d565b9250506040613674868287016135a9565b9150509250925092565b60008060008060808587031215613698576136976145f1565b5b60006136a68782880161344d565b94505060206136b78782880161344d565b93505060406136c8878288016135a9565b925050606085013567ffffffffffffffff8111156136e9576136e86145ec565b5b6136f58782880161354d565b91505092959194509250565b60008060408385031215613718576137176145f1565b5b60006137268582860161344d565b92505060206137378582860161350e565b9150509250929050565b60008060408385031215613758576137576145f1565b5b60006137668582860161344d565b9250506020613777858286016135a9565b9150509250929050565b60008060006060848603121561379a576137996145f1565b5b60006137a88682870161344d565b93505060206137b9868287016135a9565b92505060406137ca868287016135a9565b9150509250925092565b600080602083850312156137eb576137ea6145f1565b5b600083013567ffffffffffffffff811115613809576138086145ec565b5b61381585828601613462565b92509250509250929050565b60008060006040848603121561383a576138396145f1565b5b600084013567ffffffffffffffff811115613858576138576145ec565b5b61386486828701613462565b93509350506020613877868287016135a9565b9150509250925092565b60008060208385031215613898576138976145f1565b5b600083013567ffffffffffffffff8111156138b6576138b56145ec565b5b6138c2858286016134b8565b92509250509250929050565b6000602082840312156138e4576138e36145f1565b5b60006138f28482850161350e565b91505092915050565b600060208284031215613911576139106145f1565b5b600061391f84828501613523565b91505092915050565b60006020828403121561393e5761393d6145f1565b5b600061394c84828501613538565b91505092915050565b60006020828403121561396b5761396a6145f1565b5b600082013567ffffffffffffffff811115613989576139886145ec565b5b6139958482850161357b565b91505092915050565b6000602082840312156139b4576139b36145f1565b5b60006139c2848285016135a9565b91505092915050565b60006139d78383613da3565b60808301905092915050565b60006139ef8383613e5c565b60208301905092915050565b613a0481614397565b82525050565b613a1381614397565b82525050565b6000613a2482614252565b613a2e8185614298565b9350613a3983614232565b8060005b83811015613a6a578151613a5188826139cb565b9750613a5c8361427e565b925050600181019050613a3d565b5085935050505092915050565b6000613a828261425d565b613a8c81856142a9565b9350613a9783614242565b8060005b83811015613ac8578151613aaf88826139e3565b9750613aba8361428b565b925050600181019050613a9b565b5085935050505092915050565b613ade816143a9565b82525050565b613aed816143a9565b82525050565b6000613afe82614268565b613b0881856142ba565b9350613b1881856020860161443d565b613b21816145f6565b840191505092915050565b6000613b3782614273565b613b4181856142cb565b9350613b5181856020860161443d565b613b5a816145f6565b840191505092915050565b6000613b7082614273565b613b7a81856142dc565b9350613b8a81856020860161443d565b80840191505092915050565b6000613ba36014836142cb565b9150613bae82614607565b602082019050919050565b6000613bc66026836142cb565b9150613bd182614630565b604082019050919050565b6000613be96016836142cb565b9150613bf48261467f565b602082019050919050565b6000613c0c601b836142cb565b9150613c17826146a8565b602082019050919050565b6000613c2f6015836142cb565b9150613c3a826146d1565b602082019050919050565b6000613c526023836142cb565b9150613c5d826146fa565b604082019050919050565b6000613c756020836142cb565b9150613c8082614749565b602082019050919050565b6000613c986010836142cb565b9150613ca382614772565b602082019050919050565b6000613cbb601c836142cb565b9150613cc68261479b565b602082019050919050565b6000613cde6025836142cb565b9150613ce9826147c4565b604082019050919050565b6000613d016023836142cb565b9150613d0c82614813565b604082019050919050565b6000613d246021836142cb565b9150613d2f82614862565b604082019050919050565b6000613d476020836142cb565b9150613d52826148b1565b602082019050919050565b6000613d6a6023836142cb565b9150613d75826148da565b604082019050919050565b6000613d8d6031836142cb565b9150613d9882614929565b604082019050919050565b608082016000820151613db960008501826139fb565b506020820151613dcc6020850182613e7a565b506040820151613ddf6040850182613ad5565b506060820151613df26060850182613e4d565b50505050565b608082016000820151613e0e60008501826139fb565b506020820151613e216020850182613e7a565b506040820151613e346040850182613ad5565b506060820151613e476060850182613e4d565b50505050565b613e5681614401565b82525050565b613e6581614410565b82525050565b613e7481614410565b82525050565b613e838161441a565b82525050565b6000613e958285613b65565b9150613ea18284613b65565b91508190509392505050565b6000602082019050613ec26000830184613a0a565b92915050565b6000608082019050613edd6000830187613a0a565b613eea6020830186613a0a565b613ef76040830185613e6b565b8181036060830152613f098184613af3565b905095945050505050565b60006020820190508181036000830152613f2e8184613a19565b905092915050565b60006020820190508181036000830152613f508184613a77565b905092915050565b6000602082019050613f6d6000830184613ae4565b92915050565b60006020820190508181036000830152613f8d8184613b2c565b905092915050565b60006020820190508181036000830152613fae81613b96565b9050919050565b60006020820190508181036000830152613fce81613bb9565b9050919050565b60006020820190508181036000830152613fee81613bdc565b9050919050565b6000602082019050818103600083015261400e81613bff565b9050919050565b6000602082019050818103600083015261402e81613c22565b9050919050565b6000602082019050818103600083015261404e81613c45565b9050919050565b6000602082019050818103600083015261406e81613c68565b9050919050565b6000602082019050818103600083015261408e81613c8b565b9050919050565b600060208201905081810360008301526140ae81613cae565b9050919050565b600060208201905081810360008301526140ce81613cd1565b9050919050565b600060208201905081810360008301526140ee81613cf4565b9050919050565b6000602082019050818103600083015261410e81613d17565b9050919050565b6000602082019050818103600083015261412e81613d3a565b9050919050565b6000602082019050818103600083015261414e81613d5d565b9050919050565b6000602082019050818103600083015261416e81613d80565b9050919050565b600060808201905061418a6000830184613df8565b92915050565b60006020820190506141a56000830184613e6b565b92915050565b60006141b56141c6565b90506141c182826144a2565b919050565b6000604051905090565b600067ffffffffffffffff8211156141eb576141ea6145a9565b5b6141f4826145f6565b9050602081019050919050565b600067ffffffffffffffff82111561421c5761421b6145a9565b5b614225826145f6565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142f282614410565b91506142fd83614410565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143325761433161451c565b5b828201905092915050565b600061434882614410565b915061435383614410565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561438c5761438b61451c565b5b828202905092915050565b60006143a2826143e1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561445b578082015181840152602081019050614440565b8381111561446a576000848401525b50505050565b6000600282049050600182168061448857607f821691505b6020821081141561449c5761449b61454b565b5b50919050565b6144ab826145f6565b810181811067ffffffffffffffff821117156144ca576144c96145a9565b5b80604052505050565b60006144de82614410565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145115761451061451c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f424144636c61696d3a20436c61696d2050617573656400000000000000000000600082015250565b7f6d696e743a204e6f7420656e6f7567682065746865722073656e740000000000600082015250565b7f776c436c61696d3a20436c61696d207061757365640000000000000000000000600082015250565b7f6d696e743a20457863656564656420746865206c696d6974207065722077616c60008201527f6c65740000000000000000000000000000000000000000000000000000000000602082015250565b7f776c436c61696d3a2077616c6c657420616c726561647920636c61696d65642e600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f6d696e743a204e6f7420656e6f75676820746f6b656e73206c65667400000000600082015250565b7f61697244726f703a204e6f7420656e6f75676820746f6b656e7320746f20616960008201527f7264726f70000000000000000000000000000000000000000000000000000000602082015250565b7f424144636c61696d3a2077616c6c6574206973206e6f74204241442077616c6c60008201527f65742e0000000000000000000000000000000000000000000000000000000000602082015250565b7f424144636c61696d3a2077616c6c657420616c726561647920636c61696d656460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f776c436c61696d3a2077616c6c6574206973206e6f742077686974656c69737460008201527f65642e0000000000000000000000000000000000000000000000000000000000602082015250565b7f77697468647261773a20636f6e74726163742062616c616e6365206d7573742060008201527f62652067726561746572207468616e2030000000000000000000000000000000602082015250565b61498181614397565b811461498c57600080fd5b50565b614998816143a9565b81146149a357600080fd5b50565b6149af816143b5565b81146149ba57600080fd5b50565b6149c681614410565b81146149d157600080fd5b5056fea2646970667358221220521b406f0cddae8a0f20759a57b6ae7110e50c46da1f466eebed1df53491bbd564736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102ff5760003560e01c806370a0823111610190578063c23dc68f116100dc578063e985e9c511610095578063f103b4331161006f578063f103b43314610b5d578063f2fde38b14610b86578063fd1fc4a014610baf578063fdb3403314610bd8576102ff565b8063e985e9c514610ace578063edac985b14610b0b578063ee8024b414610b34576102ff565b8063c23dc68f146109aa578063c477e30c146109e7578063c87b56dd146109fe578063cce132d114610a3b578063d463a10c14610a66578063dd896a1c14610a91576102ff565b806391b7f5ed11610149578063a035b1fe11610123578063a035b1fe14610911578063a0712d681461093c578063a22cb46514610958578063b88d4fde14610981576102ff565b806391b7f5ed1461088057806395d89b41146108a957806399a2557a146108d4576102ff565b806370a082311461076e578063715018a6146107ab57806373be8f92146107c25780638462151c146107ed57806386dc38e81461082a5780638da5cb5b14610855576102ff565b80633ccfd60b1161024f57806355f804b3116102085780635d9a20a6116101e25780635d9a20a6146106c65780636352211e146106dd5780636a632c571461071a5780636c0360eb14610743576102ff565b806355f804b3146106355780635bbb21771461065e5780635c975abb1461069b576102ff565b80633ccfd60b1461054b57806342842e0e1461056257806346aa52ce1461058b5780634efa8f17146105b6578063545d9d0e146105e1578063547520fe1461060c576102ff565b80631ff55b4a116102bc578063274a32d311610296578063274a32d3146104b557806332cb6b0c146104cc57806333fbb436146104f7578063345765f914610522576102ff565b80631ff55b4a1461043a57806323b872dd14610463578063262f2ad41461048c576102ff565b806301ffc9a71461030457806305d60ffb1461034157806306fdde031461037e578063081812fc146103a9578063095ea7b3146103e657806318160ddd1461040f575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906138fb565b610c15565b6040516103389190613f58565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906135be565b610ca7565b6040516103759190613f58565b60405180910390f35b34801561038a57600080fd5b50610393610cc7565b6040516103a09190613f73565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb919061399e565b610d59565b6040516103dd9190613ead565b60405180910390f35b3480156103f257600080fd5b5061040d60048036038101906104089190613741565b610dd8565b005b34801561041b57600080fd5b50610424610f1c565b6040516104319190614190565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c91906137d4565b610f33565b005b34801561046f57600080fd5b5061048a6004803603810190610485919061362b565b610fe6565b005b34801561049857600080fd5b506104b360048036038101906104ae919061399e565b61130b565b005b3480156104c157600080fd5b506104ca61131d565b005b3480156104d857600080fd5b506104e1611349565b6040516104ee9190614190565b60405180910390f35b34801561050357600080fd5b5061050c61134f565b6040516105199190613f58565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906138ce565b611362565b005b34801561055757600080fd5b50610560611387565b005b34801561056e57600080fd5b506105896004803603810190610584919061362b565b611421565b005b34801561059757600080fd5b506105a0611441565b6040516105ad9190614190565b60405180910390f35b3480156105c257600080fd5b506105cb611447565b6040516105d89190614190565b60405180910390f35b3480156105ed57600080fd5b506105f661144d565b6040516106039190614190565b60405180910390f35b34801561061857600080fd5b50610633600480360381019061062e919061399e565b611453565b005b34801561064157600080fd5b5061065c60048036038101906106579190613955565b611465565b005b34801561066a57600080fd5b5061068560048036038101906106809190613881565b611487565b6040516106929190613f14565b60405180910390f35b3480156106a757600080fd5b506106b061154a565b6040516106bd9190613f58565b60405180910390f35b3480156106d257600080fd5b506106db611561565b005b3480156106e957600080fd5b5061070460048036038101906106ff919061399e565b611819565b6040516107119190613ead565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c91906138ce565b61182b565b005b34801561074f57600080fd5b50610758611850565b6040516107659190613f73565b60405180910390f35b34801561077a57600080fd5b50610795600480360381019061079091906135be565b6118de565b6040516107a29190614190565b60405180910390f35b3480156107b757600080fd5b506107c0611997565b005b3480156107ce57600080fd5b506107d76119ab565b6040516107e49190614190565b60405180910390f35b3480156107f957600080fd5b50610814600480360381019061080f91906135be565b6119b1565b6040516108219190613f36565b60405180910390f35b34801561083657600080fd5b5061083f611afb565b60405161084c9190613f58565b60405180910390f35b34801561086157600080fd5b5061086a611b0e565b6040516108779190613ead565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a2919061399e565b611b38565b005b3480156108b557600080fd5b506108be611b4a565b6040516108cb9190613f73565b60405180910390f35b3480156108e057600080fd5b506108fb60048036038101906108f69190613781565b611bdc565b6040516109089190613f36565b60405180910390f35b34801561091d57600080fd5b50610926611df0565b6040516109339190614190565b60405180910390f35b6109566004803603810190610951919061399e565b611df6565b005b34801561096457600080fd5b5061097f600480360381019061097a9190613701565b611f23565b005b34801561098d57600080fd5b506109a860048036038101906109a3919061367e565b61209b565b005b3480156109b657600080fd5b506109d160048036038101906109cc919061399e565b61210e565b6040516109de9190614175565b60405180910390f35b3480156109f357600080fd5b506109fc612178565b005b348015610a0a57600080fd5b50610a256004803603810190610a20919061399e565b612430565b604051610a329190613f73565b60405180910390f35b348015610a4757600080fd5b50610a506124cf565b604051610a5d9190614190565b60405180910390f35b348015610a7257600080fd5b50610a7b6124d5565b604051610a889190614190565b60405180910390f35b348015610a9d57600080fd5b50610ab86004803603810190610ab391906135be565b6124db565b604051610ac59190613f58565b60405180910390f35b348015610ada57600080fd5b50610af56004803603810190610af091906135eb565b6124fb565b604051610b029190613f58565b60405180910390f35b348015610b1757600080fd5b50610b326004803603810190610b2d91906137d4565b61258f565b005b348015610b4057600080fd5b50610b5b6004803603810190610b56919061399e565b612642565b005b348015610b6957600080fd5b50610b846004803603810190610b7f919061399e565b612654565b005b348015610b9257600080fd5b50610bad6004803603810190610ba891906135be565b612666565b005b348015610bbb57600080fd5b50610bd66004803603810190610bd19190613821565b6126ea565b005b348015610be457600080fd5b50610bff6004803603810190610bfa91906135be565b6127d6565b604051610c0c9190613f58565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c7057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ca05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b606060028054610cd690614470565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0290614470565b8015610d4f5780601f10610d2457610100808354040283529160200191610d4f565b820191906000526020600020905b815481529060010190602001808311610d3257829003601f168201915b5050505050905090565b6000610d64826127f6565b610d9a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610de382611819565b90508073ffffffffffffffffffffffffffffffffffffffff16610e04612855565b73ffffffffffffffffffffffffffffffffffffffff1614610e6757610e3081610e2b612855565b6124fb565b610e66576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610f2661285d565b6001546000540303905090565b610f3b612866565b600082829050905060005b81811015610fe0576001600e6000868685818110610f6757610f6661457a565b5b9050602002016020810190610f7c91906135be565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fd8906144d3565b915050610f46565b50505050565b6000610ff1826128e4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611058576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611064846129b2565b9150915061107a8187611075612855565b6129d9565b6110c65761108f8661108a612855565b6124fb565b6110c5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561112d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61113a8686866001612a1d565b801561114557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611213856111ef888887612a23565b7c020000000000000000000000000000000000000000000000000000000017612a4b565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561129b576000600185019050600060046000838152602001908152602001600020541415611299576000548114611298578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113038686866001612a76565b505050505050565b611313612866565b8060128190555050565b611325612866565b61132d61154a565b61133e57611339612a7c565b611347565b611346612adf565b5b565b600a5481565b601460009054906101000a900460ff1681565b61136a612866565b80601460006101000a81548160ff02191690831515021790555050565b61138f612866565b600047116113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990614155565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561141d573d6000803e3d6000fd5b5050565b61143c8383836040518060200160405280600081525061209b565b505050565b60155481565b60165481565b60115481565b61145b612866565b8060098190555050565b61146d612866565b80600c90805190602001906114839291906132d7565b5050565b6060600083839050905060008167ffffffffffffffff8111156114ad576114ac6145a9565b5b6040519080825280602002602001820160405280156114e657816020015b6114d361335d565b8152602001906001900390816114cb5790505b50905060005b82811461153e576115158686838181106115095761150861457a565b5b9050602002013561210e565b8282815181106115285761152761457a565b5b60200260200101819052508060010190506114ec565b50809250505092915050565b6000600860149054906101000a900460ff16905090565b611569612b42565b60001515601460019054906101000a900460ff161515146115bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b690613fd5565b60405180910390fd5b60001515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611649906140f5565b60405180910390fd5b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc906140d5565b60405180910390fd5b6009546116f133612b8c565b6012546116fe91906142e7565b111561173f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173690614035565b60405180910390fd5b600a5460125461174d610f1c565b61175791906142e7565b1115611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90614095565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506012546016600082825461180491906142e7565b9250508190555061181733601254612be3565b565b6000611824826128e4565b9050919050565b611833612866565b80601460016101000a81548160ff02191690831515021790555050565b600c805461185d90614470565b80601f016020809104026020016040519081016040528092919081815260200182805461188990614470565b80156118d65780601f106118ab576101008083540402835291602001916118d6565b820191906000526020600020905b8154815290600101906020018083116118b957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611946576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61199f612866565b6119a96000612c01565b565b60175481565b606060008060006119c1856118de565b905060008167ffffffffffffffff8111156119df576119de6145a9565b5b604051908082528060200260200182016040528015611a0d5781602001602082028036833780820191505090505b509050611a1861335d565b6000611a2261285d565b90505b838614611aed57611a3581612cc7565b9150816040015115611a4657611ae2565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611a8657816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611ae15780838780600101985081518110611ad457611ad361457a565b5b6020026020010181815250505b5b806001019050611a25565b508195505050505050919050565b601460019054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b40612866565b80600b8190555050565b606060038054611b5990614470565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8590614470565b8015611bd25780601f10611ba757610100808354040283529160200191611bd2565b820191906000526020600020905b815481529060010190602001808311611bb557829003601f168201915b5050505050905090565b6060818310611c17576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611c22612cf2565b9050611c2c61285d565b851015611c3e57611c3b61285d565b94505b80841115611c4a578093505b6000611c55876118de565b905084861015611c78576000868603905081811015611c72578091505b50611c7d565b600090505b60008167ffffffffffffffff811115611c9957611c986145a9565b5b604051908082528060200260200182016040528015611cc75781602001602082028036833780820191505090505b5090506000821415611cdf5780945050505050611de9565b6000611cea8861210e565b905060008160400151611cff57816000015190505b60008990505b888114158015611d155750848714155b15611ddb57611d2381612cc7565b9250826040015115611d3457611dd0565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611d7457826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dcf5780848880600101995081518110611dc257611dc161457a565b5b6020026020010181815250505b5b806001019050611d05565b508583528296505050505050505b9392505050565b600b5481565b611dfe612b42565b600954611e0a33612b8c565b82611e1591906142e7565b1115611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614035565b60405180910390fd5b600a5481611e62610f1c565b611e6c91906142e7565b1115611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea490614095565b60405180910390fd5b80600b54611ebb919061433d565b341015611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490613ff5565b60405180910390fd5b8060156000828254611f0f91906142e7565b92505081905550611f203382612be3565b50565b611f2b612855565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f90576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611f9d612855565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661204a612855565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161208f9190613f58565b60405180910390a35050565b6120a6848484610fe6565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612108576120d184848484612cfb565b612107576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61211661335d565b61211e61335d565b61212661285d565b83108061213a5750612136612cf2565b8310155b156121485780915050612173565b61215183612cc7565b90508060400151156121665780915050612173565b61216f83612e5b565b9150505b919050565b612180612b42565b60001515601460009054906101000a900460ff161515146121d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cd90614015565b60405180910390fd5b60001515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226090614055565b60405180910390fd5b60011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146122fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f390614135565b60405180910390fd5b60095461230833612b8c565b60135461231591906142e7565b1115612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d90614035565b60405180910390fd5b600a54601354612364610f1c565b61236e91906142e7565b11156123af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a690614095565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506013546016600082825461241b91906142e7565b9250508190555061242e33601354612be3565b565b606061243b826127f6565b612471576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061247b612e7b565b905060008151141561249c57604051806020016040528060008152506124c7565b806124a684612f0d565b6040516020016124b7929190613e89565b6040516020818303038152906040525b915050919050565b60095481565b60105481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612597612866565b600082829050905060005b8181101561263c576001600d60008686858181106125c3576125c261457a565b5b90506020020160208101906125d891906135be565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612634906144d3565b9150506125a2565b50505050565b61264a612866565b8060138190555050565b61265c612866565b80600a8190555050565b61266e612866565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d590613fb5565b60405180910390fd5b6126e781612c01565b50565b6126f2612866565b6000838390509050600a548183612709919061433d565b612711610f1c565b61271b91906142e7565b111561275c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612753906140b5565b60405180910390fd5b8082612768919061433d565b6017600082825461277991906142e7565b9250508190555060005b818110156127cf576127bc8585838181106127a1576127a061457a565b5b90506020020160208101906127b691906135be565b84612be3565b80806127c7906144d3565b915050612783565b5050505050565b600e6020528060005260406000206000915054906101000a900460ff1681565b60008161280161285d565b11158015612810575060005482105b801561284e575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b61286e612f5d565b73ffffffffffffffffffffffffffffffffffffffff1661288c611b0e565b73ffffffffffffffffffffffffffffffffffffffff16146128e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d990614115565b60405180910390fd5b565b600080829050806128f361285d565b1161297b5760005481101561297a5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612978575b600081141561296e576004600083600190039350838152602001908152602001600020549050612943565b80925050506129ad565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612a3a868684612f65565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612a84612b42565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ac8612f5d565b604051612ad59190613ead565b60405180910390a1565b612ae7612f6e565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612b2b612f5d565b604051612b389190613ead565b60405180910390a1565b612b4a61154a565b15612b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8190614075565b60405180910390fd5b565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612bfd828260405180602001604052806000815250612fb7565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ccf61335d565b612ceb6004600084815260200190815260200160002054613054565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d21612855565b8786866040518563ffffffff1660e01b8152600401612d439493929190613ec8565b602060405180830381600087803b158015612d5d57600080fd5b505af1925050508015612d8e57506040513d601f19601f82011682018060405250810190612d8b9190613928565b60015b612e08573d8060008114612dbe576040519150601f19603f3d011682016040523d82523d6000602084013e612dc3565b606091505b50600081511415612e00576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612e6361335d565b612e74612e6f836128e4565b613054565b9050919050565b6060600c8054612e8a90614470565b80601f0160208091040260200160405190810160405280929190818152602001828054612eb690614470565b8015612f035780601f10612ed857610100808354040283529160200191612f03565b820191906000526020600020905b815481529060010190602001808311612ee657829003601f168201915b5050505050905090565b606060806040510190508060405280825b600115612f4957600183039250600a81066030018353600a8104905080612f4457612f49565b612f1e565b508181036020830392508083525050919050565b600033905090565b60009392505050565b612f7661154a565b612fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fac90613f95565b60405180910390fd5b565b612fc1838361310a565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461304f57600080549050600083820390505b6130016000868380600101945086612cfb565b613037576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612fee57816000541461304c57600080fd5b50505b505050565b61305c61335d565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600080549050600082141561314b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131586000848385612a1d565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131cf836131c06000866000612a23565b6131c9856132c7565b17612a4b565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461327057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613235565b5060008214156132ac576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506132c26000848385612a76565b505050565b60006001821460e11b9050919050565b8280546132e390614470565b90600052602060002090601f016020900481019282613305576000855561334c565b82601f1061331e57805160ff191683800117855561334c565b8280016001018555821561334c579182015b8281111561334b578251825591602001919060010190613330565b5b50905061335991906133ac565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156133c55760008160009055506001016133ad565b5090565b60006133dc6133d7846141d0565b6141ab565b9050828152602081018484840111156133f8576133f76145e7565b5b61340384828561442e565b509392505050565b600061341e61341984614201565b6141ab565b90508281526020810184848401111561343a576134396145e7565b5b61344584828561442e565b509392505050565b60008135905061345c81614978565b92915050565b60008083601f840112613478576134776145dd565b5b8235905067ffffffffffffffff811115613495576134946145d8565b5b6020830191508360208202830111156134b1576134b06145e2565b5b9250929050565b60008083601f8401126134ce576134cd6145dd565b5b8235905067ffffffffffffffff8111156134eb576134ea6145d8565b5b602083019150836020820283011115613507576135066145e2565b5b9250929050565b60008135905061351d8161498f565b92915050565b600081359050613532816149a6565b92915050565b600081519050613547816149a6565b92915050565b600082601f830112613562576135616145dd565b5b81356135728482602086016133c9565b91505092915050565b600082601f8301126135905761358f6145dd565b5b81356135a084826020860161340b565b91505092915050565b6000813590506135b8816149bd565b92915050565b6000602082840312156135d4576135d36145f1565b5b60006135e28482850161344d565b91505092915050565b60008060408385031215613602576136016145f1565b5b60006136108582860161344d565b92505060206136218582860161344d565b9150509250929050565b600080600060608486031215613644576136436145f1565b5b60006136528682870161344d565b93505060206136638682870161344d565b9250506040613674868287016135a9565b9150509250925092565b60008060008060808587031215613698576136976145f1565b5b60006136a68782880161344d565b94505060206136b78782880161344d565b93505060406136c8878288016135a9565b925050606085013567ffffffffffffffff8111156136e9576136e86145ec565b5b6136f58782880161354d565b91505092959194509250565b60008060408385031215613718576137176145f1565b5b60006137268582860161344d565b92505060206137378582860161350e565b9150509250929050565b60008060408385031215613758576137576145f1565b5b60006137668582860161344d565b9250506020613777858286016135a9565b9150509250929050565b60008060006060848603121561379a576137996145f1565b5b60006137a88682870161344d565b93505060206137b9868287016135a9565b92505060406137ca868287016135a9565b9150509250925092565b600080602083850312156137eb576137ea6145f1565b5b600083013567ffffffffffffffff811115613809576138086145ec565b5b61381585828601613462565b92509250509250929050565b60008060006040848603121561383a576138396145f1565b5b600084013567ffffffffffffffff811115613858576138576145ec565b5b61386486828701613462565b93509350506020613877868287016135a9565b9150509250925092565b60008060208385031215613898576138976145f1565b5b600083013567ffffffffffffffff8111156138b6576138b56145ec565b5b6138c2858286016134b8565b92509250509250929050565b6000602082840312156138e4576138e36145f1565b5b60006138f28482850161350e565b91505092915050565b600060208284031215613911576139106145f1565b5b600061391f84828501613523565b91505092915050565b60006020828403121561393e5761393d6145f1565b5b600061394c84828501613538565b91505092915050565b60006020828403121561396b5761396a6145f1565b5b600082013567ffffffffffffffff811115613989576139886145ec565b5b6139958482850161357b565b91505092915050565b6000602082840312156139b4576139b36145f1565b5b60006139c2848285016135a9565b91505092915050565b60006139d78383613da3565b60808301905092915050565b60006139ef8383613e5c565b60208301905092915050565b613a0481614397565b82525050565b613a1381614397565b82525050565b6000613a2482614252565b613a2e8185614298565b9350613a3983614232565b8060005b83811015613a6a578151613a5188826139cb565b9750613a5c8361427e565b925050600181019050613a3d565b5085935050505092915050565b6000613a828261425d565b613a8c81856142a9565b9350613a9783614242565b8060005b83811015613ac8578151613aaf88826139e3565b9750613aba8361428b565b925050600181019050613a9b565b5085935050505092915050565b613ade816143a9565b82525050565b613aed816143a9565b82525050565b6000613afe82614268565b613b0881856142ba565b9350613b1881856020860161443d565b613b21816145f6565b840191505092915050565b6000613b3782614273565b613b4181856142cb565b9350613b5181856020860161443d565b613b5a816145f6565b840191505092915050565b6000613b7082614273565b613b7a81856142dc565b9350613b8a81856020860161443d565b80840191505092915050565b6000613ba36014836142cb565b9150613bae82614607565b602082019050919050565b6000613bc66026836142cb565b9150613bd182614630565b604082019050919050565b6000613be96016836142cb565b9150613bf48261467f565b602082019050919050565b6000613c0c601b836142cb565b9150613c17826146a8565b602082019050919050565b6000613c2f6015836142cb565b9150613c3a826146d1565b602082019050919050565b6000613c526023836142cb565b9150613c5d826146fa565b604082019050919050565b6000613c756020836142cb565b9150613c8082614749565b602082019050919050565b6000613c986010836142cb565b9150613ca382614772565b602082019050919050565b6000613cbb601c836142cb565b9150613cc68261479b565b602082019050919050565b6000613cde6025836142cb565b9150613ce9826147c4565b604082019050919050565b6000613d016023836142cb565b9150613d0c82614813565b604082019050919050565b6000613d246021836142cb565b9150613d2f82614862565b604082019050919050565b6000613d476020836142cb565b9150613d52826148b1565b602082019050919050565b6000613d6a6023836142cb565b9150613d75826148da565b604082019050919050565b6000613d8d6031836142cb565b9150613d9882614929565b604082019050919050565b608082016000820151613db960008501826139fb565b506020820151613dcc6020850182613e7a565b506040820151613ddf6040850182613ad5565b506060820151613df26060850182613e4d565b50505050565b608082016000820151613e0e60008501826139fb565b506020820151613e216020850182613e7a565b506040820151613e346040850182613ad5565b506060820151613e476060850182613e4d565b50505050565b613e5681614401565b82525050565b613e6581614410565b82525050565b613e7481614410565b82525050565b613e838161441a565b82525050565b6000613e958285613b65565b9150613ea18284613b65565b91508190509392505050565b6000602082019050613ec26000830184613a0a565b92915050565b6000608082019050613edd6000830187613a0a565b613eea6020830186613a0a565b613ef76040830185613e6b565b8181036060830152613f098184613af3565b905095945050505050565b60006020820190508181036000830152613f2e8184613a19565b905092915050565b60006020820190508181036000830152613f508184613a77565b905092915050565b6000602082019050613f6d6000830184613ae4565b92915050565b60006020820190508181036000830152613f8d8184613b2c565b905092915050565b60006020820190508181036000830152613fae81613b96565b9050919050565b60006020820190508181036000830152613fce81613bb9565b9050919050565b60006020820190508181036000830152613fee81613bdc565b9050919050565b6000602082019050818103600083015261400e81613bff565b9050919050565b6000602082019050818103600083015261402e81613c22565b9050919050565b6000602082019050818103600083015261404e81613c45565b9050919050565b6000602082019050818103600083015261406e81613c68565b9050919050565b6000602082019050818103600083015261408e81613c8b565b9050919050565b600060208201905081810360008301526140ae81613cae565b9050919050565b600060208201905081810360008301526140ce81613cd1565b9050919050565b600060208201905081810360008301526140ee81613cf4565b9050919050565b6000602082019050818103600083015261410e81613d17565b9050919050565b6000602082019050818103600083015261412e81613d3a565b9050919050565b6000602082019050818103600083015261414e81613d5d565b9050919050565b6000602082019050818103600083015261416e81613d80565b9050919050565b600060808201905061418a6000830184613df8565b92915050565b60006020820190506141a56000830184613e6b565b92915050565b60006141b56141c6565b90506141c182826144a2565b919050565b6000604051905090565b600067ffffffffffffffff8211156141eb576141ea6145a9565b5b6141f4826145f6565b9050602081019050919050565b600067ffffffffffffffff82111561421c5761421b6145a9565b5b614225826145f6565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142f282614410565b91506142fd83614410565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143325761433161451c565b5b828201905092915050565b600061434882614410565b915061435383614410565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561438c5761438b61451c565b5b828202905092915050565b60006143a2826143e1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561445b578082015181840152602081019050614440565b8381111561446a576000848401525b50505050565b6000600282049050600182168061448857607f821691505b6020821081141561449c5761449b61454b565b5b50919050565b6144ab826145f6565b810181811067ffffffffffffffff821117156144ca576144c96145a9565b5b80604052505050565b60006144de82614410565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145115761451061451c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f424144636c61696d3a20436c61696d2050617573656400000000000000000000600082015250565b7f6d696e743a204e6f7420656e6f7567682065746865722073656e740000000000600082015250565b7f776c436c61696d3a20436c61696d207061757365640000000000000000000000600082015250565b7f6d696e743a20457863656564656420746865206c696d6974207065722077616c60008201527f6c65740000000000000000000000000000000000000000000000000000000000602082015250565b7f776c436c61696d3a2077616c6c657420616c726561647920636c61696d65642e600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f6d696e743a204e6f7420656e6f75676820746f6b656e73206c65667400000000600082015250565b7f61697244726f703a204e6f7420656e6f75676820746f6b656e7320746f20616960008201527f7264726f70000000000000000000000000000000000000000000000000000000602082015250565b7f424144636c61696d3a2077616c6c6574206973206e6f74204241442077616c6c60008201527f65742e0000000000000000000000000000000000000000000000000000000000602082015250565b7f424144636c61696d3a2077616c6c657420616c726561647920636c61696d656460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f776c436c61696d3a2077616c6c6574206973206e6f742077686974656c69737460008201527f65642e0000000000000000000000000000000000000000000000000000000000602082015250565b7f77697468647261773a20636f6e74726163742062616c616e6365206d7573742060008201527f62652067726561746572207468616e2030000000000000000000000000000000602082015250565b61498181614397565b811461498c57600080fd5b50565b614998816143a9565b81146149a357600080fd5b50565b6149af816143b5565b81146149ba57600080fd5b50565b6149c681614410565b81146149d157600080fd5b5056fea2646970667358221220521b406f0cddae8a0f20759a57b6ae7110e50c46da1f466eebed1df53491bbd564736f6c63430008070033
Deployed Bytecode Sourcemap
66161:4739:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24683:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66372:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25585:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32068:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31509:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21336:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69308:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35775:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69636:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70342:98;;;;;;;;;;;;;:::i;:::-;;66259:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66658;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69749:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70650:245;;;;;;;;;;;;;:::i;:::-;;38688:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66741:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66778:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66558:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70246:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70448:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61266:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2566:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67458:618;;;;;;;;;;;;;:::i;:::-;;26978:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69845:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66342:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22520:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5431:103;;;;;;;;;;;;;:::i;:::-;;66816:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65142:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66698:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4783:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70152:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25761:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62182:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66299:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66943:507;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32626:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39471:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60679:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68084:612;;;;;;;;;;;;;:::i;:::-;;25971:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66222:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66522:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66472:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33091:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69087:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69525:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70548:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5689:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68704:375;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66422:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24683:639;24768:4;25107:10;25092:25;;:11;:25;;;;:102;;;;25184:10;25169:25;;:11;:25;;;;25092:102;:179;;;;25261:10;25246:25;;:11;:25;;;;25092:179;25072:199;;24683:639;;;:::o;66372:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;25585:100::-;25639:13;25672:5;25665:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25585:100;:::o;32068:218::-;32144:7;32169:16;32177:7;32169;:16::i;:::-;32164:64;;32194:34;;;;;;;;;;;;;;32164:64;32248:15;:24;32264:7;32248:24;;;;;;;;;;;:30;;;;;;;;;;;;32241:37;;32068:218;;;:::o;31509:400::-;31590:13;31606:16;31614:7;31606;:16::i;:::-;31590:32;;31662:5;31639:28;;:19;:17;:19::i;:::-;:28;;;31635:175;;31687:44;31704:5;31711:19;:17;:19::i;:::-;31687:16;:44::i;:::-;31682:128;;31759:35;;;;;;;;;;;;;;31682:128;31635:175;31855:2;31822:15;:24;31838:7;31822:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;31893:7;31889:2;31873:28;;31882:5;31873:28;;;;;;;;;;;;31579:330;31509:400;;:::o;21336:323::-;21397:7;21625:15;:13;:15::i;:::-;21610:12;;21594:13;;:28;:46;21587:53;;21336:323;:::o;69308:209::-;4669:13;:11;:13::i;:::-;69386:11:::1;69400:7;;:14;;69386:28;;69430:6;69425:85;69446:3;69442:1;:7;69425:85;;;69494:4;69471:8;:20;69480:7;;69488:1;69480:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;69471:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;69451:3;;;;;:::i;:::-;;;;69425:85;;;;69375:142;69308:209:::0;;:::o;35775:2817::-;35909:27;35939;35958:7;35939:18;:27::i;:::-;35909:57;;36024:4;35983:45;;35999:19;35983:45;;;35979:86;;36037:28;;;;;;;;;;;;;;35979:86;36079:27;36108:23;36135:35;36162:7;36135:26;:35::i;:::-;36078:92;;;;36270:68;36295:15;36312:4;36318:19;:17;:19::i;:::-;36270:24;:68::i;:::-;36265:180;;36358:43;36375:4;36381:19;:17;:19::i;:::-;36358:16;:43::i;:::-;36353:92;;36410:35;;;;;;;;;;;;;;36353:92;36265:180;36476:1;36462:16;;:2;:16;;;36458:52;;;36487:23;;;;;;;;;;;;;;36458:52;36523:43;36545:4;36551:2;36555:7;36564:1;36523:21;:43::i;:::-;36659:15;36656:160;;;36799:1;36778:19;36771:30;36656:160;37196:18;:24;37215:4;37196:24;;;;;;;;;;;;;;;;37194:26;;;;;;;;;;;;37265:18;:22;37284:2;37265:22;;;;;;;;;;;;;;;;37263:24;;;;;;;;;;;37587:146;37624:2;37673:45;37688:4;37694:2;37698:19;37673:14;:45::i;:::-;17735:8;37645:73;37587:18;:146::i;:::-;37558:17;:26;37576:7;37558:26;;;;;;;;;;;:175;;;;37904:1;17735:8;37853:19;:47;:52;37849:627;;;37926:19;37958:1;37948:7;:11;37926:33;;38115:1;38081:17;:30;38099:11;38081:30;;;;;;;;;;;;:35;38077:384;;;38219:13;;38204:11;:28;38200:242;;38399:19;38366:17;:30;38384:11;38366:30;;;;;;;;;;;:52;;;;38200:242;38077:384;37907:569;37849:627;38523:7;38519:2;38504:27;;38513:4;38504:27;;;;;;;;;;;;38542:42;38563:4;38569:2;38573:7;38582:1;38542:20;:42::i;:::-;35898:2694;;;35775:2817;;;:::o;69636:104::-;4669:13;:11;:13::i;:::-;69726:6:::1;69712:11;:20;;;;69636:104:::0;:::o;70342:98::-;4669:13;:11;:13::i;:::-;70400:8:::1;:6;:8::i;:::-;:32;;70424:8;:6;:8::i;:::-;70400:32;;;70411:10;:8;:10::i;:::-;70400:32;70342:98::o:0;66259:33::-;;;;:::o;66658:::-;;;;;;;;;;;;;:::o;69749:88::-;4669:13;:11;:13::i;:::-;69824:5:::1;69808:13;;:21;;;;;;;;;;;;;;;;;;69749:88:::0;:::o;70650:245::-;4669:13;:11;:13::i;:::-;70732:1:::1;70708:21;:25;70700:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;70799:15;70817:21;70799:39;;70858:10;70850:28;;:37;70879:7;70850:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;70689:206;70650:245::o:0;38688:185::-;38826:39;38843:4;38849:2;38853:7;38826:39;;;;;;;;;;;;:16;:39::i;:::-;38688:185;;;:::o;66741:30::-;;;;:::o;66778:31::-;;;;:::o;66558:30::-;;;;:::o;70246:88::-;4669:13;:11;:13::i;:::-;70322:4:::1;70310:9;:16;;;;70246:88:::0;:::o;70448:92::-;4669:13;:11;:13::i;:::-;70528:4:::1;70518:7;:14;;;;;;;;;;;;:::i;:::-;;70448:92:::0;:::o;61266:528::-;61410:23;61476:22;61501:8;;:15;;61476:40;;61531:34;61589:14;61568:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;61531:73;;61624:9;61619:125;61640:14;61635:1;:19;61619:125;;61696:32;61716:8;;61725:1;61716:11;;;;;;;:::i;:::-;;;;;;;;61696:19;:32::i;:::-;61680:10;61691:1;61680:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;61656:3;;;;;61619:125;;;;61765:10;61758:17;;;;61266:528;;;;:::o;2566:86::-;2613:4;2637:7;;;;;;;;;;;2630:14;;2566:86;:::o;67458:618::-;2171:19;:17;:19::i;:::-;67538:5:::1;67520:23;;:14;;;;;;;;;;;:23;;;67512:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;67613:5;67589:29;;:8;:20;67598:10;67589:20;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;67581:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;67699:4;67675:28;;:8;:20;67684:10;67675:20;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;67667:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;67805:9;;67776:25;67790:10;67776:13;:25::i;:::-;67762:11;;:39;;;;:::i;:::-;:52;;67754:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;67904:10;;67889:11;;67873:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:41;;67865:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;67981:4;67958:8;:20;67967:10;67958:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;68012:11;;67996:12;;:27;;;;;;;:::i;:::-;;;;;;;;68034:34;68044:10;68056:11;;68034:9;:34::i;:::-;67458:618::o:0;26978:152::-;27050:7;27093:27;27112:7;27093:18;:27::i;:::-;27070:52;;26978:152;;;:::o;69845:90::-;4669:13;:11;:13::i;:::-;69922:5:::1;69905:14;;:22;;;;;;;;;;;;;;;;;;69845:90:::0;:::o;66342:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22520:233::-;22592:7;22633:1;22616:19;;:5;:19;;;22612:60;;;22644:28;;;;;;;;;;;;;;22612:60;16679:13;22690:18;:25;22709:5;22690:25;;;;;;;;;;;;;;;;:55;22683:62;;22520:233;;;:::o;5431:103::-;4669:13;:11;:13::i;:::-;5496:30:::1;5523:1;5496:18;:30::i;:::-;5431:103::o:0;66816:33::-;;;;:::o;65142:900::-;65220:16;65274:19;65308:25;65348:22;65373:16;65383:5;65373:9;:16::i;:::-;65348:41;;65404:25;65446:14;65432:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65404:57;;65476:31;;:::i;:::-;65527:9;65539:15;:13;:15::i;:::-;65527:27;;65522:472;65571:14;65556:11;:29;65522:472;;65623:15;65636:1;65623:12;:15::i;:::-;65611:27;;65661:9;:16;;;65657:73;;;65702:8;;65657:73;65778:1;65752:28;;:9;:14;;;:28;;;65748:111;;65825:9;:14;;;65805:34;;65748:111;65902:5;65881:26;;:17;:26;;;65877:102;;;65958:1;65932:8;65941:13;;;;;;65932:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;65877:102;65522:472;65587:3;;;;;65522:472;;;;66015:8;66008:15;;;;;;;65142:900;;;:::o;66698:34::-;;;;;;;;;;;;;:::o;4783:87::-;4829:7;4856:6;;;;;;;;;;;4849:13;;4783:87;:::o;70152:86::-;4669:13;:11;:13::i;:::-;70224:6:::1;70216:5;:14;;;;70152:86:::0;:::o;25761:104::-;25817:13;25850:7;25843:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25761:104;:::o;62182:2513::-;62325:16;62392:4;62383:5;:13;62379:45;;62405:19;;;;;;;;;;;;;;62379:45;62439:19;62473:17;62493:14;:12;:14::i;:::-;62473:34;;62593:15;:13;:15::i;:::-;62585:5;:23;62581:87;;;62637:15;:13;:15::i;:::-;62629:23;;62581:87;62744:9;62737:4;:16;62733:73;;;62781:9;62774:16;;62733:73;62820:25;62848:16;62858:5;62848:9;:16::i;:::-;62820:44;;63042:4;63034:5;:12;63030:278;;;63067:19;63096:5;63089:4;:12;63067:34;;63138:17;63124:11;:31;63120:111;;;63200:11;63180:31;;63120:111;63048:198;63030:278;;;63291:1;63271:21;;63030:278;63322:25;63364:17;63350:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63322:60;;63422:1;63401:17;:22;63397:78;;;63451:8;63444:15;;;;;;;;63397:78;63619:31;63653:26;63673:5;63653:19;:26::i;:::-;63619:60;;63694:25;63939:9;:16;;;63934:92;;63996:9;:14;;;63976:34;;63934:92;64045:9;64057:5;64045:17;;64040:478;64069:4;64064:1;:9;;:45;;;;;64092:17;64077:11;:32;;64064:45;64040:478;;;64147:15;64160:1;64147:12;:15::i;:::-;64135:27;;64185:9;:16;;;64181:73;;;64226:8;;64181:73;64302:1;64276:28;;:9;:14;;;:28;;;64272:111;;64349:9;:14;;;64329:34;;64272:111;64426:5;64405:26;;:17;:26;;;64401:102;;;64482:1;64456:8;64465:13;;;;;;64456:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;64401:102;64040:478;64111:3;;;;;64040:478;;;;64620:11;64610:8;64603:29;64668:8;64661:15;;;;;;;;62182:2513;;;;;;:::o;66299:34::-;;;;:::o;66943:507::-;2171:19;:17;:19::i;:::-;67145:9:::1;;67116:25;67130:10;67116:13;:25::i;:::-;67105:8;:36;;;;:::i;:::-;:49;;67097:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;67241:10;;67229:8;67213:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;67205:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;67325:8;67317:5;;:16;;;;:::i;:::-;67303:9;:31;;67295:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;67392:8;67377:11;;:23;;;;;;;:::i;:::-;;;;;;;;67411:31;67421:10;67433:8;67411:9;:31::i;:::-;66943:507:::0;:::o;32626:308::-;32737:19;:17;:19::i;:::-;32725:31;;:8;:31;;;32721:61;;;32765:17;;;;;;;;;;;;;;32721:61;32847:8;32795:18;:39;32814:19;:17;:19::i;:::-;32795:39;;;;;;;;;;;;;;;:49;32835:8;32795:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32907:8;32871:55;;32886:19;:17;:19::i;:::-;32871:55;;;32917:8;32871:55;;;;;;:::i;:::-;;;;;;;;32626:308;;:::o;39471:399::-;39638:31;39651:4;39657:2;39661:7;39638:12;:31::i;:::-;39702:1;39684:2;:14;;;:19;39680:183;;39723:56;39754:4;39760:2;39764:7;39773:5;39723:30;:56::i;:::-;39718:145;;39807:40;;;;;;;;;;;;;;39718:145;39680:183;39471:399;;;;:::o;60679:428::-;60763:21;;:::i;:::-;60797:31;;:::i;:::-;60853:15;:13;:15::i;:::-;60843:7;:25;:54;;;;60883:14;:12;:14::i;:::-;60872:7;:25;;60843:54;60839:103;;;60921:9;60914:16;;;;;60839:103;60964:21;60977:7;60964:12;:21::i;:::-;60952:33;;61000:9;:16;;;60996:65;;;61040:9;61033:16;;;;;60996:65;61078:21;61091:7;61078:12;:21::i;:::-;61071:28;;;60679:428;;;;:::o;68084:612::-;2171:19;:17;:19::i;:::-;68162:5:::1;68145:22;;:13;;;;;;;;;;;:22;;;68137:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;68236:5;68212:29;;:8;:20;68221:10;68212:20;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;68204:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;68323:4;68297:30;;:10;:22;68308:10;68297:22;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;68289:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;68428:9;;68399:25;68413:10;68399:13;:25::i;:::-;68386:10;;:38;;;;:::i;:::-;:51;;68378:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;68526:10;;68512;;68496:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:40;;68488:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;68603:4;68580:8;:20;68589:10;68580:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;68634:10;;68618:12;;:26;;;;;;;:::i;:::-;;;;;;;;68655:33;68665:10;68677;;68655:9;:33::i;:::-;68084:612::o:0;25971:318::-;26044:13;26075:16;26083:7;26075;:16::i;:::-;26070:59;;26100:29;;;;;;;;;;;;;;26070:59;26142:21;26166:10;:8;:10::i;:::-;26142:34;;26219:1;26200:7;26194:21;:26;;:87;;;;;;;;;;;;;;;;;26247:7;26256:18;26266:7;26256:9;:18::i;:::-;26230:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26194:87;26187:94;;;25971:318;;;:::o;66222:30::-;;;;:::o;66522:29::-;;;;:::o;66472:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;33091:164::-;33188:4;33212:18;:25;33231:5;33212:25;;;;;;;;;;;;;;;:35;33238:8;33212:35;;;;;;;;;;;;;;;;;;;;;;;;;33205:42;;33091:164;;;;:::o;69087:213::-;4669:13;:11;:13::i;:::-;69167:11:::1;69181:7;;:14;;69167:28;;69211:6;69206:87;69227:3;69223:1;:7;69206:87;;;69277:4;69252:10;:22;69263:7;;69271:1;69263:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;69252:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;69232:3;;;;;:::i;:::-;;;;69206:87;;;;69156:144;69087:213:::0;;:::o;69525:102::-;4669:13;:11;:13::i;:::-;69613:6:::1;69600:10;:19;;;;69525:102:::0;:::o;70548:94::-;4669:13;:11;:13::i;:::-;70630:4:::1;70617:10;:17;;;;70548:94:::0;:::o;5689:201::-;4669:13;:11;:13::i;:::-;5798:1:::1;5778:22;;:8;:22;;;;5770:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5854:28;5873:8;5854:18;:28::i;:::-;5689:201:::0;:::o;68704:375::-;4669:13;:11;:13::i;:::-;68795:11:::1;68809:5;;:12;;68795:26;;68876:10;;68868:3;68857:8;:14;;;;:::i;:::-;68840:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:46;;68832:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;68968:3;68957:8;:14;;;;:::i;:::-;68939;;:32;;;;;;;:::i;:::-;;;;;;;;68987:9;68982:90;69006:3;69002:1;:7;68982:90;;;69031:29;69041:5;;69047:1;69041:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;69051;69031:9;:29::i;:::-;69011:3;;;;;:::i;:::-;;;;68982:90;;;;68784:295;68704:375:::0;;;:::o;66422:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;33513:282::-;33578:4;33634:7;33615:15;:13;:15::i;:::-;:26;;:66;;;;;33668:13;;33658:7;:23;33615:66;:153;;;;;33767:1;17455:8;33719:17;:26;33737:7;33719:26;;;;;;;;;;;;:44;:49;33615:153;33595:173;;33513:282;;;:::o;55279:105::-;55339:7;55366:10;55359:17;;55279:105;:::o;70051:93::-;70108:7;70135:1;70128:8;;70051:93;:::o;4948:132::-;5023:12;:10;:12::i;:::-;5012:23;;:7;:5;:7::i;:::-;:23;;;5004:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4948:132::o;28133:1275::-;28200:7;28220:12;28235:7;28220:22;;28303:4;28284:15;:13;:15::i;:::-;:23;28280:1061;;28337:13;;28330:4;:20;28326:1015;;;28375:14;28392:17;:23;28410:4;28392:23;;;;;;;;;;;;28375:40;;28509:1;17455:8;28481:6;:24;:29;28477:845;;;29146:113;29163:1;29153:6;:11;29146:113;;;29206:17;:25;29224:6;;;;;;;29206:25;;;;;;;;;;;;29197:34;;29146:113;;;29292:6;29285:13;;;;;;28477:845;28352:989;28326:1015;28280:1061;29369:31;;;;;;;;;;;;;;28133:1275;;;;:::o;34676:479::-;34778:27;34807:23;34848:38;34889:15;:24;34905:7;34889:24;;;;;;;;;;;34848:65;;35060:18;35037:41;;35117:19;35111:26;35092:45;;35022:126;34676:479;;;:::o;33904:659::-;34053:11;34218:16;34211:5;34207:28;34198:37;;34378:16;34367:9;34363:32;34350:45;;34528:15;34517:9;34514:30;34506:5;34495:9;34492:20;34489:56;34479:66;;33904:659;;;;;:::o;40532:159::-;;;;;:::o;54588:311::-;54723:7;54743:16;17859:3;54769:19;:41;;54743:68;;17859:3;54837:31;54848:4;54854:2;54858:9;54837:10;:31::i;:::-;54829:40;;:62;;54822:69;;;54588:311;;;;;:::o;29956:450::-;30036:14;30204:16;30197:5;30193:28;30184:37;;30381:5;30367:11;30342:23;30338:41;30335:52;30328:5;30325:63;30315:73;;29956:450;;;;:::o;41356:158::-;;;;;:::o;3162:118::-;2171:19;:17;:19::i;:::-;3232:4:::1;3222:7;;:14;;;;;;;;;;;;;;;;;;3252:20;3259:12;:10;:12::i;:::-;3252:20;;;;;;:::i;:::-;;;;;;;;3162:118::o:0;3421:120::-;2430:16;:14;:16::i;:::-;3490:5:::1;3480:7;;:15;;;;;;;;;;;;;;;;;;3511:22;3520:12;:10;:12::i;:::-;3511:22;;;;;;:::i;:::-;;;;;;;;3421:120::o:0;2725:108::-;2796:8;:6;:8::i;:::-;2795:9;2787:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;2725:108::o;22835:178::-;22896:7;16679:13;16817:2;22924:18;:25;22943:5;22924:25;;;;;;;;;;;;;;;;:50;;22923:82;22916:89;;22835:178;;;:::o;49111:112::-;49188:27;49198:2;49202:8;49188:27;;;;;;;;;;;;:9;:27::i;:::-;49111:112;;:::o;6050:191::-;6124:16;6143:6;;;;;;;;;;;6124:25;;6169:8;6160:6;;:17;;;;;;;;;;;;;;;;;;6224:8;6193:40;;6214:8;6193:40;;;;;;;;;;;;6113:128;6050:191;:::o;27581:161::-;27649:21;;:::i;:::-;27690:44;27709:17;:24;27727:5;27709:24;;;;;;;;;;;;27690:18;:44::i;:::-;27683:51;;27581:161;;;:::o;21023:103::-;21078:7;21105:13;;21098:20;;21023:103;:::o;41954:716::-;42117:4;42163:2;42138:45;;;42184:19;:17;:19::i;:::-;42205:4;42211:7;42220:5;42138:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42134:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42438:1;42421:6;:13;:18;42417:235;;;42467:40;;;;;;;;;;;;;;42417:235;42610:6;42604:13;42595:6;42591:2;42587:15;42580:38;42134:529;42307:54;;;42297:64;;;:6;:64;;;;42290:71;;;41954:716;;;;;;:::o;27319:166::-;27389:21;;:::i;:::-;27430:47;27449:27;27468:7;27449:18;:27::i;:::-;27430:18;:47::i;:::-;27423:54;;27319:166;;;:::o;69943:100::-;69995:13;70028:7;70021:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69943:100;:::o;55486:1581::-;55551:17;55976:4;55969;55963:11;55959:22;55952:29;;56068:3;56062:4;56055:17;56174:3;56413:5;56395:428;56421:1;56395:428;;;56461:1;56456:3;56452:11;56445:18;;56632:2;56626:4;56622:13;56618:2;56614:22;56609:3;56601:36;56726:2;56720:4;56716:13;56708:21;;56793:4;56783:25;;56801:5;;56783:25;56395:428;;;56399:21;56862:3;56857;56853:13;56977:4;56972:3;56968:14;56961:21;;57042:6;57037:3;57030:19;55590:1470;;55486:1581;;;:::o;679:98::-;732:7;759:10;752:17;;679:98;:::o;54289:147::-;54426:6;54289:147;;;;;:::o;2910:108::-;2977:8;:6;:8::i;:::-;2969:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2910:108::o;48338:689::-;48469:19;48475:2;48479:8;48469:5;:19::i;:::-;48548:1;48530:2;:14;;;:19;48526:483;;48570:11;48584:13;;48570:27;;48616:13;48638:8;48632:3;:14;48616:30;;48665:233;48696:62;48735:1;48739:2;48743:7;;;;;;48752:5;48696:30;:62::i;:::-;48691:167;;48794:40;;;;;;;;;;;;;;48691:167;48893:3;48885:5;:11;48665:233;;48980:3;48963:13;;:20;48959:34;;48985:8;;;48959:34;48551:458;;48526:483;48338:689;;;:::o;29507:366::-;29573:31;;:::i;:::-;29650:6;29617:9;:14;;:41;;;;;;;;;;;17338:3;29703:6;:33;;29669:9;:24;;:68;;;;;;;;;;;29795:1;17455:8;29767:6;:24;:29;;29748:9;:16;;:48;;;;;;;;;;;17859:3;29836:6;:28;;29807:9;:19;;:58;;;;;;;;;;;29507:366;;;:::o;43132:2454::-;43205:20;43228:13;;43205:36;;43268:1;43256:8;:13;43252:44;;;43278:18;;;;;;;;;;;;;;43252:44;43309:61;43339:1;43343:2;43347:12;43361:8;43309:21;:61::i;:::-;43853:1;16817:2;43823:1;:26;;43822:32;43810:8;:45;43784:18;:22;43803:2;43784:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;44132:139;44169:2;44223:33;44246:1;44250:2;44254:1;44223:14;:33::i;:::-;44190:30;44211:8;44190:20;:30::i;:::-;:66;44132:18;:139::i;:::-;44098:17;:31;44116:12;44098:31;;;;;;;;;;;:173;;;;44288:16;44319:11;44348:8;44333:12;:23;44319:37;;44603:16;44599:2;44595:25;44583:37;;44975:12;44935:8;44894:1;44832:25;44773:1;44712;44685:335;45100:1;45086:12;45082:20;45040:346;45141:3;45132:7;45129:16;45040:346;;45359:7;45349:8;45346:1;45319:25;45316:1;45313;45308:59;45194:1;45185:7;45181:15;45170:26;;45040:346;;;45044:77;45431:1;45419:8;:13;45415:45;;;45441:19;;;;;;;;;;;;;;45415:45;45493:3;45477:13;:19;;;;43558:1950;;45518:60;45547:1;45551:2;45555:12;45569:8;45518:20;:60::i;:::-;43194:2392;43132:2454;;:::o;30508:324::-;30578:14;30811:1;30801:8;30798:15;30772:24;30768:46;30758:56;;30508:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2352:5;2390:6;2377:20;2368:29;;2406:32;2432:5;2406:32;:::i;:::-;2307:137;;;;:::o;2450:141::-;2506:5;2537:6;2531:13;2522:22;;2553:32;2579:5;2553:32;:::i;:::-;2450:141;;;;:::o;2610:338::-;2665:5;2714:3;2707:4;2699:6;2695:17;2691:27;2681:122;;2722:79;;:::i;:::-;2681:122;2839:6;2826:20;2864:78;2938:3;2930:6;2923:4;2915:6;2911:17;2864:78;:::i;:::-;2855:87;;2671:277;2610:338;;;;:::o;2968:340::-;3024:5;3073:3;3066:4;3058:6;3054:17;3050:27;3040:122;;3081:79;;:::i;:::-;3040:122;3198:6;3185:20;3223:79;3298:3;3290:6;3283:4;3275:6;3271:17;3223:79;:::i;:::-;3214:88;;3030:278;2968:340;;;;:::o;3314:139::-;3360:5;3398:6;3385:20;3376:29;;3414:33;3441:5;3414:33;:::i;:::-;3314:139;;;;:::o;3459:329::-;3518:6;3567:2;3555:9;3546:7;3542:23;3538:32;3535:119;;;3573:79;;:::i;:::-;3535:119;3693:1;3718:53;3763:7;3754:6;3743:9;3739:22;3718:53;:::i;:::-;3708:63;;3664:117;3459:329;;;;:::o;3794:474::-;3862:6;3870;3919:2;3907:9;3898:7;3894:23;3890:32;3887:119;;;3925:79;;:::i;:::-;3887:119;4045:1;4070:53;4115:7;4106:6;4095:9;4091:22;4070:53;:::i;:::-;4060:63;;4016:117;4172:2;4198:53;4243:7;4234:6;4223:9;4219:22;4198:53;:::i;:::-;4188:63;;4143:118;3794:474;;;;;:::o;4274:619::-;4351:6;4359;4367;4416:2;4404:9;4395:7;4391:23;4387:32;4384:119;;;4422:79;;:::i;:::-;4384:119;4542:1;4567:53;4612:7;4603:6;4592:9;4588:22;4567:53;:::i;:::-;4557:63;;4513:117;4669:2;4695:53;4740:7;4731:6;4720:9;4716:22;4695:53;:::i;:::-;4685:63;;4640:118;4797:2;4823:53;4868:7;4859:6;4848:9;4844:22;4823:53;:::i;:::-;4813:63;;4768:118;4274:619;;;;;:::o;4899:943::-;4994:6;5002;5010;5018;5067:3;5055:9;5046:7;5042:23;5038:33;5035:120;;;5074:79;;:::i;:::-;5035:120;5194:1;5219:53;5264:7;5255:6;5244:9;5240:22;5219:53;:::i;:::-;5209:63;;5165:117;5321:2;5347:53;5392:7;5383:6;5372:9;5368:22;5347:53;:::i;:::-;5337:63;;5292:118;5449:2;5475:53;5520:7;5511:6;5500:9;5496:22;5475:53;:::i;:::-;5465:63;;5420:118;5605:2;5594:9;5590:18;5577:32;5636:18;5628:6;5625:30;5622:117;;;5658:79;;:::i;:::-;5622:117;5763:62;5817:7;5808:6;5797:9;5793:22;5763:62;:::i;:::-;5753:72;;5548:287;4899:943;;;;;;;:::o;5848:468::-;5913:6;5921;5970:2;5958:9;5949:7;5945:23;5941:32;5938:119;;;5976:79;;:::i;:::-;5938:119;6096:1;6121:53;6166:7;6157:6;6146:9;6142:22;6121:53;:::i;:::-;6111:63;;6067:117;6223:2;6249:50;6291:7;6282:6;6271:9;6267:22;6249:50;:::i;:::-;6239:60;;6194:115;5848:468;;;;;:::o;6322:474::-;6390:6;6398;6447:2;6435:9;6426:7;6422:23;6418:32;6415:119;;;6453:79;;:::i;:::-;6415:119;6573:1;6598:53;6643:7;6634:6;6623:9;6619:22;6598:53;:::i;:::-;6588:63;;6544:117;6700:2;6726:53;6771:7;6762:6;6751:9;6747:22;6726:53;:::i;:::-;6716:63;;6671:118;6322:474;;;;;:::o;6802:619::-;6879:6;6887;6895;6944:2;6932:9;6923:7;6919:23;6915:32;6912:119;;;6950:79;;:::i;:::-;6912:119;7070:1;7095:53;7140:7;7131:6;7120:9;7116:22;7095:53;:::i;:::-;7085:63;;7041:117;7197:2;7223:53;7268:7;7259:6;7248:9;7244:22;7223:53;:::i;:::-;7213:63;;7168:118;7325:2;7351:53;7396:7;7387:6;7376:9;7372:22;7351:53;:::i;:::-;7341:63;;7296:118;6802:619;;;;;:::o;7427:559::-;7513:6;7521;7570:2;7558:9;7549:7;7545:23;7541:32;7538:119;;;7576:79;;:::i;:::-;7538:119;7724:1;7713:9;7709:17;7696:31;7754:18;7746:6;7743:30;7740:117;;;7776:79;;:::i;:::-;7740:117;7889:80;7961:7;7952:6;7941:9;7937:22;7889:80;:::i;:::-;7871:98;;;;7667:312;7427:559;;;;;:::o;7992:704::-;8087:6;8095;8103;8152:2;8140:9;8131:7;8127:23;8123:32;8120:119;;;8158:79;;:::i;:::-;8120:119;8306:1;8295:9;8291:17;8278:31;8336:18;8328:6;8325:30;8322:117;;;8358:79;;:::i;:::-;8322:117;8471:80;8543:7;8534:6;8523:9;8519:22;8471:80;:::i;:::-;8453:98;;;;8249:312;8600:2;8626:53;8671:7;8662:6;8651:9;8647:22;8626:53;:::i;:::-;8616:63;;8571:118;7992:704;;;;;:::o;8702:559::-;8788:6;8796;8845:2;8833:9;8824:7;8820:23;8816:32;8813:119;;;8851:79;;:::i;:::-;8813:119;8999:1;8988:9;8984:17;8971:31;9029:18;9021:6;9018:30;9015:117;;;9051:79;;:::i;:::-;9015:117;9164:80;9236:7;9227:6;9216:9;9212:22;9164:80;:::i;:::-;9146:98;;;;8942:312;8702:559;;;;;:::o;9267:323::-;9323:6;9372:2;9360:9;9351:7;9347:23;9343:32;9340:119;;;9378:79;;:::i;:::-;9340:119;9498:1;9523:50;9565:7;9556:6;9545:9;9541:22;9523:50;:::i;:::-;9513:60;;9469:114;9267:323;;;;:::o;9596:327::-;9654:6;9703:2;9691:9;9682:7;9678:23;9674:32;9671:119;;;9709:79;;:::i;:::-;9671:119;9829:1;9854:52;9898:7;9889:6;9878:9;9874:22;9854:52;:::i;:::-;9844:62;;9800:116;9596:327;;;;:::o;9929:349::-;9998:6;10047:2;10035:9;10026:7;10022:23;10018:32;10015:119;;;10053:79;;:::i;:::-;10015:119;10173:1;10198:63;10253:7;10244:6;10233:9;10229:22;10198:63;:::i;:::-;10188:73;;10144:127;9929:349;;;;:::o;10284:509::-;10353:6;10402:2;10390:9;10381:7;10377:23;10373:32;10370:119;;;10408:79;;:::i;:::-;10370:119;10556:1;10545:9;10541:17;10528:31;10586:18;10578:6;10575:30;10572:117;;;10608:79;;:::i;:::-;10572:117;10713:63;10768:7;10759:6;10748:9;10744:22;10713:63;:::i;:::-;10703:73;;10499:287;10284:509;;;;:::o;10799:329::-;10858:6;10907:2;10895:9;10886:7;10882:23;10878:32;10875:119;;;10913:79;;:::i;:::-;10875:119;11033:1;11058:53;11103:7;11094:6;11083:9;11079:22;11058:53;:::i;:::-;11048:63;;11004:117;10799:329;;;;:::o;11134:303::-;11265:10;11286:108;11390:3;11382:6;11286:108;:::i;:::-;11426:4;11421:3;11417:14;11403:28;;11134:303;;;;:::o;11443:179::-;11512:10;11533:46;11575:3;11567:6;11533:46;:::i;:::-;11611:4;11606:3;11602:14;11588:28;;11443:179;;;;:::o;11628:108::-;11705:24;11723:5;11705:24;:::i;:::-;11700:3;11693:37;11628:108;;:::o;11742:118::-;11829:24;11847:5;11829:24;:::i;:::-;11824:3;11817:37;11742:118;;:::o;11942:980::-;12123:3;12152:85;12231:5;12152:85;:::i;:::-;12253:117;12363:6;12358:3;12253:117;:::i;:::-;12246:124;;12394:87;12475:5;12394:87;:::i;:::-;12504:7;12535:1;12520:377;12545:6;12542:1;12539:13;12520:377;;;12621:6;12615:13;12648:125;12769:3;12754:13;12648:125;:::i;:::-;12641:132;;12796:91;12880:6;12796:91;:::i;:::-;12786:101;;12580:317;12567:1;12564;12560:9;12555:14;;12520:377;;;12524:14;12913:3;12906:10;;12128:794;;;11942:980;;;;:::o;12958:732::-;13077:3;13106:54;13154:5;13106:54;:::i;:::-;13176:86;13255:6;13250:3;13176:86;:::i;:::-;13169:93;;13286:56;13336:5;13286:56;:::i;:::-;13365:7;13396:1;13381:284;13406:6;13403:1;13400:13;13381:284;;;13482:6;13476:13;13509:63;13568:3;13553:13;13509:63;:::i;:::-;13502:70;;13595:60;13648:6;13595:60;:::i;:::-;13585:70;;13441:224;13428:1;13425;13421:9;13416:14;;13381:284;;;13385:14;13681:3;13674:10;;13082:608;;;12958:732;;;;:::o;13696:99::-;13767:21;13782:5;13767:21;:::i;:::-;13762:3;13755:34;13696:99;;:::o;13801:109::-;13882:21;13897:5;13882:21;:::i;:::-;13877:3;13870:34;13801:109;;:::o;13916:360::-;14002:3;14030:38;14062:5;14030:38;:::i;:::-;14084:70;14147:6;14142:3;14084:70;:::i;:::-;14077:77;;14163:52;14208:6;14203:3;14196:4;14189:5;14185:16;14163:52;:::i;:::-;14240:29;14262:6;14240:29;:::i;:::-;14235:3;14231:39;14224:46;;14006:270;13916:360;;;;:::o;14282:364::-;14370:3;14398:39;14431:5;14398:39;:::i;:::-;14453:71;14517:6;14512:3;14453:71;:::i;:::-;14446:78;;14533:52;14578:6;14573:3;14566:4;14559:5;14555:16;14533:52;:::i;:::-;14610:29;14632:6;14610:29;:::i;:::-;14605:3;14601:39;14594:46;;14374:272;14282:364;;;;:::o;14652:377::-;14758:3;14786:39;14819:5;14786:39;:::i;:::-;14841:89;14923:6;14918:3;14841:89;:::i;:::-;14834:96;;14939:52;14984:6;14979:3;14972:4;14965:5;14961:16;14939:52;:::i;:::-;15016:6;15011:3;15007:16;15000:23;;14762:267;14652:377;;;;:::o;15035:366::-;15177:3;15198:67;15262:2;15257:3;15198:67;:::i;:::-;15191:74;;15274:93;15363:3;15274:93;:::i;:::-;15392:2;15387:3;15383:12;15376:19;;15035:366;;;:::o;15407:::-;15549:3;15570:67;15634:2;15629:3;15570:67;:::i;:::-;15563:74;;15646:93;15735:3;15646:93;:::i;:::-;15764:2;15759:3;15755:12;15748:19;;15407:366;;;:::o;15779:::-;15921:3;15942:67;16006:2;16001:3;15942:67;:::i;:::-;15935:74;;16018:93;16107:3;16018:93;:::i;:::-;16136:2;16131:3;16127:12;16120:19;;15779:366;;;:::o;16151:::-;16293:3;16314:67;16378:2;16373:3;16314:67;:::i;:::-;16307:74;;16390:93;16479:3;16390:93;:::i;:::-;16508:2;16503:3;16499:12;16492:19;;16151:366;;;:::o;16523:::-;16665:3;16686:67;16750:2;16745:3;16686:67;:::i;:::-;16679:74;;16762:93;16851:3;16762:93;:::i;:::-;16880:2;16875:3;16871:12;16864:19;;16523:366;;;:::o;16895:::-;17037:3;17058:67;17122:2;17117:3;17058:67;:::i;:::-;17051:74;;17134:93;17223:3;17134:93;:::i;:::-;17252:2;17247:3;17243:12;17236:19;;16895:366;;;:::o;17267:::-;17409:3;17430:67;17494:2;17489:3;17430:67;:::i;:::-;17423:74;;17506:93;17595:3;17506:93;:::i;:::-;17624:2;17619:3;17615:12;17608:19;;17267:366;;;:::o;17639:::-;17781:3;17802:67;17866:2;17861:3;17802:67;:::i;:::-;17795:74;;17878:93;17967:3;17878:93;:::i;:::-;17996:2;17991:3;17987:12;17980:19;;17639:366;;;:::o;18011:::-;18153:3;18174:67;18238:2;18233:3;18174:67;:::i;:::-;18167:74;;18250:93;18339:3;18250:93;:::i;:::-;18368:2;18363:3;18359:12;18352:19;;18011:366;;;:::o;18383:::-;18525:3;18546:67;18610:2;18605:3;18546:67;:::i;:::-;18539:74;;18622:93;18711:3;18622:93;:::i;:::-;18740:2;18735:3;18731:12;18724:19;;18383:366;;;:::o;18755:::-;18897:3;18918:67;18982:2;18977:3;18918:67;:::i;:::-;18911:74;;18994:93;19083:3;18994:93;:::i;:::-;19112:2;19107:3;19103:12;19096:19;;18755:366;;;:::o;19127:::-;19269:3;19290:67;19354:2;19349:3;19290:67;:::i;:::-;19283:74;;19366:93;19455:3;19366:93;:::i;:::-;19484:2;19479:3;19475:12;19468:19;;19127:366;;;:::o;19499:::-;19641:3;19662:67;19726:2;19721:3;19662:67;:::i;:::-;19655:74;;19738:93;19827:3;19738:93;:::i;:::-;19856:2;19851:3;19847:12;19840:19;;19499:366;;;:::o;19871:::-;20013:3;20034:67;20098:2;20093:3;20034:67;:::i;:::-;20027:74;;20110:93;20199:3;20110:93;:::i;:::-;20228:2;20223:3;20219:12;20212:19;;19871:366;;;:::o;20243:::-;20385:3;20406:67;20470:2;20465:3;20406:67;:::i;:::-;20399:74;;20482:93;20571:3;20482:93;:::i;:::-;20600:2;20595:3;20591:12;20584:19;;20243:366;;;:::o;20687:864::-;20836:4;20831:3;20827:14;20923:4;20916:5;20912:16;20906:23;20942:63;20999:4;20994:3;20990:14;20976:12;20942:63;:::i;:::-;20851:164;21107:4;21100:5;21096:16;21090:23;21126:61;21181:4;21176:3;21172:14;21158:12;21126:61;:::i;:::-;21025:172;21281:4;21274:5;21270:16;21264:23;21300:57;21351:4;21346:3;21342:14;21328:12;21300:57;:::i;:::-;21207:160;21454:4;21447:5;21443:16;21437:23;21473:61;21528:4;21523:3;21519:14;21505:12;21473:61;:::i;:::-;21377:167;20805:746;20687:864;;:::o;21629:874::-;21788:4;21783:3;21779:14;21875:4;21868:5;21864:16;21858:23;21894:63;21951:4;21946:3;21942:14;21928:12;21894:63;:::i;:::-;21803:164;22059:4;22052:5;22048:16;22042:23;22078:61;22133:4;22128:3;22124:14;22110:12;22078:61;:::i;:::-;21977:172;22233:4;22226:5;22222:16;22216:23;22252:57;22303:4;22298:3;22294:14;22280:12;22252:57;:::i;:::-;22159:160;22406:4;22399:5;22395:16;22389:23;22425:61;22480:4;22475:3;22471:14;22457:12;22425:61;:::i;:::-;22329:167;21757:746;21629:874;;:::o;22509:105::-;22584:23;22601:5;22584:23;:::i;:::-;22579:3;22572:36;22509:105;;:::o;22620:108::-;22697:24;22715:5;22697:24;:::i;:::-;22692:3;22685:37;22620:108;;:::o;22734:118::-;22821:24;22839:5;22821:24;:::i;:::-;22816:3;22809:37;22734:118;;:::o;22858:105::-;22933:23;22950:5;22933:23;:::i;:::-;22928:3;22921:36;22858:105;;:::o;22969:435::-;23149:3;23171:95;23262:3;23253:6;23171:95;:::i;:::-;23164:102;;23283:95;23374:3;23365:6;23283:95;:::i;:::-;23276:102;;23395:3;23388:10;;22969:435;;;;;:::o;23410:222::-;23503:4;23541:2;23530:9;23526:18;23518:26;;23554:71;23622:1;23611:9;23607:17;23598:6;23554:71;:::i;:::-;23410:222;;;;:::o;23638:640::-;23833:4;23871:3;23860:9;23856:19;23848:27;;23885:71;23953:1;23942:9;23938:17;23929:6;23885:71;:::i;:::-;23966:72;24034:2;24023:9;24019:18;24010:6;23966:72;:::i;:::-;24048;24116:2;24105:9;24101:18;24092:6;24048:72;:::i;:::-;24167:9;24161:4;24157:20;24152:2;24141:9;24137:18;24130:48;24195:76;24266:4;24257:6;24195:76;:::i;:::-;24187:84;;23638:640;;;;;;;:::o;24284:497::-;24489:4;24527:2;24516:9;24512:18;24504:26;;24576:9;24570:4;24566:20;24562:1;24551:9;24547:17;24540:47;24604:170;24769:4;24760:6;24604:170;:::i;:::-;24596:178;;24284:497;;;;:::o;24787:373::-;24930:4;24968:2;24957:9;24953:18;24945:26;;25017:9;25011:4;25007:20;25003:1;24992:9;24988:17;24981:47;25045:108;25148:4;25139:6;25045:108;:::i;:::-;25037:116;;24787:373;;;;:::o;25166:210::-;25253:4;25291:2;25280:9;25276:18;25268:26;;25304:65;25366:1;25355:9;25351:17;25342:6;25304:65;:::i;:::-;25166:210;;;;:::o;25382:313::-;25495:4;25533:2;25522:9;25518:18;25510:26;;25582:9;25576:4;25572:20;25568:1;25557:9;25553:17;25546:47;25610:78;25683:4;25674:6;25610:78;:::i;:::-;25602:86;;25382:313;;;;:::o;25701:419::-;25867:4;25905:2;25894:9;25890:18;25882:26;;25954:9;25948:4;25944:20;25940:1;25929:9;25925:17;25918:47;25982:131;26108:4;25982:131;:::i;:::-;25974:139;;25701:419;;;:::o;26126:::-;26292:4;26330:2;26319:9;26315:18;26307:26;;26379:9;26373:4;26369:20;26365:1;26354:9;26350:17;26343:47;26407:131;26533:4;26407:131;:::i;:::-;26399:139;;26126:419;;;:::o;26551:::-;26717:4;26755:2;26744:9;26740:18;26732:26;;26804:9;26798:4;26794:20;26790:1;26779:9;26775:17;26768:47;26832:131;26958:4;26832:131;:::i;:::-;26824:139;;26551:419;;;:::o;26976:::-;27142:4;27180:2;27169:9;27165:18;27157:26;;27229:9;27223:4;27219:20;27215:1;27204:9;27200:17;27193:47;27257:131;27383:4;27257:131;:::i;:::-;27249:139;;26976:419;;;:::o;27401:::-;27567:4;27605:2;27594:9;27590:18;27582:26;;27654:9;27648:4;27644:20;27640:1;27629:9;27625:17;27618:47;27682:131;27808:4;27682:131;:::i;:::-;27674:139;;27401:419;;;:::o;27826:::-;27992:4;28030:2;28019:9;28015:18;28007:26;;28079:9;28073:4;28069:20;28065:1;28054:9;28050:17;28043:47;28107:131;28233:4;28107:131;:::i;:::-;28099:139;;27826:419;;;:::o;28251:::-;28417:4;28455:2;28444:9;28440:18;28432:26;;28504:9;28498:4;28494:20;28490:1;28479:9;28475:17;28468:47;28532:131;28658:4;28532:131;:::i;:::-;28524:139;;28251:419;;;:::o;28676:::-;28842:4;28880:2;28869:9;28865:18;28857:26;;28929:9;28923:4;28919:20;28915:1;28904:9;28900:17;28893:47;28957:131;29083:4;28957:131;:::i;:::-;28949:139;;28676:419;;;:::o;29101:::-;29267:4;29305:2;29294:9;29290:18;29282:26;;29354:9;29348:4;29344:20;29340:1;29329:9;29325:17;29318:47;29382:131;29508:4;29382:131;:::i;:::-;29374:139;;29101:419;;;:::o;29526:::-;29692:4;29730:2;29719:9;29715:18;29707:26;;29779:9;29773:4;29769:20;29765:1;29754:9;29750:17;29743:47;29807:131;29933:4;29807:131;:::i;:::-;29799:139;;29526:419;;;:::o;29951:::-;30117:4;30155:2;30144:9;30140:18;30132:26;;30204:9;30198:4;30194:20;30190:1;30179:9;30175:17;30168:47;30232:131;30358:4;30232:131;:::i;:::-;30224:139;;29951:419;;;:::o;30376:::-;30542:4;30580:2;30569:9;30565:18;30557:26;;30629:9;30623:4;30619:20;30615:1;30604:9;30600:17;30593:47;30657:131;30783:4;30657:131;:::i;:::-;30649:139;;30376:419;;;:::o;30801:::-;30967:4;31005:2;30994:9;30990:18;30982:26;;31054:9;31048:4;31044:20;31040:1;31029:9;31025:17;31018:47;31082:131;31208:4;31082:131;:::i;:::-;31074:139;;30801:419;;;:::o;31226:::-;31392:4;31430:2;31419:9;31415:18;31407:26;;31479:9;31473:4;31469:20;31465:1;31454:9;31450:17;31443:47;31507:131;31633:4;31507:131;:::i;:::-;31499:139;;31226:419;;;:::o;31651:::-;31817:4;31855:2;31844:9;31840:18;31832:26;;31904:9;31898:4;31894:20;31890:1;31879:9;31875:17;31868:47;31932:131;32058:4;31932:131;:::i;:::-;31924:139;;31651:419;;;:::o;32076:347::-;32231:4;32269:3;32258:9;32254:19;32246:27;;32283:133;32413:1;32402:9;32398:17;32389:6;32283:133;:::i;:::-;32076:347;;;;:::o;32429:222::-;32522:4;32560:2;32549:9;32545:18;32537:26;;32573:71;32641:1;32630:9;32626:17;32617:6;32573:71;:::i;:::-;32429:222;;;;:::o;32657:129::-;32691:6;32718:20;;:::i;:::-;32708:30;;32747:33;32775:4;32767:6;32747:33;:::i;:::-;32657:129;;;:::o;32792:75::-;32825:6;32858:2;32852:9;32842:19;;32792:75;:::o;32873:307::-;32934:4;33024:18;33016:6;33013:30;33010:56;;;33046:18;;:::i;:::-;33010:56;33084:29;33106:6;33084:29;:::i;:::-;33076:37;;33168:4;33162;33158:15;33150:23;;32873:307;;;:::o;33186:308::-;33248:4;33338:18;33330:6;33327:30;33324:56;;;33360:18;;:::i;:::-;33324:56;33398:29;33420:6;33398:29;:::i;:::-;33390:37;;33482:4;33476;33472:15;33464:23;;33186:308;;;:::o;33500:163::-;33598:4;33621:3;33613:11;;33651:4;33646:3;33642:14;33634:22;;33500:163;;;:::o;33669:132::-;33736:4;33759:3;33751:11;;33789:4;33784:3;33780:14;33772:22;;33669:132;;;:::o;33807:145::-;33905:6;33939:5;33933:12;33923:22;;33807:145;;;:::o;33958:114::-;34025:6;34059:5;34053:12;34043:22;;33958:114;;;:::o;34078:98::-;34129:6;34163:5;34157:12;34147:22;;34078:98;;;:::o;34182:99::-;34234:6;34268:5;34262:12;34252:22;;34182:99;;;:::o;34287:144::-;34388:4;34420;34415:3;34411:14;34403:22;;34287:144;;;:::o;34437:113::-;34507:4;34539;34534:3;34530:14;34522:22;;34437:113;;;:::o;34556:215::-;34686:11;34720:6;34715:3;34708:19;34760:4;34755:3;34751:14;34736:29;;34556:215;;;;:::o;34777:184::-;34876:11;34910:6;34905:3;34898:19;34950:4;34945:3;34941:14;34926:29;;34777:184;;;;:::o;34967:168::-;35050:11;35084:6;35079:3;35072:19;35124:4;35119:3;35115:14;35100:29;;34967:168;;;;:::o;35141:169::-;35225:11;35259:6;35254:3;35247:19;35299:4;35294:3;35290:14;35275:29;;35141:169;;;;:::o;35316:148::-;35418:11;35455:3;35440:18;;35316:148;;;;:::o;35470:305::-;35510:3;35529:20;35547:1;35529:20;:::i;:::-;35524:25;;35563:20;35581:1;35563:20;:::i;:::-;35558:25;;35717:1;35649:66;35645:74;35642:1;35639:81;35636:107;;;35723:18;;:::i;:::-;35636:107;35767:1;35764;35760:9;35753:16;;35470:305;;;;:::o;35781:348::-;35821:7;35844:20;35862:1;35844:20;:::i;:::-;35839:25;;35878:20;35896:1;35878:20;:::i;:::-;35873:25;;36066:1;35998:66;35994:74;35991:1;35988:81;35983:1;35976:9;35969:17;35965:105;35962:131;;;36073:18;;:::i;:::-;35962:131;36121:1;36118;36114:9;36103:20;;35781:348;;;;:::o;36135:96::-;36172:7;36201:24;36219:5;36201:24;:::i;:::-;36190:35;;36135:96;;;:::o;36237:90::-;36271:7;36314:5;36307:13;36300:21;36289:32;;36237:90;;;:::o;36333:149::-;36369:7;36409:66;36402:5;36398:78;36387:89;;36333:149;;;:::o;36488:126::-;36525:7;36565:42;36558:5;36554:54;36543:65;;36488:126;;;:::o;36620:91::-;36656:7;36696:8;36689:5;36685:20;36674:31;;36620:91;;;:::o;36717:77::-;36754:7;36783:5;36772:16;;36717:77;;;:::o;36800:101::-;36836:7;36876:18;36869:5;36865:30;36854:41;;36800:101;;;:::o;36907:154::-;36991:6;36986:3;36981;36968:30;37053:1;37044:6;37039:3;37035:16;37028:27;36907:154;;;:::o;37067:307::-;37135:1;37145:113;37159:6;37156:1;37153:13;37145:113;;;37244:1;37239:3;37235:11;37229:18;37225:1;37220:3;37216:11;37209:39;37181:2;37178:1;37174:10;37169:15;;37145:113;;;37276:6;37273:1;37270:13;37267:101;;;37356:1;37347:6;37342:3;37338:16;37331:27;37267:101;37116:258;37067:307;;;:::o;37380:320::-;37424:6;37461:1;37455:4;37451:12;37441:22;;37508:1;37502:4;37498:12;37529:18;37519:81;;37585:4;37577:6;37573:17;37563:27;;37519:81;37647:2;37639:6;37636:14;37616:18;37613:38;37610:84;;;37666:18;;:::i;:::-;37610:84;37431:269;37380:320;;;:::o;37706:281::-;37789:27;37811:4;37789:27;:::i;:::-;37781:6;37777:40;37919:6;37907:10;37904:22;37883:18;37871:10;37868:34;37865:62;37862:88;;;37930:18;;:::i;:::-;37862:88;37970:10;37966:2;37959:22;37749:238;37706:281;;:::o;37993:233::-;38032:3;38055:24;38073:5;38055:24;:::i;:::-;38046:33;;38101:66;38094:5;38091:77;38088:103;;;38171:18;;:::i;:::-;38088:103;38218:1;38211:5;38207:13;38200:20;;37993:233;;;:::o;38232:180::-;38280:77;38277:1;38270:88;38377:4;38374:1;38367:15;38401:4;38398:1;38391:15;38418:180;38466:77;38463:1;38456:88;38563:4;38560:1;38553:15;38587:4;38584:1;38577:15;38604:180;38652:77;38649:1;38642:88;38749:4;38746:1;38739:15;38773:4;38770:1;38763:15;38790:180;38838:77;38835:1;38828:88;38935:4;38932:1;38925:15;38959:4;38956:1;38949:15;38976:117;39085:1;39082;39075:12;39099:117;39208:1;39205;39198:12;39222:117;39331:1;39328;39321:12;39345:117;39454:1;39451;39444:12;39468:117;39577:1;39574;39567:12;39591:117;39700:1;39697;39690:12;39714:102;39755:6;39806:2;39802:7;39797:2;39790:5;39786:14;39782:28;39772:38;;39714:102;;;:::o;39822:170::-;39962:22;39958:1;39950:6;39946:14;39939:46;39822:170;:::o;39998:225::-;40138:34;40134:1;40126:6;40122:14;40115:58;40207:8;40202:2;40194:6;40190:15;40183:33;39998:225;:::o;40229:172::-;40369:24;40365:1;40357:6;40353:14;40346:48;40229:172;:::o;40407:177::-;40547:29;40543:1;40535:6;40531:14;40524:53;40407:177;:::o;40590:171::-;40730:23;40726:1;40718:6;40714:14;40707:47;40590:171;:::o;40767:222::-;40907:34;40903:1;40895:6;40891:14;40884:58;40976:5;40971:2;40963:6;40959:15;40952:30;40767:222;:::o;40995:182::-;41135:34;41131:1;41123:6;41119:14;41112:58;40995:182;:::o;41183:166::-;41323:18;41319:1;41311:6;41307:14;41300:42;41183:166;:::o;41355:178::-;41495:30;41491:1;41483:6;41479:14;41472:54;41355:178;:::o;41539:224::-;41679:34;41675:1;41667:6;41663:14;41656:58;41748:7;41743:2;41735:6;41731:15;41724:32;41539:224;:::o;41769:222::-;41909:34;41905:1;41897:6;41893:14;41886:58;41978:5;41973:2;41965:6;41961:15;41954:30;41769:222;:::o;41997:220::-;42137:34;42133:1;42125:6;42121:14;42114:58;42206:3;42201:2;42193:6;42189:15;42182:28;41997:220;:::o;42223:182::-;42363:34;42359:1;42351:6;42347:14;42340:58;42223:182;:::o;42411:222::-;42551:34;42547:1;42539:6;42535:14;42528:58;42620:5;42615:2;42607:6;42603:15;42596:30;42411:222;:::o;42639:236::-;42779:34;42775:1;42767:6;42763:14;42756:58;42848:19;42843:2;42835:6;42831:15;42824:44;42639:236;:::o;42881:122::-;42954:24;42972:5;42954:24;:::i;:::-;42947:5;42944:35;42934:63;;42993:1;42990;42983:12;42934:63;42881:122;:::o;43009:116::-;43079:21;43094:5;43079:21;:::i;:::-;43072:5;43069:32;43059:60;;43115:1;43112;43105:12;43059:60;43009:116;:::o;43131:120::-;43203:23;43220:5;43203:23;:::i;:::-;43196:5;43193:34;43183:62;;43241:1;43238;43231:12;43183:62;43131:120;:::o;43257:122::-;43330:24;43348:5;43330:24;:::i;:::-;43323:5;43320:35;43310:63;;43369:1;43366;43359:12;43310:63;43257:122;:::o
Swarm Source
ipfs://521b406f0cddae8a0f20759a57b6ae7110e50c46da1f466eebed1df53491bbd5
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.