Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
733 YACHT
Holders
259
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
13 YACHTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CryptoYachts
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-08 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.12; /** * @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. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ 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 Merklee 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 = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } 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. */ } /** * @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; } } /** * @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() external 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) external 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); } } /** * @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; } } /** * @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); } /** * @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); } /** * @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; } } /** * @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; } /** * @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); } /** * @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); } error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @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 0 (e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**128 - 1 (max value of uint128). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; } // Compiler will pack the following // _currentIndex and _burnCounter into a single 256bit word. // The tokenId of the next token to be minted. uint128 internal _currentIndex; // The number of tokens burned. uint128 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex times unchecked { return _currentIndex - _burnCounter; } } /** * @dev See {IERC721Enumerable-tokenByIndex}. * This read function is O(totalSupply). 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 tokenByIndex(uint256 index) external view override returns (uint256) { uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (!ownership.burned) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert TokenIndexOutOfBounds(); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). 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) external view override returns (uint256) { if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds(); uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } // Execution should never reach this point. revert(); } /** * @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) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { 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 OwnerQueryForNonexistentToken(); } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _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 virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _currentIndex = uint128(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 || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = 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)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn 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)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @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); } /** * @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 TransferToNonERC721ReceiverImplementer(); } 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. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } contract CryptoYachts is ERC721A, Ownable { event saleStageChanged(uint _value); using Strings for uint256; bytes32 public merkleRoot = ""; // Construct this from (address, amount) tuple elements for whitelisted mints mapping(address => uint) public whitelistRemaining; // Maps user address to their remaining mints if they have minted some but not all of their allocation mapping(address => bool) public whitelistUsed; // Maps user address to bool, true if user has minted uint256 public constant RESERVED_TOKENS = 20; uint256 public constant FOR_SALE_TOKENS = 733 - RESERVED_TOKENS; uint256 public stageCount = 7; /* 0 - sale not started 1 - whitelist - 1 per wallet - 0.0 ETH 2 - whitelist - 10 per wallet - 0.1 ETH 3 - whitelist - 5 per wallet - 0.1 ETH 4 - whitelist - 3 per wallet - 0.1 ETH 5 - whitelist - 2 per wallet - 0.1 ETH 6 - public - unlimited - 0.15 ETH */ mapping(uint256 => uint256) public stagesTokenPrice; mapping(uint256 => uint256) public stagesMaxTokensPerAddress; uint256 public currentStage = 0; string public tokenBaseURI = "ipfs://Qma5pxiuFekS5dgtmPm5qoAb4EMNgWgUSYrDsnwTwWc5kZ/"; uint256 public soldAmount = 0; mapping(address => uint256) public purchased; constructor() ERC721A("CryptoYachts", "YACHT") { stagesTokenPrice[1] = 0 ether; stagesTokenPrice[2] = 0.1 ether; stagesTokenPrice[3] = 0.1 ether; stagesTokenPrice[4] = 0.15 ether; stagesMaxTokensPerAddress[1] = 1; stagesMaxTokensPerAddress[2] = 10; stagesMaxTokensPerAddress[3] = 10; stagesMaxTokensPerAddress[4] = 9999; // unlimited _safeMint(msg.sender, RESERVED_TOKENS); } function setTokenPrice(uint256 stage, uint256 val) external onlyOwner { require(stage < stageCount, "Stage does not exist"); stagesTokenPrice[stage] = val; } function setMaxTokensPerAddress(uint256 stage, uint256 val) external onlyOwner { require(stage < stageCount, "Stage does not exist"); stagesMaxTokensPerAddress[stage] = val; } function setCurrentStage(uint256 val) external onlyOwner { require(val < stageCount, "Stage does not exist"); currentStage = val; emit saleStageChanged(val); } function addStage() external onlyOwner { stageCount++; } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } function isPublicSale() public view returns (bool) { return currentStage == stageCount - 1; } function tokenPrice() public view returns (uint256) { return stagesTokenPrice[currentStage]; } function getContractInfo(address target) external view returns ( bool _hasPresaleStarted, bool _hasPublicSaleStarted, uint256 _tokenPrice, uint256 _soldAmount, uint256 _purchasedAmount ) { _hasPresaleStarted = currentStage > 0; _hasPublicSaleStarted = isPublicSale(); _tokenPrice = tokenPrice(); _soldAmount = soldAmount; _purchasedAmount = purchased[target]; } function mint(uint256 amount) external payable returns (uint256) { require(msg.value == tokenPrice() * amount, "Incorrect ETH sent"); require(currentStage == stageCount - 1,"Public Sale is not Live yet"); uint256 supply = totalSupply(); _safeMint(msg.sender, amount); purchased[msg.sender] += amount; soldAmount += amount; return supply; } function whitelistMint(uint amount, uint totalAllocation, bytes32 leaf, bytes32[] memory proof) external payable { // Verify that (leaf, proof) matches the Merkle root require(verify(merkleRoot, leaf, proof), "Not a valid leaf in the Merkle tree"); require(amount <= stagesMaxTokensPerAddress[currentStage], "Can't mint more than current stage allocation"); // Verify that (msg.sender, amount) correspond to Merkle leaf require(keccak256(abi.encodePacked(msg.sender, totalAllocation)) == leaf, "Sender and amount don't match Merkle leaf"); if ( currentStage <= 1){ require(!whitelistUsed[msg.sender]); } // Create storage element tracking user mints if this is the first mint for them if (!whitelistUsed[msg.sender]) { whitelistUsed[msg.sender] = true; whitelistRemaining[msg.sender] = totalAllocation; } else if (whitelistRemaining[msg.sender] > totalAllocation){ whitelistRemaining[msg.sender] = totalAllocation; } // Require nonzero amount require(amount > 0, "Can't mint zero"); // Check proper amount sent require(msg.value >= tokenPrice() * amount, "Incorrect ETH sent"); require(whitelistRemaining[msg.sender] >= amount, "Can't mint more than remaining allocation"); whitelistRemaining[msg.sender] -= amount; _safeMint(msg.sender, amount); purchased[msg.sender] += amount; soldAmount += amount; } function verify(bytes32 root, bytes32 leaf, bytes32[] memory proof) public pure returns (bool) { return MerkleProof.verify(proof, root, leaf); } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function _baseURI() internal view override(ERC721A) returns (string memory) { return tokenBaseURI; } function setBaseURI(string calldata URI) external onlyOwner { tokenBaseURI = URI; } function withdraw() external onlyOwner { require(payable(msg.sender).send(address(this).balance)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"saleStageChanged","type":"event"},{"inputs":[],"name":"FOR_SALE_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addStage","outputs":[],"stateMutability":"nonpayable","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":"currentStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"getContractInfo","outputs":[{"internalType":"bool","name":"_hasPresaleStarted","type":"bool"},{"internalType":"bool","name":"_hasPublicSaleStarted","type":"bool"},{"internalType":"uint256","name":"_tokenPrice","type":"uint256"},{"internalType":"uint256","name":"_soldAmount","type":"uint256"},{"internalType":"uint256","name":"_purchasedAmount","type":"uint256"}],"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":"isPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setCurrentStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stage","type":"uint256"},{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxTokensPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stage","type":"uint256"},{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"soldAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stageCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stagesMaxTokensPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stagesTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBaseURI","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":[],"name":"tokenPrice","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":"bytes32","name":"root","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"totalAllocation","type":"uint256"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006008556007600b556000600e556040518060600160405280603681526020016200573360369139600f908051906020019062000044929190620008a7565b5060006010553480156200005757600080fd5b506040518060400160405280600c81526020017f43727970746f59616368747300000000000000000000000000000000000000008152506040518060400160405280600581526020017f59414348540000000000000000000000000000000000000000000000000000008152508160019080519060200190620000dc929190620008a7565b508060029080519060200190620000f5929190620008a7565b505050620001186200010c6200021760201b60201c565b6200021f60201b60201c565b6000600c6000600181526020019081526020016000208190555067016345785d8a0000600c6000600281526020019081526020016000208190555067016345785d8a0000600c60006003815260200190815260200160002081905550670214e8348c4f0000600c600060048152602001908152602001600020819055506001600d60006001815260200190815260200160002081905550600a600d60006002815260200190815260200160002081905550600a600d6000600381526020019081526020016000208190555061270f600d6000600481526020019081526020016000208190555062000211336014620002e560201b60201c565b62000ba8565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003078282604051806020016040528060008152506200030b60201b60201c565b5050565b6200032083838360016200032560201b60201c565b505050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620003c1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415620003fd576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620004126000868387620006d960201b60201c565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156200068357818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015620006355750620006336000888488620006df60201b60201c565b155b156200066d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050620005b0565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050620006d260008683876200087e60201b60201c565b5050505050565b50505050565b60006200070d8473ffffffffffffffffffffffffffffffffffffffff166200088460201b6200253a1760201c565b1562000871578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200073f6200021760201b60201c565b8786866040518563ffffffff1660e01b815260040162000763949392919062000a5b565b6020604051808303816000875af1925050508015620007a257506040513d601f19601f820116820180604052508101906200079f919062000b11565b60015b62000820573d8060008114620007d5576040519150601f19603f3d011682016040523d82523d6000602084013e620007da565b606091505b5060008151141562000818576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000876565b600190505b949350505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054620008b59062000b72565b90600052602060002090601f016020900481019282620008d9576000855562000925565b82601f10620008f457805160ff191683800117855562000925565b8280016001018555821562000925579182015b828111156200092457825182559160200191906001019062000907565b5b50905062000934919062000938565b5090565b5b808211156200095357600081600090555060010162000939565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009848262000957565b9050919050565b620009968162000977565b82525050565b6000819050919050565b620009b1816200099c565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620009f3578082015181840152602081019050620009d6565b8381111562000a03576000848401525b50505050565b6000601f19601f8301169050919050565b600062000a2782620009b7565b62000a338185620009c2565b935062000a45818560208601620009d3565b62000a508162000a09565b840191505092915050565b600060808201905062000a7260008301876200098b565b62000a8160208301866200098b565b62000a906040830185620009a6565b818103606083015262000aa4818462000a1a565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000aeb8162000ab4565b811462000af757600080fd5b50565b60008151905062000b0b8162000ae0565b92915050565b60006020828403121562000b2a5762000b2962000aaf565b5b600062000b3a8482850162000afa565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b8b57607f821691505b6020821081141562000ba25762000ba162000b43565b5b50919050565b614b7b8062000bb86000396000f3fe6080604052600436106102675760003560e01c80636352211e11610144578063a5a865dc116100b6578063e63ec9471161007a578063e63ec94714610964578063e985e9c5146109a1578063eb685c47146109de578063f2fde38b14610a07578063f33261ac14610a30578063fa1a5f5914610a5b57610267565b8063a5a865dc14610855578063accb8a0e14610880578063b88d4fde146108bd578063c87b56dd146108e6578063cd481e511461092357610267565b80637ff9b596116101085780637ff9b596146107645780638da5cb5b1461078f5780639508614b146107ba57806395d89b41146107d1578063a0712d68146107fc578063a22cb4651461082c57610267565b80636352211e1461067f57806368fc68c7146106bc57806370a08231146106e7578063715018a6146107245780637cb647591461073b57610267565b80633423e548116101dd5780634e99b800116101a15780634e99b8001461056a5780634f6ccce714610595578063522fe98e146105d257806355f804b31461060f5780635bf5d54c146106385780635bfe024d1461066357610267565b80633423e5481461049957806338c67b73146104d65780633ccfd60b146104ff57806342842e0e146105165780634d8fae951461053f57610267565b806318160ddd1161022f57806318160ddd1461036357806321328f9e1461038e57806323b872dd146103cb5780632eb4a7ab146103f45780632f745c591461041f578063324c93801461045c57610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b3146103115780630e4be24c1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906138d4565b610a86565b6040516102a0919061391c565b60405180910390f35b3480156102b557600080fd5b506102be610bd0565b6040516102cb91906139d0565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190613a28565b610c62565b6040516103089190613a96565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190613add565b610cde565b005b34801561034657600080fd5b50610361600480360381019061035c9190613b1d565b610de9565b005b34801561036f57600080fd5b50610378610ec5565b6040516103859190613b6c565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613b87565b610f1a565b6040516103c2919061391c565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613bb4565b610f3a565b005b34801561040057600080fd5b50610409610f4a565b6040516104169190613c20565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190613add565b610f50565b6040516104539190613b6c565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190613a28565b611157565b6040516104909190613b6c565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190613daf565b61116f565b6040516104cd919061391c565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190613a28565b611185565b005b34801561050b57600080fd5b50610514611286565b005b34801561052257600080fd5b5061053d60048036038101906105389190613bb4565b611342565b005b34801561054b57600080fd5b50610554611362565b6040516105619190613b6c565b60405180910390f35b34801561057657600080fd5b5061057f611374565b60405161058c91906139d0565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190613a28565b611402565b6040516105c99190613b6c565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190613b87565b611573565b6040516106069190613b6c565b60405180910390f35b34801561061b57600080fd5b5061063660048036038101906106319190613e79565b61158b565b005b34801561064457600080fd5b5061064d61161d565b60405161065a9190613b6c565b60405180910390f35b61067d60048036038101906106789190613ec6565b611623565b005b34801561068b57600080fd5b506106a660048036038101906106a19190613a28565b611b01565b6040516106b39190613a96565b60405180910390f35b3480156106c857600080fd5b506106d1611b17565b6040516106de9190613b6c565b60405180910390f35b3480156106f357600080fd5b5061070e60048036038101906107099190613b87565b611b1c565b60405161071b9190613b6c565b60405180910390f35b34801561073057600080fd5b50610739611bec565b005b34801561074757600080fd5b50610762600480360381019061075d9190613f49565b611c74565b005b34801561077057600080fd5b50610779611cfa565b6040516107869190613b6c565b60405180910390f35b34801561079b57600080fd5b506107a4611d17565b6040516107b19190613a96565b60405180910390f35b3480156107c657600080fd5b506107cf611d41565b005b3480156107dd57600080fd5b506107e6611dd7565b6040516107f391906139d0565b60405180910390f35b61081660048036038101906108119190613a28565b611e69565b6040516108239190613b6c565b60405180910390f35b34801561083857600080fd5b50610853600480360381019061084e9190613fa2565b611f9f565b005b34801561086157600080fd5b5061086a612117565b604051610877919061391c565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a29190613a28565b612131565b6040516108b49190613b6c565b60405180910390f35b3480156108c957600080fd5b506108e460048036038101906108df9190614097565b612149565b005b3480156108f257600080fd5b5061090d60048036038101906109089190613a28565b61219c565b60405161091a91906139d0565b60405180910390f35b34801561092f57600080fd5b5061094a60048036038101906109459190613b87565b61223b565b60405161095b95949392919061411a565b60405180910390f35b34801561097057600080fd5b5061098b60048036038101906109869190613b87565b6122ae565b6040516109989190613b6c565b60405180910390f35b3480156109ad57600080fd5b506109c860048036038101906109c3919061416d565b6122c6565b6040516109d5919061391c565b60405180910390f35b3480156109ea57600080fd5b50610a056004803603810190610a009190613b1d565b61235a565b005b348015610a1357600080fd5b50610a2e6004803603810190610a299190613b87565b612436565b005b348015610a3c57600080fd5b50610a4561252e565b604051610a529190613b6c565b60405180910390f35b348015610a6757600080fd5b50610a70612534565b604051610a7d9190613b6c565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b5157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bb957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bc95750610bc88261255d565b5b9050919050565b606060018054610bdf906141dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0b906141dc565b8015610c585780601f10610c2d57610100808354040283529160200191610c58565b820191906000526020600020905b815481529060010190602001808311610c3b57829003601f168201915b5050505050905090565b6000610c6d826125c7565b610ca3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ce982611b01565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d51576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d7061262f565b73ffffffffffffffffffffffffffffffffffffffff1614158015610da25750610da081610d9b61262f565b6122c6565b155b15610dd9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610de4838383612637565b505050565b610df161262f565b73ffffffffffffffffffffffffffffffffffffffff16610e0f611d17565b73ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c9061425a565b60405180910390fd5b600b548210610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea0906142c6565b60405180910390fd5b80600d6000848152602001908152602001600020819055505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b600a6020528060005260406000206000915054906101000a900460ff1681565b610f458383836126e9565b505050565b60085481565b6000610f5b83611b1c565b8210610f93576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b8381101561114b576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156110aa575061113e565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146110ea57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561113c5786841415611133578195505050505050611151565b83806001019450505b505b8080600101915050610fcd565b50600080fd5b92915050565b600d6020528060005260406000206000915090505481565b600061117c828585612c06565b90509392505050565b61118d61262f565b73ffffffffffffffffffffffffffffffffffffffff166111ab611d17565b73ffffffffffffffffffffffffffffffffffffffff1614611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f89061425a565b60405180910390fd5b600b548110611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c906142c6565b60405180910390fd5b80600e819055507fe60489330e0c790e7badc1c781852c966955637b85dae070a5e8c9dd84f99ea48160405161127b9190613b6c565b60405180910390a150565b61128e61262f565b73ffffffffffffffffffffffffffffffffffffffff166112ac611d17565b73ffffffffffffffffffffffffffffffffffffffff1614611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f99061425a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061134057600080fd5b565b61135d83838360405180602001604052806000815250612149565b505050565b60146102dd6113719190614315565b81565b600f8054611381906141dc565b80601f01602080910402602001604051908101604052809291908181526020018280546113ad906141dc565b80156113fa5780601f106113cf576101008083540402835291602001916113fa565b820191906000526020600020905b8154815290600101906020018083116113dd57829003601f168201915b505050505081565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b8281101561153b576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161152d5785831415611524578194505050505061156e565b82806001019350505b50808060010191505061143a565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60116020528060005260406000206000915090505481565b61159361262f565b73ffffffffffffffffffffffffffffffffffffffff166115b1611d17565b73ffffffffffffffffffffffffffffffffffffffff1614611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fe9061425a565b60405180910390fd5b8181600f9190611618929190613782565b505050565b600e5481565b611630600854838361116f565b61166f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611666906143bb565b60405180910390fd5b600d6000600e548152602001908152602001600020548411156116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be9061444d565b60405180910390fd5b8133846040516020016116db9291906144d6565b6040516020818303038152906040528051906020012014611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890614574565b60405180910390fd5b6001600e541161179357600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561179257600080fd5b5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611885576001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611912565b82600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156119115782600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b60008411611955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194c906145e0565b60405180910390fd5b8361195e611cfa565b6119689190614600565b3410156119aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a1906146a6565b60405180910390fd5b83600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390614738565b60405180910390fd5b83600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a7b9190614315565b92505081905550611a8c3385612c1d565b83601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611adb9190614758565b925050819055508360106000828254611af49190614758565b9250508190555050505050565b6000611b0c82612c3b565b600001519050919050565b601481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b84576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611bf461262f565b73ffffffffffffffffffffffffffffffffffffffff16611c12611d17565b73ffffffffffffffffffffffffffffffffffffffff1614611c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5f9061425a565b60405180910390fd5b611c726000612ee3565b565b611c7c61262f565b73ffffffffffffffffffffffffffffffffffffffff16611c9a611d17565b73ffffffffffffffffffffffffffffffffffffffff1614611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce79061425a565b60405180910390fd5b8060088190555050565b6000600c6000600e54815260200190815260200160002054905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d4961262f565b73ffffffffffffffffffffffffffffffffffffffff16611d67611d17565b73ffffffffffffffffffffffffffffffffffffffff1614611dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db49061425a565b60405180910390fd5b600b6000815480929190611dd0906147ae565b9190505550565b606060028054611de6906141dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611e12906141dc565b8015611e5f5780601f10611e3457610100808354040283529160200191611e5f565b820191906000526020600020905b815481529060010190602001808311611e4257829003601f168201915b5050505050905090565b600081611e74611cfa565b611e7e9190614600565b3414611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb6906146a6565b60405180910390fd5b6001600b54611ece9190614315565b600e5414611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890614843565b60405180910390fd5b6000611f1b610ec5565b9050611f273384612c1d565b82601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f769190614758565b925050819055508260106000828254611f8f9190614758565b9250508190555080915050919050565b611fa761262f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561200c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806006600061201961262f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120c661262f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161210b919061391c565b60405180910390a35050565b60006001600b546121289190614315565b600e5414905090565b600c6020528060005260406000206000915090505481565b6121548484846126e9565b61216084848484612fa9565b612196576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606121a7826125c7565b6121dd576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006121e7613128565b90506000815114156122085760405180602001604052806000815250612233565b80612212846131ba565b60405160200161222392919061489f565b6040516020818303038152906040525b915050919050565b600080600080600080600e54119450612252612117565b935061225c611cfa565b92506010549150601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905091939590929450565b60096020528060005260406000206000915090505481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61236261262f565b73ffffffffffffffffffffffffffffffffffffffff16612380611d17565b73ffffffffffffffffffffffffffffffffffffffff16146123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd9061425a565b60405180910390fd5b600b54821061241a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612411906142c6565b60405180910390fd5b80600c6000848152602001908152602001600020819055505050565b61243e61262f565b73ffffffffffffffffffffffffffffffffffffffff1661245c611d17565b73ffffffffffffffffffffffffffffffffffffffff16146124b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a99061425a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251990614935565b60405180910390fd5b61252b81612ee3565b50565b600b5481565b60105481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612628575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006126f482612c3b565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661271b61262f565b73ffffffffffffffffffffffffffffffffffffffff16148061274e575061274d826000015161274861262f565b6122c6565b5b80612793575061275c61262f565b73ffffffffffffffffffffffffffffffffffffffff1661277b84610c62565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806127cc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612835576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561289c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128a9858585600161331b565b6128b96000848460000151612637565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b965760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612b955782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bff8585856001613321565b5050505050565b600082612c138584613327565b1490509392505050565b612c378282604051806020016040528060008152506133da565b5050565b612c43613808565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612eac576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612eaa57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d8e578092505050612ede565b5b600115612ea957818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ea4578092505050612ede565b612d8f565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612fca8473ffffffffffffffffffffffffffffffffffffffff1661253a565b1561311b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ff361262f565b8786866040518563ffffffff1660e01b815260040161301594939291906149aa565b6020604051808303816000875af192505050801561305157506040513d601f19601f8201168201806040525081019061304e9190614a0b565b60015b6130cb573d8060008114613081576040519150601f19603f3d011682016040523d82523d6000602084013e613086565b606091505b506000815114156130c3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613120565b600190505b949350505050565b6060600f8054613137906141dc565b80601f0160208091040260200160405190810160405280929190818152602001828054613163906141dc565b80156131b05780601f10613185576101008083540402835291602001916131b0565b820191906000526020600020905b81548152906001019060200180831161319357829003601f168201915b5050505050905090565b60606000821415613202576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613316565b600082905060005b6000821461323457808061321d906147ae565b915050600a8261322d9190614a67565b915061320a565b60008167ffffffffffffffff8111156132505761324f613c6c565b5b6040519080825280601f01601f1916602001820160405280156132825781602001600182028036833780820191505090505b5090505b6000851461330f5760018261329b9190614315565b9150600a856132aa9190614a98565b60306132b69190614758565b60f81b8183815181106132cc576132cb614ac9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133089190614a67565b9450613286565b8093505050505b919050565b50505050565b50505050565b60008082905060005b84518110156133cf57600085828151811061334e5761334d614ac9565b5b6020026020010151905080831161338f578281604051602001613372929190614b19565b6040516020818303038152906040528051906020012092506133bb565b80836040516020016133a2929190614b19565b6040516020818303038152906040528051906020012092505b5080806133c7906147ae565b915050613330565b508091505092915050565b6133e783838360016133ec565b505050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613487576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156134c2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134cf600086838761331b565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561373457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156136e857506136e66000888488612fa9565b155b1561371f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505061366d565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505061377b6000868387613321565b5050505050565b82805461378e906141dc565b90600052602060002090601f0160209004810192826137b057600085556137f7565b82601f106137c957803560ff19168380011785556137f7565b828001600101855582156137f7579182015b828111156137f65782358255916020019190600101906137db565b5b509050613804919061384b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561386457600081600090555060010161384c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138b18161387c565b81146138bc57600080fd5b50565b6000813590506138ce816138a8565b92915050565b6000602082840312156138ea576138e9613872565b5b60006138f8848285016138bf565b91505092915050565b60008115159050919050565b61391681613901565b82525050565b6000602082019050613931600083018461390d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613971578082015181840152602081019050613956565b83811115613980576000848401525b50505050565b6000601f19601f8301169050919050565b60006139a282613937565b6139ac8185613942565b93506139bc818560208601613953565b6139c581613986565b840191505092915050565b600060208201905081810360008301526139ea8184613997565b905092915050565b6000819050919050565b613a05816139f2565b8114613a1057600080fd5b50565b600081359050613a22816139fc565b92915050565b600060208284031215613a3e57613a3d613872565b5b6000613a4c84828501613a13565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a8082613a55565b9050919050565b613a9081613a75565b82525050565b6000602082019050613aab6000830184613a87565b92915050565b613aba81613a75565b8114613ac557600080fd5b50565b600081359050613ad781613ab1565b92915050565b60008060408385031215613af457613af3613872565b5b6000613b0285828601613ac8565b9250506020613b1385828601613a13565b9150509250929050565b60008060408385031215613b3457613b33613872565b5b6000613b4285828601613a13565b9250506020613b5385828601613a13565b9150509250929050565b613b66816139f2565b82525050565b6000602082019050613b816000830184613b5d565b92915050565b600060208284031215613b9d57613b9c613872565b5b6000613bab84828501613ac8565b91505092915050565b600080600060608486031215613bcd57613bcc613872565b5b6000613bdb86828701613ac8565b9350506020613bec86828701613ac8565b9250506040613bfd86828701613a13565b9150509250925092565b6000819050919050565b613c1a81613c07565b82525050565b6000602082019050613c356000830184613c11565b92915050565b613c4481613c07565b8114613c4f57600080fd5b50565b600081359050613c6181613c3b565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ca482613986565b810181811067ffffffffffffffff82111715613cc357613cc2613c6c565b5b80604052505050565b6000613cd6613868565b9050613ce28282613c9b565b919050565b600067ffffffffffffffff821115613d0257613d01613c6c565b5b602082029050602081019050919050565b600080fd5b6000613d2b613d2684613ce7565b613ccc565b90508083825260208201905060208402830185811115613d4e57613d4d613d13565b5b835b81811015613d775780613d638882613c52565b845260208401935050602081019050613d50565b5050509392505050565b600082601f830112613d9657613d95613c67565b5b8135613da6848260208601613d18565b91505092915050565b600080600060608486031215613dc857613dc7613872565b5b6000613dd686828701613c52565b9350506020613de786828701613c52565b925050604084013567ffffffffffffffff811115613e0857613e07613877565b5b613e1486828701613d81565b9150509250925092565b600080fd5b60008083601f840112613e3957613e38613c67565b5b8235905067ffffffffffffffff811115613e5657613e55613e1e565b5b602083019150836001820283011115613e7257613e71613d13565b5b9250929050565b60008060208385031215613e9057613e8f613872565b5b600083013567ffffffffffffffff811115613eae57613ead613877565b5b613eba85828601613e23565b92509250509250929050565b60008060008060808587031215613ee057613edf613872565b5b6000613eee87828801613a13565b9450506020613eff87828801613a13565b9350506040613f1087828801613c52565b925050606085013567ffffffffffffffff811115613f3157613f30613877565b5b613f3d87828801613d81565b91505092959194509250565b600060208284031215613f5f57613f5e613872565b5b6000613f6d84828501613c52565b91505092915050565b613f7f81613901565b8114613f8a57600080fd5b50565b600081359050613f9c81613f76565b92915050565b60008060408385031215613fb957613fb8613872565b5b6000613fc785828601613ac8565b9250506020613fd885828601613f8d565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561400257614001613c6c565b5b61400b82613986565b9050602081019050919050565b82818337600083830152505050565b600061403a61403584613fe7565b613ccc565b90508281526020810184848401111561405657614055613fe2565b5b614061848285614018565b509392505050565b600082601f83011261407e5761407d613c67565b5b813561408e848260208601614027565b91505092915050565b600080600080608085870312156140b1576140b0613872565b5b60006140bf87828801613ac8565b94505060206140d087828801613ac8565b93505060406140e187828801613a13565b925050606085013567ffffffffffffffff81111561410257614101613877565b5b61410e87828801614069565b91505092959194509250565b600060a08201905061412f600083018861390d565b61413c602083018761390d565b6141496040830186613b5d565b6141566060830185613b5d565b6141636080830184613b5d565b9695505050505050565b6000806040838503121561418457614183613872565b5b600061419285828601613ac8565b92505060206141a385828601613ac8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141f457607f821691505b60208210811415614208576142076141ad565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614244602083613942565b915061424f8261420e565b602082019050919050565b6000602082019050818103600083015261427381614237565b9050919050565b7f537461676520646f6573206e6f74206578697374000000000000000000000000600082015250565b60006142b0601483613942565b91506142bb8261427a565b602082019050919050565b600060208201905081810360008301526142df816142a3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614320826139f2565b915061432b836139f2565b92508282101561433e5761433d6142e6565b5b828203905092915050565b7f4e6f7420612076616c6964206c65616620696e20746865204d65726b6c65207460008201527f7265650000000000000000000000000000000000000000000000000000000000602082015250565b60006143a5602383613942565b91506143b082614349565b604082019050919050565b600060208201905081810360008301526143d481614398565b9050919050565b7f43616e2774206d696e74206d6f7265207468616e2063757272656e742073746160008201527f676520616c6c6f636174696f6e00000000000000000000000000000000000000602082015250565b6000614437602d83613942565b9150614442826143db565b604082019050919050565b600060208201905081810360008301526144668161442a565b9050919050565b60008160601b9050919050565b60006144858261446d565b9050919050565b60006144978261447a565b9050919050565b6144af6144aa82613a75565b61448c565b82525050565b6000819050919050565b6144d06144cb826139f2565b6144b5565b82525050565b60006144e2828561449e565b6014820191506144f282846144bf565b6020820191508190509392505050565b7f53656e64657220616e6420616d6f756e7420646f6e2774206d61746368204d6560008201527f726b6c65206c6561660000000000000000000000000000000000000000000000602082015250565b600061455e602983613942565b915061456982614502565b604082019050919050565b6000602082019050818103600083015261458d81614551565b9050919050565b7f43616e2774206d696e74207a65726f0000000000000000000000000000000000600082015250565b60006145ca600f83613942565b91506145d582614594565b602082019050919050565b600060208201905081810360008301526145f9816145bd565b9050919050565b600061460b826139f2565b9150614616836139f2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561464f5761464e6142e6565b5b828202905092915050565b7f496e636f7272656374204554482073656e740000000000000000000000000000600082015250565b6000614690601283613942565b915061469b8261465a565b602082019050919050565b600060208201905081810360008301526146bf81614683565b9050919050565b7f43616e2774206d696e74206d6f7265207468616e2072656d61696e696e67206160008201527f6c6c6f636174696f6e0000000000000000000000000000000000000000000000602082015250565b6000614722602983613942565b915061472d826146c6565b604082019050919050565b6000602082019050818103600083015261475181614715565b9050919050565b6000614763826139f2565b915061476e836139f2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147a3576147a26142e6565b5b828201905092915050565b60006147b9826139f2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147ec576147eb6142e6565b5b600182019050919050565b7f5075626c69632053616c65206973206e6f74204c697665207965740000000000600082015250565b600061482d601b83613942565b9150614838826147f7565b602082019050919050565b6000602082019050818103600083015261485c81614820565b9050919050565b600081905092915050565b600061487982613937565b6148838185614863565b9350614893818560208601613953565b80840191505092915050565b60006148ab828561486e565b91506148b7828461486e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061491f602683613942565b915061492a826148c3565b604082019050919050565b6000602082019050818103600083015261494e81614912565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061497c82614955565b6149868185614960565b9350614996818560208601613953565b61499f81613986565b840191505092915050565b60006080820190506149bf6000830187613a87565b6149cc6020830186613a87565b6149d96040830185613b5d565b81810360608301526149eb8184614971565b905095945050505050565b600081519050614a05816138a8565b92915050565b600060208284031215614a2157614a20613872565b5b6000614a2f848285016149f6565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a72826139f2565b9150614a7d836139f2565b925082614a8d57614a8c614a38565b5b828204905092915050565b6000614aa3826139f2565b9150614aae836139f2565b925082614abe57614abd614a38565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b614b13614b0e82613c07565b614af8565b82525050565b6000614b258285614b02565b602082019150614b358284614b02565b602082019150819050939250505056fea2646970667358221220cd0f73459f488c48eb443b83685f80164f3e24a76f476670246180ce023c3f1d64736f6c634300080c0033697066733a2f2f516d61357078697546656b53356467746d506d35716f416234454d4e6757675553597244736e7754775763356b5a2f
Deployed Bytecode
0x6080604052600436106102675760003560e01c80636352211e11610144578063a5a865dc116100b6578063e63ec9471161007a578063e63ec94714610964578063e985e9c5146109a1578063eb685c47146109de578063f2fde38b14610a07578063f33261ac14610a30578063fa1a5f5914610a5b57610267565b8063a5a865dc14610855578063accb8a0e14610880578063b88d4fde146108bd578063c87b56dd146108e6578063cd481e511461092357610267565b80637ff9b596116101085780637ff9b596146107645780638da5cb5b1461078f5780639508614b146107ba57806395d89b41146107d1578063a0712d68146107fc578063a22cb4651461082c57610267565b80636352211e1461067f57806368fc68c7146106bc57806370a08231146106e7578063715018a6146107245780637cb647591461073b57610267565b80633423e548116101dd5780634e99b800116101a15780634e99b8001461056a5780634f6ccce714610595578063522fe98e146105d257806355f804b31461060f5780635bf5d54c146106385780635bfe024d1461066357610267565b80633423e5481461049957806338c67b73146104d65780633ccfd60b146104ff57806342842e0e146105165780634d8fae951461053f57610267565b806318160ddd1161022f57806318160ddd1461036357806321328f9e1461038e57806323b872dd146103cb5780632eb4a7ab146103f45780632f745c591461041f578063324c93801461045c57610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b3146103115780630e4be24c1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906138d4565b610a86565b6040516102a0919061391c565b60405180910390f35b3480156102b557600080fd5b506102be610bd0565b6040516102cb91906139d0565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190613a28565b610c62565b6040516103089190613a96565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190613add565b610cde565b005b34801561034657600080fd5b50610361600480360381019061035c9190613b1d565b610de9565b005b34801561036f57600080fd5b50610378610ec5565b6040516103859190613b6c565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613b87565b610f1a565b6040516103c2919061391c565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613bb4565b610f3a565b005b34801561040057600080fd5b50610409610f4a565b6040516104169190613c20565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190613add565b610f50565b6040516104539190613b6c565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190613a28565b611157565b6040516104909190613b6c565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190613daf565b61116f565b6040516104cd919061391c565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190613a28565b611185565b005b34801561050b57600080fd5b50610514611286565b005b34801561052257600080fd5b5061053d60048036038101906105389190613bb4565b611342565b005b34801561054b57600080fd5b50610554611362565b6040516105619190613b6c565b60405180910390f35b34801561057657600080fd5b5061057f611374565b60405161058c91906139d0565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190613a28565b611402565b6040516105c99190613b6c565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190613b87565b611573565b6040516106069190613b6c565b60405180910390f35b34801561061b57600080fd5b5061063660048036038101906106319190613e79565b61158b565b005b34801561064457600080fd5b5061064d61161d565b60405161065a9190613b6c565b60405180910390f35b61067d60048036038101906106789190613ec6565b611623565b005b34801561068b57600080fd5b506106a660048036038101906106a19190613a28565b611b01565b6040516106b39190613a96565b60405180910390f35b3480156106c857600080fd5b506106d1611b17565b6040516106de9190613b6c565b60405180910390f35b3480156106f357600080fd5b5061070e60048036038101906107099190613b87565b611b1c565b60405161071b9190613b6c565b60405180910390f35b34801561073057600080fd5b50610739611bec565b005b34801561074757600080fd5b50610762600480360381019061075d9190613f49565b611c74565b005b34801561077057600080fd5b50610779611cfa565b6040516107869190613b6c565b60405180910390f35b34801561079b57600080fd5b506107a4611d17565b6040516107b19190613a96565b60405180910390f35b3480156107c657600080fd5b506107cf611d41565b005b3480156107dd57600080fd5b506107e6611dd7565b6040516107f391906139d0565b60405180910390f35b61081660048036038101906108119190613a28565b611e69565b6040516108239190613b6c565b60405180910390f35b34801561083857600080fd5b50610853600480360381019061084e9190613fa2565b611f9f565b005b34801561086157600080fd5b5061086a612117565b604051610877919061391c565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a29190613a28565b612131565b6040516108b49190613b6c565b60405180910390f35b3480156108c957600080fd5b506108e460048036038101906108df9190614097565b612149565b005b3480156108f257600080fd5b5061090d60048036038101906109089190613a28565b61219c565b60405161091a91906139d0565b60405180910390f35b34801561092f57600080fd5b5061094a60048036038101906109459190613b87565b61223b565b60405161095b95949392919061411a565b60405180910390f35b34801561097057600080fd5b5061098b60048036038101906109869190613b87565b6122ae565b6040516109989190613b6c565b60405180910390f35b3480156109ad57600080fd5b506109c860048036038101906109c3919061416d565b6122c6565b6040516109d5919061391c565b60405180910390f35b3480156109ea57600080fd5b50610a056004803603810190610a009190613b1d565b61235a565b005b348015610a1357600080fd5b50610a2e6004803603810190610a299190613b87565b612436565b005b348015610a3c57600080fd5b50610a4561252e565b604051610a529190613b6c565b60405180910390f35b348015610a6757600080fd5b50610a70612534565b604051610a7d9190613b6c565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b5157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bb957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bc95750610bc88261255d565b5b9050919050565b606060018054610bdf906141dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0b906141dc565b8015610c585780601f10610c2d57610100808354040283529160200191610c58565b820191906000526020600020905b815481529060010190602001808311610c3b57829003601f168201915b5050505050905090565b6000610c6d826125c7565b610ca3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ce982611b01565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d51576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d7061262f565b73ffffffffffffffffffffffffffffffffffffffff1614158015610da25750610da081610d9b61262f565b6122c6565b155b15610dd9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610de4838383612637565b505050565b610df161262f565b73ffffffffffffffffffffffffffffffffffffffff16610e0f611d17565b73ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c9061425a565b60405180910390fd5b600b548210610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea0906142c6565b60405180910390fd5b80600d6000848152602001908152602001600020819055505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b600a6020528060005260406000206000915054906101000a900460ff1681565b610f458383836126e9565b505050565b60085481565b6000610f5b83611b1c565b8210610f93576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b8381101561114b576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156110aa575061113e565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146110ea57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561113c5786841415611133578195505050505050611151565b83806001019450505b505b8080600101915050610fcd565b50600080fd5b92915050565b600d6020528060005260406000206000915090505481565b600061117c828585612c06565b90509392505050565b61118d61262f565b73ffffffffffffffffffffffffffffffffffffffff166111ab611d17565b73ffffffffffffffffffffffffffffffffffffffff1614611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f89061425a565b60405180910390fd5b600b548110611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c906142c6565b60405180910390fd5b80600e819055507fe60489330e0c790e7badc1c781852c966955637b85dae070a5e8c9dd84f99ea48160405161127b9190613b6c565b60405180910390a150565b61128e61262f565b73ffffffffffffffffffffffffffffffffffffffff166112ac611d17565b73ffffffffffffffffffffffffffffffffffffffff1614611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f99061425a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061134057600080fd5b565b61135d83838360405180602001604052806000815250612149565b505050565b60146102dd6113719190614315565b81565b600f8054611381906141dc565b80601f01602080910402602001604051908101604052809291908181526020018280546113ad906141dc565b80156113fa5780601f106113cf576101008083540402835291602001916113fa565b820191906000526020600020905b8154815290600101906020018083116113dd57829003601f168201915b505050505081565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b8281101561153b576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161152d5785831415611524578194505050505061156e565b82806001019350505b50808060010191505061143a565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60116020528060005260406000206000915090505481565b61159361262f565b73ffffffffffffffffffffffffffffffffffffffff166115b1611d17565b73ffffffffffffffffffffffffffffffffffffffff1614611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fe9061425a565b60405180910390fd5b8181600f9190611618929190613782565b505050565b600e5481565b611630600854838361116f565b61166f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611666906143bb565b60405180910390fd5b600d6000600e548152602001908152602001600020548411156116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be9061444d565b60405180910390fd5b8133846040516020016116db9291906144d6565b6040516020818303038152906040528051906020012014611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890614574565b60405180910390fd5b6001600e541161179357600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561179257600080fd5b5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611885576001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611912565b82600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156119115782600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b60008411611955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194c906145e0565b60405180910390fd5b8361195e611cfa565b6119689190614600565b3410156119aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a1906146a6565b60405180910390fd5b83600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390614738565b60405180910390fd5b83600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a7b9190614315565b92505081905550611a8c3385612c1d565b83601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611adb9190614758565b925050819055508360106000828254611af49190614758565b9250508190555050505050565b6000611b0c82612c3b565b600001519050919050565b601481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b84576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611bf461262f565b73ffffffffffffffffffffffffffffffffffffffff16611c12611d17565b73ffffffffffffffffffffffffffffffffffffffff1614611c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5f9061425a565b60405180910390fd5b611c726000612ee3565b565b611c7c61262f565b73ffffffffffffffffffffffffffffffffffffffff16611c9a611d17565b73ffffffffffffffffffffffffffffffffffffffff1614611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce79061425a565b60405180910390fd5b8060088190555050565b6000600c6000600e54815260200190815260200160002054905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d4961262f565b73ffffffffffffffffffffffffffffffffffffffff16611d67611d17565b73ffffffffffffffffffffffffffffffffffffffff1614611dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db49061425a565b60405180910390fd5b600b6000815480929190611dd0906147ae565b9190505550565b606060028054611de6906141dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611e12906141dc565b8015611e5f5780601f10611e3457610100808354040283529160200191611e5f565b820191906000526020600020905b815481529060010190602001808311611e4257829003601f168201915b5050505050905090565b600081611e74611cfa565b611e7e9190614600565b3414611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb6906146a6565b60405180910390fd5b6001600b54611ece9190614315565b600e5414611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890614843565b60405180910390fd5b6000611f1b610ec5565b9050611f273384612c1d565b82601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f769190614758565b925050819055508260106000828254611f8f9190614758565b9250508190555080915050919050565b611fa761262f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561200c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806006600061201961262f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120c661262f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161210b919061391c565b60405180910390a35050565b60006001600b546121289190614315565b600e5414905090565b600c6020528060005260406000206000915090505481565b6121548484846126e9565b61216084848484612fa9565b612196576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606121a7826125c7565b6121dd576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006121e7613128565b90506000815114156122085760405180602001604052806000815250612233565b80612212846131ba565b60405160200161222392919061489f565b6040516020818303038152906040525b915050919050565b600080600080600080600e54119450612252612117565b935061225c611cfa565b92506010549150601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905091939590929450565b60096020528060005260406000206000915090505481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61236261262f565b73ffffffffffffffffffffffffffffffffffffffff16612380611d17565b73ffffffffffffffffffffffffffffffffffffffff16146123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd9061425a565b60405180910390fd5b600b54821061241a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612411906142c6565b60405180910390fd5b80600c6000848152602001908152602001600020819055505050565b61243e61262f565b73ffffffffffffffffffffffffffffffffffffffff1661245c611d17565b73ffffffffffffffffffffffffffffffffffffffff16146124b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a99061425a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251990614935565b60405180910390fd5b61252b81612ee3565b50565b600b5481565b60105481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612628575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006126f482612c3b565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661271b61262f565b73ffffffffffffffffffffffffffffffffffffffff16148061274e575061274d826000015161274861262f565b6122c6565b5b80612793575061275c61262f565b73ffffffffffffffffffffffffffffffffffffffff1661277b84610c62565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806127cc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612835576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561289c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128a9858585600161331b565b6128b96000848460000151612637565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b965760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612b955782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bff8585856001613321565b5050505050565b600082612c138584613327565b1490509392505050565b612c378282604051806020016040528060008152506133da565b5050565b612c43613808565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612eac576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612eaa57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d8e578092505050612ede565b5b600115612ea957818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ea4578092505050612ede565b612d8f565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612fca8473ffffffffffffffffffffffffffffffffffffffff1661253a565b1561311b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ff361262f565b8786866040518563ffffffff1660e01b815260040161301594939291906149aa565b6020604051808303816000875af192505050801561305157506040513d601f19601f8201168201806040525081019061304e9190614a0b565b60015b6130cb573d8060008114613081576040519150601f19603f3d011682016040523d82523d6000602084013e613086565b606091505b506000815114156130c3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613120565b600190505b949350505050565b6060600f8054613137906141dc565b80601f0160208091040260200160405190810160405280929190818152602001828054613163906141dc565b80156131b05780601f10613185576101008083540402835291602001916131b0565b820191906000526020600020905b81548152906001019060200180831161319357829003601f168201915b5050505050905090565b60606000821415613202576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613316565b600082905060005b6000821461323457808061321d906147ae565b915050600a8261322d9190614a67565b915061320a565b60008167ffffffffffffffff8111156132505761324f613c6c565b5b6040519080825280601f01601f1916602001820160405280156132825781602001600182028036833780820191505090505b5090505b6000851461330f5760018261329b9190614315565b9150600a856132aa9190614a98565b60306132b69190614758565b60f81b8183815181106132cc576132cb614ac9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133089190614a67565b9450613286565b8093505050505b919050565b50505050565b50505050565b60008082905060005b84518110156133cf57600085828151811061334e5761334d614ac9565b5b6020026020010151905080831161338f578281604051602001613372929190614b19565b6040516020818303038152906040528051906020012092506133bb565b80836040516020016133a2929190614b19565b6040516020818303038152906040528051906020012092505b5080806133c7906147ae565b915050613330565b508091505092915050565b6133e783838360016133ec565b505050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613487576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156134c2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134cf600086838761331b565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561373457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156136e857506136e66000888488612fa9565b155b1561371f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505061366d565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505061377b6000868387613321565b5050505050565b82805461378e906141dc565b90600052602060002090601f0160209004810192826137b057600085556137f7565b82601f106137c957803560ff19168380011785556137f7565b828001600101855582156137f7579182015b828111156137f65782358255916020019190600101906137db565b5b509050613804919061384b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561386457600081600090555060010161384c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138b18161387c565b81146138bc57600080fd5b50565b6000813590506138ce816138a8565b92915050565b6000602082840312156138ea576138e9613872565b5b60006138f8848285016138bf565b91505092915050565b60008115159050919050565b61391681613901565b82525050565b6000602082019050613931600083018461390d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613971578082015181840152602081019050613956565b83811115613980576000848401525b50505050565b6000601f19601f8301169050919050565b60006139a282613937565b6139ac8185613942565b93506139bc818560208601613953565b6139c581613986565b840191505092915050565b600060208201905081810360008301526139ea8184613997565b905092915050565b6000819050919050565b613a05816139f2565b8114613a1057600080fd5b50565b600081359050613a22816139fc565b92915050565b600060208284031215613a3e57613a3d613872565b5b6000613a4c84828501613a13565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a8082613a55565b9050919050565b613a9081613a75565b82525050565b6000602082019050613aab6000830184613a87565b92915050565b613aba81613a75565b8114613ac557600080fd5b50565b600081359050613ad781613ab1565b92915050565b60008060408385031215613af457613af3613872565b5b6000613b0285828601613ac8565b9250506020613b1385828601613a13565b9150509250929050565b60008060408385031215613b3457613b33613872565b5b6000613b4285828601613a13565b9250506020613b5385828601613a13565b9150509250929050565b613b66816139f2565b82525050565b6000602082019050613b816000830184613b5d565b92915050565b600060208284031215613b9d57613b9c613872565b5b6000613bab84828501613ac8565b91505092915050565b600080600060608486031215613bcd57613bcc613872565b5b6000613bdb86828701613ac8565b9350506020613bec86828701613ac8565b9250506040613bfd86828701613a13565b9150509250925092565b6000819050919050565b613c1a81613c07565b82525050565b6000602082019050613c356000830184613c11565b92915050565b613c4481613c07565b8114613c4f57600080fd5b50565b600081359050613c6181613c3b565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ca482613986565b810181811067ffffffffffffffff82111715613cc357613cc2613c6c565b5b80604052505050565b6000613cd6613868565b9050613ce28282613c9b565b919050565b600067ffffffffffffffff821115613d0257613d01613c6c565b5b602082029050602081019050919050565b600080fd5b6000613d2b613d2684613ce7565b613ccc565b90508083825260208201905060208402830185811115613d4e57613d4d613d13565b5b835b81811015613d775780613d638882613c52565b845260208401935050602081019050613d50565b5050509392505050565b600082601f830112613d9657613d95613c67565b5b8135613da6848260208601613d18565b91505092915050565b600080600060608486031215613dc857613dc7613872565b5b6000613dd686828701613c52565b9350506020613de786828701613c52565b925050604084013567ffffffffffffffff811115613e0857613e07613877565b5b613e1486828701613d81565b9150509250925092565b600080fd5b60008083601f840112613e3957613e38613c67565b5b8235905067ffffffffffffffff811115613e5657613e55613e1e565b5b602083019150836001820283011115613e7257613e71613d13565b5b9250929050565b60008060208385031215613e9057613e8f613872565b5b600083013567ffffffffffffffff811115613eae57613ead613877565b5b613eba85828601613e23565b92509250509250929050565b60008060008060808587031215613ee057613edf613872565b5b6000613eee87828801613a13565b9450506020613eff87828801613a13565b9350506040613f1087828801613c52565b925050606085013567ffffffffffffffff811115613f3157613f30613877565b5b613f3d87828801613d81565b91505092959194509250565b600060208284031215613f5f57613f5e613872565b5b6000613f6d84828501613c52565b91505092915050565b613f7f81613901565b8114613f8a57600080fd5b50565b600081359050613f9c81613f76565b92915050565b60008060408385031215613fb957613fb8613872565b5b6000613fc785828601613ac8565b9250506020613fd885828601613f8d565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561400257614001613c6c565b5b61400b82613986565b9050602081019050919050565b82818337600083830152505050565b600061403a61403584613fe7565b613ccc565b90508281526020810184848401111561405657614055613fe2565b5b614061848285614018565b509392505050565b600082601f83011261407e5761407d613c67565b5b813561408e848260208601614027565b91505092915050565b600080600080608085870312156140b1576140b0613872565b5b60006140bf87828801613ac8565b94505060206140d087828801613ac8565b93505060406140e187828801613a13565b925050606085013567ffffffffffffffff81111561410257614101613877565b5b61410e87828801614069565b91505092959194509250565b600060a08201905061412f600083018861390d565b61413c602083018761390d565b6141496040830186613b5d565b6141566060830185613b5d565b6141636080830184613b5d565b9695505050505050565b6000806040838503121561418457614183613872565b5b600061419285828601613ac8565b92505060206141a385828601613ac8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141f457607f821691505b60208210811415614208576142076141ad565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614244602083613942565b915061424f8261420e565b602082019050919050565b6000602082019050818103600083015261427381614237565b9050919050565b7f537461676520646f6573206e6f74206578697374000000000000000000000000600082015250565b60006142b0601483613942565b91506142bb8261427a565b602082019050919050565b600060208201905081810360008301526142df816142a3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614320826139f2565b915061432b836139f2565b92508282101561433e5761433d6142e6565b5b828203905092915050565b7f4e6f7420612076616c6964206c65616620696e20746865204d65726b6c65207460008201527f7265650000000000000000000000000000000000000000000000000000000000602082015250565b60006143a5602383613942565b91506143b082614349565b604082019050919050565b600060208201905081810360008301526143d481614398565b9050919050565b7f43616e2774206d696e74206d6f7265207468616e2063757272656e742073746160008201527f676520616c6c6f636174696f6e00000000000000000000000000000000000000602082015250565b6000614437602d83613942565b9150614442826143db565b604082019050919050565b600060208201905081810360008301526144668161442a565b9050919050565b60008160601b9050919050565b60006144858261446d565b9050919050565b60006144978261447a565b9050919050565b6144af6144aa82613a75565b61448c565b82525050565b6000819050919050565b6144d06144cb826139f2565b6144b5565b82525050565b60006144e2828561449e565b6014820191506144f282846144bf565b6020820191508190509392505050565b7f53656e64657220616e6420616d6f756e7420646f6e2774206d61746368204d6560008201527f726b6c65206c6561660000000000000000000000000000000000000000000000602082015250565b600061455e602983613942565b915061456982614502565b604082019050919050565b6000602082019050818103600083015261458d81614551565b9050919050565b7f43616e2774206d696e74207a65726f0000000000000000000000000000000000600082015250565b60006145ca600f83613942565b91506145d582614594565b602082019050919050565b600060208201905081810360008301526145f9816145bd565b9050919050565b600061460b826139f2565b9150614616836139f2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561464f5761464e6142e6565b5b828202905092915050565b7f496e636f7272656374204554482073656e740000000000000000000000000000600082015250565b6000614690601283613942565b915061469b8261465a565b602082019050919050565b600060208201905081810360008301526146bf81614683565b9050919050565b7f43616e2774206d696e74206d6f7265207468616e2072656d61696e696e67206160008201527f6c6c6f636174696f6e0000000000000000000000000000000000000000000000602082015250565b6000614722602983613942565b915061472d826146c6565b604082019050919050565b6000602082019050818103600083015261475181614715565b9050919050565b6000614763826139f2565b915061476e836139f2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147a3576147a26142e6565b5b828201905092915050565b60006147b9826139f2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147ec576147eb6142e6565b5b600182019050919050565b7f5075626c69632053616c65206973206e6f74204c697665207965740000000000600082015250565b600061482d601b83613942565b9150614838826147f7565b602082019050919050565b6000602082019050818103600083015261485c81614820565b9050919050565b600081905092915050565b600061487982613937565b6148838185614863565b9350614893818560208601613953565b80840191505092915050565b60006148ab828561486e565b91506148b7828461486e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061491f602683613942565b915061492a826148c3565b604082019050919050565b6000602082019050818103600083015261494e81614912565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061497c82614955565b6149868185614960565b9350614996818560208601613953565b61499f81613986565b840191505092915050565b60006080820190506149bf6000830187613a87565b6149cc6020830186613a87565b6149d96040830185613b5d565b81810360608301526149eb8184614971565b905095945050505050565b600081519050614a05816138a8565b92915050565b600060208284031215614a2157614a20613872565b5b6000614a2f848285016149f6565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a72826139f2565b9150614a7d836139f2565b925082614a8d57614a8c614a38565b5b828204905092915050565b6000614aa3826139f2565b9150614aae836139f2565b925082614abe57614abd614a38565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b614b13614b0e82613c07565b614af8565b82525050565b6000614b258285614b02565b602082019150614b358284614b02565b602082019150819050939250505056fea2646970667358221220cd0f73459f488c48eb443b83685f80164f3e24a76f476670246180ce023c3f1d64736f6c634300080c0033
Deployed Bytecode Sourcemap
38613:5968:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22151:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24761:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26264:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25827:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40656:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19384:280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39013:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27121:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38738:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20972:1107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39680:60;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43952:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40862:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44464:114;;;;;;;;;;;;;:::i;:::-;;27362:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39172:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39793:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19957:715;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39923:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44359:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39747:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42394:1550;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24570:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39121:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22587:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5307:105;;;;;;;;;;;;;:::i;:::-;;44122:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41380:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4656:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41061:70;;;;;;;;;;;;;:::i;:::-;;24930:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41973:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26540:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41259:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39622:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27618:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25105:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41504:461;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;38853:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26890:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40468:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5567:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39244:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39887;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22151:372;22253:4;22305:25;22290:40;;;:11;:40;;;;:105;;;;22362:33;22347:48;;;:11;:48;;;;22290:105;:172;;;;22427:35;22412:50;;;:11;:50;;;;22290:172;:225;;;;22479:36;22503:11;22479:23;:36::i;:::-;22290:225;22270:245;;22151:372;;;:::o;24761:100::-;24815:13;24848:5;24841:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24761:100;:::o;26264:204::-;26332:7;26357:16;26365:7;26357;:16::i;:::-;26352:64;;26382:34;;;;;;;;;;;;;;26352:64;26436:15;:24;26452:7;26436:24;;;;;;;;;;;;;;;;;;;;;26429:31;;26264:204;;;:::o;25827:371::-;25900:13;25916:24;25932:7;25916:15;:24::i;:::-;25900:40;;25961:5;25955:11;;:2;:11;;;25951:48;;;25975:24;;;;;;;;;;;;;;25951:48;26032:5;26016:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;26042:37;26059:5;26066:12;:10;:12::i;:::-;26042:16;:37::i;:::-;26041:38;26016:63;26012:138;;;26103:35;;;;;;;;;;;;;;26012:138;26162:28;26171:2;26175:7;26184:5;26162:8;:28::i;:::-;25889:309;25827:371;;:::o;40656:198::-;4887:12;:10;:12::i;:::-;4876:23;;:7;:5;:7::i;:::-;:23;;;4868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40762:10:::1;;40754:5;:18;40746:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;40843:3;40808:25;:32;40834:5;40808:32;;;;;;;;;;;:38;;;;40656:198:::0;;:::o;19384:280::-;19437:7;19629:12;;;;;;;;;;;19613:13;;;;;;;;;;:28;19606:35;;;;19384:280;:::o;39013:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;27121:170::-;27255:28;27265:4;27271:2;27275:7;27255:9;:28::i;:::-;27121:170;;;:::o;38738:30::-;;;;:::o;20972:1107::-;21063:7;21096:16;21106:5;21096:9;:16::i;:::-;21087:5;:25;21083:61;;21121:23;;;;;;;;;;;;;;21083:61;21155:22;21180:13;;;;;;;;;;;21155:38;;;;21204:19;21234:25;21435:9;21430:557;21450:14;21446:1;:18;21430:557;;;21490:31;21524:11;:14;21536:1;21524:14;;;;;;;;;;;21490:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21561:9;:16;;;21557:73;;;21602:8;;;21557:73;21678:1;21652:28;;:9;:14;;;:28;;;21648:111;;21725:9;:14;;;21705:34;;21648:111;21802:5;21781:26;;:17;:26;;;21777:195;;;21851:5;21836:11;:20;21832:85;;;21892:1;21885:8;;;;;;;;;21832:85;21939:13;;;;;;;21777:195;21471:516;21430:557;21466:3;;;;;;;21430:557;;;;22063:8;;;20972:1107;;;;;:::o;39680:60::-;;;;;;;;;;;;;;;;;:::o;43952:158::-;44041:4;44065:37;44084:5;44091:4;44097;44065:18;:37::i;:::-;44058:44;;43952:158;;;;;:::o;40862:191::-;4887:12;:10;:12::i;:::-;4876:23;;:7;:5;:7::i;:::-;:23;;;4868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40944:10:::1;;40938:3;:16;40930:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;41005:3;40990:12;:18;;;;41024:21;41041:3;41024:21;;;;;;:::i;:::-;;;;;;;;40862:191:::0;:::o;44464:114::-;4887:12;:10;:12::i;:::-;4876:23;;:7;:5;:7::i;:::-;:23;;;4868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44530:10:::1;44522:24;;:47;44547:21;44522:47;;;;;;;;;;;;;;;;;;;;;;;44514:56;;;::::0;::::1;;44464:114::o:0;27362:185::-;27500:39;27517:4;27523:2;27527:7;27500:39;;;;;;;;;;;;:16;:39::i;:::-;27362:185;;;:::o;39172:63::-;39163:2;39214:3;:21;;;;:::i;:::-;39172:63;:::o;39793:85::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19957:715::-;20026:7;20046:22;20071:13;;;;;;;;;;20046:38;;;;20095:19;20290:9;20285:328;20305:14;20301:1;:18;20285:328;;;20345:31;20379:11;:14;20391:1;20379:14;;;;;;;;;;;20345:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20417:9;:16;;;20412:186;;20477:5;20462:11;:20;20458:85;;;20518:1;20511:8;;;;;;;;20458:85;20565:13;;;;;;;20412:186;20326:287;20321:3;;;;;;;20285:328;;;;20641:23;;;;;;;;;;;;;;19957:715;;;;:::o;39923:44::-;;;;;;;;;;;;;;;;;:::o;44359:97::-;4887:12;:10;:12::i;:::-;4876:23;;:7;:5;:7::i;:::-;:23;;;4868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44445:3:::1;;44430:12;:18;;;;;;;:::i;:::-;;44359:97:::0;;:::o;39747:31::-;;;;:::o;42394:1550::-;42588:31;42595:10;;42607:4;42613:5;42588:6;:31::i;:::-;42580:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;42688:25;:39;42714:12;;42688:39;;;;;;;;;;;;42678:6;:49;;42670:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;42927:4;42894:10;42906:15;42877:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42867:56;;;;;;:64;42859:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;43009:1;42993:12;;:17;42988:85;;43035:13;:25;43049:10;43035:25;;;;;;;;;;;;;;;;;;;;;;;;;43034:26;43026:35;;;;;;42988:85;43178:13;:25;43192:10;43178:25;;;;;;;;;;;;;;;;;;;;;;;;;43173:288;;43248:4;43220:13;:25;43234:10;43220:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;43300:15;43267:18;:30;43286:10;43267:30;;;;;;;;;;;;;;;:48;;;;43173:288;;;43370:15;43337:18;:30;43356:10;43337:30;;;;;;;;;;;;;;;;:48;43333:128;;;43434:15;43401:18;:30;43420:10;43401:30;;;;;;;;;;;;;;;:48;;;;43333:128;43173:288;43525:1;43516:6;:10;43508:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;43632:6;43617:12;:10;:12::i;:::-;:21;;;;:::i;:::-;43604:9;:34;;43596:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43716:6;43682:18;:30;43701:10;43682:30;;;;;;;;;;;;;;;;:40;;43674:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;43815:6;43781:18;:30;43800:10;43781:30;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;43832:29;43842:10;43854:6;43832:9;:29::i;:::-;43899:6;43874:9;:21;43884:10;43874:21;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;43930:6;43916:10;;:20;;;;;;;:::i;:::-;;;;;;;;42394:1550;;;;:::o;24570:124::-;24634:7;24661:20;24673:7;24661:11;:20::i;:::-;:25;;;24654:32;;24570:124;;;:::o;39121:44::-;39163:2;39121:44;:::o;22587:206::-;22651:7;22692:1;22675:19;;:5;:19;;;22671:60;;;22703:28;;;;;;;;;;;;;;22671:60;22757:12;:19;22770:5;22757:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;22749:36;;22742:43;;22587:206;;;:::o;5307:105::-;4887:12;:10;:12::i;:::-;4876:23;;:7;:5;:7::i;:::-;:23;;;4868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5374:30:::1;5401:1;5374:18;:30::i;:::-;5307:105::o:0;44122:104::-;4887:12;:10;:12::i;:::-;4876:23;;:7;:5;:7::i;:::-;:23;;;4868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44207:11:::1;44194:10;:24;;;;44122:104:::0;:::o;41380:108::-;41423:7;41450:16;:30;41467:12;;41450:30;;;;;;;;;;;;41443:37;;41380:108;:::o;4656:87::-;4702:7;4729:6;;;;;;;;;;;4722:13;;4656:87;:::o;41061:70::-;4887:12;:10;:12::i;:::-;4876:23;;:7;:5;:7::i;:::-;:23;;;4868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41111:10:::1;;:12;;;;;;;;;:::i;:::-;;;;;;41061:70::o:0;24930:104::-;24986:13;25019:7;25012:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24930:104;:::o;41973:413::-;42029:7;42085:6;42070:12;:10;:12::i;:::-;:21;;;;:::i;:::-;42057:9;:34;42049:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42162:1;42149:10;;:14;;;;:::i;:::-;42133:12;;:30;42125:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;42207:14;42224:13;:11;:13::i;:::-;42207:30;;42248:29;42258:10;42270:6;42248:9;:29::i;:::-;42315:6;42290:9;:21;42300:10;42290:21;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;42346:6;42332:10;;:20;;;;;;;:::i;:::-;;;;;;;;42372:6;42365:13;;;41973:413;;;:::o;26540:279::-;26643:12;:10;:12::i;:::-;26631:24;;:8;:24;;;26627:54;;;26664:17;;;;;;;;;;;;;;26627:54;26739:8;26694:18;:32;26713:12;:10;:12::i;:::-;26694:32;;;;;;;;;;;;;;;:42;26727:8;26694:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26792:8;26763:48;;26778:12;:10;:12::i;:::-;26763:48;;;26802:8;26763:48;;;;;;:::i;:::-;;;;;;;;26540:279;;:::o;41259:107::-;41304:4;41357:1;41344:10;;:14;;;;:::i;:::-;41328:12;;:30;41321:37;;41259:107;:::o;39622:51::-;;;;;;;;;;;;;;;;;:::o;27618:342::-;27785:28;27795:4;27801:2;27805:7;27785:9;:28::i;:::-;27829:48;27852:4;27858:2;27862:7;27871:5;27829:22;:48::i;:::-;27824:129;;27901:40;;;;;;;;;;;;;;27824:129;27618:342;;;;:::o;25105:318::-;25178:13;25209:16;25217:7;25209;:16::i;:::-;25204:59;;25234:29;;;;;;;;;;;;;;25204:59;25276:21;25300:10;:8;:10::i;:::-;25276:34;;25353:1;25334:7;25328:21;:26;;:87;;;;;;;;;;;;;;;;;25381:7;25390:18;:7;:16;:18::i;:::-;25364:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25328:87;25321:94;;;25105:318;;;:::o;41504:461::-;41578:23;41612:26;41649:19;41679;41709:24;41788:1;41773:12;;:16;41752:37;;41824:14;:12;:14::i;:::-;41800:38;;41863:12;:10;:12::i;:::-;41849:26;;41900:10;;41886:24;;41940:9;:17;41950:6;41940:17;;;;;;;;;;;;;;;;41921:36;;41504:461;;;;;;;:::o;38853:50::-;;;;;;;;;;;;;;;;;:::o;26890:164::-;26987:4;27011:18;:25;27030:5;27011:25;;;;;;;;;;;;;;;:35;27037:8;27011:35;;;;;;;;;;;;;;;;;;;;;;;;;27004:42;;26890:164;;;;:::o;40468:180::-;4887:12;:10;:12::i;:::-;4876:23;;:7;:5;:7::i;:::-;:23;;;4868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40565:10:::1;;40557:5;:18;40549:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;40637:3;40611:16;:23;40628:5;40611:23;;;;;;;;;;;:29;;;;40468:180:::0;;:::o;5567:203::-;4887:12;:10;:12::i;:::-;4876:23;;:7;:5;:7::i;:::-;:23;;;4868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5678:1:::1;5658:22;;:8;:22;;;;5650:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5734:28;5753:8;5734:18;:28::i;:::-;5567:203:::0;:::o;39244:29::-;;;;:::o;39887:::-;;;;:::o;7209:326::-;7269:4;7526:1;7504:7;:19;;;:23;7497:30;;7209:326;;;:::o;9864:157::-;9949:4;9988:25;9973:40;;;:11;:40;;;;9966:47;;9864:157;;;:::o;28215:144::-;28272:4;28306:13;;;;;;;;;;;28296:23;;:7;:23;:55;;;;;28324:11;:20;28336:7;28324:20;;;;;;;;;;;:27;;;;;;;;;;;;28323:28;28296:55;28289:62;;28215:144;;;:::o;3628:98::-;3681:7;3708:10;3701:17;;3628:98;:::o;35431:196::-;35573:2;35546:15;:24;35562:7;35546:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35611:7;35607:2;35591:28;;35600:5;35591:28;;;;;;;;;;;;35431:196;;;:::o;30932:2112::-;31047:35;31085:20;31097:7;31085:11;:20::i;:::-;31047:58;;31118:22;31160:13;:18;;;31144:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;31195:50;31212:13;:18;;;31232:12;:10;:12::i;:::-;31195:16;:50::i;:::-;31144:101;:154;;;;31286:12;:10;:12::i;:::-;31262:36;;:20;31274:7;31262:11;:20::i;:::-;:36;;;31144:154;31118:181;;31317:17;31312:66;;31343:35;;;;;;;;;;;;;;31312:66;31415:4;31393:26;;:13;:18;;;:26;;;31389:67;;31428:28;;;;;;;;;;;;;;31389:67;31485:1;31471:16;;:2;:16;;;31467:52;;;31496:23;;;;;;;;;;;;;;31467:52;31532:43;31554:4;31560:2;31564:7;31573:1;31532:21;:43::i;:::-;31640:49;31657:1;31661:7;31670:13;:18;;;31640:8;:49::i;:::-;32015:1;31985:12;:18;31998:4;31985:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32059:1;32031:12;:16;32044:2;32031:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32105:2;32077:11;:20;32089:7;32077:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;32167:15;32122:11;:20;32134:7;32122:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;32435:19;32467:1;32457:7;:11;32435:33;;32528:1;32487:43;;:11;:24;32499:11;32487:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;32483:445;;;32712:13;;;;;;;;;;32698:27;;:11;:27;32694:219;;;32782:13;:18;;;32750:11;:24;32762:11;32750:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;32865:13;:28;;;32823:11;:24;32835:11;32823:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;32694:219;32483:445;31960:979;32975:7;32971:2;32956:27;;32965:4;32956:27;;;;;;;;;;;;32994:42;33015:4;33021:2;33025:7;33034:1;32994:20;:42::i;:::-;31036:2008;;30932:2112;;;:::o;800:190::-;925:4;978;949:25;962:5;969:4;949:12;:25::i;:::-;:33;942:40;;800:190;;;;;:::o;28367:104::-;28436:27;28446:2;28450:8;28436:27;;;;;;;;;;;;:9;:27::i;:::-;28367:104;;:::o;23425:1083::-;23486:21;;:::i;:::-;23520:12;23535:7;23520:22;;23591:13;;;;;;;;;;23584:20;;:4;:20;23580:861;;;23625:31;23659:11;:17;23671:4;23659:17;;;;;;;;;;;23625:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23700:9;:16;;;23695:731;;23771:1;23745:28;;:9;:14;;;:28;;;23741:101;;23809:9;23802:16;;;;;;23741:101;24146:261;24153:4;24146:261;;;24186:6;;;;;;;;24231:11;:17;24243:4;24231:17;;;;;;;;;;;24219:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24305:1;24279:28;;:9;:14;;;:28;;;24275:109;;24347:9;24340:16;;;;;;24275:109;24146:261;;;23695:731;23606:835;23580:861;24469:31;;;;;;;;;;;;;;23425:1083;;;;:::o;5930:191::-;6004:16;6023:6;;;;;;;;;;;6004:25;;6049:8;6040:6;;:17;;;;;;;;;;;;;;;;;;6104:8;6073:40;;6094:8;6073:40;;;;;;;;;;;;5993:128;5930:191;:::o;36192:790::-;36347:4;36368:15;:2;:13;;;:15::i;:::-;36364:611;;;36420:2;36404:36;;;36441:12;:10;:12::i;:::-;36455:4;36461:7;36470:5;36404:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36400:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36667:1;36650:6;:13;:18;36646:259;;;36700:40;;;;;;;;;;;;;;36646:259;36855:6;36849:13;36840:6;36836:2;36832:15;36825:38;36400:520;36537:45;;;36527:55;;;:6;:55;;;;36520:62;;;;;36364:611;36959:4;36952:11;;36192:790;;;;;;;:::o;44234:114::-;44295:13;44328:12;44321:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44234:114;:::o;2248:723::-;2304:13;2534:1;2525:5;:10;2521:53;;;2552:10;;;;;;;;;;;;;;;;;;;;;2521:53;2584:12;2599:5;2584:20;;2615:14;2640:78;2655:1;2647:4;:9;2640:78;;2673:8;;;;;:::i;:::-;;;;2704:2;2696:10;;;;;:::i;:::-;;;2640:78;;;2728:19;2760:6;2750:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2728:39;;2778:154;2794:1;2785:5;:10;2778:154;;2822:1;2812:11;;;;;:::i;:::-;;;2889:2;2881:5;:10;;;;:::i;:::-;2868:2;:24;;;;:::i;:::-;2855:39;;2838:6;2845;2838:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2918:2;2909:11;;;;;:::i;:::-;;;2778:154;;;2956:6;2942:21;;;;;2248:723;;;;:::o;37630:159::-;;;;;:::o;38448:158::-;;;;;:::o;1352:701::-;1435:7;1455:20;1478:4;1455:27;;1498:9;1493:523;1517:5;:12;1513:1;:16;1493:523;;;1551:20;1574:5;1580:1;1574:8;;;;;;;;:::i;:::-;;;;;;;;1551:31;;1617:12;1601;:28;1597:408;;1771:12;1785;1754:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1744:55;;;;;;1729:70;;1597:408;;;1961:12;1975;1944:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1934:55;;;;;;1919:70;;1597:408;1536:480;1531:3;;;;;:::i;:::-;;;;1493:523;;;;2033:12;2026:19;;;1352:701;;;;:::o;28834:163::-;28957:32;28963:2;28967:8;28977:5;28984:4;28957:5;:32::i;:::-;28834:163;;;:::o;29256:1422::-;29395:20;29418:13;;;;;;;;;;;29395:36;;;;29460:1;29446:16;;:2;:16;;;29442:48;;;29471:19;;;;;;;;;;;;;;29442:48;29517:1;29505:8;:13;29501:44;;;29527:18;;;;;;;;;;;;;;29501:44;29558:61;29588:1;29592:2;29596:12;29610:8;29558:21;:61::i;:::-;29932:8;29897:12;:16;29910:2;29897:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29996:8;29956:12;:16;29969:2;29956:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30055:2;30022:11;:25;30034:12;30022:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;30122:15;30072:11;:25;30084:12;30072:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;30155:20;30178:12;30155:35;;30212:9;30207:328;30227:8;30223:1;:12;30207:328;;;30291:12;30287:2;30266:38;;30283:1;30266:38;;;;;;;;;;;;30327:4;:68;;;;;30336:59;30367:1;30371:2;30375:12;30389:5;30336:22;:59::i;:::-;30335:60;30327:68;30323:164;;;30427:40;;;;;;;;;;;;;;30323:164;30505:14;;;;;;;30237:3;;;;;;;30207:328;;;;30575:12;30551:13;;:37;;;;;;;;;;;;;;;;;;29872:728;30610:60;30639:1;30643:2;30647:12;30661:8;30610:20;:60::i;:::-;29384:1294;29256:1422;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:::-;5006:6;5014;5063:2;5051:9;5042:7;5038:23;5034:32;5031:119;;;5069:79;;:::i;:::-;5031:119;5189:1;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5160:117;5316:2;5342:53;5387:7;5378:6;5367:9;5363:22;5342:53;:::i;:::-;5332:63;;5287:118;4938:474;;;;;:::o;5418:118::-;5505:24;5523:5;5505:24;:::i;:::-;5500:3;5493:37;5418:118;;:::o;5542:222::-;5635:4;5673:2;5662:9;5658:18;5650:26;;5686:71;5754:1;5743:9;5739:17;5730:6;5686:71;:::i;:::-;5542:222;;;;:::o;5770:329::-;5829:6;5878:2;5866:9;5857:7;5853:23;5849:32;5846:119;;;5884:79;;:::i;:::-;5846:119;6004:1;6029:53;6074:7;6065:6;6054:9;6050:22;6029:53;:::i;:::-;6019:63;;5975:117;5770:329;;;;:::o;6105:619::-;6182:6;6190;6198;6247:2;6235:9;6226:7;6222:23;6218:32;6215:119;;;6253:79;;:::i;:::-;6215:119;6373:1;6398:53;6443:7;6434:6;6423:9;6419:22;6398:53;:::i;:::-;6388:63;;6344:117;6500:2;6526:53;6571:7;6562:6;6551:9;6547:22;6526:53;:::i;:::-;6516:63;;6471:118;6628:2;6654:53;6699:7;6690:6;6679:9;6675:22;6654:53;:::i;:::-;6644:63;;6599:118;6105:619;;;;;:::o;6730:77::-;6767:7;6796:5;6785:16;;6730:77;;;:::o;6813:118::-;6900:24;6918:5;6900:24;:::i;:::-;6895:3;6888:37;6813:118;;:::o;6937:222::-;7030:4;7068:2;7057:9;7053:18;7045:26;;7081:71;7149:1;7138:9;7134:17;7125:6;7081:71;:::i;:::-;6937:222;;;;:::o;7165:122::-;7238:24;7256:5;7238:24;:::i;:::-;7231:5;7228:35;7218:63;;7277:1;7274;7267:12;7218:63;7165:122;:::o;7293:139::-;7339:5;7377:6;7364:20;7355:29;;7393:33;7420:5;7393:33;:::i;:::-;7293:139;;;;:::o;7438:117::-;7547:1;7544;7537:12;7561:180;7609:77;7606:1;7599:88;7706:4;7703:1;7696:15;7730:4;7727:1;7720:15;7747:281;7830:27;7852:4;7830:27;:::i;:::-;7822:6;7818:40;7960:6;7948:10;7945:22;7924:18;7912:10;7909:34;7906:62;7903:88;;;7971:18;;:::i;:::-;7903:88;8011:10;8007:2;8000:22;7790:238;7747:281;;:::o;8034:129::-;8068:6;8095:20;;:::i;:::-;8085:30;;8124:33;8152:4;8144:6;8124:33;:::i;:::-;8034:129;;;:::o;8169:311::-;8246:4;8336:18;8328:6;8325:30;8322:56;;;8358:18;;:::i;:::-;8322:56;8408:4;8400:6;8396:17;8388:25;;8468:4;8462;8458:15;8450:23;;8169:311;;;:::o;8486:117::-;8595:1;8592;8585:12;8626:710;8722:5;8747:81;8763:64;8820:6;8763:64;:::i;:::-;8747:81;:::i;:::-;8738:90;;8848:5;8877:6;8870:5;8863:21;8911:4;8904:5;8900:16;8893:23;;8964:4;8956:6;8952:17;8944:6;8940:30;8993:3;8985:6;8982:15;8979:122;;;9012:79;;:::i;:::-;8979:122;9127:6;9110:220;9144:6;9139:3;9136:15;9110:220;;;9219:3;9248:37;9281:3;9269:10;9248:37;:::i;:::-;9243:3;9236:50;9315:4;9310:3;9306:14;9299:21;;9186:144;9170:4;9165:3;9161:14;9154:21;;9110:220;;;9114:21;8728:608;;8626:710;;;;;:::o;9359:370::-;9430:5;9479:3;9472:4;9464:6;9460:17;9456:27;9446:122;;9487:79;;:::i;:::-;9446:122;9604:6;9591:20;9629:94;9719:3;9711:6;9704:4;9696:6;9692:17;9629:94;:::i;:::-;9620:103;;9436:293;9359:370;;;;:::o;9735:829::-;9837:6;9845;9853;9902:2;9890:9;9881:7;9877:23;9873:32;9870:119;;;9908:79;;:::i;:::-;9870:119;10028:1;10053:53;10098:7;10089:6;10078:9;10074:22;10053:53;:::i;:::-;10043:63;;9999:117;10155:2;10181:53;10226:7;10217:6;10206:9;10202:22;10181:53;:::i;:::-;10171:63;;10126:118;10311:2;10300:9;10296:18;10283:32;10342:18;10334:6;10331:30;10328:117;;;10364:79;;:::i;:::-;10328:117;10469:78;10539:7;10530:6;10519:9;10515:22;10469:78;:::i;:::-;10459:88;;10254:303;9735:829;;;;;:::o;10570:117::-;10679:1;10676;10669:12;10707:553;10765:8;10775:6;10825:3;10818:4;10810:6;10806:17;10802:27;10792:122;;10833:79;;:::i;:::-;10792:122;10946:6;10933:20;10923:30;;10976:18;10968:6;10965:30;10962:117;;;10998:79;;:::i;:::-;10962:117;11112:4;11104:6;11100:17;11088:29;;11166:3;11158:4;11150:6;11146:17;11136:8;11132:32;11129:41;11126:128;;;11173:79;;:::i;:::-;11126:128;10707:553;;;;;:::o;11266:529::-;11337:6;11345;11394:2;11382:9;11373:7;11369:23;11365:32;11362:119;;;11400:79;;:::i;:::-;11362:119;11548:1;11537:9;11533:17;11520:31;11578:18;11570:6;11567:30;11564:117;;;11600:79;;:::i;:::-;11564:117;11713:65;11770:7;11761:6;11750:9;11746:22;11713:65;:::i;:::-;11695:83;;;;11491:297;11266:529;;;;;:::o;11801:975::-;11912:6;11920;11928;11936;11985:3;11973:9;11964:7;11960:23;11956:33;11953:120;;;11992:79;;:::i;:::-;11953:120;12112:1;12137:53;12182:7;12173:6;12162:9;12158:22;12137:53;:::i;:::-;12127:63;;12083:117;12239:2;12265:53;12310:7;12301:6;12290:9;12286:22;12265:53;:::i;:::-;12255:63;;12210:118;12367:2;12393:53;12438:7;12429:6;12418:9;12414:22;12393:53;:::i;:::-;12383:63;;12338:118;12523:2;12512:9;12508:18;12495:32;12554:18;12546:6;12543:30;12540:117;;;12576:79;;:::i;:::-;12540:117;12681:78;12751:7;12742:6;12731:9;12727:22;12681:78;:::i;:::-;12671:88;;12466:303;11801:975;;;;;;;:::o;12782:329::-;12841:6;12890:2;12878:9;12869:7;12865:23;12861:32;12858:119;;;12896:79;;:::i;:::-;12858:119;13016:1;13041:53;13086:7;13077:6;13066:9;13062:22;13041:53;:::i;:::-;13031:63;;12987:117;12782:329;;;;:::o;13117:116::-;13187:21;13202:5;13187:21;:::i;:::-;13180:5;13177:32;13167:60;;13223:1;13220;13213:12;13167:60;13117:116;:::o;13239:133::-;13282:5;13320:6;13307:20;13298:29;;13336:30;13360:5;13336:30;:::i;:::-;13239:133;;;;:::o;13378:468::-;13443:6;13451;13500:2;13488:9;13479:7;13475:23;13471:32;13468:119;;;13506:79;;:::i;:::-;13468:119;13626:1;13651:53;13696:7;13687:6;13676:9;13672:22;13651:53;:::i;:::-;13641:63;;13597:117;13753:2;13779:50;13821:7;13812:6;13801:9;13797:22;13779:50;:::i;:::-;13769:60;;13724:115;13378:468;;;;;:::o;13852:117::-;13961:1;13958;13951:12;13975:307;14036:4;14126:18;14118:6;14115:30;14112:56;;;14148:18;;:::i;:::-;14112:56;14186:29;14208:6;14186:29;:::i;:::-;14178:37;;14270:4;14264;14260:15;14252:23;;13975:307;;;:::o;14288:154::-;14372:6;14367:3;14362;14349:30;14434:1;14425:6;14420:3;14416:16;14409:27;14288:154;;;:::o;14448:410::-;14525:5;14550:65;14566:48;14607:6;14566:48;:::i;:::-;14550:65;:::i;:::-;14541:74;;14638:6;14631:5;14624:21;14676:4;14669:5;14665:16;14714:3;14705:6;14700:3;14696:16;14693:25;14690:112;;;14721:79;;:::i;:::-;14690:112;14811:41;14845:6;14840:3;14835;14811:41;:::i;:::-;14531:327;14448:410;;;;;:::o;14877:338::-;14932:5;14981:3;14974:4;14966:6;14962:17;14958:27;14948:122;;14989:79;;:::i;:::-;14948:122;15106:6;15093:20;15131:78;15205:3;15197:6;15190:4;15182:6;15178:17;15131:78;:::i;:::-;15122:87;;14938:277;14877:338;;;;:::o;15221:943::-;15316:6;15324;15332;15340;15389:3;15377:9;15368:7;15364:23;15360:33;15357:120;;;15396:79;;:::i;:::-;15357:120;15516:1;15541:53;15586:7;15577:6;15566:9;15562:22;15541:53;:::i;:::-;15531:63;;15487:117;15643:2;15669:53;15714:7;15705:6;15694:9;15690:22;15669:53;:::i;:::-;15659:63;;15614:118;15771:2;15797:53;15842:7;15833:6;15822:9;15818:22;15797:53;:::i;:::-;15787:63;;15742:118;15927:2;15916:9;15912:18;15899:32;15958:18;15950:6;15947:30;15944:117;;;15980:79;;:::i;:::-;15944:117;16085:62;16139:7;16130:6;16119:9;16115:22;16085:62;:::i;:::-;16075:72;;15870:287;15221:943;;;;;;;:::o;16170:640::-;16363:4;16401:3;16390:9;16386:19;16378:27;;16415:65;16477:1;16466:9;16462:17;16453:6;16415:65;:::i;:::-;16490:66;16552:2;16541:9;16537:18;16528:6;16490:66;:::i;:::-;16566:72;16634:2;16623:9;16619:18;16610:6;16566:72;:::i;:::-;16648;16716:2;16705:9;16701:18;16692:6;16648:72;:::i;:::-;16730:73;16798:3;16787:9;16783:19;16774:6;16730:73;:::i;:::-;16170:640;;;;;;;;:::o;16816:474::-;16884:6;16892;16941:2;16929:9;16920:7;16916:23;16912:32;16909:119;;;16947:79;;:::i;:::-;16909:119;17067:1;17092:53;17137:7;17128:6;17117:9;17113:22;17092:53;:::i;:::-;17082:63;;17038:117;17194:2;17220:53;17265:7;17256:6;17245:9;17241:22;17220:53;:::i;:::-;17210:63;;17165:118;16816:474;;;;;:::o;17296:180::-;17344:77;17341:1;17334:88;17441:4;17438:1;17431:15;17465:4;17462:1;17455:15;17482:320;17526:6;17563:1;17557:4;17553:12;17543:22;;17610:1;17604:4;17600:12;17631:18;17621:81;;17687:4;17679:6;17675:17;17665:27;;17621:81;17749:2;17741:6;17738:14;17718:18;17715:38;17712:84;;;17768:18;;:::i;:::-;17712:84;17533:269;17482:320;;;:::o;17808:182::-;17948:34;17944:1;17936:6;17932:14;17925:58;17808:182;:::o;17996:366::-;18138:3;18159:67;18223:2;18218:3;18159:67;:::i;:::-;18152:74;;18235:93;18324:3;18235:93;:::i;:::-;18353:2;18348:3;18344:12;18337:19;;17996:366;;;:::o;18368:419::-;18534:4;18572:2;18561:9;18557:18;18549:26;;18621:9;18615:4;18611:20;18607:1;18596:9;18592:17;18585:47;18649:131;18775:4;18649:131;:::i;:::-;18641:139;;18368:419;;;:::o;18793:170::-;18933:22;18929:1;18921:6;18917:14;18910:46;18793:170;:::o;18969:366::-;19111:3;19132:67;19196:2;19191:3;19132:67;:::i;:::-;19125:74;;19208:93;19297:3;19208:93;:::i;:::-;19326:2;19321:3;19317:12;19310:19;;18969:366;;;:::o;19341:419::-;19507:4;19545:2;19534:9;19530:18;19522:26;;19594:9;19588:4;19584:20;19580:1;19569:9;19565:17;19558:47;19622:131;19748:4;19622:131;:::i;:::-;19614:139;;19341:419;;;:::o;19766:180::-;19814:77;19811:1;19804:88;19911:4;19908:1;19901:15;19935:4;19932:1;19925:15;19952:191;19992:4;20012:20;20030:1;20012:20;:::i;:::-;20007:25;;20046:20;20064:1;20046:20;:::i;:::-;20041:25;;20085:1;20082;20079:8;20076:34;;;20090:18;;:::i;:::-;20076:34;20135:1;20132;20128:9;20120:17;;19952:191;;;;:::o;20149:222::-;20289:34;20285:1;20277:6;20273:14;20266:58;20358:5;20353:2;20345:6;20341:15;20334:30;20149:222;:::o;20377:366::-;20519:3;20540:67;20604:2;20599:3;20540:67;:::i;:::-;20533:74;;20616:93;20705:3;20616:93;:::i;:::-;20734:2;20729:3;20725:12;20718:19;;20377:366;;;:::o;20749:419::-;20915:4;20953:2;20942:9;20938:18;20930:26;;21002:9;20996:4;20992:20;20988:1;20977:9;20973:17;20966:47;21030:131;21156:4;21030:131;:::i;:::-;21022:139;;20749:419;;;:::o;21174:232::-;21314:34;21310:1;21302:6;21298:14;21291:58;21383:15;21378:2;21370:6;21366:15;21359:40;21174:232;:::o;21412:366::-;21554:3;21575:67;21639:2;21634:3;21575:67;:::i;:::-;21568:74;;21651:93;21740:3;21651:93;:::i;:::-;21769:2;21764:3;21760:12;21753:19;;21412:366;;;:::o;21784:419::-;21950:4;21988:2;21977:9;21973:18;21965:26;;22037:9;22031:4;22027:20;22023:1;22012:9;22008:17;22001:47;22065:131;22191:4;22065:131;:::i;:::-;22057:139;;21784:419;;;:::o;22209:94::-;22242:8;22290:5;22286:2;22282:14;22261:35;;22209:94;;;:::o;22309:::-;22348:7;22377:20;22391:5;22377:20;:::i;:::-;22366:31;;22309:94;;;:::o;22409:100::-;22448:7;22477:26;22497:5;22477:26;:::i;:::-;22466:37;;22409:100;;;:::o;22515:157::-;22620:45;22640:24;22658:5;22640:24;:::i;:::-;22620:45;:::i;:::-;22615:3;22608:58;22515:157;;:::o;22678:79::-;22717:7;22746:5;22735:16;;22678:79;;;:::o;22763:157::-;22868:45;22888:24;22906:5;22888:24;:::i;:::-;22868:45;:::i;:::-;22863:3;22856:58;22763:157;;:::o;22926:397::-;23066:3;23081:75;23152:3;23143:6;23081:75;:::i;:::-;23181:2;23176:3;23172:12;23165:19;;23194:75;23265:3;23256:6;23194:75;:::i;:::-;23294:2;23289:3;23285:12;23278:19;;23314:3;23307:10;;22926:397;;;;;:::o;23329:228::-;23469:34;23465:1;23457:6;23453:14;23446:58;23538:11;23533:2;23525:6;23521:15;23514:36;23329:228;:::o;23563:366::-;23705:3;23726:67;23790:2;23785:3;23726:67;:::i;:::-;23719:74;;23802:93;23891:3;23802:93;:::i;:::-;23920:2;23915:3;23911:12;23904:19;;23563:366;;;:::o;23935:419::-;24101:4;24139:2;24128:9;24124:18;24116:26;;24188:9;24182:4;24178:20;24174:1;24163:9;24159:17;24152:47;24216:131;24342:4;24216:131;:::i;:::-;24208:139;;23935:419;;;:::o;24360:165::-;24500:17;24496:1;24488:6;24484:14;24477:41;24360:165;:::o;24531:366::-;24673:3;24694:67;24758:2;24753:3;24694:67;:::i;:::-;24687:74;;24770:93;24859:3;24770:93;:::i;:::-;24888:2;24883:3;24879:12;24872:19;;24531:366;;;:::o;24903:419::-;25069:4;25107:2;25096:9;25092:18;25084:26;;25156:9;25150:4;25146:20;25142:1;25131:9;25127:17;25120:47;25184:131;25310:4;25184:131;:::i;:::-;25176:139;;24903:419;;;:::o;25328:348::-;25368:7;25391:20;25409:1;25391:20;:::i;:::-;25386:25;;25425:20;25443:1;25425:20;:::i;:::-;25420:25;;25613:1;25545:66;25541:74;25538:1;25535:81;25530:1;25523:9;25516:17;25512:105;25509:131;;;25620:18;;:::i;:::-;25509:131;25668:1;25665;25661:9;25650:20;;25328:348;;;;:::o;25682:168::-;25822:20;25818:1;25810:6;25806:14;25799:44;25682:168;:::o;25856:366::-;25998:3;26019:67;26083:2;26078:3;26019:67;:::i;:::-;26012:74;;26095:93;26184:3;26095:93;:::i;:::-;26213:2;26208:3;26204:12;26197:19;;25856:366;;;:::o;26228:419::-;26394:4;26432:2;26421:9;26417:18;26409:26;;26481:9;26475:4;26471:20;26467:1;26456:9;26452:17;26445:47;26509:131;26635:4;26509:131;:::i;:::-;26501:139;;26228:419;;;:::o;26653:228::-;26793:34;26789:1;26781:6;26777:14;26770:58;26862:11;26857:2;26849:6;26845:15;26838:36;26653:228;:::o;26887:366::-;27029:3;27050:67;27114:2;27109:3;27050:67;:::i;:::-;27043:74;;27126:93;27215:3;27126:93;:::i;:::-;27244:2;27239:3;27235:12;27228:19;;26887:366;;;:::o;27259:419::-;27425:4;27463:2;27452:9;27448:18;27440:26;;27512:9;27506:4;27502:20;27498:1;27487:9;27483:17;27476:47;27540:131;27666:4;27540:131;:::i;:::-;27532:139;;27259:419;;;:::o;27684:305::-;27724:3;27743:20;27761:1;27743:20;:::i;:::-;27738:25;;27777:20;27795:1;27777:20;:::i;:::-;27772:25;;27931:1;27863:66;27859:74;27856:1;27853:81;27850:107;;;27937:18;;:::i;:::-;27850:107;27981:1;27978;27974:9;27967:16;;27684:305;;;;:::o;27995:233::-;28034:3;28057:24;28075:5;28057:24;:::i;:::-;28048:33;;28103:66;28096:5;28093:77;28090:103;;;28173:18;;:::i;:::-;28090:103;28220:1;28213:5;28209:13;28202:20;;27995:233;;;:::o;28234:177::-;28374:29;28370:1;28362:6;28358:14;28351:53;28234:177;:::o;28417:366::-;28559:3;28580:67;28644:2;28639:3;28580:67;:::i;:::-;28573:74;;28656:93;28745:3;28656:93;:::i;:::-;28774:2;28769:3;28765:12;28758:19;;28417:366;;;:::o;28789:419::-;28955:4;28993:2;28982:9;28978:18;28970:26;;29042:9;29036:4;29032:20;29028:1;29017:9;29013:17;29006:47;29070:131;29196:4;29070:131;:::i;:::-;29062:139;;28789:419;;;:::o;29214:148::-;29316:11;29353:3;29338:18;;29214:148;;;;:::o;29368:377::-;29474:3;29502:39;29535:5;29502:39;:::i;:::-;29557:89;29639:6;29634:3;29557:89;:::i;:::-;29550:96;;29655:52;29700:6;29695:3;29688:4;29681:5;29677:16;29655:52;:::i;:::-;29732:6;29727:3;29723:16;29716:23;;29478:267;29368:377;;;;:::o;29751:435::-;29931:3;29953:95;30044:3;30035:6;29953:95;:::i;:::-;29946:102;;30065:95;30156:3;30147:6;30065:95;:::i;:::-;30058:102;;30177:3;30170:10;;29751:435;;;;;:::o;30192:225::-;30332:34;30328:1;30320:6;30316:14;30309:58;30401:8;30396:2;30388:6;30384:15;30377:33;30192:225;:::o;30423:366::-;30565:3;30586:67;30650:2;30645:3;30586:67;:::i;:::-;30579:74;;30662:93;30751:3;30662:93;:::i;:::-;30780:2;30775:3;30771:12;30764:19;;30423:366;;;:::o;30795:419::-;30961:4;30999:2;30988:9;30984:18;30976:26;;31048:9;31042:4;31038:20;31034:1;31023:9;31019:17;31012:47;31076:131;31202:4;31076:131;:::i;:::-;31068:139;;30795:419;;;:::o;31220:98::-;31271:6;31305:5;31299:12;31289:22;;31220:98;;;:::o;31324:168::-;31407:11;31441:6;31436:3;31429:19;31481:4;31476:3;31472:14;31457:29;;31324:168;;;;:::o;31498:360::-;31584:3;31612:38;31644:5;31612:38;:::i;:::-;31666:70;31729:6;31724:3;31666:70;:::i;:::-;31659:77;;31745:52;31790:6;31785:3;31778:4;31771:5;31767:16;31745:52;:::i;:::-;31822:29;31844:6;31822:29;:::i;:::-;31817:3;31813:39;31806:46;;31588:270;31498:360;;;;:::o;31864:640::-;32059:4;32097:3;32086:9;32082:19;32074:27;;32111:71;32179:1;32168:9;32164:17;32155:6;32111:71;:::i;:::-;32192:72;32260:2;32249:9;32245:18;32236:6;32192:72;:::i;:::-;32274;32342:2;32331:9;32327:18;32318:6;32274:72;:::i;:::-;32393:9;32387:4;32383:20;32378:2;32367:9;32363:18;32356:48;32421:76;32492:4;32483:6;32421:76;:::i;:::-;32413:84;;31864:640;;;;;;;:::o;32510:141::-;32566:5;32597:6;32591:13;32582:22;;32613:32;32639:5;32613:32;:::i;:::-;32510:141;;;;:::o;32657:349::-;32726:6;32775:2;32763:9;32754:7;32750:23;32746:32;32743:119;;;32781:79;;:::i;:::-;32743:119;32901:1;32926:63;32981:7;32972:6;32961:9;32957:22;32926:63;:::i;:::-;32916:73;;32872:127;32657:349;;;;:::o;33012:180::-;33060:77;33057:1;33050:88;33157:4;33154:1;33147:15;33181:4;33178:1;33171:15;33198:185;33238:1;33255:20;33273:1;33255:20;:::i;:::-;33250:25;;33289:20;33307:1;33289:20;:::i;:::-;33284:25;;33328:1;33318:35;;33333:18;;:::i;:::-;33318:35;33375:1;33372;33368:9;33363:14;;33198:185;;;;:::o;33389:176::-;33421:1;33438:20;33456:1;33438:20;:::i;:::-;33433:25;;33472:20;33490:1;33472:20;:::i;:::-;33467:25;;33511:1;33501:35;;33516:18;;:::i;:::-;33501:35;33557:1;33554;33550:9;33545:14;;33389:176;;;;:::o;33571:180::-;33619:77;33616:1;33609:88;33716:4;33713:1;33706:15;33740:4;33737:1;33730:15;33757:79;33796:7;33825:5;33814:16;;33757:79;;;:::o;33842:157::-;33947:45;33967:24;33985:5;33967:24;:::i;:::-;33947:45;:::i;:::-;33942:3;33935:58;33842:157;;:::o;34005:397::-;34145:3;34160:75;34231:3;34222:6;34160:75;:::i;:::-;34260:2;34255:3;34251:12;34244:19;;34273:75;34344:3;34335:6;34273:75;:::i;:::-;34373:2;34368:3;34364:12;34357:19;;34393:3;34386:10;;34005:397;;;;;:::o
Swarm Source
ipfs://cd0f73459f488c48eb443b83685f80164f3e24a76f476670246180ce023c3f1d
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.