ERC-721
Overview
Max Total Supply
8,016 8L
Holders
658
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 8LLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ELEMENTS
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-19 */ // SPDX-License-Identifier: GPL-3.0 /* ####### ## ######## ## ## ######## ## ## ######## ###### ## ## ## ## ### ### ## ### ## ## ## ## ## ## ## ## #### #### ## #### ## ## ## ####### ## ###### ## ### ## ###### ## ## ## ## ###### ## ## ## ## ## ## ## ## #### ## ## ## ## ## ## ## ## ## ## ### ## ## ## ####### ######## ######## ## ## ######## ## ## ## ###### */ pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/extensions/IERC721ABurnable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721ABurnable compliant contract. */ interface IERC721ABurnable is IERC721A { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) external; } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) virtual public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721AQueryable compliant contract. */ 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` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ 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 pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721A Queryable * @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 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[] memory tokenIds) external view 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 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 pfp collections should be fine). */ function tokensOfOwner(address owner) external view 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/8LEMENTS.sol // 8LEMENTS pragma solidity >= 0.8.0; contract ELEMENTS is ERC721AQueryable, Ownable, ReentrancyGuard, OperatorFilterer { using Strings for uint256; string public uriPrefix; string public uriSuffix = ".json"; string public notRevealedURI = "ipfs://QmSvXAQj9wzkxxrZ7ugM7j22XVfrXTT5wTRAVGphK4j5wV/metadata3/hidden.json"; uint256 public cost = 0.01 ether; uint256 public maxSupply = 8016; uint256 public maxPerTx = 20; uint256 public maxPerWallet = 200; bool public publicMint = false; bool public claimMint = false; bool public paused = true; bool public revealed = false; address public parentAddress = 0x9bbE09E8253450856E1dC6B068b07664152E4703; mapping(address => uint256) public addressMintedBalance; constructor() ERC721A ( "8lements Official", "8L" ) OperatorFilterer(address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), true) {} // ~~~~~~~~~~~~~~~~~~~~ URI's ~~~~~~~~~~~~~~~~~~~~ function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } // ~~~~~~~~~~~~~~~~~~~~ Modifiers ~~~~~~~~~~~~~~~~~~~~ modifier mintCompliance(uint256 _mintAmount) { require(!paused, "The contract is paused!"); require(_mintAmount > 0 && _mintAmount <= maxPerTx, "Invalid mint amount!"); require(_mintAmount + addressMintedBalance[msg.sender] <= maxPerWallet, "Max per wallet exceeded!"); require(totalSupply() + _mintAmount <= maxSupply, "Mint amount exceeds max supply!"); _; } // ~~~~~~~~~~~~~~~~~~~~ Mint Functions ~~~~~~~~~~~~~~~~~~~~ // PUBLIC MINT function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { require(publicMint, "Public mint is not allowed yet."); require(totalSupply() + _mintAmount <= maxSupply, "Max supply limit exceeded!"); require(msg.value >= cost * _mintAmount,"Insufficient funds!"); addressMintedBalance[msg.sender] += _mintAmount; _safeMint(_msgSender(), _mintAmount); } // HOLDERS CLAIM function claim(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { require(claimMint, "Holders claim is not allowed yet."); ERC721A token = ERC721A(parentAddress); uint256 callerBalance = token.balanceOf(msg.sender); require(addressMintedBalance[msg.sender] + _mintAmount <= callerBalance, "Max claim amount exceeded!"); addressMintedBalance[msg.sender] += _mintAmount; _safeMint(_msgSender(), _mintAmount); } // MINT for address function mintToAddress(uint256 _mintAmount, address _receiver) public onlyOwner { require(totalSupply() + _mintAmount <= maxSupply, "Mint amount exceeds max supply!"); addressMintedBalance[_receiver] += _mintAmount; _safeMint(_receiver, _mintAmount); } // Mass airdrop function MassAirdrop(uint256 amount, address[] calldata _receivers) public onlyOwner { for (uint256 i = 0; i < _receivers.length; ++i) { require(totalSupply() + amount <= maxSupply, "Max supply exceeded!"); _safeMint(_receivers[i], amount); } } // ~~~~~~~~~~~~~~~~~~~~ Checks ~~~~~~~~~~~~~~~~~~~~ // Start Token function _startTokenId() internal view virtual override returns (uint256) { return 1; } // TOKEN URI function tokenURI(uint256 _tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory) { require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token."); if (revealed == false) { return notRevealedURI; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } // ~~~~~~~~~~~~~~~~~~~~ onlyOwner Functions ~~~~~~~~~~~~~~~~~~~~ // SET PARENT ADDRESS function setParentAddress(address _newAddress) public onlyOwner { parentAddress = _newAddress; } // SET MAX SUPPLY function setMaxSupply(uint256 _MaxSupply) public onlyOwner { maxSupply = _MaxSupply; } // SET COST function setCost(uint256 _cost) public onlyOwner { cost = _cost; } // SET MAX PER TRANSACTION function setMaxPerTx(uint256 _maxPerTx) public onlyOwner { maxPerTx = _maxPerTx; } // SET MAX PER WALLET function setMaxPerWallet(uint256 _maxPerWallet) public onlyOwner { maxPerWallet = _maxPerWallet; } // BaseURI function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } // NotRevealedURI function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedURI = _notRevealedURI; } // ENABLE/DISABLE PUBLIC MINT function enablePublicMint() public onlyOwner { if (publicMint == true) { publicMint = false; } else { publicMint = true; } } // ENABLE/DISABLE HOLDERS CLAIM function enableClaimMint() public onlyOwner { if (claimMint == true) { claimMint = false; } else { claimMint = true; } } // PAUSE function pause() public onlyOwner { if (paused == true) { paused = false; } else { paused = true; } } // REVEAL function reveal() public onlyOwner { if (revealed == true) { revealed = false; } else { revealed = true; } } function setApprovalForAll(address operator, bool approved) public override(ERC721A, IERC721A) onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override(ERC721A, IERC721A) onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override(ERC721A, IERC721A) onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override(ERC721A, IERC721A) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override(ERC721A, IERC721A) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } // ~~~~~~~~~~~~~~~~~~~~ Withdraw Functions ~~~~~~~~~~~~~~~~~~~~ function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } }
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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address[]","name":"_receivers","type":"address[]"}],"name":"MassAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableClaimMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePublicMint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerWallet","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setParentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b90805190602001906200005192919062000537565b506040518060800160405280604b815260200162005616604b9139600c90805190602001906200008392919062000537565b50662386f26fc10000600d55611f50600e556014600f5560c86010556000601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506001601160026101000a81548160ff0219169083151502179055506000601160036101000a81548160ff021916908315150217905550739bbe09e8253450856e1dc6b068b07664152e4703601160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200016d57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601181526020017f386c656d656e7473204f6666696369616c0000000000000000000000000000008152506040518060400160405280600281526020017f384c00000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200020992919062000537565b5080600390805190602001906200022292919062000537565b50620002336200046060201b60201c565b60008190555050506200025b6200024f6200046960201b60201c565b6200047160201b60201c565b600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620004585780156200031e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620002e49291906200062c565b600060405180830381600087803b158015620002ff57600080fd5b505af115801562000314573d6000803e3d6000fd5b5050505062000457565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620003d8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200039e9291906200062c565b600060405180830381600087803b158015620003b957600080fd5b505af1158015620003ce573d6000803e3d6000fd5b5050505062000456565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000421919062000659565b600060405180830381600087803b1580156200043c57600080fd5b505af115801562000451573d6000803e3d6000fd5b505050505b5b5b5050620006da565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200054590620006a5565b90600052602060002090601f016020900481019282620005695760008555620005b5565b82601f106200058457805160ff1916838001178555620005b5565b82800160010185558215620005b5579182015b82811115620005b457825182559160200191906001019062000597565b5b509050620005c49190620005c8565b5090565b5b80821115620005e3576000816000905550600101620005c9565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200061482620005e7565b9050919050565b620006268162000607565b82525050565b60006040820190506200064360008301856200061b565b6200065260208301846200061b565b9392505050565b60006020820190506200067060008301846200061b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006be57607f821691505b602082108103620006d457620006d362000676565b5b50919050565b614f2c80620006ea6000396000f3fe6080604052600436106102e35760003560e01c80636f8b44b011610190578063a475b5dd116100dc578063d62f3b1c11610095578063f2c4ce1e1161006f578063f2c4ce1e14610ae5578063f2fde38b14610b0e578063f968adbe14610b37578063fa5afe4014610b62576102e3565b8063d62f3b1c14610a68578063e268e4d314610a7f578063e985e9c514610aa8576102e3565b8063a475b5dd1461095a578063b88d4fde14610971578063c23dc68f1461099a578063c6f6f216146109d7578063c87b56dd14610a00578063d5abeb0114610a3d576102e3565b80638456cb591161014957806395d89b411161012357806395d89b41146108ad57806399a2557a146108d8578063a0712d6814610915578063a22cb46514610931576102e3565b80638456cb591461082e5780638462151c146108455780638da5cb5b14610882576102e3565b80636f8b44b01461073257806370a082311461075b578063715018a61461079857806372250380146107af57806374b31672146107da5780637ec4a65914610805576102e3565b80633ccfd60b1161024f57806351830227116102085780635bbb2177116101e25780635bbb2177146106625780635c975abb1461069f57806362b99ad4146106ca5780636352211e146106f5576102e3565b806351830227146105f55780635503a0e8146106205780635557ac9a1461064b576102e3565b80633ccfd60b1461050d57806341f434341461052457806342842e0e1461054f57806344a0d68a14610578578063453c2310146105a1578063512b658d146105cc576102e3565b806313faede6116102a157806313faede61461040a57806318160ddd1461043557806318cae2691461046057806323b872dd1461049d57806326092b83146104c6578063379607f5146104f1576102e3565b8062821de3146102e857806301ffc9a714610313578063051ad03b1461035057806306fdde0314610379578063081812fc146103a4578063095ea7b3146103e1575b600080fd5b3480156102f457600080fd5b506102fd610b8b565b60405161030a9190613730565b60405180910390f35b34801561031f57600080fd5b5061033a600480360381019061033591906137b7565b610bb1565b60405161034791906137ff565b60405180910390f35b34801561035c57600080fd5b50610377600480360381019061037291906138b5565b610c43565b005b34801561038557600080fd5b5061038e610cf8565b60405161039b91906139ae565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c691906139d0565b610d8a565b6040516103d89190613730565b60405180910390f35b3480156103ed57600080fd5b5061040860048036038101906104039190613a29565b610e06565b005b34801561041657600080fd5b5061041f610e1f565b60405161042c9190613a78565b60405180910390f35b34801561044157600080fd5b5061044a610e25565b6040516104579190613a78565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190613a93565b610e3c565b6040516104949190613a78565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf9190613ac0565b610e54565b005b3480156104d257600080fd5b506104db610ea3565b6040516104e891906137ff565b60405180910390f35b61050b600480360381019061050691906139d0565b610eb6565b005b34801561051957600080fd5b5061052261122c565b005b34801561053057600080fd5b50610539611309565b6040516105469190613b72565b60405180910390f35b34801561055b57600080fd5b5061057660048036038101906105719190613ac0565b61131b565b005b34801561058457600080fd5b5061059f600480360381019061059a91906139d0565b61136a565b005b3480156105ad57600080fd5b506105b661137c565b6040516105c39190613a78565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee9190613b8d565b611382565b005b34801561060157600080fd5b5061060a611445565b60405161061791906137ff565b60405180910390f35b34801561062c57600080fd5b50610635611458565b60405161064291906139ae565b60405180910390f35b34801561065757600080fd5b506106606114e6565b005b34801561066e57600080fd5b5061068960048036038101906106849190613d0b565b611547565b6040516106969190613eb7565b60405180910390f35b3480156106ab57600080fd5b506106b4611608565b6040516106c191906137ff565b60405180910390f35b3480156106d657600080fd5b506106df61161b565b6040516106ec91906139ae565b60405180910390f35b34801561070157600080fd5b5061071c600480360381019061071791906139d0565b6116a9565b6040516107299190613730565b60405180910390f35b34801561073e57600080fd5b50610759600480360381019061075491906139d0565b6116bb565b005b34801561076757600080fd5b50610782600480360381019061077d9190613a93565b6116cd565b60405161078f9190613a78565b60405180910390f35b3480156107a457600080fd5b506107ad611785565b005b3480156107bb57600080fd5b506107c4611799565b6040516107d191906139ae565b60405180910390f35b3480156107e657600080fd5b506107ef611827565b6040516107fc91906137ff565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190613f8e565b61183a565b005b34801561083a57600080fd5b5061084361185c565b005b34801561085157600080fd5b5061086c60048036038101906108679190613a93565b6118bd565b6040516108799190614095565b60405180910390f35b34801561088e57600080fd5b50610897611a00565b6040516108a49190613730565b60405180910390f35b3480156108b957600080fd5b506108c2611a2a565b6040516108cf91906139ae565b60405180910390f35b3480156108e457600080fd5b506108ff60048036038101906108fa91906140b7565b611abc565b60405161090c9190614095565b60405180910390f35b61092f600480360381019061092a91906139d0565b611cc8565b005b34801561093d57600080fd5b5061095860048036038101906109539190614136565b611fb1565b005b34801561096657600080fd5b5061096f611fca565b005b34801561097d57600080fd5b5061099860048036038101906109939190614217565b61202b565b005b3480156109a657600080fd5b506109c160048036038101906109bc91906139d0565b61207c565b6040516109ce91906142ef565b60405180910390f35b3480156109e357600080fd5b506109fe60048036038101906109f991906139d0565b6120e6565b005b348015610a0c57600080fd5b50610a276004803603810190610a2291906139d0565b6120f8565b604051610a3491906139ae565b60405180910390f35b348015610a4957600080fd5b50610a52612250565b604051610a5f9190613a78565b60405180910390f35b348015610a7457600080fd5b50610a7d612256565b005b348015610a8b57600080fd5b50610aa66004803603810190610aa191906139d0565b6122b7565b005b348015610ab457600080fd5b50610acf6004803603810190610aca919061430a565b6122c9565b604051610adc91906137ff565b60405180910390f35b348015610af157600080fd5b50610b0c6004803603810190610b079190613f8e565b61235d565b005b348015610b1a57600080fd5b50610b356004803603810190610b309190613a93565b61237f565b005b348015610b4357600080fd5b50610b4c612402565b604051610b599190613a78565b60405180910390f35b348015610b6e57600080fd5b50610b896004803603810190610b849190613a93565b612408565b005b601160049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c0c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c3c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610c4b612454565b60005b82829050811015610cf257600e5484610c65610e25565b610c6f9190614379565b1115610cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca79061441b565b60405180910390fd5b610ce1838383818110610cc657610cc561443b565b5b9050602002016020810190610cdb9190613a93565b856124d2565b80610ceb9061446a565b9050610c4e565b50505050565b606060028054610d07906144e1565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906144e1565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b5050505050905090565b6000610d95826124f0565b610dcb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610e108161254f565b610e1a838361264c565b505050565b600d5481565b6000610e2f61278d565b6001546000540303905090565b60126020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e9257610e913361254f565b5b610e9d848484612796565b50505050565b601160009054906101000a900460ff1681565b80601160029054906101000a900460ff1615610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe9061455e565b60405180910390fd5b600081118015610f195750600f548111155b610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f906145ca565b60405180910390fd5b601054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482610fa69190614379565b1115610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90614636565b60405180910390fd5b600e5481610ff3610e25565b610ffd9190614379565b111561103e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611035906146a2565b60405180910390fd5b601160019054906101000a900460ff1661108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108490614734565b60405180910390fd5b6000601160049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016110ef9190613730565b602060405180830381865afa15801561110c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111309190614769565b90508084601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461117e9190614379565b11156111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b6906147e2565b60405180910390fd5b83601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461120e9190614379565b92505081905550611226611220612ab8565b856124d2565b50505050565b611234612454565b600260095403611279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112709061484e565b60405180910390fd5b6002600981905550600061128b611a00565b73ffffffffffffffffffffffffffffffffffffffff16476040516112ae9061489f565b60006040518083038185875af1925050503d80600081146112eb576040519150601f19603f3d011682016040523d82523d6000602084013e6112f0565b606091505b50509050806112fe57600080fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611359576113583361254f565b5b611364848484612ac0565b50505050565b611372612454565b80600d8190555050565b60105481565b61138a612454565b600e5482611396610e25565b6113a09190614379565b11156113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d8906146a2565b60405180910390fd5b81601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114309190614379565b9250508190555061144181836124d2565b5050565b601160039054906101000a900460ff1681565b600b8054611465906144e1565b80601f0160208091040260200160405190810160405280929190818152602001828054611491906144e1565b80156114de5780601f106114b3576101008083540402835291602001916114de565b820191906000526020600020905b8154815290600101906020018083116114c157829003601f168201915b505050505081565b6114ee612454565b60011515601160019054906101000a900460ff16151503611529576000601160016101000a81548160ff021916908315150217905550611545565b6001601160016101000a81548160ff0219169083151502179055505b565b606060008251905060008167ffffffffffffffff81111561156b5761156a613bcd565b5b6040519080825280602002602001820160405280156115a457816020015b6115916135fd565b8152602001906001900390816115895790505b50905060005b8281146115fd576115d48582815181106115c7576115c661443b565b5b602002602001015161207c565b8282815181106115e7576115e661443b565b5b60200260200101819052508060010190506115aa565b508092505050919050565b601160029054906101000a900460ff1681565b600a8054611628906144e1565b80601f0160208091040260200160405190810160405280929190818152602001828054611654906144e1565b80156116a15780601f10611676576101008083540402835291602001916116a1565b820191906000526020600020905b81548152906001019060200180831161168457829003601f168201915b505050505081565b60006116b482612ae0565b9050919050565b6116c3612454565b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611734576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61178d612454565b6117976000612bac565b565b600c80546117a6906144e1565b80601f01602080910402602001604051908101604052809291908181526020018280546117d2906144e1565b801561181f5780601f106117f45761010080835404028352916020019161181f565b820191906000526020600020905b81548152906001019060200180831161180257829003601f168201915b505050505081565b601160019054906101000a900460ff1681565b611842612454565b80600a908051906020019061185892919061364c565b5050565b611864612454565b60011515601160029054906101000a900460ff1615150361189f576000601160026101000a81548160ff0219169083151502179055506118bb565b6001601160026101000a81548160ff0219169083151502179055505b565b606060008060006118cd856116cd565b905060008167ffffffffffffffff8111156118eb576118ea613bcd565b5b6040519080825280602002602001820160405280156119195781602001602082028036833780820191505090505b5090506119246135fd565b600061192e61278d565b90505b8386146119f25761194181612c72565b915081604001516119e757600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461198c57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036119e657808387806001019850815181106119d9576119d861443b565b5b6020026020010181815250505b5b806001019050611931565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611a39906144e1565b80601f0160208091040260200160405190810160405280929190818152602001828054611a65906144e1565b8015611ab25780601f10611a8757610100808354040283529160200191611ab2565b820191906000526020600020905b815481529060010190602001808311611a9557829003601f168201915b5050505050905090565b6060818310611af7576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611b02612c9d565b9050611b0c61278d565b851015611b1e57611b1b61278d565b94505b80841115611b2a578093505b6000611b35876116cd565b905084861015611b58576000868603905081811015611b52578091505b50611b5d565b600090505b60008167ffffffffffffffff811115611b7957611b78613bcd565b5b604051908082528060200260200182016040528015611ba75781602001602082028036833780820191505090505b50905060008203611bbe5780945050505050611cc1565b6000611bc98861207c565b905060008160400151611bde57816000015190505b60008990505b888114158015611bf45750848714155b15611cb357611c0281612c72565b92508260400151611ca857600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611c4d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca75780848880600101995081518110611c9a57611c9961443b565b5b6020026020010181815250505b5b806001019050611be4565b508583528296505050505050505b9392505050565b80601160029054906101000a900460ff1615611d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d109061455e565b60405180910390fd5b600081118015611d2b5750600f548111155b611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d61906145ca565b60405180910390fd5b601054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611db89190614379565b1115611df9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df090614636565b60405180910390fd5b600e5481611e05610e25565b611e0f9190614379565b1115611e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e47906146a2565b60405180910390fd5b601160009054906101000a900460ff16611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690614900565b60405180910390fd5b600e5482611eab610e25565b611eb59190614379565b1115611ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eed9061496c565b60405180910390fd5b81600d54611f04919061498c565b341015611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d90614a32565b60405180910390fd5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f959190614379565b92505081905550611fad611fa7612ab8565b836124d2565b5050565b81611fbb8161254f565b611fc58383612ca6565b505050565b611fd2612454565b60011515601160039054906101000a900460ff1615150361200d576000601160036101000a81548160ff021916908315150217905550612029565b6001601160036101000a81548160ff0219169083151502179055505b565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612069576120683361254f565b5b61207585858585612e1d565b5050505050565b6120846135fd565b61208c6135fd565b61209461278d565b8310806120a857506120a4612c9d565b8310155b156120b657809150506120e1565b6120bf83612c72565b90508060400151156120d457809150506120e1565b6120dd83612e90565b9150505b919050565b6120ee612454565b80600f8190555050565b6060612103826124f0565b612142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213990614ac4565b60405180910390fd5b60001515601160039054906101000a900460ff161515036121ef57600c805461216a906144e1565b80601f0160208091040260200160405190810160405280929190818152602001828054612196906144e1565b80156121e35780601f106121b8576101008083540402835291602001916121e3565b820191906000526020600020905b8154815290600101906020018083116121c657829003601f168201915b5050505050905061224b565b60006121f9612eb0565b905060008151116122195760405180602001604052806000815250612247565b8061222384612f42565b600b60405160200161223793929190614bb4565b6040516020818303038152906040525b9150505b919050565b600e5481565b61225e612454565b60011515601160009054906101000a900460ff16151503612299576000601160006101000a81548160ff0219169083151502179055506122b5565b6001601160006101000a81548160ff0219169083151502179055505b565b6122bf612454565b8060108190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612365612454565b80600c908051906020019061237b92919061364c565b5050565b612387612454565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed90614c57565b60405180910390fd5b6123ff81612bac565b50565b600f5481565b612410612454565b80601160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61245c612ab8565b73ffffffffffffffffffffffffffffffffffffffff1661247a611a00565b73ffffffffffffffffffffffffffffffffffffffff16146124d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c790614cc3565b60405180910390fd5b565b6124ec8282604051806020016040528060008152506130a2565b5050565b6000816124fb61278d565b1115801561250a575060005482105b8015612548575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612649576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016125c6929190614ce3565b602060405180830381865afa1580156125e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126079190614d21565b61264857806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161263f9190613730565b60405180910390fd5b5b50565b6000612657826116a9565b90508073ffffffffffffffffffffffffffffffffffffffff1661267861313f565b73ffffffffffffffffffffffffffffffffffffffff16146126db576126a48161269f61313f565b6122c9565b6126da576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006127a182612ae0565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612808576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061281484613147565b9150915061282a818761282561313f565b613169565b6128765761283f8661283a61313f565b6122c9565b612875576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128dc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128e986868660016131ad565b80156128f457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506129c28561299e8888876131b3565b7c0200000000000000000000000000000000000000000000000000000000176131db565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612a485760006001850190506000600460008381526020019081526020016000205403612a46576000548114612a45578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ab08686866001613206565b505050505050565b600033905090565b612adb8383836040518060200160405280600081525061202b565b505050565b60008082905080612aef61278d565b11612b7557600054811015612b745760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612b72575b60008103612b68576004600083600190039350838152602001908152602001600020549050612b3e565b8092505050612ba7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c7a6135fd565b612c96600460008481526020019081526020016000205461320c565b9050919050565b60008054905090565b612cae61313f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d12576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612d1f61313f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612dcc61313f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e1191906137ff565b60405180910390a35050565b612e28848484610e54565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612e8a57612e53848484846132c2565b612e89576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612e986135fd565b612ea9612ea483612ae0565b61320c565b9050919050565b6060600a8054612ebf906144e1565b80601f0160208091040260200160405190810160405280929190818152602001828054612eeb906144e1565b8015612f385780601f10612f0d57610100808354040283529160200191612f38565b820191906000526020600020905b815481529060010190602001808311612f1b57829003601f168201915b5050505050905090565b606060008203612f89576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061309d565b600082905060005b60008214612fbb578080612fa49061446a565b915050600a82612fb49190614d7d565b9150612f91565b60008167ffffffffffffffff811115612fd757612fd6613bcd565b5b6040519080825280601f01601f1916602001820160405280156130095781602001600182028036833780820191505090505b5090505b60008514613096576001826130229190614dae565b9150600a856130319190614de2565b603061303d9190614379565b60f81b8183815181106130535761305261443b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561308f9190614d7d565b945061300d565b8093505050505b919050565b6130ac8383613412565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461313a57600080549050600083820390505b6130ec60008683806001019450866132c2565b613122576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106130d957816000541461313757600080fd5b50505b505050565b600033905090565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86131ca8686846135e4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6132146135fd565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132e861313f565b8786866040518563ffffffff1660e01b815260040161330a9493929190614e68565b6020604051808303816000875af192505050801561334657506040513d601f19601f820116820180604052508101906133439190614ec9565b60015b6133bf573d8060008114613376576040519150601f19603f3d011682016040523d82523d6000602084013e61337b565b606091505b5060008151036133b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361347e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036134b8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134c560008483856131ad565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061353c8361352d60008660006131b3565b613536856135ed565b176131db565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613560578060008190555050506135df6000848385613206565b505050565b60009392505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b828054613658906144e1565b90600052602060002090601f01602090048101928261367a57600085556136c1565b82601f1061369357805160ff19168380011785556136c1565b828001600101855582156136c1579182015b828111156136c05782518255916020019190600101906136a5565b5b5090506136ce91906136d2565b5090565b5b808211156136eb5760008160009055506001016136d3565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061371a826136ef565b9050919050565b61372a8161370f565b82525050565b60006020820190506137456000830184613721565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137948161375f565b811461379f57600080fd5b50565b6000813590506137b18161378b565b92915050565b6000602082840312156137cd576137cc613755565b5b60006137db848285016137a2565b91505092915050565b60008115159050919050565b6137f9816137e4565b82525050565b600060208201905061381460008301846137f0565b92915050565b6000819050919050565b61382d8161381a565b811461383857600080fd5b50565b60008135905061384a81613824565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261387557613874613850565b5b8235905067ffffffffffffffff81111561389257613891613855565b5b6020830191508360208202830111156138ae576138ad61385a565b5b9250929050565b6000806000604084860312156138ce576138cd613755565b5b60006138dc8682870161383b565b935050602084013567ffffffffffffffff8111156138fd576138fc61375a565b5b6139098682870161385f565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561394f578082015181840152602081019050613934565b8381111561395e576000848401525b50505050565b6000601f19601f8301169050919050565b600061398082613915565b61398a8185613920565b935061399a818560208601613931565b6139a381613964565b840191505092915050565b600060208201905081810360008301526139c88184613975565b905092915050565b6000602082840312156139e6576139e5613755565b5b60006139f48482850161383b565b91505092915050565b613a068161370f565b8114613a1157600080fd5b50565b600081359050613a23816139fd565b92915050565b60008060408385031215613a4057613a3f613755565b5b6000613a4e85828601613a14565b9250506020613a5f8582860161383b565b9150509250929050565b613a728161381a565b82525050565b6000602082019050613a8d6000830184613a69565b92915050565b600060208284031215613aa957613aa8613755565b5b6000613ab784828501613a14565b91505092915050565b600080600060608486031215613ad957613ad8613755565b5b6000613ae786828701613a14565b9350506020613af886828701613a14565b9250506040613b098682870161383b565b9150509250925092565b6000819050919050565b6000613b38613b33613b2e846136ef565b613b13565b6136ef565b9050919050565b6000613b4a82613b1d565b9050919050565b6000613b5c82613b3f565b9050919050565b613b6c81613b51565b82525050565b6000602082019050613b876000830184613b63565b92915050565b60008060408385031215613ba457613ba3613755565b5b6000613bb28582860161383b565b9250506020613bc385828601613a14565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c0582613964565b810181811067ffffffffffffffff82111715613c2457613c23613bcd565b5b80604052505050565b6000613c3761374b565b9050613c438282613bfc565b919050565b600067ffffffffffffffff821115613c6357613c62613bcd565b5b602082029050602081019050919050565b6000613c87613c8284613c48565b613c2d565b90508083825260208201905060208402830185811115613caa57613ca961385a565b5b835b81811015613cd35780613cbf888261383b565b845260208401935050602081019050613cac565b5050509392505050565b600082601f830112613cf257613cf1613850565b5b8135613d02848260208601613c74565b91505092915050565b600060208284031215613d2157613d20613755565b5b600082013567ffffffffffffffff811115613d3f57613d3e61375a565b5b613d4b84828501613cdd565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d898161370f565b82525050565b600067ffffffffffffffff82169050919050565b613dac81613d8f565b82525050565b613dbb816137e4565b82525050565b600062ffffff82169050919050565b613dd981613dc1565b82525050565b608082016000820151613df56000850182613d80565b506020820151613e086020850182613da3565b506040820151613e1b6040850182613db2565b506060820151613e2e6060850182613dd0565b50505050565b6000613e408383613ddf565b60808301905092915050565b6000602082019050919050565b6000613e6482613d54565b613e6e8185613d5f565b9350613e7983613d70565b8060005b83811015613eaa578151613e918882613e34565b9750613e9c83613e4c565b925050600181019050613e7d565b5085935050505092915050565b60006020820190508181036000830152613ed18184613e59565b905092915050565b600080fd5b600067ffffffffffffffff821115613ef957613ef8613bcd565b5b613f0282613964565b9050602081019050919050565b82818337600083830152505050565b6000613f31613f2c84613ede565b613c2d565b905082815260208101848484011115613f4d57613f4c613ed9565b5b613f58848285613f0f565b509392505050565b600082601f830112613f7557613f74613850565b5b8135613f85848260208601613f1e565b91505092915050565b600060208284031215613fa457613fa3613755565b5b600082013567ffffffffffffffff811115613fc257613fc161375a565b5b613fce84828501613f60565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61400c8161381a565b82525050565b600061401e8383614003565b60208301905092915050565b6000602082019050919050565b600061404282613fd7565b61404c8185613fe2565b935061405783613ff3565b8060005b8381101561408857815161406f8882614012565b975061407a8361402a565b92505060018101905061405b565b5085935050505092915050565b600060208201905081810360008301526140af8184614037565b905092915050565b6000806000606084860312156140d0576140cf613755565b5b60006140de86828701613a14565b93505060206140ef8682870161383b565b92505060406141008682870161383b565b9150509250925092565b614113816137e4565b811461411e57600080fd5b50565b6000813590506141308161410a565b92915050565b6000806040838503121561414d5761414c613755565b5b600061415b85828601613a14565b925050602061416c85828601614121565b9150509250929050565b600067ffffffffffffffff82111561419157614190613bcd565b5b61419a82613964565b9050602081019050919050565b60006141ba6141b584614176565b613c2d565b9050828152602081018484840111156141d6576141d5613ed9565b5b6141e1848285613f0f565b509392505050565b600082601f8301126141fe576141fd613850565b5b813561420e8482602086016141a7565b91505092915050565b6000806000806080858703121561423157614230613755565b5b600061423f87828801613a14565b945050602061425087828801613a14565b93505060406142618782880161383b565b925050606085013567ffffffffffffffff8111156142825761428161375a565b5b61428e878288016141e9565b91505092959194509250565b6080820160008201516142b06000850182613d80565b5060208201516142c36020850182613da3565b5060408201516142d66040850182613db2565b5060608201516142e96060850182613dd0565b50505050565b6000608082019050614304600083018461429a565b92915050565b6000806040838503121561432157614320613755565b5b600061432f85828601613a14565b925050602061434085828601613a14565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143848261381a565b915061438f8361381a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143c4576143c361434a565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614405601483613920565b9150614410826143cf565b602082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006144758261381a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144a7576144a661434a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144f957607f821691505b60208210810361450c5761450b6144b2565b5b50919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000614548601783613920565b915061455382614512565b602082019050919050565b600060208201905081810360008301526145778161453b565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006145b4601483613920565b91506145bf8261457e565b602082019050919050565b600060208201905081810360008301526145e3816145a7565b9050919050565b7f4d6178207065722077616c6c6574206578636565646564210000000000000000600082015250565b6000614620601883613920565b915061462b826145ea565b602082019050919050565b6000602082019050818103600083015261464f81614613565b9050919050565b7f4d696e7420616d6f756e742065786365656473206d617820737570706c792100600082015250565b600061468c601f83613920565b915061469782614656565b602082019050919050565b600060208201905081810360008301526146bb8161467f565b9050919050565b7f486f6c6465727320636c61696d206973206e6f7420616c6c6f7765642079657460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b600061471e602183613920565b9150614729826146c2565b604082019050919050565b6000602082019050818103600083015261474d81614711565b9050919050565b60008151905061476381613824565b92915050565b60006020828403121561477f5761477e613755565b5b600061478d84828501614754565b91505092915050565b7f4d617820636c61696d20616d6f756e7420657863656564656421000000000000600082015250565b60006147cc601a83613920565b91506147d782614796565b602082019050919050565b600060208201905081810360008301526147fb816147bf565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614838601f83613920565b915061484382614802565b602082019050919050565b600060208201905081810360008301526148678161482b565b9050919050565b600081905092915050565b50565b600061488960008361486e565b915061489482614879565b600082019050919050565b60006148aa8261487c565b9150819050919050565b7f5075626c6963206d696e74206973206e6f7420616c6c6f776564207965742e00600082015250565b60006148ea601f83613920565b91506148f5826148b4565b602082019050919050565b60006020820190508181036000830152614919816148dd565b9050919050565b7f4d617820737570706c79206c696d697420657863656564656421000000000000600082015250565b6000614956601a83613920565b915061496182614920565b602082019050919050565b6000602082019050818103600083015261498581614949565b9050919050565b60006149978261381a565b91506149a28361381a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149db576149da61434a565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614a1c601383613920565b9150614a27826149e6565b602082019050919050565b60006020820190508181036000830152614a4b81614a0f565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b6000614aae603083613920565b9150614ab982614a52565b604082019050919050565b60006020820190508181036000830152614add81614aa1565b9050919050565b600081905092915050565b6000614afa82613915565b614b048185614ae4565b9350614b14818560208601613931565b80840191505092915050565b60008190508160005260206000209050919050565b60008154614b42816144e1565b614b4c8186614ae4565b94506001821660008114614b675760018114614b7857614bab565b60ff19831686528186019350614bab565b614b8185614b20565b60005b83811015614ba357815481890152600182019150602081019050614b84565b838801955050505b50505092915050565b6000614bc08286614aef565b9150614bcc8285614aef565b9150614bd88284614b35565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c41602683613920565b9150614c4c82614be5565b604082019050919050565b60006020820190508181036000830152614c7081614c34565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614cad602083613920565b9150614cb882614c77565b602082019050919050565b60006020820190508181036000830152614cdc81614ca0565b9050919050565b6000604082019050614cf86000830185613721565b614d056020830184613721565b9392505050565b600081519050614d1b8161410a565b92915050565b600060208284031215614d3757614d36613755565b5b6000614d4584828501614d0c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614d888261381a565b9150614d938361381a565b925082614da357614da2614d4e565b5b828204905092915050565b6000614db98261381a565b9150614dc48361381a565b925082821015614dd757614dd661434a565b5b828203905092915050565b6000614ded8261381a565b9150614df88361381a565b925082614e0857614e07614d4e565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614e3a82614e13565b614e448185614e1e565b9350614e54818560208601613931565b614e5d81613964565b840191505092915050565b6000608082019050614e7d6000830187613721565b614e8a6020830186613721565b614e976040830185613a69565b8181036060830152614ea98184614e2f565b905095945050505050565b600081519050614ec38161378b565b92915050565b600060208284031215614edf57614ede613755565b5b6000614eed84828501614eb4565b9150509291505056fea264697066735822122063fa671ed1250d71f31ffa4cf77a023ced86bd0bf62613f0f9889534e9be5c8664736f6c634300080d0033697066733a2f2f516d53765841516a39777a6b7878725a3775674d376a3232585666725854543577545241564770684b346a3577562f6d65746164617461332f68696464656e2e6a736f6e
Deployed Bytecode
0x6080604052600436106102e35760003560e01c80636f8b44b011610190578063a475b5dd116100dc578063d62f3b1c11610095578063f2c4ce1e1161006f578063f2c4ce1e14610ae5578063f2fde38b14610b0e578063f968adbe14610b37578063fa5afe4014610b62576102e3565b8063d62f3b1c14610a68578063e268e4d314610a7f578063e985e9c514610aa8576102e3565b8063a475b5dd1461095a578063b88d4fde14610971578063c23dc68f1461099a578063c6f6f216146109d7578063c87b56dd14610a00578063d5abeb0114610a3d576102e3565b80638456cb591161014957806395d89b411161012357806395d89b41146108ad57806399a2557a146108d8578063a0712d6814610915578063a22cb46514610931576102e3565b80638456cb591461082e5780638462151c146108455780638da5cb5b14610882576102e3565b80636f8b44b01461073257806370a082311461075b578063715018a61461079857806372250380146107af57806374b31672146107da5780637ec4a65914610805576102e3565b80633ccfd60b1161024f57806351830227116102085780635bbb2177116101e25780635bbb2177146106625780635c975abb1461069f57806362b99ad4146106ca5780636352211e146106f5576102e3565b806351830227146105f55780635503a0e8146106205780635557ac9a1461064b576102e3565b80633ccfd60b1461050d57806341f434341461052457806342842e0e1461054f57806344a0d68a14610578578063453c2310146105a1578063512b658d146105cc576102e3565b806313faede6116102a157806313faede61461040a57806318160ddd1461043557806318cae2691461046057806323b872dd1461049d57806326092b83146104c6578063379607f5146104f1576102e3565b8062821de3146102e857806301ffc9a714610313578063051ad03b1461035057806306fdde0314610379578063081812fc146103a4578063095ea7b3146103e1575b600080fd5b3480156102f457600080fd5b506102fd610b8b565b60405161030a9190613730565b60405180910390f35b34801561031f57600080fd5b5061033a600480360381019061033591906137b7565b610bb1565b60405161034791906137ff565b60405180910390f35b34801561035c57600080fd5b50610377600480360381019061037291906138b5565b610c43565b005b34801561038557600080fd5b5061038e610cf8565b60405161039b91906139ae565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c691906139d0565b610d8a565b6040516103d89190613730565b60405180910390f35b3480156103ed57600080fd5b5061040860048036038101906104039190613a29565b610e06565b005b34801561041657600080fd5b5061041f610e1f565b60405161042c9190613a78565b60405180910390f35b34801561044157600080fd5b5061044a610e25565b6040516104579190613a78565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190613a93565b610e3c565b6040516104949190613a78565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf9190613ac0565b610e54565b005b3480156104d257600080fd5b506104db610ea3565b6040516104e891906137ff565b60405180910390f35b61050b600480360381019061050691906139d0565b610eb6565b005b34801561051957600080fd5b5061052261122c565b005b34801561053057600080fd5b50610539611309565b6040516105469190613b72565b60405180910390f35b34801561055b57600080fd5b5061057660048036038101906105719190613ac0565b61131b565b005b34801561058457600080fd5b5061059f600480360381019061059a91906139d0565b61136a565b005b3480156105ad57600080fd5b506105b661137c565b6040516105c39190613a78565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee9190613b8d565b611382565b005b34801561060157600080fd5b5061060a611445565b60405161061791906137ff565b60405180910390f35b34801561062c57600080fd5b50610635611458565b60405161064291906139ae565b60405180910390f35b34801561065757600080fd5b506106606114e6565b005b34801561066e57600080fd5b5061068960048036038101906106849190613d0b565b611547565b6040516106969190613eb7565b60405180910390f35b3480156106ab57600080fd5b506106b4611608565b6040516106c191906137ff565b60405180910390f35b3480156106d657600080fd5b506106df61161b565b6040516106ec91906139ae565b60405180910390f35b34801561070157600080fd5b5061071c600480360381019061071791906139d0565b6116a9565b6040516107299190613730565b60405180910390f35b34801561073e57600080fd5b50610759600480360381019061075491906139d0565b6116bb565b005b34801561076757600080fd5b50610782600480360381019061077d9190613a93565b6116cd565b60405161078f9190613a78565b60405180910390f35b3480156107a457600080fd5b506107ad611785565b005b3480156107bb57600080fd5b506107c4611799565b6040516107d191906139ae565b60405180910390f35b3480156107e657600080fd5b506107ef611827565b6040516107fc91906137ff565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190613f8e565b61183a565b005b34801561083a57600080fd5b5061084361185c565b005b34801561085157600080fd5b5061086c60048036038101906108679190613a93565b6118bd565b6040516108799190614095565b60405180910390f35b34801561088e57600080fd5b50610897611a00565b6040516108a49190613730565b60405180910390f35b3480156108b957600080fd5b506108c2611a2a565b6040516108cf91906139ae565b60405180910390f35b3480156108e457600080fd5b506108ff60048036038101906108fa91906140b7565b611abc565b60405161090c9190614095565b60405180910390f35b61092f600480360381019061092a91906139d0565b611cc8565b005b34801561093d57600080fd5b5061095860048036038101906109539190614136565b611fb1565b005b34801561096657600080fd5b5061096f611fca565b005b34801561097d57600080fd5b5061099860048036038101906109939190614217565b61202b565b005b3480156109a657600080fd5b506109c160048036038101906109bc91906139d0565b61207c565b6040516109ce91906142ef565b60405180910390f35b3480156109e357600080fd5b506109fe60048036038101906109f991906139d0565b6120e6565b005b348015610a0c57600080fd5b50610a276004803603810190610a2291906139d0565b6120f8565b604051610a3491906139ae565b60405180910390f35b348015610a4957600080fd5b50610a52612250565b604051610a5f9190613a78565b60405180910390f35b348015610a7457600080fd5b50610a7d612256565b005b348015610a8b57600080fd5b50610aa66004803603810190610aa191906139d0565b6122b7565b005b348015610ab457600080fd5b50610acf6004803603810190610aca919061430a565b6122c9565b604051610adc91906137ff565b60405180910390f35b348015610af157600080fd5b50610b0c6004803603810190610b079190613f8e565b61235d565b005b348015610b1a57600080fd5b50610b356004803603810190610b309190613a93565b61237f565b005b348015610b4357600080fd5b50610b4c612402565b604051610b599190613a78565b60405180910390f35b348015610b6e57600080fd5b50610b896004803603810190610b849190613a93565b612408565b005b601160049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c0c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c3c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610c4b612454565b60005b82829050811015610cf257600e5484610c65610e25565b610c6f9190614379565b1115610cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca79061441b565b60405180910390fd5b610ce1838383818110610cc657610cc561443b565b5b9050602002016020810190610cdb9190613a93565b856124d2565b80610ceb9061446a565b9050610c4e565b50505050565b606060028054610d07906144e1565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906144e1565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b5050505050905090565b6000610d95826124f0565b610dcb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610e108161254f565b610e1a838361264c565b505050565b600d5481565b6000610e2f61278d565b6001546000540303905090565b60126020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e9257610e913361254f565b5b610e9d848484612796565b50505050565b601160009054906101000a900460ff1681565b80601160029054906101000a900460ff1615610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe9061455e565b60405180910390fd5b600081118015610f195750600f548111155b610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f906145ca565b60405180910390fd5b601054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482610fa69190614379565b1115610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90614636565b60405180910390fd5b600e5481610ff3610e25565b610ffd9190614379565b111561103e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611035906146a2565b60405180910390fd5b601160019054906101000a900460ff1661108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108490614734565b60405180910390fd5b6000601160049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016110ef9190613730565b602060405180830381865afa15801561110c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111309190614769565b90508084601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461117e9190614379565b11156111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b6906147e2565b60405180910390fd5b83601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461120e9190614379565b92505081905550611226611220612ab8565b856124d2565b50505050565b611234612454565b600260095403611279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112709061484e565b60405180910390fd5b6002600981905550600061128b611a00565b73ffffffffffffffffffffffffffffffffffffffff16476040516112ae9061489f565b60006040518083038185875af1925050503d80600081146112eb576040519150601f19603f3d011682016040523d82523d6000602084013e6112f0565b606091505b50509050806112fe57600080fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611359576113583361254f565b5b611364848484612ac0565b50505050565b611372612454565b80600d8190555050565b60105481565b61138a612454565b600e5482611396610e25565b6113a09190614379565b11156113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d8906146a2565b60405180910390fd5b81601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114309190614379565b9250508190555061144181836124d2565b5050565b601160039054906101000a900460ff1681565b600b8054611465906144e1565b80601f0160208091040260200160405190810160405280929190818152602001828054611491906144e1565b80156114de5780601f106114b3576101008083540402835291602001916114de565b820191906000526020600020905b8154815290600101906020018083116114c157829003601f168201915b505050505081565b6114ee612454565b60011515601160019054906101000a900460ff16151503611529576000601160016101000a81548160ff021916908315150217905550611545565b6001601160016101000a81548160ff0219169083151502179055505b565b606060008251905060008167ffffffffffffffff81111561156b5761156a613bcd565b5b6040519080825280602002602001820160405280156115a457816020015b6115916135fd565b8152602001906001900390816115895790505b50905060005b8281146115fd576115d48582815181106115c7576115c661443b565b5b602002602001015161207c565b8282815181106115e7576115e661443b565b5b60200260200101819052508060010190506115aa565b508092505050919050565b601160029054906101000a900460ff1681565b600a8054611628906144e1565b80601f0160208091040260200160405190810160405280929190818152602001828054611654906144e1565b80156116a15780601f10611676576101008083540402835291602001916116a1565b820191906000526020600020905b81548152906001019060200180831161168457829003601f168201915b505050505081565b60006116b482612ae0565b9050919050565b6116c3612454565b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611734576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61178d612454565b6117976000612bac565b565b600c80546117a6906144e1565b80601f01602080910402602001604051908101604052809291908181526020018280546117d2906144e1565b801561181f5780601f106117f45761010080835404028352916020019161181f565b820191906000526020600020905b81548152906001019060200180831161180257829003601f168201915b505050505081565b601160019054906101000a900460ff1681565b611842612454565b80600a908051906020019061185892919061364c565b5050565b611864612454565b60011515601160029054906101000a900460ff1615150361189f576000601160026101000a81548160ff0219169083151502179055506118bb565b6001601160026101000a81548160ff0219169083151502179055505b565b606060008060006118cd856116cd565b905060008167ffffffffffffffff8111156118eb576118ea613bcd565b5b6040519080825280602002602001820160405280156119195781602001602082028036833780820191505090505b5090506119246135fd565b600061192e61278d565b90505b8386146119f25761194181612c72565b915081604001516119e757600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461198c57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036119e657808387806001019850815181106119d9576119d861443b565b5b6020026020010181815250505b5b806001019050611931565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611a39906144e1565b80601f0160208091040260200160405190810160405280929190818152602001828054611a65906144e1565b8015611ab25780601f10611a8757610100808354040283529160200191611ab2565b820191906000526020600020905b815481529060010190602001808311611a9557829003601f168201915b5050505050905090565b6060818310611af7576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611b02612c9d565b9050611b0c61278d565b851015611b1e57611b1b61278d565b94505b80841115611b2a578093505b6000611b35876116cd565b905084861015611b58576000868603905081811015611b52578091505b50611b5d565b600090505b60008167ffffffffffffffff811115611b7957611b78613bcd565b5b604051908082528060200260200182016040528015611ba75781602001602082028036833780820191505090505b50905060008203611bbe5780945050505050611cc1565b6000611bc98861207c565b905060008160400151611bde57816000015190505b60008990505b888114158015611bf45750848714155b15611cb357611c0281612c72565b92508260400151611ca857600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611c4d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca75780848880600101995081518110611c9a57611c9961443b565b5b6020026020010181815250505b5b806001019050611be4565b508583528296505050505050505b9392505050565b80601160029054906101000a900460ff1615611d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d109061455e565b60405180910390fd5b600081118015611d2b5750600f548111155b611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d61906145ca565b60405180910390fd5b601054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611db89190614379565b1115611df9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df090614636565b60405180910390fd5b600e5481611e05610e25565b611e0f9190614379565b1115611e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e47906146a2565b60405180910390fd5b601160009054906101000a900460ff16611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690614900565b60405180910390fd5b600e5482611eab610e25565b611eb59190614379565b1115611ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eed9061496c565b60405180910390fd5b81600d54611f04919061498c565b341015611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d90614a32565b60405180910390fd5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f959190614379565b92505081905550611fad611fa7612ab8565b836124d2565b5050565b81611fbb8161254f565b611fc58383612ca6565b505050565b611fd2612454565b60011515601160039054906101000a900460ff1615150361200d576000601160036101000a81548160ff021916908315150217905550612029565b6001601160036101000a81548160ff0219169083151502179055505b565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612069576120683361254f565b5b61207585858585612e1d565b5050505050565b6120846135fd565b61208c6135fd565b61209461278d565b8310806120a857506120a4612c9d565b8310155b156120b657809150506120e1565b6120bf83612c72565b90508060400151156120d457809150506120e1565b6120dd83612e90565b9150505b919050565b6120ee612454565b80600f8190555050565b6060612103826124f0565b612142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213990614ac4565b60405180910390fd5b60001515601160039054906101000a900460ff161515036121ef57600c805461216a906144e1565b80601f0160208091040260200160405190810160405280929190818152602001828054612196906144e1565b80156121e35780601f106121b8576101008083540402835291602001916121e3565b820191906000526020600020905b8154815290600101906020018083116121c657829003601f168201915b5050505050905061224b565b60006121f9612eb0565b905060008151116122195760405180602001604052806000815250612247565b8061222384612f42565b600b60405160200161223793929190614bb4565b6040516020818303038152906040525b9150505b919050565b600e5481565b61225e612454565b60011515601160009054906101000a900460ff16151503612299576000601160006101000a81548160ff0219169083151502179055506122b5565b6001601160006101000a81548160ff0219169083151502179055505b565b6122bf612454565b8060108190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612365612454565b80600c908051906020019061237b92919061364c565b5050565b612387612454565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed90614c57565b60405180910390fd5b6123ff81612bac565b50565b600f5481565b612410612454565b80601160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61245c612ab8565b73ffffffffffffffffffffffffffffffffffffffff1661247a611a00565b73ffffffffffffffffffffffffffffffffffffffff16146124d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c790614cc3565b60405180910390fd5b565b6124ec8282604051806020016040528060008152506130a2565b5050565b6000816124fb61278d565b1115801561250a575060005482105b8015612548575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612649576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016125c6929190614ce3565b602060405180830381865afa1580156125e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126079190614d21565b61264857806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161263f9190613730565b60405180910390fd5b5b50565b6000612657826116a9565b90508073ffffffffffffffffffffffffffffffffffffffff1661267861313f565b73ffffffffffffffffffffffffffffffffffffffff16146126db576126a48161269f61313f565b6122c9565b6126da576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006127a182612ae0565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612808576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061281484613147565b9150915061282a818761282561313f565b613169565b6128765761283f8661283a61313f565b6122c9565b612875576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128dc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128e986868660016131ad565b80156128f457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506129c28561299e8888876131b3565b7c0200000000000000000000000000000000000000000000000000000000176131db565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612a485760006001850190506000600460008381526020019081526020016000205403612a46576000548114612a45578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ab08686866001613206565b505050505050565b600033905090565b612adb8383836040518060200160405280600081525061202b565b505050565b60008082905080612aef61278d565b11612b7557600054811015612b745760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612b72575b60008103612b68576004600083600190039350838152602001908152602001600020549050612b3e565b8092505050612ba7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c7a6135fd565b612c96600460008481526020019081526020016000205461320c565b9050919050565b60008054905090565b612cae61313f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d12576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612d1f61313f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612dcc61313f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e1191906137ff565b60405180910390a35050565b612e28848484610e54565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612e8a57612e53848484846132c2565b612e89576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612e986135fd565b612ea9612ea483612ae0565b61320c565b9050919050565b6060600a8054612ebf906144e1565b80601f0160208091040260200160405190810160405280929190818152602001828054612eeb906144e1565b8015612f385780601f10612f0d57610100808354040283529160200191612f38565b820191906000526020600020905b815481529060010190602001808311612f1b57829003601f168201915b5050505050905090565b606060008203612f89576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061309d565b600082905060005b60008214612fbb578080612fa49061446a565b915050600a82612fb49190614d7d565b9150612f91565b60008167ffffffffffffffff811115612fd757612fd6613bcd565b5b6040519080825280601f01601f1916602001820160405280156130095781602001600182028036833780820191505090505b5090505b60008514613096576001826130229190614dae565b9150600a856130319190614de2565b603061303d9190614379565b60f81b8183815181106130535761305261443b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561308f9190614d7d565b945061300d565b8093505050505b919050565b6130ac8383613412565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461313a57600080549050600083820390505b6130ec60008683806001019450866132c2565b613122576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106130d957816000541461313757600080fd5b50505b505050565b600033905090565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86131ca8686846135e4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6132146135fd565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132e861313f565b8786866040518563ffffffff1660e01b815260040161330a9493929190614e68565b6020604051808303816000875af192505050801561334657506040513d601f19601f820116820180604052508101906133439190614ec9565b60015b6133bf573d8060008114613376576040519150601f19603f3d011682016040523d82523d6000602084013e61337b565b606091505b5060008151036133b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361347e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036134b8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134c560008483856131ad565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061353c8361352d60008660006131b3565b613536856135ed565b176131db565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613560578060008190555050506135df6000848385613206565b505050565b60009392505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b828054613658906144e1565b90600052602060002090601f01602090048101928261367a57600085556136c1565b82601f1061369357805160ff19168380011785556136c1565b828001600101855582156136c1579182015b828111156136c05782518255916020019190600101906136a5565b5b5090506136ce91906136d2565b5090565b5b808211156136eb5760008160009055506001016136d3565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061371a826136ef565b9050919050565b61372a8161370f565b82525050565b60006020820190506137456000830184613721565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137948161375f565b811461379f57600080fd5b50565b6000813590506137b18161378b565b92915050565b6000602082840312156137cd576137cc613755565b5b60006137db848285016137a2565b91505092915050565b60008115159050919050565b6137f9816137e4565b82525050565b600060208201905061381460008301846137f0565b92915050565b6000819050919050565b61382d8161381a565b811461383857600080fd5b50565b60008135905061384a81613824565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261387557613874613850565b5b8235905067ffffffffffffffff81111561389257613891613855565b5b6020830191508360208202830111156138ae576138ad61385a565b5b9250929050565b6000806000604084860312156138ce576138cd613755565b5b60006138dc8682870161383b565b935050602084013567ffffffffffffffff8111156138fd576138fc61375a565b5b6139098682870161385f565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561394f578082015181840152602081019050613934565b8381111561395e576000848401525b50505050565b6000601f19601f8301169050919050565b600061398082613915565b61398a8185613920565b935061399a818560208601613931565b6139a381613964565b840191505092915050565b600060208201905081810360008301526139c88184613975565b905092915050565b6000602082840312156139e6576139e5613755565b5b60006139f48482850161383b565b91505092915050565b613a068161370f565b8114613a1157600080fd5b50565b600081359050613a23816139fd565b92915050565b60008060408385031215613a4057613a3f613755565b5b6000613a4e85828601613a14565b9250506020613a5f8582860161383b565b9150509250929050565b613a728161381a565b82525050565b6000602082019050613a8d6000830184613a69565b92915050565b600060208284031215613aa957613aa8613755565b5b6000613ab784828501613a14565b91505092915050565b600080600060608486031215613ad957613ad8613755565b5b6000613ae786828701613a14565b9350506020613af886828701613a14565b9250506040613b098682870161383b565b9150509250925092565b6000819050919050565b6000613b38613b33613b2e846136ef565b613b13565b6136ef565b9050919050565b6000613b4a82613b1d565b9050919050565b6000613b5c82613b3f565b9050919050565b613b6c81613b51565b82525050565b6000602082019050613b876000830184613b63565b92915050565b60008060408385031215613ba457613ba3613755565b5b6000613bb28582860161383b565b9250506020613bc385828601613a14565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c0582613964565b810181811067ffffffffffffffff82111715613c2457613c23613bcd565b5b80604052505050565b6000613c3761374b565b9050613c438282613bfc565b919050565b600067ffffffffffffffff821115613c6357613c62613bcd565b5b602082029050602081019050919050565b6000613c87613c8284613c48565b613c2d565b90508083825260208201905060208402830185811115613caa57613ca961385a565b5b835b81811015613cd35780613cbf888261383b565b845260208401935050602081019050613cac565b5050509392505050565b600082601f830112613cf257613cf1613850565b5b8135613d02848260208601613c74565b91505092915050565b600060208284031215613d2157613d20613755565b5b600082013567ffffffffffffffff811115613d3f57613d3e61375a565b5b613d4b84828501613cdd565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d898161370f565b82525050565b600067ffffffffffffffff82169050919050565b613dac81613d8f565b82525050565b613dbb816137e4565b82525050565b600062ffffff82169050919050565b613dd981613dc1565b82525050565b608082016000820151613df56000850182613d80565b506020820151613e086020850182613da3565b506040820151613e1b6040850182613db2565b506060820151613e2e6060850182613dd0565b50505050565b6000613e408383613ddf565b60808301905092915050565b6000602082019050919050565b6000613e6482613d54565b613e6e8185613d5f565b9350613e7983613d70565b8060005b83811015613eaa578151613e918882613e34565b9750613e9c83613e4c565b925050600181019050613e7d565b5085935050505092915050565b60006020820190508181036000830152613ed18184613e59565b905092915050565b600080fd5b600067ffffffffffffffff821115613ef957613ef8613bcd565b5b613f0282613964565b9050602081019050919050565b82818337600083830152505050565b6000613f31613f2c84613ede565b613c2d565b905082815260208101848484011115613f4d57613f4c613ed9565b5b613f58848285613f0f565b509392505050565b600082601f830112613f7557613f74613850565b5b8135613f85848260208601613f1e565b91505092915050565b600060208284031215613fa457613fa3613755565b5b600082013567ffffffffffffffff811115613fc257613fc161375a565b5b613fce84828501613f60565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61400c8161381a565b82525050565b600061401e8383614003565b60208301905092915050565b6000602082019050919050565b600061404282613fd7565b61404c8185613fe2565b935061405783613ff3565b8060005b8381101561408857815161406f8882614012565b975061407a8361402a565b92505060018101905061405b565b5085935050505092915050565b600060208201905081810360008301526140af8184614037565b905092915050565b6000806000606084860312156140d0576140cf613755565b5b60006140de86828701613a14565b93505060206140ef8682870161383b565b92505060406141008682870161383b565b9150509250925092565b614113816137e4565b811461411e57600080fd5b50565b6000813590506141308161410a565b92915050565b6000806040838503121561414d5761414c613755565b5b600061415b85828601613a14565b925050602061416c85828601614121565b9150509250929050565b600067ffffffffffffffff82111561419157614190613bcd565b5b61419a82613964565b9050602081019050919050565b60006141ba6141b584614176565b613c2d565b9050828152602081018484840111156141d6576141d5613ed9565b5b6141e1848285613f0f565b509392505050565b600082601f8301126141fe576141fd613850565b5b813561420e8482602086016141a7565b91505092915050565b6000806000806080858703121561423157614230613755565b5b600061423f87828801613a14565b945050602061425087828801613a14565b93505060406142618782880161383b565b925050606085013567ffffffffffffffff8111156142825761428161375a565b5b61428e878288016141e9565b91505092959194509250565b6080820160008201516142b06000850182613d80565b5060208201516142c36020850182613da3565b5060408201516142d66040850182613db2565b5060608201516142e96060850182613dd0565b50505050565b6000608082019050614304600083018461429a565b92915050565b6000806040838503121561432157614320613755565b5b600061432f85828601613a14565b925050602061434085828601613a14565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143848261381a565b915061438f8361381a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143c4576143c361434a565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614405601483613920565b9150614410826143cf565b602082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006144758261381a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144a7576144a661434a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144f957607f821691505b60208210810361450c5761450b6144b2565b5b50919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000614548601783613920565b915061455382614512565b602082019050919050565b600060208201905081810360008301526145778161453b565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006145b4601483613920565b91506145bf8261457e565b602082019050919050565b600060208201905081810360008301526145e3816145a7565b9050919050565b7f4d6178207065722077616c6c6574206578636565646564210000000000000000600082015250565b6000614620601883613920565b915061462b826145ea565b602082019050919050565b6000602082019050818103600083015261464f81614613565b9050919050565b7f4d696e7420616d6f756e742065786365656473206d617820737570706c792100600082015250565b600061468c601f83613920565b915061469782614656565b602082019050919050565b600060208201905081810360008301526146bb8161467f565b9050919050565b7f486f6c6465727320636c61696d206973206e6f7420616c6c6f7765642079657460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b600061471e602183613920565b9150614729826146c2565b604082019050919050565b6000602082019050818103600083015261474d81614711565b9050919050565b60008151905061476381613824565b92915050565b60006020828403121561477f5761477e613755565b5b600061478d84828501614754565b91505092915050565b7f4d617820636c61696d20616d6f756e7420657863656564656421000000000000600082015250565b60006147cc601a83613920565b91506147d782614796565b602082019050919050565b600060208201905081810360008301526147fb816147bf565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614838601f83613920565b915061484382614802565b602082019050919050565b600060208201905081810360008301526148678161482b565b9050919050565b600081905092915050565b50565b600061488960008361486e565b915061489482614879565b600082019050919050565b60006148aa8261487c565b9150819050919050565b7f5075626c6963206d696e74206973206e6f7420616c6c6f776564207965742e00600082015250565b60006148ea601f83613920565b91506148f5826148b4565b602082019050919050565b60006020820190508181036000830152614919816148dd565b9050919050565b7f4d617820737570706c79206c696d697420657863656564656421000000000000600082015250565b6000614956601a83613920565b915061496182614920565b602082019050919050565b6000602082019050818103600083015261498581614949565b9050919050565b60006149978261381a565b91506149a28361381a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149db576149da61434a565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614a1c601383613920565b9150614a27826149e6565b602082019050919050565b60006020820190508181036000830152614a4b81614a0f565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b6000614aae603083613920565b9150614ab982614a52565b604082019050919050565b60006020820190508181036000830152614add81614aa1565b9050919050565b600081905092915050565b6000614afa82613915565b614b048185614ae4565b9350614b14818560208601613931565b80840191505092915050565b60008190508160005260206000209050919050565b60008154614b42816144e1565b614b4c8186614ae4565b94506001821660008114614b675760018114614b7857614bab565b60ff19831686528186019350614bab565b614b8185614b20565b60005b83811015614ba357815481890152600182019150602081019050614b84565b838801955050505b50505092915050565b6000614bc08286614aef565b9150614bcc8285614aef565b9150614bd88284614b35565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c41602683613920565b9150614c4c82614be5565b604082019050919050565b60006020820190508181036000830152614c7081614c34565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614cad602083613920565b9150614cb882614c77565b602082019050919050565b60006020820190508181036000830152614cdc81614ca0565b9050919050565b6000604082019050614cf86000830185613721565b614d056020830184613721565b9392505050565b600081519050614d1b8161410a565b92915050565b600060208284031215614d3757614d36613755565b5b6000614d4584828501614d0c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614d888261381a565b9150614d938361381a565b925082614da357614da2614d4e565b5b828204905092915050565b6000614db98261381a565b9150614dc48361381a565b925082821015614dd757614dd661434a565b5b828203905092915050565b6000614ded8261381a565b9150614df88361381a565b925082614e0857614e07614d4e565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614e3a82614e13565b614e448185614e1e565b9350614e54818560208601613931565b614e5d81613964565b840191505092915050565b6000608082019050614e7d6000830187613721565b614e8a6020830186613721565b614e976040830185613a69565b8181036060830152614ea98184614e2f565b905095945050505050565b600081519050614ec38161378b565b92915050565b600060208284031215614edf57614ede613755565b5b6000614eed84828501614eb4565b9150509291505056fea264697066735822122063fa671ed1250d71f31ffa4cf77a023ced86bd0bf62613f0f9889534e9be5c8664736f6c634300080d0033
Deployed Bytecode Sourcemap
68338:6443:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68924:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29312:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71108:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34959:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36913:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73800:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68640:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28366:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69004:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73976:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68790:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70320:460;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74628:150;;;;;;;;;;;;;:::i;:::-;;3375:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74158:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72367:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68748:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70809:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68889:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68485:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73194:133;;;;;;;;;;;;;:::i;:::-;;63548:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68859:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68457:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34748:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72250:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29991:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13416:103;;;;;;;;;;;;;:::i;:::-;;68523:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68825:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72728:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73345:114;;;;;;;;;;;;;:::i;:::-;;67360:892;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12768:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35128:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64406:2505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69893:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73605:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73478:121;;;;;;;;;;;;;:::i;:::-;;74348:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62969:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72479:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71573:447;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68677:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73014:137;;;;;;;;;;;;;:::i;:::-;;72602:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37568:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72855:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13674:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68715:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72117:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68924:73;;;;;;;;;;;;;:::o;29312:615::-;29397:4;29712:10;29697:25;;:11;:25;;;;:102;;;;29789:10;29774:25;;:11;:25;;;;29697:102;:179;;;;29866:10;29851:25;;:11;:25;;;;29697:179;29677:199;;29312:615;;;:::o;71108:271::-;12654:13;:11;:13::i;:::-;71205:9:::1;71200:174;71224:10;;:17;;71220:1;:21;71200:174;;;71291:9;;71281:6;71265:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;71257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71334:32;71344:10;;71355:1;71344:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;71359:6;71334:9;:32::i;:::-;71243:3;;;;:::i;:::-;;;71200:174;;;;71108:271:::0;;;:::o;34959:100::-;35013:13;35046:5;35039:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34959:100;:::o;36913:204::-;36981:7;37006:16;37014:7;37006;:16::i;:::-;37001:64;;37031:34;;;;;;;;;;;;;;37001:64;37085:15;:24;37101:7;37085:24;;;;;;;;;;;;;;;;;;;;;37078:31;;36913:204;;;:::o;73800:170::-;73915:8;4896:30;4917:8;4896:20;:30::i;:::-;73932:32:::1;73946:8;73956:7;73932:13;:32::i;:::-;73800:170:::0;;;:::o;68640:32::-;;;;:::o;28366:315::-;28419:7;28647:15;:13;:15::i;:::-;28632:12;;28616:13;;:28;:46;28609:53;;28366:315;:::o;69004:55::-;;;;;;;;;;;;;;;;;:::o;73976:176::-;74096:4;4724:10;4716:18;;:4;:18;;;4712:83;;4751:32;4772:10;4751:20;:32::i;:::-;4712:83;74109:37:::1;74128:4;74134:2;74138:7;74109:18;:37::i;:::-;73976:176:::0;;;;:::o;68790:30::-;;;;;;;;;;;;;:::o;70320:460::-;70386:11;69481:6;;;;;;;;;;;69480:7;69472:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;69544:1;69530:11;:15;:42;;;;;69564:8;;69549:11;:23;;69530:42;69522:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;69662:12;;69626:20;:32;69647:10;69626:32;;;;;;;;;;;;;;;;69612:11;:46;;;;:::i;:::-;:62;;69604:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;69749:9;;69734:11;69718:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;69710:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;70414:9:::1;;;;;;;;;;;70406:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;70470:13;70494;;;;;;;;;;;70470:38;;70515:21;70539:5;:15;;;70555:10;70539:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70515:51;;70633:13;70618:11;70583:20;:32;70604:10;70583:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:63;;70575:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;70720:11;70684:20;:32;70705:10;70684:32;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;70738:36;70748:12;:10;:12::i;:::-;70762:11;70738:9;:36::i;:::-;70399:381;;70320:460:::0;;:::o;74628:150::-;12654:13;:11;:13::i;:::-;7192:1:::1;7790:7;;:19:::0;7782:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7192:1;7923:7;:18;;;;74686:7:::2;74707;:5;:7::i;:::-;74699:21;;74728;74699:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74685:69;;;74769:2;74761:11;;;::::0;::::2;;74678:100;7148:1:::1;8102:7;:22;;;;74628:150::o:0;3375:143::-;3475:42;3375:143;:::o;74158:184::-;74282:4;4724:10;4716:18;;:4;:18;;;4712:83;;4751:32;4772:10;4751:20;:32::i;:::-;4712:83;74295:41:::1;74318:4;74324:2;74328:7;74295:22;:41::i;:::-;74158:184:::0;;;;:::o;72367:74::-;12654:13;:11;:13::i;:::-;72430:5:::1;72423:4;:12;;;;72367:74:::0;:::o;68748:33::-;;;;:::o;70809:272::-;12654:13;:11;:13::i;:::-;70935:9:::1;;70920:11;70904:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;70896:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;71024:11;70989:20;:31;71010:9;70989:31;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;71042:33;71052:9;71063:11;71042:9;:33::i;:::-;70809:272:::0;;:::o;68889:28::-;;;;;;;;;;;;;:::o;68485:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73194:133::-;12654:13;:11;:13::i;:::-;73262:4:::1;73249:17;;:9;;;;;;;;;;;:17;;::::0;73245:77:::1;;73282:5;73270:9;;:17;;;;;;;;;;;;;;;;;;73245:77;;;73315:4;73303:9;;:16;;;;;;;;;;;;;;;;;;73245:77;73194:133::o:0;63548:468::-;63637:23;63698:22;63723:8;:15;63698:40;;63753:34;63811:14;63790:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;63753:73;;63846:9;63841:125;63862:14;63857:1;:19;63841:125;;63918:32;63938:8;63947:1;63938:11;;;;;;;;:::i;:::-;;;;;;;;63918:19;:32::i;:::-;63902:10;63913:1;63902:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;63878:3;;;;;63841:125;;;;63987:10;63980:17;;;;63548:468;;;:::o;68859:25::-;;;;;;;;;;;;;:::o;68457:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34748:144::-;34812:7;34855:27;34874:7;34855:18;:27::i;:::-;34832:52;;34748:144;;;:::o;72250:94::-;12654:13;:11;:13::i;:::-;72328:10:::1;72316:9;:22;;;;72250:94:::0;:::o;29991:224::-;30055:7;30096:1;30079:19;;:5;:19;;;30075:60;;30107:28;;;;;;;;;;;;;;30075:60;24546:13;30153:18;:25;30172:5;30153:25;;;;;;;;;;;;;;;;:54;30146:61;;29991:224;;;:::o;13416:103::-;12654:13;:11;:13::i;:::-;13481:30:::1;13508:1;13481:18;:30::i;:::-;13416:103::o:0;68523:108::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68825:29::-;;;;;;;;;;;;;:::o;72728:100::-;12654:13;:11;:13::i;:::-;72812:10:::1;72800:9;:22;;;;;;;;;;;;:::i;:::-;;72728:100:::0;:::o;73345:114::-;12654:13;:11;:13::i;:::-;73400:4:::1;73390:14;;:6;;;;;;;;;;;:14;;::::0;73386:68:::1;;73417:5;73408:6;;:14;;;;;;;;;;;;;;;;;;73386:68;;;73447:4;73438:6;;:13;;;;;;;;;;;;;;;;;;73386:68;73345:114::o:0;67360:892::-;67430:16;67484:19;67518:25;67558:22;67583:16;67593:5;67583:9;:16::i;:::-;67558:41;;67614:25;67656:14;67642:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67614:57;;67686:31;;:::i;:::-;67737:9;67749:15;:13;:15::i;:::-;67737:27;;67732:472;67781:14;67766:11;:29;67732:472;;67833:15;67846:1;67833:12;:15::i;:::-;67821:27;;67871:9;:16;;;67912:8;67867:73;67988:1;67962:28;;:9;:14;;;:28;;;67958:111;;68035:9;:14;;;68015:34;;67958:111;68112:5;68091:26;;:17;:26;;;68087:102;;68168:1;68142:8;68151:13;;;;;;68142:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;68087:102;67732:472;67797:3;;;;;67732:472;;;;68225:8;68218:15;;;;;;;67360:892;;;:::o;12768:87::-;12814:7;12841:6;;;;;;;;;;;12834:13;;12768:87;:::o;35128:104::-;35184:13;35217:7;35210:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35128:104;:::o;64406:2505::-;64541:16;64608:4;64599:5;:13;64595:45;;64621:19;;;;;;;;;;;;;;64595:45;64655:19;64689:17;64709:14;:12;:14::i;:::-;64689:34;;64809:15;:13;:15::i;:::-;64801:5;:23;64797:87;;;64853:15;:13;:15::i;:::-;64845:23;;64797:87;64960:9;64953:4;:16;64949:73;;;64997:9;64990:16;;64949:73;65036:25;65064:16;65074:5;65064:9;:16::i;:::-;65036:44;;65258:4;65250:5;:12;65246:278;;;65283:19;65312:5;65305:4;:12;65283:34;;65354:17;65340:11;:31;65336:111;;;65416:11;65396:31;;65336:111;65264:198;65246:278;;;65507:1;65487:21;;65246:278;65538:25;65580:17;65566:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65538:60;;65638:1;65617:17;:22;65613:78;;65667:8;65660:15;;;;;;;;65613:78;65835:31;65869:26;65889:5;65869:19;:26::i;:::-;65835:60;;65910:25;66155:9;:16;;;66150:92;;66212:9;:14;;;66192:34;;66150:92;66261:9;66273:5;66261:17;;66256:478;66285:4;66280:1;:9;;:45;;;;;66308:17;66293:11;:32;;66280:45;66256:478;;;66363:15;66376:1;66363:12;:15::i;:::-;66351:27;;66401:9;:16;;;66442:8;66397:73;66518:1;66492:28;;:9;:14;;;:28;;;66488:111;;66565:9;:14;;;66545:34;;66488:111;66642:5;66621:26;;:17;:26;;;66617:102;;66698:1;66672:8;66681:13;;;;;;66672:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;66617:102;66256:478;66327:3;;;;;66256:478;;;;66836:11;66826:8;66819:29;66884:8;66877:15;;;;;;;;64406:2505;;;;;;:::o;69893:399::-;69958:11;69481:6;;;;;;;;;;;69480:7;69472:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;69544:1;69530:11;:15;:42;;;;;69564:8;;69549:11;:23;;69530:42;69522:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;69662:12;;69626:20;:32;69647:10;69626:32;;;;;;;;;;;;;;;;69612:11;:46;;;;:::i;:::-;:62;;69604:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;69749:9;;69734:11;69718:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;69710:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;69986:10:::1;;;;;;;;;;;69978:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;70078:9;;70063:11;70047:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;70039:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;70153:11;70146:4;;:18;;;;:::i;:::-;70133:9;:31;;70125:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;70232:11;70196:20;:32;70217:10;70196:32;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;70250:36;70260:12;:10;:12::i;:::-;70274:11;70250:9;:36::i;:::-;69893:399:::0;;:::o;73605:189::-;73728:8;4896:30;4917:8;4896:20;:30::i;:::-;73745:43:::1;73769:8;73779;73745:23;:43::i;:::-;73605:189:::0;;;:::o;73478:121::-;12654:13;:11;:13::i;:::-;73536:4:::1;73524:16;;:8;;;;;;;;;;;:16;;::::0;73520:74:::1;;73555:5;73544:8;;:16;;;;;;;;;;;;;;;;;;73520:74;;;73587:4;73576:8;;:15;;;;;;;;;;;;;;;;;;73520:74;73478:121::o:0;74348:209::-;74491:4;4724:10;4716:18;;:4;:18;;;4712:83;;4751:32;4772:10;4751:20;:32::i;:::-;4712:83;74504:47:::1;74527:4;74533:2;74537:7;74546:4;74504:22;:47::i;:::-;74348:209:::0;;;;;:::o;62969:420::-;63045:21;;:::i;:::-;63079:31;;:::i;:::-;63135:15;:13;:15::i;:::-;63125:7;:25;:54;;;;63165:14;:12;:14::i;:::-;63154:7;:25;;63125:54;63121:103;;;63203:9;63196:16;;;;;63121:103;63246:21;63259:7;63246:12;:21::i;:::-;63234:33;;63282:9;:16;;;63278:65;;;63322:9;63315:16;;;;;63278:65;63360:21;63373:7;63360:12;:21::i;:::-;63353:28;;;62969:420;;;;:::o;72479:90::-;12654:13;:11;:13::i;:::-;72554:9:::1;72543:8;:20;;;;72479:90:::0;:::o;71573:447::-;71666:13;71696:17;71704:8;71696:7;:17::i;:::-;71688:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;71794:5;71782:17;;:8;;;;;;;;;;;:17;;;71778:49;;71810:14;71803:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71778:49;71835:28;71866:10;:8;:10::i;:::-;71835:41;;71921:1;71896:14;71890:28;:32;:122;;;;;;;;;;;;;;;;;71954:14;71970:19;:8;:17;:19::i;:::-;71991:9;71937:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71890:122;71883:129;;;71573:447;;;;:::o;68677:31::-;;;;:::o;73014:137::-;12654:13;:11;:13::i;:::-;73084:4:::1;73070:18;;:10;;;;;;;;;;;:18;;::::0;73066:80:::1;;73105:5;73092:10;;:18;;;;;;;;;;;;;;;;;;73066:80;;;73139:4;73126:10;;:17;;;;;;;;;;;;;;;;;;73066:80;73014:137::o:0;72602:106::-;12654:13;:11;:13::i;:::-;72689::::1;72674:12;:28;;;;72602:106:::0;:::o;37568:164::-;37665:4;37689:18;:25;37708:5;37689:25;;;;;;;;;;;;;;;:35;37715:8;37689:35;;;;;;;;;;;;;;;;;;;;;;;;;37682:42;;37568:164;;;;:::o;72855:120::-;12654:13;:11;:13::i;:::-;72954:15:::1;72937:14;:32;;;;;;;;;;;;:::i;:::-;;72855:120:::0;:::o;13674:201::-;12654:13;:11;:13::i;:::-;13783:1:::1;13763:22;;:8;:22;;::::0;13755:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;13839:28;13858:8;13839:18;:28::i;:::-;13674:201:::0;:::o;68715:28::-;;;;:::o;72117:104::-;12654:13;:11;:13::i;:::-;72204:11:::1;72188:13;;:27;;;;;;;;;;;;;;;;;;72117:104:::0;:::o;12933:132::-;13008:12;:10;:12::i;:::-;12997:23;;:7;:5;:7::i;:::-;:23;;;12989:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12933:132::o;39070:104::-;39139:27;39149:2;39153:8;39139:27;;;;;;;;;;;;:9;:27::i;:::-;39070:104;;:::o;38713:273::-;38770:4;38826:7;38807:15;:13;:15::i;:::-;:26;;:66;;;;;38860:13;;38850:7;:23;38807:66;:152;;;;;38958:1;25316:8;38911:17;:26;38929:7;38911:26;;;;;;;;;;;;:43;:48;38807:152;38787:172;;38713:273;;;:::o;4954:419::-;5193:1;3475:42;5145:45;;;:49;5141:225;;;3475:42;5216;;;5267:4;5274:8;5216:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5211:144;;5330:8;5311:28;;;;;;;;;;;:::i;:::-;;;;;;;;5211:144;5141:225;4954:419;:::o;36453:394::-;36534:13;36550:16;36558:7;36550;:16::i;:::-;36534:32;;36606:5;36583:28;;:19;:17;:19::i;:::-;:28;;;36579:175;;36631:44;36648:5;36655:19;:17;:19::i;:::-;36631:16;:44::i;:::-;36626:128;;36703:35;;;;;;;;;;;;;;36626:128;36579:175;36793:2;36766:15;:24;36782:7;36766:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36831:7;36827:2;36811:28;;36820:5;36811:28;;;;;;;;;;;;36523:324;36453:394;;:::o;71456:95::-;71521:7;71544:1;71537:8;;71456:95;:::o;46178:2800::-;46312:27;46342;46361:7;46342:18;:27::i;:::-;46312:57;;46427:4;46386:45;;46402:19;46386:45;;;46382:86;;46440:28;;;;;;;;;;;;;;46382:86;46482:27;46511:23;46538:28;46558:7;46538:19;:28::i;:::-;46481:85;;;;46666:62;46685:15;46702:4;46708:19;:17;:19::i;:::-;46666:18;:62::i;:::-;46661:174;;46748:43;46765:4;46771:19;:17;:19::i;:::-;46748:16;:43::i;:::-;46743:92;;46800:35;;;;;;;;;;;;;;46743:92;46661:174;46866:1;46852:16;;:2;:16;;;46848:52;;46877:23;;;;;;;;;;;;;;46848:52;46913:43;46935:4;46941:2;46945:7;46954:1;46913:21;:43::i;:::-;47049:15;47046:160;;;47189:1;47168:19;47161:30;47046:160;47584:18;:24;47603:4;47584:24;;;;;;;;;;;;;;;;47582:26;;;;;;;;;;;;47653:18;:22;47672:2;47653:22;;;;;;;;;;;;;;;;47651:24;;;;;;;;;;;47975:145;48012:2;48060:45;48075:4;48081:2;48085:19;48060:14;:45::i;:::-;25594:8;48033:72;47975:18;:145::i;:::-;47946:17;:26;47964:7;47946:26;;;;;;;;;;;:174;;;;48290:1;25594:8;48240:19;:46;:51;48236:626;;48312:19;48344:1;48334:7;:11;48312:33;;48501:1;48467:17;:30;48485:11;48467:30;;;;;;;;;;;;:35;48463:384;;48605:13;;48590:11;:28;48586:242;;48785:19;48752:17;:30;48770:11;48752:30;;;;;;;;;;;:52;;;;48586:242;48463:384;48293:569;48236:626;48909:7;48905:2;48890:27;;48899:4;48890:27;;;;;;;;;;;;48928:42;48949:4;48955:2;48959:7;48968:1;48928:20;:42::i;:::-;46301:2677;;;46178:2800;;;:::o;11319:98::-;11372:7;11399:10;11392:17;;11319:98;:::o;37803:185::-;37941:39;37958:4;37964:2;37968:7;37941:39;;;;;;;;;;;;:16;:39::i;:::-;37803:185;;;:::o;31665:1129::-;31732:7;31752:12;31767:7;31752:22;;31835:4;31816:15;:13;:15::i;:::-;:23;31812:915;;31869:13;;31862:4;:20;31858:869;;;31907:14;31924:17;:23;31942:4;31924:23;;;;;;;;;;;;31907:40;;32040:1;25316:8;32013:6;:23;:28;32009:699;;32532:113;32549:1;32539:6;:11;32532:113;;32592:17;:25;32610:6;;;;;;;32592:25;;;;;;;;;;;;32583:34;;32532:113;;;32678:6;32671:13;;;;;;32009:699;31884:843;31858:869;31812:915;32755:31;;;;;;;;;;;;;;31665:1129;;;;:::o;14035:191::-;14109:16;14128:6;;;;;;;;;;;14109:25;;14154:8;14145:6;;:17;;;;;;;;;;;;;;;;;;14209:8;14178:40;;14199:8;14178:40;;;;;;;;;;;;14098:128;14035:191;:::o;33342:153::-;33402:21;;:::i;:::-;33443:44;33462:17;:24;33480:5;33462:24;;;;;;;;;;;;33443:18;:44::i;:::-;33436:51;;33342:153;;;:::o;28061:95::-;28108:7;28135:13;;28128:20;;28061:95;:::o;37189:308::-;37300:19;:17;:19::i;:::-;37288:31;;:8;:31;;;37284:61;;37328:17;;;;;;;;;;;;;;37284:61;37410:8;37358:18;:39;37377:19;:17;:19::i;:::-;37358:39;;;;;;;;;;;;;;;:49;37398:8;37358:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;37470:8;37434:55;;37449:19;:17;:19::i;:::-;37434:55;;;37480:8;37434:55;;;;;;:::i;:::-;;;;;;;;37189:308;;:::o;38059:399::-;38226:31;38239:4;38245:2;38249:7;38226:12;:31::i;:::-;38290:1;38272:2;:14;;;:19;38268:183;;38311:56;38342:4;38348:2;38352:7;38361:5;38311:30;:56::i;:::-;38306:145;;38395:40;;;;;;;;;;;;;;38306:145;38268:183;38059:399;;;;:::o;33998:158::-;34060:21;;:::i;:::-;34101:47;34120:27;34139:7;34120:18;:27::i;:::-;34101:18;:47::i;:::-;34094:54;;33998:158;;;:::o;69254:104::-;69314:13;69343:9;69336:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69254:104;:::o;8573:723::-;8629:13;8859:1;8850:5;:10;8846:53;;8877:10;;;;;;;;;;;;;;;;;;;;;8846:53;8909:12;8924:5;8909:20;;8940:14;8965:78;8980:1;8972:4;:9;8965:78;;8998:8;;;;;:::i;:::-;;;;9029:2;9021:10;;;;;:::i;:::-;;;8965:78;;;9053:19;9085:6;9075:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9053:39;;9103:154;9119:1;9110:5;:10;9103:154;;9147:1;9137:11;;;;;:::i;:::-;;;9214:2;9206:5;:10;;;;:::i;:::-;9193:2;:24;;;;:::i;:::-;9180:39;;9163:6;9170;9163:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9243:2;9234:11;;;;;:::i;:::-;;;9103:154;;;9281:6;9267:21;;;;;8573:723;;;;:::o;39590:681::-;39713:19;39719:2;39723:8;39713:5;:19::i;:::-;39792:1;39774:2;:14;;;:19;39770:483;;39814:11;39828:13;;39814:27;;39860:13;39882:8;39876:3;:14;39860:30;;39909:233;39940:62;39979:1;39983:2;39987:7;;;;;;39996:5;39940:30;:62::i;:::-;39935:167;;40038:40;;;;;;;;;;;;;;39935:167;40137:3;40129:5;:11;39909:233;;40224:3;40207:13;;:20;40203:34;;40229:8;;;40203:34;39795:458;;39770:483;39590:681;;;:::o;57274:105::-;57334:7;57361:10;57354:17;;57274:105;:::o;44514:652::-;44609:27;44638:23;44679:53;44735:15;44679:71;;44921:7;44915:4;44908:21;44956:22;44950:4;44943:36;45032:4;45026;45016:21;44993:44;;45128:19;45122:26;45103:45;;44859:300;44514:652;;;:::o;45279:645::-;45421:11;45583:15;45577:4;45573:26;45565:34;;45742:15;45731:9;45727:31;45714:44;;45889:15;45878:9;45875:30;45868:4;45857:9;45854:19;45851:55;45841:65;;45279:645;;;;;:::o;56107:159::-;;;;;:::o;54419:309::-;54554:7;54574:16;25717:3;54600:19;:40;;54574:67;;25717:3;54667:31;54678:4;54684:2;54688:9;54667:10;:31::i;:::-;54659:40;;:61;;54652:68;;;54419:309;;;;;:::o;34239:447::-;34319:14;34487:15;34480:5;34476:27;34467:36;;34661:5;34647:11;34623:22;34619:40;34616:51;34609:5;34606:62;34596:72;;34239:447;;;;:::o;56925:158::-;;;;;:::o;32888:363::-;32954:31;;:::i;:::-;33031:6;32998:9;:14;;:41;;;;;;;;;;;25200:3;33084:6;:32;;33050:9;:24;;:67;;;;;;;;;;;33174:1;25316:8;33147:6;:23;:28;;33128:9;:16;;:47;;;;;;;;;;;25717:3;33215:6;:27;;33186:9;:19;;:57;;;;;;;;;;;32888:363;;;:::o;52929:716::-;53092:4;53138:2;53113:45;;;53159:19;:17;:19::i;:::-;53180:4;53186:7;53195:5;53113:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53109:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53413:1;53396:6;:13;:18;53392:235;;53442:40;;;;;;;;;;;;;;53392:235;53585:6;53579:13;53570:6;53566:2;53562:15;53555:38;53109:529;53282:54;;;53272:64;;;:6;:64;;;;53265:71;;;52929:716;;;;;;:::o;40544:1529::-;40609:20;40632:13;;40609:36;;40674:1;40660:16;;:2;:16;;;40656:48;;40685:19;;;;;;;;;;;;;;40656:48;40731:1;40719:8;:13;40715:44;;40741:18;;;;;;;;;;;;;;40715:44;40772:61;40802:1;40806:2;40810:12;40824:8;40772:21;:61::i;:::-;41315:1;24683:2;41286:1;:25;;41285:31;41273:8;:44;41247:18;:22;41266:2;41247:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;41594:139;41631:2;41685:33;41708:1;41712:2;41716:1;41685:14;:33::i;:::-;41652:30;41673:8;41652:20;:30::i;:::-;:66;41594:18;:139::i;:::-;41560:17;:31;41578:12;41560:31;;;;;;;;;;;:173;;;;41750:15;41768:12;41750:30;;41795:11;41824:8;41809:12;:23;41795:37;;41847:101;41899:9;;;;;;41895:2;41874:35;;41891:1;41874:35;;;;;;;;;;;;41943:3;41933:7;:13;41847:101;;41980:3;41964:13;:19;;;;41021:974;;42005:60;42034:1;42038:2;42042:12;42056:8;42005:20;:60::i;:::-;40598:1475;40544:1529;;:::o;55304:147::-;55441:6;55304:147;;;;;:::o;36069:322::-;36139:14;36370:1;36360:8;36357:15;36332:23;36328:45;36318:55;;36069:322;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;593:75::-;626:6;659:2;653:9;643:19;;593:75;:::o;674:117::-;783:1;780;773:12;797:117;906:1;903;896:12;920:149;956:7;996:66;989:5;985:78;974:89;;920:149;;;:::o;1075:120::-;1147:23;1164:5;1147:23;:::i;:::-;1140:5;1137:34;1127:62;;1185:1;1182;1175:12;1127:62;1075:120;:::o;1201:137::-;1246:5;1284:6;1271:20;1262:29;;1300:32;1326:5;1300:32;:::i;:::-;1201:137;;;;:::o;1344:327::-;1402:6;1451:2;1439:9;1430:7;1426:23;1422:32;1419:119;;;1457:79;;:::i;:::-;1419:119;1577:1;1602:52;1646:7;1637:6;1626:9;1622:22;1602:52;:::i;:::-;1592:62;;1548:116;1344:327;;;;:::o;1677:90::-;1711:7;1754:5;1747:13;1740:21;1729:32;;1677:90;;;:::o;1773:109::-;1854:21;1869:5;1854:21;:::i;:::-;1849:3;1842:34;1773:109;;:::o;1888:210::-;1975:4;2013:2;2002:9;1998:18;1990:26;;2026:65;2088:1;2077:9;2073:17;2064:6;2026:65;:::i;:::-;1888:210;;;;:::o;2104:77::-;2141:7;2170:5;2159:16;;2104:77;;;:::o;2187:122::-;2260:24;2278:5;2260:24;:::i;:::-;2253:5;2250:35;2240:63;;2299:1;2296;2289:12;2240:63;2187:122;:::o;2315:139::-;2361:5;2399:6;2386:20;2377:29;;2415:33;2442:5;2415:33;:::i;:::-;2315:139;;;;:::o;2460:117::-;2569:1;2566;2559:12;2583:117;2692:1;2689;2682:12;2706:117;2815:1;2812;2805:12;2846:568;2919:8;2929:6;2979:3;2972:4;2964:6;2960:17;2956:27;2946:122;;2987:79;;:::i;:::-;2946:122;3100:6;3087:20;3077:30;;3130:18;3122:6;3119:30;3116:117;;;3152:79;;:::i;:::-;3116:117;3266:4;3258:6;3254:17;3242:29;;3320:3;3312:4;3304:6;3300:17;3290:8;3286:32;3283:41;3280:128;;;3327:79;;:::i;:::-;3280:128;2846:568;;;;;:::o;3420:704::-;3515:6;3523;3531;3580:2;3568:9;3559:7;3555:23;3551:32;3548:119;;;3586:79;;:::i;:::-;3548:119;3706:1;3731:53;3776:7;3767:6;3756:9;3752:22;3731:53;:::i;:::-;3721:63;;3677:117;3861:2;3850:9;3846:18;3833:32;3892:18;3884:6;3881:30;3878:117;;;3914:79;;:::i;:::-;3878:117;4027:80;4099:7;4090:6;4079:9;4075:22;4027:80;:::i;:::-;4009:98;;;;3804:313;3420:704;;;;;:::o;4130:99::-;4182:6;4216:5;4210:12;4200:22;;4130:99;;;:::o;4235:169::-;4319:11;4353:6;4348:3;4341:19;4393:4;4388:3;4384:14;4369:29;;4235:169;;;;:::o;4410:307::-;4478:1;4488:113;4502:6;4499:1;4496:13;4488:113;;;4587:1;4582:3;4578:11;4572:18;4568:1;4563:3;4559:11;4552:39;4524:2;4521:1;4517:10;4512:15;;4488:113;;;4619:6;4616:1;4613:13;4610:101;;;4699:1;4690:6;4685:3;4681:16;4674:27;4610:101;4459:258;4410:307;;;:::o;4723:102::-;4764:6;4815:2;4811:7;4806:2;4799:5;4795:14;4791:28;4781:38;;4723:102;;;:::o;4831:364::-;4919:3;4947:39;4980:5;4947:39;:::i;:::-;5002:71;5066:6;5061:3;5002:71;:::i;:::-;4995:78;;5082:52;5127:6;5122:3;5115:4;5108:5;5104:16;5082:52;:::i;:::-;5159:29;5181:6;5159:29;:::i;:::-;5154:3;5150:39;5143:46;;4923:272;4831:364;;;;:::o;5201:313::-;5314:4;5352:2;5341:9;5337:18;5329:26;;5401:9;5395:4;5391:20;5387:1;5376:9;5372:17;5365:47;5429:78;5502:4;5493:6;5429:78;:::i;:::-;5421:86;;5201:313;;;;:::o;5520:329::-;5579:6;5628:2;5616:9;5607:7;5603:23;5599:32;5596:119;;;5634:79;;:::i;:::-;5596:119;5754:1;5779:53;5824:7;5815:6;5804:9;5800:22;5779:53;:::i;:::-;5769:63;;5725:117;5520:329;;;;:::o;5855:122::-;5928:24;5946:5;5928:24;:::i;:::-;5921:5;5918:35;5908:63;;5967:1;5964;5957:12;5908:63;5855:122;:::o;5983:139::-;6029:5;6067:6;6054:20;6045:29;;6083:33;6110:5;6083:33;:::i;:::-;5983:139;;;;:::o;6128:474::-;6196:6;6204;6253:2;6241:9;6232:7;6228:23;6224:32;6221:119;;;6259:79;;:::i;:::-;6221:119;6379:1;6404:53;6449:7;6440:6;6429:9;6425:22;6404:53;:::i;:::-;6394:63;;6350:117;6506:2;6532:53;6577:7;6568:6;6557:9;6553:22;6532:53;:::i;:::-;6522:63;;6477:118;6128:474;;;;;:::o;6608:118::-;6695:24;6713:5;6695:24;:::i;:::-;6690:3;6683:37;6608:118;;:::o;6732:222::-;6825:4;6863:2;6852:9;6848:18;6840:26;;6876:71;6944:1;6933:9;6929:17;6920:6;6876:71;:::i;:::-;6732:222;;;;:::o;6960:329::-;7019:6;7068:2;7056:9;7047:7;7043:23;7039:32;7036:119;;;7074:79;;:::i;:::-;7036:119;7194:1;7219:53;7264:7;7255:6;7244:9;7240:22;7219:53;:::i;:::-;7209:63;;7165:117;6960:329;;;;:::o;7295:619::-;7372:6;7380;7388;7437:2;7425:9;7416:7;7412:23;7408:32;7405:119;;;7443:79;;:::i;:::-;7405:119;7563:1;7588:53;7633:7;7624:6;7613:9;7609:22;7588:53;:::i;:::-;7578:63;;7534:117;7690:2;7716:53;7761:7;7752:6;7741:9;7737:22;7716:53;:::i;:::-;7706:63;;7661:118;7818:2;7844:53;7889:7;7880:6;7869:9;7865:22;7844:53;:::i;:::-;7834:63;;7789:118;7295:619;;;;;:::o;7920:60::-;7948:3;7969:5;7962:12;;7920:60;;;:::o;7986:142::-;8036:9;8069:53;8087:34;8096:24;8114:5;8096:24;:::i;:::-;8087:34;:::i;:::-;8069:53;:::i;:::-;8056:66;;7986:142;;;:::o;8134:126::-;8184:9;8217:37;8248:5;8217:37;:::i;:::-;8204:50;;8134:126;;;:::o;8266:157::-;8347:9;8380:37;8411:5;8380:37;:::i;:::-;8367:50;;8266:157;;;:::o;8429:193::-;8547:68;8609:5;8547:68;:::i;:::-;8542:3;8535:81;8429:193;;:::o;8628:284::-;8752:4;8790:2;8779:9;8775:18;8767:26;;8803:102;8902:1;8891:9;8887:17;8878:6;8803:102;:::i;:::-;8628:284;;;;:::o;8918:474::-;8986:6;8994;9043:2;9031:9;9022:7;9018:23;9014:32;9011:119;;;9049:79;;:::i;:::-;9011:119;9169:1;9194:53;9239:7;9230:6;9219:9;9215:22;9194:53;:::i;:::-;9184:63;;9140:117;9296:2;9322:53;9367:7;9358:6;9347:9;9343:22;9322:53;:::i;:::-;9312:63;;9267:118;8918:474;;;;;:::o;9398:180::-;9446:77;9443:1;9436:88;9543:4;9540:1;9533:15;9567:4;9564:1;9557:15;9584:281;9667:27;9689:4;9667:27;:::i;:::-;9659:6;9655:40;9797:6;9785:10;9782:22;9761:18;9749:10;9746:34;9743:62;9740:88;;;9808:18;;:::i;:::-;9740:88;9848:10;9844:2;9837:22;9627:238;9584:281;;:::o;9871:129::-;9905:6;9932:20;;:::i;:::-;9922:30;;9961:33;9989:4;9981:6;9961:33;:::i;:::-;9871:129;;;:::o;10006:311::-;10083:4;10173:18;10165:6;10162:30;10159:56;;;10195:18;;:::i;:::-;10159:56;10245:4;10237:6;10233:17;10225:25;;10305:4;10299;10295:15;10287:23;;10006:311;;;:::o;10340:710::-;10436:5;10461:81;10477:64;10534:6;10477:64;:::i;:::-;10461:81;:::i;:::-;10452:90;;10562:5;10591:6;10584:5;10577:21;10625:4;10618:5;10614:16;10607:23;;10678:4;10670:6;10666:17;10658:6;10654:30;10707:3;10699:6;10696:15;10693:122;;;10726:79;;:::i;:::-;10693:122;10841:6;10824:220;10858:6;10853:3;10850:15;10824:220;;;10933:3;10962:37;10995:3;10983:10;10962:37;:::i;:::-;10957:3;10950:50;11029:4;11024:3;11020:14;11013:21;;10900:144;10884:4;10879:3;10875:14;10868:21;;10824:220;;;10828:21;10442:608;;10340:710;;;;;:::o;11073:370::-;11144:5;11193:3;11186:4;11178:6;11174:17;11170:27;11160:122;;11201:79;;:::i;:::-;11160:122;11318:6;11305:20;11343:94;11433:3;11425:6;11418:4;11410:6;11406:17;11343:94;:::i;:::-;11334:103;;11150:293;11073:370;;;;:::o;11449:539::-;11533:6;11582:2;11570:9;11561:7;11557:23;11553:32;11550:119;;;11588:79;;:::i;:::-;11550:119;11736:1;11725:9;11721:17;11708:31;11766:18;11758:6;11755:30;11752:117;;;11788:79;;:::i;:::-;11752:117;11893:78;11963:7;11954:6;11943:9;11939:22;11893:78;:::i;:::-;11883:88;;11679:302;11449:539;;;;:::o;11994:145::-;12092:6;12126:5;12120:12;12110:22;;11994:145;;;:::o;12145:215::-;12275:11;12309:6;12304:3;12297:19;12349:4;12344:3;12340:14;12325:29;;12145:215;;;;:::o;12366:163::-;12464:4;12487:3;12479:11;;12517:4;12512:3;12508:14;12500:22;;12366:163;;;:::o;12535:108::-;12612:24;12630:5;12612:24;:::i;:::-;12607:3;12600:37;12535:108;;:::o;12649:101::-;12685:7;12725:18;12718:5;12714:30;12703:41;;12649:101;;;:::o;12756:105::-;12831:23;12848:5;12831:23;:::i;:::-;12826:3;12819:36;12756:105;;:::o;12867:99::-;12938:21;12953:5;12938:21;:::i;:::-;12933:3;12926:34;12867:99;;:::o;12972:91::-;13008:7;13048:8;13041:5;13037:20;13026:31;;12972:91;;;:::o;13069:105::-;13144:23;13161:5;13144:23;:::i;:::-;13139:3;13132:36;13069:105;;:::o;13252:864::-;13401:4;13396:3;13392:14;13488:4;13481:5;13477:16;13471:23;13507:63;13564:4;13559:3;13555:14;13541:12;13507:63;:::i;:::-;13416:164;13672:4;13665:5;13661:16;13655:23;13691:61;13746:4;13741:3;13737:14;13723:12;13691:61;:::i;:::-;13590:172;13846:4;13839:5;13835:16;13829:23;13865:57;13916:4;13911:3;13907:14;13893:12;13865:57;:::i;:::-;13772:160;14019:4;14012:5;14008:16;14002:23;14038:61;14093:4;14088:3;14084:14;14070:12;14038:61;:::i;:::-;13942:167;13370:746;13252:864;;:::o;14122:303::-;14253:10;14274:108;14378:3;14370:6;14274:108;:::i;:::-;14414:4;14409:3;14405:14;14391:28;;14122:303;;;;:::o;14431:144::-;14532:4;14564;14559:3;14555:14;14547:22;;14431:144;;;:::o;14657:980::-;14838:3;14867:85;14946:5;14867:85;:::i;:::-;14968:117;15078:6;15073:3;14968:117;:::i;:::-;14961:124;;15109:87;15190:5;15109:87;:::i;:::-;15219:7;15250:1;15235:377;15260:6;15257:1;15254:13;15235:377;;;15336:6;15330:13;15363:125;15484:3;15469:13;15363:125;:::i;:::-;15356:132;;15511:91;15595:6;15511:91;:::i;:::-;15501:101;;15295:317;15282:1;15279;15275:9;15270:14;;15235:377;;;15239:14;15628:3;15621:10;;14843:794;;;14657:980;;;;:::o;15643:497::-;15848:4;15886:2;15875:9;15871:18;15863:26;;15935:9;15929:4;15925:20;15921:1;15910:9;15906:17;15899:47;15963:170;16128:4;16119:6;15963:170;:::i;:::-;15955:178;;15643:497;;;;:::o;16146:117::-;16255:1;16252;16245:12;16269:308;16331:4;16421:18;16413:6;16410:30;16407:56;;;16443:18;;:::i;:::-;16407:56;16481:29;16503:6;16481:29;:::i;:::-;16473:37;;16565:4;16559;16555:15;16547:23;;16269:308;;;:::o;16583:154::-;16667:6;16662:3;16657;16644:30;16729:1;16720:6;16715:3;16711:16;16704:27;16583:154;;;:::o;16743:412::-;16821:5;16846:66;16862:49;16904:6;16862:49;:::i;:::-;16846:66;:::i;:::-;16837:75;;16935:6;16928:5;16921:21;16973:4;16966:5;16962:16;17011:3;17002:6;16997:3;16993:16;16990:25;16987:112;;;17018:79;;:::i;:::-;16987:112;17108:41;17142:6;17137:3;17132;17108:41;:::i;:::-;16827:328;16743:412;;;;;:::o;17175:340::-;17231:5;17280:3;17273:4;17265:6;17261:17;17257:27;17247:122;;17288:79;;:::i;:::-;17247:122;17405:6;17392:20;17430:79;17505:3;17497:6;17490:4;17482:6;17478:17;17430:79;:::i;:::-;17421:88;;17237:278;17175:340;;;;:::o;17521:509::-;17590:6;17639:2;17627:9;17618:7;17614:23;17610:32;17607:119;;;17645:79;;:::i;:::-;17607:119;17793:1;17782:9;17778:17;17765:31;17823:18;17815:6;17812:30;17809:117;;;17845:79;;:::i;:::-;17809:117;17950:63;18005:7;17996:6;17985:9;17981:22;17950:63;:::i;:::-;17940:73;;17736:287;17521:509;;;;:::o;18036:114::-;18103:6;18137:5;18131:12;18121:22;;18036:114;;;:::o;18156:184::-;18255:11;18289:6;18284:3;18277:19;18329:4;18324:3;18320:14;18305:29;;18156:184;;;;:::o;18346:132::-;18413:4;18436:3;18428:11;;18466:4;18461:3;18457:14;18449:22;;18346:132;;;:::o;18484:108::-;18561:24;18579:5;18561:24;:::i;:::-;18556:3;18549:37;18484:108;;:::o;18598:179::-;18667:10;18688:46;18730:3;18722:6;18688:46;:::i;:::-;18766:4;18761:3;18757:14;18743:28;;18598:179;;;;:::o;18783:113::-;18853:4;18885;18880:3;18876:14;18868:22;;18783:113;;;:::o;18932:732::-;19051:3;19080:54;19128:5;19080:54;:::i;:::-;19150:86;19229:6;19224:3;19150:86;:::i;:::-;19143:93;;19260:56;19310:5;19260:56;:::i;:::-;19339:7;19370:1;19355:284;19380:6;19377:1;19374:13;19355:284;;;19456:6;19450:13;19483:63;19542:3;19527:13;19483:63;:::i;:::-;19476:70;;19569:60;19622:6;19569:60;:::i;:::-;19559:70;;19415:224;19402:1;19399;19395:9;19390:14;;19355:284;;;19359:14;19655:3;19648:10;;19056:608;;;18932:732;;;;:::o;19670:373::-;19813:4;19851:2;19840:9;19836:18;19828:26;;19900:9;19894:4;19890:20;19886:1;19875:9;19871:17;19864:47;19928:108;20031:4;20022:6;19928:108;:::i;:::-;19920:116;;19670:373;;;;:::o;20049:619::-;20126:6;20134;20142;20191:2;20179:9;20170:7;20166:23;20162:32;20159:119;;;20197:79;;:::i;:::-;20159:119;20317:1;20342:53;20387:7;20378:6;20367:9;20363:22;20342:53;:::i;:::-;20332:63;;20288:117;20444:2;20470:53;20515:7;20506:6;20495:9;20491:22;20470:53;:::i;:::-;20460:63;;20415:118;20572:2;20598:53;20643:7;20634:6;20623:9;20619:22;20598:53;:::i;:::-;20588:63;;20543:118;20049:619;;;;;:::o;20674:116::-;20744:21;20759:5;20744:21;:::i;:::-;20737:5;20734:32;20724:60;;20780:1;20777;20770:12;20724:60;20674:116;:::o;20796:133::-;20839:5;20877:6;20864:20;20855:29;;20893:30;20917:5;20893:30;:::i;:::-;20796:133;;;;:::o;20935:468::-;21000:6;21008;21057:2;21045:9;21036:7;21032:23;21028:32;21025:119;;;21063:79;;:::i;:::-;21025:119;21183:1;21208:53;21253:7;21244:6;21233:9;21229:22;21208:53;:::i;:::-;21198:63;;21154:117;21310:2;21336:50;21378:7;21369:6;21358:9;21354:22;21336:50;:::i;:::-;21326:60;;21281:115;20935:468;;;;;:::o;21409:307::-;21470:4;21560:18;21552:6;21549:30;21546:56;;;21582:18;;:::i;:::-;21546:56;21620:29;21642:6;21620:29;:::i;:::-;21612:37;;21704:4;21698;21694:15;21686:23;;21409:307;;;:::o;21722:410::-;21799:5;21824:65;21840:48;21881:6;21840:48;:::i;:::-;21824:65;:::i;:::-;21815:74;;21912:6;21905:5;21898:21;21950:4;21943:5;21939:16;21988:3;21979:6;21974:3;21970:16;21967:25;21964:112;;;21995:79;;:::i;:::-;21964:112;22085:41;22119:6;22114:3;22109;22085:41;:::i;:::-;21805:327;21722:410;;;;;:::o;22151:338::-;22206:5;22255:3;22248:4;22240:6;22236:17;22232:27;22222:122;;22263:79;;:::i;:::-;22222:122;22380:6;22367:20;22405:78;22479:3;22471:6;22464:4;22456:6;22452:17;22405:78;:::i;:::-;22396:87;;22212:277;22151:338;;;;:::o;22495:943::-;22590:6;22598;22606;22614;22663:3;22651:9;22642:7;22638:23;22634:33;22631:120;;;22670:79;;:::i;:::-;22631:120;22790:1;22815:53;22860:7;22851:6;22840:9;22836:22;22815:53;:::i;:::-;22805:63;;22761:117;22917:2;22943:53;22988:7;22979:6;22968:9;22964:22;22943:53;:::i;:::-;22933:63;;22888:118;23045:2;23071:53;23116:7;23107:6;23096:9;23092:22;23071:53;:::i;:::-;23061:63;;23016:118;23201:2;23190:9;23186:18;23173:32;23232:18;23224:6;23221:30;23218:117;;;23254:79;;:::i;:::-;23218:117;23359:62;23413:7;23404:6;23393:9;23389:22;23359:62;:::i;:::-;23349:72;;23144:287;22495:943;;;;;;;:::o;23516:874::-;23675:4;23670:3;23666:14;23762:4;23755:5;23751:16;23745:23;23781:63;23838:4;23833:3;23829:14;23815:12;23781:63;:::i;:::-;23690:164;23946:4;23939:5;23935:16;23929:23;23965:61;24020:4;24015:3;24011:14;23997:12;23965:61;:::i;:::-;23864:172;24120:4;24113:5;24109:16;24103:23;24139:57;24190:4;24185:3;24181:14;24167:12;24139:57;:::i;:::-;24046:160;24293:4;24286:5;24282:16;24276:23;24312:61;24367:4;24362:3;24358:14;24344:12;24312:61;:::i;:::-;24216:167;23644:746;23516:874;;:::o;24396:347::-;24551:4;24589:3;24578:9;24574:19;24566:27;;24603:133;24733:1;24722:9;24718:17;24709:6;24603:133;:::i;:::-;24396:347;;;;:::o;24749:474::-;24817:6;24825;24874:2;24862:9;24853:7;24849:23;24845:32;24842:119;;;24880:79;;:::i;:::-;24842:119;25000:1;25025:53;25070:7;25061:6;25050:9;25046:22;25025:53;:::i;:::-;25015:63;;24971:117;25127:2;25153:53;25198:7;25189:6;25178:9;25174:22;25153:53;:::i;:::-;25143:63;;25098:118;24749:474;;;;;:::o;25229:180::-;25277:77;25274:1;25267:88;25374:4;25371:1;25364:15;25398:4;25395:1;25388:15;25415:305;25455:3;25474:20;25492:1;25474:20;:::i;:::-;25469:25;;25508:20;25526:1;25508:20;:::i;:::-;25503:25;;25662:1;25594:66;25590:74;25587:1;25584:81;25581:107;;;25668:18;;:::i;:::-;25581:107;25712:1;25709;25705:9;25698:16;;25415:305;;;;:::o;25726:170::-;25866:22;25862:1;25854:6;25850:14;25843:46;25726:170;:::o;25902:366::-;26044:3;26065:67;26129:2;26124:3;26065:67;:::i;:::-;26058:74;;26141:93;26230:3;26141:93;:::i;:::-;26259:2;26254:3;26250:12;26243:19;;25902:366;;;:::o;26274:419::-;26440:4;26478:2;26467:9;26463:18;26455:26;;26527:9;26521:4;26517:20;26513:1;26502:9;26498:17;26491:47;26555:131;26681:4;26555:131;:::i;:::-;26547:139;;26274:419;;;:::o;26699:180::-;26747:77;26744:1;26737:88;26844:4;26841:1;26834:15;26868:4;26865:1;26858:15;26885:233;26924:3;26947:24;26965:5;26947:24;:::i;:::-;26938:33;;26993:66;26986:5;26983:77;26980:103;;27063:18;;:::i;:::-;26980:103;27110:1;27103:5;27099:13;27092:20;;26885:233;;;:::o;27124:180::-;27172:77;27169:1;27162:88;27269:4;27266:1;27259:15;27293:4;27290:1;27283:15;27310:320;27354:6;27391:1;27385:4;27381:12;27371:22;;27438:1;27432:4;27428:12;27459:18;27449:81;;27515:4;27507:6;27503:17;27493:27;;27449:81;27577:2;27569:6;27566:14;27546:18;27543:38;27540:84;;27596:18;;:::i;:::-;27540:84;27361:269;27310:320;;;:::o;27636:173::-;27776:25;27772:1;27764:6;27760:14;27753:49;27636:173;:::o;27815:366::-;27957:3;27978:67;28042:2;28037:3;27978:67;:::i;:::-;27971:74;;28054:93;28143:3;28054:93;:::i;:::-;28172:2;28167:3;28163:12;28156:19;;27815:366;;;:::o;28187:419::-;28353:4;28391:2;28380:9;28376:18;28368:26;;28440:9;28434:4;28430:20;28426:1;28415:9;28411:17;28404:47;28468:131;28594:4;28468:131;:::i;:::-;28460:139;;28187:419;;;:::o;28612:170::-;28752:22;28748:1;28740:6;28736:14;28729:46;28612:170;:::o;28788:366::-;28930:3;28951:67;29015:2;29010:3;28951:67;:::i;:::-;28944:74;;29027:93;29116:3;29027:93;:::i;:::-;29145:2;29140:3;29136:12;29129:19;;28788:366;;;:::o;29160:419::-;29326:4;29364:2;29353:9;29349:18;29341:26;;29413:9;29407:4;29403:20;29399:1;29388:9;29384:17;29377:47;29441:131;29567:4;29441:131;:::i;:::-;29433:139;;29160:419;;;:::o;29585:174::-;29725:26;29721:1;29713:6;29709:14;29702:50;29585:174;:::o;29765:366::-;29907:3;29928:67;29992:2;29987:3;29928:67;:::i;:::-;29921:74;;30004:93;30093:3;30004:93;:::i;:::-;30122:2;30117:3;30113:12;30106:19;;29765:366;;;:::o;30137:419::-;30303:4;30341:2;30330:9;30326:18;30318:26;;30390:9;30384:4;30380:20;30376:1;30365:9;30361:17;30354:47;30418:131;30544:4;30418:131;:::i;:::-;30410:139;;30137:419;;;:::o;30562:181::-;30702:33;30698:1;30690:6;30686:14;30679:57;30562:181;:::o;30749:366::-;30891:3;30912:67;30976:2;30971:3;30912:67;:::i;:::-;30905:74;;30988:93;31077:3;30988:93;:::i;:::-;31106:2;31101:3;31097:12;31090:19;;30749:366;;;:::o;31121:419::-;31287:4;31325:2;31314:9;31310:18;31302:26;;31374:9;31368:4;31364:20;31360:1;31349:9;31345:17;31338:47;31402:131;31528:4;31402:131;:::i;:::-;31394:139;;31121:419;;;:::o;31546:220::-;31686:34;31682:1;31674:6;31670:14;31663:58;31755:3;31750:2;31742:6;31738:15;31731:28;31546:220;:::o;31772:366::-;31914:3;31935:67;31999:2;31994:3;31935:67;:::i;:::-;31928:74;;32011:93;32100:3;32011:93;:::i;:::-;32129:2;32124:3;32120:12;32113:19;;31772:366;;;:::o;32144:419::-;32310:4;32348:2;32337:9;32333:18;32325:26;;32397:9;32391:4;32387:20;32383:1;32372:9;32368:17;32361:47;32425:131;32551:4;32425:131;:::i;:::-;32417:139;;32144:419;;;:::o;32569:143::-;32626:5;32657:6;32651:13;32642:22;;32673:33;32700:5;32673:33;:::i;:::-;32569:143;;;;:::o;32718:351::-;32788:6;32837:2;32825:9;32816:7;32812:23;32808:32;32805:119;;;32843:79;;:::i;:::-;32805:119;32963:1;32988:64;33044:7;33035:6;33024:9;33020:22;32988:64;:::i;:::-;32978:74;;32934:128;32718:351;;;;:::o;33075:176::-;33215:28;33211:1;33203:6;33199:14;33192:52;33075:176;:::o;33257:366::-;33399:3;33420:67;33484:2;33479:3;33420:67;:::i;:::-;33413:74;;33496:93;33585:3;33496:93;:::i;:::-;33614:2;33609:3;33605:12;33598:19;;33257:366;;;:::o;33629:419::-;33795:4;33833:2;33822:9;33818:18;33810:26;;33882:9;33876:4;33872:20;33868:1;33857:9;33853:17;33846:47;33910:131;34036:4;33910:131;:::i;:::-;33902:139;;33629:419;;;:::o;34054:181::-;34194:33;34190:1;34182:6;34178:14;34171:57;34054:181;:::o;34241:366::-;34383:3;34404:67;34468:2;34463:3;34404:67;:::i;:::-;34397:74;;34480:93;34569:3;34480:93;:::i;:::-;34598:2;34593:3;34589:12;34582:19;;34241:366;;;:::o;34613:419::-;34779:4;34817:2;34806:9;34802:18;34794:26;;34866:9;34860:4;34856:20;34852:1;34841:9;34837:17;34830:47;34894:131;35020:4;34894:131;:::i;:::-;34886:139;;34613:419;;;:::o;35038:147::-;35139:11;35176:3;35161:18;;35038:147;;;;:::o;35191:114::-;;:::o;35311:398::-;35470:3;35491:83;35572:1;35567:3;35491:83;:::i;:::-;35484:90;;35583:93;35672:3;35583:93;:::i;:::-;35701:1;35696:3;35692:11;35685:18;;35311:398;;;:::o;35715:379::-;35899:3;35921:147;36064:3;35921:147;:::i;:::-;35914:154;;36085:3;36078:10;;35715:379;;;:::o;36100:181::-;36240:33;36236:1;36228:6;36224:14;36217:57;36100:181;:::o;36287:366::-;36429:3;36450:67;36514:2;36509:3;36450:67;:::i;:::-;36443:74;;36526:93;36615:3;36526:93;:::i;:::-;36644:2;36639:3;36635:12;36628:19;;36287:366;;;:::o;36659:419::-;36825:4;36863:2;36852:9;36848:18;36840:26;;36912:9;36906:4;36902:20;36898:1;36887:9;36883:17;36876:47;36940:131;37066:4;36940:131;:::i;:::-;36932:139;;36659:419;;;:::o;37084:176::-;37224:28;37220:1;37212:6;37208:14;37201:52;37084:176;:::o;37266:366::-;37408:3;37429:67;37493:2;37488:3;37429:67;:::i;:::-;37422:74;;37505:93;37594:3;37505:93;:::i;:::-;37623:2;37618:3;37614:12;37607:19;;37266:366;;;:::o;37638:419::-;37804:4;37842:2;37831:9;37827:18;37819:26;;37891:9;37885:4;37881:20;37877:1;37866:9;37862:17;37855:47;37919:131;38045:4;37919:131;:::i;:::-;37911:139;;37638:419;;;:::o;38063:348::-;38103:7;38126:20;38144:1;38126:20;:::i;:::-;38121:25;;38160:20;38178:1;38160:20;:::i;:::-;38155:25;;38348:1;38280:66;38276:74;38273:1;38270:81;38265:1;38258:9;38251:17;38247:105;38244:131;;;38355:18;;:::i;:::-;38244:131;38403:1;38400;38396:9;38385:20;;38063:348;;;;:::o;38417:169::-;38557:21;38553:1;38545:6;38541:14;38534:45;38417:169;:::o;38592:366::-;38734:3;38755:67;38819:2;38814:3;38755:67;:::i;:::-;38748:74;;38831:93;38920:3;38831:93;:::i;:::-;38949:2;38944:3;38940:12;38933:19;;38592:366;;;:::o;38964:419::-;39130:4;39168:2;39157:9;39153:18;39145:26;;39217:9;39211:4;39207:20;39203:1;39192:9;39188:17;39181:47;39245:131;39371:4;39245:131;:::i;:::-;39237:139;;38964:419;;;:::o;39389:235::-;39529:34;39525:1;39517:6;39513:14;39506:58;39598:18;39593:2;39585:6;39581:15;39574:43;39389:235;:::o;39630:366::-;39772:3;39793:67;39857:2;39852:3;39793:67;:::i;:::-;39786:74;;39869:93;39958:3;39869:93;:::i;:::-;39987:2;39982:3;39978:12;39971:19;;39630:366;;;:::o;40002:419::-;40168:4;40206:2;40195:9;40191:18;40183:26;;40255:9;40249:4;40245:20;40241:1;40230:9;40226:17;40219:47;40283:131;40409:4;40283:131;:::i;:::-;40275:139;;40002:419;;;:::o;40427:148::-;40529:11;40566:3;40551:18;;40427:148;;;;:::o;40581:377::-;40687:3;40715:39;40748:5;40715:39;:::i;:::-;40770:89;40852:6;40847:3;40770:89;:::i;:::-;40763:96;;40868:52;40913:6;40908:3;40901:4;40894:5;40890:16;40868:52;:::i;:::-;40945:6;40940:3;40936:16;40929:23;;40691:267;40581:377;;;;:::o;40964:141::-;41013:4;41036:3;41028:11;;41059:3;41056:1;41049:14;41093:4;41090:1;41080:18;41072:26;;40964:141;;;:::o;41135:845::-;41238:3;41275:5;41269:12;41304:36;41330:9;41304:36;:::i;:::-;41356:89;41438:6;41433:3;41356:89;:::i;:::-;41349:96;;41476:1;41465:9;41461:17;41492:1;41487:137;;;;41638:1;41633:341;;;;41454:520;;41487:137;41571:4;41567:9;41556;41552:25;41547:3;41540:38;41607:6;41602:3;41598:16;41591:23;;41487:137;;41633:341;41700:38;41732:5;41700:38;:::i;:::-;41760:1;41774:154;41788:6;41785:1;41782:13;41774:154;;;41862:7;41856:14;41852:1;41847:3;41843:11;41836:35;41912:1;41903:7;41899:15;41888:26;;41810:4;41807:1;41803:12;41798:17;;41774:154;;;41957:6;41952:3;41948:16;41941:23;;41640:334;;41454:520;;41242:738;;41135:845;;;;:::o;41986:589::-;42211:3;42233:95;42324:3;42315:6;42233:95;:::i;:::-;42226:102;;42345:95;42436:3;42427:6;42345:95;:::i;:::-;42338:102;;42457:92;42545:3;42536:6;42457:92;:::i;:::-;42450:99;;42566:3;42559:10;;41986:589;;;;;;:::o;42581:225::-;42721:34;42717:1;42709:6;42705:14;42698:58;42790:8;42785:2;42777:6;42773:15;42766:33;42581:225;:::o;42812:366::-;42954:3;42975:67;43039:2;43034:3;42975:67;:::i;:::-;42968:74;;43051:93;43140:3;43051:93;:::i;:::-;43169:2;43164:3;43160:12;43153:19;;42812:366;;;:::o;43184:419::-;43350:4;43388:2;43377:9;43373:18;43365:26;;43437:9;43431:4;43427:20;43423:1;43412:9;43408:17;43401:47;43465:131;43591:4;43465:131;:::i;:::-;43457:139;;43184:419;;;:::o;43609:182::-;43749:34;43745:1;43737:6;43733:14;43726:58;43609:182;:::o;43797:366::-;43939:3;43960:67;44024:2;44019:3;43960:67;:::i;:::-;43953:74;;44036:93;44125:3;44036:93;:::i;:::-;44154:2;44149:3;44145:12;44138:19;;43797:366;;;:::o;44169:419::-;44335:4;44373:2;44362:9;44358:18;44350:26;;44422:9;44416:4;44412:20;44408:1;44397:9;44393:17;44386:47;44450:131;44576:4;44450:131;:::i;:::-;44442:139;;44169:419;;;:::o;44594:332::-;44715:4;44753:2;44742:9;44738:18;44730:26;;44766:71;44834:1;44823:9;44819:17;44810:6;44766:71;:::i;:::-;44847:72;44915:2;44904:9;44900:18;44891:6;44847:72;:::i;:::-;44594:332;;;;;:::o;44932:137::-;44986:5;45017:6;45011:13;45002:22;;45033:30;45057:5;45033:30;:::i;:::-;44932:137;;;;:::o;45075:345::-;45142:6;45191:2;45179:9;45170:7;45166:23;45162:32;45159:119;;;45197:79;;:::i;:::-;45159:119;45317:1;45342:61;45395:7;45386:6;45375:9;45371:22;45342:61;:::i;:::-;45332:71;;45288:125;45075:345;;;;:::o;45426:180::-;45474:77;45471:1;45464:88;45571:4;45568:1;45561:15;45595:4;45592:1;45585:15;45612:185;45652:1;45669:20;45687:1;45669:20;:::i;:::-;45664:25;;45703:20;45721:1;45703:20;:::i;:::-;45698:25;;45742:1;45732:35;;45747:18;;:::i;:::-;45732:35;45789:1;45786;45782:9;45777:14;;45612:185;;;;:::o;45803:191::-;45843:4;45863:20;45881:1;45863:20;:::i;:::-;45858:25;;45897:20;45915:1;45897:20;:::i;:::-;45892:25;;45936:1;45933;45930:8;45927:34;;;45941:18;;:::i;:::-;45927:34;45986:1;45983;45979:9;45971:17;;45803:191;;;;:::o;46000:176::-;46032:1;46049:20;46067:1;46049:20;:::i;:::-;46044:25;;46083:20;46101:1;46083:20;:::i;:::-;46078:25;;46122:1;46112:35;;46127:18;;:::i;:::-;46112:35;46168:1;46165;46161:9;46156:14;;46000:176;;;;:::o;46182:98::-;46233:6;46267:5;46261:12;46251:22;;46182:98;;;:::o;46286:168::-;46369:11;46403:6;46398:3;46391:19;46443:4;46438:3;46434:14;46419:29;;46286:168;;;;:::o;46460:360::-;46546:3;46574:38;46606:5;46574:38;:::i;:::-;46628:70;46691:6;46686:3;46628:70;:::i;:::-;46621:77;;46707:52;46752:6;46747:3;46740:4;46733:5;46729:16;46707:52;:::i;:::-;46784:29;46806:6;46784:29;:::i;:::-;46779:3;46775:39;46768:46;;46550:270;46460:360;;;;:::o;46826:640::-;47021:4;47059:3;47048:9;47044:19;47036:27;;47073:71;47141:1;47130:9;47126:17;47117:6;47073:71;:::i;:::-;47154:72;47222:2;47211:9;47207:18;47198:6;47154:72;:::i;:::-;47236;47304:2;47293:9;47289:18;47280:6;47236:72;:::i;:::-;47355:9;47349:4;47345:20;47340:2;47329:9;47325:18;47318:48;47383:76;47454:4;47445:6;47383:76;:::i;:::-;47375:84;;46826:640;;;;;;;:::o;47472:141::-;47528:5;47559:6;47553:13;47544:22;;47575:32;47601:5;47575:32;:::i;:::-;47472:141;;;;:::o;47619:349::-;47688:6;47737:2;47725:9;47716:7;47712:23;47708:32;47705:119;;;47743:79;;:::i;:::-;47705:119;47863:1;47888:63;47943:7;47934:6;47923:9;47919:22;47888:63;:::i;:::-;47878:73;;47834:127;47619:349;;;;:::o
Swarm Source
ipfs://63fa671ed1250d71f31ffa4cf77a023ced86bd0bf62613f0f9889534e9be5c86
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.