ERC-721
Overview
Max Total Supply
4,000 BETH
Holders
652
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 BETHLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BatangethereumContract
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-14 */ /** *Submitted for verification at Etherscan.io on 2022-07-13 */ //*********************************************************************// //*********************************************************************// // // ________ ________ _________ ________ ________ ________ _______ _________ ___ ___ // |\ __ \|\ __ \|\___ ___\\ __ \|\ ___ \|\ ____\ |\ ___ \|\___ ___\\ \|\ \ // \ \ \|\ /\ \ \|\ \|___ \ \_\ \ \|\ \ \ \\ \ \ \ \___| \ \ __/\|___ \ \_\ \ \\\ \ // \ \ __ \ \ __ \ \ \ \ \ \ __ \ \ \\ \ \ \ \ ___ \ \ \_|/__ \ \ \ \ \ __ \ // \ \ \|\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\ \ \ \ \|\ \ \ \ \_|\ \ \ \ \ \ \ \ \ \ // \ \_______\ \__\ \__\ \ \__\ \ \__\ \__\ \__\\ \__\ \_______\ \ \_______\ \ \__\ \ \__\ \__\ // \|_______|\|__|\|__| \|__| \|__|\|__|\|__| \|__|\|_______| \|_______| \|__| \|__|\|__| // // // // //*********************************************************************// //*********************************************************************// //-------------DEPENDENCIES--------------------------// // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if account is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, isContract will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on isContract to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's transfer: sends amount wei to * recipient, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by transfer, making them unable to receive funds via * transfer. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to recipient, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level call. A * plain call is an unsafe replacement for a function call: use this * function instead. * * If target reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[abi.decode]. * * Requirements: * * - target must be a contract. * - calling target with data must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall], but with * errorMessage as a fallback revert reason when target reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall], * but also transferring value wei to target. * * Requirements: * * - the calling contract must have an ETH balance of at least value. * - the called Solidity function must be payable. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[functionCallWithValue], but * with errorMessage as a fallback revert reason when target reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[functionCall], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[functionCall], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} tokenId token is transferred to this contract via {IERC721-safeTransferFrom} * by operator from from, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with IERC721.onERC721Received.selector. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface 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); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when tokenId token is transferred from from to to. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when owner enables approved to manage the tokenId token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when owner enables or disables (approved) operator to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in owner's account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the tokenId token. * * Requirements: * * - tokenId must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers tokenId token from from to to, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - from cannot be the zero address. * - to cannot be the zero address. * - tokenId token must exist and be owned by from. * - If the caller is not from, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If to refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) 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 Returns the account approved for tokenId token. * * Requirements: * * - tokenId must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by owner at a given index of its token list. * Use along with {balanceOf} to enumerate all of owner's tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given index of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for tokenId token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a uint256 to its ASCII string hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a uint256 to its ASCII string hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @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/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * onlyOwner, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * onlyOwner functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (newOwner). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (newOwner). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } //-------------END DEPENDENCIES------------------------// pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a 'leaf' can be proved to be a part of a Merkle tree * defined by 'root'. For this, a 'proof' must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from 'leaf' using 'proof'. A 'proof' is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: Allowlist.sol pragma solidity ^0.8.0; abstract contract Allowlist is Ownable { bytes32 public merkleRoot = 0xaee2ffc5034334237b087a54b6abda041a4e6ce5f60eefe670cc8c8873f95ad1; bool public onlyAllowlistMode = true; /** * @dev Update merkle root to reflect changes in Allowlist * @param _newMerkleRoot new merkle root to reflect most recent Allowlist */ function updateMerkleRoot(bytes32 _newMerkleRoot) public onlyOwner { require(_newMerkleRoot != merkleRoot, "Merkle root will be unchanged!"); merkleRoot = _newMerkleRoot; } /** * @dev Check the proof of an address if valid for merkle root * @param _to address to check for proof * @param _merkleProof Proof of the address to validate against root and leaf */ function isAllowlisted(address _to, bytes32[] calldata _merkleProof) public view returns(bool) { require(merkleRoot != 0, "Merkle root is not set!"); bytes32 leaf = keccak256(abi.encodePacked(_to)); return MerkleProof.verify(_merkleProof, merkleRoot, leaf); } function enableAllowlistOnlyMode() public onlyOwner { onlyAllowlistMode = true; } function disableAllowlistOnlyMode() public onlyOwner { onlyAllowlistMode = false; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable 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 the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex; uint256 public immutable collectionSize; uint256 public maxBatchSize; // 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 ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; /** * @dev * maxBatchSize refers to how much a minter can mint at a time. * collectionSize_ refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalMinted(); } function currentTokenId() public view returns (uint256) { return _totalMinted(); } function getNextTokenId() public view returns (uint256) { return _totalMinted() + 1; } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { unchecked { return currentIndex - _startTokenId(); } } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } // 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. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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) { string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the baseURI and the tokenId. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @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; } function _safeMint(address to, uint256 quantity, bool isAdminMint) internal { _safeMint(to, quantity, isAdminMint, ""); } /** * @dev Mints quantity tokens and transfers them to to. * * Requirements: * * - there must be quantity tokens remaining unminted in the total collection. * - to cannot be the zero address. * - quantity cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bool isAdminMint, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); // For admin mints we do not want to enforce the maxBatchSize limit if (isAdminMint == false) { require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); } _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + (isAdminMint ? 0 : uint128(quantity)) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers tokenId from from to to. * * Requirements: * * - to cannot be the zero address. * - tokenId token must be owned by from. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve to to operate on tokenId * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set owners to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); if (currentIndex == _startTokenId()) revert('No Tokens Minted Yet'); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * 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. */ 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. * * 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 and to are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } /** TimedDrop.sol * This feature will allow the owner to be able to set timed drops for both the public and allowlist mint (if applicable). * It is bound by the block timestamp. The owner is able to determine if the feature should be used as all * with the "enforcePublicDropTime" and "enforceAllowlistDropTime" variables. If the feature is disabled the implmented * *DropTimePassed() functions will always return true. Otherwise calculation is done to check if time has passed. */ abstract contract TimedDrop is Ownable { bool public enforcePublicDropTime = true; uint256 public publicDropTime = 1658113200; /** * @dev Allow the contract owner to set the public time to mint. * @param _newDropTime timestamp since Epoch in seconds you want public drop to happen */ function setPublicDropTime(uint256 _newDropTime) public onlyOwner { require(_newDropTime > block.timestamp, "Drop date must be in future! Otherwise call disablePublicDropTime!"); publicDropTime = _newDropTime; } function usePublicDropTime() public onlyOwner { enforcePublicDropTime = true; } function disablePublicDropTime() public onlyOwner { enforcePublicDropTime = false; } /** * @dev determine if the public droptime has passed. * if the feature is disabled then assume the time has passed. */ function publicDropTimePassed() public view returns(bool) { if(enforcePublicDropTime == false) { return true; } return block.timestamp >= publicDropTime; } // Allowlist implementation of the Timed Drop feature bool public enforceAllowlistDropTime = true; uint256 public allowlistDropTime = 1657854000; /** * @dev Allow the contract owner to set the allowlist time to mint. * @param _newDropTime timestamp since Epoch in seconds you want public drop to happen */ function setAllowlistDropTime(uint256 _newDropTime) public onlyOwner { require(_newDropTime > block.timestamp, "Drop date must be in future! Otherwise call disableAllowlistDropTime!"); allowlistDropTime = _newDropTime; } function useAllowlistDropTime() public onlyOwner { enforceAllowlistDropTime = true; } function disableAllowlistDropTime() public onlyOwner { enforceAllowlistDropTime = false; } function allowlistDropTimePassed() public view returns(bool) { if(enforceAllowlistDropTime == false) { return true; } return block.timestamp >= allowlistDropTime; } } interface IERC20 { function transfer(address _to, uint256 _amount) external returns (bool); function balanceOf(address account) external view returns (uint256); } abstract contract Withdrawable is Ownable { address[] public payableAddresses = [0xb4a9391C658bc1d5a4fd7928c5306d16046141f8]; uint256[] public payableFees = [100]; uint256 public payableAddressCount = 1; function withdrawAll() public onlyOwner { require(address(this).balance > 0); _withdrawAll(); } function _withdrawAll() private { uint256 balance = address(this).balance; for(uint i=0; i < payableAddressCount; i++ ) { _widthdraw( payableAddresses[i], (balance * payableFees[i]) / 100 ); } } function _widthdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); require(success, "Transfer failed."); } /** * @dev Allow contract owner to withdraw ERC-20 balance from contract * while still splitting royalty payments to all other team members. * in the event ERC-20 tokens are paid to the contract. * @param _tokenContract contract of ERC-20 token to withdraw * @param _amount balance to withdraw according to balanceOf of ERC-20 token */ function withdrawAllERC20(address _tokenContract, uint256 _amount) public onlyOwner { require(_amount > 0); IERC20 tokenContract = IERC20(_tokenContract); require(tokenContract.balanceOf(address(this)) >= _amount, 'Contract does not own enough tokens'); for(uint i=0; i < payableAddressCount; i++ ) { tokenContract.transfer(payableAddresses[i], (_amount * payableFees[i]) / 100); } } } // File: EarlyMintIncentive.sol // Allows the contract to have the first x tokens have a discount or // zero fee that can be calculated on the fly. abstract contract EarlyMintIncentive is Ownable, ERC721A { uint256 public PRICE = 0.05 ether; uint256 public EARLY_MINT_PRICE = 0.045 ether; uint256 public earlyMintTokenIdCap = 1500; bool public usingEarlyMintIncentive = true; function enableEarlyMintIncentive() public onlyOwner { usingEarlyMintIncentive = true; } function disableEarlyMintIncentive() public onlyOwner { usingEarlyMintIncentive = false; } /** * @dev Set the max token ID in which the cost incentive will be applied. * @param _newTokenIdCap max tokenId in which incentive will be applied */ function setEarlyMintTokenIdCap(uint256 _newTokenIdCap) public onlyOwner { require(_newTokenIdCap <= collectionSize, "Cannot set incentive tokenId cap larger than totaly supply."); require(_newTokenIdCap >= 1, "Cannot set tokenId cap to less than the first token"); earlyMintTokenIdCap = _newTokenIdCap; } /** * @dev Set the incentive mint price * @param _feeInWei new price per token when in incentive range */ function setEarlyIncentivePrice(uint256 _feeInWei) public onlyOwner { EARLY_MINT_PRICE = _feeInWei; } /** * @dev Set the primary mint price - the base price when not under incentive * @param _feeInWei new price per token */ function setPrice(uint256 _feeInWei) public onlyOwner { PRICE = _feeInWei; } function getPrice(uint256 _count) public view returns (uint256) { require(_count > 0, "Must be minting at least 1 token."); // short circuit function if we dont need to even calc incentive pricing // short circuit if the current tokenId is also already over cap if( usingEarlyMintIncentive == false || currentTokenId() > earlyMintTokenIdCap ) { return PRICE * _count; } uint256 endingTokenId = currentTokenId() + _count; // If qty to mint results in a final token ID less than or equal to the cap then // the entire qty is within free mint. if(endingTokenId <= earlyMintTokenIdCap) { return EARLY_MINT_PRICE * _count; } // If the current token id is less than the incentive cap // and the ending token ID is greater than the incentive cap // we will be straddling the cap so there will be some amount // that are incentive and some that are regular fee. uint256 incentiveTokenCount = earlyMintTokenIdCap - currentTokenId(); uint256 outsideIncentiveCount = endingTokenId - earlyMintTokenIdCap; return (EARLY_MINT_PRICE * incentiveTokenCount) + (PRICE * outsideIncentiveCount); } } abstract contract BethERC721A is Ownable, ERC721A, Withdrawable, ReentrancyGuard , EarlyMintIncentive , Allowlist , TimedDrop { constructor( string memory tokenName, string memory tokenSymbol ) ERC721A(tokenName, tokenSymbol, 2, 4000) { } uint8 public CONTRACT_VERSION = 2; string public _baseTokenURI = "ipfs/bafybeib7ivflhuw3ucbmieybglsdq2lkxhpkbmjz7g4hzw6xn3wmrol5e4/"; bool public mintingOpen = true; bool public isRevealed = false; uint256 public MAX_WALLET_MINTS = 50; mapping(address => bool) public OGClaimed; mapping(address => bool) public whitelistClaimed; mapping(address => bool) public freeMintClaimed; /////////////// Admin Mint Functions /** * @dev Mints a token to an address with a tokenURI. * This is owner only and allows a fee-free drop * @param _to address of the future owner of the token * @param _qty amount of tokens to drop the owner */ function mintToAdminV2(address _to, uint256 _qty) public onlyOwner{ require(_qty > 0, "Must mint at least 1 token."); require(currentTokenId() + _qty <= collectionSize, "Cannot mint over supply cap of 5000"); _safeMint(_to, _qty, true); } /////////////// GENERIC MINT FUNCTIONS /** * @dev Mints a single token to an address. * fee may or may not be required* * @param _to address of the future owner of the token */ function mintTo(address _to) public payable { require(getNextTokenId() <= collectionSize, "Cannot mint over supply cap of 5000"); require(mintingOpen == true && onlyAllowlistMode == false, "Public minting is not open right now!"); require(publicDropTimePassed() == true, "Public drop time has not passed!"); require(canMintAmount(_to, 1), "Wallet address is over the maximum allowed mints"); require(msg.value == getPrice(1), "Value needs to be exactly the mint fee!"); _safeMint(_to, 1, false); } /** * @dev Mints a token to an address with a tokenURI. * fee may or may not be required* * @param _to address of the future owner of the token * @param _amount number of tokens to mint */ function mintToMultiple(address _to, uint256 _amount) public payable { require(_amount >= 1, "Must mint at least 1 token"); require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction"); require(mintingOpen == true && onlyAllowlistMode == false, "Public minting is not open right now!"); require(publicDropTimePassed() == true, "Public drop time has not passed!"); require(canMintAmount(_to, _amount), "Wallet address is over the maximum allowed mints"); require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 5000"); require(msg.value == getPrice(_amount), "Value below required mint fee for amount"); _safeMint(_to, _amount, false); } function openMinting() public onlyOwner { mintingOpen = true; } function stopMinting() public onlyOwner { mintingOpen = false; } ///////////// ALLOWLIST MINTING FUNCTIONS /** * @dev Mints a token to an address with a tokenURI for allowlist. * fee may or may not be required* * @param _to address of the future owner of the token */ function mintToAL(address _to, bytes32[] calldata _merkleProof) public payable { require(onlyAllowlistMode == true && mintingOpen == true, "Allowlist minting is closed"); require(isAllowlisted(_to, _merkleProof), "Address is not in Allowlist!"); require(getNextTokenId() <= collectionSize, "Cannot mint over supply cap of 5000"); require(canMintAmount(_to, 1), "Wallet address is over the maximum allowed mints"); require(msg.value == getPrice(1), "Value needs to be exactly the mint fee!"); require(allowlistDropTimePassed() == true, "Allowlist drop time has not passed!"); _safeMint(_to, 1, false); } /** * @dev Mints a token to an address with a tokenURI for allowlist. * fee may or may not be required* * @param _to address of the future owner of the token * @param _amount number of tokens to mint */ function mintToMultipleOG(address _to, uint256 _amount, bytes32[] calldata _merkleProof) public payable { require(!OGClaimed[msg.sender], "Address already claimed"); require(onlyAllowlistMode == true && mintingOpen == true, "Allowlist minting is closed"); require(isAllowlisted(_to, _merkleProof), "Address is not in Allowlist!"); require(_amount >= 1, "Must mint at least 1 token"); require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction"); require(canMintAmount(_to, _amount), "Wallet address is over the maximum allowed mints"); require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 5000"); require(msg.value == getPrice(_amount), "Value below required mint fee for amount"); require(allowlistDropTimePassed() == true, "Allowlist drop time has not passed!"); _safeMint(_to, _amount, false); OGClaimed[msg.sender] = true; } function mintToMultipleAL(address _to, uint256 _amount, bytes32[] calldata _merkleProof) public payable { require(!whitelistClaimed[msg.sender], "Address already claimed"); require(onlyAllowlistMode == true && mintingOpen == true, "Allowlist minting is closed"); require(isAllowlisted(_to, _merkleProof), "Address is not in Allowlist!"); require(_amount >= 1, "Must mint at least 1 token"); require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction"); require(canMintAmount(_to, _amount), "Wallet address is over the maximum allowed mints"); require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 5000"); require(msg.value == getPrice(_amount), "Value below required mint fee for amount"); require(allowlistDropTimePassed() == true, "Allowlist drop time has not passed!"); _safeMint(_to, _amount, false); whitelistClaimed[msg.sender] = true; } function mintToMultipleFM(address _to, uint256 _amount, bytes32[] calldata _merkleProof) public payable { require(!freeMintClaimed[msg.sender], "Address already claimed"); require(onlyAllowlistMode == true && mintingOpen == true, "Allowlist minting is closed"); require(isAllowlisted(_to, _merkleProof), "Address is not in Allowlist!"); require(_amount >= 1, "Must mint at least 1 token"); require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction"); require(canMintAmount(_to, _amount), "Wallet address is over the maximum allowed mints"); require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 5000"); require(msg.value == getPrice(_amount), "Value below required mint fee for amount"); require(allowlistDropTimePassed() == true, "Allowlist drop time has not passed!"); _safeMint(_to, _amount, false); freeMintClaimed[msg.sender] = true; } /** * @dev Enable allowlist minting fully by enabling both flags */ function openAllowlistMint() public onlyOwner { enableAllowlistOnlyMode(); mintingOpen = true; } /** * @dev Close allowlist minting fully by disabling both flags */ function closeAllowlistMint() public onlyOwner { disableAllowlistOnlyMode(); mintingOpen = false; } /** * @dev Check if wallet over MAX_WALLET_MINTS * @param _address address in question to check if minted count exceeds max */ function canMintAmount(address _address, uint256 _amount) public view returns(bool) { require(_amount >= 1, "Amount must be greater than or equal to 1"); return (_numberMinted(_address) + _amount) <= MAX_WALLET_MINTS; } /** * @dev Update the maximum amount of tokens that can be minted by a unique wallet * @param _newWalletMax the new max of tokens a wallet can mint. Must be >= 1 */ function setWalletMax(uint256 _newWalletMax) public onlyOwner { require(_newWalletMax >= 1, "Max mints per wallet must be at least 1"); MAX_WALLET_MINTS = _newWalletMax; } /** * @dev Allows owner to set Max mints per tx * @param _newMaxMint maximum amount of tokens allowed to mint per tx. Must be >= 1 */ function setMaxMint(uint256 _newMaxMint) public onlyOwner { require(_newMaxMint >= 1, "Max mint must be at least 1"); maxBatchSize = _newMaxMint; } function unveil(string memory _updatedTokenURI) public onlyOwner { require(isRevealed == false, "Tokens are already unveiled"); _baseTokenURI = _updatedTokenURI; isRevealed = true; } function _baseURI() internal view virtual override returns(string memory) { return _baseTokenURI; } function baseTokenURI() public view returns(string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function getOwnershipData(uint256 tokenId) external view returns(TokenOwnership memory) { return ownershipOf(tokenId); } } // File: contracts/BatangethereumContract.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract BatangethereumContract is BethERC721A { constructor() BethERC721A("BATANG ETHEREUM", "BETH"){} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CONTRACT_VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EARLY_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WALLET_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"OGClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistDropTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistDropTimePassed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"canMintAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeAllowlistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableAllowlistDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAllowlistOnlyMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableEarlyMintIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePublicDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earlyMintTokenIdCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableAllowlistOnlyMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableEarlyMintIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enforceAllowlistDropTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enforcePublicDropTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isAllowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintToAL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"mintToAdminV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintToMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintToMultipleAL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintToMultipleFM","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintToMultipleOG","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyAllowlistMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openAllowlistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openMinting","outputs":[],"stateMutability":"nonpayable","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":"payableAddressCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payableAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payableFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicDropTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicDropTimePassed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDropTime","type":"uint256"}],"name":"setAllowlistDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeInWei","type":"uint256"}],"name":"setEarlyIncentivePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTokenIdCap","type":"uint256"}],"name":"setEarlyMintTokenIdCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeInWei","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDropTime","type":"uint256"}],"name":"setPublicDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWalletMax","type":"uint256"}],"name":"setWalletMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopMinting","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_updatedTokenURI","type":"string"}],"name":"unveil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useAllowlistDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usePublicDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usingEarlyMintIncentive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAllERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600060095560c060405273b4a9391c658bc1d5a4fd7928c5306d16046141f860a09081526200003390600a90600162000305565b506040805160208101909152606481526200005390600b9060016200036f565b506001600c81905566b1a2bc2ec50000600e55669fdf42f6e48000600f556105dc6010556011805460ff1990811683179091557faee2ffc5034334237b087a54b6abda041a4e6ce5f60eefe670cc8c8873f95ad16012556013805461010161ffff199091161790556362d4ccb06014556015805482169092179091556362d0d8306016556017805490911660021790556040805160808101909152604180825262004a85602083013980516200011291601891602090910190620003b2565b506019805461ffff191660011790556032601a553480156200013357600080fd5b506040518060400160405280600f81526020016e424154414e4720455448455245554d60881b815250604051806040016040528060048152602001630848aa8960e31b81525081816002610fa06200019a62000194620002b160201b60201c565b620002b5565b60008111620002075760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620002695760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b6064820152608401620001fe565b83516200027e906003906020870190620003b2565b50825162000294906004906020860190620003b2565b5060029190915560805250506001808055600d5550620004839050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280548282559060005260206000209081019282156200035d579160200282015b828111156200035d57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000326565b506200036b9291506200042f565b5090565b8280548282559060005260206000209081019282156200035d579160200282015b828111156200035d578251829060ff1690559160200191906001019062000390565b828054620003c09062000446565b90600052602060002090601f016020900481019282620003e457600085556200035d565b82601f10620003ff57805160ff19168380011785556200035d565b828001600101855582156200035d579182015b828111156200035d57825182559160200191906001019062000412565b5b808211156200036b576000815560010162000430565b600181811c908216806200045b57607f821691505b602082108114156200047d57634e487b7160e01b600052602260045260246000fd5b50919050565b6080516145ae620004d76000396000818161076b01528181610f8c0152818161136f015281816117a50152818161192301528181611cba015281816120a40152818161267e015261290f01526145ae6000f3fe6080604052600436106104935760003560e01c8063817c0d9c11610260578063caa0f92a11610144578063e0eddd91116100c1578063ee54be9611610085578063ee54be9614610d59578063f2fde38b14610d79578063f4637a1514610d99578063f703166314610db3578063f8c0fd2014610dd3578063fd19eaf014610de857600080fd5b8063e0eddd9114610cab578063e692893314610cc1578063e6c6990a14610cd6578063e757223014610cf0578063e985e9c514610d1057600080fd5b8063d7224ba011610108578063d7224ba014610c0d578063d8d2412014610c23578063db4bec4414610c38578063df213e8a14610c68578063e0ec7c3614610c7b57600080fd5b8063caa0f92a14610b9b578063cc3a508514610bb0578063cfc86f7b14610bc3578063cff4492314610bd8578063d547cfb714610bf857600080fd5b806395d89b41116101dd578063b4835e07116101a1578063b4835e0714610afc578063b88d4fde14610b1c578063bb1876a814610b3c578063bc05748e14610b51578063c54826ab14610b66578063c87b56dd14610b7b57600080fd5b806395d89b4114610a72578063a22cb46514610a87578063ab523c6814610aa7578063afe5608b14610ac7578063b40ebceb14610adc57600080fd5b80638f4bb497116102245780638f4bb497146109ac5780638ff4013f146109c657806391b7f5ed146109e657806391c4b57414610a065780639231ab2a14610a2557600080fd5b8063817c0d9c1461092e578063853828b614610943578063891bbe73146109585780638d859f3e146109785780638da5cb5b1461098e57600080fd5b80633e3e0b121161038757806355228ca7116103045780636ba9fd38116102c85780636ba9fd38146108a75780636d3de806146108bc57806370a08231146108d1578063715018a6146108f1578063755edd171461090657806379ab3c891461091957600080fd5b806355228ca71461082257806355f804b31461083c57806358feaa591461085c5780636352211e1461087157806367dec6781461089157600080fd5b80634783f0ef1161034b5780634783f0ef1461078d5780634ab8b5dd146107ad5780634f6ccce7146107c357806354214f69146107e3578063547520fe1461080257600080fd5b80633e3e0b12146106ee57806340ccc0821461070357806342842e0e1461072357806344eed8811461074357806345c0f5331461075957600080fd5b806323b872dd116104155780632f745c59116103d95780632f745c5914610659578063330067861461067957806338b90333146106995780633c003254146106c55780633e07311c146106d857600080fd5b806323b872dd146105da57806326c8140f146105fa578063286c81371461060d5780632913daa01461062d5780632eb4a7ab1461064357600080fd5b8063095ea7b31161045c578063095ea7b31461055f5780630c863bb61461057f57806318160ddd146104985780631aa4ba67146105945780631dfcaa48146105aa57600080fd5b80629a9b7b1461049857806301ffc9a7146104c05780630644cefa146104f057806306fdde0314610505578063081812fc14610527575b600080fd5b3480156104a457600080fd5b506104ad610e08565b6040519081526020015b60405180910390f35b3480156104cc57600080fd5b506104e06104db366004613ea7565b610e1c565b60405190151581526020016104b7565b6105036104fe366004613dee565b610e89565b005b34801561051157600080fd5b5061051a611013565b6040516104b7919061404b565b34801561053357600080fd5b50610547610542366004613e8e565b6110a5565b6040516001600160a01b0390911681526020016104b7565b34801561056b57600080fd5b5061050361057a366004613dee565b61112e565b34801561058b57600080fd5b506104e0611246565b3480156105a057600080fd5b506104ad60165481565b3480156105b657600080fd5b506104e06105c5366004613c60565b601b6020526000908152604090205460ff1681565b3480156105e657600080fd5b506105036105f5366004613cae565b611268565b610503610608366004613e18565b611273565b34801561061957600080fd5b506104ad610628366004613e8e565b61143b565b34801561063957600080fd5b506104ad60025481565b34801561064f57600080fd5b506104ad60125481565b34801561066557600080fd5b506104ad610674366004613dee565b61145c565b34801561068557600080fd5b506104e0610694366004613d65565b6115d3565b3480156106a557600080fd5b506017546106b39060ff1681565b60405160ff90911681526020016104b7565b6105036106d3366004613e18565b6116a9565b3480156106e457600080fd5b506104ad600c5481565b3480156106fa57600080fd5b50610503611871565b34801561070f57600080fd5b5061050361071e366004613dee565b6118a7565b34801561072f57600080fd5b5061050361073e366004613cae565b61197f565b34801561074f57600080fd5b506104ad60145481565b34801561076557600080fd5b506104ad7f000000000000000000000000000000000000000000000000000000000000000081565b34801561079957600080fd5b506105036107a8366004613e8e565b61199a565b3480156107b957600080fd5b506104ad601a5481565b3480156107cf57600080fd5b506104ad6107de366004613e8e565b611a1b565b3480156107ef57600080fd5b506019546104e090610100900460ff1681565b34801561080e57600080fd5b5061050361081d366004613e8e565b611a83565b34801561082e57600080fd5b506015546104e09060ff1681565b34801561084857600080fd5b50610503610857366004613ee1565b611b03565b34801561086857600080fd5b50610503611b39565b34801561087d57600080fd5b5061054761088c366004613e8e565b611b70565b34801561089d57600080fd5b506104ad600f5481565b3480156108b357600080fd5b50610503611b82565b3480156108c857600080fd5b50610503611bbb565b3480156108dd57600080fd5b506104ad6108ec366004613c60565b611bf1565b3480156108fd57600080fd5b50610503611c82565b610503610914366004613c60565b611cb8565b34801561092557600080fd5b50610503611ded565b34801561093a57600080fd5b50610503611e26565b34801561094f57600080fd5b50610503611e5f565b34801561096457600080fd5b50610547610973366004613e8e565b611e9e565b34801561098457600080fd5b506104ad600e5481565b34801561099a57600080fd5b506000546001600160a01b0316610547565b3480156109b857600080fd5b506019546104e09060ff1681565b3480156109d257600080fd5b506105036109e1366004613e8e565b611ec8565b3480156109f257600080fd5b50610503610a01366004613e8e565b611f58565b348015610a1257600080fd5b506013546104e090610100900460ff1681565b348015610a3157600080fd5b50610a45610a40366004613e8e565b611f87565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016104b7565b348015610a7e57600080fd5b5061051a611fa4565b348015610a9357600080fd5b50610503610aa2366004613db7565b611fb3565b348015610ab357600080fd5b50610503610ac2366004613e8e565b612078565b348015610ad357600080fd5b506105036121aa565b348015610ae857600080fd5b50610503610af7366004613dee565b6121dc565b348015610b0857600080fd5b50610503610b17366004613e8e565b612401565b348015610b2857600080fd5b50610503610b37366004613cea565b612430565b348015610b4857600080fd5b50610503612463565b348015610b5d57600080fd5b50610503612499565b348015610b7257600080fd5b506105036124d4565b348015610b8757600080fd5b5061051a610b96366004613e8e565b61250a565b348015610ba757600080fd5b506104ad612568565b610503610bbe366004613e18565b612582565b348015610bcf57600080fd5b5061051a61274a565b348015610be457600080fd5b50610503610bf3366004613f52565b6127d8565b348015610c0457600080fd5b5061051a612880565b348015610c1957600080fd5b506104ad60095481565b348015610c2f57600080fd5b506104e061288f565b348015610c4457600080fd5b506104e0610c53366004613c60565b601c6020526000908152604090205460ff1681565b610503610c76366004613d65565b6128ac565b348015610c8757600080fd5b506104e0610c96366004613c60565b601d6020526000908152604090205460ff1681565b348015610cb757600080fd5b506104ad60105481565b348015610ccd57600080fd5b506105036129d9565b348015610ce257600080fd5b506013546104e09060ff1681565b348015610cfc57600080fd5b506104ad610d0b366004613e8e565b612a12565b348015610d1c57600080fd5b506104e0610d2b366004613c7b565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610d6557600080fd5b50610503610d74366004613e8e565b612b19565b348015610d8557600080fd5b50610503610d94366004613c60565b612bc8565b348015610da557600080fd5b506011546104e09060ff1681565b348015610dbf57600080fd5b50610503610dce366004613e8e565b612c60565b348015610ddf57600080fd5b50610503612d12565b348015610df457600080fd5b506104e0610e03366004613dee565b612d44565b6000610e176001546000190190565b905090565b60006001600160e01b031982166380ac58cd60e01b1480610e4d57506001600160e01b03198216635b5e139f60e01b145b80610e6857506001600160e01b0319821663780e9d6360e01b145b80610e8357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001811015610eb35760405162461bcd60e51b8152600401610eaa9061405e565b60405180910390fd5b600254811115610ed55760405162461bcd60e51b8152600401610eaa9061436c565b60195460ff1615156001148015610eef575060135460ff16155b610f0b5760405162461bcd60e51b8152600401610eaa906140cc565b610f13611246565b1515600114610f645760405162461bcd60e51b815260206004820181905260248201527f5075626c69632064726f702074696d6520686173206e6f7420706173736564216044820152606401610eaa565b610f6e8282612d44565b610f8a5760405162461bcd60e51b8152600401610eaa90614154565b7f000000000000000000000000000000000000000000000000000000000000000081610fb4610e08565b610fbe91906143dc565b1115610fdc5760405162461bcd60e51b8152600401610eaa90614222565b610fe581612a12565b34146110035760405162461bcd60e51b8152600401610eaa90614324565b61100f82826000612dc9565b5050565b60606003805461102290614492565b80601f016020809104026020016040519081016040528092919081815260200182805461104e90614492565b801561109b5780601f106110705761010080835404028352916020019161109b565b820191906000526020600020905b81548152906001019060200180831161107e57829003601f168201915b5050505050905090565b60006110b082612de4565b6111125760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610eaa565b506000908152600760205260409020546001600160a01b031690565b600061113982611b70565b9050806001600160a01b0316836001600160a01b031614156111a85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610eaa565b336001600160a01b03821614806111c457506111c48133610d2b565b6112365760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610eaa565b611241838383612dfa565b505050565b601354600090610100900460ff1661125e5750600190565b5060145442101590565b611241838383612e56565b336000908152601d602052604090205460ff16156112a35760405162461bcd60e51b8152600401610eaa9061429a565b60135460ff16151560011480156112c1575060195460ff1615156001145b6112dd5760405162461bcd60e51b8152600401610eaa90614095565b6112e88483836115d3565b6113045760405162461bcd60e51b8152600401610eaa906141a4565b60018310156113255760405162461bcd60e51b8152600401610eaa9061405e565b6002548311156113475760405162461bcd60e51b8152600401610eaa9061436c565b6113518484612d44565b61136d5760405162461bcd60e51b8152600401610eaa90614154565b7f000000000000000000000000000000000000000000000000000000000000000083611397610e08565b6113a191906143dc565b11156113bf5760405162461bcd60e51b8152600401610eaa90614222565b6113c883612a12565b34146113e65760405162461bcd60e51b8152600401610eaa90614324565b6113ee61288f565b151560011461140f5760405162461bcd60e51b8152600401610eaa90614111565b61141b84846000612dc9565b5050336000908152601d60205260409020805460ff191660011790555050565b600b818154811061144b57600080fd5b600091825260209091200154905081565b600061146783611bf1565b82106114c05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610eaa565b60006114ca610e08565b905060008060005b83811015611573576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561152457805192505b876001600160a01b0316836001600160a01b03161415611560578684141561155257509350610e8392505050565b8361155c816144cd565b9450505b508061156b816144cd565b9150506114d2565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610eaa565b6012546000906116255760405162461bcd60e51b815260206004820152601760248201527f4d65726b6c6520726f6f74206973206e6f7420736574210000000000000000006044820152606401610eaa565b6040516bffffffffffffffffffffffff19606086901b1660208201526000906034016040516020818303038152906040528051906020012090506116a08484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060125491508490506131d9565b95945050505050565b336000908152601c602052604090205460ff16156116d95760405162461bcd60e51b8152600401610eaa9061429a565b60135460ff16151560011480156116f7575060195460ff1615156001145b6117135760405162461bcd60e51b8152600401610eaa90614095565b61171e8483836115d3565b61173a5760405162461bcd60e51b8152600401610eaa906141a4565b600183101561175b5760405162461bcd60e51b8152600401610eaa9061405e565b60025483111561177d5760405162461bcd60e51b8152600401610eaa9061436c565b6117878484612d44565b6117a35760405162461bcd60e51b8152600401610eaa90614154565b7f0000000000000000000000000000000000000000000000000000000000000000836117cd610e08565b6117d791906143dc565b11156117f55760405162461bcd60e51b8152600401610eaa90614222565b6117fe83612a12565b341461181c5760405162461bcd60e51b8152600401610eaa90614324565b61182461288f565b15156001146118455760405162461bcd60e51b8152600401610eaa90614111565b61185184846000612dc9565b5050336000908152601c60205260409020805460ff191660011790555050565b6000546001600160a01b0316331461189b5760405162461bcd60e51b8152600401610eaa90614265565b6019805460ff19169055565b6000546001600160a01b031633146118d15760405162461bcd60e51b8152600401610eaa90614265565b600081116119215760405162461bcd60e51b815260206004820152601b60248201527f4d757374206d696e74206174206c65617374203120746f6b656e2e00000000006044820152606401610eaa565b7f00000000000000000000000000000000000000000000000000000000000000008161194b610e08565b61195591906143dc565b11156119735760405162461bcd60e51b8152600401610eaa90614222565b61100f82826001612dc9565b61124183838360405180602001604052806000815250612430565b6000546001600160a01b031633146119c45760405162461bcd60e51b8152600401610eaa90614265565b601254811415611a165760405162461bcd60e51b815260206004820152601e60248201527f4d65726b6c6520726f6f742077696c6c20626520756e6368616e6765642100006044820152606401610eaa565b601255565b6000611a25610e08565b8210611a7f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610eaa565b5090565b6000546001600160a01b03163314611aad5760405162461bcd60e51b8152600401610eaa90614265565b6001811015611afe5760405162461bcd60e51b815260206004820152601b60248201527f4d6178206d696e74206d757374206265206174206c65617374203100000000006044820152606401610eaa565b600255565b6000546001600160a01b03163314611b2d5760405162461bcd60e51b8152600401610eaa90614265565b61124160188383613a7b565b6000546001600160a01b03163314611b635760405162461bcd60e51b8152600401610eaa90614265565b6013805461ff0019169055565b6000611b7b826131ef565b5192915050565b6000546001600160a01b03163314611bac5760405162461bcd60e51b8152600401610eaa90614265565b6019805460ff19166001179055565b6000546001600160a01b03163314611be55760405162461bcd60e51b8152600401610eaa90614265565b6013805460ff19169055565b60006001600160a01b038216611c5d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610eaa565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6000546001600160a01b03163314611cac5760405162461bcd60e51b8152600401610eaa90614265565b611cb6600061331d565b565b7f0000000000000000000000000000000000000000000000000000000000000000611ce1612568565b1115611cff5760405162461bcd60e51b8152600401610eaa90614222565b60195460ff1615156001148015611d19575060135460ff16155b611d355760405162461bcd60e51b8152600401610eaa906140cc565b611d3d611246565b1515600114611d8e5760405162461bcd60e51b815260206004820181905260248201527f5075626c69632064726f702074696d6520686173206e6f7420706173736564216044820152606401610eaa565b611d99816001612d44565b611db55760405162461bcd60e51b8152600401610eaa90614154565b611dbf6001612a12565b3414611ddd5760405162461bcd60e51b8152600401610eaa906141db565b611dea8160016000612dc9565b50565b6000546001600160a01b03163314611e175760405162461bcd60e51b8152600401610eaa90614265565b6013805460ff19166001179055565b6000546001600160a01b03163314611e505760405162461bcd60e51b8152600401610eaa90614265565b6011805460ff19166001179055565b6000546001600160a01b03163314611e895760405162461bcd60e51b8152600401610eaa90614265565b60004711611e9657600080fd5b611cb661336d565b600a8181548110611eae57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314611ef25760405162461bcd60e51b8152600401610eaa90614265565b6001811015611f535760405162461bcd60e51b815260206004820152602760248201527f4d6178206d696e7473207065722077616c6c6574206d757374206265206174206044820152666c65617374203160c81b6064820152608401610eaa565b601a55565b6000546001600160a01b03163314611f825760405162461bcd60e51b8152600401610eaa90614265565b600e55565b6040805180820190915260008082526020820152610e83826131ef565b60606004805461102290614492565b6001600160a01b03821633141561200c5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610eaa565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146120a25760405162461bcd60e51b8152600401610eaa90614265565b7f00000000000000000000000000000000000000000000000000000000000000008111156121385760405162461bcd60e51b815260206004820152603b60248201527f43616e6e6f742073657420696e63656e7469766520746f6b656e49642063617060448201527f206c6172676572207468616e20746f74616c7920737570706c792e00000000006064820152608401610eaa565b60018110156121a55760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073657420746f6b656e49642063617020746f206c65737320746044820152723430b7103a3432903334b939ba103a37b5b2b760691b6064820152608401610eaa565b601055565b6000546001600160a01b031633146121d45760405162461bcd60e51b8152600401610eaa90614265565b61189b611bbb565b6000546001600160a01b031633146122065760405162461bcd60e51b8152600401610eaa90614265565b6000811161221357600080fd5b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a082319060240160206040518083038186803b15801561225657600080fd5b505afa15801561226a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228e9190613f9a565b10156122e85760405162461bcd60e51b815260206004820152602360248201527f436f6e747261637420646f6573206e6f74206f776e20656e6f75676820746f6b604482015262656e7360e81b6064820152608401610eaa565b60005b600c548110156123fb57816001600160a01b031663a9059cbb600a838154811061231757612317614528565b9060005260206000200160009054906101000a90046001600160a01b03166064600b858154811061234a5761234a614528565b9060005260206000200154876123609190614408565b61236a91906143f4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156123b057600080fd5b505af11580156123c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e89190613e71565b50806123f3816144cd565b9150506122eb565b50505050565b6000546001600160a01b0316331461242b5760405162461bcd60e51b8152600401610eaa90614265565b600f55565b61243b848484612e56565b612447848484846133fb565b6123fb5760405162461bcd60e51b8152600401610eaa906142d1565b6000546001600160a01b0316331461248d5760405162461bcd60e51b8152600401610eaa90614265565b6015805460ff19169055565b6000546001600160a01b031633146124c35760405162461bcd60e51b8152600401610eaa90614265565b6013805461ff001916610100179055565b6000546001600160a01b031633146124fe5760405162461bcd60e51b8152600401610eaa90614265565b6011805460ff19169055565b60606000612516612880565b905060008151116125365760405180602001604052806000815250612561565b8061254084613509565b604051602001612551929190613fdf565b6040516020818303038152906040525b9392505050565b60006125776001546000190190565b610e179060016143dc565b336000908152601b602052604090205460ff16156125b25760405162461bcd60e51b8152600401610eaa9061429a565b60135460ff16151560011480156125d0575060195460ff1615156001145b6125ec5760405162461bcd60e51b8152600401610eaa90614095565b6125f78483836115d3565b6126135760405162461bcd60e51b8152600401610eaa906141a4565b60018310156126345760405162461bcd60e51b8152600401610eaa9061405e565b6002548311156126565760405162461bcd60e51b8152600401610eaa9061436c565b6126608484612d44565b61267c5760405162461bcd60e51b8152600401610eaa90614154565b7f0000000000000000000000000000000000000000000000000000000000000000836126a6610e08565b6126b091906143dc565b11156126ce5760405162461bcd60e51b8152600401610eaa90614222565b6126d783612a12565b34146126f55760405162461bcd60e51b8152600401610eaa90614324565b6126fd61288f565b151560011461271e5760405162461bcd60e51b8152600401610eaa90614111565b61272a84846000612dc9565b5050336000908152601b60205260409020805460ff191660011790555050565b6018805461275790614492565b80601f016020809104026020016040519081016040528092919081815260200182805461278390614492565b80156127d05780601f106127a5576101008083540402835291602001916127d0565b820191906000526020600020905b8154815290600101906020018083116127b357829003601f168201915b505050505081565b6000546001600160a01b031633146128025760405162461bcd60e51b8152600401610eaa90614265565b601954610100900460ff161561285a5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e732061726520616c726561647920756e7665696c656400000000006044820152606401610eaa565b805161286d906018906020840190613afb565b50506019805461ff001916610100179055565b60606018805461102290614492565b60155460009060ff166128a25750600190565b5060165442101590565b60135460ff16151560011480156128ca575060195460ff1615156001145b6128e65760405162461bcd60e51b8152600401610eaa90614095565b6128f18383836115d3565b61290d5760405162461bcd60e51b8152600401610eaa906141a4565b7f0000000000000000000000000000000000000000000000000000000000000000612936612568565b11156129545760405162461bcd60e51b8152600401610eaa90614222565b61295f836001612d44565b61297b5760405162461bcd60e51b8152600401610eaa90614154565b6129856001612a12565b34146129a35760405162461bcd60e51b8152600401610eaa906141db565b6129ab61288f565b15156001146129cc5760405162461bcd60e51b8152600401610eaa90614111565b6112418360016000612dc9565b6000546001600160a01b03163314612a035760405162461bcd60e51b8152600401610eaa90614265565b6015805460ff19166001179055565b6000808211612a6d5760405162461bcd60e51b815260206004820152602160248201527f4d757374206265206d696e74696e67206174206c65617374203120746f6b656e6044820152601760f91b6064820152608401610eaa565b60115460ff161580612a875750601054612a85610e08565b115b15612a9a5781600e54610e839190614408565b600082612aa5610e08565b612aaf91906143dc565b90506010548111612ac85782600f546125619190614408565b6000612ad2610e08565b601054612adf919061444f565b9050600060105483612af1919061444f565b905080600e54612b019190614408565b82600f54612b0f9190614408565b6116a091906143dc565b6000546001600160a01b03163314612b435760405162461bcd60e51b8152600401610eaa90614265565b428111612bc35760405162461bcd60e51b815260206004820152604260248201527f44726f702064617465206d75737420626520696e2066757475726521204f746860448201527f6572776973652063616c6c2064697361626c655075626c696344726f7054696d606482015261652160f01b608482015260a401610eaa565b601455565b6000546001600160a01b03163314612bf25760405162461bcd60e51b8152600401610eaa90614265565b6001600160a01b038116612c575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610eaa565b611dea8161331d565b6000546001600160a01b03163314612c8a5760405162461bcd60e51b8152600401610eaa90614265565b428111612d0d5760405162461bcd60e51b815260206004820152604560248201527f44726f702064617465206d75737420626520696e2066757475726521204f746860448201527f6572776973652063616c6c2064697361626c65416c6c6f776c69737444726f7060648201526454696d652160d81b608482015260a401610eaa565b601655565b6000546001600160a01b03163314612d3c5760405162461bcd60e51b8152600401610eaa90614265565b611bac611ded565b60006001821015612da95760405162461bcd60e51b815260206004820152602960248201527f416d6f756e74206d7573742062652067726561746572207468616e206f7220656044820152687175616c20746f203160b81b6064820152608401610eaa565b601a5482612db685613606565b612dc091906143dc565b11159392505050565b611241838383604051806020016040528060008152506136a4565b600081600111158015610e835750506001541190565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612e61826131ef565b80519091506000906001600160a01b0316336001600160a01b03161480612e98575033612e8d846110a5565b6001600160a01b0316145b80612eaa57508151612eaa9033610d2b565b905080612f145760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610eaa565b846001600160a01b031682600001516001600160a01b031614612f885760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610eaa565b6001600160a01b038416612fec5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610eaa565b612ffc6000848460000151612dfa565b6001600160a01b038516600090815260066020526040812080546001929061302e9084906001600160801b0316614427565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600660205260408120805460019450909261307a918591166143ba565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526005909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556131018460016143dc565b6000818152600560205260409020549091506001600160a01b03166131905761312981612de4565b156131905760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000826131e68584613971565b14949350505050565b60408051808201909152600080825260208201528180600111158015613216575060015481105b156132bd576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215613267579392505050565b50600019016000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156132b8579392505050565b613267565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610eaa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b4760005b600c5481101561100f576133e9600a828154811061339157613391614528565b9060005260206000200160009054906101000a90046001600160a01b03166064600b84815481106133c4576133c4614528565b9060005260206000200154856133da9190614408565b6133e491906143f4565b6139e5565b806133f3816144cd565b915050613371565b60006001600160a01b0384163b156134fd57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061343f90339089908890889060040161400e565b602060405180830381600087803b15801561345957600080fd5b505af1925050508015613489575060408051601f3d908101601f1916820190925261348691810190613ec4565b60015b6134e3573d8080156134b7576040519150601f19603f3d011682016040523d82523d6000602084013e6134bc565b606091505b5080516134db5760405162461bcd60e51b8152600401610eaa906142d1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613501565b5060015b949350505050565b60608161352d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156135575780613541816144cd565b91506135509050600a836143f4565b9150613531565b6000816001600160401b038111156135715761357161453e565b6040519080825280601f01601f19166020018201604052801561359b576020820181803683370190505b5090505b8415613501576135b060018361444f565b91506135bd600a866144e8565b6135c89060306143dc565b60f81b8183815181106135dd576135dd614528565b60200101906001600160f81b031916908160001a9053506135ff600a866143f4565b945061359f565b60006001600160a01b0382166136785760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610eaa565b506001600160a01b0316600090815260066020526040902054600160801b90046001600160801b031690565b6001546001600160a01b0385166137075760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610eaa565b61371081612de4565b1561375d5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610eaa565b826137bf576002548411156137bf5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610eaa565b6001600160a01b0385166000908152600660209081526040918290208251808401845290546001600160801b038082168352600160801b909104169181019190915281518083019092528051909190819061381b9088906143ba565b6001600160801b03168152602001856138345786613837565b60005b836020015161384691906143ba565b6001600160801b039081169091526001600160a01b0380891660008181526006602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526005909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b868110156139655760405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461392960008984886133fb565b6139455760405162461bcd60e51b8152600401610eaa906142d1565b8161394f816144cd565b925050808061395d906144cd565b9150506138dc565b50600155505050505050565b600081815b84518110156139dd57600085828151811061399357613993614528565b602002602001015190508083116139b957600083815260208290526040902092506139ca565b600081815260208490526040902092505b50806139d5816144cd565b915050613976565b509392505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613a32576040519150601f19603f3d011682016040523d82523d6000602084013e613a37565b606091505b50509050806112415760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610eaa565b828054613a8790614492565b90600052602060002090601f016020900481019282613aa95760008555613aef565b82601f10613ac25782800160ff19823516178555613aef565b82800160010185558215613aef579182015b82811115613aef578235825591602001919060010190613ad4565b50611a7f929150613b6f565b828054613b0790614492565b90600052602060002090601f016020900481019282613b295760008555613aef565b82601f10613b4257805160ff1916838001178555613aef565b82800160010185558215613aef579182015b82811115613aef578251825591602001919060010190613b54565b5b80821115611a7f5760008155600101613b70565b60006001600160401b0380841115613b9e57613b9e61453e565b604051601f8501601f19908116603f01168101908282118183101715613bc657613bc661453e565b81604052809350858152868686011115613bdf57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114613c1057600080fd5b919050565b60008083601f840112613c2757600080fd5b5081356001600160401b03811115613c3e57600080fd5b6020830191508360208260051b8501011115613c5957600080fd5b9250929050565b600060208284031215613c7257600080fd5b61256182613bf9565b60008060408385031215613c8e57600080fd5b613c9783613bf9565b9150613ca560208401613bf9565b90509250929050565b600080600060608486031215613cc357600080fd5b613ccc84613bf9565b9250613cda60208501613bf9565b9150604084013590509250925092565b60008060008060808587031215613d0057600080fd5b613d0985613bf9565b9350613d1760208601613bf9565b92506040850135915060608501356001600160401b03811115613d3957600080fd5b8501601f81018713613d4a57600080fd5b613d5987823560208401613b84565b91505092959194509250565b600080600060408486031215613d7a57600080fd5b613d8384613bf9565b925060208401356001600160401b03811115613d9e57600080fd5b613daa86828701613c15565b9497909650939450505050565b60008060408385031215613dca57600080fd5b613dd383613bf9565b91506020830135613de381614554565b809150509250929050565b60008060408385031215613e0157600080fd5b613e0a83613bf9565b946020939093013593505050565b60008060008060608587031215613e2e57600080fd5b613e3785613bf9565b93506020850135925060408501356001600160401b03811115613e5957600080fd5b613e6587828801613c15565b95989497509550505050565b600060208284031215613e8357600080fd5b815161256181614554565b600060208284031215613ea057600080fd5b5035919050565b600060208284031215613eb957600080fd5b813561256181614562565b600060208284031215613ed657600080fd5b815161256181614562565b60008060208385031215613ef457600080fd5b82356001600160401b0380821115613f0b57600080fd5b818501915085601f830112613f1f57600080fd5b813581811115613f2e57600080fd5b866020828501011115613f4057600080fd5b60209290920196919550909350505050565b600060208284031215613f6457600080fd5b81356001600160401b03811115613f7a57600080fd5b8201601f81018413613f8b57600080fd5b61350184823560208401613b84565b600060208284031215613fac57600080fd5b5051919050565b60008151808452613fcb816020860160208601614466565b601f01601f19169290920160200192915050565b60008351613ff1818460208801614466565b835190830190614005818360208801614466565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061404190830184613fb3565b9695505050505050565b6020815260006125616020830184613fb3565b6020808252601a908201527f4d757374206d696e74206174206c65617374203120746f6b656e000000000000604082015260600190565b6020808252601b908201527f416c6c6f776c697374206d696e74696e6720697320636c6f7365640000000000604082015260600190565b60208082526025908201527f5075626c6963206d696e74696e67206973206e6f74206f70656e207269676874604082015264206e6f772160d81b606082015260800190565b60208082526023908201527f416c6c6f776c6973742064726f702074696d6520686173206e6f74207061737360408201526265642160e81b606082015260800190565b60208082526030908201527f57616c6c65742061646472657373206973206f76657220746865206d6178696d60408201526f756d20616c6c6f776564206d696e747360801b606082015260800190565b6020808252601c908201527f41646472657373206973206e6f7420696e20416c6c6f776c6973742100000000604082015260600190565b60208082526027908201527f56616c7565206e6565647320746f2062652065786163746c7920746865206d696040820152666e74206665652160c81b606082015260800190565b60208082526023908201527f43616e6e6f74206d696e74206f76657220737570706c7920636170206f66203560408201526203030360ec1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f4164647265737320616c726561647920636c61696d6564000000000000000000604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60208082526028908201527f56616c75652062656c6f77207265717569726564206d696e742066656520666f6040820152671c88185b5bdd5b9d60c21b606082015260800190565b6020808252602e908201527f43616e6e6f74206d696e74206d6f7265207468616e206d6178206d696e74207060408201526d32b9103a3930b739b0b1ba34b7b760911b606082015260800190565b60006001600160801b03808316818516808303821115614005576140056144fc565b600082198211156143ef576143ef6144fc565b500190565b60008261440357614403614512565b500490565b6000816000190483118215151615614422576144226144fc565b500290565b60006001600160801b0383811690831681811015614447576144476144fc565b039392505050565b600082821015614461576144616144fc565b500390565b60005b83811015614481578181015183820152602001614469565b838111156123fb5750506000910152565b600181811c908216806144a657607f821691505b602082108114156144c757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144e1576144e16144fc565b5060010190565b6000826144f7576144f7614512565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611dea57600080fd5b6001600160e01b031981168114611dea57600080fdfea2646970667358221220714ed29faa832a107702f251e68574942364e5e5bd278d61ac239e5296cda59364736f6c63430008070033697066732f6261667962656962376976666c687577337563626d69657962676c736471326c6b7868706b626d6a7a376734687a7736786e33776d726f6c3565342f
Deployed Bytecode
0x6080604052600436106104935760003560e01c8063817c0d9c11610260578063caa0f92a11610144578063e0eddd91116100c1578063ee54be9611610085578063ee54be9614610d59578063f2fde38b14610d79578063f4637a1514610d99578063f703166314610db3578063f8c0fd2014610dd3578063fd19eaf014610de857600080fd5b8063e0eddd9114610cab578063e692893314610cc1578063e6c6990a14610cd6578063e757223014610cf0578063e985e9c514610d1057600080fd5b8063d7224ba011610108578063d7224ba014610c0d578063d8d2412014610c23578063db4bec4414610c38578063df213e8a14610c68578063e0ec7c3614610c7b57600080fd5b8063caa0f92a14610b9b578063cc3a508514610bb0578063cfc86f7b14610bc3578063cff4492314610bd8578063d547cfb714610bf857600080fd5b806395d89b41116101dd578063b4835e07116101a1578063b4835e0714610afc578063b88d4fde14610b1c578063bb1876a814610b3c578063bc05748e14610b51578063c54826ab14610b66578063c87b56dd14610b7b57600080fd5b806395d89b4114610a72578063a22cb46514610a87578063ab523c6814610aa7578063afe5608b14610ac7578063b40ebceb14610adc57600080fd5b80638f4bb497116102245780638f4bb497146109ac5780638ff4013f146109c657806391b7f5ed146109e657806391c4b57414610a065780639231ab2a14610a2557600080fd5b8063817c0d9c1461092e578063853828b614610943578063891bbe73146109585780638d859f3e146109785780638da5cb5b1461098e57600080fd5b80633e3e0b121161038757806355228ca7116103045780636ba9fd38116102c85780636ba9fd38146108a75780636d3de806146108bc57806370a08231146108d1578063715018a6146108f1578063755edd171461090657806379ab3c891461091957600080fd5b806355228ca71461082257806355f804b31461083c57806358feaa591461085c5780636352211e1461087157806367dec6781461089157600080fd5b80634783f0ef1161034b5780634783f0ef1461078d5780634ab8b5dd146107ad5780634f6ccce7146107c357806354214f69146107e3578063547520fe1461080257600080fd5b80633e3e0b12146106ee57806340ccc0821461070357806342842e0e1461072357806344eed8811461074357806345c0f5331461075957600080fd5b806323b872dd116104155780632f745c59116103d95780632f745c5914610659578063330067861461067957806338b90333146106995780633c003254146106c55780633e07311c146106d857600080fd5b806323b872dd146105da57806326c8140f146105fa578063286c81371461060d5780632913daa01461062d5780632eb4a7ab1461064357600080fd5b8063095ea7b31161045c578063095ea7b31461055f5780630c863bb61461057f57806318160ddd146104985780631aa4ba67146105945780631dfcaa48146105aa57600080fd5b80629a9b7b1461049857806301ffc9a7146104c05780630644cefa146104f057806306fdde0314610505578063081812fc14610527575b600080fd5b3480156104a457600080fd5b506104ad610e08565b6040519081526020015b60405180910390f35b3480156104cc57600080fd5b506104e06104db366004613ea7565b610e1c565b60405190151581526020016104b7565b6105036104fe366004613dee565b610e89565b005b34801561051157600080fd5b5061051a611013565b6040516104b7919061404b565b34801561053357600080fd5b50610547610542366004613e8e565b6110a5565b6040516001600160a01b0390911681526020016104b7565b34801561056b57600080fd5b5061050361057a366004613dee565b61112e565b34801561058b57600080fd5b506104e0611246565b3480156105a057600080fd5b506104ad60165481565b3480156105b657600080fd5b506104e06105c5366004613c60565b601b6020526000908152604090205460ff1681565b3480156105e657600080fd5b506105036105f5366004613cae565b611268565b610503610608366004613e18565b611273565b34801561061957600080fd5b506104ad610628366004613e8e565b61143b565b34801561063957600080fd5b506104ad60025481565b34801561064f57600080fd5b506104ad60125481565b34801561066557600080fd5b506104ad610674366004613dee565b61145c565b34801561068557600080fd5b506104e0610694366004613d65565b6115d3565b3480156106a557600080fd5b506017546106b39060ff1681565b60405160ff90911681526020016104b7565b6105036106d3366004613e18565b6116a9565b3480156106e457600080fd5b506104ad600c5481565b3480156106fa57600080fd5b50610503611871565b34801561070f57600080fd5b5061050361071e366004613dee565b6118a7565b34801561072f57600080fd5b5061050361073e366004613cae565b61197f565b34801561074f57600080fd5b506104ad60145481565b34801561076557600080fd5b506104ad7f0000000000000000000000000000000000000000000000000000000000000fa081565b34801561079957600080fd5b506105036107a8366004613e8e565b61199a565b3480156107b957600080fd5b506104ad601a5481565b3480156107cf57600080fd5b506104ad6107de366004613e8e565b611a1b565b3480156107ef57600080fd5b506019546104e090610100900460ff1681565b34801561080e57600080fd5b5061050361081d366004613e8e565b611a83565b34801561082e57600080fd5b506015546104e09060ff1681565b34801561084857600080fd5b50610503610857366004613ee1565b611b03565b34801561086857600080fd5b50610503611b39565b34801561087d57600080fd5b5061054761088c366004613e8e565b611b70565b34801561089d57600080fd5b506104ad600f5481565b3480156108b357600080fd5b50610503611b82565b3480156108c857600080fd5b50610503611bbb565b3480156108dd57600080fd5b506104ad6108ec366004613c60565b611bf1565b3480156108fd57600080fd5b50610503611c82565b610503610914366004613c60565b611cb8565b34801561092557600080fd5b50610503611ded565b34801561093a57600080fd5b50610503611e26565b34801561094f57600080fd5b50610503611e5f565b34801561096457600080fd5b50610547610973366004613e8e565b611e9e565b34801561098457600080fd5b506104ad600e5481565b34801561099a57600080fd5b506000546001600160a01b0316610547565b3480156109b857600080fd5b506019546104e09060ff1681565b3480156109d257600080fd5b506105036109e1366004613e8e565b611ec8565b3480156109f257600080fd5b50610503610a01366004613e8e565b611f58565b348015610a1257600080fd5b506013546104e090610100900460ff1681565b348015610a3157600080fd5b50610a45610a40366004613e8e565b611f87565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016104b7565b348015610a7e57600080fd5b5061051a611fa4565b348015610a9357600080fd5b50610503610aa2366004613db7565b611fb3565b348015610ab357600080fd5b50610503610ac2366004613e8e565b612078565b348015610ad357600080fd5b506105036121aa565b348015610ae857600080fd5b50610503610af7366004613dee565b6121dc565b348015610b0857600080fd5b50610503610b17366004613e8e565b612401565b348015610b2857600080fd5b50610503610b37366004613cea565b612430565b348015610b4857600080fd5b50610503612463565b348015610b5d57600080fd5b50610503612499565b348015610b7257600080fd5b506105036124d4565b348015610b8757600080fd5b5061051a610b96366004613e8e565b61250a565b348015610ba757600080fd5b506104ad612568565b610503610bbe366004613e18565b612582565b348015610bcf57600080fd5b5061051a61274a565b348015610be457600080fd5b50610503610bf3366004613f52565b6127d8565b348015610c0457600080fd5b5061051a612880565b348015610c1957600080fd5b506104ad60095481565b348015610c2f57600080fd5b506104e061288f565b348015610c4457600080fd5b506104e0610c53366004613c60565b601c6020526000908152604090205460ff1681565b610503610c76366004613d65565b6128ac565b348015610c8757600080fd5b506104e0610c96366004613c60565b601d6020526000908152604090205460ff1681565b348015610cb757600080fd5b506104ad60105481565b348015610ccd57600080fd5b506105036129d9565b348015610ce257600080fd5b506013546104e09060ff1681565b348015610cfc57600080fd5b506104ad610d0b366004613e8e565b612a12565b348015610d1c57600080fd5b506104e0610d2b366004613c7b565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610d6557600080fd5b50610503610d74366004613e8e565b612b19565b348015610d8557600080fd5b50610503610d94366004613c60565b612bc8565b348015610da557600080fd5b506011546104e09060ff1681565b348015610dbf57600080fd5b50610503610dce366004613e8e565b612c60565b348015610ddf57600080fd5b50610503612d12565b348015610df457600080fd5b506104e0610e03366004613dee565b612d44565b6000610e176001546000190190565b905090565b60006001600160e01b031982166380ac58cd60e01b1480610e4d57506001600160e01b03198216635b5e139f60e01b145b80610e6857506001600160e01b0319821663780e9d6360e01b145b80610e8357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001811015610eb35760405162461bcd60e51b8152600401610eaa9061405e565b60405180910390fd5b600254811115610ed55760405162461bcd60e51b8152600401610eaa9061436c565b60195460ff1615156001148015610eef575060135460ff16155b610f0b5760405162461bcd60e51b8152600401610eaa906140cc565b610f13611246565b1515600114610f645760405162461bcd60e51b815260206004820181905260248201527f5075626c69632064726f702074696d6520686173206e6f7420706173736564216044820152606401610eaa565b610f6e8282612d44565b610f8a5760405162461bcd60e51b8152600401610eaa90614154565b7f0000000000000000000000000000000000000000000000000000000000000fa081610fb4610e08565b610fbe91906143dc565b1115610fdc5760405162461bcd60e51b8152600401610eaa90614222565b610fe581612a12565b34146110035760405162461bcd60e51b8152600401610eaa90614324565b61100f82826000612dc9565b5050565b60606003805461102290614492565b80601f016020809104026020016040519081016040528092919081815260200182805461104e90614492565b801561109b5780601f106110705761010080835404028352916020019161109b565b820191906000526020600020905b81548152906001019060200180831161107e57829003601f168201915b5050505050905090565b60006110b082612de4565b6111125760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610eaa565b506000908152600760205260409020546001600160a01b031690565b600061113982611b70565b9050806001600160a01b0316836001600160a01b031614156111a85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610eaa565b336001600160a01b03821614806111c457506111c48133610d2b565b6112365760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610eaa565b611241838383612dfa565b505050565b601354600090610100900460ff1661125e5750600190565b5060145442101590565b611241838383612e56565b336000908152601d602052604090205460ff16156112a35760405162461bcd60e51b8152600401610eaa9061429a565b60135460ff16151560011480156112c1575060195460ff1615156001145b6112dd5760405162461bcd60e51b8152600401610eaa90614095565b6112e88483836115d3565b6113045760405162461bcd60e51b8152600401610eaa906141a4565b60018310156113255760405162461bcd60e51b8152600401610eaa9061405e565b6002548311156113475760405162461bcd60e51b8152600401610eaa9061436c565b6113518484612d44565b61136d5760405162461bcd60e51b8152600401610eaa90614154565b7f0000000000000000000000000000000000000000000000000000000000000fa083611397610e08565b6113a191906143dc565b11156113bf5760405162461bcd60e51b8152600401610eaa90614222565b6113c883612a12565b34146113e65760405162461bcd60e51b8152600401610eaa90614324565b6113ee61288f565b151560011461140f5760405162461bcd60e51b8152600401610eaa90614111565b61141b84846000612dc9565b5050336000908152601d60205260409020805460ff191660011790555050565b600b818154811061144b57600080fd5b600091825260209091200154905081565b600061146783611bf1565b82106114c05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610eaa565b60006114ca610e08565b905060008060005b83811015611573576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561152457805192505b876001600160a01b0316836001600160a01b03161415611560578684141561155257509350610e8392505050565b8361155c816144cd565b9450505b508061156b816144cd565b9150506114d2565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610eaa565b6012546000906116255760405162461bcd60e51b815260206004820152601760248201527f4d65726b6c6520726f6f74206973206e6f7420736574210000000000000000006044820152606401610eaa565b6040516bffffffffffffffffffffffff19606086901b1660208201526000906034016040516020818303038152906040528051906020012090506116a08484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060125491508490506131d9565b95945050505050565b336000908152601c602052604090205460ff16156116d95760405162461bcd60e51b8152600401610eaa9061429a565b60135460ff16151560011480156116f7575060195460ff1615156001145b6117135760405162461bcd60e51b8152600401610eaa90614095565b61171e8483836115d3565b61173a5760405162461bcd60e51b8152600401610eaa906141a4565b600183101561175b5760405162461bcd60e51b8152600401610eaa9061405e565b60025483111561177d5760405162461bcd60e51b8152600401610eaa9061436c565b6117878484612d44565b6117a35760405162461bcd60e51b8152600401610eaa90614154565b7f0000000000000000000000000000000000000000000000000000000000000fa0836117cd610e08565b6117d791906143dc565b11156117f55760405162461bcd60e51b8152600401610eaa90614222565b6117fe83612a12565b341461181c5760405162461bcd60e51b8152600401610eaa90614324565b61182461288f565b15156001146118455760405162461bcd60e51b8152600401610eaa90614111565b61185184846000612dc9565b5050336000908152601c60205260409020805460ff191660011790555050565b6000546001600160a01b0316331461189b5760405162461bcd60e51b8152600401610eaa90614265565b6019805460ff19169055565b6000546001600160a01b031633146118d15760405162461bcd60e51b8152600401610eaa90614265565b600081116119215760405162461bcd60e51b815260206004820152601b60248201527f4d757374206d696e74206174206c65617374203120746f6b656e2e00000000006044820152606401610eaa565b7f0000000000000000000000000000000000000000000000000000000000000fa08161194b610e08565b61195591906143dc565b11156119735760405162461bcd60e51b8152600401610eaa90614222565b61100f82826001612dc9565b61124183838360405180602001604052806000815250612430565b6000546001600160a01b031633146119c45760405162461bcd60e51b8152600401610eaa90614265565b601254811415611a165760405162461bcd60e51b815260206004820152601e60248201527f4d65726b6c6520726f6f742077696c6c20626520756e6368616e6765642100006044820152606401610eaa565b601255565b6000611a25610e08565b8210611a7f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610eaa565b5090565b6000546001600160a01b03163314611aad5760405162461bcd60e51b8152600401610eaa90614265565b6001811015611afe5760405162461bcd60e51b815260206004820152601b60248201527f4d6178206d696e74206d757374206265206174206c65617374203100000000006044820152606401610eaa565b600255565b6000546001600160a01b03163314611b2d5760405162461bcd60e51b8152600401610eaa90614265565b61124160188383613a7b565b6000546001600160a01b03163314611b635760405162461bcd60e51b8152600401610eaa90614265565b6013805461ff0019169055565b6000611b7b826131ef565b5192915050565b6000546001600160a01b03163314611bac5760405162461bcd60e51b8152600401610eaa90614265565b6019805460ff19166001179055565b6000546001600160a01b03163314611be55760405162461bcd60e51b8152600401610eaa90614265565b6013805460ff19169055565b60006001600160a01b038216611c5d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610eaa565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6000546001600160a01b03163314611cac5760405162461bcd60e51b8152600401610eaa90614265565b611cb6600061331d565b565b7f0000000000000000000000000000000000000000000000000000000000000fa0611ce1612568565b1115611cff5760405162461bcd60e51b8152600401610eaa90614222565b60195460ff1615156001148015611d19575060135460ff16155b611d355760405162461bcd60e51b8152600401610eaa906140cc565b611d3d611246565b1515600114611d8e5760405162461bcd60e51b815260206004820181905260248201527f5075626c69632064726f702074696d6520686173206e6f7420706173736564216044820152606401610eaa565b611d99816001612d44565b611db55760405162461bcd60e51b8152600401610eaa90614154565b611dbf6001612a12565b3414611ddd5760405162461bcd60e51b8152600401610eaa906141db565b611dea8160016000612dc9565b50565b6000546001600160a01b03163314611e175760405162461bcd60e51b8152600401610eaa90614265565b6013805460ff19166001179055565b6000546001600160a01b03163314611e505760405162461bcd60e51b8152600401610eaa90614265565b6011805460ff19166001179055565b6000546001600160a01b03163314611e895760405162461bcd60e51b8152600401610eaa90614265565b60004711611e9657600080fd5b611cb661336d565b600a8181548110611eae57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314611ef25760405162461bcd60e51b8152600401610eaa90614265565b6001811015611f535760405162461bcd60e51b815260206004820152602760248201527f4d6178206d696e7473207065722077616c6c6574206d757374206265206174206044820152666c65617374203160c81b6064820152608401610eaa565b601a55565b6000546001600160a01b03163314611f825760405162461bcd60e51b8152600401610eaa90614265565b600e55565b6040805180820190915260008082526020820152610e83826131ef565b60606004805461102290614492565b6001600160a01b03821633141561200c5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610eaa565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146120a25760405162461bcd60e51b8152600401610eaa90614265565b7f0000000000000000000000000000000000000000000000000000000000000fa08111156121385760405162461bcd60e51b815260206004820152603b60248201527f43616e6e6f742073657420696e63656e7469766520746f6b656e49642063617060448201527f206c6172676572207468616e20746f74616c7920737570706c792e00000000006064820152608401610eaa565b60018110156121a55760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073657420746f6b656e49642063617020746f206c65737320746044820152723430b7103a3432903334b939ba103a37b5b2b760691b6064820152608401610eaa565b601055565b6000546001600160a01b031633146121d45760405162461bcd60e51b8152600401610eaa90614265565b61189b611bbb565b6000546001600160a01b031633146122065760405162461bcd60e51b8152600401610eaa90614265565b6000811161221357600080fd5b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a082319060240160206040518083038186803b15801561225657600080fd5b505afa15801561226a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228e9190613f9a565b10156122e85760405162461bcd60e51b815260206004820152602360248201527f436f6e747261637420646f6573206e6f74206f776e20656e6f75676820746f6b604482015262656e7360e81b6064820152608401610eaa565b60005b600c548110156123fb57816001600160a01b031663a9059cbb600a838154811061231757612317614528565b9060005260206000200160009054906101000a90046001600160a01b03166064600b858154811061234a5761234a614528565b9060005260206000200154876123609190614408565b61236a91906143f4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156123b057600080fd5b505af11580156123c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e89190613e71565b50806123f3816144cd565b9150506122eb565b50505050565b6000546001600160a01b0316331461242b5760405162461bcd60e51b8152600401610eaa90614265565b600f55565b61243b848484612e56565b612447848484846133fb565b6123fb5760405162461bcd60e51b8152600401610eaa906142d1565b6000546001600160a01b0316331461248d5760405162461bcd60e51b8152600401610eaa90614265565b6015805460ff19169055565b6000546001600160a01b031633146124c35760405162461bcd60e51b8152600401610eaa90614265565b6013805461ff001916610100179055565b6000546001600160a01b031633146124fe5760405162461bcd60e51b8152600401610eaa90614265565b6011805460ff19169055565b60606000612516612880565b905060008151116125365760405180602001604052806000815250612561565b8061254084613509565b604051602001612551929190613fdf565b6040516020818303038152906040525b9392505050565b60006125776001546000190190565b610e179060016143dc565b336000908152601b602052604090205460ff16156125b25760405162461bcd60e51b8152600401610eaa9061429a565b60135460ff16151560011480156125d0575060195460ff1615156001145b6125ec5760405162461bcd60e51b8152600401610eaa90614095565b6125f78483836115d3565b6126135760405162461bcd60e51b8152600401610eaa906141a4565b60018310156126345760405162461bcd60e51b8152600401610eaa9061405e565b6002548311156126565760405162461bcd60e51b8152600401610eaa9061436c565b6126608484612d44565b61267c5760405162461bcd60e51b8152600401610eaa90614154565b7f0000000000000000000000000000000000000000000000000000000000000fa0836126a6610e08565b6126b091906143dc565b11156126ce5760405162461bcd60e51b8152600401610eaa90614222565b6126d783612a12565b34146126f55760405162461bcd60e51b8152600401610eaa90614324565b6126fd61288f565b151560011461271e5760405162461bcd60e51b8152600401610eaa90614111565b61272a84846000612dc9565b5050336000908152601b60205260409020805460ff191660011790555050565b6018805461275790614492565b80601f016020809104026020016040519081016040528092919081815260200182805461278390614492565b80156127d05780601f106127a5576101008083540402835291602001916127d0565b820191906000526020600020905b8154815290600101906020018083116127b357829003601f168201915b505050505081565b6000546001600160a01b031633146128025760405162461bcd60e51b8152600401610eaa90614265565b601954610100900460ff161561285a5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e732061726520616c726561647920756e7665696c656400000000006044820152606401610eaa565b805161286d906018906020840190613afb565b50506019805461ff001916610100179055565b60606018805461102290614492565b60155460009060ff166128a25750600190565b5060165442101590565b60135460ff16151560011480156128ca575060195460ff1615156001145b6128e65760405162461bcd60e51b8152600401610eaa90614095565b6128f18383836115d3565b61290d5760405162461bcd60e51b8152600401610eaa906141a4565b7f0000000000000000000000000000000000000000000000000000000000000fa0612936612568565b11156129545760405162461bcd60e51b8152600401610eaa90614222565b61295f836001612d44565b61297b5760405162461bcd60e51b8152600401610eaa90614154565b6129856001612a12565b34146129a35760405162461bcd60e51b8152600401610eaa906141db565b6129ab61288f565b15156001146129cc5760405162461bcd60e51b8152600401610eaa90614111565b6112418360016000612dc9565b6000546001600160a01b03163314612a035760405162461bcd60e51b8152600401610eaa90614265565b6015805460ff19166001179055565b6000808211612a6d5760405162461bcd60e51b815260206004820152602160248201527f4d757374206265206d696e74696e67206174206c65617374203120746f6b656e6044820152601760f91b6064820152608401610eaa565b60115460ff161580612a875750601054612a85610e08565b115b15612a9a5781600e54610e839190614408565b600082612aa5610e08565b612aaf91906143dc565b90506010548111612ac85782600f546125619190614408565b6000612ad2610e08565b601054612adf919061444f565b9050600060105483612af1919061444f565b905080600e54612b019190614408565b82600f54612b0f9190614408565b6116a091906143dc565b6000546001600160a01b03163314612b435760405162461bcd60e51b8152600401610eaa90614265565b428111612bc35760405162461bcd60e51b815260206004820152604260248201527f44726f702064617465206d75737420626520696e2066757475726521204f746860448201527f6572776973652063616c6c2064697361626c655075626c696344726f7054696d606482015261652160f01b608482015260a401610eaa565b601455565b6000546001600160a01b03163314612bf25760405162461bcd60e51b8152600401610eaa90614265565b6001600160a01b038116612c575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610eaa565b611dea8161331d565b6000546001600160a01b03163314612c8a5760405162461bcd60e51b8152600401610eaa90614265565b428111612d0d5760405162461bcd60e51b815260206004820152604560248201527f44726f702064617465206d75737420626520696e2066757475726521204f746860448201527f6572776973652063616c6c2064697361626c65416c6c6f776c69737444726f7060648201526454696d652160d81b608482015260a401610eaa565b601655565b6000546001600160a01b03163314612d3c5760405162461bcd60e51b8152600401610eaa90614265565b611bac611ded565b60006001821015612da95760405162461bcd60e51b815260206004820152602960248201527f416d6f756e74206d7573742062652067726561746572207468616e206f7220656044820152687175616c20746f203160b81b6064820152608401610eaa565b601a5482612db685613606565b612dc091906143dc565b11159392505050565b611241838383604051806020016040528060008152506136a4565b600081600111158015610e835750506001541190565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612e61826131ef565b80519091506000906001600160a01b0316336001600160a01b03161480612e98575033612e8d846110a5565b6001600160a01b0316145b80612eaa57508151612eaa9033610d2b565b905080612f145760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610eaa565b846001600160a01b031682600001516001600160a01b031614612f885760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610eaa565b6001600160a01b038416612fec5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610eaa565b612ffc6000848460000151612dfa565b6001600160a01b038516600090815260066020526040812080546001929061302e9084906001600160801b0316614427565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600660205260408120805460019450909261307a918591166143ba565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526005909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556131018460016143dc565b6000818152600560205260409020549091506001600160a01b03166131905761312981612de4565b156131905760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000826131e68584613971565b14949350505050565b60408051808201909152600080825260208201528180600111158015613216575060015481105b156132bd576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215613267579392505050565b50600019016000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156132b8579392505050565b613267565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610eaa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b4760005b600c5481101561100f576133e9600a828154811061339157613391614528565b9060005260206000200160009054906101000a90046001600160a01b03166064600b84815481106133c4576133c4614528565b9060005260206000200154856133da9190614408565b6133e491906143f4565b6139e5565b806133f3816144cd565b915050613371565b60006001600160a01b0384163b156134fd57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061343f90339089908890889060040161400e565b602060405180830381600087803b15801561345957600080fd5b505af1925050508015613489575060408051601f3d908101601f1916820190925261348691810190613ec4565b60015b6134e3573d8080156134b7576040519150601f19603f3d011682016040523d82523d6000602084013e6134bc565b606091505b5080516134db5760405162461bcd60e51b8152600401610eaa906142d1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613501565b5060015b949350505050565b60608161352d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156135575780613541816144cd565b91506135509050600a836143f4565b9150613531565b6000816001600160401b038111156135715761357161453e565b6040519080825280601f01601f19166020018201604052801561359b576020820181803683370190505b5090505b8415613501576135b060018361444f565b91506135bd600a866144e8565b6135c89060306143dc565b60f81b8183815181106135dd576135dd614528565b60200101906001600160f81b031916908160001a9053506135ff600a866143f4565b945061359f565b60006001600160a01b0382166136785760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610eaa565b506001600160a01b0316600090815260066020526040902054600160801b90046001600160801b031690565b6001546001600160a01b0385166137075760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610eaa565b61371081612de4565b1561375d5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610eaa565b826137bf576002548411156137bf5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610eaa565b6001600160a01b0385166000908152600660209081526040918290208251808401845290546001600160801b038082168352600160801b909104169181019190915281518083019092528051909190819061381b9088906143ba565b6001600160801b03168152602001856138345786613837565b60005b836020015161384691906143ba565b6001600160801b039081169091526001600160a01b0380891660008181526006602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526005909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b868110156139655760405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461392960008984886133fb565b6139455760405162461bcd60e51b8152600401610eaa906142d1565b8161394f816144cd565b925050808061395d906144cd565b9150506138dc565b50600155505050505050565b600081815b84518110156139dd57600085828151811061399357613993614528565b602002602001015190508083116139b957600083815260208290526040902092506139ca565b600081815260208490526040902092505b50806139d5816144cd565b915050613976565b509392505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613a32576040519150601f19603f3d011682016040523d82523d6000602084013e613a37565b606091505b50509050806112415760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610eaa565b828054613a8790614492565b90600052602060002090601f016020900481019282613aa95760008555613aef565b82601f10613ac25782800160ff19823516178555613aef565b82800160010185558215613aef579182015b82811115613aef578235825591602001919060010190613ad4565b50611a7f929150613b6f565b828054613b0790614492565b90600052602060002090601f016020900481019282613b295760008555613aef565b82601f10613b4257805160ff1916838001178555613aef565b82800160010185558215613aef579182015b82811115613aef578251825591602001919060010190613b54565b5b80821115611a7f5760008155600101613b70565b60006001600160401b0380841115613b9e57613b9e61453e565b604051601f8501601f19908116603f01168101908282118183101715613bc657613bc661453e565b81604052809350858152868686011115613bdf57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114613c1057600080fd5b919050565b60008083601f840112613c2757600080fd5b5081356001600160401b03811115613c3e57600080fd5b6020830191508360208260051b8501011115613c5957600080fd5b9250929050565b600060208284031215613c7257600080fd5b61256182613bf9565b60008060408385031215613c8e57600080fd5b613c9783613bf9565b9150613ca560208401613bf9565b90509250929050565b600080600060608486031215613cc357600080fd5b613ccc84613bf9565b9250613cda60208501613bf9565b9150604084013590509250925092565b60008060008060808587031215613d0057600080fd5b613d0985613bf9565b9350613d1760208601613bf9565b92506040850135915060608501356001600160401b03811115613d3957600080fd5b8501601f81018713613d4a57600080fd5b613d5987823560208401613b84565b91505092959194509250565b600080600060408486031215613d7a57600080fd5b613d8384613bf9565b925060208401356001600160401b03811115613d9e57600080fd5b613daa86828701613c15565b9497909650939450505050565b60008060408385031215613dca57600080fd5b613dd383613bf9565b91506020830135613de381614554565b809150509250929050565b60008060408385031215613e0157600080fd5b613e0a83613bf9565b946020939093013593505050565b60008060008060608587031215613e2e57600080fd5b613e3785613bf9565b93506020850135925060408501356001600160401b03811115613e5957600080fd5b613e6587828801613c15565b95989497509550505050565b600060208284031215613e8357600080fd5b815161256181614554565b600060208284031215613ea057600080fd5b5035919050565b600060208284031215613eb957600080fd5b813561256181614562565b600060208284031215613ed657600080fd5b815161256181614562565b60008060208385031215613ef457600080fd5b82356001600160401b0380821115613f0b57600080fd5b818501915085601f830112613f1f57600080fd5b813581811115613f2e57600080fd5b866020828501011115613f4057600080fd5b60209290920196919550909350505050565b600060208284031215613f6457600080fd5b81356001600160401b03811115613f7a57600080fd5b8201601f81018413613f8b57600080fd5b61350184823560208401613b84565b600060208284031215613fac57600080fd5b5051919050565b60008151808452613fcb816020860160208601614466565b601f01601f19169290920160200192915050565b60008351613ff1818460208801614466565b835190830190614005818360208801614466565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061404190830184613fb3565b9695505050505050565b6020815260006125616020830184613fb3565b6020808252601a908201527f4d757374206d696e74206174206c65617374203120746f6b656e000000000000604082015260600190565b6020808252601b908201527f416c6c6f776c697374206d696e74696e6720697320636c6f7365640000000000604082015260600190565b60208082526025908201527f5075626c6963206d696e74696e67206973206e6f74206f70656e207269676874604082015264206e6f772160d81b606082015260800190565b60208082526023908201527f416c6c6f776c6973742064726f702074696d6520686173206e6f74207061737360408201526265642160e81b606082015260800190565b60208082526030908201527f57616c6c65742061646472657373206973206f76657220746865206d6178696d60408201526f756d20616c6c6f776564206d696e747360801b606082015260800190565b6020808252601c908201527f41646472657373206973206e6f7420696e20416c6c6f776c6973742100000000604082015260600190565b60208082526027908201527f56616c7565206e6565647320746f2062652065786163746c7920746865206d696040820152666e74206665652160c81b606082015260800190565b60208082526023908201527f43616e6e6f74206d696e74206f76657220737570706c7920636170206f66203560408201526203030360ec1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f4164647265737320616c726561647920636c61696d6564000000000000000000604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60208082526028908201527f56616c75652062656c6f77207265717569726564206d696e742066656520666f6040820152671c88185b5bdd5b9d60c21b606082015260800190565b6020808252602e908201527f43616e6e6f74206d696e74206d6f7265207468616e206d6178206d696e74207060408201526d32b9103a3930b739b0b1ba34b7b760911b606082015260800190565b60006001600160801b03808316818516808303821115614005576140056144fc565b600082198211156143ef576143ef6144fc565b500190565b60008261440357614403614512565b500490565b6000816000190483118215151615614422576144226144fc565b500290565b60006001600160801b0383811690831681811015614447576144476144fc565b039392505050565b600082821015614461576144616144fc565b500390565b60005b83811015614481578181015183820152602001614469565b838111156123fb5750506000910152565b600181811c908216806144a657607f821691505b602082108114156144c757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144e1576144e16144fc565b5060010190565b6000826144f7576144f7614512565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611dea57600080fd5b6001600160e01b031981168114611dea57600080fdfea2646970667358221220714ed29faa832a107702f251e68574942364e5e5bd278d61ac239e5296cda59364736f6c63430008070033
Deployed Bytecode Sourcemap
65743:111:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34346:90;;;;;;;;;;;;;:::i;:::-;;;9203:25:1;;;9191:2;9176:18;34346:90:0;;;;;;;;36098:370;;;;;;;;;;-1:-1:-1;36098:370:0;;;;;:::i;:::-;;:::i;:::-;;;9030:14:1;;9023:22;9005:41;;8993:2;8978:18;36098:370:0;8865:187:1;58254:767:0;;;;;;:::i;:::-;;:::i;:::-;;38163:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39578:204::-;;;;;;;;;;-1:-1:-1;39578:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8049:32:1;;;8031:51;;8019:2;8004:18;39578:204:0;7885:203:1;39141:379:0;;;;;;;;;;-1:-1:-1;39141:379:0;;;;;:::i;:::-;;:::i;50230:180::-;;;;;;;;;;;;;:::i;50523:45::-;;;;;;;;;;;;;;;;56517:41;;;;;;;;;;-1:-1:-1;56517:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40428:142;;;;;;;;;;-1:-1:-1;40428:142:0;;;;;:::i;:::-;;:::i;62364:1003::-;;;;;;:::i;:::-;;:::i;51696:36::-;;;;;;;;;;-1:-1:-1;51696:36:0;;;;;:::i;:::-;;:::i;32678:27::-;;;;;;;;;;;;;;;;30556:94;;;;;;;;;;;;;;;;35290:744;;;;;;;;;;-1:-1:-1;35290:744:0;;;;;:::i;:::-;;:::i;31277:287::-;;;;;;;;;;-1:-1:-1;31277:287:0;;;;;:::i;:::-;;:::i;56246:33::-;;;;;;;;;;-1:-1:-1;56246:33:0;;;;;;;;;;;28026:4:1;28014:17;;;27996:36;;27984:2;27969:18;56246:33:0;27854:184:1;61351:1005:0;;;;;;:::i;:::-;;:::i;51737:38::-;;;;;;;;;;;;;;;;59114:78;;;;;;;;;;;;;:::i;56968:274::-;;;;;;;;;;-1:-1:-1;56968:274:0;;;;;:::i;:::-;;:::i;40633:157::-;;;;;;;;;;-1:-1:-1;40633:157:0;;;;;:::i;:::-;;:::i;49456:42::-;;;;;;;;;;;;;;;;32634:39;;;;;;;;;;;;;;;30863:191;;;;;;;;;;-1:-1:-1;30863:191:0;;;;;:::i;:::-;;:::i;56472:36::-;;;;;;;;;;;;;;;;34822:177;;;;;;;;;;-1:-1:-1;34822:177:0;;;;;:::i;:::-;;:::i;56429:30::-;;;;;;;;;;-1:-1:-1;56429:30:0;;;;;;;;;;;64760:173;;;;;;;;;;-1:-1:-1;64760:173:0;;;;;:::i;:::-;;:::i;50475:43::-;;;;;;;;;;-1:-1:-1;50475:43:0;;;;;;;;65388:100;;;;;;;;;;-1:-1:-1;65388:100:0;;;;;:::i;:::-;;:::i;49999:92::-;;;;;;;;;;;;;:::i;37986:118::-;;;;;;;;;;-1:-1:-1;37986:118:0;;;;;:::i;:::-;;:::i;53428:45::-;;;;;;;;;;;;;;;;59029:77;;;;;;;;;;;;;:::i;31679:97::-;;;;;;;;;;;;;:::i;36524:211::-;;;;;;;;;;-1:-1:-1;36524:211:0;;;;;:::i;:::-;;:::i;27034:103::-;;;;;;;;;;;;;:::i;57461:566::-;;;;;;:::i;:::-;;:::i;31578:93::-;;;;;;;;;;;;;:::i;53573:96::-;;;;;;;;;;;;;:::i;51782:112::-;;;;;;;;;;;;;:::i;51611:80::-;;;;;;;;;;-1:-1:-1;51611:80:0;;;;;:::i;:::-;;:::i;53390:33::-;;;;;;;;;;;;;;;;26385:87;;;;;;;;;;-1:-1:-1;26431:7:0;26458:6;-1:-1:-1;;;;;26458:6:0;26385:87;;56392:30;;;;;;;;;;-1:-1:-1;56392:30:0;;;;;;;;64390:194;;;;;;;;;;-1:-1:-1;64390:194:0;;;;;:::i;:::-;;:::i;54638:84::-;;;;;;;;;;-1:-1:-1;54638:84:0;;;;;:::i;:::-;;:::i;49411:40::-;;;;;;;;;;-1:-1:-1;49411:40:0;;;;;;;;;;;65494:128;;;;;;;;;;-1:-1:-1;65494:128:0;;;;;:::i;:::-;;:::i;:::-;;;;27537:13:1;;-1:-1:-1;;;;;27533:39:1;27515:58;;27633:4;27621:17;;;27615:24;-1:-1:-1;;;;;27611:49:1;27589:20;;;27582:79;;;;27488:18;65494:128:0;27305:362:1;38318:98:0;;;;;;;;;;;;;:::i;39846:274::-;;;;;;;;;;-1:-1:-1;39846:274:0;;;;;:::i;:::-;;:::i;53942:323::-;;;;;;;;;;-1:-1:-1;53942:323:0;;;;;:::i;:::-;;:::i;63672:122::-;;;;;;;;;;;;;:::i;52738:422::-;;;;;;;;;;-1:-1:-1;52738:422:0;;;;;:::i;:::-;;:::i;54389:109::-;;;;;;;;;;-1:-1:-1;54389:109:0;;;;;:::i;:::-;;:::i;40853:311::-;;;;;;;;;;-1:-1:-1;40853:311:0;;;;;:::i;:::-;;:::i;51085:98::-;;;;;;;;;;;;;:::i;49906:87::-;;;;;;;;;;;;;:::i;53675:98::-;;;;;;;;;;;;;:::i;38479:288::-;;;;;;;;;;-1:-1:-1;38479:288:0;;;;;:::i;:::-;;:::i;34442:96::-;;;;;;;;;;;;;:::i;60352:991::-;;;;;;:::i;:::-;;:::i;56286:97::-;;;;;;;;;;;;;:::i;64951:214::-;;;;;;;;;;-1:-1:-1;64951:214:0;;;;;:::i;:::-;;:::i;65290:92::-;;;;;;;;;;;;;:::i;45461:43::-;;;;;;;;;;;;;;;;51189:191;;;;;;;;;;;;;:::i;56565:48::-;;;;;;;;;;-1:-1:-1;56565:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59439:672;;;;;;:::i;:::-;;:::i;56620:47::-;;;;;;;;;;-1:-1:-1;56620:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;53478:41;;;;;;;;;;;;;;;;50986:93;;;;;;;;;;;;;:::i;30657:36::-;;;;;;;;;;-1:-1:-1;30657:36:0;;;;;;;;54728:1207;;;;;;;;;;-1:-1:-1;54728:1207:0;;;;;:::i;:::-;;:::i;40183:186::-;;;;;;;;;;-1:-1:-1;40183:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;40328:25:0;;;40305:4;40328:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40183:186;49676:224;;;;;;;;;;-1:-1:-1;49676:224:0;;;;;:::i;:::-;;:::i;27290:201::-;;;;;;;;;;-1:-1:-1;27290:201:0;;;;;:::i;:::-;;:::i;53524:42::-;;;;;;;;;;-1:-1:-1;53524:42:0;;;;;;;;50747:233;;;;;;;;;;-1:-1:-1;50747:233:0;;;;;:::i;:::-;;:::i;63460:119::-;;;;;;;;;;;;;:::i;63955:242::-;;;;;;;;;;-1:-1:-1;63955:242:0;;;;;:::i;:::-;;:::i;34346:90::-;34393:7;34416:14;34169:1;34710:12;-1:-1:-1;;34710:30:0;;34621:132;34416:14;34409:21;;34346:90;:::o;36098:370::-;36225:4;-1:-1:-1;;;;;;36255:40:0;;-1:-1:-1;;;36255:40:0;;:99;;-1:-1:-1;;;;;;;36306:48:0;;-1:-1:-1;;;36306:48:0;36255:99;:160;;;-1:-1:-1;;;;;;;36365:50:0;;-1:-1:-1;;;36365:50:0;36255:160;:207;;;-1:-1:-1;;;;;;;;;;12879:40:0;;;36426:36;36241:221;36098:370;-1:-1:-1;;36098:370:0:o;58254:767::-;58353:1;58342:7;:12;;58334:51;;;;-1:-1:-1;;;58334:51:0;;;;;;;:::i;:::-;;;;;;;;;58415:12;;58404:7;:23;;58396:82;;;;-1:-1:-1;;;58396:82:0;;;;;;;:::i;:::-;58497:11;;;;:19;;:11;:19;:49;;;;-1:-1:-1;58520:17:0;;;;:26;58497:49;58489:99;;;;-1:-1:-1;;;58489:99:0;;;;;;;:::i;:::-;58607:22;:20;:22::i;:::-;:30;;58633:4;58607:30;58599:75;;;;-1:-1:-1;;;58599:75:0;;21158:2:1;58599:75:0;;;21140:21:1;;;21177:18;;;21170:30;21236:34;21216:18;;;21209:62;21288:18;;58599:75:0;20956:356:1;58599:75:0;58693:27;58707:3;58712:7;58693:13;:27::i;:::-;58685:88;;;;-1:-1:-1;;;58685:88:0;;;;;;;:::i;:::-;58822:14;58811:7;58792:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;58784:92;;;;-1:-1:-1;;;58784:92:0;;;;;;;:::i;:::-;58908:17;58917:7;58908:8;:17::i;:::-;58895:9;:30;58887:83;;;;-1:-1:-1;;;58887:83:0;;;;;;;:::i;:::-;58983:30;58993:3;58998:7;59007:5;58983:9;:30::i;:::-;58254:767;;:::o;38163:94::-;38217:13;38246:5;38239:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38163:94;:::o;39578:204::-;39646:7;39670:16;39678:7;39670;:16::i;:::-;39662:74;;;;-1:-1:-1;;;39662:74:0;;26288:2:1;39662:74:0;;;26270:21:1;26327:2;26307:18;;;26300:30;26366:34;26346:18;;;26339:62;-1:-1:-1;;;26417:18:1;;;26410:43;26470:19;;39662:74:0;26086:409:1;39662:74:0;-1:-1:-1;39752:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;39752:24:0;;39578:204::o;39141:379::-;39210:13;39226:24;39242:7;39226:15;:24::i;:::-;39210:40;;39271:5;-1:-1:-1;;;;;39265:11:0;:2;-1:-1:-1;;;;;39265:11:0;;;39257:58;;;;-1:-1:-1;;;39257:58:0;;21519:2:1;39257:58:0;;;21501:21:1;21558:2;21538:18;;;21531:30;21597:34;21577:18;;;21570:62;-1:-1:-1;;;21648:18:1;;;21641:32;21690:19;;39257:58:0;21317:398:1;39257:58:0;25191:10;-1:-1:-1;;;;;39340:21:0;;;;:62;;-1:-1:-1;39365:37:0;39382:5;25191:10;40183:186;:::i;39365:37::-;39324:153;;;;-1:-1:-1;;;39324:153:0;;17594:2:1;39324:153:0;;;17576:21:1;17633:2;17613:18;;;17606:30;17672:34;17652:18;;;17645:62;17743:27;17723:18;;;17716:55;17788:19;;39324:153:0;17392:421:1;39324:153:0;39486:28;39495:2;39499:7;39508:5;39486:8;:28::i;:::-;39203:317;39141:379;;:::o;50230:180::-;50298:21;;50282:4;;50298:21;;;;;50295:63;;-1:-1:-1;50346:4:0;;50230:180::o;50295:63::-;-1:-1:-1;50390:14:0;;50371:15;:33;;;50230:180::o;40428:142::-;40536:28;40546:4;40552:2;40556:7;40536:9;:28::i;62364:1003::-;62504:10;62488:27;;;;:15;:27;;;;;;;;62487:28;62479:64;;;;-1:-1:-1;;;62479:64:0;;;;;;;:::i;:::-;62562:17;;;;:25;;:17;:25;:48;;;;-1:-1:-1;62591:11:0;;;;:19;;:11;:19;62562:48;62554:88;;;;-1:-1:-1;;;62554:88:0;;;;;;;:::i;:::-;62661:32;62675:3;62680:12;;62661:13;:32::i;:::-;62653:73;;;;-1:-1:-1;;;62653:73:0;;;;;;;:::i;:::-;62756:1;62745:7;:12;;62737:51;;;;-1:-1:-1;;;62737:51:0;;;;;;;:::i;:::-;62818:12;;62807:7;:23;;62799:82;;;;-1:-1:-1;;;62799:82:0;;;;;;;:::i;:::-;62902:27;62916:3;62921:7;62902:13;:27::i;:::-;62894:88;;;;-1:-1:-1;;;62894:88:0;;;;;;;:::i;:::-;63031:14;63020:7;63001:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;62993:92;;;;-1:-1:-1;;;62993:92:0;;;;;;;:::i;:::-;63117:17;63126:7;63117:8;:17::i;:::-;63104:9;:30;63096:83;;;;-1:-1:-1;;;63096:83:0;;;;;;;:::i;:::-;63198:25;:23;:25::i;:::-;:33;;63227:4;63198:33;63190:81;;;;-1:-1:-1;;;63190:81:0;;;;;;;:::i;:::-;63284:30;63294:3;63299:7;63308:5;63284:9;:30::i;:::-;-1:-1:-1;;63341:10:0;63325:27;;;;:15;:27;;;;;:34;;-1:-1:-1;;63325:34:0;63355:4;63325:34;;;-1:-1:-1;;62364:1003:0:o;51696:36::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51696:36:0;:::o;35290:744::-;35399:7;35434:16;35444:5;35434:9;:16::i;:::-;35426:5;:24;35418:71;;;;-1:-1:-1;;;35418:71:0;;9665:2:1;35418:71:0;;;9647:21:1;9704:2;9684:18;;;9677:30;9743:34;9723:18;;;9716:62;-1:-1:-1;;;9794:18:1;;;9787:32;9836:19;;35418:71:0;9463:398:1;35418:71:0;35496:22;35521:13;:11;:13::i;:::-;35496:38;;35541:19;35571:25;35621:9;35616:350;35640:14;35636:1;:18;35616:350;;;35670:31;35704:14;;;:11;:14;;;;;;;;;35670:48;;;;;;;;;-1:-1:-1;;;;;35670:48:0;;;;;-1:-1:-1;;;35670:48:0;;;-1:-1:-1;;;;;35670:48:0;;;;;;;;35731:28;35727:89;;35792:14;;;-1:-1:-1;35727:89:0;35849:5;-1:-1:-1;;;;;35828:26:0;:17;-1:-1:-1;;;;;35828:26:0;;35824:135;;;35886:5;35871:11;:20;35867:59;;;-1:-1:-1;35913:1:0;-1:-1:-1;35906:8:0;;-1:-1:-1;;;35906:8:0;35867:59;35936:13;;;;:::i;:::-;;;;35824:135;-1:-1:-1;35656:3:0;;;;:::i;:::-;;;;35616:350;;;-1:-1:-1;35972:56:0;;-1:-1:-1;;;35972:56:0;;25047:2:1;35972:56:0;;;25029:21:1;25086:2;25066:18;;;25059:30;25125:34;25105:18;;;25098:62;-1:-1:-1;;;25176:18:1;;;25169:44;25230:19;;35972:56:0;24845:410:1;31277:287:0;31389:10;;31366:4;;31381:51;;;;-1:-1:-1;;;31381:51:0;;10424:2:1;31381:51:0;;;10406:21:1;10463:2;10443:18;;;10436:30;10502:25;10482:18;;;10475:53;10545:18;;31381:51:0;10222:347:1;31381:51:0;31466:21;;-1:-1:-1;;7115:2:1;7111:15;;;7107:53;31466:21:0;;;7095:66:1;31441:12:0;;7177::1;;31466:21:0;;;;;;;;;;;;31456:32;;;;;;31441:47;;31506:50;31525:12;;31506:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31539:10:0;;;-1:-1:-1;31551:4:0;;-1:-1:-1;31506:18:0;:50::i;:::-;31499:57;31277:287;-1:-1:-1;;;;;31277:287:0:o;61351:1005::-;61492:10;61475:28;;;;:16;:28;;;;;;;;61474:29;61466:65;;;;-1:-1:-1;;;61466:65:0;;;;;;;:::i;:::-;61550:17;;;;:25;;:17;:25;:48;;;;-1:-1:-1;61579:11:0;;;;:19;;:11;:19;61550:48;61542:88;;;;-1:-1:-1;;;61542:88:0;;;;;;;:::i;:::-;61649:32;61663:3;61668:12;;61649:13;:32::i;:::-;61641:73;;;;-1:-1:-1;;;61641:73:0;;;;;;;:::i;:::-;61744:1;61733:7;:12;;61725:51;;;;-1:-1:-1;;;61725:51:0;;;;;;;:::i;:::-;61806:12;;61795:7;:23;;61787:82;;;;-1:-1:-1;;;61787:82:0;;;;;;;:::i;:::-;61890:27;61904:3;61909:7;61890:13;:27::i;:::-;61882:88;;;;-1:-1:-1;;;61882:88:0;;;;;;;:::i;:::-;62019:14;62008:7;61989:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;61981:92;;;;-1:-1:-1;;;61981:92:0;;;;;;;:::i;:::-;62105:17;62114:7;62105:8;:17::i;:::-;62092:9;:30;62084:83;;;;-1:-1:-1;;;62084:83:0;;;;;;;:::i;:::-;62186:25;:23;:25::i;:::-;:33;;62215:4;62186:33;62178:81;;;;-1:-1:-1;;;62178:81:0;;;;;;;:::i;:::-;62272:30;62282:3;62287:7;62296:5;62272:9;:30::i;:::-;-1:-1:-1;;62330:10:0;62313:28;;;;:16;:28;;;;;:35;;-1:-1:-1;;62313:35:0;62344:4;62313:35;;;-1:-1:-1;;61351:1005:0:o;59114:78::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;59165:11:::1;:19:::0;;-1:-1:-1;;59165:19:0::1;::::0;;59114:78::o;56968:274::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;57061:1:::1;57054:4;:8;57046:48;;;::::0;-1:-1:-1;;;57046:48:0;;13536:2:1;57046:48:0::1;::::0;::::1;13518:21:1::0;13575:2;13555:18;;;13548:30;13614:29;13594:18;;;13587:57;13661:18;;57046:48:0::1;13334:351:1::0;57046:48:0::1;57141:14;57133:4;57114:16;:14;:16::i;:::-;:23;;;;:::i;:::-;:41;;57106:89;;;;-1:-1:-1::0;;;57106:89:0::1;;;;;;;:::i;:::-;57207:26;57217:3;57222:4;57228;57207:9;:26::i;40633:157::-:0;40745:39;40762:4;40768:2;40772:7;40745:39;;;;;;;;;;;;:16;:39::i;30863:191::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;30965:10:::1;;30947:14;:28;;30939:71;;;::::0;-1:-1:-1;;;30939:71:0;;12773:2:1;30939:71:0::1;::::0;::::1;12755:21:1::0;12812:2;12792:18;;;12785:30;12851:32;12831:18;;;12824:60;12901:18;;30939:71:0::1;12571:354:1::0;30939:71:0::1;31019:10;:27:::0;30863:191::o;34822:177::-;34889:7;34921:13;:11;:13::i;:::-;34913:5;:21;34905:69;;;;-1:-1:-1;;;34905:69:0;;13132:2:1;34905:69:0;;;13114:21:1;13171:2;13151:18;;;13144:30;13210:34;13190:18;;;13183:62;-1:-1:-1;;;13261:18:1;;;13254:33;13304:19;;34905:69:0;12930:399:1;34905:69:0;-1:-1:-1;34988:5:0;34822:177::o;64760:173::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;64853:1:::1;64838:11;:16;;64830:56;;;::::0;-1:-1:-1;;;64830:56:0;;10068:2:1;64830:56:0::1;::::0;::::1;10050:21:1::0;10107:2;10087:18;;;10080:30;10146:29;10126:18;;;10119:57;10193:18;;64830:56:0::1;9866:351:1::0;64830:56:0::1;64898:12;:26:::0;64760:173::o;65388:100::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;65459:23:::1;:13;65475:7:::0;;65459:23:::1;:::i;49999:92::-:0;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;50056:21:::1;:29:::0;;-1:-1:-1;;50056:29:0::1;::::0;;49999:92::o;37986:118::-;38050:7;38073:20;38085:7;38073:11;:20::i;:::-;:25;;37986:118;-1:-1:-1;;37986:118:0:o;59029:77::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;59080:11:::1;:18:::0;;-1:-1:-1;;59080:18:0::1;59094:4;59080:18;::::0;;59029:77::o;31679:97::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;31743:17:::1;:25:::0;;-1:-1:-1;;31743:25:0::1;::::0;;31679:97::o;36524:211::-;36588:7;-1:-1:-1;;;;;36612:19:0;;36604:75;;;;-1:-1:-1;;;36604:75:0;;18424:2:1;36604:75:0;;;18406:21:1;18463:2;18443:18;;;18436:30;18502:34;18482:18;;;18475:62;-1:-1:-1;;;18553:18:1;;;18546:41;18604:19;;36604:75:0;18222:407:1;36604:75:0;-1:-1:-1;;;;;;36701:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;36701:27:0;;36524:211::o;27034:103::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;27099:30:::1;27126:1;27099:18;:30::i;:::-;27034:103::o:0;57461:566::-;57544:14;57524:16;:14;:16::i;:::-;:34;;57516:82;;;;-1:-1:-1;;;57516:82:0;;;;;;;:::i;:::-;57617:11;;;;:19;;:11;:19;:49;;;;-1:-1:-1;57640:17:0;;;;:26;57617:49;57609:99;;;;-1:-1:-1;;;57609:99:0;;;;;;;:::i;:::-;57727:22;:20;:22::i;:::-;:30;;57753:4;57727:30;57719:75;;;;-1:-1:-1;;;57719:75:0;;21158:2:1;57719:75:0;;;21140:21:1;;;21177:18;;;21170:30;21236:34;21216:18;;;21209:62;21288:18;;57719:75:0;20956:356:1;57719:75:0;57813:21;57827:3;57832:1;57813:13;:21::i;:::-;57805:82;;;;-1:-1:-1;;;57805:82:0;;;;;;;:::i;:::-;57919:11;57928:1;57919:8;:11::i;:::-;57906:9;:24;57898:76;;;;-1:-1:-1;;;57898:76:0;;;;;;;:::i;:::-;57995:24;58005:3;58010:1;58013:5;57995:9;:24::i;:::-;57461:566;:::o;31578:93::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;31639:17:::1;:24:::0;;-1:-1:-1;;31639:24:0::1;31659:4;31639:24;::::0;;31578:93::o;53573:96::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;53633:23:::1;:30:::0;;-1:-1:-1;;53633:30:0::1;53659:4;53633:30;::::0;;53573:96::o;51782:112::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;51863:1:::1;51839:21;:25;51831:34;;;::::0;::::1;;51874:14;:12;:14::i;51611:80::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51611:80:0;;-1:-1:-1;51611:80:0;:::o;64390:194::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;64488:1:::1;64471:13;:18;;64463:70;;;::::0;-1:-1:-1;;;64463:70:0;;13892:2:1;64463:70:0::1;::::0;::::1;13874:21:1::0;13931:2;13911:18;;;13904:30;13970:34;13950:18;;;13943:62;-1:-1:-1;;;14021:18:1;;;14014:37;14068:19;;64463:70:0::1;13690:403:1::0;64463:70:0::1;64544:16;:32:::0;64390:194::o;54638:84::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;54699:5:::1;:17:::0;54638:84::o;65494:128::-;-1:-1:-1;;;;;;;;;;;;;;;;;65596:20:0;65608:7;65596:11;:20::i;38318:98::-;38374:13;38403:7;38396:14;;;;;:::i;39846:274::-;-1:-1:-1;;;;;39937:24:0;;25191:10;39937:24;;39929:63;;;;-1:-1:-1;;;39929:63:0;;20384:2:1;39929:63:0;;;20366:21:1;20423:2;20403:18;;;20396:30;20462:28;20442:18;;;20435:56;20508:18;;39929:63:0;20182:350:1;39929:63:0;25191:10;40001:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;40001:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;40001:53:0;;;;;;;;;;40066:48;;9005:41:1;;;40001:42:0;;25191:10;40066:48;;8978:18:1;40066:48:0;;;;;;;39846:274;;:::o;53942:323::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;54048:14:::1;54030;:32;;54022:104;;;::::0;-1:-1:-1;;;54022:104:0;;19243:2:1;54022:104:0::1;::::0;::::1;19225:21:1::0;19282:2;19262:18;;;19255:30;19321:34;19301:18;;;19294:62;19392:29;19372:18;;;19365:57;19439:19;;54022:104:0::1;19041:423:1::0;54022:104:0::1;54159:1;54141:14;:19;;54133:83;;;::::0;-1:-1:-1;;;54133:83:0;;23045:2:1;54133:83:0::1;::::0;::::1;23027:21:1::0;23084:2;23064:18;;;23057:30;23123:34;23103:18;;;23096:62;-1:-1:-1;;;23174:18:1;;;23167:49;23233:19;;54133:83:0::1;22843:415:1::0;54133:83:0::1;54223:19;:36:::0;53942:323::o;63672:122::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;63730:26:::1;:24;:26::i;52738:422::-:0;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;52847:1:::1;52837:7;:11;52829:20;;;::::0;::::1;;52916:38;::::0;-1:-1:-1;;;52916:38:0;;52948:4:::1;52916:38;::::0;::::1;8031:51:1::0;52886:14:0;;52958:7;;-1:-1:-1;;;;;52916:23:0;::::1;::::0;::::1;::::0;8004:18:1;;52916:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;52908:97;;;::::0;-1:-1:-1;;;52908:97:0;;11251:2:1;52908:97:0::1;::::0;::::1;11233:21:1::0;11290:2;11270:18;;;11263:30;11329:34;11309:18;;;11302:62;-1:-1:-1;;;11380:18:1;;;11373:33;11423:19;;52908:97:0::1;11049:399:1::0;52908:97:0::1;53018:6;53014:141;53032:19;;53028:1;:23;53014:141;;;53070:13;-1:-1:-1::0;;;;;53070:22:0::1;;53093:16;53110:1;53093:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53093:19:0::1;53143:3;53125:11;53137:1;53125:14;;;;;;;;:::i;:::-;;;;;;;;;53115:7;:24;;;;:::i;:::-;53114:32;;;;:::i;:::-;53070:77;::::0;-1:-1:-1;;;;;;53070:77:0::1;::::0;;;;;;-1:-1:-1;;;;;8778:32:1;;;53070:77:0::1;::::0;::::1;8760:51:1::0;8827:18;;;8820:34;8733:18;;53070:77:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;53053:3:0;::::1;::::0;::::1;:::i;:::-;;;;53014:141;;;;52822:338;52738:422:::0;;:::o;54389:109::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;54464:16:::1;:28:::0;54389:109::o;40853:311::-;40990:28;41000:4;41006:2;41010:7;40990:9;:28::i;:::-;41041:48;41064:4;41070:2;41074:7;41083:5;41041:22;:48::i;:::-;41025:133;;;;-1:-1:-1;;;41025:133:0;;;;;;;:::i;51085:98::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;51145:24:::1;:32:::0;;-1:-1:-1;;51145:32:0::1;::::0;;51085:98::o;49906:87::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;49959:21:::1;:28:::0;;-1:-1:-1;;49959:28:0::1;;;::::0;;49906:87::o;53675:98::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;53736:23:::1;:31:::0;;-1:-1:-1;;53736:31:0::1;::::0;;53675:98::o;38479:288::-;38577:13;38602:21;38626:10;:8;:10::i;:::-;38602:34;;38681:1;38663:7;38657:21;:25;:104;;;;;;;;;;;;;;;;;38718:7;38727:18;:7;:16;:18::i;:::-;38701:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38657:104;38643:118;38479:288;-1:-1:-1;;;38479:288:0:o;34442:96::-;34489:7;34514:14;34169:1;34710:12;-1:-1:-1;;34710:30:0;;34621:132;34514:14;:18;;34531:1;34514:18;:::i;60352:991::-;60486:10;60476:21;;;;:9;:21;;;;;;;;60475:22;60467:58;;;;-1:-1:-1;;;60467:58:0;;;;;;;:::i;:::-;60544:17;;;;:25;;:17;:25;:48;;;;-1:-1:-1;60573:11:0;;;;:19;;:11;:19;60544:48;60536:88;;;;-1:-1:-1;;;60536:88:0;;;;;;;:::i;:::-;60643:32;60657:3;60662:12;;60643:13;:32::i;:::-;60635:73;;;;-1:-1:-1;;;60635:73:0;;;;;;;:::i;:::-;60738:1;60727:7;:12;;60719:51;;;;-1:-1:-1;;;60719:51:0;;;;;;;:::i;:::-;60800:12;;60789:7;:23;;60781:82;;;;-1:-1:-1;;;60781:82:0;;;;;;;:::i;:::-;60884:27;60898:3;60903:7;60884:13;:27::i;:::-;60876:88;;;;-1:-1:-1;;;60876:88:0;;;;;;;:::i;:::-;61013:14;61002:7;60983:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;60975:92;;;;-1:-1:-1;;;60975:92:0;;;;;;;:::i;:::-;61099:17;61108:7;61099:8;:17::i;:::-;61086:9;:30;61078:83;;;;-1:-1:-1;;;61078:83:0;;;;;;;:::i;:::-;61180:25;:23;:25::i;:::-;:33;;61209:4;61180:33;61172:81;;;;-1:-1:-1;;;61172:81:0;;;;;;;:::i;:::-;61266:30;61276:3;61281:7;61290:5;61266:9;:30::i;:::-;-1:-1:-1;;61317:10:0;61307:21;;;;:9;:21;;;;;:28;;-1:-1:-1;;61307:28:0;61331:4;61307:28;;;-1:-1:-1;;60352:991:0:o;56286:97::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64951:214::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;65035:10:::1;::::0;::::1;::::0;::::1;;;:19;65027:59;;;::::0;-1:-1:-1;;;65027:59:0;;24691:2:1;65027:59:0::1;::::0;::::1;24673:21:1::0;24730:2;24710:18;;;24703:30;24769:29;24749:18;;;24742:57;24816:18;;65027:59:0::1;24489:351:1::0;65027:59:0::1;65097:32:::0;;::::1;::::0;:13:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;65140:10:0::1;:17:::0;;-1:-1:-1;;65140:17:0::1;;;::::0;;64951:214::o;65290:92::-;65334:13;65363;65356:20;;;;;:::i;51189:191::-;51260:24;;51244:4;;51260:24;;51257:66;;-1:-1:-1;51311:4:0;;51189:191::o;51257:66::-;-1:-1:-1;51357:17:0;;51338:15;:36;;;51189:191::o;59439:672::-;59537:17;;;;:25;;:17;:25;:48;;;;-1:-1:-1;59566:11:0;;;;:19;;:11;:19;59537:48;59529:88;;;;-1:-1:-1;;;59529:88:0;;;;;;;:::i;:::-;59636:32;59650:3;59655:12;;59636:13;:32::i;:::-;59628:73;;;;-1:-1:-1;;;59628:73:0;;;;;;;:::i;:::-;59740:14;59720:16;:14;:16::i;:::-;:34;;59712:82;;;;-1:-1:-1;;;59712:82:0;;;;;;;:::i;:::-;59813:21;59827:3;59832:1;59813:13;:21::i;:::-;59805:82;;;;-1:-1:-1;;;59805:82:0;;;;;;;:::i;:::-;59919:11;59928:1;59919:8;:11::i;:::-;59906:9;:24;59898:76;;;;-1:-1:-1;;;59898:76:0;;;;;;;:::i;:::-;59993:25;:23;:25::i;:::-;:33;;60022:4;59993:33;59985:81;;;;-1:-1:-1;;;59985:81:0;;;;;;;:::i;:::-;60079:24;60089:3;60094:1;60097:5;60079:9;:24::i;50986:93::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;51042:24:::1;:31:::0;;-1:-1:-1;;51042:31:0::1;51069:4;51042:31;::::0;;50986:93::o;54728:1207::-;54783:7;54816:1;54807:6;:10;54799:56;;;;-1:-1:-1;;;54799:56:0;;26702:2:1;54799:56:0;;;26684:21:1;26741:2;26721:18;;;26714:30;26780:34;26760:18;;;26753:62;-1:-1:-1;;;26831:18:1;;;26824:31;26872:19;;54799:56:0;26500:397:1;54799:56:0;55023:23;;;;:32;;:81;;;55085:19;;55066:16;:14;:16::i;:::-;:38;55023:81;55012:138;;;55136:6;55128:5;;:14;;;;:::i;55012:138::-;55158:21;55201:6;55182:16;:14;:16::i;:::-;:25;;;;:::i;:::-;55158:49;;55365:19;;55347:13;:37;55344:91;;55421:6;55402:16;;:25;;;;:::i;55344:91::-;55697:27;55749:16;:14;:16::i;:::-;55727:19;;:38;;;;:::i;:::-;55697:68;;55772:29;55820:19;;55804:13;:35;;;;:::i;:::-;55772:67;;55907:21;55899:5;;:29;;;;:::i;:::-;55875:19;55856:16;;:38;;;;:::i;:::-;55855:74;;;;:::i;49676:224::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;49772:15:::1;49757:12;:30;49749:109;;;::::0;-1:-1:-1;;;49749:109:0;;10776:2:1;49749:109:0::1;::::0;::::1;10758:21:1::0;10815:2;10795:18;;;10788:30;10854:34;10834:18;;;10827:62;10925:34;10905:18;;;10898:62;-1:-1:-1;;;10976:19:1;;;10969:33;11019:19;;49749:109:0::1;10574:470:1::0;49749:109:0::1;49865:14;:29:::0;49676:224::o;27290:201::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27379:22:0;::::1;27371:73;;;::::0;-1:-1:-1;;;27371:73:0;;11655:2:1;27371:73:0::1;::::0;::::1;11637:21:1::0;11694:2;11674:18;;;11667:30;11733:34;11713:18;;;11706:62;-1:-1:-1;;;11784:18:1;;;11777:36;11830:19;;27371:73:0::1;11453:402:1::0;27371:73:0::1;27455:28;27474:8;27455:18;:28::i;50747:233::-:0;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;50846:15:::1;50831:12;:30;50823:112;;;::::0;-1:-1:-1;;;50823:112:0;;17116:2:1;50823:112:0::1;::::0;::::1;17098:21:1::0;17155:2;17135:18;;;17128:30;17194:34;17174:18;;;17167:62;17265:34;17245:18;;;17238:62;-1:-1:-1;;;17316:19:1;;;17309:36;17362:19;;50823:112:0::1;16914:473:1::0;50823:112:0::1;50942:17;:32:::0;50747:233::o;63460:119::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;63517:25:::1;:23;:25::i;63955:242::-:0;64033:4;64069:1;64058:7;:12;;64050:66;;;;-1:-1:-1;;;64050:66:0;;25878:2:1;64050:66:0;;;25860:21:1;25917:2;25897:18;;;25890:30;25956:34;25936:18;;;25929:62;-1:-1:-1;;;26007:18:1;;;26000:39;26056:19;;64050:66:0;25676:405:1;64050:66:0;64173:16;;64161:7;64135:23;64149:8;64135:13;:23::i;:::-;:33;;;;:::i;:::-;64134:55;;;63955:242;-1:-1:-1;;;63955:242:0:o;41540:129::-;41623:40;41633:2;41637:8;41647:11;41623:40;;;;;;;;;;;;:9;:40::i;41399:135::-;41456:4;41495:7;34169:1;41476:26;;:52;;;;-1:-1:-1;;41516:12:0;;-1:-1:-1;41506:22:0;41399:135::o;45283:172::-;45380:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;45380:29:0;-1:-1:-1;;;;;45380:29:0;;;;;;;;;45421:28;;45380:24;;45421:28;;;;;;;45283:172;;;:::o;43652:1529::-;43749:35;43787:20;43799:7;43787:11;:20::i;:::-;43858:18;;43749:58;;-1:-1:-1;43816:22:0;;-1:-1:-1;;;;;43842:34:0;25191:10;-1:-1:-1;;;;;43842:34:0;;:81;;;-1:-1:-1;25191:10:0;43887:20;43899:7;43887:11;:20::i;:::-;-1:-1:-1;;;;;43887:36:0;;43842:81;:142;;;-1:-1:-1;43951:18:0;;43934:50;;25191:10;40183:186;:::i;43934:50::-;43816:169;;44010:17;43994:101;;;;-1:-1:-1;;;43994:101:0;;20739:2:1;43994:101:0;;;20721:21:1;20778:2;20758:18;;;20751:30;20817:34;20797:18;;;20790:62;-1:-1:-1;;;20868:18:1;;;20861:48;20926:19;;43994:101:0;20537:414:1;43994:101:0;44142:4;-1:-1:-1;;;;;44120:26:0;:13;:18;;;-1:-1:-1;;;;;44120:26:0;;44104:98;;;;-1:-1:-1;;;44104:98:0;;18836:2:1;44104:98:0;;;18818:21:1;18875:2;18855:18;;;18848:30;18914:34;18894:18;;;18887:62;-1:-1:-1;;;18965:18:1;;;18958:36;19011:19;;44104:98:0;18634:402:1;44104:98:0;-1:-1:-1;;;;;44217:16:0;;44209:66;;;;-1:-1:-1;;;44209:66:0;;14300:2:1;44209:66:0;;;14282:21:1;14339:2;14319:18;;;14312:30;14378:34;14358:18;;;14351:62;-1:-1:-1;;;14429:18:1;;;14422:35;14474:19;;44209:66:0;14098:401:1;44209:66:0;44384:49;44401:1;44405:7;44414:13;:18;;;44384:8;:49::i;:::-;-1:-1:-1;;;;;44442:18:0;;;;;;:12;:18;;;;;:31;;44472:1;;44442:18;:31;;44472:1;;-1:-1:-1;;;;;44442:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;44442:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44480:16:0;;-1:-1:-1;44480:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;44480:16:0;;:29;;-1:-1:-1;;44480:29:0;;:::i;:::-;;;-1:-1:-1;;;;;44480:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44539:43:0;;;;;;;;-1:-1:-1;;;;;44539:43:0;;;;;-1:-1:-1;;;;;44565:15:0;44539:43;;;;;;;;;-1:-1:-1;44516:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;44516:66:0;-1:-1:-1;;;;;;44516:66:0;;;;;;;;;;;44832:11;44528:7;-1:-1:-1;44832:11:0;:::i;:::-;44895:1;44854:24;;;:11;:24;;;;;:29;44810:33;;-1:-1:-1;;;;;;44854:29:0;44850:236;;44912:20;44920:11;44912:7;:20::i;:::-;44908:171;;;44972:97;;;;;;;;44999:18;;-1:-1:-1;;;;;44972:97:0;;;;;;45030:28;;;;-1:-1:-1;;;;;44972:97:0;;;;;;;;;-1:-1:-1;44945:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;44945:124:0;-1:-1:-1;;;;;;44945:124:0;;;;;;;;;;;;44908:171;45118:7;45114:2;-1:-1:-1;;;;;45099:27:0;45108:4;-1:-1:-1;;;;;45099:27:0;;;;;;;;;;;43742:1439;;;43652:1529;;;:::o;28919:202::-;29052:4;29107;29078:25;29091:5;29098:4;29078:12;:25::i;:::-;:33;;28919:202;-1:-1:-1;;;;28919:202:0:o;36987:945::-;-1:-1:-1;;;;;;;;;;;;;;;;;37111:7:0;;34169:1;37152:23;;:46;;;;;37186:12;;37179:4;:19;37152:46;37148:706;;;37215:31;37249:17;;;:11;:17;;;;;;;;;37215:51;;;;;;;;;-1:-1:-1;;;;;37215:51:0;;;;;-1:-1:-1;;;37215:51:0;;;-1:-1:-1;;;;;37215:51:0;;;;;;;;37285:28;37281:85;;37341:9;36987:945;-1:-1:-1;;;36987:945:0:o;37281:85::-;-1:-1:-1;;;37662:6:0;37699:17;;;;:11;:17;;;;;;;;;37687:29;;;;;;;;;-1:-1:-1;;;;;37687:29:0;;;;;-1:-1:-1;;;37687:29:0;;;-1:-1:-1;;;;;37687:29:0;;;;;;;;37739:28;37735:93;;37799:9;36987:945;-1:-1:-1;;;36987:945:0:o;37735:93::-;37630:213;;37148:706;37869:57;;-1:-1:-1;;;37869:57:0;;25462:2:1;37869:57:0;;;25444:21:1;25501:2;25481:18;;;25474:30;25540:34;25520:18;;;25513:62;-1:-1:-1;;;25591:18:1;;;25584:45;25646:19;;37869:57:0;25260:411:1;27649:191:0;27723:16;27742:6;;-1:-1:-1;;;;;27759:17:0;;;-1:-1:-1;;;;;;27759:17:0;;;;;;27792:40;;27742:6;;;;;;;27792:40;;27723:16;27792:40;27712:128;27649:191;:::o;51902:278::-;51961:21;51943:15;51999:176;52017:19;;52013:1;:23;51999:176;;;52057:108;52084:16;52101:1;52084:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52084:19:0;52149:3;52131:11;52143:1;52131:14;;;;;;;;:::i;:::-;;;;;;;;;52121:7;:24;;;;:::i;:::-;52120:32;;;;:::i;:::-;52057:10;:108::i;:::-;52038:3;;;;:::i;:::-;;;;51999:176;;47072:690;47209:4;-1:-1:-1;;;;;47226:13:0;;3054:19;:23;47222:535;;47265:72;;-1:-1:-1;;;47265:72:0;;-1:-1:-1;;;;;47265:36:0;;;;;:72;;25191:10;;47316:4;;47322:7;;47331:5;;47265:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47265:72:0;;;;;;;;-1:-1:-1;;47265:72:0;;;;;;;;;;;;:::i;:::-;;;47252:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47496:13:0;;47492:215;;47529:61;;-1:-1:-1;;;47529:61:0;;;;;;;:::i;47492:215::-;47675:6;47669:13;47660:6;47656:2;47652:15;47645:38;47252:464;-1:-1:-1;;;;;;47387:55:0;-1:-1:-1;;;47387:55:0;;-1:-1:-1;47380:62:0;;47222:535;-1:-1:-1;47745:4:0;47222:535;47072:690;;;;;;:::o;19942:723::-;19998:13;20219:10;20215:53;;-1:-1:-1;;20246:10:0;;;;;;;;;;;;-1:-1:-1;;;20246:10:0;;;;;19942:723::o;20215:53::-;20293:5;20278:12;20334:78;20341:9;;20334:78;;20367:8;;;;:::i;:::-;;-1:-1:-1;20390:10:0;;-1:-1:-1;20398:2:0;20390:10;;:::i;:::-;;;20334:78;;;20422:19;20454:6;-1:-1:-1;;;;;20444:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20444:17:0;;20422:39;;20472:154;20479:10;;20472:154;;20506:11;20516:1;20506:11;;:::i;:::-;;-1:-1:-1;20575:10:0;20583:2;20575:5;:10;:::i;:::-;20562:24;;:2;:24;:::i;:::-;20549:39;;20532:6;20539;20532:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20532:56:0;;;;;;;;-1:-1:-1;20603:11:0;20612:2;20603:11;;:::i;:::-;;;20472:154;;36741:240;36802:7;-1:-1:-1;;;;;36834:19:0;;36818:102;;;;-1:-1:-1;;;36818:102:0;;14706:2:1;36818:102:0;;;14688:21:1;14745:2;14725:18;;;14718:30;14784:34;14764:18;;;14757:62;-1:-1:-1;;;14835:18:1;;;14828:47;14892:19;;36818:102:0;14504:413:1;36818:102:0;-1:-1:-1;;;;;;36942:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;36942:32:0;;-1:-1:-1;;;;;36942:32:0;;36741:240::o;41998:1434::-;42149:12;;-1:-1:-1;;;;;42176:16:0;;42168:62;;;;-1:-1:-1;;;42168:62:0;;23465:2:1;42168:62:0;;;23447:21:1;23504:2;23484:18;;;23477:30;23543:34;23523:18;;;23516:62;-1:-1:-1;;;23594:18:1;;;23587:31;23635:19;;42168:62:0;23263:397:1;42168:62:0;42367:21;42375:12;42367:7;:21::i;:::-;42366:22;42358:64;;;;-1:-1:-1;;;42358:64:0;;22687:2:1;42358:64:0;;;22669:21:1;22726:2;22706:18;;;22699:30;22765:31;22745:18;;;22738:59;22814:18;;42358:64:0;22485:353:1;42358:64:0;42508:20;42504:116;;42561:12;;42549:8;:24;;42541:71;;;;-1:-1:-1;;;42541:71:0;;27104:2:1;42541:71:0;;;27086:21:1;27143:2;27123:18;;;27116:30;27182:34;27162:18;;;27155:62;-1:-1:-1;;;27233:18:1;;;27226:32;27275:19;;42541:71:0;26902:398:1;42541:71:0;-1:-1:-1;;;;;42731:16:0;;42698:30;42731:16;;;:12;:16;;;;;;;;;42698:49;;;;;;;;;-1:-1:-1;;;;;42698:49:0;;;;;-1:-1:-1;;;42698:49:0;;;;;;;;;;;42773:139;;;;;;;;42793:19;;42698:49;;42773:139;;;42793:39;;42823:8;;42793:39;:::i;:::-;-1:-1:-1;;;;;42773:139:0;;;;;42869:11;:35;;42895:8;42869:35;;;42883:1;42869:35;42841:11;:24;;;:64;;;;:::i;:::-;-1:-1:-1;;;;;42773:139:0;;;;;;-1:-1:-1;;;;;42754:16:0;;;;;;;:12;:16;;;;;;;;:158;;;;;;;;-1:-1:-1;;;42754:158:0;;;;;;;;;;;;42947:43;;;;;;;;;;-1:-1:-1;;;;;42973:15:0;42947:43;;;;;;;;42919:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;42919:71:0;-1:-1:-1;;;;;;42919:71:0;;;;;;;;;;;;;;;;;;42931:12;;43043:281;43067:8;43063:1;:12;43043:281;;;43096:38;;43121:12;;-1:-1:-1;;;;;43096:38:0;;;43113:1;;43096:38;;43113:1;;43096:38;43161:59;43192:1;43196:2;43200:12;43214:5;43161:22;:59::i;:::-;43143:150;;;;-1:-1:-1;;;43143:150:0;;;;;;;:::i;:::-;43302:14;;;;:::i;:::-;;;;43077:3;;;;;:::i;:::-;;;;43043:281;;;-1:-1:-1;43332:12:0;:27;-1:-1:-1;;;;;;41998:1434:0:o;29493:701::-;29576:7;29621:4;29576:7;29638:515;29662:5;:12;29658:1;:16;29638:515;;;29698:20;29721:5;29727:1;29721:8;;;;;;;;:::i;:::-;;;;;;;29698:31;;29766:12;29750;:28;29746:394;;30272:13;30326:15;;;30364:4;30357:15;;;30413:4;30397:21;;29882:57;;29746:394;;;30272:13;30326:15;;;30364:4;30357:15;;;30413:4;30397:21;;30065:57;;29746:394;-1:-1:-1;29676:3:0;;;;:::i;:::-;;;;29638:515;;;-1:-1:-1;30172:12:0;29493:701;-1:-1:-1;;;29493:701:0:o;52188:175::-;52261:12;52279:8;-1:-1:-1;;;;;52279:13:0;52300:7;52279:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52260:52;;;52329:7;52321:36;;;;-1:-1:-1;;;52321:36:0;;21922:2:1;52321:36:0;;;21904:21:1;21961:2;21941:18;;;21934:30;-1:-1:-1;;;21980:18:1;;;21973:46;22036:18;;52321:36:0;21720:340:1;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:367::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:55;;973:1;970;963:12;922:55;-1:-1:-1;996:20:1;;-1:-1:-1;;;;;1028:30:1;;1025:50;;;1071:1;1068;1061:12;1025:50;1108:4;1100:6;1096:17;1084:29;;1168:3;1161:4;1151:6;1148:1;1144:14;1136:6;1132:27;1128:38;1125:47;1122:67;;;1185:1;1182;1175:12;1122:67;828:367;;;;;:::o;1200:186::-;1259:6;1312:2;1300:9;1291:7;1287:23;1283:32;1280:52;;;1328:1;1325;1318:12;1280:52;1351:29;1370:9;1351:29;:::i;1391:260::-;1459:6;1467;1520:2;1508:9;1499:7;1495:23;1491:32;1488:52;;;1536:1;1533;1526:12;1488:52;1559:29;1578:9;1559:29;:::i;:::-;1549:39;;1607:38;1641:2;1630:9;1626:18;1607:38;:::i;:::-;1597:48;;1391:260;;;;;:::o;1656:328::-;1733:6;1741;1749;1802:2;1790:9;1781:7;1777:23;1773:32;1770:52;;;1818:1;1815;1808:12;1770:52;1841:29;1860:9;1841:29;:::i;:::-;1831:39;;1889:38;1923:2;1912:9;1908:18;1889:38;:::i;:::-;1879:48;;1974:2;1963:9;1959:18;1946:32;1936:42;;1656:328;;;;;:::o;1989:666::-;2084:6;2092;2100;2108;2161:3;2149:9;2140:7;2136:23;2132:33;2129:53;;;2178:1;2175;2168:12;2129:53;2201:29;2220:9;2201:29;:::i;:::-;2191:39;;2249:38;2283:2;2272:9;2268:18;2249:38;:::i;:::-;2239:48;;2334:2;2323:9;2319:18;2306:32;2296:42;;2389:2;2378:9;2374:18;2361:32;-1:-1:-1;;;;;2408:6:1;2405:30;2402:50;;;2448:1;2445;2438:12;2402:50;2471:22;;2524:4;2516:13;;2512:27;-1:-1:-1;2502:55:1;;2553:1;2550;2543:12;2502:55;2576:73;2641:7;2636:2;2623:16;2618:2;2614;2610:11;2576:73;:::i;:::-;2566:83;;;1989:666;;;;;;;:::o;2660:511::-;2755:6;2763;2771;2824:2;2812:9;2803:7;2799:23;2795:32;2792:52;;;2840:1;2837;2830:12;2792:52;2863:29;2882:9;2863:29;:::i;:::-;2853:39;;2943:2;2932:9;2928:18;2915:32;-1:-1:-1;;;;;2962:6:1;2959:30;2956:50;;;3002:1;2999;2992:12;2956:50;3041:70;3103:7;3094:6;3083:9;3079:22;3041:70;:::i;:::-;2660:511;;3130:8;;-1:-1:-1;3015:96:1;;-1:-1:-1;;;;2660:511:1:o;3176:315::-;3241:6;3249;3302:2;3290:9;3281:7;3277:23;3273:32;3270:52;;;3318:1;3315;3308:12;3270:52;3341:29;3360:9;3341:29;:::i;:::-;3331:39;;3420:2;3409:9;3405:18;3392:32;3433:28;3455:5;3433:28;:::i;:::-;3480:5;3470:15;;;3176:315;;;;;:::o;3496:254::-;3564:6;3572;3625:2;3613:9;3604:7;3600:23;3596:32;3593:52;;;3641:1;3638;3631:12;3593:52;3664:29;3683:9;3664:29;:::i;:::-;3654:39;3740:2;3725:18;;;;3712:32;;-1:-1:-1;;;3496:254:1:o;3755:579::-;3859:6;3867;3875;3883;3936:2;3924:9;3915:7;3911:23;3907:32;3904:52;;;3952:1;3949;3942:12;3904:52;3975:29;3994:9;3975:29;:::i;:::-;3965:39;;4051:2;4040:9;4036:18;4023:32;4013:42;;4106:2;4095:9;4091:18;4078:32;-1:-1:-1;;;;;4125:6:1;4122:30;4119:50;;;4165:1;4162;4155:12;4119:50;4204:70;4266:7;4257:6;4246:9;4242:22;4204:70;:::i;:::-;3755:579;;;;-1:-1:-1;4293:8:1;-1:-1:-1;;;;3755:579:1:o;4339:245::-;4406:6;4459:2;4447:9;4438:7;4434:23;4430:32;4427:52;;;4475:1;4472;4465:12;4427:52;4507:9;4501:16;4526:28;4548:5;4526:28;:::i;4589:180::-;4648:6;4701:2;4689:9;4680:7;4676:23;4672:32;4669:52;;;4717:1;4714;4707:12;4669:52;-1:-1:-1;4740:23:1;;4589:180;-1:-1:-1;4589:180:1:o;4774:245::-;4832:6;4885:2;4873:9;4864:7;4860:23;4856:32;4853:52;;;4901:1;4898;4891:12;4853:52;4940:9;4927:23;4959:30;4983:5;4959:30;:::i;5024:249::-;5093:6;5146:2;5134:9;5125:7;5121:23;5117:32;5114:52;;;5162:1;5159;5152:12;5114:52;5194:9;5188:16;5213:30;5237:5;5213:30;:::i;5278:592::-;5349:6;5357;5410:2;5398:9;5389:7;5385:23;5381:32;5378:52;;;5426:1;5423;5416:12;5378:52;5466:9;5453:23;-1:-1:-1;;;;;5536:2:1;5528:6;5525:14;5522:34;;;5552:1;5549;5542:12;5522:34;5590:6;5579:9;5575:22;5565:32;;5635:7;5628:4;5624:2;5620:13;5616:27;5606:55;;5657:1;5654;5647:12;5606:55;5697:2;5684:16;5723:2;5715:6;5712:14;5709:34;;;5739:1;5736;5729:12;5709:34;5784:7;5779:2;5770:6;5766:2;5762:15;5758:24;5755:37;5752:57;;;5805:1;5802;5795:12;5752:57;5836:2;5828:11;;;;;5858:6;;-1:-1:-1;5278:592:1;;-1:-1:-1;;;;5278:592:1:o;5875:450::-;5944:6;5997:2;5985:9;5976:7;5972:23;5968:32;5965:52;;;6013:1;6010;6003:12;5965:52;6053:9;6040:23;-1:-1:-1;;;;;6078:6:1;6075:30;6072:50;;;6118:1;6115;6108:12;6072:50;6141:22;;6194:4;6186:13;;6182:27;-1:-1:-1;6172:55:1;;6223:1;6220;6213:12;6172:55;6246:73;6311:7;6306:2;6293:16;6288:2;6284;6280:11;6246:73;:::i;6515:184::-;6585:6;6638:2;6626:9;6617:7;6613:23;6609:32;6606:52;;;6654:1;6651;6644:12;6606:52;-1:-1:-1;6677:16:1;;6515:184;-1:-1:-1;6515:184:1:o;6704:257::-;6745:3;6783:5;6777:12;6810:6;6805:3;6798:19;6826:63;6882:6;6875:4;6870:3;6866:14;6859:4;6852:5;6848:16;6826:63;:::i;:::-;6943:2;6922:15;-1:-1:-1;;6918:29:1;6909:39;;;;6950:4;6905:50;;6704:257;-1:-1:-1;;6704:257:1:o;7200:470::-;7379:3;7417:6;7411:13;7433:53;7479:6;7474:3;7467:4;7459:6;7455:17;7433:53;:::i;:::-;7549:13;;7508:16;;;;7571:57;7549:13;7508:16;7605:4;7593:17;;7571:57;:::i;:::-;7644:20;;7200:470;-1:-1:-1;;;;7200:470:1:o;8093:488::-;-1:-1:-1;;;;;8362:15:1;;;8344:34;;8414:15;;8409:2;8394:18;;8387:43;8461:2;8446:18;;8439:34;;;8509:3;8504:2;8489:18;;8482:31;;;8287:4;;8530:45;;8555:19;;8547:6;8530:45;:::i;:::-;8522:53;8093:488;-1:-1:-1;;;;;;8093:488:1:o;9239:219::-;9388:2;9377:9;9370:21;9351:4;9408:44;9448:2;9437:9;9433:18;9425:6;9408:44;:::i;11860:350::-;12062:2;12044:21;;;12101:2;12081:18;;;12074:30;12140:28;12135:2;12120:18;;12113:56;12201:2;12186:18;;11860:350::o;12215:351::-;12417:2;12399:21;;;12456:2;12436:18;;;12429:30;12495:29;12490:2;12475:18;;12468:57;12557:2;12542:18;;12215:351::o;14922:401::-;15124:2;15106:21;;;15163:2;15143:18;;;15136:30;15202:34;15197:2;15182:18;;15175:62;-1:-1:-1;;;15268:2:1;15253:18;;15246:35;15313:3;15298:19;;14922:401::o;15328:399::-;15530:2;15512:21;;;15569:2;15549:18;;;15542:30;15608:34;15603:2;15588:18;;15581:62;-1:-1:-1;;;15674:2:1;15659:18;;15652:33;15717:3;15702:19;;15328:399::o;15732:412::-;15934:2;15916:21;;;15973:2;15953:18;;;15946:30;16012:34;16007:2;15992:18;;15985:62;-1:-1:-1;;;16078:2:1;16063:18;;16056:46;16134:3;16119:19;;15732:412::o;16149:352::-;16351:2;16333:21;;;16390:2;16370:18;;;16363:30;16429;16424:2;16409:18;;16402:58;16492:2;16477:18;;16149:352::o;16506:403::-;16708:2;16690:21;;;16747:2;16727:18;;;16720:30;16786:34;16781:2;16766:18;;16759:62;-1:-1:-1;;;16852:2:1;16837:18;;16830:37;16899:3;16884:19;;16506:403::o;17818:399::-;18020:2;18002:21;;;18059:2;18039:18;;;18032:30;18098:34;18093:2;18078:18;;18071:62;-1:-1:-1;;;18164:2:1;18149:18;;18142:33;18207:3;18192:19;;17818:399::o;19469:356::-;19671:2;19653:21;;;19690:18;;;19683:30;19749:34;19744:2;19729:18;;19722:62;19816:2;19801:18;;19469:356::o;19830:347::-;20032:2;20014:21;;;20071:2;20051:18;;;20044:30;20110:25;20105:2;20090:18;;20083:53;20168:2;20153:18;;19830:347::o;22065:415::-;22267:2;22249:21;;;22306:2;22286:18;;;22279:30;22345:34;22340:2;22325:18;;22318:62;-1:-1:-1;;;22411:2:1;22396:18;;22389:49;22470:3;22455:19;;22065:415::o;23665:404::-;23867:2;23849:21;;;23906:2;23886:18;;;23879:30;23945:34;23940:2;23925:18;;23918:62;-1:-1:-1;;;24011:2:1;23996:18;;23989:38;24059:3;24044:19;;23665:404::o;24074:410::-;24276:2;24258:21;;;24315:2;24295:18;;;24288:30;24354:34;24349:2;24334:18;;24327:62;-1:-1:-1;;;24420:2:1;24405:18;;24398:44;24474:3;24459:19;;24074:410::o;28043:253::-;28083:3;-1:-1:-1;;;;;28172:2:1;28169:1;28165:10;28202:2;28199:1;28195:10;28233:3;28229:2;28225:12;28220:3;28217:21;28214:47;;;28241:18;;:::i;28301:128::-;28341:3;28372:1;28368:6;28365:1;28362:13;28359:39;;;28378:18;;:::i;:::-;-1:-1:-1;28414:9:1;;28301:128::o;28434:120::-;28474:1;28500;28490:35;;28505:18;;:::i;:::-;-1:-1:-1;28539:9:1;;28434:120::o;28559:168::-;28599:7;28665:1;28661;28657:6;28653:14;28650:1;28647:21;28642:1;28635:9;28628:17;28624:45;28621:71;;;28672:18;;:::i;:::-;-1:-1:-1;28712:9:1;;28559:168::o;28732:246::-;28772:4;-1:-1:-1;;;;;28885:10:1;;;;28855;;28907:12;;;28904:38;;;28922:18;;:::i;:::-;28959:13;;28732:246;-1:-1:-1;;;28732:246:1:o;28983:125::-;29023:4;29051:1;29048;29045:8;29042:34;;;29056:18;;:::i;:::-;-1:-1:-1;29093:9:1;;28983:125::o;29113:258::-;29185:1;29195:113;29209:6;29206:1;29203:13;29195:113;;;29285:11;;;29279:18;29266:11;;;29259:39;29231:2;29224:10;29195:113;;;29326:6;29323:1;29320:13;29317:48;;;-1:-1:-1;;29361:1:1;29343:16;;29336:27;29113:258::o;29376:380::-;29455:1;29451:12;;;;29498;;;29519:61;;29573:4;29565:6;29561:17;29551:27;;29519:61;29626:2;29618:6;29615:14;29595:18;29592:38;29589:161;;;29672:10;29667:3;29663:20;29660:1;29653:31;29707:4;29704:1;29697:15;29735:4;29732:1;29725:15;29589:161;;29376:380;;;:::o;29761:135::-;29800:3;-1:-1:-1;;29821:17:1;;29818:43;;;29841:18;;:::i;:::-;-1:-1:-1;29888:1:1;29877:13;;29761:135::o;29901:112::-;29933:1;29959;29949:35;;29964:18;;:::i;:::-;-1:-1:-1;29998:9:1;;29901:112::o;30018:127::-;30079:10;30074:3;30070:20;30067:1;30060:31;30110:4;30107:1;30100:15;30134:4;30131:1;30124:15;30150:127;30211:10;30206:3;30202:20;30199:1;30192:31;30242:4;30239:1;30232:15;30266:4;30263:1;30256:15;30282:127;30343:10;30338:3;30334:20;30331:1;30324:31;30374:4;30371:1;30364:15;30398:4;30395:1;30388:15;30414:127;30475:10;30470:3;30466:20;30463:1;30456:31;30506:4;30503:1;30496:15;30530:4;30527:1;30520:15;30546:118;30632:5;30625:13;30618:21;30611:5;30608:32;30598:60;;30654:1;30651;30644:12;30669:131;-1:-1:-1;;;;;;30743:32:1;;30733:43;;30723:71;;30790:1;30787;30780:12
Swarm Source
ipfs://714ed29faa832a107702f251e68574942364e5e5bd278d61ac239e5296cda593
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.