ERC-721
NFT
Overview
Max Total Supply
3,127 AO
Holders
1,249
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 AOLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AngelsOasis
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./ERC721.sol"; import "./Ownable.sol"; contract AngelsOasis is ERC721, Ownable { using Strings for uint256; uint256 public constant MAX_ANGELS = 8888; uint256 public reservedAngels = 88; uint256 public presaleSupply = 2000; uint256 public mintPrice = 0.05 ether; uint256 public presaleMintcap = 10; uint256 public mintCap = 10; // Withdrawal addresses address public constant ADD = 0xaeF33e18FC210a22dD42AF5578837758B2349770; bool public preSale; bool public publicSale; bool public revealed; mapping(address => bool) public presalerList; mapping(address => uint256) public presalerListPurchases; string public defaultURI = "https://angelsoasis.mypinata.cloud/ipfs/QmbLaePgdLq1y9SKGRdEJ2pBEeS6ow6GUo5npiNhSVrGrL"; constructor() ERC721("Angels Oasis", "AO") {} function addToPresaleList(address[] calldata entries) external onlyOwner { for (uint256 i = 0; i < entries.length; i++) { address entry = entries[i]; require(entry != address(0), "NULL_ADDRESS"); require(!presalerList[entry], "DUPLICATE_ENTRY"); presalerList[entry] = true; } } function removeFromPresaleList(address[] calldata entries) external onlyOwner { for (uint256 i = 0; i < entries.length; i++) { address entry = entries[i]; require(entry != address(0), "NULL_ADDRESS"); presalerList[entry] = false; } } function gift(address[] calldata receivers) external onlyOwner { require(totalSupply() + receivers.length <= MAX_ANGELS, "MAX_MINT"); require(receivers.length <= reservedAngels, "No reserved angels left"); for (uint256 i = 0; i < receivers.length; i++) { reservedAngels--; _safeMint(receivers[i], totalSupply()); } } function mintPreSale(uint256 num) public payable returns (bool) { uint256 currentSupply = totalSupply(); require(preSale, "The pre-sale has NOT started, please wait."); require(presalerList[msg.sender], "Not qualified for presale"); require( presalerListPurchases[msg.sender] + num <= presaleMintcap, "Exceeded presale allocation" ); require( currentSupply + num <= MAX_ANGELS - reservedAngels, "Exceeding total supply" ); require( currentSupply + num <= presaleSupply, "Exceeding presale supply." ); require(msg.value >= mintPrice * num, "Ether sent is not sufficient."); require(!_isContract(msg.sender), "Caller cannot be contract"); for (uint256 i = 0; i < num; i++) { presalerListPurchases[msg.sender]++; uint256 tokenIndex = totalSupply(); if (tokenIndex < MAX_ANGELS) _safeMint(_msgSender(), tokenIndex); } return true; } function mintPublicSale(uint256 num) public payable returns (bool) { uint256 currentSupply = totalSupply(); require(publicSale, "The public sale has NOT started, please wait."); require(num <= mintCap, "You are trying to mint too many."); require( currentSupply + num <= MAX_ANGELS - reservedAngels, "Exceeding total supply" ); require(msg.value >= num * mintPrice, "Ether sent is not sufficient."); require(!_isContract(msg.sender), "Caller cannot be contract"); for (uint256 i = 0; i < num; i++) { presalerListPurchases[msg.sender]++; uint256 tokenIndex = totalSupply(); if (tokenIndex < MAX_ANGELS) _safeMint(_msgSender(), tokenIndex); } return true; } function tokensOfOwner(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); for (uint256 i; i < tokenCount; i++) { result[i] = tokenOfOwnerByIndex(_owner, i); } return result; } } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(tokenId < totalSupply(), "Token not exist."); // show default image before reveal if (!revealed) { return defaultURI; } string memory _tokenURI = _tokenUriMapping[tokenId]; //return tokenURI if it is set if (bytes(_tokenURI).length > 0) { return _tokenURI; } //If tokenURI is not set, concatenate the tokenID to the baseURI. return string(abi.encodePacked(baseURI(), tokenId.toString(), ".json")); } /* * Only the owner can do these things */ function togglePublicSale() public onlyOwner { publicSale = !publicSale; } function togglePresale() public onlyOwner { preSale = !preSale; } function toggleReveal() public onlyOwner { revealed = !revealed; } function setDefaultURI(string memory _defaultURI) public onlyOwner { defaultURI = _defaultURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { _setBaseURI(_newBaseURI); } function setTokenURI(uint256 tokenId, string memory _tokenURI) public onlyOwner { _setTokenURI(tokenId, _tokenURI); } function setPresaleSupply(uint256 _presaleSupply) public onlyOwner { presaleSupply = _presaleSupply; } function setPreSalePrice(uint256 _newPrice) public onlyOwner { mintPrice = _newPrice; } function setMintCap(uint256 _mintCap) public onlyOwner { mintCap = _mintCap; } function setPresaleMintCap(uint256 _presaleMintCap) public onlyOwner { presaleMintcap = _presaleMintCap; } function withdrawAll() public payable onlyOwner { //withdraw all require( payable(ADD).send(address(this).balance), "Withdraw Unsuccessful" ); } function isWhiteListed(address entry) external view returns (bool) { return presalerList[entry]; } function _isContract(address _addr) internal view returns (bool) { uint32 _size; assembly { _size := extcodesize(_addr) } return (_size > 0); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./EnumerableSet.sol"; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { using EnumerableSet for EnumerableSet.Bytes32Set; // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct Map { // Storage of keys EnumerableSet.Bytes32Set _keys; mapping(bytes32 => bytes32) _values; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set( Map storage map, bytes32 key, bytes32 value ) private returns (bool) { map._values[key] = value; return map._keys.add(key); } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { delete map._values[key]; return map._keys.remove(key); } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._keys.contains(key); } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._keys.length(); } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { bytes32 key = map._keys.at(index); return (key, map._values[key]); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { bytes32 value = map._values[key]; if (value == bytes32(0)) { return (_contains(map, key), bytes32(0)); } else { return (true, value); } } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { bytes32 value = map._values[key]; require(value != 0 || _contains(map, key), "EnumerableMap: nonexistent key"); return value; } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get( Map storage map, bytes32 key, string memory errorMessage ) private view returns (bytes32) { bytes32 value = map._values[key]; require(value != 0 || _contains(map, key), errorMessage); return value; } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( UintToAddressMap storage map, uint256 key, address value ) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( UintToAddressMap storage map, uint256 key, string memory errorMessage ) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC165.sol"; /** * @dev Storage based implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165Storage is ERC165 { /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; import "./IERC721.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./IERC721Receiver.sol"; import "./ERC165Storage.sol"; import "./SafeMath.sol"; import "./Address.sol"; import "./EnumerableSet.sol"; import "./EnumerableMap.sol"; import "./Strings.sol"; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165Storage, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // 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; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping (uint256 => string) internal _tokenUriMapping; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public virtual view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenUriMapping[tokenId]; // If there is no base URI, return the token URI. if (bytes(_baseURI).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(_baseURI, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(_baseURI, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _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 { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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) internal virtual { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenUriMapping[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @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()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } function _approve(address to, uint256 tokenId) private { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721Receiver.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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 tokenId); /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ADD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ANGELS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"addToPresaleList","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entry","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintPreSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"preSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMintcap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerListPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedAngels","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_defaultURI","type":"string"}],"name":"setDefaultURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintCap","type":"uint256"}],"name":"setMintCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPreSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleMintCap","type":"uint256"}],"name":"setPresaleMintCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleSupply","type":"uint256"}],"name":"setPresaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6058600c556107d0600d5566b1a2bc2ec50000600e55600a600f81905560105561010060405260566080818152906200337360a03980516200004a91601491602090910190620001de565b503480156200005857600080fd5b50604080518082018252600c81526b416e67656c73204f6173697360a01b602080830191825283518085019094526002845261414f60f01b908401528151919291620000a791600791620001de565b508051620000bd906008906020840190620001de565b50620000d06380ac58cd60e01b62000108565b620000e2635b5e139f60e01b62000108565b620000f463780e9d6360e01b62000108565b50620001029050336200018c565b620002c1565b6001600160e01b03198082161415620001675760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001ec9062000284565b90600052602060002090601f0160209004810192826200021057600085556200025b565b82601f106200022b57805160ff19168380011785556200025b565b828001600101855582156200025b579182015b828111156200025b5782518255916020019190600101906200023e565b50620002699291506200026d565b5090565b5b808211156200026957600081556001016200026e565b600181811c908216806200029957607f821691505b60208210811415620002bb57634e487b7160e01b600052602260045260246000fd5b50919050565b6130a280620002d16000396000f3fe6080604052600436106102e45760003560e01c806370a0823111610190578063a20c7254116100dc578063b988477211610095578063da1b9e081161006f578063da1b9e081461088f578063e222c7f9146108af578063e985e9c5146108c4578063f2fde38b1461090d57600080fd5b8063b988477214610846578063c81d60bd14610859578063c87b56dd1461086f57600080fd5b8063a20c72541461079a578063a22cb465146107b0578063b179e060146107d0578063b3a196e9146107f0578063b88d4fde14610806578063b96502cb1461082657600080fd5b80638462151c1161014957806395d89b411161012357806395d89b41146107085780639bf803161461071d5780639cf2e8d61461074a578063a06f269b1461077a57600080fd5b80638462151c146106b5578063853828b6146106e25780638da5cb5b146106ea57600080fd5b806370a0823114610614578063715018a6146106345780637204a3c91461064957806376c71ca1146106695780637d7eee421461067f5780638224dd281461069f57600080fd5b80634070a0c91161024f5780635a5e5d58116102085780636352211e116101e25780636352211e146105905780636817c76c146105b05780636c0360eb146105c65780636f9170f6146105db57600080fd5b80635a5e5d581461054e5780635a7adf7f146105615780635b8ad4291461057b57600080fd5b80634070a0c91461048657806342842e0e146104a65780634f6ccce7146104c657806351830227146104e657806355f804b314610506578063562f9e471461052657600080fd5b806318160ddd116102a157806318160ddd146103da57806323b872dd146103fd5780632f745c591461041d57806333bc1c5c1461043d578063343937431461045c5780633a367a671461047157600080fd5b806301ffc9a7146102e957806306fdde031461031e578063081812fc14610340578063095ea7b314610378578063162094c41461039a578063163e1e61146103ba575b600080fd5b3480156102f557600080fd5b50610309610304366004612bf5565b61092d565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b5061033361096d565b6040516103159190612dc5565b34801561034c57600080fd5b5061036061035b366004612c60565b6109ff565b6040516001600160a01b039091168152602001610315565b34801561038457600080fd5b50610398610393366004612b5c565b610a8c565b005b3480156103a657600080fd5b506103986103b5366004612c78565b610ba2565b3480156103c657600080fd5b506103986103d5366004612b85565b610bda565b3480156103e657600080fd5b506103ef610d1c565b604051908152602001610315565b34801561040957600080fd5b50610398610418366004612a6e565b610d2d565b34801561042957600080fd5b506103ef610438366004612b5c565b610d5e565b34801561044957600080fd5b5060115461030990610100900460ff1681565b34801561046857600080fd5b50610398610d87565b34801561047d57600080fd5b50610333610dc5565b34801561049257600080fd5b506103986104a1366004612c60565b610e53565b3480156104b257600080fd5b506103986104c1366004612a6e565b610e82565b3480156104d257600080fd5b506103ef6104e1366004612c60565b610e9d565b3480156104f257600080fd5b506011546103099062010000900460ff1681565b34801561051257600080fd5b50610398610521366004612c2d565b610eb3565b34801561053257600080fd5b5061036073aef33e18fc210a22dd42af5578837758b234977081565b61030961055c366004612c60565b610ee9565b34801561056d57600080fd5b506011546103099060ff1681565b34801561058757600080fd5b5061039861112c565b34801561059c57600080fd5b506103606105ab366004612c60565b611175565b3480156105bc57600080fd5b506103ef600e5481565b3480156105d257600080fd5b5061033361119d565b3480156105e757600080fd5b506103096105f6366004612a22565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561062057600080fd5b506103ef61062f366004612a22565b6111ac565b34801561064057600080fd5b50610398611238565b34801561065557600080fd5b50610398610664366004612b85565b61126e565b34801561067557600080fd5b506103ef60105481565b34801561068b57600080fd5b5061039861069a366004612c60565b6113b0565b3480156106ab57600080fd5b506103ef6122b881565b3480156106c157600080fd5b506106d56106d0366004612a22565b6113df565b6040516103159190612d81565b6103986114b6565b3480156106f657600080fd5b50600b546001600160a01b0316610360565b34801561071457600080fd5b50610333611553565b34801561072957600080fd5b506103ef610738366004612a22565b60136020526000908152604090205481565b34801561075657600080fd5b50610309610765366004612a22565b60126020526000908152604090205460ff1681565b34801561078657600080fd5b50610398610795366004612c60565b611562565b3480156107a657600080fd5b506103ef600c5481565b3480156107bc57600080fd5b506103986107cb366004612b22565b611591565b3480156107dc57600080fd5b506103986107eb366004612b85565b611656565b3480156107fc57600080fd5b506103ef600d5481565b34801561081257600080fd5b50610398610821366004612aa9565b61173a565b34801561083257600080fd5b50610398610841366004612c60565b611772565b610309610854366004612c60565b6117a1565b34801561086557600080fd5b506103ef600f5481565b34801561087b57600080fd5b5061033361088a366004612c60565b611aa5565b34801561089b57600080fd5b506103986108aa366004612c2d565b611c74565b3480156108bb57600080fd5b50610398611cb1565b3480156108d057600080fd5b506103096108df366004612a3c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561091957600080fd5b50610398610928366004612a22565b611cf8565b60006301ffc9a760e01b6001600160e01b03198316148061096757506001600160e01b0319821660009081526020819052604090205460ff165b92915050565b60606007805461097c90612f55565b80601f01602080910402602001604051908101604052809291908181526020018280546109a890612f55565b80156109f55780601f106109ca576101008083540402835291602001916109f5565b820191906000526020600020905b8154815290600101906020018083116109d857829003601f168201915b5050505050905090565b6000610a0a82611d90565b610a705760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610a9782611175565b9050806001600160a01b0316836001600160a01b03161415610b055760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a67565b336001600160a01b0382161480610b215750610b2181336108df565b610b935760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a67565b610b9d8383611d9d565b505050565b600b546001600160a01b03163314610bcc5760405162461bcd60e51b8152600401610a6790612e2a565b610bd68282611e0b565b5050565b600b546001600160a01b03163314610c045760405162461bcd60e51b8152600401610a6790612e2a565b6122b881610c10610d1c565b610c1a9190612eb0565b1115610c535760405162461bcd60e51b815260206004820152600860248201526713505617d352539560c21b6044820152606401610a67565b600c54811115610ca55760405162461bcd60e51b815260206004820152601760248201527f4e6f20726573657276656420616e67656c73206c6566740000000000000000006044820152606401610a67565b60005b81811015610b9d57600c8054906000610cc083612f3e565b9190505550610d0a838383818110610ce857634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610cfd9190612a22565b610d05610d1c565b611e94565b80610d1481612f8a565b915050610ca8565b6000610d286002611eae565b905090565b610d373382611eb9565b610d535760405162461bcd60e51b8152600401610a6790612e5f565b610b9d838383611fa3565b6001600160a01b0382166000908152600160205260408120610d809083612124565b9392505050565b600b546001600160a01b03163314610db15760405162461bcd60e51b8152600401610a6790612e2a565b6011805460ff19811660ff90911615179055565b60148054610dd290612f55565b80601f0160208091040260200160405190810160405280929190818152602001828054610dfe90612f55565b8015610e4b5780601f10610e2057610100808354040283529160200191610e4b565b820191906000526020600020905b815481529060010190602001808311610e2e57829003601f168201915b505050505081565b600b546001600160a01b03163314610e7d5760405162461bcd60e51b8152600401610a6790612e2a565b601055565b610b9d8383836040518060200160405280600081525061173a565b600080610eab600284612130565b509392505050565b600b546001600160a01b03163314610edd5760405162461bcd60e51b8152600401610a6790612e2a565b610ee68161214c565b50565b600080610ef4610d1c565b601154909150610100900460ff16610f645760405162461bcd60e51b815260206004820152602d60248201527f546865207075626c69632073616c6520686173204e4f5420737461727465642c60448201526c10383632b0b9b2903bb0b4ba1760991b6064820152608401610a67565b601054831115610fb65760405162461bcd60e51b815260206004820181905260248201527f596f752061726520747279696e6720746f206d696e7420746f6f206d616e792e6044820152606401610a67565b600c54610fc5906122b8612efb565b610fcf8483612eb0565b11156110165760405162461bcd60e51b8152602060048201526016602482015275457863656564696e6720746f74616c20737570706c7960501b6044820152606401610a67565b600e546110239084612edc565b3410156110725760405162461bcd60e51b815260206004820152601d60248201527f45746865722073656e74206973206e6f742073756666696369656e742e0000006044820152606401610a67565b333b63ffffffff16156110c35760405162461bcd60e51b815260206004820152601960248201527810d85b1b195c8818d85b9b9bdd0818994818dbdb9d1c9858dd603a1b6044820152606401610a67565b60005b83811015611122573360009081526013602052604081208054916110e983612f8a565b919050555060006110f8610d1c565b90506122b881101561110f5761110f335b82611e94565b508061111a81612f8a565b9150506110c6565b5060019392505050565b600b546001600160a01b031633146111565760405162461bcd60e51b8152600401610a6790612e2a565b6011805462ff0000198116620100009182900460ff1615909102179055565b600061096782604051806060016040528060298152602001613044602991396002919061215f565b6060600a805461097c90612f55565b60006001600160a01b0382166112175760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a67565b6001600160a01b03821660009081526001602052604090206109679061216c565b600b546001600160a01b031633146112625760405162461bcd60e51b8152600401610a6790612e2a565b61126c6000612176565b565b600b546001600160a01b031633146112985760405162461bcd60e51b8152600401610a6790612e2a565b60005b81811015610b9d5760008383838181106112c557634e487b7160e01b600052603260045260246000fd5b90506020020160208101906112da9190612a22565b90506001600160a01b0381166113215760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b6044820152606401610a67565b6001600160a01b03811660009081526012602052604090205460ff161561137c5760405162461bcd60e51b815260206004820152600f60248201526e4455504c49434154455f454e54525960881b6044820152606401610a67565b6001600160a01b03166000908152601260205260409020805460ff19166001179055806113a881612f8a565b91505061129b565b600b546001600160a01b031633146113da5760405162461bcd60e51b8152600401610a6790612e2a565b600e55565b606060006113ec836111ac565b905080611409576040805160008082526020820190925290610eab565b60008167ffffffffffffffff81111561143257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561145b578160200160208202803683370190505b50905060005b82811015610eab576114738582610d5e565b82828151811061149357634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806114a881612f8a565b915050611461565b50919050565b600b546001600160a01b031633146114e05760405162461bcd60e51b8152600401610a6790612e2a565b60405173aef33e18fc210a22dd42af5578837758b2349770904780156108fc02916000818181858888f1935050505061126c5760405162461bcd60e51b815260206004820152601560248201527415da5d1a191c985dc8155b9cdd58d8d95cdcd99d5b605a1b6044820152606401610a67565b60606008805461097c90612f55565b600b546001600160a01b0316331461158c5760405162461bcd60e51b8152600401610a6790612e2a565b600f55565b6001600160a01b0382163314156115ea5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a67565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b546001600160a01b031633146116805760405162461bcd60e51b8152600401610a6790612e2a565b60005b81811015610b9d5760008383838181106116ad57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906116c29190612a22565b90506001600160a01b0381166117095760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b6044820152606401610a67565b6001600160a01b03166000908152601260205260409020805460ff191690558061173281612f8a565b915050611683565b6117443383611eb9565b6117605760405162461bcd60e51b8152600401610a6790612e5f565b61176c848484846121c8565b50505050565b600b546001600160a01b0316331461179c5760405162461bcd60e51b8152600401610a6790612e2a565b600d55565b6000806117ac610d1c565b60115490915060ff166118145760405162461bcd60e51b815260206004820152602a60248201527f546865207072652d73616c6520686173204e4f5420737461727465642c20706c60448201526932b0b9b2903bb0b4ba1760b11b6064820152608401610a67565b3360009081526012602052604090205460ff166118735760405162461bcd60e51b815260206004820152601960248201527f4e6f74207175616c696669656420666f722070726573616c65000000000000006044820152606401610a67565b600f5433600090815260136020526040902054611891908590612eb0565b11156118df5760405162461bcd60e51b815260206004820152601b60248201527f45786365656465642070726573616c6520616c6c6f636174696f6e00000000006044820152606401610a67565b600c546118ee906122b8612efb565b6118f88483612eb0565b111561193f5760405162461bcd60e51b8152602060048201526016602482015275457863656564696e6720746f74616c20737570706c7960501b6044820152606401610a67565b600d5461194c8483612eb0565b111561199a5760405162461bcd60e51b815260206004820152601960248201527f457863656564696e672070726573616c6520737570706c792e000000000000006044820152606401610a67565b82600e546119a89190612edc565b3410156119f75760405162461bcd60e51b815260206004820152601d60248201527f45746865722073656e74206973206e6f742073756666696369656e742e0000006044820152606401610a67565b333b63ffffffff1615611a485760405162461bcd60e51b815260206004820152601960248201527810d85b1b195c8818d85b9b9bdd0818994818dbdb9d1c9858dd603a1b6044820152606401610a67565b60005b8381101561112257336000908152601360205260408120805491611a6e83612f8a565b91905055506000611a7d610d1c565b90506122b8811015611a9257611a9233611109565b5080611a9d81612f8a565b915050611a4b565b6060611aaf610d1c565b8210611af05760405162461bcd60e51b815260206004820152601060248201526f2a37b5b2b7103737ba1032bc34b9ba1760811b6044820152606401610a67565b60115462010000900460ff16611b925760148054611b0d90612f55565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3990612f55565b8015611b865780601f10611b5b57610100808354040283529160200191611b86565b820191906000526020600020905b815481529060010190602001808311611b6957829003601f168201915b50505050509050919050565b60008281526009602052604081208054611bab90612f55565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd790612f55565b8015611c245780601f10611bf957610100808354040283529160200191611c24565b820191906000526020600020905b815481529060010190602001808311611c0757829003601f168201915b50505050509050600081511115611c3b5792915050565b611c4361119d565b611c4c846121fb565b604051602001611c5d929190612d05565b604051602081830303815290604052915050919050565b600b546001600160a01b03163314611c9e5760405162461bcd60e51b8152600401610a6790612e2a565b8051610bd69060149060208401906128d8565b600b546001600160a01b03163314611cdb5760405162461bcd60e51b8152600401610a6790612e2a565b6011805461ff001981166101009182900460ff1615909102179055565b600b546001600160a01b03163314611d225760405162461bcd60e51b8152600401610a6790612e2a565b6001600160a01b038116611d875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a67565b610ee681612176565b6000610967600283612315565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dd282611175565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611e1482611d90565b611e755760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a67565b60008281526009602090815260409091208251610b9d928401906128d8565b610bd6828260405180602001604052806000815250612321565b600061096782612354565b6000611ec482611d90565b611f255760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a67565b6000611f3083611175565b9050806001600160a01b0316846001600160a01b03161480611f6b5750836001600160a01b0316611f60846109ff565b6001600160a01b0316145b80611f9b57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611fb682611175565b6001600160a01b03161461201e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a67565b6001600160a01b0382166120805760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a67565b61208b600082611d9d565b6001600160a01b03831660009081526001602052604090206120ad908261235f565b506001600160a01b03821660009081526001602052604090206120d0908261236b565b506120dd60028284612377565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610d80838361238d565b600080808061213f86866123c5565b9097909650945050505050565b8051610bd690600a9060208401906128d8565b6000611f9b8484846123f0565b6000610967825490565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6121d3848484611fa3565b6121df8484848461243c565b61176c5760405162461bcd60e51b8152600401610a6790612dd8565b60608161221f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612249578061223381612f8a565b91506122429050600a83612ec8565b9150612223565b60008167ffffffffffffffff81111561227257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561229c576020820181803683370190505b5090505b8415611f9b576122b1600183612efb565b91506122be600a86612fa5565b6122c9906030612eb0565b60f81b8183815181106122ec57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061230e600a86612ec8565b94506122a0565b6000610d80838361250d565b61232b838361252c565b612338600084848461243c565b610b9d5760405162461bcd60e51b8152600401610a6790612dd8565b60006109678261216c565b6000610d808383612644565b6000610d808383612761565b6000611f9b84846001600160a01b0385166127b0565b60008260000182815481106123b257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600080806123d38585612124565b600081815260029690960160205260409095205494959350505050565b6000828152600284016020526040812054801515806124145750612414858561250d565b83906124335760405162461bcd60e51b8152600401610a679190612dc5565b50949350505050565b60006001600160a01b0384163b61245557506001611f9b565b60006124d6630a85bd0160e11b338887876040516024016124799493929190612d44565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001613012603291396001600160a01b03881691906127cd565b90506000818060200190518101906124ee9190612c11565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b6000610d80838360008181526001830160205260408120541515610d80565b6001600160a01b0382166125825760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a67565b61258b81611d90565b156125d85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a67565b6001600160a01b03821660009081526001602052604090206125fa908261236b565b5061260760028284612377565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526001830160205260408120548015612757576000612668600183612efb565b855490915060009061267c90600190612efb565b90508181146126fd5760008660000182815481106126aa57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050808760000184815481106126db57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b855486908061271c57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610967565b6000915050610967565b60008181526001830160205260408120546127a857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610967565b506000610967565b60008281526002840160205260408120829055611f9b848461236b565b6060611f9b848460008585843b6128265760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a67565b600080866001600160a01b031685876040516128429190612ce9565b60006040518083038185875af1925050503d806000811461287f576040519150601f19603f3d011682016040523d82523d6000602084013e612884565b606091505b509150915061289482828661289f565b979650505050505050565b606083156128ae575081610d80565b8251156128be5782518084602001fd5b8160405162461bcd60e51b8152600401610a679190612dc5565b8280546128e490612f55565b90600052602060002090601f016020900481019282612906576000855561294c565b82601f1061291f57805160ff191683800117855561294c565b8280016001018555821561294c579182015b8281111561294c578251825591602001919060010190612931565b5061295892915061295c565b5090565b5b80821115612958576000815560010161295d565b600067ffffffffffffffff8084111561298c5761298c612fe5565b604051601f8501601f19908116603f011681019082821181831017156129b4576129b4612fe5565b816040528093508581528686860111156129cd57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146129fe57600080fd5b919050565b600082601f830112612a13578081fd5b610d8083833560208501612971565b600060208284031215612a33578081fd5b610d80826129e7565b60008060408385031215612a4e578081fd5b612a57836129e7565b9150612a65602084016129e7565b90509250929050565b600080600060608486031215612a82578081fd5b612a8b846129e7565b9250612a99602085016129e7565b9150604084013590509250925092565b60008060008060808587031215612abe578081fd5b612ac7856129e7565b9350612ad5602086016129e7565b925060408501359150606085013567ffffffffffffffff811115612af7578182fd5b8501601f81018713612b07578182fd5b612b1687823560208401612971565b91505092959194509250565b60008060408385031215612b34578182fd5b612b3d836129e7565b915060208301358015158114612b51578182fd5b809150509250929050565b60008060408385031215612b6e578182fd5b612b77836129e7565b946020939093013593505050565b60008060208385031215612b97578182fd5b823567ffffffffffffffff80821115612bae578384fd5b818501915085601f830112612bc1578384fd5b813581811115612bcf578485fd5b8660208260051b8501011115612be3578485fd5b60209290920196919550909350505050565b600060208284031215612c06578081fd5b8135610d8081612ffb565b600060208284031215612c22578081fd5b8151610d8081612ffb565b600060208284031215612c3e578081fd5b813567ffffffffffffffff811115612c54578182fd5b611f9b84828501612a03565b600060208284031215612c71578081fd5b5035919050565b60008060408385031215612c8a578182fd5b82359150602083013567ffffffffffffffff811115612ca7578182fd5b612cb385828601612a03565b9150509250929050565b60008151808452612cd5816020860160208601612f12565b601f01601f19169290920160200192915050565b60008251612cfb818460208701612f12565b9190910192915050565b60008351612d17818460208801612f12565b835190830190612d2b818360208801612f12565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d7790830184612cbd565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612db957835183529284019291840191600101612d9d565b50909695505050505050565b602081526000610d806020830184612cbd565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612ec357612ec3612fb9565b500190565b600082612ed757612ed7612fcf565b500490565b6000816000190483118215151615612ef657612ef6612fb9565b500290565b600082821015612f0d57612f0d612fb9565b500390565b60005b83811015612f2d578181015183820152602001612f15565b8381111561176c5750506000910152565b600081612f4d57612f4d612fb9565b506000190190565b600181811c90821680612f6957607f821691505b602082108114156114b057634e487b7160e01b600052602260045260246000fd5b6000600019821415612f9e57612f9e612fb9565b5060010190565b600082612fb457612fb4612fcf565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610ee657600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220862af439c4f469fca7c19bcb81fe8be1d03602ccd31da8bfaa4e050f3f48ff2264736f6c6343000804003368747470733a2f2f616e67656c736f617369732e6d7970696e6174612e636c6f75642f697066732f516d624c61655067644c71317939534b475264454a327042456553366f773647556f356e70694e6853567247724c
Deployed Bytecode
0x6080604052600436106102e45760003560e01c806370a0823111610190578063a20c7254116100dc578063b988477211610095578063da1b9e081161006f578063da1b9e081461088f578063e222c7f9146108af578063e985e9c5146108c4578063f2fde38b1461090d57600080fd5b8063b988477214610846578063c81d60bd14610859578063c87b56dd1461086f57600080fd5b8063a20c72541461079a578063a22cb465146107b0578063b179e060146107d0578063b3a196e9146107f0578063b88d4fde14610806578063b96502cb1461082657600080fd5b80638462151c1161014957806395d89b411161012357806395d89b41146107085780639bf803161461071d5780639cf2e8d61461074a578063a06f269b1461077a57600080fd5b80638462151c146106b5578063853828b6146106e25780638da5cb5b146106ea57600080fd5b806370a0823114610614578063715018a6146106345780637204a3c91461064957806376c71ca1146106695780637d7eee421461067f5780638224dd281461069f57600080fd5b80634070a0c91161024f5780635a5e5d58116102085780636352211e116101e25780636352211e146105905780636817c76c146105b05780636c0360eb146105c65780636f9170f6146105db57600080fd5b80635a5e5d581461054e5780635a7adf7f146105615780635b8ad4291461057b57600080fd5b80634070a0c91461048657806342842e0e146104a65780634f6ccce7146104c657806351830227146104e657806355f804b314610506578063562f9e471461052657600080fd5b806318160ddd116102a157806318160ddd146103da57806323b872dd146103fd5780632f745c591461041d57806333bc1c5c1461043d578063343937431461045c5780633a367a671461047157600080fd5b806301ffc9a7146102e957806306fdde031461031e578063081812fc14610340578063095ea7b314610378578063162094c41461039a578063163e1e61146103ba575b600080fd5b3480156102f557600080fd5b50610309610304366004612bf5565b61092d565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b5061033361096d565b6040516103159190612dc5565b34801561034c57600080fd5b5061036061035b366004612c60565b6109ff565b6040516001600160a01b039091168152602001610315565b34801561038457600080fd5b50610398610393366004612b5c565b610a8c565b005b3480156103a657600080fd5b506103986103b5366004612c78565b610ba2565b3480156103c657600080fd5b506103986103d5366004612b85565b610bda565b3480156103e657600080fd5b506103ef610d1c565b604051908152602001610315565b34801561040957600080fd5b50610398610418366004612a6e565b610d2d565b34801561042957600080fd5b506103ef610438366004612b5c565b610d5e565b34801561044957600080fd5b5060115461030990610100900460ff1681565b34801561046857600080fd5b50610398610d87565b34801561047d57600080fd5b50610333610dc5565b34801561049257600080fd5b506103986104a1366004612c60565b610e53565b3480156104b257600080fd5b506103986104c1366004612a6e565b610e82565b3480156104d257600080fd5b506103ef6104e1366004612c60565b610e9d565b3480156104f257600080fd5b506011546103099062010000900460ff1681565b34801561051257600080fd5b50610398610521366004612c2d565b610eb3565b34801561053257600080fd5b5061036073aef33e18fc210a22dd42af5578837758b234977081565b61030961055c366004612c60565b610ee9565b34801561056d57600080fd5b506011546103099060ff1681565b34801561058757600080fd5b5061039861112c565b34801561059c57600080fd5b506103606105ab366004612c60565b611175565b3480156105bc57600080fd5b506103ef600e5481565b3480156105d257600080fd5b5061033361119d565b3480156105e757600080fd5b506103096105f6366004612a22565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561062057600080fd5b506103ef61062f366004612a22565b6111ac565b34801561064057600080fd5b50610398611238565b34801561065557600080fd5b50610398610664366004612b85565b61126e565b34801561067557600080fd5b506103ef60105481565b34801561068b57600080fd5b5061039861069a366004612c60565b6113b0565b3480156106ab57600080fd5b506103ef6122b881565b3480156106c157600080fd5b506106d56106d0366004612a22565b6113df565b6040516103159190612d81565b6103986114b6565b3480156106f657600080fd5b50600b546001600160a01b0316610360565b34801561071457600080fd5b50610333611553565b34801561072957600080fd5b506103ef610738366004612a22565b60136020526000908152604090205481565b34801561075657600080fd5b50610309610765366004612a22565b60126020526000908152604090205460ff1681565b34801561078657600080fd5b50610398610795366004612c60565b611562565b3480156107a657600080fd5b506103ef600c5481565b3480156107bc57600080fd5b506103986107cb366004612b22565b611591565b3480156107dc57600080fd5b506103986107eb366004612b85565b611656565b3480156107fc57600080fd5b506103ef600d5481565b34801561081257600080fd5b50610398610821366004612aa9565b61173a565b34801561083257600080fd5b50610398610841366004612c60565b611772565b610309610854366004612c60565b6117a1565b34801561086557600080fd5b506103ef600f5481565b34801561087b57600080fd5b5061033361088a366004612c60565b611aa5565b34801561089b57600080fd5b506103986108aa366004612c2d565b611c74565b3480156108bb57600080fd5b50610398611cb1565b3480156108d057600080fd5b506103096108df366004612a3c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561091957600080fd5b50610398610928366004612a22565b611cf8565b60006301ffc9a760e01b6001600160e01b03198316148061096757506001600160e01b0319821660009081526020819052604090205460ff165b92915050565b60606007805461097c90612f55565b80601f01602080910402602001604051908101604052809291908181526020018280546109a890612f55565b80156109f55780601f106109ca576101008083540402835291602001916109f5565b820191906000526020600020905b8154815290600101906020018083116109d857829003601f168201915b5050505050905090565b6000610a0a82611d90565b610a705760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610a9782611175565b9050806001600160a01b0316836001600160a01b03161415610b055760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a67565b336001600160a01b0382161480610b215750610b2181336108df565b610b935760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a67565b610b9d8383611d9d565b505050565b600b546001600160a01b03163314610bcc5760405162461bcd60e51b8152600401610a6790612e2a565b610bd68282611e0b565b5050565b600b546001600160a01b03163314610c045760405162461bcd60e51b8152600401610a6790612e2a565b6122b881610c10610d1c565b610c1a9190612eb0565b1115610c535760405162461bcd60e51b815260206004820152600860248201526713505617d352539560c21b6044820152606401610a67565b600c54811115610ca55760405162461bcd60e51b815260206004820152601760248201527f4e6f20726573657276656420616e67656c73206c6566740000000000000000006044820152606401610a67565b60005b81811015610b9d57600c8054906000610cc083612f3e565b9190505550610d0a838383818110610ce857634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610cfd9190612a22565b610d05610d1c565b611e94565b80610d1481612f8a565b915050610ca8565b6000610d286002611eae565b905090565b610d373382611eb9565b610d535760405162461bcd60e51b8152600401610a6790612e5f565b610b9d838383611fa3565b6001600160a01b0382166000908152600160205260408120610d809083612124565b9392505050565b600b546001600160a01b03163314610db15760405162461bcd60e51b8152600401610a6790612e2a565b6011805460ff19811660ff90911615179055565b60148054610dd290612f55565b80601f0160208091040260200160405190810160405280929190818152602001828054610dfe90612f55565b8015610e4b5780601f10610e2057610100808354040283529160200191610e4b565b820191906000526020600020905b815481529060010190602001808311610e2e57829003601f168201915b505050505081565b600b546001600160a01b03163314610e7d5760405162461bcd60e51b8152600401610a6790612e2a565b601055565b610b9d8383836040518060200160405280600081525061173a565b600080610eab600284612130565b509392505050565b600b546001600160a01b03163314610edd5760405162461bcd60e51b8152600401610a6790612e2a565b610ee68161214c565b50565b600080610ef4610d1c565b601154909150610100900460ff16610f645760405162461bcd60e51b815260206004820152602d60248201527f546865207075626c69632073616c6520686173204e4f5420737461727465642c60448201526c10383632b0b9b2903bb0b4ba1760991b6064820152608401610a67565b601054831115610fb65760405162461bcd60e51b815260206004820181905260248201527f596f752061726520747279696e6720746f206d696e7420746f6f206d616e792e6044820152606401610a67565b600c54610fc5906122b8612efb565b610fcf8483612eb0565b11156110165760405162461bcd60e51b8152602060048201526016602482015275457863656564696e6720746f74616c20737570706c7960501b6044820152606401610a67565b600e546110239084612edc565b3410156110725760405162461bcd60e51b815260206004820152601d60248201527f45746865722073656e74206973206e6f742073756666696369656e742e0000006044820152606401610a67565b333b63ffffffff16156110c35760405162461bcd60e51b815260206004820152601960248201527810d85b1b195c8818d85b9b9bdd0818994818dbdb9d1c9858dd603a1b6044820152606401610a67565b60005b83811015611122573360009081526013602052604081208054916110e983612f8a565b919050555060006110f8610d1c565b90506122b881101561110f5761110f335b82611e94565b508061111a81612f8a565b9150506110c6565b5060019392505050565b600b546001600160a01b031633146111565760405162461bcd60e51b8152600401610a6790612e2a565b6011805462ff0000198116620100009182900460ff1615909102179055565b600061096782604051806060016040528060298152602001613044602991396002919061215f565b6060600a805461097c90612f55565b60006001600160a01b0382166112175760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a67565b6001600160a01b03821660009081526001602052604090206109679061216c565b600b546001600160a01b031633146112625760405162461bcd60e51b8152600401610a6790612e2a565b61126c6000612176565b565b600b546001600160a01b031633146112985760405162461bcd60e51b8152600401610a6790612e2a565b60005b81811015610b9d5760008383838181106112c557634e487b7160e01b600052603260045260246000fd5b90506020020160208101906112da9190612a22565b90506001600160a01b0381166113215760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b6044820152606401610a67565b6001600160a01b03811660009081526012602052604090205460ff161561137c5760405162461bcd60e51b815260206004820152600f60248201526e4455504c49434154455f454e54525960881b6044820152606401610a67565b6001600160a01b03166000908152601260205260409020805460ff19166001179055806113a881612f8a565b91505061129b565b600b546001600160a01b031633146113da5760405162461bcd60e51b8152600401610a6790612e2a565b600e55565b606060006113ec836111ac565b905080611409576040805160008082526020820190925290610eab565b60008167ffffffffffffffff81111561143257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561145b578160200160208202803683370190505b50905060005b82811015610eab576114738582610d5e565b82828151811061149357634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806114a881612f8a565b915050611461565b50919050565b600b546001600160a01b031633146114e05760405162461bcd60e51b8152600401610a6790612e2a565b60405173aef33e18fc210a22dd42af5578837758b2349770904780156108fc02916000818181858888f1935050505061126c5760405162461bcd60e51b815260206004820152601560248201527415da5d1a191c985dc8155b9cdd58d8d95cdcd99d5b605a1b6044820152606401610a67565b60606008805461097c90612f55565b600b546001600160a01b0316331461158c5760405162461bcd60e51b8152600401610a6790612e2a565b600f55565b6001600160a01b0382163314156115ea5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a67565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b546001600160a01b031633146116805760405162461bcd60e51b8152600401610a6790612e2a565b60005b81811015610b9d5760008383838181106116ad57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906116c29190612a22565b90506001600160a01b0381166117095760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b6044820152606401610a67565b6001600160a01b03166000908152601260205260409020805460ff191690558061173281612f8a565b915050611683565b6117443383611eb9565b6117605760405162461bcd60e51b8152600401610a6790612e5f565b61176c848484846121c8565b50505050565b600b546001600160a01b0316331461179c5760405162461bcd60e51b8152600401610a6790612e2a565b600d55565b6000806117ac610d1c565b60115490915060ff166118145760405162461bcd60e51b815260206004820152602a60248201527f546865207072652d73616c6520686173204e4f5420737461727465642c20706c60448201526932b0b9b2903bb0b4ba1760b11b6064820152608401610a67565b3360009081526012602052604090205460ff166118735760405162461bcd60e51b815260206004820152601960248201527f4e6f74207175616c696669656420666f722070726573616c65000000000000006044820152606401610a67565b600f5433600090815260136020526040902054611891908590612eb0565b11156118df5760405162461bcd60e51b815260206004820152601b60248201527f45786365656465642070726573616c6520616c6c6f636174696f6e00000000006044820152606401610a67565b600c546118ee906122b8612efb565b6118f88483612eb0565b111561193f5760405162461bcd60e51b8152602060048201526016602482015275457863656564696e6720746f74616c20737570706c7960501b6044820152606401610a67565b600d5461194c8483612eb0565b111561199a5760405162461bcd60e51b815260206004820152601960248201527f457863656564696e672070726573616c6520737570706c792e000000000000006044820152606401610a67565b82600e546119a89190612edc565b3410156119f75760405162461bcd60e51b815260206004820152601d60248201527f45746865722073656e74206973206e6f742073756666696369656e742e0000006044820152606401610a67565b333b63ffffffff1615611a485760405162461bcd60e51b815260206004820152601960248201527810d85b1b195c8818d85b9b9bdd0818994818dbdb9d1c9858dd603a1b6044820152606401610a67565b60005b8381101561112257336000908152601360205260408120805491611a6e83612f8a565b91905055506000611a7d610d1c565b90506122b8811015611a9257611a9233611109565b5080611a9d81612f8a565b915050611a4b565b6060611aaf610d1c565b8210611af05760405162461bcd60e51b815260206004820152601060248201526f2a37b5b2b7103737ba1032bc34b9ba1760811b6044820152606401610a67565b60115462010000900460ff16611b925760148054611b0d90612f55565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3990612f55565b8015611b865780601f10611b5b57610100808354040283529160200191611b86565b820191906000526020600020905b815481529060010190602001808311611b6957829003601f168201915b50505050509050919050565b60008281526009602052604081208054611bab90612f55565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd790612f55565b8015611c245780601f10611bf957610100808354040283529160200191611c24565b820191906000526020600020905b815481529060010190602001808311611c0757829003601f168201915b50505050509050600081511115611c3b5792915050565b611c4361119d565b611c4c846121fb565b604051602001611c5d929190612d05565b604051602081830303815290604052915050919050565b600b546001600160a01b03163314611c9e5760405162461bcd60e51b8152600401610a6790612e2a565b8051610bd69060149060208401906128d8565b600b546001600160a01b03163314611cdb5760405162461bcd60e51b8152600401610a6790612e2a565b6011805461ff001981166101009182900460ff1615909102179055565b600b546001600160a01b03163314611d225760405162461bcd60e51b8152600401610a6790612e2a565b6001600160a01b038116611d875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a67565b610ee681612176565b6000610967600283612315565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dd282611175565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611e1482611d90565b611e755760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a67565b60008281526009602090815260409091208251610b9d928401906128d8565b610bd6828260405180602001604052806000815250612321565b600061096782612354565b6000611ec482611d90565b611f255760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a67565b6000611f3083611175565b9050806001600160a01b0316846001600160a01b03161480611f6b5750836001600160a01b0316611f60846109ff565b6001600160a01b0316145b80611f9b57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611fb682611175565b6001600160a01b03161461201e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a67565b6001600160a01b0382166120805760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a67565b61208b600082611d9d565b6001600160a01b03831660009081526001602052604090206120ad908261235f565b506001600160a01b03821660009081526001602052604090206120d0908261236b565b506120dd60028284612377565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610d80838361238d565b600080808061213f86866123c5565b9097909650945050505050565b8051610bd690600a9060208401906128d8565b6000611f9b8484846123f0565b6000610967825490565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6121d3848484611fa3565b6121df8484848461243c565b61176c5760405162461bcd60e51b8152600401610a6790612dd8565b60608161221f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612249578061223381612f8a565b91506122429050600a83612ec8565b9150612223565b60008167ffffffffffffffff81111561227257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561229c576020820181803683370190505b5090505b8415611f9b576122b1600183612efb565b91506122be600a86612fa5565b6122c9906030612eb0565b60f81b8183815181106122ec57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061230e600a86612ec8565b94506122a0565b6000610d80838361250d565b61232b838361252c565b612338600084848461243c565b610b9d5760405162461bcd60e51b8152600401610a6790612dd8565b60006109678261216c565b6000610d808383612644565b6000610d808383612761565b6000611f9b84846001600160a01b0385166127b0565b60008260000182815481106123b257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600080806123d38585612124565b600081815260029690960160205260409095205494959350505050565b6000828152600284016020526040812054801515806124145750612414858561250d565b83906124335760405162461bcd60e51b8152600401610a679190612dc5565b50949350505050565b60006001600160a01b0384163b61245557506001611f9b565b60006124d6630a85bd0160e11b338887876040516024016124799493929190612d44565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001613012603291396001600160a01b03881691906127cd565b90506000818060200190518101906124ee9190612c11565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b6000610d80838360008181526001830160205260408120541515610d80565b6001600160a01b0382166125825760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a67565b61258b81611d90565b156125d85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a67565b6001600160a01b03821660009081526001602052604090206125fa908261236b565b5061260760028284612377565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526001830160205260408120548015612757576000612668600183612efb565b855490915060009061267c90600190612efb565b90508181146126fd5760008660000182815481106126aa57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050808760000184815481106126db57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b855486908061271c57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610967565b6000915050610967565b60008181526001830160205260408120546127a857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610967565b506000610967565b60008281526002840160205260408120829055611f9b848461236b565b6060611f9b848460008585843b6128265760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a67565b600080866001600160a01b031685876040516128429190612ce9565b60006040518083038185875af1925050503d806000811461287f576040519150601f19603f3d011682016040523d82523d6000602084013e612884565b606091505b509150915061289482828661289f565b979650505050505050565b606083156128ae575081610d80565b8251156128be5782518084602001fd5b8160405162461bcd60e51b8152600401610a679190612dc5565b8280546128e490612f55565b90600052602060002090601f016020900481019282612906576000855561294c565b82601f1061291f57805160ff191683800117855561294c565b8280016001018555821561294c579182015b8281111561294c578251825591602001919060010190612931565b5061295892915061295c565b5090565b5b80821115612958576000815560010161295d565b600067ffffffffffffffff8084111561298c5761298c612fe5565b604051601f8501601f19908116603f011681019082821181831017156129b4576129b4612fe5565b816040528093508581528686860111156129cd57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146129fe57600080fd5b919050565b600082601f830112612a13578081fd5b610d8083833560208501612971565b600060208284031215612a33578081fd5b610d80826129e7565b60008060408385031215612a4e578081fd5b612a57836129e7565b9150612a65602084016129e7565b90509250929050565b600080600060608486031215612a82578081fd5b612a8b846129e7565b9250612a99602085016129e7565b9150604084013590509250925092565b60008060008060808587031215612abe578081fd5b612ac7856129e7565b9350612ad5602086016129e7565b925060408501359150606085013567ffffffffffffffff811115612af7578182fd5b8501601f81018713612b07578182fd5b612b1687823560208401612971565b91505092959194509250565b60008060408385031215612b34578182fd5b612b3d836129e7565b915060208301358015158114612b51578182fd5b809150509250929050565b60008060408385031215612b6e578182fd5b612b77836129e7565b946020939093013593505050565b60008060208385031215612b97578182fd5b823567ffffffffffffffff80821115612bae578384fd5b818501915085601f830112612bc1578384fd5b813581811115612bcf578485fd5b8660208260051b8501011115612be3578485fd5b60209290920196919550909350505050565b600060208284031215612c06578081fd5b8135610d8081612ffb565b600060208284031215612c22578081fd5b8151610d8081612ffb565b600060208284031215612c3e578081fd5b813567ffffffffffffffff811115612c54578182fd5b611f9b84828501612a03565b600060208284031215612c71578081fd5b5035919050565b60008060408385031215612c8a578182fd5b82359150602083013567ffffffffffffffff811115612ca7578182fd5b612cb385828601612a03565b9150509250929050565b60008151808452612cd5816020860160208601612f12565b601f01601f19169290920160200192915050565b60008251612cfb818460208701612f12565b9190910192915050565b60008351612d17818460208801612f12565b835190830190612d2b818360208801612f12565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d7790830184612cbd565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612db957835183529284019291840191600101612d9d565b50909695505050505050565b602081526000610d806020830184612cbd565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612ec357612ec3612fb9565b500190565b600082612ed757612ed7612fcf565b500490565b6000816000190483118215151615612ef657612ef6612fb9565b500290565b600082821015612f0d57612f0d612fb9565b500390565b60005b83811015612f2d578181015183820152602001612f15565b8381111561176c5750506000910152565b600081612f4d57612f4d612fb9565b506000190190565b600181811c90821680612f6957607f821691505b602082108114156114b057634e487b7160e01b600052602260045260246000fd5b6000600019821415612f9e57612f9e612fb9565b5060010190565b600082612fb457612fb4612fcf565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610ee657600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220862af439c4f469fca7c19bcb81fe8be1d03602ccd31da8bfaa4e050f3f48ff2264736f6c63430008040033
Deployed Bytecode Sourcemap
105:6535:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;523:188:4;;;;;;;;;;-1:-1:-1;523:188:4;;;;;:::i;:::-;;:::i;:::-;;;8063:14:17;;8056:22;8038:41;;8026:2;8011:18;523:188:4;;;;;;;;4431:90:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;7052:209::-;;;;;;;;;;-1:-1:-1;7052:209:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6721:32:17;;;6703:51;;6691:2;6676:18;7052:209:5;6658:102:17;6610:381:5;;;;;;;;;;-1:-1:-1;6610:381:5;;;;;:::i;:::-;;:::i;:::-;;5529:149:1;;;;;;;;;;-1:-1:-1;5529:149:1;;;;;:::i;:::-;;:::i;1577:377::-;;;;;;;;;;-1:-1:-1;1577:377:1;;;;;:::i;:::-;;:::i;6120:200:5:-;;;;;;;;;;;;;:::i;:::-;;;20575:25:17;;;20563:2;20548:18;6120:200:5;20530:76:17;7900:300:5;;;;;;;;;;-1:-1:-1;7900:300:5;;;;;:::i;:::-;;:::i;5897:152::-;;;;;;;;;;-1:-1:-1;5897:152:5;;;;;:::i;:::-;;:::i;560:22:1:-;;;;;;;;;;-1:-1:-1;560:22:1;;;;;;;;;;;5137:77;;;;;;;;;;;;;:::i;728:123::-;;;;;;;;;;;;;:::i;5909:90::-;;;;;;;;;;-1:-1:-1;5909:90:1;;;;;:::i;:::-;;:::i;8266:149:5:-;;;;;;;;;;-1:-1:-1;8266:149:5;;;;;:::i;:::-;;:::i;6392:161::-;;;;;;;;;;-1:-1:-1;6392:161:5;;;;;:::i;:::-;;:::i;588:20:1:-;;;;;;;;;;-1:-1:-1;588:20:1;;;;;;;;;;;5418:105;;;;;;;;;;-1:-1:-1;5418:105:1;;;;;:::i;:::-;;:::i;456:72::-;;;;;;;;;;;;486:42;456:72;;3020:801;;;;;;:::i;:::-;;:::i;535:19::-;;;;;;;;;;-1:-1:-1;535:19:1;;;;;;;;5220:78;;;;;;;;;;;;;:::i;4202:167:5:-;;;;;;;;;;-1:-1:-1;4202:167:5;;;;;:::i;:::-;;:::i;311:37:1:-;;;;;;;;;;;;;;;;5731:87:5;;;;;;;;;;;;;:::i;6331:110:1:-;;;;;;;;;;-1:-1:-1;6331:110:1;;;;;:::i;:::-;-1:-1:-1;;;;;6415:19:1;6392:4;6415:19;;;:12;:19;;;;;;;;;6331:110;3934:211:5;;;;;;;;;;-1:-1:-1;3934:211:5;;;;;:::i;:::-;;:::i;1598:92:14:-;;;;;;;;;;;;;:::i;909:346:1:-;;;;;;;;;;-1:-1:-1;909:346:1;;;;;:::i;:::-;;:::i;394:27::-;;;;;;;;;;;;;;;;5804:99;;;;;;;;;;-1:-1:-1;5804:99:1;;;;;:::i;:::-;;:::i;183:41::-;;;;;;;;;;;;220:4;183:41;;3827:512;;;;;;;;;;-1:-1:-1;3827:512:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6129:196::-;;;:::i;966:85:14:-;;;;;;;;;;-1:-1:-1;1038:6:14;;-1:-1:-1;;;;;1038:6:14;966:85;;4585:94:5;;;;;;;;;;;;;:::i;665:56:1:-;;;;;;;;;;-1:-1:-1;665:56:1;;;;;:::i;:::-;;;;;;;;;;;;;;615:44;;;;;;;;;;-1:-1:-1;615:44:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;6005:118;;;;;;;;;;-1:-1:-1;6005:118:1;;;;;:::i;:::-;;:::i;230:34::-;;;;;;;;;;;;;;;;7328:290:5;;;;;;;;;;-1:-1:-1;7328:290:5;;;;;:::i;:::-;;:::i;1261:310:1:-;;;;;;;;;;-1:-1:-1;1261:310:1;;;;;:::i;:::-;;:::i;270:35::-;;;;;;;;;;;;;;;;8481:282:5;;;;;;;;;;-1:-1:-1;8481:282:5;;;;;:::i;:::-;;:::i;5684:114:1:-;;;;;;;;;;-1:-1:-1;5684:114:1;;;;;:::i;:::-;;:::i;1960:1054::-;;;;;;:::i;:::-;;:::i;354:34::-;;;;;;;;;;;;;;;;4345:637;;;;;;;;;;-1:-1:-1;4345:637:1;;;;;:::i;:::-;;:::i;5304:108::-;;;;;;;;;;-1:-1:-1;5304:108:1;;;;;:::i;:::-;;:::i;5045:86::-;;;;;;;;;;;;;:::i;7684:154:5:-;;;;;;;;;;-1:-1:-1;7684:154:5;;;;;:::i;:::-;-1:-1:-1;;;;;7796:25:5;;;7773:4;7796:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;7684:154;1839:189:14;;;;;;;;;;-1:-1:-1;1839:189:14;;;;;:::i;:::-;;:::i;523:188:4:-;608:4;-1:-1:-1;;;;;;;;;871:40:3;;;631:73:4;;;-1:-1:-1;;;;;;;671:33:4;;:20;:33;;;;;;;;;;;;;631:73;624:80;523:188;-1:-1:-1;;523:188:4:o;4431:90:5:-;4477:13;4509:5;4502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4431:90;:::o;7052:209::-;7120:7;7147:16;7155:7;7147;:16::i;:::-;7139:73;;;;-1:-1:-1;;;7139:73:5;;17091:2:17;7139:73:5;;;17073:21:17;17130:2;17110:18;;;17103:30;17169:34;17149:18;;;17142:62;-1:-1:-1;;;17220:18:17;;;17213:42;17272:19;;7139:73:5;;;;;;;;;-1:-1:-1;7230:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;7230:24:5;;7052:209::o;6610:381::-;6690:13;6706:16;6714:7;6706;:16::i;:::-;6690:32;;6746:5;-1:-1:-1;;;;;6740:11:5;:2;-1:-1:-1;;;;;6740:11:5;;;6732:57;;;;-1:-1:-1;;;6732:57:5;;18688:2:17;6732:57:5;;;18670:21:17;18727:2;18707:18;;;18700:30;18766:34;18746:18;;;18739:62;-1:-1:-1;;;18817:18:17;;;18810:31;18858:19;;6732:57:5;18660:223:17;6732:57:5;665:10:2;-1:-1:-1;;;;;6808:21:5;;;;:62;;-1:-1:-1;6833:37:5;6850:5;665:10:2;7684:154:5;:::i;6833:37::-;6800:152;;;;-1:-1:-1;;;6800:152:5;;13779:2:17;6800:152:5;;;13761:21:17;13818:2;13798:18;;;13791:30;13857:34;13837:18;;;13830:62;13928:26;13908:18;;;13901:54;13972:19;;6800:152:5;13751:246:17;6800:152:5;6963:21;6972:2;6976:7;6963:8;:21::i;:::-;6610:381;;;:::o;5529:149:1:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;5639:32:1::1;5652:7;5661:9;5639:12;:32::i;:::-;5529:149:::0;;:::o;1577:377::-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;220:4:1::1;1674:9:::0;1658:13:::1;:11;:13::i;:::-;:32;;;;:::i;:::-;:46;;1650:67;;;::::0;-1:-1:-1;;;1650:67:1;;16038:2:17;1650:67:1::1;::::0;::::1;16020:21:17::0;16077:1;16057:18;;;16050:29;-1:-1:-1;;;16095:18:17;;;16088:38;16143:18;;1650:67:1::1;16010:157:17::0;1650:67:1::1;1755:14;::::0;1735:34;::::1;;1727:70;;;::::0;-1:-1:-1;;;1727:70:1;;10451:2:17;1727:70:1::1;::::0;::::1;10433:21:17::0;10490:2;10470:18;;;10463:30;10529:25;10509:18;;;10502:53;10572:18;;1727:70:1::1;10423:173:17::0;1727:70:1::1;1813:9;1808:140;1828:20:::0;;::::1;1808:140;;;1869:14;:16:::0;;;:14:::1;:16;::::0;::::1;:::i;:::-;;;;;;1899:38;1909:9;;1919:1;1909:12;;;;;-1:-1:-1::0;;;1909:12:1::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1923:13;:11;:13::i;:::-;1899:9;:38::i;:::-;1850:3:::0;::::1;::::0;::::1;:::i;:::-;;;;1808:140;;6120:200:5::0;6173:7;6292:21;:12;:19;:21::i;:::-;6285:28;;6120:200;:::o;7900:300::-;8059:41;665:10:2;8092:7:5;8059:18;:41::i;:::-;8051:103;;;;-1:-1:-1;;;8051:103:5;;;;;;;:::i;:::-;8165:28;8175:4;8181:2;8185:7;8165:9;:28::i;5897:152::-;-1:-1:-1;;;;;6012:20:5;;5986:7;6012:20;;;:13;:20;;;;;:30;;6036:5;6012:23;:30::i;:::-;6005:37;5897:152;-1:-1:-1;;;5897:152:5:o;5137:77:1:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;5200:7:1::1;::::0;;-1:-1:-1;;5189:18:1;::::1;5200:7;::::0;;::::1;5199:8;5189:18;::::0;;5137:77::o;728:123::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5909:90::-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;5974:7:1::1;:18:::0;5909:90::o;8266:149:5:-;8369:39;8386:4;8392:2;8396:7;8369:39;;;;;;;;;;;;:16;:39::i;6392:161::-;6459:7;;6500:22;:12;6516:5;6500:15;:22::i;:::-;-1:-1:-1;6478:44:5;6392:161;-1:-1:-1;;;6392:161:5:o;5418:105:1:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;5492:24:1::1;5504:11;5492;:24::i;:::-;5418:105:::0;:::o;3020:801::-;3081:4;3097:21;3121:13;:11;:13::i;:::-;3152:10;;3097:37;;-1:-1:-1;3152:10:1;;;;;3144:68;;;;-1:-1:-1;;;3144:68:1;;19508:2:17;3144:68:1;;;19490:21:17;19547:2;19527:18;;;19520:30;19586:34;19566:18;;;19559:62;-1:-1:-1;;;19637:18:17;;;19630:43;19690:19;;3144:68:1;19480:235:17;3144:68:1;3237:7;;3230:3;:14;;3222:59;;;;-1:-1:-1;;;3222:59:1;;14204:2:17;3222:59:1;;;14186:21:17;;;14223:18;;;14216:30;14282:34;14262:18;;;14255:62;14334:18;;3222:59:1;14176:182:17;3222:59:1;3348:14;;3335:27;;220:4;3335:27;:::i;:::-;3312:19;3328:3;3312:13;:19;:::i;:::-;:50;;3291:119;;;;-1:-1:-1;;;3291:119:1;;20280:2:17;3291:119:1;;;20262:21:17;20319:2;20299:18;;;20292:30;-1:-1:-1;;;20338:18:17;;;20331:52;20400:18;;3291:119:1;20252:172:17;3291:119:1;3447:9;;3441:15;;:3;:15;:::i;:::-;3428:9;:28;;3420:70;;;;-1:-1:-1;;;3420:70:1;;11148:2:17;3420:70:1;;;11130:21:17;11187:2;11167:18;;;11160:30;11226:31;11206:18;;;11199:59;11275:18;;3420:70:1;11120:179:17;3420:70:1;3521:10;6576:18;6621:9;;;3500:62;;;;-1:-1:-1;;;3500:62:1;;14976:2:17;3500:62:1;;;14958:21:17;15015:2;14995:18;;;14988:30;-1:-1:-1;;;15034:18:17;;;15027:55;15099:18;;3500:62:1;14948:175:17;3500:62:1;3578:9;3573:220;3597:3;3593:1;:7;3573:220;;;3643:10;3621:33;;;;:21;:33;;;;;:35;;;;;;:::i;:::-;;;;;;3670:18;3691:13;:11;:13::i;:::-;3670:34;;220:4;3722:10;:23;3718:64;;;3747:35;665:10:2;3757:12:1;3771:10;3747:9;:35::i;:::-;-1:-1:-1;3602:3:1;;;;:::i;:::-;;;;3573:220;;;-1:-1:-1;3810:4:1;;3020:801;-1:-1:-1;;;3020:801:1:o;5220:78::-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;5283:8:1::1;::::0;;-1:-1:-1;;5271:20:1;::::1;5283:8:::0;;;;::::1;;;5282:9;5271:20:::0;;::::1;;::::0;;5220:78::o;4202:167:5:-;4266:7;4292:70;4309:7;4292:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;5731:87::-;5771:13;5803:8;5796:15;;;;;:::i;3934:211::-;3998:7;-1:-1:-1;;;;;4025:19:5;;4017:74;;;;-1:-1:-1;;;4017:74:5;;14565:2:17;4017:74:5;;;14547:21:17;14604:2;14584:18;;;14577:30;14643:34;14623:18;;;14616:62;-1:-1:-1;;;14694:18:17;;;14687:40;14744:19;;4017:74:5;14537:232:17;4017:74:5;-1:-1:-1;;;;;4109:20:5;;;;;;:13;:20;;;;;:29;;:27;:29::i;1598:92:14:-;1038:6;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;909:346:1:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;997:9:1::1;992:257;1012:18:::0;;::::1;992:257;;;1051:13;1067:7;;1075:1;1067:10;;;;;-1:-1:-1::0;;;1067:10:1::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1051:26:::0;-1:-1:-1;;;;;;1099:19:1;::::1;1091:44;;;::::0;-1:-1:-1;;;1091:44:1;;8516:2:17;1091:44:1::1;::::0;::::1;8498:21:17::0;8555:2;8535:18;;;8528:30;-1:-1:-1;;;8574:18:17;;;8567:42;8626:18;;1091:44:1::1;8488:162:17::0;1091:44:1::1;-1:-1:-1::0;;;;;1158:19:1;::::1;;::::0;;;:12:::1;:19;::::0;;;;;::::1;;1157:20;1149:48;;;::::0;-1:-1:-1;;;1149:48:1;;13435:2:17;1149:48:1::1;::::0;::::1;13417:21:17::0;13474:2;13454:18;;;13447:30;-1:-1:-1;;;13493:18:17;;;13486:45;13548:18;;1149:48:1::1;13407:165:17::0;1149:48:1::1;-1:-1:-1::0;;;;;1212:19:1::1;;::::0;;;:12:::1;:19;::::0;;;;:26;;-1:-1:-1;;1212:26:1::1;1234:4;1212:26;::::0;;1032:3;::::1;::::0;::::1;:::i;:::-;;;;992:257;;5804:99:::0;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;5875:9:1::1;:21:::0;5804:99::o;3827:512::-;3913:16;3945:18;3966:17;3976:6;3966:9;:17::i;:::-;3945:38;-1:-1:-1;3997:15:1;3993:340;;4072:16;;;4086:1;4072:16;;;;;;;;;;;;3993:340;4119:23;4159:10;4145:25;;;;;;-1:-1:-1;;;4145:25:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4145:25:1;;4119:51;;4189:9;4184:112;4204:10;4200:1;:14;4184:112;;;4251:30;4271:6;4279:1;4251:19;:30::i;:::-;4239:6;4246:1;4239:9;;;;;;-1:-1:-1;;;4239:9:1;;;;;;;;;;;;;;;;;;:42;4216:3;;;;:::i;:::-;;;;4184:112;;3993:340;3827:512;;;;:::o;6129:196::-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;6231:40:1::1;::::0;486:42:::1;::::0;6249:21:::1;6231:40:::0;::::1;;;::::0;::::1;::::0;;;6249:21;486:42;6231:40;::::1;;;;;;6210:108;;;::::0;-1:-1:-1;;;6210:108:1;;12265:2:17;6210:108:1::1;::::0;::::1;12247:21:17::0;12304:2;12284:18;;;12277:30;-1:-1:-1;;;12323:18:17;;;12316:51;12384:18;;6210:108:1::1;12237:171:17::0;4585:94:5;4633:13;4665:7;4658:14;;;;;:::i;6005:118:1:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;6084:14:1::1;:32:::0;6005:118::o;7328:290:5:-;-1:-1:-1;;;;;7430:24:5;;665:10:2;7430:24:5;;7422:62;;;;-1:-1:-1;;;7422:62:5;;11911:2:17;7422:62:5;;;11893:21:17;11950:2;11930:18;;;11923:30;11989:27;11969:18;;;11962:55;12034:18;;7422:62:5;11883:175:17;7422:62:5;665:10:2;7495:32:5;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;7495:42:5;;;;;;;;;;;;:53;;-1:-1:-1;;7495:53:5;;;;;;;;;;7563:48;;8038:41:17;;;7495:42:5;;665:10:2;7563:48:5;;8011:18:17;7563:48:5;;;;;;;7328:290;;:::o;1261:310:1:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;1374:9:1::1;1369:196;1389:18:::0;;::::1;1369:196;;;1428:13;1444:7;;1452:1;1444:10;;;;;-1:-1:-1::0;;;1444:10:1::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1428:26:::0;-1:-1:-1;;;;;;1476:19:1;::::1;1468:44;;;::::0;-1:-1:-1;;;1468:44:1;;8516:2:17;1468:44:1::1;::::0;::::1;8498:21:17::0;8555:2;8535:18;;;8528:30;-1:-1:-1;;;8574:18:17;;;8567:42;8626:18;;1468:44:1::1;8488:162:17::0;1468:44:1::1;-1:-1:-1::0;;;;;1527:19:1::1;1549:5;1527:19:::0;;;:12:::1;:19;::::0;;;;:27;;-1:-1:-1;;1527:27:1::1;::::0;;1409:3;::::1;::::0;::::1;:::i;:::-;;;;1369:196;;8481:282:5::0;8612:41;665:10:2;8645:7:5;8612:18;:41::i;:::-;8604:103;;;;-1:-1:-1;;;8604:103:5;;;;;;;:::i;:::-;8717:39;8731:4;8737:2;8741:7;8750:5;8717:13;:39::i;:::-;8481:282;;;;:::o;5684:114:1:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;5761:13:1::1;:30:::0;5684:114::o;1960:1054::-;2018:4;2034:21;2058:13;:11;:13::i;:::-;2089:7;;2034:37;;-1:-1:-1;2089:7:1;;2081:62;;;;-1:-1:-1;;;2081:62:1;;8857:2:17;2081:62:1;;;8839:21:17;8896:2;8876:18;;;8869:30;8935:34;8915:18;;;8908:62;-1:-1:-1;;;8986:18:17;;;8979:40;9036:19;;2081:62:1;8829:232:17;2081:62:1;2174:10;2161:24;;;;:12;:24;;;;;;;;2153:62;;;;-1:-1:-1;;;2153:62:1;;15684:2:17;2153:62:1;;;15666:21:17;15723:2;15703:18;;;15696:30;15762:27;15742:18;;;15735:55;15807:18;;2153:62:1;15656:175:17;2153:62:1;2289:14;;2268:10;2246:33;;;;:21;:33;;;;;;:39;;2282:3;;2246:39;:::i;:::-;:57;;2225:131;;;;-1:-1:-1;;;2225:131:1;;16735:2:17;2225:131:1;;;16717:21:17;16774:2;16754:18;;;16747:30;16813:29;16793:18;;;16786:57;16860:18;;2225:131:1;16707:177:17;2225:131:1;2423:14;;2410:27;;220:4;2410:27;:::i;:::-;2387:19;2403:3;2387:13;:19;:::i;:::-;:50;;2366:119;;;;-1:-1:-1;;;2366:119:1;;20280:2:17;2366:119:1;;;20262:21:17;20319:2;20299:18;;;20292:30;-1:-1:-1;;;20338:18:17;;;20331:52;20400:18;;2366:119:1;20252:172:17;2366:119:1;2539:13;;2516:19;2532:3;2516:13;:19;:::i;:::-;:36;;2495:108;;;;-1:-1:-1;;;2495:108:1;;15330:2:17;2495:108:1;;;15312:21:17;15369:2;15349:18;;;15342:30;15408:27;15388:18;;;15381:55;15453:18;;2495:108:1;15302:175:17;2495:108:1;2646:3;2634:9;;:15;;;;:::i;:::-;2621:9;:28;;2613:70;;;;-1:-1:-1;;;2613:70:1;;11148:2:17;2613:70:1;;;11130:21:17;11187:2;11167:18;;;11160:30;11226:31;11206:18;;;11199:59;11275:18;;2613:70:1;11120:179:17;2613:70:1;2714:10;6576:18;6621:9;;;2693:62;;;;-1:-1:-1;;;2693:62:1;;14976:2:17;2693:62:1;;;14958:21:17;15015:2;14995:18;;;14988:30;-1:-1:-1;;;15034:18:17;;;15027:55;15099:18;;2693:62:1;14948:175:17;2693:62:1;2771:9;2766:220;2790:3;2786:1;:7;2766:220;;;2836:10;2814:33;;;;:21;:33;;;;;:35;;;;;;:::i;:::-;;;;;;2863:18;2884:13;:11;:13::i;:::-;2863:34;;220:4;2915:10;:23;2911:64;;;2940:35;665:10:2;2950:12:1;586:96:2;2940:35:1;-1:-1:-1;2795:3:1;;;;:::i;:::-;;;;2766:220;;4345:637;4442:13;4489;:11;:13::i;:::-;4479:7;:23;4471:52;;;;-1:-1:-1;;;4471:52:1;;10803:2:17;4471:52:1;;;10785:21:17;10842:2;10822:18;;;10815:30;-1:-1:-1;;;10861:18:17;;;10854:46;10917:18;;4471:52:1;10775:166:17;4471:52:1;4583:8;;;;;;;4578:57;;4614:10;4607:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4345:637;;;:::o;4578:57::-;4645:23;4671:25;;;:16;:25;;;;;4645:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4776:1;4756:9;4750:23;:27;4746:74;;;4800:9;4345:637;-1:-1:-1;;4345:637:1:o;4746:74::-;4935:9;:7;:9::i;:::-;4946:18;:7;:16;:18::i;:::-;4918:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4904:71;;;4345:637;;;:::o;5304:108::-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;5381:24:1;;::::1;::::0;:10:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;5045:86::-:0;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;5114:10:1::1;::::0;;-1:-1:-1;;5100:24:1;::::1;5114:10;::::0;;;::::1;;;5113:11;5100:24:::0;;::::1;;::::0;;5045:86::o;1839:189:14:-;1038:6;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:14;::::1;1919:73;;;::::0;-1:-1:-1;;;1919:73:14;;9687:2:17;1919:73:14::1;::::0;::::1;9669:21:17::0;9726:2;9706:18;;;9699:30;9765:34;9745:18;;;9738:62;-1:-1:-1;;;9816:18:17;;;9809:36;9862:19;;1919:73:14::1;9659:228:17::0;1919:73:14::1;2002:19;2012:8;2002:9;:19::i;10197:117:5:-:0;10254:4;10277:30;:12;10299:7;10277:21;:30::i;15140:155::-;15205:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;15205:29:5;-1:-1:-1;;;;;15205:29:5;;;;;;;;:24;;15258:16;15205:24;15258:7;:16::i;:::-;-1:-1:-1;;;;;15249:39:5;;;;;;;;;;;15140:155;;:::o;13453:218::-;13552:16;13560:7;13552;:16::i;:::-;13544:73;;;;-1:-1:-1;;;13544:73:5;;17504:2:17;13544:73:5;;;17486:21:17;17543:2;17523:18;;;17516:30;17582:34;17562:18;;;17555:62;-1:-1:-1;;;17633:18:17;;;17626:42;17685:19;;13544:73:5;17476:234:17;13544:73:5;13627:25;;;;:16;:25;;;;;;;;:37;;;;;;;;:::i;11132:108::-;11207:26;11217:2;11221:7;11207:26;;;;;;;;;;;;:9;:26::i;5618:121:7:-;5687:7;5713:19;5721:3;5713:7;:19::i;10472:329:5:-;10557:4;10581:16;10589:7;10581;:16::i;:::-;10573:73;;;;-1:-1:-1;;;10573:73:5;;13022:2:17;10573:73:5;;;13004:21:17;13061:2;13041:18;;;13034:30;13100:34;13080:18;;;13073:62;-1:-1:-1;;;13151:18:17;;;13144:42;13203:19;;10573:73:5;12994:234:17;10573:73:5;10656:13;10672:16;10680:7;10672;:16::i;:::-;10656:32;;10717:5;-1:-1:-1;;;;;10706:16:5;:7;-1:-1:-1;;;;;10706:16:5;;:51;;;;10750:7;-1:-1:-1;;;;;10726:31:5;:20;10738:7;10726:11;:20::i;:::-;-1:-1:-1;;;;;10726:31:5;;10706:51;:87;;;-1:-1:-1;;;;;;7796:25:5;;;7773:4;7796:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;10761:32;10698:96;10472:329;-1:-1:-1;;;;10472:329:5:o;12747:559::-;12864:4;-1:-1:-1;;;;;12844:24:5;:16;12852:7;12844;:16::i;:::-;-1:-1:-1;;;;;12844:24:5;;12836:78;;;;-1:-1:-1;;;12836:78:5;;18278:2:17;12836:78:5;;;18260:21:17;18317:2;18297:18;;;18290:30;18356:34;18336:18;;;18329:62;-1:-1:-1;;;18407:18:17;;;18400:39;18456:19;;12836:78:5;18250:231:17;12836:78:5;-1:-1:-1;;;;;12932:16:5;;12924:65;;;;-1:-1:-1;;;12924:65:5;;11506:2:17;12924:65:5;;;11488:21:17;11545:2;11525:18;;;11518:30;11584:34;11564:18;;;11557:62;-1:-1:-1;;;11635:18:17;;;11628:34;11679:19;;12924:65:5;11478:226:17;12924:65:5;13101:29;13118:1;13122:7;13101:8;:29::i;:::-;-1:-1:-1;;;;;13141:19:5;;;;;;:13;:19;;;;;:35;;13168:7;13141:26;:35::i;:::-;-1:-1:-1;;;;;;13186:17:5;;;;;;:13;:17;;;;;:30;;13208:7;13186:21;:30::i;:::-;-1:-1:-1;13227:29:5;:12;13244:7;13253:2;13227:16;:29::i;:::-;;13291:7;13287:2;-1:-1:-1;;;;;13272:27:5;13281:4;-1:-1:-1;;;;;13272:27:5;;;;;;;;;;;12747:559;;;:::o;9072:135:8:-;9143:7;9177:22;9181:3;9193:5;9177:3;:22::i;6076:233:7:-;6156:7;;;;6215:22;6219:3;6231:5;6215:3;:22::i;:::-;6184:53;;;;-1:-1:-1;6076:233:7;-1:-1:-1;;;;;6076:233:7:o;13894:98:5:-;13966:19;;;;:8;;:19;;;;;:::i;7329:241:7:-;7466:7;7516:44;7521:3;7541;7547:12;7516:4;:44::i;8618:112:8:-;8678:7;8704:19;8712:3;3961:18;;3879:107;2034:169:14;2108:6;;;-1:-1:-1;;;;;2124:17:14;;;-1:-1:-1;;;;;;2124:17:14;;;;;;;2156:40;;2108:6;;;2124:17;2108:6;;2156:40;;2089:16;;2156:40;2034:169;;:::o;9625:269:5:-;9738:28;9748:4;9754:2;9758:7;9738:9;:28::i;:::-;9784:48;9807:4;9813:2;9817:7;9826:5;9784:22;:48::i;:::-;9776:111;;;;-1:-1:-1;;;9776:111:5;;;;;;;:::i;275:703:16:-;331:13;548:10;544:51;;-1:-1:-1;;574:10:16;;;;;;;;;;;;-1:-1:-1;;;574:10:16;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:16;;-1:-1:-1;720:2:16;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;-1:-1:-1;;;764:17:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:16;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:16;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;-1:-1:-1;;;849:14:16;;;;;;;;;;;;:56;-1:-1:-1;;;;;849:56:16;;;;;;;;-1:-1:-1;919:11:16;928:2;919:11;;:::i;:::-;;;791:150;;5386:149:7;5470:4;5493:35;5503:3;5523;5493:9;:35::i;11461:247:5:-;11556:18;11562:2;11566:7;11556:5;:18::i;:::-;11592:54;11623:1;11627:2;11631:7;11640:5;11592:22;:54::i;:::-;11584:117;;;;-1:-1:-1;;;11584:117:5;;;;;;;:::i;2490:107:7:-;2546:7;2572:18;:3;:16;:18::i;8177:135:8:-;8247:4;8270:35;8278:3;8298:5;8270:7;:35::i;7880:129::-;7947:4;7970:32;7975:3;7995:5;7970:4;:32::i;4795:213:7:-;4914:4;4937:64;4942:3;4962;-1:-1:-1;;;;;4976:23:7;;4937:4;:64::i;4328:118:8:-;4395:7;4421:3;:11;;4433:5;4421:18;;;;;;-1:-1:-1;;;4421:18:8;;;;;;;;;;;;;;;;;4414:25;;4328:118;;;;:::o;2950:175:7:-;3017:7;;;3059:19;:3;3072:5;3059:12;:19::i;:::-;3101:16;;;;:11;;;;;:16;;;;;;;;;2950:175;-1:-1:-1;;;;2950:175:7:o;4216:270::-;4340:7;4375:16;;;:11;;;:16;;;;;;4409:10;;;;:33;;;4423:19;4433:3;4438;4423:9;:19::i;:::-;4444:12;4401:56;;;;;-1:-1:-1;;;4401:56:7;;;;;;;;:::i;:::-;-1:-1:-1;4474:5:7;4216:270;-1:-1:-1;;;;4216:270:7:o;14545:589:5:-;14665:4;-1:-1:-1;;;;;14690:13:5;;1034:20:0;14685:58:5;;-1:-1:-1;14728:4:5;14721:11;;14685:58;14752:23;14778:246;-1:-1:-1;;;665:10:2;14915:4:5;14933:7;14954:5;14794:175;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;14794:175:5;;;;;;;-1:-1:-1;;;;;14794:175:5;;;;;;;;;;;14778:246;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14778:15:5;;;:246;:15;:246::i;:::-;14752:272;;15034:13;15061:10;15050:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;15100:26:5;-1:-1:-1;;;15100:26:5;;-1:-1:-1;;;14545:589:5;;;;;;:::o;2276:124:7:-;2347:4;2370:23;:3;2389;5267:4:8;3767:19;;;:12;;;:19;;;;;;:24;;5290:28;3671:127;12030:393:5;-1:-1:-1;;;;;12109:16:5;;12101:61;;;;-1:-1:-1;;;12101:61:5;;16374:2:17;12101:61:5;;;16356:21:17;;;16393:18;;;16386:30;16452:34;16432:18;;;16425:62;16504:18;;12101:61:5;16346:182:17;12101:61:5;12181:16;12189:7;12181;:16::i;:::-;12180:17;12172:58;;;;-1:-1:-1;;;12172:58:5;;10094:2:17;12172:58:5;;;10076:21:17;10133:2;10113:18;;;10106:30;10172;10152:18;;;10145:58;10220:18;;12172:58:5;10066:178:17;12172:58:5;-1:-1:-1;;;;;12297:17:5;;;;;;:13;:17;;;;;:30;;12319:7;12297:21;:30::i;:::-;-1:-1:-1;12338:29:5;:12;12355:7;12364:2;12338:16;:29::i;:::-;-1:-1:-1;12383:33:5;;12408:7;;-1:-1:-1;;;;;12383:33:5;;;12400:1;;12383:33;;12400:1;;12383:33;12030:393;;:::o;2202:1388:8:-;2268:4;2405:19;;;:12;;;:19;;;;;;2439:15;;2435:1149;;2808:21;2832:14;2845:1;2832:10;:14;:::i;:::-;2880:18;;2808:38;;-1:-1:-1;2860:17:8;;2880:22;;2901:1;;2880:22;:::i;:::-;2860:42;;2934:13;2921:9;:26;2917:398;;2967:17;2987:3;:11;;2999:9;2987:22;;;;;;-1:-1:-1;;;2987:22:8;;;;;;;;;;;;;;;;;2967:42;;3138:9;3109:3;:11;;3121:13;3109:26;;;;;;-1:-1:-1;;;3109:26:8;;;;;;;;;;;;;;;;;;;;:38;;;;3221:23;;;:12;;;:23;;;;;:36;;;2917:398;3393:17;;:3;;:17;;;-1:-1:-1;;;3393:17:8;;;;;;;;;;;;;;;;;;;;;;;;;;3485:3;:12;;:19;3498:5;3485:19;;;;;;;;;;;3478:26;;;3526:4;3519:11;;;;;;;2435:1149;3568:5;3561:12;;;;;1630:404;1693:4;3767:19;;;:12;;;:19;;;;;;1709:319;;-1:-1:-1;1751:23:8;;;;;;;;:11;:23;;;;;;;;;;;;;1931:18;;1909:19;;;:12;;;:19;;;;;;:40;;;;1963:11;;1709:319;-1:-1:-1;2012:5:8;2005:12;;1693:188:7;1799:4;1815:16;;;:11;;;:16;;;;;:24;;;1856:18;1815:3;1827;1856:13;:18::i;3461:223:0:-;3594:12;3625:52;3647:6;3655:4;3661:1;3664:12;3594;1034:20;;4828:60;;;;-1:-1:-1;;;4828:60:0;;19922:2:17;4828:60:0;;;19904:21:17;19961:2;19941:18;;;19934:30;20000:31;19980:18;;;19973:59;20049:18;;4828:60:0;19894:179:17;4828:60:0;4900:12;4914:23;4941:6;-1:-1:-1;;;;;4941:11:0;4960:5;4967:4;4941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4899:73;;;;4989:52;5007:7;5016:10;5028:12;4989:17;:52::i;:::-;4982:59;4548:500;-1:-1:-1;;;;;;;4548:500:0:o;6950:692::-;7096:12;7124:7;7120:516;;;-1:-1:-1;7154:10:0;7147:17;;7120:516;7265:17;;:21;7261:365;;7459:10;7453:17;7519:15;7506:10;7502:2;7498:19;7491:44;7408:145;7598:12;7591:20;;-1:-1:-1;;;7591:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:17;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:17;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:17;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:229::-;871:5;924:3;917:4;909:6;905:17;901:27;891:2;;946:5;939;932:20;891:2;972:79;1047:3;1038:6;1025:20;1018:4;1010:6;1006:17;972:79;:::i;1062:196::-;1121:6;1174:2;1162:9;1153:7;1149:23;1145:32;1142:2;;;1195:6;1187;1180:22;1142:2;1223:29;1242:9;1223:29;:::i;1263:270::-;1331:6;1339;1392:2;1380:9;1371:7;1367:23;1363:32;1360:2;;;1413:6;1405;1398:22;1360:2;1441:29;1460:9;1441:29;:::i;:::-;1431:39;;1489:38;1523:2;1512:9;1508:18;1489:38;:::i;:::-;1479:48;;1350:183;;;;;:::o;1538:338::-;1615:6;1623;1631;1684:2;1672:9;1663:7;1659:23;1655:32;1652:2;;;1705:6;1697;1690:22;1652:2;1733:29;1752:9;1733:29;:::i;:::-;1723:39;;1781:38;1815:2;1804:9;1800:18;1781:38;:::i;:::-;1771:48;;1866:2;1855:9;1851:18;1838:32;1828:42;;1642:234;;;;;:::o;1881:696::-;1976:6;1984;1992;2000;2053:3;2041:9;2032:7;2028:23;2024:33;2021:2;;;2075:6;2067;2060:22;2021:2;2103:29;2122:9;2103:29;:::i;:::-;2093:39;;2151:38;2185:2;2174:9;2170:18;2151:38;:::i;:::-;2141:48;;2236:2;2225:9;2221:18;2208:32;2198:42;;2291:2;2280:9;2276:18;2263:32;2318:18;2310:6;2307:30;2304:2;;;2355:6;2347;2340:22;2304:2;2383:22;;2436:4;2428:13;;2424:27;-1:-1:-1;2414:2:17;;2470:6;2462;2455:22;2414:2;2498:73;2563:7;2558:2;2545:16;2540:2;2536;2532:11;2498:73;:::i;:::-;2488:83;;;2011:566;;;;;;;:::o;2582:367::-;2647:6;2655;2708:2;2696:9;2687:7;2683:23;2679:32;2676:2;;;2729:6;2721;2714:22;2676:2;2757:29;2776:9;2757:29;:::i;:::-;2747:39;;2836:2;2825:9;2821:18;2808:32;2883:5;2876:13;2869:21;2862:5;2859:32;2849:2;;2910:6;2902;2895:22;2849:2;2938:5;2928:15;;;2666:283;;;;;:::o;2954:264::-;3022:6;3030;3083:2;3071:9;3062:7;3058:23;3054:32;3051:2;;;3104:6;3096;3089:22;3051:2;3132:29;3151:9;3132:29;:::i;:::-;3122:39;3208:2;3193:18;;;;3180:32;;-1:-1:-1;;;3041:177:17:o;3223:665::-;3309:6;3317;3370:2;3358:9;3349:7;3345:23;3341:32;3338:2;;;3391:6;3383;3376:22;3338:2;3436:9;3423:23;3465:18;3506:2;3498:6;3495:14;3492:2;;;3527:6;3519;3512:22;3492:2;3570:6;3559:9;3555:22;3545:32;;3615:7;3608:4;3604:2;3600:13;3596:27;3586:2;;3642:6;3634;3627:22;3586:2;3687;3674:16;3713:2;3705:6;3702:14;3699:2;;;3734:6;3726;3719:22;3699:2;3792:7;3787:2;3777:6;3774:1;3770:14;3766:2;3762:23;3758:32;3755:45;3752:2;;;3818:6;3810;3803:22;3752:2;3854;3846:11;;;;;3876:6;;-1:-1:-1;3328:560:17;;-1:-1:-1;;;;3328:560:17:o;3893:255::-;3951:6;4004:2;3992:9;3983:7;3979:23;3975:32;3972:2;;;4025:6;4017;4010:22;3972:2;4069:9;4056:23;4088:30;4112:5;4088:30;:::i;4153:259::-;4222:6;4275:2;4263:9;4254:7;4250:23;4246:32;4243:2;;;4296:6;4288;4281:22;4243:2;4333:9;4327:16;4352:30;4376:5;4352:30;:::i;4417:342::-;4486:6;4539:2;4527:9;4518:7;4514:23;4510:32;4507:2;;;4560:6;4552;4545:22;4507:2;4605:9;4592:23;4638:18;4630:6;4627:30;4624:2;;;4675:6;4667;4660:22;4624:2;4703:50;4745:7;4736:6;4725:9;4721:22;4703:50;:::i;4764:190::-;4823:6;4876:2;4864:9;4855:7;4851:23;4847:32;4844:2;;;4897:6;4889;4882:22;4844:2;-1:-1:-1;4925:23:17;;4834:120;-1:-1:-1;4834:120:17:o;4959:410::-;5037:6;5045;5098:2;5086:9;5077:7;5073:23;5069:32;5066:2;;;5119:6;5111;5104:22;5066:2;5160:9;5147:23;5137:33;;5221:2;5210:9;5206:18;5193:32;5248:18;5240:6;5237:30;5234:2;;;5285:6;5277;5270:22;5234:2;5313:50;5355:7;5346:6;5335:9;5331:22;5313:50;:::i;:::-;5303:60;;;5056:313;;;;;:::o;5374:257::-;5415:3;5453:5;5447:12;5480:6;5475:3;5468:19;5496:63;5552:6;5545:4;5540:3;5536:14;5529:4;5522:5;5518:16;5496:63;:::i;:::-;5613:2;5592:15;-1:-1:-1;;5588:29:17;5579:39;;;;5620:4;5575:50;;5423:208;-1:-1:-1;;5423:208:17:o;5636:274::-;5765:3;5803:6;5797:13;5819:53;5865:6;5860:3;5853:4;5845:6;5841:17;5819:53;:::i;:::-;5888:16;;;;;5773:137;-1:-1:-1;;5773:137:17:o;5915:637::-;6195:3;6233:6;6227:13;6249:53;6295:6;6290:3;6283:4;6275:6;6271:17;6249:53;:::i;:::-;6365:13;;6324:16;;;;6387:57;6365:13;6324:16;6421:4;6409:17;;6387:57;:::i;:::-;-1:-1:-1;;;6466:20:17;;6495:22;;;6544:1;6533:13;;6203:349;-1:-1:-1;;;;6203:349:17:o;6765:488::-;-1:-1:-1;;;;;7034:15:17;;;7016:34;;7086:15;;7081:2;7066:18;;7059:43;7133:2;7118:18;;7111:34;;;7181:3;7176:2;7161:18;;7154:31;;;6959:4;;7202:45;;7227:19;;7219:6;7202:45;:::i;:::-;7194:53;6968:285;-1:-1:-1;;;;;;6968:285:17:o;7258:635::-;7429:2;7481:21;;;7551:13;;7454:18;;;7573:22;;;7400:4;;7429:2;7652:15;;;;7626:2;7611:18;;;7400:4;7698:169;7712:6;7709:1;7706:13;7698:169;;;7773:13;;7761:26;;7842:15;;;;7807:12;;;;7734:1;7727:9;7698:169;;;-1:-1:-1;7884:3:17;;7409:484;-1:-1:-1;;;;;;7409:484:17:o;8090:219::-;8239:2;8228:9;8221:21;8202:4;8259:44;8299:2;8288:9;8284:18;8276:6;8259:44;:::i;9066:414::-;9268:2;9250:21;;;9307:2;9287:18;;;9280:30;9346:34;9341:2;9326:18;;9319:62;-1:-1:-1;;;9412:2:17;9397:18;;9390:48;9470:3;9455:19;;9240:240::o;17715:356::-;17917:2;17899:21;;;17936:18;;;17929:30;17995:34;17990:2;17975:18;;17968:62;18062:2;18047:18;;17889:182::o;18888:413::-;19090:2;19072:21;;;19129:2;19109:18;;;19102:30;19168:34;19163:2;19148:18;;19141:62;-1:-1:-1;;;19234:2:17;19219:18;;19212:47;19291:3;19276:19;;19062:239::o;20611:128::-;20651:3;20682:1;20678:6;20675:1;20672:13;20669:2;;;20688:18;;:::i;:::-;-1:-1:-1;20724:9:17;;20659:80::o;20744:120::-;20784:1;20810;20800:2;;20815:18;;:::i;:::-;-1:-1:-1;20849:9:17;;20790:74::o;20869:168::-;20909:7;20975:1;20971;20967:6;20963:14;20960:1;20957:21;20952:1;20945:9;20938:17;20934:45;20931:2;;;20982:18;;:::i;:::-;-1:-1:-1;21022:9:17;;20921:116::o;21042:125::-;21082:4;21110:1;21107;21104:8;21101:2;;;21115:18;;:::i;:::-;-1:-1:-1;21152:9:17;;21091:76::o;21172:258::-;21244:1;21254:113;21268:6;21265:1;21262:13;21254:113;;;21344:11;;;21338:18;21325:11;;;21318:39;21290:2;21283:10;21254:113;;;21385:6;21382:1;21379:13;21376:2;;;-1:-1:-1;;21420:1:17;21402:16;;21395:27;21225:205::o;21435:136::-;21474:3;21502:5;21492:2;;21511:18;;:::i;:::-;-1:-1:-1;;;21547:18:17;;21482:89::o;21576:380::-;21655:1;21651:12;;;;21698;;;21719:2;;21773:4;21765:6;21761:17;21751:27;;21719:2;21826;21818:6;21815:14;21795:18;21792:38;21789:2;;;21872:10;21867:3;21863:20;21860:1;21853:31;21907:4;21904:1;21897:15;21935:4;21932:1;21925:15;21961:135;22000:3;-1:-1:-1;;22021:17:17;;22018:2;;;22041:18;;:::i;:::-;-1:-1:-1;22088:1:17;22077:13;;22008:88::o;22101:112::-;22133:1;22159;22149:2;;22164:18;;:::i;:::-;-1:-1:-1;22198:9:17;;22139:74::o;22218:127::-;22279:10;22274:3;22270:20;22267:1;22260:31;22310:4;22307:1;22300:15;22334:4;22331:1;22324:15;22350:127;22411:10;22406:3;22402:20;22399:1;22392:31;22442:4;22439:1;22432:15;22466:4;22463:1;22456:15;22482:127;22543:10;22538:3;22534:20;22531:1;22524:31;22574:4;22571:1;22564:15;22598:4;22595:1;22588:15;22614:131;-1:-1:-1;;;;;;22688:32:17;;22678:43;;22668:2;;22735:1;22732;22725:12
Swarm Source
ipfs://862af439c4f469fca7c19bcb81fe8be1d03602ccd31da8bfaa4e050f3f48ff22
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.