ERC-721
NFT
Overview
Max Total Supply
112 GMBLR
Holders
47
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 GMBLRLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
CryptoGamblers
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./ERC721.sol"; import "./Ownable.sol"; import "./SafeMath.sol"; contract CryptoGamblers is ERC721, Ownable { using Strings for string; using SafeMath for uint; // Max tokens supply uint public constant maxSupply = 777; //_tokenPropertiesString[tokenID-1] = propertiesString string[maxSupply] private tokenPropertiesString; // The IPFS hash of token's metadata string public metadataHash = ""; // Variables used for RNG uint private nextBlockNumber = 0; bytes32 private secretHash = 0; uint private _rngSeed = 0; uint private seedExpiry = 0; bool private rngSemaphore = false; // Events event SeedInit(address _from, uint _totalSupply, uint _seedExpiry, uint __rngSeed); event SeedReset(address _from, uint _totalSupply, uint _seedExpiry); event LotteryFromTo(address indexed _from, address _winner, uint _value, uint _firstTokenId, uint _lastTokenId, string _userInput, uint indexed _luckyNumber); event LotteryProperties(address indexed _from, address _winner, uint _value, string _propertiesString, string _userInput, uint indexed _luckyNumber); constructor() ERC721("CryptoGamblers", "GMBLR") { ERC721._setBaseURI("https://metadata.cryptogamblers.life/gamblers/"); } function mint(string memory properties) public onlyOwner { require(totalSupply() < maxSupply, "Exceeds max supply"); require(seedExpiry > totalSupply(), "_rngSeed expired"); require(rngSemaphore == false, "secret is not revealed"); uint newTokenId = totalSupply().add(1); if(newTokenId != maxSupply) { properties = generateRandomProperties(); } else { // the special one require(properties.strMatch("??????????????")); } _mint(owner(), newTokenId); tokenPropertiesString[newTokenId-1] = properties; } function setMetadataHash(string memory hash) public onlyOwner { // modifications are not allowed require(bytes(metadataHash).length == 0 && totalSupply() == maxSupply); metadataHash = hash; } // public getters function propertiesOf(uint tokenId) public view returns (string memory) { require(tokenId >= 1 && tokenId <= totalSupply()); return tokenPropertiesString[tokenId-1]; } function getGamblersByProperties(string memory properties) public view returns(uint[] memory, uint) { uint[] memory participants = new uint[](totalSupply()); uint participants_count = 0; for(uint i=0;i<totalSupply();i++) { if(tokenPropertiesString[i].strMatch(properties)) { participants[participants_count++] = i+1; } } return (participants, participants_count); } // RNG functions ownerOnly // probability sheet : https://ipfs.io/ipfs/QmPTm2MvYTHjoSQZSJY5SErGaEL3soje7QpcaqFntwkGno function generateRandomProperties() internal returns(string memory) { // prob(id_0) = (prob_arr[1] - prob_arr[0]) / prob_arr[prob_arr.length - 1] // prob(id_1) = (prob_arr[2] - prob_arr[1]) / prob_arr[prob_arr.length - 1] .... uint[] memory hat_hair = new uint[](9); hat_hair[0] = 0; hat_hair[1] = 7; // Blank - 7.00% hat_hair[2] = 22; // Cilinder - 15.00% hat_hair[3] = 35; // Fallout - 13.00% hat_hair[4] = 46; // Jokerstars - 11.00% hat_hair[5] = 61; // Leverage - 15.00% hat_hair[6] = 73; // Peaky Blinder - 12.00% hat_hair[7] = 92; // Pump & Dump - 19.00% hat_hair[8] = 100; // SquidFi Hat - 8.00% uint[] memory skin_color_facial_expression = new uint[](22); skin_color_facial_expression[0] = 0; skin_color_facial_expression[1] = 0; // Blank - 0.00% skin_color_facial_expression[2] = 17; // Ape Bronze - 1.70% skin_color_facial_expression[3] = 24; // Ape Red - 0.70% skin_color_facial_expression[4] = 84; // Black Ecstatic - 6.00% skin_color_facial_expression[5] = 144; // Black Frustrated - 6.00% skin_color_facial_expression[6] = 204; // Black Rage - 6.00% skin_color_facial_expression[7] = 264; // Black Devastated - 6.00% skin_color_facial_expression[8] = 271; // Golden Pepe - 0.70% skin_color_facial_expression[9] = 288; // Green Pepe - 1.70% skin_color_facial_expression[10] = 348; // White Devastated 6.00% skin_color_facial_expression[11] = 408; // White Ecstatic 6.00% skin_color_facial_expression[12] = 468; // White Frustrated 6.00% skin_color_facial_expression[13] = 528;// White Rage 6.00% skin_color_facial_expression[14] = 588; // Yellow Devastated 6.00% skin_color_facial_expression[15] = 648; // Yellow Excited 6.00% skin_color_facial_expression[16] = 708; // Yellow Frustrated 6.00% skin_color_facial_expression[17] = 768; // Yellow Happy 6.00% skin_color_facial_expression[18] = 826; // Zombie Happy 5.80% skin_color_facial_expression[19] = 884; // Zombie Devastated 5.80% skin_color_facial_expression[20] = 942; // Zombie Ecstatic 5.80% skin_color_facial_expression[21] = 1000; // Zombie Rage 5.80% uint[] memory neck = new uint[](8); neck[0] = 0; neck[1] = 70; // Blank - 7.00% neck[2] = 127; // Golden chain - 5.70% neck[3] = 397; // Horseshoe -27.00% neck[4] = 577; // Ledger - 18.00% neck[5] = 723; // Lucky Clover - 14.60% neck[6] = 873; // Piggy Bank - 15.00% neck[7] = 1000; // Silver chain - 12.70% uint[] memory upper_body = new uint[](10); upper_body[0] = 0; upper_body[1] = 7; // Blank - 7.00% upper_body[2] = 17; // 9 to 5 Shirt - 10.00% upper_body[3] = 23; // ChimsCoin T-shirt - 6.00% upper_body[4] = 38;// Coinface Jacket -15.00% upper_body[5] = 48; // Hawaii Shirt - 10.00% upper_body[6] = 58; // Hoodie Lose365 - 10.00% upper_body[7] = 66; // Lumber-Gambler Shirt - 8.00% upper_body[8] = 80; // Tuxedo Top - 14.00% upper_body[9] = 100; // Uniswamp degen T-shirt - 20.00% uint[] memory lower_body = new uint[](8); lower_body[0] = 0; lower_body[1] = 7; // Blank - 7.00% lower_body[2] = 19; // Baggy Jeans - 12.00% lower_body[3] = 35; // Blue Jeans - 16.00% lower_body[4] = 51; // Colorful Shorts - 16.00% lower_body[5] = 60; // Ripped Jeans - 9.00% lower_body[6] = 85; // Sports Pants - 25.00% lower_body[7] = 100;// Tuxedo Pants - 15.00% uint[] memory shoes = new uint[](8); shoes[0] = 0; shoes[1] = 7; // Blank - 7.00% shoes[2] = 23; // Cowboy Boots - 16.00% shoes[3] = 43; // Crocs - 20.00% shoes[4] = 51; // Fancy Sneakers - 8.00% shoes[5] = 55; // Lux Flip Flops - 4.00% shoes[6] = 80; // Old Sneakers - 25.00% shoes[7] = 100; //Oxfords - 20.00% uint[] memory attributes = new uint[](26); attributes[0] = 0; attributes[1] = 0; // Blank - 0.00% attributes[2] = 100; // Cone (left hand) - 10.00% attributes[3] = 200; // Fishing pole (right hand) - 10.00% attributes[4] = 220; // Fishing pole (right hand) + Cone (left hand) - 2.00% attributes[5] = 230; // Fishing pole (right hand) + Golden watch (left hand) - 1.00% attributes[6] = 250; // Fishing pole (right hand) + Joint (left hand) - 2.00% attributes[7] = 255; // Fishing pole(right hand) + OpenOcean bag (left hand) - 0.50% attributes[8] = 355; // Golden watch (left hand) - 10.00% attributes[9] = 455; // Gun (right hand) - 10.00% attributes[10] = 555; // Joint (left hand) - 10.00% attributes[11] = 655; // Money bills (right hand) - 10.00% attributes[12] = 670; // Money bills (right hand) + Cone (left hand) - 1.50% attributes[13] = 690; // Money bills (right hand) + Golden watch (left hand) - 2.00% attributes[14] = 695; // Money bills (right hand) + Joint (left hand) - 0.50% attributes[15] = 715; // Money bills (right hand) + OpenOcean bag (left hand) - 2.00% attributes[16] = 815; // OpenOcean bag (left hand) - 10.00% attributes[17] = 915; // Phone (right hand) - 10.00% attributes[18] = 920; // Phone (right hand) + Cone (left hand) - 0.50% attributes[19] = 935; // Phone (right hand) + Golden watch (left hand) - 1.50% attributes[20] = 950; // Phone (right hand) + Joint (left hand) - 1.50% attributes[21] = 965; // Phone (right hand) + OpenOcean bag (left hand) - 1.50% attributes[22] = 975; // Pistol (right hand) + Cone (left hand) - 1.00% attributes[23] = 980; // Pistol (right hand) + Golden watch (left hand) - 0.50% attributes[24] = 990; // Pistol (right hand) + Joint (left hand) - 1.00% attributes[25] = 1000; //Pistol (right hand) + OpenOcean bag (left hand) - 1.00% return string(abi.encodePacked( Strings.uintToPad2Str(upperBound(hat_hair, randomUint(randomSeed(), hat_hair[hat_hair.length - 1])) - 1), Strings.uintToPad2Str(upperBound(skin_color_facial_expression, randomUint(randomSeed(), skin_color_facial_expression[skin_color_facial_expression.length - 1])) - 1), Strings.uintToPad2Str(upperBound(neck, randomUint(randomSeed(), neck[neck.length - 1])) - 1), Strings.uintToPad2Str(upperBound(upper_body, randomUint(randomSeed(), upper_body[upper_body.length - 1])) - 1), Strings.uintToPad2Str(upperBound(lower_body, randomUint(randomSeed(), lower_body[lower_body.length - 1])) - 1), Strings.uintToPad2Str(upperBound(shoes, randomUint(randomSeed(), shoes[shoes.length - 1])) - 1), Strings.uintToPad2Str(upperBound(attributes, randomUint(randomSeed(), attributes[attributes.length - 1])) - 1))); } function sendSecretHash(bytes32 _secretHash, uint count) public onlyOwner { require(rngSemaphore == false && seedExpiry == totalSupply() && count > 0); secretHash = _secretHash; seedExpiry = count.add(totalSupply()); nextBlockNumber = block.number + 1; rngSemaphore = true; } function initRng(string memory secret) public onlyOwner { require(rngSemaphore == true && block.number >= nextBlockNumber); require(keccak256(abi.encodePacked(secret)) == secretHash, "wrong secret"); _rngSeed = uint(keccak256(abi.encodePacked(secret, blockhash(nextBlockNumber)))); rngSemaphore = false; emit SeedInit(msg.sender, totalSupply(), seedExpiry, _rngSeed); } function resetRng() public onlyOwner { // we should never call this function require(rngSemaphore == true); // event trigger emit SeedReset(msg.sender, totalSupply(), seedExpiry); seedExpiry = totalSupply(); rngSemaphore = false; } function randomSeed() internal returns (uint) { //unchecked // { _rngSeed = _rngSeed + 1; // } return _rngSeed; } // RNG functions public function randomUint(uint seed, uint modulo) internal pure returns (uint) { uint num; uint nonce = 0; do { num = uint(keccak256(abi.encodePacked(seed, nonce++ ))); } while( num >= type(uint).max - (type(uint).max.mod(modulo)) ); return num.mod(modulo); } // Lottery functions, Off chain randomness : seed = Hash(userSeed + blockhash(currBlockNumber-7)) function tipRandomGambler(uint firstTokenId, uint lastTokenId, string memory userSeed) public payable { require(msg.value != 0, "Send some ether" ); require(firstTokenId >= 1 && lastTokenId <= totalSupply() && lastTokenId.sub(firstTokenId) > 0, "Invalid arguments"); uint winner = firstTokenId.add(randomUint(uint(keccak256(abi.encodePacked(userSeed, blockhash(block.number - 7)))), lastTokenId.sub(firstTokenId).add(1))); address winnerOwner = ownerOf(winner); payable(winnerOwner).transfer(msg.value); emit LotteryFromTo(msg.sender, winnerOwner, msg.value, firstTokenId, lastTokenId, userSeed, winner); } function tipRandomGambler(string memory userSeed) public payable { tipRandomGambler(1, totalSupply(), userSeed); } function tipRandomGambler(string memory properties, string memory userSeed) public payable { require(msg.value != 0, "Send some ether" ); require(properties.strMatch("??????????????"), "Invalid arguments"); (uint[] memory participants, uint participants_count) = getGamblersByProperties(properties); require(participants_count != 0, "No participants"); uint winner = participants[randomUint(uint(keccak256(abi.encodePacked(userSeed, blockhash(block.number - 7)))), participants_count)]; address winnerOwner = ownerOf(winner); payable(winnerOwner).transfer(msg.value); emit LotteryProperties(msg.sender, winnerOwner, msg.value, properties, userSeed, winner); } // Binary search function upperBound(uint[] memory arr, uint value) internal pure returns(uint) { uint mid; uint low = 0; uint high = arr.length; while (low < high) { mid = low + (high - low) / 2; if (value >= arr[mid]) low = mid + 1; else high = mid; } return low; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @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 { // 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 MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @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) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @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) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @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._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.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) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @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) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @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) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @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) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // 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.6.0 <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; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. 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] = toDeleteIndex + 1; // All indexes are 1-based // 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) { require(set._values.length > index, "EnumerableSet: index out of bounds"); 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.6.0 <0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _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.6.0 <0.8.0; import "./Context.sol"; import "./IERC721.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./IERC721Receiver.sol"; import "./ERC165.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, ERC165, 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) private _tokenURIs; // 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_) public { _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 virtual 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 virtual override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).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(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, 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 virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual 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 virtual 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 = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.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 virtual 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 virtual 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 virtual 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 virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.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 Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), 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(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner 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"); _tokenURIs[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); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @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.6.0 <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.6.2 <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.6.2 <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.6.2 <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.6.0 <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.6.0 <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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ 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) { 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) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @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. 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) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { 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) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` 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); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } function uintToPad2Str(uint _num) public pure returns (string memory _uintAsString) { require(_num < 100); if (_num == 0) return "00"; bytes memory bstr = new bytes(2); bstr[1] = bytes1(uint8(48 + _num % 10)); _num /= 10; bstr[0] = bytes1(uint8(48 + _num % 10)); return string(bstr); } function strMatch(string memory _test, string memory _pattern) public pure returns(bool) { bytes memory pattern = bytes(_pattern); bytes memory test = bytes(_test); if(pattern.length == test.length) { for(uint i=0; i<pattern.length; i++) { if(pattern[i] != "?" && pattern[i] != test[i]) return false; } return true; } else return false; } }
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":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_firstTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_lastTokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_userInput","type":"string"},{"indexed":true,"internalType":"uint256","name":"_luckyNumber","type":"uint256"}],"name":"LotteryFromTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"string","name":"_propertiesString","type":"string"},{"indexed":false,"internalType":"string","name":"_userInput","type":"string"},{"indexed":true,"internalType":"uint256","name":"_luckyNumber","type":"uint256"}],"name":"LotteryProperties","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_seedExpiry","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"__rngSeed","type":"uint256"}],"name":"SeedInit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_seedExpiry","type":"uint256"}],"name":"SeedReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"properties","type":"string"}],"name":"getGamblersByProperties","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"secret","type":"string"}],"name":"initRng","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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"properties","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"propertiesOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetRng","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_secretHash","type":"bytes32"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"sendSecretHash","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":"hash","type":"string"}],"name":"setMetadataHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"properties","type":"string"},{"internalType":"string","name":"userSeed","type":"string"}],"name":"tipRandomGambler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"firstTokenId","type":"uint256"},{"internalType":"uint256","name":"lastTokenId","type":"uint256"},{"internalType":"string","name":"userSeed","type":"string"}],"name":"tipRandomGambler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"userSeed","type":"string"}],"name":"tipRandomGambler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040819052600060808190526200001c916103149162000238565b50600061031581905561031681905561031781905561031855610319805460ff191690553480156200004d57600080fd5b50604080518082018252600e81526d43727970746f47616d626c65727360901b6020808301919091528251808401909352600583526423a6a1262960d91b9083015290620000a26301ffc9a760e01b62000196565b8151620000b790600690602085019062000238565b508051620000cd90600790602084019062000238565b50620000e06380ac58cd60e01b62000196565b620000f2635b5e139f60e01b62000196565b6200010463780e9d6360e01b62000196565b5060009050620001136200021b565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620001906040518060600160405280602e815260200162005221602e91396200021f60201b620028351760201c565b620002e4565b6001600160e01b03198082161415620001f6576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b80516200023490600990602084019062000238565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620002705760008555620002bb565b82601f106200028b57805160ff1916838001178555620002bb565b82800160010185558215620002bb579182015b82811115620002bb5782518255916020019190600101906200029e565b50620002c9929150620002cd565b5090565b5b80821115620002c95760008155600101620002ce565b614f2d80620002f46000396000f3fe6080604052600436106101e35760003560e01c8063715018a611610102578063c5a1d7f011610095578063d85d3d2711610064578063d85d3d2714610b05578063e985e9c514610bb6578063ef19348c14610bf1578063f2fde38b14610ca2576101e3565b8063c5a1d7f014610a81578063c87b56dd14610a96578063ccacb65814610ac0578063d5abeb0114610af0576101e3565b80638da5cb5b116100d15780638da5cb5b1461094b57806395d89b4114610960578063a22cb46514610975578063b88d4fde146109b0576101e3565b8063715018a6146107315780637315860e146107465780637f301b83146107f65780638cec6c5f146108a7576101e3565b80633e3e9fef1161017a578063606cf27e11610149578063606cf27e146106955780636352211e146106bf5780636c0360eb146106e957806370a08231146106fe576101e3565b80633e3e9fef146103f357806342842e0e146104ff5780634f6ccce7146105425780635b3971bf1461056c576101e3565b806318160ddd116101b657806318160ddd1461033b57806323b872dd146103625780632f2e3d01146103a55780632f745c59146103ba576101e3565b806301ffc9a7146101e857806306fdde0314610230578063081812fc146102ba578063095ea7b314610300575b600080fd5b3480156101f457600080fd5b5061021c6004803603602081101561020b57600080fd5b50356001600160e01b031916610cd5565b604080519115158252519081900360200190f35b34801561023c57600080fd5b50610245610cf8565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027f578181015183820152602001610267565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102c657600080fd5b506102e4600480360360208110156102dd57600080fd5b5035610d8e565b604080516001600160a01b039092168252519081900360200190f35b34801561030c57600080fd5b506103396004803603604081101561032357600080fd5b506001600160a01b038135169060200135610df0565b005b34801561034757600080fd5b50610350610ecb565b60408051918252519081900360200190f35b34801561036e57600080fd5b506103396004803603606081101561038557600080fd5b506001600160a01b03813581169160208101359091169060400135610edc565b3480156103b157600080fd5b50610339610f33565b3480156103c657600080fd5b50610350600480360360408110156103dd57600080fd5b506001600160a01b038135169060200135611018565b3480156103ff57600080fd5b506104a46004803603602081101561041657600080fd5b810190602081018135600160201b81111561043057600080fd5b82018360208201111561044257600080fd5b803590602001918460018302840111600160201b8311171561046357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611043945050505050565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156104ea5781810151838201526020016104d2565b50505050905001935050505060405180910390f35b34801561050b57600080fd5b506103396004803603606081101561052257600080fd5b506001600160a01b038135811691602081013590911690604001356112be565b34801561054e57600080fd5b506103506004803603602081101561056557600080fd5b50356112d9565b6103396004803603604081101561058257600080fd5b810190602081018135600160201b81111561059c57600080fd5b8201836020820111156105ae57600080fd5b803590602001918460018302840111600160201b831117156105cf57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561062157600080fd5b82018360208201111561063357600080fd5b803590602001918460018302840111600160201b8311171561065457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506112ef945050505050565b3480156106a157600080fd5b50610245600480360360208110156106b857600080fd5b50356116da565b3480156106cb57600080fd5b506102e4600480360360208110156106e257600080fd5b503561179f565b3480156106f557600080fd5b506102456117c7565b34801561070a57600080fd5b506103506004803603602081101561072157600080fd5b50356001600160a01b0316611828565b34801561073d57600080fd5b50610339611890565b6103396004803603606081101561075c57600080fd5b813591602081013591810190606081016040820135600160201b81111561078257600080fd5b82018360208201111561079457600080fd5b803590602001918460018302840111600160201b831117156107b557600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061193c945050505050565b34801561080257600080fd5b506103396004803603602081101561081957600080fd5b810190602081018135600160201b81111561083357600080fd5b82018360208201111561084557600080fd5b803590602001918460018302840111600160201b8311171561086657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ba7945050505050565b610339600480360360208110156108bd57600080fd5b810190602081018135600160201b8111156108d757600080fd5b8201836020820111156108e957600080fd5b803590602001918460018302840111600160201b8311171561090a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611c56945050505050565b34801561095757600080fd5b506102e4611c6c565b34801561096c57600080fd5b50610245611c7b565b34801561098157600080fd5b506103396004803603604081101561099857600080fd5b506001600160a01b0381351690602001351515611cdc565b3480156109bc57600080fd5b50610339600480360360808110156109d357600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610a0d57600080fd5b820183602082011115610a1f57600080fd5b803590602001918460018302840111600160201b83111715610a4057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611de1945050505050565b348015610a8d57600080fd5b50610245611e3f565b348015610aa257600080fd5b5061024560048036036020811015610ab957600080fd5b5035611ece565b348015610acc57600080fd5b5061033960048036036040811015610ae357600080fd5b508035906020013561214f565b348015610afc57600080fd5b5061035061221a565b348015610b1157600080fd5b5061033960048036036020811015610b2857600080fd5b810190602081018135600160201b811115610b4257600080fd5b820183602082011115610b5457600080fd5b803590602001918460018302840111600160201b83111715610b7557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612220945050505050565b348015610bc257600080fd5b5061021c60048036036040811015610bd957600080fd5b506001600160a01b03813581169160200135166124e8565b348015610bfd57600080fd5b5061033960048036036020811015610c1457600080fd5b810190602081018135600160201b811115610c2e57600080fd5b820183602082011115610c4057600080fd5b803590602001918460018302840111600160201b83111715610c6157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612516945050505050565b348015610cae57600080fd5b5061033960048036036020811015610cc557600080fd5b50356001600160a01b0316612732565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d845780601f10610d5957610100808354040283529160200191610d84565b820191906000526020600020905b815481529060010190602001808311610d6757829003601f168201915b5050505050905090565b6000610d9982612848565b610dd45760405162461bcd60e51b815260040180806020018281038252602c815260200180614e02602c913960400191505060405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610dfb8261179f565b9050806001600160a01b0316836001600160a01b03161415610e4e5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea66021913960400191505060405180910390fd5b806001600160a01b0316610e60612855565b6001600160a01b03161480610e815750610e8181610e7c612855565b6124e8565b610ebc5760405162461bcd60e51b8152600401808060200182810382526038815260200180614d556038913960400191505060405180910390fd5b610ec68383612859565b505050565b6000610ed760026128c7565b905090565b610eed610ee7612855565b826128d2565b610f285760405162461bcd60e51b8152600401808060200182810382526031815260200180614ec76031913960400191505060405180910390fd5b610ec6838383612976565b610f3b612855565b6001600160a01b0316610f4c611c6c565b6001600160a01b031614610f95576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b6103195460ff161515600114610faa57600080fd5b7fd7cfcff97b4972a01a6d930585ed4a8bfdb05dcc3d357be3d4eff9a8f262175b33610fd4610ecb565b61031854604080516001600160a01b039094168452602084019290925282820152519081900360600190a1611007610ecb565b61031855610319805460ff19169055565b6001600160a01b038216600090815260016020526040812061103a9083612ac2565b90505b92915050565b6060600080611050610ecb565b67ffffffffffffffff8111801561106657600080fd5b50604051908082528060200260200182016040528015611090578160200160208202803683370190505b5090506000805b61109f610ecb565b8110156112b357600b8161030981106110b457fe5b01805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156111395780601f1061110e57610100808354040283529160200191611139565b820191906000526020600020905b81548152906001019060200180831161111c57829003601f168201915b50506040805163d1637b6960e01b81526004810191825285516044820152855173e0d1498d5f184412dcde12bdcba210cdf2d3d8979663d1637b69965094508c935082916024810191606490910190602087019080838360005b838110156111ab578181015183820152602001611193565b50505050905090810190601f1680156111d85780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561120b5781810151838201526020016111f3565b50505050905090810190601f1680156112385780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b15801561125757600080fd5b505af415801561126b573d6000803e3d6000fd5b505050506040513d602081101561128157600080fd5b5051156112ab578060010183838060010194508151811061129e57fe5b6020026020010181815250505b600101611097565b509092509050915091565b610ec683838360405180602001604052806000815250611de1565b6000806112e7600284612ace565b509392505050565b34611333576040805162461bcd60e51b815260206004820152600f60248201526e29b2b7321039b7b6b29032ba3432b960891b604482015290519081900360640190fd5b6040805163d1637b6960e01b81526004810191825283516044820152835173e0d1498d5f184412dcde12bdcba210cdf2d3d8979263d1637b6992869282916024810191606490910190602086019080838360005b8381101561139f578181015183820152602001611387565b50505050905090810190601f1680156113cc5780820380516001836020036101000a031916815260200191505b508381038252600e8152602001806d3f3f3f3f3f3f3f3f3f3f3f3f3f3f60901b815250602001935050505060206040518083038186803b15801561140f57600080fd5b505af4158015611423573d6000803e3d6000fd5b505050506040513d602081101561143957600080fd5b5051611480576040805162461bcd60e51b8152602060048201526011602482015270496e76616c696420617267756d656e747360781b604482015290519081900360640190fd5b60008061148c84611043565b9150915080600014156114d8576040805162461bcd60e51b815260206004820152600f60248201526e4e6f207061727469636970616e747360881b604482015290519081900360640190fd5b6000826115568560074303406040516020018083805190602001908083835b602083106115165780518252601f1990920191602091820191016114f7565b51815160209384036101000a6000190180199092169116179052920193845250604080518085038152938201905282519201919091209150859050612aea565b8151811061156057fe5b6020026020010151905060006115758261179f565b6040519091506001600160a01b038216903480156108fc02916000818181858888f193505050501580156115ad573d6000803e3d6000fd5b5081336001600160a01b03167fd4391c453d62ac13aa2b3bff93eb2ad8da3b8676cd937afa7a8dfbc8fff4053983348a8a60405180856001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561163457818101518382015260200161161c565b50505050905090810190601f1680156116615780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561169457818101518382015260200161167c565b50505050905090810190601f1680156116c15780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a3505050505050565b6060600182101580156116f457506116f0610ecb565b8211155b6116fd57600080fd5b600b60018303610309811061170e57fe5b01805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156117935780601f1061176857610100808354040283529160200191611793565b820191906000526020600020905b81548152906001019060200180831161177657829003601f168201915b50505050509050919050565b600061103d82604051806060016040528060298152602001614db76029913960029190612b44565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d845780601f10610d5957610100808354040283529160200191610d84565b60006001600160a01b03821661186f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614d8d602a913960400191505060405180910390fd5b6001600160a01b038216600090815260016020526040902061103d906128c7565b611898612855565b6001600160a01b03166118a9611c6c565b6001600160a01b0316146118f2576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b34611980576040805162461bcd60e51b815260206004820152600f60248201526e29b2b7321039b7b6b29032ba3432b960891b604482015290519081900360640190fd5b600183101580156119985750611994610ecb565b8211155b80156119ad575060006119ab8385612b5b565b115b6119f2576040805162461bcd60e51b8152602060048201526011602482015270496e76616c696420617267756d656e747360781b604482015290519081900360640190fd5b6000611a8d611a868360074303406040516020018083805190602001908083835b60208310611a325780518252601f199092019160209182019101611a13565b51815160209384036101000a6000190180199092169116179052920193845250604080518085038152938201905282519201919091209150611a8190506001611a7b888a612b5b565b90612bb8565b612aea565b8590612bb8565b90506000611a9a8261179f565b6040519091506001600160a01b038216903480156108fc02916000818181858888f19350505050158015611ad2573d6000803e3d6000fd5b5081336001600160a01b03167f46a0fb0f3771dc62fa2cb2571c74de6ab564171ed96c15848156bd212dfffb1e833489898960405180866001600160a01b0316815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611b62578181015183820152602001611b4a565b50505050905090810190601f168015611b8f5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a35050505050565b611baf612855565b6001600160a01b0316611bc0611c6c565b6001600160a01b031614611c09576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b6103145460026000196101006001841615020190911604158015611c355750610309611c33610ecb565b145b611c3e57600080fd5b8051611c5290610314906020840190614be9565b5050565b611c696001611c63610ecb565b8361193c565b50565b600a546001600160a01b031690565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d845780601f10610d5957610100808354040283529160200191610d84565b611ce4612855565b6001600160a01b0316826001600160a01b03161415611d4a576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060056000611d57612855565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611d9b612855565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b611df2611dec612855565b836128d2565b611e2d5760405162461bcd60e51b8152600401808060200182810382526031815260200180614ec76031913960400191505060405180910390fd5b611e3984848484612c12565b50505050565b610314805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611ec65780601f10611e9b57610100808354040283529160200191611ec6565b820191906000526020600020905b815481529060010190602001808311611ea957829003601f168201915b505050505081565b6060611ed982612848565b611f145760405162461bcd60e51b815260040180806020018281038252602f815260200180614e77602f913960400191505060405180910390fd5b60008281526008602090815260408083208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815292909190830182828015611fa75780601f10611f7c57610100808354040283529160200191611fa7565b820191906000526020600020905b815481529060010190602001808311611f8a57829003601f168201915b505050505090506000611fb86117c7565b9050805160001415611fcc57509050610cf3565b81511561208d5780826040516020018083805190602001908083835b602083106120075780518252601f199092019160209182019101611fe8565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061204f5780518252601f199092019160209182019101612030565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050610cf3565b8061209785612c64565b6040516020018083805190602001908083835b602083106120c95780518252601f1990920191602091820191016120aa565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106121115780518252601f1990920191602091820191016120f2565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b612157612855565b6001600160a01b0316612168611c6c565b6001600160a01b0316146121b1576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b6103195460ff161580156121ce57506121c8610ecb565b61031854145b80156121da5750600081115b6121e357600080fd5b6103168290556121fb6121f4610ecb565b8290612bb8565b610318555050600143810161031555610319805460ff19169091179055565b61030981565b612228612855565b6001600160a01b0316612239611c6c565b6001600160a01b031614612282576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b61030961228d610ecb565b106122d4576040805162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b604482015290519081900360640190fd5b6122dc610ecb565b6103185411612325576040805162461bcd60e51b815260206004820152601060248201526f17dc9b99d4d9595908195e1c1a5c995960821b604482015290519081900360640190fd5b6103195460ff1615612377576040805162461bcd60e51b81526020600482015260166024820152751cd958dc995d081a5cc81b9bdd081c995d99585b195960521b604482015290519081900360640190fd5b60006123866001611a7b610ecb565b905061030981146123a057612399612d3f565b91506124b1565b6040805163d1637b6960e01b81526004810191825283516044820152835173e0d1498d5f184412dcde12bdcba210cdf2d3d8979263d1637b6992869282916024810191606490910190602086019080838360005b8381101561240c5781810151838201526020016123f4565b50505050905090810190601f1680156124395780820380516001836020036101000a031916815260200191505b508381038252600e8152602001806d3f3f3f3f3f3f3f3f3f3f3f3f3f3f60901b815250602001935050505060206040518083038186803b15801561247c57600080fd5b505af4158015612490573d6000803e3d6000fd5b505050506040513d60208110156124a657600080fd5b50516124b157600080fd5b6124c26124bc611c6c565b8261435c565b81600b6001830361030981106124d457fe5b019080519060200190610ec6929190614be9565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61251e612855565b6001600160a01b031661252f611c6c565b6001600160a01b031614612578576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b6103195460ff16151560011480156125935750610315544310155b61259c57600080fd5b61031654816040516020018082805190602001908083835b602083106125d35780518252601f1990920191602091820191016125b4565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201461264f576040805162461bcd60e51b815260206004820152600c60248201526b1ddc9bdb99c81cd958dc995d60a21b604482015290519081900360640190fd5b8061031554406040516020018083805190602001908083835b602083106126875780518252601f199092019160209182019101612668565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190528251920191909120610317555050610319805460ff191690557f9f340b06bf05a42c9d9ba693f4735e7690eebbf0727a5b0e2bf8225562493adb336126f8610ecb565b6103185461031754604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190a150565b61273a612855565b6001600160a01b031661274b611c6c565b6001600160a01b031614612794576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b6001600160a01b0381166127d95760405162461bcd60e51b8152600401808060200182810382526026815260200180614cdf6026913960400191505060405180910390fd5b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b8051611c52906009906020840190614be9565b600061103d60028361448a565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061288e8261179f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061103d82614496565b60006128dd82612848565b6129185760405162461bcd60e51b815260040180806020018281038252602c815260200180614d29602c913960400191505060405180910390fd5b60006129238361179f565b9050806001600160a01b0316846001600160a01b0316148061295e5750836001600160a01b031661295384610d8e565b6001600160a01b0316145b8061296e575061296e81856124e8565b949350505050565b826001600160a01b03166129898261179f565b6001600160a01b0316146129ce5760405162461bcd60e51b8152600401808060200182810382526029815260200180614e4e6029913960400191505060405180910390fd5b6001600160a01b038216612a135760405162461bcd60e51b8152600401808060200182810382526024815260200180614d056024913960400191505060405180910390fd5b612a1e838383610ec6565b612a29600082612859565b6001600160a01b0383166000908152600160205260409020612a4b908261449a565b506001600160a01b0382166000908152600160205260409020612a6e90826144a6565b50612a7b600282846144b2565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061103a83836144c8565b6000808080612add868661452c565b9097909650945050505050565b60008060005b604080516020808201889052818301849052825180830384018152606090920190925280519101209150600101612b29600019856145a7565b19821015612af057612b3b82856145a7565b95945050505050565b6000612b5184848461460e565b90505b9392505050565b600082821115612bb2576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561103a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b612c1d848484612976565b612c29848484846146d8565b611e395760405162461bcd60e51b8152600401808060200182810382526032815260200180614cad6032913960400191505060405180910390fd5b606081612c8957506040805180820190915260018152600360fc1b6020820152610cf3565b8160005b8115612ca157600101600a82049150612c8d565b60008167ffffffffffffffff81118015612cba57600080fd5b506040519080825280601f01601f191660200182016040528015612ce5576020820181803683370190505b50859350905060001982015b8315612d3657600a840660300160f81b82828060019003935081518110612d1457fe5b60200101906001600160f81b031916908160001a905350600a84049350612cf1565b50949350505050565b6040805160098082526101408201909252606091600091906020820161012080368337019050509050600081600081518110612d7757fe5b602002602001018181525050600781600181518110612d9257fe5b602002602001018181525050601681600281518110612dad57fe5b602002602001018181525050602381600381518110612dc857fe5b602002602001018181525050602e81600481518110612de357fe5b602002602001018181525050603d81600581518110612dfe57fe5b602002602001018181525050604981600681518110612e1957fe5b602002602001018181525050605c81600781518110612e3457fe5b602002602001018181525050606481600881518110612e4f57fe5b60209081029190910101526040805160168082526102e08201909252600091816020016020820280368337019050509050600081600081518110612e8f57fe5b602002602001018181525050600081600181518110612eaa57fe5b602002602001018181525050601181600281518110612ec557fe5b602002602001018181525050601881600381518110612ee057fe5b602002602001018181525050605481600481518110612efb57fe5b602002602001018181525050609081600581518110612f1657fe5b60200260200101818152505060cc81600681518110612f3157fe5b60200260200101818152505061010881600781518110612f4d57fe5b60200260200101818152505061010f81600881518110612f6957fe5b60200260200101818152505061012081600981518110612f8557fe5b60200260200101818152505061015c81600a81518110612fa157fe5b60200260200101818152505061019881600b81518110612fbd57fe5b6020026020010181815250506101d481600c81518110612fd957fe5b60200260200101818152505061021081600d81518110612ff557fe5b60200260200101818152505061024c81600e8151811061301157fe5b60200260200101818152505061028881600f8151811061302d57fe5b6020026020010181815250506102c48160108151811061304957fe5b6020026020010181815250506103008160118151811061306557fe5b60200260200101818152505061033a8160128151811061308157fe5b6020026020010181815250506103748160138151811061309d57fe5b6020026020010181815250506103ae816014815181106130b957fe5b6020026020010181815250506103e8816015815181106130d557fe5b6020908102919091010152604080516008808252610120820190925260009181602001602082028036833701905050905060008160008151811061311557fe5b60200260200101818152505060468160018151811061313057fe5b602002602001018181525050607f8160028151811061314b57fe5b60200260200101818152505061018d8160038151811061316757fe5b6020026020010181815250506102418160048151811061318357fe5b6020026020010181815250506102d38160058151811061319f57fe5b602002602001018181525050610369816006815181106131bb57fe5b6020026020010181815250506103e8816007815181106131d757fe5b602090810291909101015260408051600a808252610160820190925260009181602001602082028036833701905050905060008160008151811061321757fe5b60200260200101818152505060078160018151811061323257fe5b60200260200101818152505060118160028151811061324d57fe5b60200260200101818152505060178160038151811061326857fe5b60200260200101818152505060268160048151811061328357fe5b60200260200101818152505060308160058151811061329e57fe5b602002602001018181525050603a816006815181106132b957fe5b6020026020010181815250506042816007815181106132d457fe5b6020026020010181815250506050816008815181106132ef57fe5b60200260200101818152505060648160098151811061330a57fe5b6020908102919091010152604080516008808252610120820190925260009181602001602082028036833701905050905060008160008151811061334a57fe5b60200260200101818152505060078160018151811061336557fe5b60200260200101818152505060138160028151811061338057fe5b60200260200101818152505060238160038151811061339b57fe5b6020026020010181815250506033816004815181106133b657fe5b602002602001018181525050603c816005815181106133d157fe5b6020026020010181815250506055816006815181106133ec57fe5b60200260200101818152505060648160078151811061340757fe5b6020908102919091010152604080516008808252610120820190925260009181602001602082028036833701905050905060008160008151811061344757fe5b60200260200101818152505060078160018151811061346257fe5b60200260200101818152505060178160028151811061347d57fe5b602002602001018181525050602b8160038151811061349857fe5b6020026020010181815250506033816004815181106134b357fe5b6020026020010181815250506037816005815181106134ce57fe5b6020026020010181815250506050816006815181106134e957fe5b60200260200101818152505060648160078151811061350457fe5b602090810291909101015260408051601a808252610360820190925260009181602001602082028036833701905050905060008160008151811061354457fe5b60200260200101818152505060008160018151811061355f57fe5b60200260200101818152505060648160028151811061357a57fe5b60200260200101818152505060c88160038151811061359557fe5b60200260200101818152505060dc816004815181106135b057fe5b60200260200101818152505060e6816005815181106135cb57fe5b60200260200101818152505060fa816006815181106135e657fe5b60200260200101818152505060ff8160078151811061360157fe5b6020026020010181815250506101638160088151811061361d57fe5b6020026020010181815250506101c78160098151811061363957fe5b60200260200101818152505061022b81600a8151811061365557fe5b60200260200101818152505061028f81600b8151811061367157fe5b60200260200101818152505061029e81600c8151811061368d57fe5b6020026020010181815250506102b281600d815181106136a957fe5b6020026020010181815250506102b781600e815181106136c557fe5b6020026020010181815250506102cb81600f815181106136e157fe5b60200260200101818152505061032f816010815181106136fd57fe5b6020026020010181815250506103938160118151811061371957fe5b6020026020010181815250506103988160128151811061373557fe5b6020026020010181815250506103a78160138151811061375157fe5b6020026020010181815250506103b68160148151811061376d57fe5b6020026020010181815250506103c58160158151811061378957fe5b6020026020010181815250506103cf816016815181106137a557fe5b6020026020010181815250506103d4816017815181106137c157fe5b6020026020010181815250506103de816018815181106137dd57fe5b6020026020010181815250506103e8816019815181106137f957fe5b60200260200101818152505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff60016138528a61384d613830614840565b8d60018f51038151811061384057fe5b6020026020010151612aea565b61484f565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561388757600080fd5b505af415801561389b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156138c457600080fd5b8101908080516040519392919084600160201b8211156138e357600080fd5b9083019060208201858111156138f857600080fd5b8251600160201b81118282018810171561391157600080fd5b82525081516020918201929091019080838360005b8381101561393e578181015183820152602001613926565b50505050905090810190601f16801561396b5780820380516001836020036101000a031916815260200191505b5060405250505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff600161399d8a61384d613830614840565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b1580156139d257600080fd5b505af41580156139e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613a0f57600080fd5b8101908080516040519392919084600160201b821115613a2e57600080fd5b908301906020820185811115613a4357600080fd5b8251600160201b811182820188101715613a5c57600080fd5b82525081516020918201929091019080838360005b83811015613a89578181015183820152602001613a71565b50505050905090810190601f168015613ab65780820380516001836020036101000a031916815260200191505b5060405250505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff6001613ae88a61384d613830614840565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015613b1d57600080fd5b505af4158015613b31573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613b5a57600080fd5b8101908080516040519392919084600160201b821115613b7957600080fd5b908301906020820185811115613b8e57600080fd5b8251600160201b811182820188101715613ba757600080fd5b82525081516020918201929091019080838360005b83811015613bd4578181015183820152602001613bbc565b50505050905090810190601f168015613c015780820380516001836020036101000a031916815260200191505b5060405250505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff6001613c338a61384d613830614840565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015613c6857600080fd5b505af4158015613c7c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613ca557600080fd5b8101908080516040519392919084600160201b821115613cc457600080fd5b908301906020820185811115613cd957600080fd5b8251600160201b811182820188101715613cf257600080fd5b82525081516020918201929091019080838360005b83811015613d1f578181015183820152602001613d07565b50505050905090810190601f168015613d4c5780820380516001836020036101000a031916815260200191505b5060405250505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff6001613d7e8a61384d613830614840565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015613db357600080fd5b505af4158015613dc7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613df057600080fd5b8101908080516040519392919084600160201b821115613e0f57600080fd5b908301906020820185811115613e2457600080fd5b8251600160201b811182820188101715613e3d57600080fd5b82525081516020918201929091019080838360005b83811015613e6a578181015183820152602001613e52565b50505050905090810190601f168015613e975780820380516001836020036101000a031916815260200191505b5060405250505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff6001613ec98a61384d613830614840565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015613efe57600080fd5b505af4158015613f12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613f3b57600080fd5b8101908080516040519392919084600160201b821115613f5a57600080fd5b908301906020820185811115613f6f57600080fd5b8251600160201b811182820188101715613f8857600080fd5b82525081516020918201929091019080838360005b83811015613fb5578181015183820152602001613f9d565b50505050905090810190601f168015613fe25780820380516001836020036101000a031916815260200191505b5060405250505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff60016140148a61384d613830614840565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561404957600080fd5b505af415801561405d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561408657600080fd5b8101908080516040519392919084600160201b8211156140a557600080fd5b9083019060208201858111156140ba57600080fd5b8251600160201b8111828201881017156140d357600080fd5b82525081516020918201929091019080838360005b838110156141005781810151838201526020016140e8565b50505050905090810190601f16801561412d5780820380516001836020036101000a031916815260200191505b506040525050506040516020018088805190602001908083835b602083106141665780518252601f199092019160209182019101614147565b51815160209384036101000a60001901801990921691161790528a5191909301928a0191508083835b602083106141ae5780518252601f19909201916020918201910161418f565b51815160209384036101000a600019018019909216911617905289519190930192890191508083835b602083106141f65780518252601f1990920191602091820191016141d7565b51815160209384036101000a600019018019909216911617905288519190930192880191508083835b6020831061423e5780518252601f19909201916020918201910161421f565b51815160209384036101000a600019018019909216911617905287519190930192870191508083835b602083106142865780518252601f199092019160209182019101614267565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b602083106142ce5780518252601f1990920191602091820191016142af565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106143165780518252601f1990920191602091820191016142f7565b6001836020036101000a03801982511681845116808217855250505050505090500197505050505050505060405160208183030381529060405297505050505050505090565b6001600160a01b0382166143b7576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6143c081612848565b15614412576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b61441e60008383610ec6565b6001600160a01b038216600090815260016020526040902061444090826144a6565b5061444d600282846144b2565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600061103a8383614899565b5490565b600061103a83836148b1565b600061103a8383614977565b6000612b5184846001600160a01b0385166149c1565b8154600090821061450a5760405162461bcd60e51b8152600401808060200182810382526022815260200180614c8b6022913960400191505060405180910390fd5b82600001828154811061451957fe5b9060005260206000200154905092915050565b8154600090819083106145705760405162461bcd60e51b8152600401808060200182810382526022815260200180614de06022913960400191505060405180910390fd5b600084600001848154811061458157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008082116145fd576040805162461bcd60e51b815260206004820152601860248201527f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000604482015290519081900360640190fd5b81838161460657fe5b069392505050565b600082815260018401602052604081205482816146a95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561466e578181015183820152602001614656565b50505050905090810190601f16801561469b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508460000160018203815481106146bc57fe5b9060005260206000209060020201600101549150509392505050565b60006146ec846001600160a01b0316614a58565b6146f85750600161296e565b6000614806630a85bd0160e11b61470d612855565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561477457818101518382015260200161475c565b50505050905090810190601f1680156147a15780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001614cad603291396001600160a01b0388169190614a5e565b9050600081806020019051602081101561481f57600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b61031780546001019081905590565b600080600080855190505b80821015612d36576002828203048201925085838151811061487857fe5b6020026020010151851061489157826001019150614894565b50815b61485a565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561496d57835460001980830191908101906000908790839081106148e457fe5b906000526020600020015490508087600001848154811061490157fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061493157fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061103d565b600091505061103d565b60006149838383614899565b6149b95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561103d565b50600061103d565b600082815260018401602052604081205480614a26575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055612b54565b82856000016001830381548110614a3957fe5b9060005260206000209060020201600101819055506000915050612b54565b3b151590565b6060612b51848460008585614a7285614a58565b614ac3576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310614b015780518252601f199092019160209182019101614ae2565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614b63576040519150601f19603f3d011682016040523d82523d6000602084013e614b68565b606091505b5091509150614b78828286614b83565b979650505050505050565b60608315614b92575081612b54565b825115614ba25782518084602001fd5b60405162461bcd60e51b815260206004820181815284516024840152845185939192839260440191908501908083836000831561466e578181015183820152602001614656565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282614c1f5760008555614c65565b82601f10614c3857805160ff1916838001178555614c65565b82800160010185558215614c65579182015b82811115614c65578251825591602001919060010190614c4a565b50614c71929150614c75565b5090565b5b80821115614c715760008155600101614c7656fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220382f2d42756276d8db6dcc9892f5ac7ec89cba0cf6983c2abd9c65789764d2ce64736f6c6343000706003368747470733a2f2f6d657461646174612e63727970746f67616d626c6572732e6c6966652f67616d626c6572732f
Deployed Bytecode
0x6080604052600436106101e35760003560e01c8063715018a611610102578063c5a1d7f011610095578063d85d3d2711610064578063d85d3d2714610b05578063e985e9c514610bb6578063ef19348c14610bf1578063f2fde38b14610ca2576101e3565b8063c5a1d7f014610a81578063c87b56dd14610a96578063ccacb65814610ac0578063d5abeb0114610af0576101e3565b80638da5cb5b116100d15780638da5cb5b1461094b57806395d89b4114610960578063a22cb46514610975578063b88d4fde146109b0576101e3565b8063715018a6146107315780637315860e146107465780637f301b83146107f65780638cec6c5f146108a7576101e3565b80633e3e9fef1161017a578063606cf27e11610149578063606cf27e146106955780636352211e146106bf5780636c0360eb146106e957806370a08231146106fe576101e3565b80633e3e9fef146103f357806342842e0e146104ff5780634f6ccce7146105425780635b3971bf1461056c576101e3565b806318160ddd116101b657806318160ddd1461033b57806323b872dd146103625780632f2e3d01146103a55780632f745c59146103ba576101e3565b806301ffc9a7146101e857806306fdde0314610230578063081812fc146102ba578063095ea7b314610300575b600080fd5b3480156101f457600080fd5b5061021c6004803603602081101561020b57600080fd5b50356001600160e01b031916610cd5565b604080519115158252519081900360200190f35b34801561023c57600080fd5b50610245610cf8565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027f578181015183820152602001610267565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102c657600080fd5b506102e4600480360360208110156102dd57600080fd5b5035610d8e565b604080516001600160a01b039092168252519081900360200190f35b34801561030c57600080fd5b506103396004803603604081101561032357600080fd5b506001600160a01b038135169060200135610df0565b005b34801561034757600080fd5b50610350610ecb565b60408051918252519081900360200190f35b34801561036e57600080fd5b506103396004803603606081101561038557600080fd5b506001600160a01b03813581169160208101359091169060400135610edc565b3480156103b157600080fd5b50610339610f33565b3480156103c657600080fd5b50610350600480360360408110156103dd57600080fd5b506001600160a01b038135169060200135611018565b3480156103ff57600080fd5b506104a46004803603602081101561041657600080fd5b810190602081018135600160201b81111561043057600080fd5b82018360208201111561044257600080fd5b803590602001918460018302840111600160201b8311171561046357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611043945050505050565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156104ea5781810151838201526020016104d2565b50505050905001935050505060405180910390f35b34801561050b57600080fd5b506103396004803603606081101561052257600080fd5b506001600160a01b038135811691602081013590911690604001356112be565b34801561054e57600080fd5b506103506004803603602081101561056557600080fd5b50356112d9565b6103396004803603604081101561058257600080fd5b810190602081018135600160201b81111561059c57600080fd5b8201836020820111156105ae57600080fd5b803590602001918460018302840111600160201b831117156105cf57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561062157600080fd5b82018360208201111561063357600080fd5b803590602001918460018302840111600160201b8311171561065457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506112ef945050505050565b3480156106a157600080fd5b50610245600480360360208110156106b857600080fd5b50356116da565b3480156106cb57600080fd5b506102e4600480360360208110156106e257600080fd5b503561179f565b3480156106f557600080fd5b506102456117c7565b34801561070a57600080fd5b506103506004803603602081101561072157600080fd5b50356001600160a01b0316611828565b34801561073d57600080fd5b50610339611890565b6103396004803603606081101561075c57600080fd5b813591602081013591810190606081016040820135600160201b81111561078257600080fd5b82018360208201111561079457600080fd5b803590602001918460018302840111600160201b831117156107b557600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061193c945050505050565b34801561080257600080fd5b506103396004803603602081101561081957600080fd5b810190602081018135600160201b81111561083357600080fd5b82018360208201111561084557600080fd5b803590602001918460018302840111600160201b8311171561086657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ba7945050505050565b610339600480360360208110156108bd57600080fd5b810190602081018135600160201b8111156108d757600080fd5b8201836020820111156108e957600080fd5b803590602001918460018302840111600160201b8311171561090a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611c56945050505050565b34801561095757600080fd5b506102e4611c6c565b34801561096c57600080fd5b50610245611c7b565b34801561098157600080fd5b506103396004803603604081101561099857600080fd5b506001600160a01b0381351690602001351515611cdc565b3480156109bc57600080fd5b50610339600480360360808110156109d357600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610a0d57600080fd5b820183602082011115610a1f57600080fd5b803590602001918460018302840111600160201b83111715610a4057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611de1945050505050565b348015610a8d57600080fd5b50610245611e3f565b348015610aa257600080fd5b5061024560048036036020811015610ab957600080fd5b5035611ece565b348015610acc57600080fd5b5061033960048036036040811015610ae357600080fd5b508035906020013561214f565b348015610afc57600080fd5b5061035061221a565b348015610b1157600080fd5b5061033960048036036020811015610b2857600080fd5b810190602081018135600160201b811115610b4257600080fd5b820183602082011115610b5457600080fd5b803590602001918460018302840111600160201b83111715610b7557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612220945050505050565b348015610bc257600080fd5b5061021c60048036036040811015610bd957600080fd5b506001600160a01b03813581169160200135166124e8565b348015610bfd57600080fd5b5061033960048036036020811015610c1457600080fd5b810190602081018135600160201b811115610c2e57600080fd5b820183602082011115610c4057600080fd5b803590602001918460018302840111600160201b83111715610c6157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612516945050505050565b348015610cae57600080fd5b5061033960048036036020811015610cc557600080fd5b50356001600160a01b0316612732565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d845780601f10610d5957610100808354040283529160200191610d84565b820191906000526020600020905b815481529060010190602001808311610d6757829003601f168201915b5050505050905090565b6000610d9982612848565b610dd45760405162461bcd60e51b815260040180806020018281038252602c815260200180614e02602c913960400191505060405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610dfb8261179f565b9050806001600160a01b0316836001600160a01b03161415610e4e5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea66021913960400191505060405180910390fd5b806001600160a01b0316610e60612855565b6001600160a01b03161480610e815750610e8181610e7c612855565b6124e8565b610ebc5760405162461bcd60e51b8152600401808060200182810382526038815260200180614d556038913960400191505060405180910390fd5b610ec68383612859565b505050565b6000610ed760026128c7565b905090565b610eed610ee7612855565b826128d2565b610f285760405162461bcd60e51b8152600401808060200182810382526031815260200180614ec76031913960400191505060405180910390fd5b610ec6838383612976565b610f3b612855565b6001600160a01b0316610f4c611c6c565b6001600160a01b031614610f95576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b6103195460ff161515600114610faa57600080fd5b7fd7cfcff97b4972a01a6d930585ed4a8bfdb05dcc3d357be3d4eff9a8f262175b33610fd4610ecb565b61031854604080516001600160a01b039094168452602084019290925282820152519081900360600190a1611007610ecb565b61031855610319805460ff19169055565b6001600160a01b038216600090815260016020526040812061103a9083612ac2565b90505b92915050565b6060600080611050610ecb565b67ffffffffffffffff8111801561106657600080fd5b50604051908082528060200260200182016040528015611090578160200160208202803683370190505b5090506000805b61109f610ecb565b8110156112b357600b8161030981106110b457fe5b01805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156111395780601f1061110e57610100808354040283529160200191611139565b820191906000526020600020905b81548152906001019060200180831161111c57829003601f168201915b50506040805163d1637b6960e01b81526004810191825285516044820152855173e0d1498d5f184412dcde12bdcba210cdf2d3d8979663d1637b69965094508c935082916024810191606490910190602087019080838360005b838110156111ab578181015183820152602001611193565b50505050905090810190601f1680156111d85780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561120b5781810151838201526020016111f3565b50505050905090810190601f1680156112385780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b15801561125757600080fd5b505af415801561126b573d6000803e3d6000fd5b505050506040513d602081101561128157600080fd5b5051156112ab578060010183838060010194508151811061129e57fe5b6020026020010181815250505b600101611097565b509092509050915091565b610ec683838360405180602001604052806000815250611de1565b6000806112e7600284612ace565b509392505050565b34611333576040805162461bcd60e51b815260206004820152600f60248201526e29b2b7321039b7b6b29032ba3432b960891b604482015290519081900360640190fd5b6040805163d1637b6960e01b81526004810191825283516044820152835173e0d1498d5f184412dcde12bdcba210cdf2d3d8979263d1637b6992869282916024810191606490910190602086019080838360005b8381101561139f578181015183820152602001611387565b50505050905090810190601f1680156113cc5780820380516001836020036101000a031916815260200191505b508381038252600e8152602001806d3f3f3f3f3f3f3f3f3f3f3f3f3f3f60901b815250602001935050505060206040518083038186803b15801561140f57600080fd5b505af4158015611423573d6000803e3d6000fd5b505050506040513d602081101561143957600080fd5b5051611480576040805162461bcd60e51b8152602060048201526011602482015270496e76616c696420617267756d656e747360781b604482015290519081900360640190fd5b60008061148c84611043565b9150915080600014156114d8576040805162461bcd60e51b815260206004820152600f60248201526e4e6f207061727469636970616e747360881b604482015290519081900360640190fd5b6000826115568560074303406040516020018083805190602001908083835b602083106115165780518252601f1990920191602091820191016114f7565b51815160209384036101000a6000190180199092169116179052920193845250604080518085038152938201905282519201919091209150859050612aea565b8151811061156057fe5b6020026020010151905060006115758261179f565b6040519091506001600160a01b038216903480156108fc02916000818181858888f193505050501580156115ad573d6000803e3d6000fd5b5081336001600160a01b03167fd4391c453d62ac13aa2b3bff93eb2ad8da3b8676cd937afa7a8dfbc8fff4053983348a8a60405180856001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561163457818101518382015260200161161c565b50505050905090810190601f1680156116615780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561169457818101518382015260200161167c565b50505050905090810190601f1680156116c15780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a3505050505050565b6060600182101580156116f457506116f0610ecb565b8211155b6116fd57600080fd5b600b60018303610309811061170e57fe5b01805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156117935780601f1061176857610100808354040283529160200191611793565b820191906000526020600020905b81548152906001019060200180831161177657829003601f168201915b50505050509050919050565b600061103d82604051806060016040528060298152602001614db76029913960029190612b44565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d845780601f10610d5957610100808354040283529160200191610d84565b60006001600160a01b03821661186f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614d8d602a913960400191505060405180910390fd5b6001600160a01b038216600090815260016020526040902061103d906128c7565b611898612855565b6001600160a01b03166118a9611c6c565b6001600160a01b0316146118f2576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b34611980576040805162461bcd60e51b815260206004820152600f60248201526e29b2b7321039b7b6b29032ba3432b960891b604482015290519081900360640190fd5b600183101580156119985750611994610ecb565b8211155b80156119ad575060006119ab8385612b5b565b115b6119f2576040805162461bcd60e51b8152602060048201526011602482015270496e76616c696420617267756d656e747360781b604482015290519081900360640190fd5b6000611a8d611a868360074303406040516020018083805190602001908083835b60208310611a325780518252601f199092019160209182019101611a13565b51815160209384036101000a6000190180199092169116179052920193845250604080518085038152938201905282519201919091209150611a8190506001611a7b888a612b5b565b90612bb8565b612aea565b8590612bb8565b90506000611a9a8261179f565b6040519091506001600160a01b038216903480156108fc02916000818181858888f19350505050158015611ad2573d6000803e3d6000fd5b5081336001600160a01b03167f46a0fb0f3771dc62fa2cb2571c74de6ab564171ed96c15848156bd212dfffb1e833489898960405180866001600160a01b0316815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611b62578181015183820152602001611b4a565b50505050905090810190601f168015611b8f5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a35050505050565b611baf612855565b6001600160a01b0316611bc0611c6c565b6001600160a01b031614611c09576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b6103145460026000196101006001841615020190911604158015611c355750610309611c33610ecb565b145b611c3e57600080fd5b8051611c5290610314906020840190614be9565b5050565b611c696001611c63610ecb565b8361193c565b50565b600a546001600160a01b031690565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d845780601f10610d5957610100808354040283529160200191610d84565b611ce4612855565b6001600160a01b0316826001600160a01b03161415611d4a576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060056000611d57612855565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611d9b612855565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b611df2611dec612855565b836128d2565b611e2d5760405162461bcd60e51b8152600401808060200182810382526031815260200180614ec76031913960400191505060405180910390fd5b611e3984848484612c12565b50505050565b610314805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611ec65780601f10611e9b57610100808354040283529160200191611ec6565b820191906000526020600020905b815481529060010190602001808311611ea957829003601f168201915b505050505081565b6060611ed982612848565b611f145760405162461bcd60e51b815260040180806020018281038252602f815260200180614e77602f913960400191505060405180910390fd5b60008281526008602090815260408083208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815292909190830182828015611fa75780601f10611f7c57610100808354040283529160200191611fa7565b820191906000526020600020905b815481529060010190602001808311611f8a57829003601f168201915b505050505090506000611fb86117c7565b9050805160001415611fcc57509050610cf3565b81511561208d5780826040516020018083805190602001908083835b602083106120075780518252601f199092019160209182019101611fe8565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061204f5780518252601f199092019160209182019101612030565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050610cf3565b8061209785612c64565b6040516020018083805190602001908083835b602083106120c95780518252601f1990920191602091820191016120aa565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106121115780518252601f1990920191602091820191016120f2565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b612157612855565b6001600160a01b0316612168611c6c565b6001600160a01b0316146121b1576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b6103195460ff161580156121ce57506121c8610ecb565b61031854145b80156121da5750600081115b6121e357600080fd5b6103168290556121fb6121f4610ecb565b8290612bb8565b610318555050600143810161031555610319805460ff19169091179055565b61030981565b612228612855565b6001600160a01b0316612239611c6c565b6001600160a01b031614612282576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b61030961228d610ecb565b106122d4576040805162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b604482015290519081900360640190fd5b6122dc610ecb565b6103185411612325576040805162461bcd60e51b815260206004820152601060248201526f17dc9b99d4d9595908195e1c1a5c995960821b604482015290519081900360640190fd5b6103195460ff1615612377576040805162461bcd60e51b81526020600482015260166024820152751cd958dc995d081a5cc81b9bdd081c995d99585b195960521b604482015290519081900360640190fd5b60006123866001611a7b610ecb565b905061030981146123a057612399612d3f565b91506124b1565b6040805163d1637b6960e01b81526004810191825283516044820152835173e0d1498d5f184412dcde12bdcba210cdf2d3d8979263d1637b6992869282916024810191606490910190602086019080838360005b8381101561240c5781810151838201526020016123f4565b50505050905090810190601f1680156124395780820380516001836020036101000a031916815260200191505b508381038252600e8152602001806d3f3f3f3f3f3f3f3f3f3f3f3f3f3f60901b815250602001935050505060206040518083038186803b15801561247c57600080fd5b505af4158015612490573d6000803e3d6000fd5b505050506040513d60208110156124a657600080fd5b50516124b157600080fd5b6124c26124bc611c6c565b8261435c565b81600b6001830361030981106124d457fe5b019080519060200190610ec6929190614be9565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61251e612855565b6001600160a01b031661252f611c6c565b6001600160a01b031614612578576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b6103195460ff16151560011480156125935750610315544310155b61259c57600080fd5b61031654816040516020018082805190602001908083835b602083106125d35780518252601f1990920191602091820191016125b4565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201461264f576040805162461bcd60e51b815260206004820152600c60248201526b1ddc9bdb99c81cd958dc995d60a21b604482015290519081900360640190fd5b8061031554406040516020018083805190602001908083835b602083106126875780518252601f199092019160209182019101612668565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190528251920191909120610317555050610319805460ff191690557f9f340b06bf05a42c9d9ba693f4735e7690eebbf0727a5b0e2bf8225562493adb336126f8610ecb565b6103185461031754604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190a150565b61273a612855565b6001600160a01b031661274b611c6c565b6001600160a01b031614612794576040805162461bcd60e51b81526020600482018190526024820152600080516020614e2e833981519152604482015290519081900360640190fd5b6001600160a01b0381166127d95760405162461bcd60e51b8152600401808060200182810382526026815260200180614cdf6026913960400191505060405180910390fd5b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b8051611c52906009906020840190614be9565b600061103d60028361448a565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061288e8261179f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061103d82614496565b60006128dd82612848565b6129185760405162461bcd60e51b815260040180806020018281038252602c815260200180614d29602c913960400191505060405180910390fd5b60006129238361179f565b9050806001600160a01b0316846001600160a01b0316148061295e5750836001600160a01b031661295384610d8e565b6001600160a01b0316145b8061296e575061296e81856124e8565b949350505050565b826001600160a01b03166129898261179f565b6001600160a01b0316146129ce5760405162461bcd60e51b8152600401808060200182810382526029815260200180614e4e6029913960400191505060405180910390fd5b6001600160a01b038216612a135760405162461bcd60e51b8152600401808060200182810382526024815260200180614d056024913960400191505060405180910390fd5b612a1e838383610ec6565b612a29600082612859565b6001600160a01b0383166000908152600160205260409020612a4b908261449a565b506001600160a01b0382166000908152600160205260409020612a6e90826144a6565b50612a7b600282846144b2565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061103a83836144c8565b6000808080612add868661452c565b9097909650945050505050565b60008060005b604080516020808201889052818301849052825180830384018152606090920190925280519101209150600101612b29600019856145a7565b19821015612af057612b3b82856145a7565b95945050505050565b6000612b5184848461460e565b90505b9392505050565b600082821115612bb2576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561103a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b612c1d848484612976565b612c29848484846146d8565b611e395760405162461bcd60e51b8152600401808060200182810382526032815260200180614cad6032913960400191505060405180910390fd5b606081612c8957506040805180820190915260018152600360fc1b6020820152610cf3565b8160005b8115612ca157600101600a82049150612c8d565b60008167ffffffffffffffff81118015612cba57600080fd5b506040519080825280601f01601f191660200182016040528015612ce5576020820181803683370190505b50859350905060001982015b8315612d3657600a840660300160f81b82828060019003935081518110612d1457fe5b60200101906001600160f81b031916908160001a905350600a84049350612cf1565b50949350505050565b6040805160098082526101408201909252606091600091906020820161012080368337019050509050600081600081518110612d7757fe5b602002602001018181525050600781600181518110612d9257fe5b602002602001018181525050601681600281518110612dad57fe5b602002602001018181525050602381600381518110612dc857fe5b602002602001018181525050602e81600481518110612de357fe5b602002602001018181525050603d81600581518110612dfe57fe5b602002602001018181525050604981600681518110612e1957fe5b602002602001018181525050605c81600781518110612e3457fe5b602002602001018181525050606481600881518110612e4f57fe5b60209081029190910101526040805160168082526102e08201909252600091816020016020820280368337019050509050600081600081518110612e8f57fe5b602002602001018181525050600081600181518110612eaa57fe5b602002602001018181525050601181600281518110612ec557fe5b602002602001018181525050601881600381518110612ee057fe5b602002602001018181525050605481600481518110612efb57fe5b602002602001018181525050609081600581518110612f1657fe5b60200260200101818152505060cc81600681518110612f3157fe5b60200260200101818152505061010881600781518110612f4d57fe5b60200260200101818152505061010f81600881518110612f6957fe5b60200260200101818152505061012081600981518110612f8557fe5b60200260200101818152505061015c81600a81518110612fa157fe5b60200260200101818152505061019881600b81518110612fbd57fe5b6020026020010181815250506101d481600c81518110612fd957fe5b60200260200101818152505061021081600d81518110612ff557fe5b60200260200101818152505061024c81600e8151811061301157fe5b60200260200101818152505061028881600f8151811061302d57fe5b6020026020010181815250506102c48160108151811061304957fe5b6020026020010181815250506103008160118151811061306557fe5b60200260200101818152505061033a8160128151811061308157fe5b6020026020010181815250506103748160138151811061309d57fe5b6020026020010181815250506103ae816014815181106130b957fe5b6020026020010181815250506103e8816015815181106130d557fe5b6020908102919091010152604080516008808252610120820190925260009181602001602082028036833701905050905060008160008151811061311557fe5b60200260200101818152505060468160018151811061313057fe5b602002602001018181525050607f8160028151811061314b57fe5b60200260200101818152505061018d8160038151811061316757fe5b6020026020010181815250506102418160048151811061318357fe5b6020026020010181815250506102d38160058151811061319f57fe5b602002602001018181525050610369816006815181106131bb57fe5b6020026020010181815250506103e8816007815181106131d757fe5b602090810291909101015260408051600a808252610160820190925260009181602001602082028036833701905050905060008160008151811061321757fe5b60200260200101818152505060078160018151811061323257fe5b60200260200101818152505060118160028151811061324d57fe5b60200260200101818152505060178160038151811061326857fe5b60200260200101818152505060268160048151811061328357fe5b60200260200101818152505060308160058151811061329e57fe5b602002602001018181525050603a816006815181106132b957fe5b6020026020010181815250506042816007815181106132d457fe5b6020026020010181815250506050816008815181106132ef57fe5b60200260200101818152505060648160098151811061330a57fe5b6020908102919091010152604080516008808252610120820190925260009181602001602082028036833701905050905060008160008151811061334a57fe5b60200260200101818152505060078160018151811061336557fe5b60200260200101818152505060138160028151811061338057fe5b60200260200101818152505060238160038151811061339b57fe5b6020026020010181815250506033816004815181106133b657fe5b602002602001018181525050603c816005815181106133d157fe5b6020026020010181815250506055816006815181106133ec57fe5b60200260200101818152505060648160078151811061340757fe5b6020908102919091010152604080516008808252610120820190925260009181602001602082028036833701905050905060008160008151811061344757fe5b60200260200101818152505060078160018151811061346257fe5b60200260200101818152505060178160028151811061347d57fe5b602002602001018181525050602b8160038151811061349857fe5b6020026020010181815250506033816004815181106134b357fe5b6020026020010181815250506037816005815181106134ce57fe5b6020026020010181815250506050816006815181106134e957fe5b60200260200101818152505060648160078151811061350457fe5b602090810291909101015260408051601a808252610360820190925260009181602001602082028036833701905050905060008160008151811061354457fe5b60200260200101818152505060008160018151811061355f57fe5b60200260200101818152505060648160028151811061357a57fe5b60200260200101818152505060c88160038151811061359557fe5b60200260200101818152505060dc816004815181106135b057fe5b60200260200101818152505060e6816005815181106135cb57fe5b60200260200101818152505060fa816006815181106135e657fe5b60200260200101818152505060ff8160078151811061360157fe5b6020026020010181815250506101638160088151811061361d57fe5b6020026020010181815250506101c78160098151811061363957fe5b60200260200101818152505061022b81600a8151811061365557fe5b60200260200101818152505061028f81600b8151811061367157fe5b60200260200101818152505061029e81600c8151811061368d57fe5b6020026020010181815250506102b281600d815181106136a957fe5b6020026020010181815250506102b781600e815181106136c557fe5b6020026020010181815250506102cb81600f815181106136e157fe5b60200260200101818152505061032f816010815181106136fd57fe5b6020026020010181815250506103938160118151811061371957fe5b6020026020010181815250506103988160128151811061373557fe5b6020026020010181815250506103a78160138151811061375157fe5b6020026020010181815250506103b68160148151811061376d57fe5b6020026020010181815250506103c58160158151811061378957fe5b6020026020010181815250506103cf816016815181106137a557fe5b6020026020010181815250506103d4816017815181106137c157fe5b6020026020010181815250506103de816018815181106137dd57fe5b6020026020010181815250506103e8816019815181106137f957fe5b60200260200101818152505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff60016138528a61384d613830614840565b8d60018f51038151811061384057fe5b6020026020010151612aea565b61484f565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561388757600080fd5b505af415801561389b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156138c457600080fd5b8101908080516040519392919084600160201b8211156138e357600080fd5b9083019060208201858111156138f857600080fd5b8251600160201b81118282018810171561391157600080fd5b82525081516020918201929091019080838360005b8381101561393e578181015183820152602001613926565b50505050905090810190601f16801561396b5780820380516001836020036101000a031916815260200191505b5060405250505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff600161399d8a61384d613830614840565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b1580156139d257600080fd5b505af41580156139e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613a0f57600080fd5b8101908080516040519392919084600160201b821115613a2e57600080fd5b908301906020820185811115613a4357600080fd5b8251600160201b811182820188101715613a5c57600080fd5b82525081516020918201929091019080838360005b83811015613a89578181015183820152602001613a71565b50505050905090810190601f168015613ab65780820380516001836020036101000a031916815260200191505b5060405250505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff6001613ae88a61384d613830614840565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015613b1d57600080fd5b505af4158015613b31573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613b5a57600080fd5b8101908080516040519392919084600160201b821115613b7957600080fd5b908301906020820185811115613b8e57600080fd5b8251600160201b811182820188101715613ba757600080fd5b82525081516020918201929091019080838360005b83811015613bd4578181015183820152602001613bbc565b50505050905090810190601f168015613c015780820380516001836020036101000a031916815260200191505b5060405250505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff6001613c338a61384d613830614840565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015613c6857600080fd5b505af4158015613c7c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613ca557600080fd5b8101908080516040519392919084600160201b821115613cc457600080fd5b908301906020820185811115613cd957600080fd5b8251600160201b811182820188101715613cf257600080fd5b82525081516020918201929091019080838360005b83811015613d1f578181015183820152602001613d07565b50505050905090810190601f168015613d4c5780820380516001836020036101000a031916815260200191505b5060405250505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff6001613d7e8a61384d613830614840565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015613db357600080fd5b505af4158015613dc7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613df057600080fd5b8101908080516040519392919084600160201b821115613e0f57600080fd5b908301906020820185811115613e2457600080fd5b8251600160201b811182820188101715613e3d57600080fd5b82525081516020918201929091019080838360005b83811015613e6a578181015183820152602001613e52565b50505050905090810190601f168015613e975780820380516001836020036101000a031916815260200191505b5060405250505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff6001613ec98a61384d613830614840565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015613efe57600080fd5b505af4158015613f12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613f3b57600080fd5b8101908080516040519392919084600160201b821115613f5a57600080fd5b908301906020820185811115613f6f57600080fd5b8251600160201b811182820188101715613f8857600080fd5b82525081516020918201929091019080838360005b83811015613fb5578181015183820152602001613f9d565b50505050905090810190601f168015613fe25780820380516001836020036101000a031916815260200191505b5060405250505073e0d1498d5f184412dcde12bdcba210cdf2d3d89763524933ff60016140148a61384d613830614840565b036040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561404957600080fd5b505af415801561405d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561408657600080fd5b8101908080516040519392919084600160201b8211156140a557600080fd5b9083019060208201858111156140ba57600080fd5b8251600160201b8111828201881017156140d357600080fd5b82525081516020918201929091019080838360005b838110156141005781810151838201526020016140e8565b50505050905090810190601f16801561412d5780820380516001836020036101000a031916815260200191505b506040525050506040516020018088805190602001908083835b602083106141665780518252601f199092019160209182019101614147565b51815160209384036101000a60001901801990921691161790528a5191909301928a0191508083835b602083106141ae5780518252601f19909201916020918201910161418f565b51815160209384036101000a600019018019909216911617905289519190930192890191508083835b602083106141f65780518252601f1990920191602091820191016141d7565b51815160209384036101000a600019018019909216911617905288519190930192880191508083835b6020831061423e5780518252601f19909201916020918201910161421f565b51815160209384036101000a600019018019909216911617905287519190930192870191508083835b602083106142865780518252601f199092019160209182019101614267565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b602083106142ce5780518252601f1990920191602091820191016142af565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106143165780518252601f1990920191602091820191016142f7565b6001836020036101000a03801982511681845116808217855250505050505090500197505050505050505060405160208183030381529060405297505050505050505090565b6001600160a01b0382166143b7576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6143c081612848565b15614412576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b61441e60008383610ec6565b6001600160a01b038216600090815260016020526040902061444090826144a6565b5061444d600282846144b2565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600061103a8383614899565b5490565b600061103a83836148b1565b600061103a8383614977565b6000612b5184846001600160a01b0385166149c1565b8154600090821061450a5760405162461bcd60e51b8152600401808060200182810382526022815260200180614c8b6022913960400191505060405180910390fd5b82600001828154811061451957fe5b9060005260206000200154905092915050565b8154600090819083106145705760405162461bcd60e51b8152600401808060200182810382526022815260200180614de06022913960400191505060405180910390fd5b600084600001848154811061458157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008082116145fd576040805162461bcd60e51b815260206004820152601860248201527f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000604482015290519081900360640190fd5b81838161460657fe5b069392505050565b600082815260018401602052604081205482816146a95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561466e578181015183820152602001614656565b50505050905090810190601f16801561469b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508460000160018203815481106146bc57fe5b9060005260206000209060020201600101549150509392505050565b60006146ec846001600160a01b0316614a58565b6146f85750600161296e565b6000614806630a85bd0160e11b61470d612855565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561477457818101518382015260200161475c565b50505050905090810190601f1680156147a15780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001614cad603291396001600160a01b0388169190614a5e565b9050600081806020019051602081101561481f57600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b61031780546001019081905590565b600080600080855190505b80821015612d36576002828203048201925085838151811061487857fe5b6020026020010151851061489157826001019150614894565b50815b61485a565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561496d57835460001980830191908101906000908790839081106148e457fe5b906000526020600020015490508087600001848154811061490157fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061493157fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061103d565b600091505061103d565b60006149838383614899565b6149b95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561103d565b50600061103d565b600082815260018401602052604081205480614a26575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055612b54565b82856000016001830381548110614a3957fe5b9060005260206000209060020201600101819055506000915050612b54565b3b151590565b6060612b51848460008585614a7285614a58565b614ac3576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310614b015780518252601f199092019160209182019101614ae2565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614b63576040519150601f19603f3d011682016040523d82523d6000602084013e614b68565b606091505b5091509150614b78828286614b83565b979650505050505050565b60608315614b92575081612b54565b825115614ba25782518084602001fd5b60405162461bcd60e51b815260206004820181815284516024840152845185939192839260440191908501908083836000831561466e578181015183820152602001614656565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282614c1f5760008555614c65565b82601f10614c3857805160ff1916838001178555614c65565b82800160010185558215614c65579182015b82811115614c65578251825591602001919060010190614c4a565b50614c71929150614c75565b5090565b5b80821115614c715760008155600101614c7656fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220382f2d42756276d8db6dcc9892f5ac7ec89cba0cf6983c2abd9c65789764d2ce64736f6c63430007060033
Deployed Bytecode Sourcemap
138:13694:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;965:148:3;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;965:148:3;-1:-1:-1;;;;;;965:148:3;;:::i;:::-;;;;;;;;;;;;;;;;;;4440:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7145:217;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7145:217:4;;:::i;:::-;;;;-1:-1:-1;;;;;7145:217:4;;;;;;;;;;;;;;6689:395;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6689:395:4;;;;;;;;:::i;:::-;;6183:208;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8009:300;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8009:300:4;;;;;;;;;;;;;;;;;:::i;10986:281:2:-;;;;;;;;;;;;;:::i;5952:160:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5952:160:4;;;;;;;;:::i;2360:440:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2360:440:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2360:440:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2360:440:2;;-1:-1:-1;2360:440:2;;-1:-1:-1;;;;;2360:440:2:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8375:149:4;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8375:149:4;;;;;;;;;;;;;;;;;:::i;6463:169::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6463:169:4;;:::i;12697:707:2:-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12697:707:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12697:707:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12697:707:2;;;;;;;;-1:-1:-1;12697:707:2;;-1:-1:-1;;;;;12697:707:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12697:707:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12697:707:2;;-1:-1:-1;12697:707:2;;-1:-1:-1;;;;;12697:707:2:i;2182:174::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2182:174:2;;:::i;4203:175:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4203:175:4;;:::i;5778:95::-;;;;;;;;;;;;;:::i;3928:218::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3928:218:4;-1:-1:-1;;;;;3928:218:4;;:::i;1710:145:12:-;;;;;;;;;;;;;:::i;11921:638:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11921:638:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11921:638:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11921:638:2;;-1:-1:-1;11921:638:2;;-1:-1:-1;;;;;11921:638:2:i;1930:224::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1930:224:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1930:224:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1930:224:2;;-1:-1:-1;1930:224:2;;-1:-1:-1;;;;;1930:224:2:i;12563:124::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12563:124:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12563:124:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12563:124:2;;-1:-1:-1;12563:124:2;;-1:-1:-1;;;;;12563:124:2:i;1078:85:12:-;;;;;;;;;;;;;:::i;4602:102:4:-;;;;;;;;;;;;;:::i;7429:290::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7429:290:4;;;;;;;;;;:::i;8590:282::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8590:282:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8590:282:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8590:282:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8590:282:4;;-1:-1:-1;8590:282:4;;-1:-1:-1;;;;;8590:282:4:i;452:31:2:-;;;;;;;;;;;;;:::i;4770:776:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4770:776:4;;:::i;10230:323:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10230:323:2;;;;;;;:::i;260:36::-;;;;;;;;;;;;;:::i;1349:571::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1349:571:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1349:571:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1349:571:2;;-1:-1:-1;1349:571:2;;-1:-1:-1;;;;;1349:571:2:i;7785:162:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7785:162:4;;;;;;;;;;:::i;10563:417:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10563:417:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10563:417:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10563:417:2;;-1:-1:-1;10563:417:2;;-1:-1:-1;;;;;10563:417:2:i;2004:240:12:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2004:240:12;-1:-1:-1;;;;;2004:240:12;;:::i;965:148:3:-;-1:-1:-1;;;;;;1073:33:3;;1050:4;1073:33;;;;;;;;;;;;;965:148;;;;:::o;4440:98:4:-;4526:5;4519:12;;;;;;;;-1:-1:-1;;4519:12:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4494:13;;4519:12;;4526:5;;4519:12;;4526:5;4519:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4440:98;:::o;7145:217::-;7221:7;7248:16;7256:7;7248;:16::i;:::-;7240:73;;;;-1:-1:-1;;;7240:73:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7331:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;7331:24:4;;7145:217::o;6689:395::-;6769:13;6785:23;6800:7;6785:14;:23::i;:::-;6769:39;;6832:5;-1:-1:-1;;;;;6826:11:4;:2;-1:-1:-1;;;;;6826:11:4;;;6818:57;;;;-1:-1:-1;;;6818:57:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6910:5;-1:-1:-1;;;;;6894:21:4;:12;:10;:12::i;:::-;-1:-1:-1;;;;;6894:21:4;;:69;;;;6919:44;6943:5;6950:12;:10;:12::i;:::-;6919:23;:44::i;:::-;6886:159;;;;-1:-1:-1;;;6886:159:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7056:21;7065:2;7069:7;7056:8;:21::i;:::-;6689:395;;;:::o;6183:208::-;6244:7;6363:21;:12;:19;:21::i;:::-;6356:28;;6183:208;:::o;8009:300::-;8168:41;8187:12;:10;:12::i;:::-;8201:7;8168:18;:41::i;:::-;8160:103;;;;-1:-1:-1;;;8160:103:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8274:28;8284:4;8290:2;8294:7;8274:9;:28::i;10986:281:2:-;1301:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:12;;1282:68;;;;;-1:-1:-1;;;1282:68:12;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:12;;;;;;;;;;;;;;;11085:12:2::1;::::0;::::1;;:20;;:12:::0;:20:::1;11077:29;;;::::0;::::1;;11146:48;11156:10;11168:13;:11;:13::i;:::-;11183:10;::::0;11146:48:::1;::::0;;-1:-1:-1;;;;;11146:48:2;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;::::1;11217:13;:11;:13::i;:::-;11204:10;:26:::0;11240:12:::1;:20:::0;;-1:-1:-1;;11240:20:2::1;::::0;;10986:281::o;5952:160:4:-;-1:-1:-1;;;;;6075:20:4;;6049:7;6075:20;;;:13;:20;;;;;:30;;6099:5;6075:23;:30::i;:::-;6068:37;;5952:160;;;;;:::o;2360:440:2:-;2439:13;2454:4;2468:26;2508:13;:11;:13::i;:::-;2497:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2497:25:2;;2468:54;;2529:23;2567:6;2563:186;2578:13;:11;:13::i;:::-;2576:1;:15;2563:186;;;2616:21;2638:1;2616:24;;;;;;;;:33;;;;;;;;;;;;;-1:-1:-1;;2616:33:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;:33;;:24;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2616:45:2;;;-1:-1:-1;;;2616:45:2;;;;;;;;;;;;;;;;:33;;;;-1:-1:-1;2616:33:2;-1:-1:-1;2650:10:2;;-1:-1:-1;2616:45:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2616:45:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2616:45:2;2613:129;;;2727:1;2729;2727:3;2690:12;2703:20;;;;;;2690:34;;;;;;;;;;;;;:40;;;;;2613:129;2592:3;;2563:186;;;-1:-1:-1;2763:12:2;;-1:-1:-1;2777:18:2;-1:-1:-1;2360:440:2;;;:::o;8375:149:4:-;8478:39;8495:4;8501:2;8505:7;8478:39;;;;;;;;;;;;:16;:39::i;6463:169::-;6538:7;;6579:22;:12;6595:5;6579:15;:22::i;:::-;-1:-1:-1;6557:44:4;6463:169;-1:-1:-1;;;6463:169:4:o;12697:707:2:-;12804:9;12796:43;;;;;-1:-1:-1;;;12796:43:2;;;;;;;;;;;;-1:-1:-1;;;12796:43:2;;;;;;;;;;;;;;;12857:37;;;-1:-1:-1;;;12857:37:2;;;;;;;;;;;;;;;;:19;;;;:10;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12857:37:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12857:37:2;12849:67;;;;;-1:-1:-1;;;12849:67:2;;;;;;;;;;;;-1:-1:-1;;;12849:67:2;;;;;;;;;;;;;;;12927:26;12955:23;12982:35;13006:10;12982:23;:35::i;:::-;12926:91;;;;13032:18;13054:1;13032:23;;13024:51;;;;;-1:-1:-1;;;13024:51:2;;;;;;;;;;;;-1:-1:-1;;;13024:51:2;;;;;;;;;;;;;;;13082:11;13096:12;13109:104;13152:8;13187:1;13172:12;:16;13162:27;13135:55;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13135:55:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13135:55:2;;;;;;;;;;;;;;;;-1:-1:-1;13135:55:2;;;;;;;;;;;;;13125:66;;;;;;;;;-1:-1:-1;13194:18:2;;-1:-1:-1;13109:10:2;:104::i;:::-;13096:118;;;;;;;;;;;;;;13082:132;;13221:19;13243:15;13251:6;13243:7;:15::i;:::-;13265:40;;13221:37;;-1:-1:-1;;;;;;13265:29:2;;;13295:9;13265:40;;;;;;;;;13295:9;13265:29;:40;;;;;;;;;;;;;;;;;;;;;13393:6;13335:10;-1:-1:-1;;;;;13317:83:2;;13347:11;13360:9;13371:10;13383:8;13317:83;;;;-1:-1:-1;;;;;13317:83:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13317:83:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12697:707;;;;;;:::o;2182:174::-;2239:13;2279:1;2268:7;:12;;:40;;;;;2295:13;:11;:13::i;:::-;2284:7;:24;;2268:40;2260:49;;;;;;2320:21;2350:1;2342:7;:9;2320:32;;;;;;;;2313:39;;;;;;;;;;;;;-1:-1:-1;;2313:39:2;;;;;;;;;;;;;;;;;;;;;;;;;;;2320:32;2313:39;;2320:32;2313:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2182:174;;;:::o;4203:175:4:-;4275:7;4301:70;4318:7;4301:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;5778:95::-;5858:8;5851:15;;;;;;;;-1:-1:-1;;5851:15:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5826:13;;5851:15;;5858:8;;5851:15;;5858:8;5851:15;;;;;;;;;;;;;;;;;;;;;;;;3928:218;4000:7;-1:-1:-1;;;;;4027:19:4;;4019:74;;;;-1:-1:-1;;;4019:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4110:20:4;;;;;;:13;:20;;;;;:29;;:27;:29::i;1710:145:12:-;1301:12;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:12;;1282:68;;;;;-1:-1:-1;;;1282:68:12;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:12;;;;;;;;;;;;;;;1800:6:::1;::::0;1779:40:::1;::::0;1816:1:::1;::::0;-1:-1:-1;;;;;1800:6:12::1;::::0;1779:40:::1;::::0;1816:1;;1779:40:::1;1829:6;:19:::0;;-1:-1:-1;;;;;;1829:19:12::1;::::0;;1710:145::o;11921:638:2:-;12039:9;12031:43;;;;;-1:-1:-1;;;12031:43:2;;;;;;;;;;;;-1:-1:-1;;;12031:43:2;;;;;;;;;;;;;;;12105:1;12089:12;:17;;:49;;;;;12125:13;:11;:13::i;:::-;12110:11;:28;;12089:49;:86;;;;-1:-1:-1;12174:1:2;12142:29;:11;12158:12;12142:15;:29::i;:::-;:33;12089:86;12081:116;;;;;-1:-1:-1;;;12081:116:2;;;;;;;;;;;;-1:-1:-1;;;12081:116:2;;;;;;;;;;;;;;;12204:11;12218:140;12235:122;12278:8;12313:1;12298:12;:16;12288:27;12261:55;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12261:55:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12261:55:2;;;;;;;;;;;;;;;;-1:-1:-1;12261:55:2;;;;;;;;;;;;;12251:66;;;;;;;;;-1:-1:-1;12320:36:2;;-1:-1:-1;12261:55:2;12320:29;:11;12336:12;12320:15;:29::i;:::-;:33;;:36::i;:::-;12235:10;:122::i;:::-;12218:12;;:16;:140::i;:::-;12204:154;;12365:19;12387:15;12395:6;12387:7;:15::i;:::-;12409:40;;12365:37;;-1:-1:-1;;;;;;12409:29:2;;;12439:9;12409:40;;;;;;;;;12439:9;12409:29;:40;;;;;;;;;;;;;;;;;;;;;12548:6;12475:10;-1:-1:-1;;;;;12461:94:2;;12487:11;12500:9;12511:12;12525:11;12538:8;12461:94;;;;-1:-1:-1;;;;;12461:94:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11921:638;;;;;:::o;1930:224::-;1301:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:12;;1282:68;;;;;-1:-1:-1;;;1282:68:12;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:12;;;;;;;;;;;;;;;2062:12:2::1;2056:26:::0;::::1;-1:-1:-1::0;;2056:26:2::1;;::::0;::::1;;;::::0;;;::::1;;:31:::0;:61;::::1;;;;293:3;2091:13;:11;:13::i;:::-;:26;2056:61;2048:70;;;::::0;::::1;;2128:19:::0;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1930:224:::0;:::o;12563:124::-;12639:44;12656:1;12659:13;:11;:13::i;:::-;12674:8;12639:16;:44::i;:::-;12563:124;:::o;1078:85:12:-;1150:6;;-1:-1:-1;;;;;1150:6:12;1078:85;:::o;4602:102:4:-;4690:7;4683:14;;;;;;;;-1:-1:-1;;4683:14:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4658:13;;4683:14;;4690:7;;4683:14;;4690:7;4683:14;;;;;;;;;;;;;;;;;;;;;;;;7429:290;7543:12;:10;:12::i;:::-;-1:-1:-1;;;;;7531:24:4;:8;-1:-1:-1;;;;;7531:24:4;;;7523:62;;;;;-1:-1:-1;;;7523:62:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;7641:8;7596:18;:32;7615:12;:10;:12::i;:::-;-1:-1:-1;;;;;7596:32:4;;;;;;;;;;;;;;;;;-1:-1:-1;7596:32:4;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;7596:53:4;;;;;;;;;;;7679:12;:10;:12::i;:::-;-1:-1:-1;;;;;7664:48:4;;7703:8;7664:48;;;;;;;;;;;;;;;;;;;;7429:290;;:::o;8590:282::-;8721:41;8740:12;:10;:12::i;:::-;8754:7;8721:18;:41::i;:::-;8713:103;;;;-1:-1:-1;;;8713:103:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8826:39;8840:4;8846:2;8850:7;8859:5;8826:13;:39::i;:::-;8590:282;;;;:::o;452:31:2:-;;;;;;;;;;;;;;;-1:-1:-1;;452:31:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4770:776:4:-;4843:13;4876:16;4884:7;4876;:16::i;:::-;4868:76;;;;-1:-1:-1;;;4868:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4955:23;4981:19;;;:10;:19;;;;;;;;4955:45;;;;;;;;;;;-1:-1:-1;;4955:45:4;;;;;;;;;;;;;;;;;;;;;;;;;;;4981:19;;4955:45;;;4981:19;4955:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5010:18;5031:9;:7;:9::i;:::-;5010:30;;5119:4;5113:18;5135:1;5113:23;5109:70;;;-1:-1:-1;5159:9:4;-1:-1:-1;5152:16:4;;5109:70;5281:23;;:27;5277:106;;5355:4;5361:9;5338:33;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5338:33:4;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5338:33:4;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5338:33:4;;;;;;;;;;;;;-1:-1:-1;;5338:33:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5324:48;;;;;;5277:106;5513:4;5519:18;:7;:16;:18::i;:::-;5496:42;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5496:42:4;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5496:42:4;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5496:42:4;;;;;;;;;;;;;-1:-1:-1;;5496:42:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5482:57;;;;4770:776;;;:::o;10230:323:2:-;1301:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:12;;1282:68;;;;;-1:-1:-1;;;1282:68:12;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:12;;;;;;;;;;;;;;;10326:12:2::1;::::0;::::1;;:21;::::0;::::1;:52;;;10365:13;:11;:13::i;:::-;10351:10;;:27;10326:52;:65;;;;;10390:1;10382:5;:9;10326:65;10318:74;;;::::0;::::1;;10402:10;:24:::0;;;10449::::1;10459:13;:11;:13::i;:::-;10449:5:::0;;:9:::1;:24::i;:::-;10436:10;:37:::0;-1:-1:-1;;10516:1:2::1;10501:12;:16:::0;::::1;10483:15;:34:::0;10527:12:::1;:19:::0;;-1:-1:-1;;10527:19:2::1;::::0;;::::1;::::0;;10230:323::o;260:36::-;293:3;260:36;:::o;1349:571::-;1301:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:12;;1282:68;;;;;-1:-1:-1;;;1282:68:12;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:12;;;;;;;;;;;;;;;293:3:2::1;1426:13;:11;:13::i;:::-;:25;1418:56;;;::::0;;-1:-1:-1;;;1418:56:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;1418:56:2;;;;;;;;;;;;;::::1;;1505:13;:11;:13::i;:::-;1492:10;;:26;1484:55;;;::::0;;-1:-1:-1;;;1484:55:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;1484:55:2;;;;;;;;;;;;;::::1;;1557:12;::::0;::::1;;:21;1549:56;;;::::0;;-1:-1:-1;;;1549:56:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;1549:56:2;;;;;;;;;;;;;::::1;;1618:15;1636:20;1654:1;1636:13;:11;:13::i;:20::-;1618:38;;293:3;1663:10;:23;1660:167;;1708:26;:24;:26::i;:::-;1695:39;;1660:167;;;1784:37;::::0;;-1:-1:-1;;;1784:37:2;;::::1;::::0;::::1;::::0;;;;;;;;;;;:19:::1;::::0;::::1;::::0;:10;;:37;;;;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;1784:37:2::1;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;1784:37:2;1776:46:::1;;;::::0;::::1;;1835:26;1841:7;:5;:7::i;:::-;1850:10;1835:5;:26::i;:::-;1903:10;1865:21;1898:1;1887:10;:12;1865:35;;;;;;;;:48;;;;;;;;;;;;:::i;7785:162:4:-:0;-1:-1:-1;;;;;7905:25:4;;;7882:4;7905:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;7785:162::o;10563:417:2:-;1301:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:12;;1282:68;;;;;-1:-1:-1;;;1282:68:12;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:12;;;;;;;;;;;;;;;10641:12:2::1;::::0;::::1;;:20;;:12:::0;:20:::1;:55:::0;::::1;;;;10681:15;;10665:12;:31;;10641:55;10633:64;;;::::0;::::1;;10754:10;;10742:6;10725:24;;;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;10725:24:2;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10715:35;;;;;;:49;10707:74;;;::::0;;-1:-1:-1;;;10707:74:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10707:74:2;;;;;;;;;;;;;::::1;;10834:6;10852:15;;10842:26;10817:52;;;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;10817:52:2;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;10817:52:2;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;10817:52:2::1;::::0;;;;;;;;;::::1;::::0;;10807:63;;;::::1;::::0;;;;10791:8:::1;:80:::0;-1:-1:-1;;10881:12:2::1;:20:::0;;-1:-1:-1;;10881:20:2::1;::::0;;10916:57:::1;10925:10;10937:13;:11;:13::i;:::-;10952:10;::::0;10964:8:::1;::::0;10916:57:::1;::::0;;-1:-1:-1;;;;;10916:57:2;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;::::1;10563:417:::0;:::o;2004:240:12:-;1301:12;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:12;;1282:68;;;;;-1:-1:-1;;;1282:68:12;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:12;;;;;;;;;;;;;;;-1:-1:-1;;;;;2092:22:12;::::1;2084:73;;;;-1:-1:-1::0;;;2084:73:12::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2193:6;::::0;2172:38:::1;::::0;-1:-1:-1;;;;;2172:38:12;;::::1;::::0;2193:6:::1;::::0;2172:38:::1;::::0;2193:6:::1;::::0;2172:38:::1;2220:6;:17:::0;;-1:-1:-1;;;;;;2220:17:12::1;-1:-1:-1::0;;;;;2220:17:12;;;::::1;::::0;;;::::1;::::0;;2004:240::o;14796:98:4:-;14868:19;;;;:8;;:19;;;;;:::i;10306:125::-;10371:4;10394:30;:12;10416:7;10394:21;:30::i;598:104:1:-;685:10;598:104;:::o;16148:189:4:-;16222:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;16222:29:4;-1:-1:-1;;;;;16222:29:4;;;;;;;;:24;;16275:23;16222:24;16275:14;:23::i;:::-;-1:-1:-1;;;;;16266:46:4;;;;;;;;;;;16148:189;;:::o;7820:121:5:-;7889:7;7915:19;7923:3;7915:7;:19::i;10589:351:4:-;10682:4;10706:16;10714:7;10706;:16::i;:::-;10698:73;;;;-1:-1:-1;;;10698:73:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10781:13;10797:23;10812:7;10797:14;:23::i;:::-;10781:39;;10849:5;-1:-1:-1;;;;;10838:16:4;:7;-1:-1:-1;;;;;10838:16:4;;:51;;;;10882:7;-1:-1:-1;;;;;10858:31:4;:20;10870:7;10858:11;:20::i;:::-;-1:-1:-1;;;;;10858:31:4;;10838:51;:94;;;;10893:39;10917:5;10924:7;10893:23;:39::i;:::-;10830:103;10589:351;-1:-1:-1;;;;10589:351:4:o;13630:584::-;13754:4;-1:-1:-1;;;;;13727:31:4;:23;13742:7;13727:14;:23::i;:::-;-1:-1:-1;;;;;13727:31:4;;13719:85;;;;-1:-1:-1;;;13719:85:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13840:16:4;;13832:65;;;;-1:-1:-1;;;13832:65:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13908:39;13929:4;13935:2;13939:7;13908:20;:39::i;:::-;14009:29;14026:1;14030:7;14009:8;:29::i;:::-;-1:-1:-1;;;;;14049:19:4;;;;;;:13;:19;;;;;:35;;14076:7;14049:26;:35::i;:::-;-1:-1:-1;;;;;;14094:17:4;;;;;;:13;:17;;;;;:30;;14116:7;14094:21;:30::i;:::-;-1:-1:-1;14135:29:4;:12;14152:7;14161:2;14135:16;:29::i;:::-;;14199:7;14195:2;-1:-1:-1;;;;;14180:27:4;14189:4;-1:-1:-1;;;;;14180:27:4;;;;;;;;;;;13630:584;;;:::o;9250:135:6:-;9321:7;9355:22;9359:3;9371:5;9355:3;:22::i;8269:233:5:-;8349:7;;;;8408:22;8412:3;8424:5;8408:3;:22::i;:::-;8377:53;;;;-1:-1:-1;8269:233:5;-1:-1:-1;;;;;8269:233:5:o;11478:331:2:-;11545:4;11566:8;11584:10;11608:163;11654:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11644:43;;;;;;-1:-1:-1;11677:7:2;;11741:26;-1:-1:-1;;11760:6:2;11741:18;:26::i;:::-;11723:45;11716:52;;;11608:163;;11787:15;:3;11795:6;11787:7;:15::i;:::-;11780:22;11478:331;-1:-1:-1;;;;;11478:331:2:o;9522:211:5:-;9629:7;9679:44;9684:3;9704;9710:12;9679:4;:44::i;:::-;9671:53;-1:-1:-1;9522:211:5;;;;;;:::o;3136:155:13:-;3194:7;3226:1;3221;:6;;3213:49;;;;;-1:-1:-1;;;3213:49:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3279:5:13;;;3136:155::o;2690:175::-;2748:7;2779:5;;;2802:6;;;;2794:46;;;;;-1:-1:-1;;;2794:46:13;;;;;;;;;;;;;;;;;;;;;;;;;;;9734:269:4;9847:28;9857:4;9863:2;9867:7;9847:9;:28::i;:::-;9893:48;9916:4;9922:2;9926:7;9935:5;9893:22;:48::i;:::-;9885:111;;;;-1:-1:-1;;;9885:111:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;210:725:14;266:13;483:10;479:51;;-1:-1:-1;509:10:14;;;;;;;;;;;;-1:-1:-1;;;509:10:14;;;;;;479:51;554:5;539:12;593:75;600:9;;593:75;;625:8;;655:2;647:10;;;;593:75;;;677:19;709:6;699:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;699:17:14;-1:-1:-1;769:5:14;;-1:-1:-1;677:39:14;-1:-1:-1;;;742:10:14;;784:114;791:9;;784:114;;859:2;852:4;:9;847:2;:14;834:29;;816:6;823:7;;;;;;;816:15;;;;;;;;;;;:47;-1:-1:-1;;;;;816:47:14;;;;;;;;-1:-1:-1;885:2:14;877:10;;;;784:114;;;-1:-1:-1;921:6:14;210:725;-1:-1:-1;;;;210:725:14:o;2930:7296:2:-;3216:13;;;3227:1;3216:13;;;;;;;;;2983;;3191:22;;3216:13;;;;;;;;;;;-1:-1:-1;3216:13:2;3191:38;;3253:1;3239:8;3248:1;3239:11;;;;;;;;;;;;;:15;;;;;3279:1;3265:8;3274:1;3265:11;;;;;;;;;;;;;:15;;;;;3324:2;3310:8;3319:1;3310:11;;;;;;;;;;;;;:16;;;;;3373:2;3359:8;3368:1;3359:11;;;;;;;;;;;;;:16;;;;;3421:2;3407:8;3416:1;3407:11;;;;;;;;;;;;;:16;;;;;3472:2;3458:8;3467:1;3458:11;;;;;;;;;;;;;:16;;;;;3521:2;3507:8;3516:1;3507:11;;;;;;;;;;;;;:16;;;;;3575:2;3561:8;3570:1;3561:11;;;;;;;;;;;;;:16;;;;;3627:3;3613:8;3622:1;3613:11;;;;;;;;;;;;;;;;;:17;3718:14;;;3729:2;3718:14;;;;;;;;;3673:42;;3718:14;;;;;;;;;;;;-1:-1:-1;3718:14:2;3673:59;;3776:1;3742:28;3771:1;3742:31;;;;;;;;;;;;;:35;;;;;3821:1;3787:28;3816:1;3787:31;;;;;;;;;;;;;:35;;;;;3883:2;3849:28;3878:1;3849:31;;;;;;;;;;;;;:36;;;;;3952:2;3918:28;3947:1;3918:31;;;;;;;;;;;;;:36;;;;;4017:2;3983:28;4012:1;3983:31;;;;;;;;;;;;;:36;;;;;4089:3;4055:28;4084:1;4055:31;;;;;;;;;;;;;:37;;;;;4164:3;4130:28;4159:1;4130:31;;;;;;;;;;;;;:37;;;;;4233:3;4199:28;4228:1;4199:31;;;;;;;;;;;;;:37;;;;;4308:3;4274:28;4303:1;4274:31;;;;;;;;;;;;;:37;;;;;4378:3;4344:28;4373:1;4344:31;;;;;;;;;;;;;:37;;;;;4448:3;4413:28;4442:2;4413:32;;;;;;;;;;;;;:38;;;;;4522:3;4487:28;4516:2;4487:32;;;;;;;;;;;;;:38;;;;;4594:3;4559:28;4588:2;4559:32;;;;;;;;;;;;;:38;;;;;4668:3;4633:28;4662:2;4633:32;;;;;;;;;;;;;:38;;;;;4735:3;4700:28;4729:2;4700:32;;;;;;;;;;;;;:38;;;;;4810:3;4775:28;4804:2;4775:32;;;;;;;;;;;;;:38;;;;;4882:3;4847:28;4876:2;4847:32;;;;;;;;;;;;;:38;;;;;4958:3;4923:28;4952:2;4923:32;;;;;;;;;;;;;:38;;;;;5028:3;4993:28;5022:2;4993:32;;;;;;;;;;;;;:38;;;;;5098:3;5063:28;5092:2;5063:32;;;;;;;;;;;;;:38;;;;;5173:3;5138:28;5167:2;5138:32;;;;;;;;;;;;;:38;;;;;5246:4;5211:28;5240:2;5211:32;;;;;;;;;;;;;;;;;:39;5311:13;;;5322:1;5311:13;;;;;;;;;5290:18;;5311:13;;;;;;;;;;;;-1:-1:-1;5311:13:2;5290:34;;5353:1;5343:4;5348:1;5343:7;;;;;;;;;;;;;:11;;;;;5375:2;5365:4;5370:1;5365:7;;;;;;;;;;;;;:12;;;;;5414:3;5404:4;5409:1;5404:7;;;;;;;;;;;;;:13;;;;;5461:3;5451:4;5456:1;5451:7;;;;;;;;;;;;;:13;;;;;5505:3;5495:4;5500:1;5495:7;;;;;;;;;;;;;:13;;;;;5547:3;5537:4;5542:1;5537:7;;;;;;;;;;;;;:13;;;;;5595:3;5585:4;5590:1;5585:7;;;;;;;;;;;;;:13;;;;;5641:4;5631;5636:1;5631:7;;;;;;;;;;;;;;;;;:14;5726;;;5737:2;5726:14;;;;;;;;;5699:24;;5726:14;;;;;;;;;;;;-1:-1:-1;5726:14:2;5699:41;;5766:1;5750:10;5761:1;5750:13;;;;;;;;;;;;;:17;;;;;5794:1;5778:10;5789:1;5778:13;;;;;;;;;;;;;:17;;;;;5838:2;5822:10;5833:1;5822:13;;;;;;;;;;;;;:18;;;;;5891:2;5875:10;5886:1;5875:13;;;;;;;;;;;;;:18;;;;;5948:2;5932:10;5943:1;5932:13;;;;;;;;;;;;;:18;;;;;6002:2;5986:10;5997:1;5986:13;;;;;;;;;;;;;:18;;;;;6055:2;6039:10;6050:1;6039:13;;;;;;;;;;;;;:18;;;;;6110:2;6094:10;6105:1;6094:13;;;;;;;;;;;;;:18;;;;;6170:2;6154:10;6165:1;6154:13;;;;;;;;;;;;;:18;;;;;6221:3;6205:10;6216:1;6205:13;;;;;;;;;;;;;;;;;:19;6306:13;;;6317:1;6306:13;;;;;;;;;6279:24;;6306:13;;;;;;;;;;;;-1:-1:-1;6306:13:2;6279:40;;6345:1;6329:10;6340:1;6329:13;;;;;;;;;;;;;:17;;;;;6373:1;6357:10;6368:1;6357:13;;;;;;;;;;;;;:17;;;;;6417:2;6401:10;6412:1;6401:13;;;;;;;;;;;;;:18;;;;;6469:2;6453:10;6464:1;6453:13;;;;;;;;;;;;;:18;;;;;6520:2;6504:10;6515:1;6504:13;;;;;;;;;;;;;:18;;;;;6576:2;6560:10;6571:1;6560:13;;;;;;;;;;;;;:18;;;;;6628:2;6612:10;6623:1;6612:13;;;;;;;;;;;;;:18;;;;;6681:3;6665:10;6676:1;6665:13;;;;;;;;;;;;;;;;;:19;6741:13;;;6752:1;6741:13;;;;;;;;;6719:19;;6741:13;;;;;;;;;;;;-1:-1:-1;6741:13:2;6719:35;;6775:1;6764:5;6770:1;6764:8;;;;;;;;;;;;;:12;;;;;6798:1;6787:5;6793:1;6787:8;;;;;;;;;;;;;:12;;;;;6837:2;6826:5;6832:1;6826:8;;;;;;;;;;;;;:13;;;;;6886:2;6875:5;6881:1;6875:8;;;;;;;;;;;;;:13;;;;;6927:2;6916:5;6922:1;6916:8;;;;;;;;;;;;;:13;;;;;6976:2;6965:5;6971:1;6965:8;;;;;;;;;;;;;:13;;;;;7025:2;7014:5;7020:1;7014:8;;;;;;;;;;;;;:13;;;;;7073:3;7062:5;7068:1;7062:8;;;;;;;;;;;;;;;;;:14;7141;;;7152:2;7141:14;;;;;;;;;7114:24;;7141:14;;;;;;;;;;;;-1:-1:-1;7141:14:2;7114:41;;7181:1;7165:10;7176:1;7165:13;;;;;;;;;;;;;:17;;;;;7208:1;7192:10;7203:1;7192:13;;;;;;;;;;;;;:17;;;;;7252:3;7236:10;7247:1;7236:13;;;;;;;;;;;;;:19;;;;;7310:3;7294:10;7305:1;7294:13;;;;;;;;;;;;;:19;;;;;7377:3;7361:10;7372:1;7361:13;;;;;;;;;;;;;:19;;;;;7462:3;7446:10;7457:1;7446:13;;;;;;;;;;;;;:19;;;;;7555:3;7539:10;7550:1;7539:13;;;;;;;;;;;;;:19;;;;;7641:3;7625:10;7636:1;7625:13;;;;;;;;;;;;;:19;;;;;7735:3;7719:10;7730:1;7719:13;;;;;;;;;;;;;:19;;;;;7801:3;7785:10;7796:1;7785:13;;;;;;;;;;;;;:19;;;;;7860:3;7843:10;7854:2;7843:14;;;;;;;;;;;;;:20;;;;;7920:3;7903:10;7914:2;7903:14;;;;;;;;;;;;;:20;;;;;7987:3;7970:10;7981:2;7970:14;;;;;;;;;;;;;:20;;;;;8072:3;8055:10;8066:2;8055:14;;;;;;;;;;;;;:20;;;;;8165:3;8148:10;8159:2;8148:14;;;;;;;;;;;;;:20;;;;;8251:3;8234:10;8245:2;8234:14;;;;;;;;;;;;;:20;;;;;8345:3;8328:10;8339:2;8328:14;;;;;;;;;;;;;:20;;;;;8413:3;8396:10;8407:2;8396:14;;;;;;;;;;;;;:20;;;;;8474:3;8457:10;8468:2;8457:14;;;;;;;;;;;;;:20;;;;;8553:3;8536:10;8547:2;8536:14;;;;;;;;;;;;;:20;;;;;8640:3;8623:10;8634:2;8623:14;;;;;;;;;;;;;:20;;;;;8720:3;8703:10;8714:2;8703:14;;;;;;;;;;;;;:20;;;;;8808:3;8791:10;8802:2;8791:14;;;;;;;;;;;;;:20;;;;;8888:3;8871:10;8882:2;8871:14;;;;;;;;;;;;;:20;;;;;8976:3;8959:10;8970:2;8959:14;;;;;;;;;;;;;:20;;;;;9057:4;9040:10;9051:2;9040:14;;;;;;;;;;;;;:21;;;;;9168:7;:21;9274:1;9190:81;9201:8;9215:55;9226:12;:10;:12::i;:::-;9240:8;9267:1;9249:8;:15;:19;9240:29;;;;;;;;;;;;;;9215:10;:55::i;:::-;9190:10;:81::i;:::-;:85;9168:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9168:108:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9168:108:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9168:108:2;;;;;;-1:-1:-1;9168:108:2;;;;;;;;;;-1:-1:-1;9168:108:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9315:7;:21;9482:1;9337:142;9348:28;9383:95;9394:12;:10;:12::i;9337:142::-;:146;9315:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9315:169:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9315:169:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9315:169:2;;;;;;-1:-1:-1;9315:169:2;;;;;;;;;;-1:-1:-1;9315:169:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9523:7;:21;9616:1;9545:68;9556:4;9565:47;9576:12;:10;:12::i;9545:68::-;:72;9523:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9523:95:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9523:95:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9523:95:2;;;;;;-1:-1:-1;9523:95:2;;;;;;;;;;-1:-1:-1;9523:95:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9657:7;:21;9768:1;9679:86;9690:10;9705:59;9716:12;:10;:12::i;9679:86::-;:90;9657:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9657:113:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9657:113:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9657:113:2;;;;;;-1:-1:-1;9657:113:2;;;;;;;;;;-1:-1:-1;9657:113:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9809:7;:21;9924:1;9831:90;9842:10;9861:59;9872:12;:10;:12::i;9831:90::-;:94;9809:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9809:117:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9809:117:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9809:117:2;;;;;;-1:-1:-1;9809:117:2;;;;;;;;;;-1:-1:-1;9809:117:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9965:7;:21;10061:1;9987:71;9998:5;10008:49;10019:12;:10;:12::i;9987:71::-;:75;9965:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9965:98:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9965:98:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9965:98:2;;;;;;-1:-1:-1;9965:98:2;;;;;;;;;;-1:-1:-1;9965:98:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10102:7;:21;10218:1;10124:91;10135:10;10155:59;10166:12;:10;:12::i;10124:91::-;:95;10102:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10102:118:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10102:118:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10102:118:2;;;;;;-1:-1:-1;10102:118:2;;;;;;;;;;-1:-1:-1;10102:118:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9150:1071;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9150:1071:2;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9150:1071:2;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9150:1071:2;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9150:1071:2;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9150:1071:2;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9150:1071:2;;;;;;;;;;;;;-1:-1:-1;;9150:1071:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9136:1086;;;;;;;;;2930:7296;:::o;12169:393:4:-;-1:-1:-1;;;;;12248:16:4;;12240:61;;;;;-1:-1:-1;;;12240:61:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12320:16;12328:7;12320;:16::i;:::-;12319:17;12311:58;;;;;-1:-1:-1;;;12311:58:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;12380:45;12409:1;12413:2;12417:7;12380:20;:45::i;:::-;-1:-1:-1;;;;;12436:17:4;;;;;;:13;:17;;;;;:30;;12458:7;12436:21;:30::i;:::-;-1:-1:-1;12477:29:4;:12;12494:7;12503:2;12477:16;:29::i;:::-;-1:-1:-1;12522:33:4;;12547:7;;-1:-1:-1;;;;;12522:33:4;;;12539:1;;12522:33;;12539:1;;12522:33;12169:393;;:::o;7588:149:5:-;7672:4;7695:35;7705:3;7725;7695:9;:35::i;4491:108::-;4573:19;;4491:108::o;8365:135:6:-;8435:4;8458:35;8466:3;8486:5;8458:7;:35::i;8068:129::-;8135:4;8158:32;8163:3;8183:5;8158:4;:32::i;7027:183:5:-;7116:4;7139:64;7144:3;7164;-1:-1:-1;;;;;7178:23:5;;7139:4;:64::i;4452:201:6:-;4546:18;;4519:7;;4546:26;-1:-1:-1;4538:73:6;;;;-1:-1:-1;;;4538:73:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4628:3;:11;;4640:5;4628:18;;;;;;;;;;;;;;;;4621:25;;4452:201;;;;:::o;4942:274:5:-;5045:19;;5009:7;;;;5045:27;-1:-1:-1;5037:74:5;;;;-1:-1:-1;;;5037:74:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5122:22;5147:3;:12;;5160:5;5147:19;;;;;;;;;;;;;;;;;;5122:44;;5184:5;:10;;;5196:5;:12;;;5176:33;;;;;4942:274;;;;;:::o;4820:148:13:-;4878:7;4909:1;4905;:5;4897:42;;;;;-1:-1:-1;;;4897:42:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;4960:1;4956;:5;;;;;;;4820:148;-1:-1:-1;;;4820:148:13:o;6403:315:5:-;6497:7;6535:17;;;:12;;;:17;;;;;;6585:12;6570:13;6562:36;;;;-1:-1:-1;;;6562:36:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6651:3;:12;;6675:1;6664:8;:12;6651:26;;;;;;;;;;;;;;;;;;:33;;;6644:40;;;6403:315;;;;;:::o;15447:589:4:-;15567:4;15592:15;:2;-1:-1:-1;;;;;15592:13:4;;:15::i;:::-;15587:58;;-1:-1:-1;15630:4:4;15623:11;;15587:58;15654:23;15680:246;-1:-1:-1;;;15791:12:4;:10;:12::i;:::-;15817:4;15835:7;15856:5;15696:175;;;;;;-1:-1:-1;;;;;15696:175:4;;;;;;-1:-1:-1;;;;;15696:175:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15696:175:4;;;;;;;-1:-1:-1;;;;;15696:175:4;;;;;;;;;;;15680:246;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15680:15:4;;;:246;:15;:246::i;:::-;15654:272;;15936:13;15963:10;15952:32;;;;;;;;;;;;;;;-1:-1:-1;15952:32:4;-1:-1:-1;;;;;;16002:26:4;-1:-1:-1;;;16002:26:4;;-1:-1:-1;;;15447:589:4;;;;;;:::o;11277:162:2:-;11383:8;;;11394:1;11383:12;11372:23;;;;11277:162;:::o;13432:397::-;13505:4;13527:8;13546;13569:9;13581:3;:10;13569:22;;13603:198;13616:4;13610:3;:10;13603:198;;;13673:1;13659:10;;;13658:16;13652:3;:22;13646:28;;13702:3;13706;13702:8;;;;;;;;;;;;;;13693:5;:17;13689:100;;13735:3;13741:1;13735:7;13729:13;;13689:100;;;-1:-1:-1;13786:3:2;13689:100;13603:198;;4278:123:5;4349:4;4372:17;;;:12;;;;;:17;;;;;;:22;;;4278:123::o;2212:1512:6:-;2278:4;2415:19;;;:12;;;:19;;;;;;2449:15;;2445:1273;;2878:18;;-1:-1:-1;;2830:14:6;;;;2878:22;;;;2806:21;;2878:3;;:22;;3160;;;;;;;;;;;;;;3140:42;;3303:9;3274:3;:11;;3286:13;3274:26;;;;;;;;;;;;;;;;;;;:38;;;;3378:23;;;3420:1;3378:12;;;:23;;;;;;3404:17;;;3378:43;;3527:17;;3378:3;;3527:17;;;;;;;;;;;;;;;;;;;;;;3619:3;:12;;:19;3632:5;3619:19;;;;;;;;;;;3612:26;;;3660:4;3653:11;;;;;;;;2445:1273;3702:5;3695:12;;;;;1640:404;1703:4;1724:21;1734:3;1739:5;1724:9;:21::i;:::-;1719:319;;-1:-1:-1;1761:23:6;;;;;;;;:11;:23;;;;;;;;;;;;;1941:18;;1919:19;;;:12;;;:19;;;;;;:40;;;;1973:11;;1719:319;-1:-1:-1;2022:5:6;2015:12;;1836:678:5;1912:4;2045:17;;;:12;;;:17;;;;;;2077:13;2073:435;;-1:-1:-1;;2161:38:5;;;;;;;;;;;;;;;;;;2143:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;2355:19;;2335:17;;;:12;;;:17;;;;;;;:39;2388:11;;2073:435;2466:5;2430:3;:12;;2454:1;2443:8;:12;2430:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;2492:5;2485:12;;;;;726:413:0;1086:20;1124:8;;;726:413::o;3581:193::-;3684:12;3715:52;3737:6;3745:4;3751:1;3754:12;3684;4858:18;4869:6;4858:10;:18::i;:::-;4850:60;;;;;-1:-1:-1;;;4850:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4981:12;4995:23;5022:6;-1:-1:-1;;;;;5022:11:0;5042:5;5050:4;5022:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5022:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4980:75;;;;5072:52;5090:7;5099:10;5111:12;5072:17;:52::i;:::-;5065:59;4608:523;-1:-1:-1;;;;;;;4608:523:0:o;7091:725::-;7206:12;7234:7;7230:580;;;-1:-1:-1;7264:10:0;7257:17;;7230:580;7375:17;;:21;7371:429;;7633:10;7627:17;7693:15;7680:10;7676:2;7672:19;7665:44;7582:145;7765:20;;-1:-1:-1;;;7765:20:0;;;;;;;;;;;;;;;;;7772:12;;7765:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://382f2d42756276d8db6dcc9892f5ac7ec89cba0cf6983c2abd9c65789764d2ce
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.