Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 419 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 20850907 | 39 days ago | IN | 0 ETH | 0.00028952 | ||||
Safe Transfer Fr... | 20850907 | 39 days ago | IN | 0 ETH | 0.00049883 | ||||
Set Approval For... | 19930279 | 168 days ago | IN | 0 ETH | 0.000112 | ||||
Set Approval For... | 19904586 | 171 days ago | IN | 0 ETH | 0.00017733 | ||||
Safe Transfer Fr... | 18616228 | 352 days ago | IN | 0 ETH | 0.00172819 | ||||
Set Approval For... | 17398747 | 523 days ago | IN | 0 ETH | 0.00091834 | ||||
Set Approval For... | 17073784 | 568 days ago | IN | 0 ETH | 0.00248343 | ||||
Set Approval For... | 16974287 | 582 days ago | IN | 0 ETH | 0.00091605 | ||||
Set Approval For... | 16883862 | 595 days ago | IN | 0 ETH | 0.00073773 | ||||
Safe Transfer Fr... | 16733461 | 616 days ago | IN | 0 ETH | 0.00097641 | ||||
Transfer From | 16733343 | 616 days ago | IN | 0 ETH | 0.00203132 | ||||
Transfer From | 16658906 | 627 days ago | IN | 0 ETH | 0.00102703 | ||||
Set Approval For... | 16657246 | 627 days ago | IN | 0 ETH | 0.00122469 | ||||
Set Approval For... | 16644306 | 629 days ago | IN | 0 ETH | 0.00305094 | ||||
Set Approval For... | 16643124 | 629 days ago | IN | 0 ETH | 0.00200085 | ||||
Set Approval For... | 16605428 | 634 days ago | IN | 0 ETH | 0.00082157 | ||||
Safe Transfer Fr... | 16605209 | 634 days ago | IN | 0 ETH | 0.00139544 | ||||
Set Approval For... | 16599162 | 635 days ago | IN | 0 ETH | 0.00109709 | ||||
Safe Transfer Fr... | 16598714 | 635 days ago | IN | 0 ETH | 0.00120654 | ||||
Private Mint | 16597452 | 635 days ago | IN | 0.008 ETH | 0.00084604 | ||||
Private Mint | 16597452 | 635 days ago | IN | 0.008 ETH | 0.00084604 | ||||
Private Mint | 16597452 | 635 days ago | IN | 0.008 ETH | 0.00084604 | ||||
Set Approval For... | 16596611 | 636 days ago | IN | 0 ETH | 0.00085785 | ||||
Safe Transfer Fr... | 16595276 | 636 days ago | IN | 0 ETH | 0.00215143 | ||||
Withdraw | 16592606 | 636 days ago | IN | 0 ETH | 0.00155239 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16592606 | 636 days ago | 3.25 ETH |
Loading...
Loading
Contract Name:
Owls
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-06 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/access/IAccessControlEnumerable.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/access/AccessControlEnumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual 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) } } } // File: contracts/Owls.sol pragma solidity ^0.8.9; contract Owls is ERC721A, Ownable, ReentrancyGuard, AccessControlEnumerable { uint256 public maxTotalSupply = 5555; uint256 public privateMintPrice = 0.008 ether; uint256 public publicMintPrice = 0.009 ether; uint8 private maxTokenPrivate = 2; string public baseExtension = ".json"; string public notRevealedUri; bool public revealed = false; enum SaleState{ CLOSED, WL, PUBLIC } SaleState public saleState = SaleState.CLOSED; bytes32 private merkleRoot; mapping(address => uint256) public mintedPrivatePerAddress; mapping(address => uint256) public mintedPublicPerAddress; string _baseTokenURI; constructor() ERC721A("OwlsOfBushido", "OWLS") { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function privateMint(uint256 amount, bytes32[] calldata proof) public payable { require (saleState == SaleState.WL, "Sale is not opened"); require(mintedPrivatePerAddress[msg.sender] + amount <= maxTokenPrivate, "You can mint a maximum of 2 NFTs"); require(totalSupply() + amount <= maxTotalSupply, "Max supply reached"); require(MerkleProof.verify(proof, merkleRoot, keccak256(abi.encodePacked(msg.sender))), "You are not in the valid whitelist"); require(amount * privateMintPrice <= msg.value, "Provided not enough Ether for purchase"); mintedPrivatePerAddress[msg.sender] += amount; _safeMint(_msgSender(), amount); } function publicSale(uint256 amount) public payable { require (saleState == SaleState.PUBLIC, "Sale state should be public"); require(mintedPublicPerAddress[msg.sender] + amount <= maxTokenPrivate, "You can mint a maximum of 2 NFTs"); require(totalSupply() + amount <= maxTotalSupply, "Max supply reached"); require(amount * publicMintPrice <= msg.value, "Provided not enough Ether for purchase"); mintedPublicPerAddress[msg.sender] += amount; _safeMint(_msgSender(), amount); } function withdraw() public onlyOwner { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot withdraw"); payable(msg.sender).transfer(address(this).balance); } function setSaleState(SaleState newState) public { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot alter sale state"); saleState = newState; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setMerkleRoot(bytes32 _merkleRoot) public { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot set merkle root"); merkleRoot = _merkleRoot; } function setBaseURI(string memory baseURI) public onlyOwner { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot set Base URI"); _baseTokenURI = baseURI; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, AccessControlEnumerable) returns (bool) { return super.supportsInterface(interfaceId); } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot set Base Extension"); baseExtension = _newBaseExtension; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot set Not Reveal URI"); notRevealedUri = _notRevealedURI; } function reveal() public onlyOwner { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot reveal"); revealed = true; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, Strings.toString(_tokenId), baseExtension)) : ""; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPrivatePerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPublicPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"privateMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum Owls.SaleState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Owls.SaleState","name":"newState","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526115b3600c55661c6bf526340000600d55661ff973cafa8000600e556002600f60006101000a81548160ff021916908360ff1602179055506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601090805190602001906200008992919062000550565b506000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff02191690836002811115620000ce57620000cd62000600565b5b0217905550348015620000e057600080fd5b506040518060400160405280600d81526020017f4f776c734f664275736869646f000000000000000000000000000000000000008152506040518060400160405280600481526020017f4f574c530000000000000000000000000000000000000000000000000000000081525081600290805190602001906200016592919062000550565b5080600390805190602001906200017e92919062000550565b506200018f620001e960201b60201c565b6000819055505050620001b7620001ab620001f260201b60201c565b620001fa60201b60201c565b6001600981905550620001e36000801b620001d7620001f260201b60201c565b620002c060201b60201c565b62000694565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002d28282620002d660201b60201c565b5050565b620002ed82826200031e60201b6200209a1760201c565b6200031981600b60008581526020019081526020016000206200041060201b6200217b1790919060201c565b505050565b6200033082826200044860201b60201c565b6200040c576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003b1620001f260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000440836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620004b360201b60201c565b905092915050565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000620004c783836200052d60201b60201c565b6200052257826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000527565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b8280546200055e906200065e565b90600052602060002090601f016020900481019282620005825760008555620005ce565b82601f106200059d57805160ff1916838001178555620005ce565b82800160010185558215620005ce579182015b82811115620005cd578251825591602001919060010190620005b0565b5b509050620005dd9190620005e1565b5090565b5b80821115620005fc576000816000905550600101620005e2565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200067757607f821691505b602082108114156200068e576200068d6200062f565b5b50919050565b614c6280620006a46000396000f3fe60806040526004361061025b5760003560e01c8063715018a611610144578063b88d4fde116100b6578063d547741f1161007a578063d547741f146108bb578063da3ef23f146108e4578063dc53fd921461090d578063e985e9c514610938578063f2c4ce1e14610975578063f2fde38b1461099e5761025b565b8063b88d4fde146107de578063b977fe55146107fa578063c668286214610816578063c87b56dd14610841578063ca15c8731461087e5761025b565b806391d148541161010857806391d14854146106ef57806395d89b411461072c578063a217fddf14610757578063a22cb46514610782578063a475b5dd146107ab578063b287c8ed146107c25761025b565b8063715018a61461060a5780637cb64759146106215780637fb66e221461064a5780638da5cb5b146106875780639010d07c146106b25761025b565b80632ab4d052116101dd57806351830227116101a157806351830227146104e857806355f804b3146105135780635a67de071461053c578063603f4d52146105655780636352211e1461059057806370a08231146105cd5761025b565b80632ab4d052146104385780632f2ff15d1461046357806336568abe1461048c5780633ccfd60b146104b557806342842e0e146104cc5761025b565b8063081c8c4411610224578063081c8c441461036d578063095ea7b31461039857806318160ddd146103b457806323b872dd146103df578063248a9ca3146103fb5761025b565b806204348e1461026057806301ffc9a71461028b578063031a1057146102c857806306fdde0314610305578063081812fc14610330575b600080fd5b34801561026c57600080fd5b506102756109c7565b6040516102829190613504565b60405180910390f35b34801561029757600080fd5b506102b260048036038101906102ad919061358b565b6109cd565b6040516102bf91906135d3565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea919061364c565b6109df565b6040516102fc9190613504565b60405180910390f35b34801561031157600080fd5b5061031a6109f7565b6040516103279190613712565b60405180910390f35b34801561033c57600080fd5b5061035760048036038101906103529190613760565b610a89565b604051610364919061379c565b60405180910390f35b34801561037957600080fd5b50610382610b08565b60405161038f9190613712565b60405180910390f35b6103b260048036038101906103ad91906137b7565b610b96565b005b3480156103c057600080fd5b506103c9610cda565b6040516103d69190613504565b60405180910390f35b6103f960048036038101906103f491906137f7565b610cf1565b005b34801561040757600080fd5b50610422600480360381019061041d9190613880565b611016565b60405161042f91906138bc565b60405180910390f35b34801561044457600080fd5b5061044d611036565b60405161045a9190613504565b60405180910390f35b34801561046f57600080fd5b5061048a600480360381019061048591906138d7565b61103c565b005b34801561049857600080fd5b506104b360048036038101906104ae91906138d7565b61105d565b005b3480156104c157600080fd5b506104ca6110e0565b005b6104e660048036038101906104e191906137f7565b611184565b005b3480156104f457600080fd5b506104fd6111a4565b60405161050a91906135d3565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613a4c565b6111b7565b005b34801561054857600080fd5b50610563600480360381019061055e9190613aba565b61122c565b005b34801561057157600080fd5b5061057a6112ac565b6040516105879190613b5e565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613760565b6112bf565b6040516105c4919061379c565b60405180910390f35b3480156105d957600080fd5b506105f460048036038101906105ef919061364c565b6112d1565b6040516106019190613504565b60405180910390f35b34801561061657600080fd5b5061061f61138a565b005b34801561062d57600080fd5b5061064860048036038101906106439190613880565b61139e565b005b34801561065657600080fd5b50610671600480360381019061066c919061364c565b6113fb565b60405161067e9190613504565b60405180910390f35b34801561069357600080fd5b5061069c611413565b6040516106a9919061379c565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190613b79565b61143d565b6040516106e6919061379c565b60405180910390f35b3480156106fb57600080fd5b50610716600480360381019061071191906138d7565b61146c565b60405161072391906135d3565b60405180910390f35b34801561073857600080fd5b506107416114d7565b60405161074e9190613712565b60405180910390f35b34801561076357600080fd5b5061076c611569565b60405161077991906138bc565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190613be5565b611570565b005b3480156107b757600080fd5b506107c061167b565b005b6107dc60048036038101906107d79190613760565b6116f3565b005b6107f860048036038101906107f39190613cc6565b611918565b005b610814600480360381019061080f9190613da9565b61198b565b005b34801561082257600080fd5b5061082b611c66565b6040516108389190613712565b60405180910390f35b34801561084d57600080fd5b5061086860048036038101906108639190613760565b611cf4565b6040516108759190613712565b60405180910390f35b34801561088a57600080fd5b506108a560048036038101906108a09190613880565b611e4d565b6040516108b29190613504565b60405180910390f35b3480156108c757600080fd5b506108e260048036038101906108dd91906138d7565b611e71565b005b3480156108f057600080fd5b5061090b60048036038101906109069190613a4c565b611e92565b005b34801561091957600080fd5b50610922611f07565b60405161092f9190613504565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190613e09565b611f0d565b60405161096c91906135d3565b60405180910390f35b34801561098157600080fd5b5061099c60048036038101906109979190613a4c565b611fa1565b005b3480156109aa57600080fd5b506109c560048036038101906109c0919061364c565b612016565b005b600d5481565b60006109d8826121ab565b9050919050565b60146020528060005260406000206000915090505481565b606060028054610a0690613e78565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3290613e78565b8015610a7f5780601f10610a5457610100808354040283529160200191610a7f565b820191906000526020600020905b815481529060010190602001808311610a6257829003601f168201915b5050505050905090565b6000610a9482612225565b610aca576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610b1590613e78565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4190613e78565b8015610b8e5780601f10610b6357610100808354040283529160200191610b8e565b820191906000526020600020905b815481529060010190602001808311610b7157829003601f168201915b505050505081565b6000610ba1826112bf565b90508073ffffffffffffffffffffffffffffffffffffffff16610bc2612284565b73ffffffffffffffffffffffffffffffffffffffff1614610c2557610bee81610be9612284565b611f0d565b610c24576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610ce461228c565b6001546000540303905090565b6000610cfc82612295565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d63576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d6f84612363565b91509150610d858187610d80612284565b61238a565b610dd157610d9a86610d95612284565b611f0d565b610dd0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e38576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4586868660016123ce565b8015610e5057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f1e85610efa8888876123d4565b7c0200000000000000000000000000000000000000000000000000000000176123fc565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610fa6576000600185019050600060046000838152602001908152602001600020541415610fa4576000548114610fa3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461100e8686866001612427565b505050505050565b6000600a6000838152602001908152602001600020600101549050919050565b600c5481565b61104582611016565b61104e8161242d565b6110588383612441565b505050565b611065612475565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990613f1c565b60405180910390fd5b6110dc828261247d565b5050565b6110e86124b1565b6110fc6000801b6110f7612475565b61146c565b61113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113290613f88565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611181573d6000803e3d6000fd5b50565b61119f83838360405180602001604052806000815250611918565b505050565b601260009054906101000a900460ff1681565b6111bf6124b1565b6111d36000801b6111ce612475565b61146c565b611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990613ff4565b60405180910390fd5b8060169080519060200190611228929190613448565b5050565b6112406000801b61123b612475565b61146c565b61127f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127690614060565b60405180910390fd5b80601260016101000a81548160ff021916908360028111156112a4576112a3613ae7565b5b021790555050565b601260019054906101000a900460ff1681565b60006112ca82612295565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611339576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6113926124b1565b61139c600061252f565b565b6113b26000801b6113ad612475565b61146c565b6113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e8906140cc565b60405180910390fd5b8060138190555050565b60156020528060005260406000206000915090505481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061146482600b60008681526020019081526020016000206125f590919063ffffffff16565b905092915050565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600380546114e690613e78565b80601f016020809104026020016040519081016040528092919081815260200182805461151290613e78565b801561155f5780601f106115345761010080835404028352916020019161155f565b820191906000526020600020905b81548152906001019060200180831161154257829003601f168201915b5050505050905090565b6000801b81565b806007600061157d612284565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661162a612284565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161166f91906135d3565b60405180910390a35050565b6116836124b1565b6116976000801b611692612475565b61146c565b6116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90614138565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b60028081111561170657611705613ae7565b5b601260019054906101000a900460ff16600281111561172857611727613ae7565b5b14611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f906141a4565b60405180910390fd5b600f60009054906101000a900460ff1660ff1681601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117c691906141f3565b1115611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe90614295565b60405180910390fd5b600c5481611813610cda565b61181d91906141f3565b111561185e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185590614301565b60405180910390fd5b34600e548261186d9190614321565b11156118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a5906143ed565b60405180910390fd5b80601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118fd91906141f3565b9250508190555061191561190f612475565b8261260f565b50565b611923848484610cf1565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119855761194e8484848461262d565b611984576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6001600281111561199f5761199e613ae7565b5b601260019054906101000a900460ff1660028111156119c1576119c0613ae7565b5b14611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890614459565b60405180910390fd5b600f60009054906101000a900460ff1660ff1683601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a5f91906141f3565b1115611aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9790614295565b60405180910390fd5b600c5483611aac610cda565b611ab691906141f3565b1115611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90614301565b60405180910390fd5b611b6b828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060135433604051602001611b5091906144c1565b6040516020818303038152906040528051906020012061278d565b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba19061454e565b60405180910390fd5b34600d5484611bb99190614321565b1115611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf1906143ed565b60405180910390fd5b82601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c4991906141f3565b92505081905550611c61611c5b612475565b8461260f565b505050565b60108054611c7390613e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9f90613e78565b8015611cec5780601f10611cc157610100808354040283529160200191611cec565b820191906000526020600020905b815481529060010190602001808311611ccf57829003601f168201915b505050505081565b6060611cff82612225565b611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d35906145e0565b60405180910390fd5b60001515601260009054906101000a900460ff1615151415611dec5760118054611d6790613e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9390613e78565b8015611de05780601f10611db557610100808354040283529160200191611de0565b820191906000526020600020905b815481529060010190602001808311611dc357829003601f168201915b50505050509050611e48565b6000611df66127a4565b90506000815111611e165760405180602001604052806000815250611e44565b80611e2084612836565b6010604051602001611e34939291906146d0565b6040516020818303038152906040525b9150505b919050565b6000611e6a600b600084815260200190815260200160002061290e565b9050919050565b611e7a82611016565b611e838161242d565b611e8d838361247d565b505050565b611e9a6124b1565b611eae6000801b611ea9612475565b61146c565b611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee49061474d565b60405180910390fd5b8060109080519060200190611f03929190613448565b5050565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fa96124b1565b611fbd6000801b611fb8612475565b61146c565b611ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff3906147b9565b60405180910390fd5b8060119080519060200190612012929190613448565b5050565b61201e6124b1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561208e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120859061484b565b60405180910390fd5b6120978161252f565b50565b6120a4828261146c565b612177576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061211c612475565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006121a3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612923565b905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061221e575061221d82612993565b5b9050919050565b60008161223061228c565b1115801561223f575060005482105b801561227d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806122a461228c565b1161232c5760005481101561232b5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612329575b600081141561231f5760046000836001900393508381526020019081526020016000205490506122f4565b809250505061235e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86123eb868684612a0d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61243e81612439612475565b612a16565b50565b61244b828261209a565b61247081600b600085815260200190815260200160002061217b90919063ffffffff16565b505050565b600033905090565b6124878282612a9b565b6124ac81600b6000858152602001908152602001600020612b7d90919063ffffffff16565b505050565b6124b9612475565b73ffffffffffffffffffffffffffffffffffffffff166124d7611413565b73ffffffffffffffffffffffffffffffffffffffff161461252d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612524906148b7565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006126048360000183612bad565b60001c905092915050565b612629828260405180602001604052806000815250612bd8565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612653612284565b8786866040518563ffffffff1660e01b8152600401612675949392919061492c565b602060405180830381600087803b15801561268f57600080fd5b505af19250505080156126c057506040513d601f19601f820116820180604052508101906126bd919061498d565b60015b61273a573d80600081146126f0576040519150601f19603f3d011682016040523d82523d6000602084013e6126f5565b606091505b50600081511415612732576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008261279a8584612c75565b1490509392505050565b6060601680546127b390613e78565b80601f01602080910402602001604051908101604052809291908181526020018280546127df90613e78565b801561282c5780601f106128015761010080835404028352916020019161282c565b820191906000526020600020905b81548152906001019060200180831161280f57829003601f168201915b5050505050905090565b60606000600161284584612ccb565b01905060008167ffffffffffffffff81111561286457612863613921565b5b6040519080825280601f01601f1916602001820160405280156128965781602001600182028036833780820191505090505b509050600082602001820190505b600115612903578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816128ed576128ec6149ba565b5b04945060008514156128fe57612903565b6128a4565b819350505050919050565b600061291c82600001612e1e565b9050919050565b600061292f8383612e2f565b61298857826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061298d565b600090505b92915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a065750612a0582612e52565b5b9050919050565b60009392505050565b612a20828261146c565b612a9757612a2d81612ebc565b612a3b8360001c6020612ee9565b604051602001612a4c929190614a81565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e9190613712565b60405180910390fd5b5050565b612aa5828261146c565b15612b79576000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612b1e612475565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612ba5836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613125565b905092915050565b6000826000018281548110612bc557612bc4614abb565b5b9060005260206000200154905092915050565b612be28383613239565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612c7057600080549050600083820390505b612c22600086838060010194508661262d565b612c58576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612c0f578160005414612c6d57600080fd5b50505b505050565b60008082905060005b8451811015612cc057612cab82868381518110612c9e57612c9d614abb565b5b60200260200101516133f6565b91508080612cb890614aea565b915050612c7e565b508091505092915050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612d29577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612d1f57612d1e6149ba565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612d66576d04ee2d6d415b85acef81000000008381612d5c57612d5b6149ba565b5b0492506020810190505b662386f26fc100008310612d9557662386f26fc100008381612d8b57612d8a6149ba565b5b0492506010810190505b6305f5e1008310612dbe576305f5e1008381612db457612db36149ba565b5b0492506008810190505b6127108310612de3576127108381612dd957612dd86149ba565b5b0492506004810190505b60648310612e065760648381612dfc57612dfb6149ba565b5b0492506002810190505b600a8310612e15576001810190505b80915050919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060612ee28273ffffffffffffffffffffffffffffffffffffffff16601460ff16612ee9565b9050919050565b606060006002836002612efc9190614321565b612f0691906141f3565b67ffffffffffffffff811115612f1f57612f1e613921565b5b6040519080825280601f01601f191660200182016040528015612f515781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f8957612f88614abb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612fed57612fec614abb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261302d9190614321565b61303791906141f3565b90505b60018111156130d7577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061307957613078614abb565b5b1a60f81b8282815181106130905761308f614abb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806130d090614b33565b905061303a565b506000841461311b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311290614ba9565b60405180910390fd5b8091505092915050565b6000808360010160008481526020019081526020016000205490506000811461322d5760006001826131579190614bc9565b905060006001866000018054905061316f9190614bc9565b90508181146131de5760008660000182815481106131905761318f614abb565b5b90600052602060002001549050808760000184815481106131b4576131b3614abb565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806131f2576131f1614bfd565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613233565b60009150505b92915050565b600080549050600082141561327a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61328760008483856123ce565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506132fe836132ef60008660006123d4565b6132f885613421565b176123fc565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461339f57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613364565b5060008214156133db576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506133f16000848385612427565b505050565b600081831061340e576134098284613431565b613419565b6134188383613431565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b82805461345490613e78565b90600052602060002090601f01602090048101928261347657600085556134bd565b82601f1061348f57805160ff19168380011785556134bd565b828001600101855582156134bd579182015b828111156134bc5782518255916020019190600101906134a1565b5b5090506134ca91906134ce565b5090565b5b808211156134e75760008160009055506001016134cf565b5090565b6000819050919050565b6134fe816134eb565b82525050565b600060208201905061351960008301846134f5565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61356881613533565b811461357357600080fd5b50565b6000813590506135858161355f565b92915050565b6000602082840312156135a1576135a0613529565b5b60006135af84828501613576565b91505092915050565b60008115159050919050565b6135cd816135b8565b82525050565b60006020820190506135e860008301846135c4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613619826135ee565b9050919050565b6136298161360e565b811461363457600080fd5b50565b60008135905061364681613620565b92915050565b60006020828403121561366257613661613529565b5b600061367084828501613637565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136b3578082015181840152602081019050613698565b838111156136c2576000848401525b50505050565b6000601f19601f8301169050919050565b60006136e482613679565b6136ee8185613684565b93506136fe818560208601613695565b613707816136c8565b840191505092915050565b6000602082019050818103600083015261372c81846136d9565b905092915050565b61373d816134eb565b811461374857600080fd5b50565b60008135905061375a81613734565b92915050565b60006020828403121561377657613775613529565b5b60006137848482850161374b565b91505092915050565b6137968161360e565b82525050565b60006020820190506137b1600083018461378d565b92915050565b600080604083850312156137ce576137cd613529565b5b60006137dc85828601613637565b92505060206137ed8582860161374b565b9150509250929050565b6000806000606084860312156138105761380f613529565b5b600061381e86828701613637565b935050602061382f86828701613637565b92505060406138408682870161374b565b9150509250925092565b6000819050919050565b61385d8161384a565b811461386857600080fd5b50565b60008135905061387a81613854565b92915050565b60006020828403121561389657613895613529565b5b60006138a48482850161386b565b91505092915050565b6138b68161384a565b82525050565b60006020820190506138d160008301846138ad565b92915050565b600080604083850312156138ee576138ed613529565b5b60006138fc8582860161386b565b925050602061390d85828601613637565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613959826136c8565b810181811067ffffffffffffffff8211171561397857613977613921565b5b80604052505050565b600061398b61351f565b90506139978282613950565b919050565b600067ffffffffffffffff8211156139b7576139b6613921565b5b6139c0826136c8565b9050602081019050919050565b82818337600083830152505050565b60006139ef6139ea8461399c565b613981565b905082815260208101848484011115613a0b57613a0a61391c565b5b613a168482856139cd565b509392505050565b600082601f830112613a3357613a32613917565b5b8135613a438482602086016139dc565b91505092915050565b600060208284031215613a6257613a61613529565b5b600082013567ffffffffffffffff811115613a8057613a7f61352e565b5b613a8c84828501613a1e565b91505092915050565b60038110613aa257600080fd5b50565b600081359050613ab481613a95565b92915050565b600060208284031215613ad057613acf613529565b5b6000613ade84828501613aa5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613b2757613b26613ae7565b5b50565b6000819050613b3882613b16565b919050565b6000613b4882613b2a565b9050919050565b613b5881613b3d565b82525050565b6000602082019050613b736000830184613b4f565b92915050565b60008060408385031215613b9057613b8f613529565b5b6000613b9e8582860161386b565b9250506020613baf8582860161374b565b9150509250929050565b613bc2816135b8565b8114613bcd57600080fd5b50565b600081359050613bdf81613bb9565b92915050565b60008060408385031215613bfc57613bfb613529565b5b6000613c0a85828601613637565b9250506020613c1b85828601613bd0565b9150509250929050565b600067ffffffffffffffff821115613c4057613c3f613921565b5b613c49826136c8565b9050602081019050919050565b6000613c69613c6484613c25565b613981565b905082815260208101848484011115613c8557613c8461391c565b5b613c908482856139cd565b509392505050565b600082601f830112613cad57613cac613917565b5b8135613cbd848260208601613c56565b91505092915050565b60008060008060808587031215613ce057613cdf613529565b5b6000613cee87828801613637565b9450506020613cff87828801613637565b9350506040613d108782880161374b565b925050606085013567ffffffffffffffff811115613d3157613d3061352e565b5b613d3d87828801613c98565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112613d6957613d68613917565b5b8235905067ffffffffffffffff811115613d8657613d85613d49565b5b602083019150836020820283011115613da257613da1613d4e565b5b9250929050565b600080600060408486031215613dc257613dc1613529565b5b6000613dd08682870161374b565b935050602084013567ffffffffffffffff811115613df157613df061352e565b5b613dfd86828701613d53565b92509250509250925092565b60008060408385031215613e2057613e1f613529565b5b6000613e2e85828601613637565b9250506020613e3f85828601613637565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e9057607f821691505b60208210811415613ea457613ea3613e49565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613f06602f83613684565b9150613f1182613eaa565b604082019050919050565b60006020820190508181036000830152613f3581613ef9565b9050919050565b7f43616e6e6f742077697468647261770000000000000000000000000000000000600082015250565b6000613f72600f83613684565b9150613f7d82613f3c565b602082019050919050565b60006020820190508181036000830152613fa181613f65565b9050919050565b7f43616e6e6f742073657420426173652055524900000000000000000000000000600082015250565b6000613fde601383613684565b9150613fe982613fa8565b602082019050919050565b6000602082019050818103600083015261400d81613fd1565b9050919050565b7f43616e6e6f7420616c7465722073616c65207374617465000000000000000000600082015250565b600061404a601783613684565b915061405582614014565b602082019050919050565b600060208201905081810360008301526140798161403d565b9050919050565b7f43616e6e6f7420736574206d65726b6c6520726f6f7400000000000000000000600082015250565b60006140b6601683613684565b91506140c182614080565b602082019050919050565b600060208201905081810360008301526140e5816140a9565b9050919050565b7f43616e6e6f742072657665616c00000000000000000000000000000000000000600082015250565b6000614122600d83613684565b915061412d826140ec565b602082019050919050565b6000602082019050818103600083015261415181614115565b9050919050565b7f53616c652073746174652073686f756c64206265207075626c69630000000000600082015250565b600061418e601b83613684565b915061419982614158565b602082019050919050565b600060208201905081810360008301526141bd81614181565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141fe826134eb565b9150614209836134eb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561423e5761423d6141c4565b5b828201905092915050565b7f596f752063616e206d696e742061206d6178696d756d206f662032204e465473600082015250565b600061427f602083613684565b915061428a82614249565b602082019050919050565b600060208201905081810360008301526142ae81614272565b9050919050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b60006142eb601283613684565b91506142f6826142b5565b602082019050919050565b6000602082019050818103600083015261431a816142de565b9050919050565b600061432c826134eb565b9150614337836134eb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143705761436f6141c4565b5b828202905092915050565b7f50726f7669646564206e6f7420656e6f75676820457468657220666f7220707560008201527f7263686173650000000000000000000000000000000000000000000000000000602082015250565b60006143d7602683613684565b91506143e28261437b565b604082019050919050565b60006020820190508181036000830152614406816143ca565b9050919050565b7f53616c65206973206e6f74206f70656e65640000000000000000000000000000600082015250565b6000614443601283613684565b915061444e8261440d565b602082019050919050565b6000602082019050818103600083015261447281614436565b9050919050565b60008160601b9050919050565b600061449182614479565b9050919050565b60006144a382614486565b9050919050565b6144bb6144b68261360e565b614498565b82525050565b60006144cd82846144aa565b60148201915081905092915050565b7f596f7520617265206e6f7420696e207468652076616c69642077686974656c6960008201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b6000614538602283613684565b9150614543826144dc565b604082019050919050565b600060208201905081810360008301526145678161452b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006145ca602f83613684565b91506145d58261456e565b604082019050919050565b600060208201905081810360008301526145f9816145bd565b9050919050565b600081905092915050565b600061461682613679565b6146208185614600565b9350614630818560208601613695565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461465e81613e78565b6146688186614600565b945060018216600081146146835760018114614694576146c7565b60ff198316865281860193506146c7565b61469d8561463c565b60005b838110156146bf578154818901526001820191506020810190506146a0565b838801955050505b50505092915050565b60006146dc828661460b565b91506146e8828561460b565b91506146f48284614651565b9150819050949350505050565b7f43616e6e6f7420736574204261736520457874656e73696f6e00000000000000600082015250565b6000614737601983613684565b915061474282614701565b602082019050919050565b600060208201905081810360008301526147668161472a565b9050919050565b7f43616e6e6f7420736574204e6f742052657665616c2055524900000000000000600082015250565b60006147a3601983613684565b91506147ae8261476d565b602082019050919050565b600060208201905081810360008301526147d281614796565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614835602683613684565b9150614840826147d9565b604082019050919050565b6000602082019050818103600083015261486481614828565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148a1602083613684565b91506148ac8261486b565b602082019050919050565b600060208201905081810360008301526148d081614894565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006148fe826148d7565b61490881856148e2565b9350614918818560208601613695565b614921816136c8565b840191505092915050565b6000608082019050614941600083018761378d565b61494e602083018661378d565b61495b60408301856134f5565b818103606083015261496d81846148f3565b905095945050505050565b6000815190506149878161355f565b92915050565b6000602082840312156149a3576149a2613529565b5b60006149b184828501614978565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614a1f601783614600565b9150614a2a826149e9565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614a6b601183614600565b9150614a7682614a35565b601182019050919050565b6000614a8c82614a12565b9150614a98828561460b565b9150614aa382614a5e565b9150614aaf828461460b565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614af5826134eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b2857614b276141c4565b5b600182019050919050565b6000614b3e826134eb565b91506000821415614b5257614b516141c4565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614b93602083613684565b9150614b9e82614b5d565b602082019050919050565b60006020820190508181036000830152614bc281614b86565b9050919050565b6000614bd4826134eb565b9150614bdf836134eb565b925082821015614bf257614bf16141c4565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122025976a0f391a63b3d0795da658b4a9d7da62ee171e38cc47343e8f01d3747d3b64736f6c63430008090033
Deployed Bytecode
0x60806040526004361061025b5760003560e01c8063715018a611610144578063b88d4fde116100b6578063d547741f1161007a578063d547741f146108bb578063da3ef23f146108e4578063dc53fd921461090d578063e985e9c514610938578063f2c4ce1e14610975578063f2fde38b1461099e5761025b565b8063b88d4fde146107de578063b977fe55146107fa578063c668286214610816578063c87b56dd14610841578063ca15c8731461087e5761025b565b806391d148541161010857806391d14854146106ef57806395d89b411461072c578063a217fddf14610757578063a22cb46514610782578063a475b5dd146107ab578063b287c8ed146107c25761025b565b8063715018a61461060a5780637cb64759146106215780637fb66e221461064a5780638da5cb5b146106875780639010d07c146106b25761025b565b80632ab4d052116101dd57806351830227116101a157806351830227146104e857806355f804b3146105135780635a67de071461053c578063603f4d52146105655780636352211e1461059057806370a08231146105cd5761025b565b80632ab4d052146104385780632f2ff15d1461046357806336568abe1461048c5780633ccfd60b146104b557806342842e0e146104cc5761025b565b8063081c8c4411610224578063081c8c441461036d578063095ea7b31461039857806318160ddd146103b457806323b872dd146103df578063248a9ca3146103fb5761025b565b806204348e1461026057806301ffc9a71461028b578063031a1057146102c857806306fdde0314610305578063081812fc14610330575b600080fd5b34801561026c57600080fd5b506102756109c7565b6040516102829190613504565b60405180910390f35b34801561029757600080fd5b506102b260048036038101906102ad919061358b565b6109cd565b6040516102bf91906135d3565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea919061364c565b6109df565b6040516102fc9190613504565b60405180910390f35b34801561031157600080fd5b5061031a6109f7565b6040516103279190613712565b60405180910390f35b34801561033c57600080fd5b5061035760048036038101906103529190613760565b610a89565b604051610364919061379c565b60405180910390f35b34801561037957600080fd5b50610382610b08565b60405161038f9190613712565b60405180910390f35b6103b260048036038101906103ad91906137b7565b610b96565b005b3480156103c057600080fd5b506103c9610cda565b6040516103d69190613504565b60405180910390f35b6103f960048036038101906103f491906137f7565b610cf1565b005b34801561040757600080fd5b50610422600480360381019061041d9190613880565b611016565b60405161042f91906138bc565b60405180910390f35b34801561044457600080fd5b5061044d611036565b60405161045a9190613504565b60405180910390f35b34801561046f57600080fd5b5061048a600480360381019061048591906138d7565b61103c565b005b34801561049857600080fd5b506104b360048036038101906104ae91906138d7565b61105d565b005b3480156104c157600080fd5b506104ca6110e0565b005b6104e660048036038101906104e191906137f7565b611184565b005b3480156104f457600080fd5b506104fd6111a4565b60405161050a91906135d3565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613a4c565b6111b7565b005b34801561054857600080fd5b50610563600480360381019061055e9190613aba565b61122c565b005b34801561057157600080fd5b5061057a6112ac565b6040516105879190613b5e565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613760565b6112bf565b6040516105c4919061379c565b60405180910390f35b3480156105d957600080fd5b506105f460048036038101906105ef919061364c565b6112d1565b6040516106019190613504565b60405180910390f35b34801561061657600080fd5b5061061f61138a565b005b34801561062d57600080fd5b5061064860048036038101906106439190613880565b61139e565b005b34801561065657600080fd5b50610671600480360381019061066c919061364c565b6113fb565b60405161067e9190613504565b60405180910390f35b34801561069357600080fd5b5061069c611413565b6040516106a9919061379c565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190613b79565b61143d565b6040516106e6919061379c565b60405180910390f35b3480156106fb57600080fd5b50610716600480360381019061071191906138d7565b61146c565b60405161072391906135d3565b60405180910390f35b34801561073857600080fd5b506107416114d7565b60405161074e9190613712565b60405180910390f35b34801561076357600080fd5b5061076c611569565b60405161077991906138bc565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190613be5565b611570565b005b3480156107b757600080fd5b506107c061167b565b005b6107dc60048036038101906107d79190613760565b6116f3565b005b6107f860048036038101906107f39190613cc6565b611918565b005b610814600480360381019061080f9190613da9565b61198b565b005b34801561082257600080fd5b5061082b611c66565b6040516108389190613712565b60405180910390f35b34801561084d57600080fd5b5061086860048036038101906108639190613760565b611cf4565b6040516108759190613712565b60405180910390f35b34801561088a57600080fd5b506108a560048036038101906108a09190613880565b611e4d565b6040516108b29190613504565b60405180910390f35b3480156108c757600080fd5b506108e260048036038101906108dd91906138d7565b611e71565b005b3480156108f057600080fd5b5061090b60048036038101906109069190613a4c565b611e92565b005b34801561091957600080fd5b50610922611f07565b60405161092f9190613504565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190613e09565b611f0d565b60405161096c91906135d3565b60405180910390f35b34801561098157600080fd5b5061099c60048036038101906109979190613a4c565b611fa1565b005b3480156109aa57600080fd5b506109c560048036038101906109c0919061364c565b612016565b005b600d5481565b60006109d8826121ab565b9050919050565b60146020528060005260406000206000915090505481565b606060028054610a0690613e78565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3290613e78565b8015610a7f5780601f10610a5457610100808354040283529160200191610a7f565b820191906000526020600020905b815481529060010190602001808311610a6257829003601f168201915b5050505050905090565b6000610a9482612225565b610aca576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610b1590613e78565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4190613e78565b8015610b8e5780601f10610b6357610100808354040283529160200191610b8e565b820191906000526020600020905b815481529060010190602001808311610b7157829003601f168201915b505050505081565b6000610ba1826112bf565b90508073ffffffffffffffffffffffffffffffffffffffff16610bc2612284565b73ffffffffffffffffffffffffffffffffffffffff1614610c2557610bee81610be9612284565b611f0d565b610c24576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610ce461228c565b6001546000540303905090565b6000610cfc82612295565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d63576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d6f84612363565b91509150610d858187610d80612284565b61238a565b610dd157610d9a86610d95612284565b611f0d565b610dd0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e38576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4586868660016123ce565b8015610e5057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f1e85610efa8888876123d4565b7c0200000000000000000000000000000000000000000000000000000000176123fc565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610fa6576000600185019050600060046000838152602001908152602001600020541415610fa4576000548114610fa3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461100e8686866001612427565b505050505050565b6000600a6000838152602001908152602001600020600101549050919050565b600c5481565b61104582611016565b61104e8161242d565b6110588383612441565b505050565b611065612475565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990613f1c565b60405180910390fd5b6110dc828261247d565b5050565b6110e86124b1565b6110fc6000801b6110f7612475565b61146c565b61113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113290613f88565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611181573d6000803e3d6000fd5b50565b61119f83838360405180602001604052806000815250611918565b505050565b601260009054906101000a900460ff1681565b6111bf6124b1565b6111d36000801b6111ce612475565b61146c565b611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990613ff4565b60405180910390fd5b8060169080519060200190611228929190613448565b5050565b6112406000801b61123b612475565b61146c565b61127f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127690614060565b60405180910390fd5b80601260016101000a81548160ff021916908360028111156112a4576112a3613ae7565b5b021790555050565b601260019054906101000a900460ff1681565b60006112ca82612295565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611339576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6113926124b1565b61139c600061252f565b565b6113b26000801b6113ad612475565b61146c565b6113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e8906140cc565b60405180910390fd5b8060138190555050565b60156020528060005260406000206000915090505481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061146482600b60008681526020019081526020016000206125f590919063ffffffff16565b905092915050565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600380546114e690613e78565b80601f016020809104026020016040519081016040528092919081815260200182805461151290613e78565b801561155f5780601f106115345761010080835404028352916020019161155f565b820191906000526020600020905b81548152906001019060200180831161154257829003601f168201915b5050505050905090565b6000801b81565b806007600061157d612284565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661162a612284565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161166f91906135d3565b60405180910390a35050565b6116836124b1565b6116976000801b611692612475565b61146c565b6116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90614138565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b60028081111561170657611705613ae7565b5b601260019054906101000a900460ff16600281111561172857611727613ae7565b5b14611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f906141a4565b60405180910390fd5b600f60009054906101000a900460ff1660ff1681601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117c691906141f3565b1115611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe90614295565b60405180910390fd5b600c5481611813610cda565b61181d91906141f3565b111561185e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185590614301565b60405180910390fd5b34600e548261186d9190614321565b11156118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a5906143ed565b60405180910390fd5b80601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118fd91906141f3565b9250508190555061191561190f612475565b8261260f565b50565b611923848484610cf1565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119855761194e8484848461262d565b611984576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6001600281111561199f5761199e613ae7565b5b601260019054906101000a900460ff1660028111156119c1576119c0613ae7565b5b14611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890614459565b60405180910390fd5b600f60009054906101000a900460ff1660ff1683601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a5f91906141f3565b1115611aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9790614295565b60405180910390fd5b600c5483611aac610cda565b611ab691906141f3565b1115611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90614301565b60405180910390fd5b611b6b828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060135433604051602001611b5091906144c1565b6040516020818303038152906040528051906020012061278d565b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba19061454e565b60405180910390fd5b34600d5484611bb99190614321565b1115611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf1906143ed565b60405180910390fd5b82601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c4991906141f3565b92505081905550611c61611c5b612475565b8461260f565b505050565b60108054611c7390613e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9f90613e78565b8015611cec5780601f10611cc157610100808354040283529160200191611cec565b820191906000526020600020905b815481529060010190602001808311611ccf57829003601f168201915b505050505081565b6060611cff82612225565b611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d35906145e0565b60405180910390fd5b60001515601260009054906101000a900460ff1615151415611dec5760118054611d6790613e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9390613e78565b8015611de05780601f10611db557610100808354040283529160200191611de0565b820191906000526020600020905b815481529060010190602001808311611dc357829003601f168201915b50505050509050611e48565b6000611df66127a4565b90506000815111611e165760405180602001604052806000815250611e44565b80611e2084612836565b6010604051602001611e34939291906146d0565b6040516020818303038152906040525b9150505b919050565b6000611e6a600b600084815260200190815260200160002061290e565b9050919050565b611e7a82611016565b611e838161242d565b611e8d838361247d565b505050565b611e9a6124b1565b611eae6000801b611ea9612475565b61146c565b611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee49061474d565b60405180910390fd5b8060109080519060200190611f03929190613448565b5050565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fa96124b1565b611fbd6000801b611fb8612475565b61146c565b611ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff3906147b9565b60405180910390fd5b8060119080519060200190612012929190613448565b5050565b61201e6124b1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561208e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120859061484b565b60405180910390fd5b6120978161252f565b50565b6120a4828261146c565b612177576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061211c612475565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006121a3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612923565b905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061221e575061221d82612993565b5b9050919050565b60008161223061228c565b1115801561223f575060005482105b801561227d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806122a461228c565b1161232c5760005481101561232b5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612329575b600081141561231f5760046000836001900393508381526020019081526020016000205490506122f4565b809250505061235e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86123eb868684612a0d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61243e81612439612475565b612a16565b50565b61244b828261209a565b61247081600b600085815260200190815260200160002061217b90919063ffffffff16565b505050565b600033905090565b6124878282612a9b565b6124ac81600b6000858152602001908152602001600020612b7d90919063ffffffff16565b505050565b6124b9612475565b73ffffffffffffffffffffffffffffffffffffffff166124d7611413565b73ffffffffffffffffffffffffffffffffffffffff161461252d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612524906148b7565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006126048360000183612bad565b60001c905092915050565b612629828260405180602001604052806000815250612bd8565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612653612284565b8786866040518563ffffffff1660e01b8152600401612675949392919061492c565b602060405180830381600087803b15801561268f57600080fd5b505af19250505080156126c057506040513d601f19601f820116820180604052508101906126bd919061498d565b60015b61273a573d80600081146126f0576040519150601f19603f3d011682016040523d82523d6000602084013e6126f5565b606091505b50600081511415612732576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008261279a8584612c75565b1490509392505050565b6060601680546127b390613e78565b80601f01602080910402602001604051908101604052809291908181526020018280546127df90613e78565b801561282c5780601f106128015761010080835404028352916020019161282c565b820191906000526020600020905b81548152906001019060200180831161280f57829003601f168201915b5050505050905090565b60606000600161284584612ccb565b01905060008167ffffffffffffffff81111561286457612863613921565b5b6040519080825280601f01601f1916602001820160405280156128965781602001600182028036833780820191505090505b509050600082602001820190505b600115612903578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816128ed576128ec6149ba565b5b04945060008514156128fe57612903565b6128a4565b819350505050919050565b600061291c82600001612e1e565b9050919050565b600061292f8383612e2f565b61298857826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061298d565b600090505b92915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a065750612a0582612e52565b5b9050919050565b60009392505050565b612a20828261146c565b612a9757612a2d81612ebc565b612a3b8360001c6020612ee9565b604051602001612a4c929190614a81565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e9190613712565b60405180910390fd5b5050565b612aa5828261146c565b15612b79576000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612b1e612475565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612ba5836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613125565b905092915050565b6000826000018281548110612bc557612bc4614abb565b5b9060005260206000200154905092915050565b612be28383613239565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612c7057600080549050600083820390505b612c22600086838060010194508661262d565b612c58576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612c0f578160005414612c6d57600080fd5b50505b505050565b60008082905060005b8451811015612cc057612cab82868381518110612c9e57612c9d614abb565b5b60200260200101516133f6565b91508080612cb890614aea565b915050612c7e565b508091505092915050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612d29577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612d1f57612d1e6149ba565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612d66576d04ee2d6d415b85acef81000000008381612d5c57612d5b6149ba565b5b0492506020810190505b662386f26fc100008310612d9557662386f26fc100008381612d8b57612d8a6149ba565b5b0492506010810190505b6305f5e1008310612dbe576305f5e1008381612db457612db36149ba565b5b0492506008810190505b6127108310612de3576127108381612dd957612dd86149ba565b5b0492506004810190505b60648310612e065760648381612dfc57612dfb6149ba565b5b0492506002810190505b600a8310612e15576001810190505b80915050919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060612ee28273ffffffffffffffffffffffffffffffffffffffff16601460ff16612ee9565b9050919050565b606060006002836002612efc9190614321565b612f0691906141f3565b67ffffffffffffffff811115612f1f57612f1e613921565b5b6040519080825280601f01601f191660200182016040528015612f515781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f8957612f88614abb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612fed57612fec614abb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261302d9190614321565b61303791906141f3565b90505b60018111156130d7577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061307957613078614abb565b5b1a60f81b8282815181106130905761308f614abb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806130d090614b33565b905061303a565b506000841461311b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311290614ba9565b60405180910390fd5b8091505092915050565b6000808360010160008481526020019081526020016000205490506000811461322d5760006001826131579190614bc9565b905060006001866000018054905061316f9190614bc9565b90508181146131de5760008660000182815481106131905761318f614abb565b5b90600052602060002001549050808760000184815481106131b4576131b3614abb565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806131f2576131f1614bfd565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613233565b60009150505b92915050565b600080549050600082141561327a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61328760008483856123ce565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506132fe836132ef60008660006123d4565b6132f885613421565b176123fc565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461339f57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613364565b5060008214156133db576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506133f16000848385612427565b505050565b600081831061340e576134098284613431565b613419565b6134188383613431565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b82805461345490613e78565b90600052602060002090601f01602090048101928261347657600085556134bd565b82601f1061348f57805160ff19168380011785556134bd565b828001600101855582156134bd579182015b828111156134bc5782518255916020019190600101906134a1565b5b5090506134ca91906134ce565b5090565b5b808211156134e75760008160009055506001016134cf565b5090565b6000819050919050565b6134fe816134eb565b82525050565b600060208201905061351960008301846134f5565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61356881613533565b811461357357600080fd5b50565b6000813590506135858161355f565b92915050565b6000602082840312156135a1576135a0613529565b5b60006135af84828501613576565b91505092915050565b60008115159050919050565b6135cd816135b8565b82525050565b60006020820190506135e860008301846135c4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613619826135ee565b9050919050565b6136298161360e565b811461363457600080fd5b50565b60008135905061364681613620565b92915050565b60006020828403121561366257613661613529565b5b600061367084828501613637565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136b3578082015181840152602081019050613698565b838111156136c2576000848401525b50505050565b6000601f19601f8301169050919050565b60006136e482613679565b6136ee8185613684565b93506136fe818560208601613695565b613707816136c8565b840191505092915050565b6000602082019050818103600083015261372c81846136d9565b905092915050565b61373d816134eb565b811461374857600080fd5b50565b60008135905061375a81613734565b92915050565b60006020828403121561377657613775613529565b5b60006137848482850161374b565b91505092915050565b6137968161360e565b82525050565b60006020820190506137b1600083018461378d565b92915050565b600080604083850312156137ce576137cd613529565b5b60006137dc85828601613637565b92505060206137ed8582860161374b565b9150509250929050565b6000806000606084860312156138105761380f613529565b5b600061381e86828701613637565b935050602061382f86828701613637565b92505060406138408682870161374b565b9150509250925092565b6000819050919050565b61385d8161384a565b811461386857600080fd5b50565b60008135905061387a81613854565b92915050565b60006020828403121561389657613895613529565b5b60006138a48482850161386b565b91505092915050565b6138b68161384a565b82525050565b60006020820190506138d160008301846138ad565b92915050565b600080604083850312156138ee576138ed613529565b5b60006138fc8582860161386b565b925050602061390d85828601613637565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613959826136c8565b810181811067ffffffffffffffff8211171561397857613977613921565b5b80604052505050565b600061398b61351f565b90506139978282613950565b919050565b600067ffffffffffffffff8211156139b7576139b6613921565b5b6139c0826136c8565b9050602081019050919050565b82818337600083830152505050565b60006139ef6139ea8461399c565b613981565b905082815260208101848484011115613a0b57613a0a61391c565b5b613a168482856139cd565b509392505050565b600082601f830112613a3357613a32613917565b5b8135613a438482602086016139dc565b91505092915050565b600060208284031215613a6257613a61613529565b5b600082013567ffffffffffffffff811115613a8057613a7f61352e565b5b613a8c84828501613a1e565b91505092915050565b60038110613aa257600080fd5b50565b600081359050613ab481613a95565b92915050565b600060208284031215613ad057613acf613529565b5b6000613ade84828501613aa5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613b2757613b26613ae7565b5b50565b6000819050613b3882613b16565b919050565b6000613b4882613b2a565b9050919050565b613b5881613b3d565b82525050565b6000602082019050613b736000830184613b4f565b92915050565b60008060408385031215613b9057613b8f613529565b5b6000613b9e8582860161386b565b9250506020613baf8582860161374b565b9150509250929050565b613bc2816135b8565b8114613bcd57600080fd5b50565b600081359050613bdf81613bb9565b92915050565b60008060408385031215613bfc57613bfb613529565b5b6000613c0a85828601613637565b9250506020613c1b85828601613bd0565b9150509250929050565b600067ffffffffffffffff821115613c4057613c3f613921565b5b613c49826136c8565b9050602081019050919050565b6000613c69613c6484613c25565b613981565b905082815260208101848484011115613c8557613c8461391c565b5b613c908482856139cd565b509392505050565b600082601f830112613cad57613cac613917565b5b8135613cbd848260208601613c56565b91505092915050565b60008060008060808587031215613ce057613cdf613529565b5b6000613cee87828801613637565b9450506020613cff87828801613637565b9350506040613d108782880161374b565b925050606085013567ffffffffffffffff811115613d3157613d3061352e565b5b613d3d87828801613c98565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112613d6957613d68613917565b5b8235905067ffffffffffffffff811115613d8657613d85613d49565b5b602083019150836020820283011115613da257613da1613d4e565b5b9250929050565b600080600060408486031215613dc257613dc1613529565b5b6000613dd08682870161374b565b935050602084013567ffffffffffffffff811115613df157613df061352e565b5b613dfd86828701613d53565b92509250509250925092565b60008060408385031215613e2057613e1f613529565b5b6000613e2e85828601613637565b9250506020613e3f85828601613637565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e9057607f821691505b60208210811415613ea457613ea3613e49565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613f06602f83613684565b9150613f1182613eaa565b604082019050919050565b60006020820190508181036000830152613f3581613ef9565b9050919050565b7f43616e6e6f742077697468647261770000000000000000000000000000000000600082015250565b6000613f72600f83613684565b9150613f7d82613f3c565b602082019050919050565b60006020820190508181036000830152613fa181613f65565b9050919050565b7f43616e6e6f742073657420426173652055524900000000000000000000000000600082015250565b6000613fde601383613684565b9150613fe982613fa8565b602082019050919050565b6000602082019050818103600083015261400d81613fd1565b9050919050565b7f43616e6e6f7420616c7465722073616c65207374617465000000000000000000600082015250565b600061404a601783613684565b915061405582614014565b602082019050919050565b600060208201905081810360008301526140798161403d565b9050919050565b7f43616e6e6f7420736574206d65726b6c6520726f6f7400000000000000000000600082015250565b60006140b6601683613684565b91506140c182614080565b602082019050919050565b600060208201905081810360008301526140e5816140a9565b9050919050565b7f43616e6e6f742072657665616c00000000000000000000000000000000000000600082015250565b6000614122600d83613684565b915061412d826140ec565b602082019050919050565b6000602082019050818103600083015261415181614115565b9050919050565b7f53616c652073746174652073686f756c64206265207075626c69630000000000600082015250565b600061418e601b83613684565b915061419982614158565b602082019050919050565b600060208201905081810360008301526141bd81614181565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141fe826134eb565b9150614209836134eb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561423e5761423d6141c4565b5b828201905092915050565b7f596f752063616e206d696e742061206d6178696d756d206f662032204e465473600082015250565b600061427f602083613684565b915061428a82614249565b602082019050919050565b600060208201905081810360008301526142ae81614272565b9050919050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b60006142eb601283613684565b91506142f6826142b5565b602082019050919050565b6000602082019050818103600083015261431a816142de565b9050919050565b600061432c826134eb565b9150614337836134eb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143705761436f6141c4565b5b828202905092915050565b7f50726f7669646564206e6f7420656e6f75676820457468657220666f7220707560008201527f7263686173650000000000000000000000000000000000000000000000000000602082015250565b60006143d7602683613684565b91506143e28261437b565b604082019050919050565b60006020820190508181036000830152614406816143ca565b9050919050565b7f53616c65206973206e6f74206f70656e65640000000000000000000000000000600082015250565b6000614443601283613684565b915061444e8261440d565b602082019050919050565b6000602082019050818103600083015261447281614436565b9050919050565b60008160601b9050919050565b600061449182614479565b9050919050565b60006144a382614486565b9050919050565b6144bb6144b68261360e565b614498565b82525050565b60006144cd82846144aa565b60148201915081905092915050565b7f596f7520617265206e6f7420696e207468652076616c69642077686974656c6960008201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b6000614538602283613684565b9150614543826144dc565b604082019050919050565b600060208201905081810360008301526145678161452b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006145ca602f83613684565b91506145d58261456e565b604082019050919050565b600060208201905081810360008301526145f9816145bd565b9050919050565b600081905092915050565b600061461682613679565b6146208185614600565b9350614630818560208601613695565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461465e81613e78565b6146688186614600565b945060018216600081146146835760018114614694576146c7565b60ff198316865281860193506146c7565b61469d8561463c565b60005b838110156146bf578154818901526001820191506020810190506146a0565b838801955050505b50505092915050565b60006146dc828661460b565b91506146e8828561460b565b91506146f48284614651565b9150819050949350505050565b7f43616e6e6f7420736574204261736520457874656e73696f6e00000000000000600082015250565b6000614737601983613684565b915061474282614701565b602082019050919050565b600060208201905081810360008301526147668161472a565b9050919050565b7f43616e6e6f7420736574204e6f742052657665616c2055524900000000000000600082015250565b60006147a3601983613684565b91506147ae8261476d565b602082019050919050565b600060208201905081810360008301526147d281614796565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614835602683613684565b9150614840826147d9565b604082019050919050565b6000602082019050818103600083015261486481614828565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148a1602083613684565b91506148ac8261486b565b602082019050919050565b600060208201905081810360008301526148d081614894565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006148fe826148d7565b61490881856148e2565b9350614918818560208601613695565b614921816136c8565b840191505092915050565b6000608082019050614941600083018761378d565b61494e602083018661378d565b61495b60408301856134f5565b818103606083015261496d81846148f3565b905095945050505050565b6000815190506149878161355f565b92915050565b6000602082840312156149a3576149a2613529565b5b60006149b184828501614978565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614a1f601783614600565b9150614a2a826149e9565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614a6b601183614600565b9150614a7682614a35565b601182019050919050565b6000614a8c82614a12565b9150614a98828561460b565b9150614aa382614a5e565b9150614aaf828461460b565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614af5826134eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b2857614b276141c4565b5b600182019050919050565b6000614b3e826134eb565b91506000821415614b5257614b516141c4565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614b93602083613684565b9150614b9e82614b5d565b602082019050919050565b60006020820190508181036000830152614bc281614b86565b9050919050565b6000614bd4826134eb565b9150614bdf836134eb565b925082821015614bf257614bf16141c4565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122025976a0f391a63b3d0795da658b4a9d7da62ee171e38cc47343e8f01d3747d3b64736f6c63430008090033
Deployed Bytecode Sourcemap
113078:4341:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113210:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;116126:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113614:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80875:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87366:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113403:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86799:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76626:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91005:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52625:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113167:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53066:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54210:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;115242:187;;;;;;;;;;;;;:::i;:::-;;93926:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113444:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115932:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;115437:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113521:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82268:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77810:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60752:103;;;;;;;;;;;;;:::i;:::-;;115743:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113679:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60104:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57863:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51098:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81051:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50203:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87924:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;116771:147;;;;;;;;;;;;;:::i;:::-;;114698:536;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94717:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114001:689;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113359:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;116926:488;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58190:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53506:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;116321:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113262:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88315:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;116547:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61010:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113210:45;;;;:::o;116126:187::-;116245:4;116269:36;116293:11;116269:23;:36::i;:::-;116262:43;;116126:187;;;:::o;113614:58::-;;;;;;;;;;;;;;;;;:::o;80875:100::-;80929:13;80962:5;80955:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80875:100;:::o;87366:218::-;87442:7;87467:16;87475:7;87467;:16::i;:::-;87462:64;;87492:34;;;;;;;;;;;;;;87462:64;87546:15;:24;87562:7;87546:24;;;;;;;;;;;:30;;;;;;;;;;;;87539:37;;87366:218;;;:::o;113403:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;86799:408::-;86888:13;86904:16;86912:7;86904;:16::i;:::-;86888:32;;86960:5;86937:28;;:19;:17;:19::i;:::-;:28;;;86933:175;;86985:44;87002:5;87009:19;:17;:19::i;:::-;86985:16;:44::i;:::-;86980:128;;87057:35;;;;;;;;;;;;;;86980:128;86933:175;87153:2;87120:15;:24;87136:7;87120:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;87191:7;87187:2;87171:28;;87180:5;87171:28;;;;;;;;;;;;86877:330;86799:408;;:::o;76626:323::-;76687:7;76915:15;:13;:15::i;:::-;76900:12;;76884:13;;:28;:46;76877:53;;76626:323;:::o;91005:2825::-;91147:27;91177;91196:7;91177:18;:27::i;:::-;91147:57;;91262:4;91221:45;;91237:19;91221:45;;;91217:86;;91275:28;;;;;;;;;;;;;;91217:86;91317:27;91346:23;91373:35;91400:7;91373:26;:35::i;:::-;91316:92;;;;91508:68;91533:15;91550:4;91556:19;:17;:19::i;:::-;91508:24;:68::i;:::-;91503:180;;91596:43;91613:4;91619:19;:17;:19::i;:::-;91596:16;:43::i;:::-;91591:92;;91648:35;;;;;;;;;;;;;;91591:92;91503:180;91714:1;91700:16;;:2;:16;;;91696:52;;;91725:23;;;;;;;;;;;;;;91696:52;91761:43;91783:4;91789:2;91793:7;91802:1;91761:21;:43::i;:::-;91897:15;91894:160;;;92037:1;92016:19;92009:30;91894:160;92434:18;:24;92453:4;92434:24;;;;;;;;;;;;;;;;92432:26;;;;;;;;;;;;92503:18;:22;92522:2;92503:22;;;;;;;;;;;;;;;;92501:24;;;;;;;;;;;92825:146;92862:2;92911:45;92926:4;92932:2;92936:19;92911:14;:45::i;:::-;73025:8;92883:73;92825:18;:146::i;:::-;92796:17;:26;92814:7;92796:26;;;;;;;;;;;:175;;;;93142:1;73025:8;93091:19;:47;:52;93087:627;;;93164:19;93196:1;93186:7;:11;93164:33;;93353:1;93319:17;:30;93337:11;93319:30;;;;;;;;;;;;:35;93315:384;;;93457:13;;93442:11;:28;93438:242;;93637:19;93604:17;:30;93622:11;93604:30;;;;;;;;;;;:52;;;;93438:242;93315:384;93145:569;93087:627;93761:7;93757:2;93742:27;;93751:4;93742:27;;;;;;;;;;;;93780:42;93801:4;93807:2;93811:7;93820:1;93780:20;:42::i;:::-;91136:2694;;;91005:2825;;;:::o;52625:131::-;52699:7;52726:6;:12;52733:4;52726:12;;;;;;;;;;;:22;;;52719:29;;52625:131;;;:::o;113167:36::-;;;;:::o;53066:147::-;53149:18;53162:4;53149:12;:18::i;:::-;50694:16;50705:4;50694:10;:16::i;:::-;53180:25:::1;53191:4;53197:7;53180:10;:25::i;:::-;53066:147:::0;;;:::o;54210:218::-;54317:12;:10;:12::i;:::-;54306:23;;:7;:23;;;54298:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;54394:26;54406:4;54412:7;54394:11;:26::i;:::-;54210:218;;:::o;115242:187::-;59990:13;:11;:13::i;:::-;115298:41:::1;50248:4;115306:18:::0;::::1;115326:12;:10;:12::i;:::-;115298:7;:41::i;:::-;115290:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;115378:10;115370:28;;:51;115399:21;115370:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;115242:187::o:0;93926:193::-;94072:39;94089:4;94095:2;94099:7;94072:39;;;;;;;;;;;;:16;:39::i;:::-;93926:193;;;:::o;113444:28::-;;;;;;;;;;;;;:::o;115932:186::-;59990:13;:11;:13::i;:::-;116011:41:::1;50248:4;116019:18:::0;::::1;116039:12;:10;:12::i;:::-;116011:7;:41::i;:::-;116003:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;116103:7;116087:13;:23;;;;;;;;;;;;:::i;:::-;;115932:186:::0;:::o;115437:176::-;115505:41;50248:4;115513:18;;115533:12;:10;:12::i;:::-;115505:7;:41::i;:::-;115497:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;115597:8;115585:9;;:20;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;115437:176;:::o;113521:45::-;;;;;;;;;;;;;:::o;82268:152::-;82340:7;82383:27;82402:7;82383:18;:27::i;:::-;82360:52;;82268:152;;;:::o;77810:233::-;77882:7;77923:1;77906:19;;:5;:19;;;77902:60;;;77934:28;;;;;;;;;;;;;;77902:60;71969:13;77980:18;:25;77999:5;77980:25;;;;;;;;;;;;;;;;:55;77973:62;;77810:233;;;:::o;60752:103::-;59990:13;:11;:13::i;:::-;60817:30:::1;60844:1;60817:18;:30::i;:::-;60752:103::o:0;115743:181::-;115813:41;50248:4;115821:18;;115841:12;:10;:12::i;:::-;115813:7;:41::i;:::-;115805:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;115905:11;115892:10;:24;;;;115743:181;:::o;113679:57::-;;;;;;;;;;;;;;;;;:::o;60104:87::-;60150:7;60177:6;;;;;;;;;;;60170:13;;60104:87;:::o;57863:153::-;57953:7;57980:28;58002:5;57980:12;:18;57993:4;57980:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;57973:35;;57863:153;;;;:::o;51098:147::-;51184:4;51208:6;:12;51215:4;51208:12;;;;;;;;;;;:20;;:29;51229:7;51208:29;;;;;;;;;;;;;;;;;;;;;;;;;51201:36;;51098:147;;;;:::o;81051:104::-;81107:13;81140:7;81133:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81051:104;:::o;50203:49::-;50248:4;50203:49;;;:::o;87924:234::-;88071:8;88019:18;:39;88038:19;:17;:19::i;:::-;88019:39;;;;;;;;;;;;;;;:49;88059:8;88019:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;88131:8;88095:55;;88110:19;:17;:19::i;:::-;88095:55;;;88141:8;88095:55;;;;;;:::i;:::-;;;;;;;;87924:234;;:::o;116771:147::-;59990:13;:11;:13::i;:::-;116825:41:::1;50248:4;116833:18:::0;::::1;116853:12;:10;:12::i;:::-;116825:7;:41::i;:::-;116817:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;116906:4;116895:8;;:15;;;;;;;;;;;;;;;;;;116771:147::o:0;114698:536::-;114782:16;114769:29;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:29;;;;;;;;:::i;:::-;;;114760:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;114896:15;;;;;;;;;;;114849:62;;114886:6;114849:22;:34;114872:10;114849:34;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:62;;114841:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;114993:14;;114983:6;114967:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;114959:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;115077:9;115058:15;;115049:6;:24;;;;:::i;:::-;:37;;115041:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;115178:6;115140:22;:34;115163:10;115140:34;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;115195:31;115205:12;:10;:12::i;:::-;115219:6;115195:9;:31::i;:::-;114698:536;:::o;94717:407::-;94892:31;94905:4;94911:2;94915:7;94892:12;:31::i;:::-;94956:1;94938:2;:14;;;:19;94934:183;;94977:56;95008:4;95014:2;95018:7;95027:5;94977:30;:56::i;:::-;94972:145;;95061:40;;;;;;;;;;;;;;94972:145;94934:183;94717:407;;;;:::o;114001:689::-;114112:12;114099:25;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;114090:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;114214:15;;;;;;;;;;;114166:63;;114204:6;114166:23;:35;114190:10;114166:35;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;:63;;114158:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;114311:14;;114301:6;114285:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;114277:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;114367:78;114386:5;;114367:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114393:10;;114432;114415:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;114405:39;;;;;;114367:18;:78::i;:::-;114359:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;114532:9;114512:16;;114503:6;:25;;;;:::i;:::-;:38;;114495:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;114634:6;114595:23;:35;114619:10;114595:35;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;114651:31;114661:12;:10;:12::i;:::-;114675:6;114651:9;:31::i;:::-;114001:689;;;:::o;113359:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;116926:488::-;117000:13;117034:17;117042:8;117034:7;:17::i;:::-;117026:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;117129:5;117117:17;;:8;;;;;;;;;;;:17;;;117114:70;;;117158:14;117151:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;117114:70;117196:28;117227:10;:8;:10::i;:::-;117196:41;;117296:1;117271:14;117265:28;:32;:141;;;;;;;;;;;;;;;;;117333:14;117349:26;117366:8;117349:16;:26::i;:::-;117377:13;117316:75;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;117265:141;117258:148;;;116926:488;;;;:::o;58190:142::-;58270:7;58297:27;:12;:18;58310:4;58297:18;;;;;;;;;;;:25;:27::i;:::-;58290:34;;58190:142;;;:::o;53506:149::-;53590:18;53603:4;53590:12;:18::i;:::-;50694:16;50705:4;50694:10;:16::i;:::-;53621:26:::1;53633:4;53639:7;53621:11;:26::i;:::-;53506:149:::0;;;:::o;116321:218::-;59990:13;:11;:13::i;:::-;116416:41:::1;50248:4;116424:18:::0;::::1;116444:12;:10;:12::i;:::-;116416:7;:41::i;:::-;116408:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;116514:17;116498:13;:33;;;;;;;;;;;;:::i;:::-;;116321:218:::0;:::o;113262:44::-;;;;:::o;88315:164::-;88412:4;88436:18;:25;88455:5;88436:25;;;;;;;;;;;;;;;:35;88462:8;88436:35;;;;;;;;;;;;;;;;;;;;;;;;;88429:42;;88315:164;;;;:::o;116547:216::-;59990:13;:11;:13::i;:::-;116641:41:::1;50248:4;116649:18:::0;::::1;116669:12;:10;:12::i;:::-;116641:7;:41::i;:::-;116633:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;116740:15;116723:14;:32;;;;;;;;;;;;:::i;:::-;;116547:216:::0;:::o;61010:201::-;59990:13;:11;:13::i;:::-;61119:1:::1;61099:22;;:8;:22;;;;61091:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;61175:28;61194:8;61175:18;:28::i;:::-;61010:201:::0;:::o;55807:238::-;55891:22;55899:4;55905:7;55891;:22::i;:::-;55886:152;;55962:4;55930:6;:12;55937:4;55930:12;;;;;;;;;;;:20;;:29;55951:7;55930:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;56013:12;:10;:12::i;:::-;55986:40;;56004:7;55986:40;;55998:4;55986:40;;;;;;;;;;55886:152;55807:238;;:::o;18137:152::-;18207:4;18231:50;18236:3;:10;;18272:5;18256:23;;18248:32;;18231:4;:50::i;:::-;18224:57;;18137:152;;;;:::o;57050:214::-;57135:4;57174:42;57159:57;;;:11;:57;;;;:97;;;;57220:36;57244:11;57220:23;:36::i;:::-;57159:97;57152:104;;57050:214;;;:::o;88737:282::-;88802:4;88858:7;88839:15;:13;:15::i;:::-;:26;;:66;;;;;88892:13;;88882:7;:23;88839:66;:153;;;;;88991:1;72745:8;88943:17;:26;88961:7;88943:26;;;;;;;;;;;;:44;:49;88839:153;88819:173;;88737:282;;;:::o;111045:105::-;111105:7;111132:10;111125:17;;111045:105;:::o;113892:101::-;113957:7;113984:1;113977:8;;113892:101;:::o;83423:1275::-;83490:7;83510:12;83525:7;83510:22;;83593:4;83574:15;:13;:15::i;:::-;:23;83570:1061;;83627:13;;83620:4;:20;83616:1015;;;83665:14;83682:17;:23;83700:4;83682:23;;;;;;;;;;;;83665:40;;83799:1;72745:8;83771:6;:24;:29;83767:845;;;84436:113;84453:1;84443:6;:11;84436:113;;;84496:17;:25;84514:6;;;;;;;84496:25;;;;;;;;;;;;84487:34;;84436:113;;;84582:6;84575:13;;;;;;83767:845;83642:989;83616:1015;83570:1061;84659:31;;;;;;;;;;;;;;83423:1275;;;;:::o;89900:485::-;90002:27;90031:23;90072:38;90113:15;:24;90129:7;90113:24;;;;;;;;;;;90072:65;;90290:18;90267:41;;90347:19;90341:26;90322:45;;90252:126;89900:485;;;:::o;89128:659::-;89277:11;89442:16;89435:5;89431:28;89422:37;;89602:16;89591:9;89587:32;89574:45;;89752:15;89741:9;89738:30;89730:5;89719:9;89716:20;89713:56;89703:66;;89128:659;;;;;:::o;95786:159::-;;;;;:::o;110354:311::-;110489:7;110509:16;73149:3;110535:19;:41;;110509:68;;73149:3;110603:31;110614:4;110620:2;110624:9;110603:10;:31::i;:::-;110595:40;;:62;;110588:69;;;110354:311;;;;;:::o;85246:450::-;85326:14;85494:16;85487:5;85483:28;85474:37;;85671:5;85657:11;85632:23;85628:41;85625:52;85618:5;85615:63;85605:73;;85246:450;;;;:::o;96610:158::-;;;;;:::o;51549:105::-;51616:30;51627:4;51633:12;:10;:12::i;:::-;51616:10;:30::i;:::-;51549:105;:::o;58425:169::-;58513:31;58530:4;58536:7;58513:16;:31::i;:::-;58555;58578:7;58555:12;:18;58568:4;58555:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;58425:169;;:::o;48011:98::-;48064:7;48091:10;48084:17;;48011:98;:::o;58688:174::-;58777:32;58795:4;58801:7;58777:17;:32::i;:::-;58820:34;58846:7;58820:12;:18;58833:4;58820:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;58688:174;;:::o;60269:132::-;60344:12;:10;:12::i;:::-;60333:23;;:7;:5;:7::i;:::-;:23;;;60325:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60269:132::o;61371:191::-;61445:16;61464:6;;;;;;;;;;;61445:25;;61490:8;61481:6;;:17;;;;;;;;;;;;;;;;;;61545:8;61514:40;;61535:8;61514:40;;;;;;;;;;;;61434:128;61371:191;:::o;19433:158::-;19507:7;19558:22;19562:3;:10;;19574:5;19558:3;:22::i;:::-;19550:31;;19527:56;;19433:158;;;;:::o;104877:112::-;104954:27;104964:2;104968:8;104954:27;;;;;;;;;;;;:9;:27::i;:::-;104877:112;;:::o;97208:716::-;97371:4;97417:2;97392:45;;;97438:19;:17;:19::i;:::-;97459:4;97465:7;97474:5;97392:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;97388:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97692:1;97675:6;:13;:18;97671:235;;;97721:40;;;;;;;;;;;;;;97671:235;97864:6;97858:13;97849:6;97845:2;97841:15;97834:38;97388:529;97561:54;;;97551:64;;;:6;:64;;;;97544:71;;;97208:716;;;;;;:::o;1222:190::-;1347:4;1400;1371:25;1384:5;1391:4;1371:12;:25::i;:::-;:33;1364:40;;1222:190;;;;;:::o;115621:114::-;115681:13;115714;115707:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;115621:114;:::o;38181:716::-;38237:13;38288:14;38325:1;38305:17;38316:5;38305:10;:17::i;:::-;:21;38288:38;;38341:20;38375:6;38364:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38341:41;;38397:11;38526:6;38522:2;38518:15;38510:6;38506:28;38499:35;;38563:288;38570:4;38563:288;;;38595:5;;;;;;;;38737:8;38732:2;38725:5;38721:14;38716:30;38711:3;38703:44;38793:2;38784:11;;;;;;:::i;:::-;;;;;38827:1;38818:5;:10;38814:21;;;38830:5;;38814:21;38563:288;;;38872:6;38865:13;;;;;38181:716;;;:::o;18962:117::-;19025:7;19052:19;19060:3;:10;;19052:7;:19::i;:::-;19045:26;;18962:117;;;:::o;11868:414::-;11931:4;11953:21;11963:3;11968:5;11953:9;:21::i;:::-;11948:327;;11991:3;:11;;12008:5;11991:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12174:3;:11;;:18;;;;12152:3;:12;;:19;12165:5;12152:19;;;;;;;;;;;:40;;;;12214:4;12207:11;;;;11948:327;12258:5;12251:12;;11868:414;;;;;:::o;50802:204::-;50887:4;50926:32;50911:47;;;:11;:47;;;;:87;;;;50962:36;50986:11;50962:23;:36::i;:::-;50911:87;50904:94;;50802:204;;;:::o;110055:147::-;110192:6;110055:147;;;;;:::o;51944:492::-;52033:22;52041:4;52047:7;52033;:22::i;:::-;52028:401;;52221:28;52241:7;52221:19;:28::i;:::-;52322:38;52350:4;52342:13;;52357:2;52322:19;:38::i;:::-;52126:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52072:345;;;;;;;;;;;:::i;:::-;;;;;;;;52028:401;51944:492;;:::o;56225:239::-;56309:22;56317:4;56323:7;56309;:22::i;:::-;56305:152;;;56380:5;56348:6;:12;56355:4;56348:12;;;;;;;;;;;:20;;:29;56369:7;56348:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;56432:12;:10;:12::i;:::-;56405:40;;56423:7;56405:40;;56417:4;56405:40;;;;;;;;;;56305:152;56225:239;;:::o;18465:158::-;18538:4;18562:53;18570:3;:10;;18606:5;18590:23;;18582:32;;18562:7;:53::i;:::-;18555:60;;18465:158;;;;:::o;14642:120::-;14709:7;14736:3;:11;;14748:5;14736:18;;;;;;;;:::i;:::-;;;;;;;;;;14729:25;;14642:120;;;;:::o;104104:689::-;104235:19;104241:2;104245:8;104235:5;:19::i;:::-;104314:1;104296:2;:14;;;:19;104292:483;;104336:11;104350:13;;104336:27;;104382:13;104404:8;104398:3;:14;104382:30;;104431:233;104462:62;104501:1;104505:2;104509:7;;;;;;104518:5;104462:30;:62::i;:::-;104457:167;;104560:40;;;;;;;;;;;;;;104457:167;104659:3;104651:5;:11;104431:233;;104746:3;104729:13;;:20;104725:34;;104751:8;;;104725:34;104317:458;;104292:483;104104:689;;;:::o;2089:296::-;2172:7;2192:20;2215:4;2192:27;;2235:9;2230:118;2254:5;:12;2250:1;:16;2230:118;;;2303:33;2313:12;2327:5;2333:1;2327:8;;;;;;;;:::i;:::-;;;;;;;;2303:9;:33::i;:::-;2288:48;;2268:3;;;;;:::i;:::-;;;;2230:118;;;;2365:12;2358:19;;;2089:296;;;;:::o;35047:922::-;35100:7;35120:14;35137:1;35120:18;;35187:6;35178:5;:15;35174:102;;35223:6;35214:15;;;;;;:::i;:::-;;;;;35258:2;35248:12;;;;35174:102;35303:6;35294:5;:15;35290:102;;35339:6;35330:15;;;;;;:::i;:::-;;;;;35374:2;35364:12;;;;35290:102;35419:6;35410:5;:15;35406:102;;35455:6;35446:15;;;;;;:::i;:::-;;;;;35490:2;35480:12;;;;35406:102;35535:5;35526;:14;35522:99;;35570:5;35561:14;;;;;;:::i;:::-;;;;;35604:1;35594:11;;;;35522:99;35648:5;35639;:14;35635:99;;35683:5;35674:14;;;;;;:::i;:::-;;;;;35717:1;35707:11;;;;35635:99;35761:5;35752;:14;35748:99;;35796:5;35787:14;;;;;;:::i;:::-;;;;;35830:1;35820:11;;;;35748:99;35874:5;35865;:14;35861:66;;35910:1;35900:11;;;;35861:66;35955:6;35948:13;;;35047:922;;;:::o;14179:109::-;14235:7;14262:3;:11;;:18;;;;14255:25;;14179:109;;;:::o;13964:129::-;14037:4;14084:1;14061:3;:12;;:19;14074:5;14061:19;;;;;;;;;;;;:24;;14054:31;;13964:129;;;;:::o;24712:157::-;24797:4;24836:25;24821:40;;;:11;:40;;;;24814:47;;24712:157;;;:::o;39917:151::-;39975:13;40008:52;40036:4;40020:22;;38072:2;40008:52;;:11;:52::i;:::-;40001:59;;39917:151;;;:::o;39313:447::-;39388:13;39414:19;39459:1;39450:6;39446:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;39436:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39414:47;;39472:15;:6;39479:1;39472:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;39498;:6;39505:1;39498:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;39529:9;39554:1;39545:6;39541:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;39529:26;;39524:131;39561:1;39557;:5;39524:131;;;39596:8;39613:3;39605:5;:11;39596:21;;;;;;;:::i;:::-;;;;;39584:6;39591:1;39584:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;39642:1;39632:11;;;;;39564:3;;;;:::i;:::-;;;39524:131;;;;39682:1;39673:5;:10;39665:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39745:6;39731:21;;;39313:447;;;;:::o;12458:1420::-;12524:4;12642:18;12663:3;:12;;:19;12676:5;12663:19;;;;;;;;;;;;12642:40;;12713:1;12699:10;:15;12695:1176;;13074:21;13111:1;13098:10;:14;;;;:::i;:::-;13074:38;;13127:17;13168:1;13147:3;:11;;:18;;;;:22;;;;:::i;:::-;13127:42;;13203:13;13190:9;:26;13186:405;;13237:17;13257:3;:11;;13269:9;13257:22;;;;;;;;:::i;:::-;;;;;;;;;;13237:42;;13411:9;13382:3;:11;;13394:13;13382:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;13522:10;13496:3;:12;;:23;13509:9;13496:23;;;;;;;;;;;:36;;;;13218:373;13186:405;13672:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13767:3;:12;;:19;13780:5;13767:19;;;;;;;;;;;13760:26;;;13810:4;13803:11;;;;;;;12695:1176;13854:5;13847:12;;;12458:1420;;;;;:::o;98386:2966::-;98459:20;98482:13;;98459:36;;98522:1;98510:8;:13;98506:44;;;98532:18;;;;;;;;;;;;;;98506:44;98563:61;98593:1;98597:2;98601:12;98615:8;98563:21;:61::i;:::-;99107:1;72107:2;99077:1;:26;;99076:32;99064:8;:45;99038:18;:22;99057:2;99038:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;99386:139;99423:2;99477:33;99500:1;99504:2;99508:1;99477:14;:33::i;:::-;99444:30;99465:8;99444:20;:30::i;:::-;:66;99386:18;:139::i;:::-;99352:17;:31;99370:12;99352:31;;;;;;;;;;;:173;;;;99542:16;99573:11;99602:8;99587:12;:23;99573:37;;100123:16;100119:2;100115:25;100103:37;;100495:12;100455:8;100414:1;100352:25;100293:1;100232;100205:335;100866:1;100852:12;100848:20;100806:346;100907:3;100898:7;100895:16;100806:346;;101125:7;101115:8;101112:1;101085:25;101082:1;101079;101074:59;100960:1;100951:7;100947:15;100936:26;;100806:346;;;100810:77;101197:1;101185:8;:13;101181:45;;;101207:19;;;;;;;;;;;;;;101181:45;101259:3;101243:13;:19;;;;98812:2462;;101284:60;101313:1;101317:2;101321:12;101335:8;101284:20;:60::i;:::-;98448:2904;98386:2966;;:::o;9129:149::-;9192:7;9223:1;9219;:5;:51;;9250:20;9265:1;9268;9250:14;:20::i;:::-;9219:51;;;9227:20;9242:1;9245;9227:14;:20::i;:::-;9219:51;9212:58;;9129:149;;;;:::o;85798:324::-;85868:14;86101:1;86091:8;86088:15;86062:24;86058:46;86048:56;;85798:324;;;:::o;9286:268::-;9354:13;9461:1;9455:4;9448:15;9490:1;9484:4;9477:15;9531:4;9525;9515:21;9506:30;;9286:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:126::-;1990:7;2030:42;2023:5;2019:54;2008:65;;1953:126;;;:::o;2085:96::-;2122:7;2151:24;2169:5;2151:24;:::i;:::-;2140:35;;2085:96;;;:::o;2187:122::-;2260:24;2278:5;2260:24;:::i;:::-;2253:5;2250:35;2240:63;;2299:1;2296;2289:12;2240:63;2187:122;:::o;2315:139::-;2361:5;2399:6;2386:20;2377:29;;2415:33;2442:5;2415:33;:::i;:::-;2315:139;;;;:::o;2460:329::-;2519:6;2568:2;2556:9;2547:7;2543:23;2539:32;2536:119;;;2574:79;;:::i;:::-;2536:119;2694:1;2719:53;2764:7;2755:6;2744:9;2740:22;2719:53;:::i;:::-;2709:63;;2665:117;2460:329;;;;:::o;2795:99::-;2847:6;2881:5;2875:12;2865:22;;2795:99;;;:::o;2900:169::-;2984:11;3018:6;3013:3;3006:19;3058:4;3053:3;3049:14;3034:29;;2900:169;;;;:::o;3075:307::-;3143:1;3153:113;3167:6;3164:1;3161:13;3153:113;;;3252:1;3247:3;3243:11;3237:18;3233:1;3228:3;3224:11;3217:39;3189:2;3186:1;3182:10;3177:15;;3153:113;;;3284:6;3281:1;3278:13;3275:101;;;3364:1;3355:6;3350:3;3346:16;3339:27;3275:101;3124:258;3075:307;;;:::o;3388:102::-;3429:6;3480:2;3476:7;3471:2;3464:5;3460:14;3456:28;3446:38;;3388:102;;;:::o;3496:364::-;3584:3;3612:39;3645:5;3612:39;:::i;:::-;3667:71;3731:6;3726:3;3667:71;:::i;:::-;3660:78;;3747:52;3792:6;3787:3;3780:4;3773:5;3769:16;3747:52;:::i;:::-;3824:29;3846:6;3824:29;:::i;:::-;3819:3;3815:39;3808:46;;3588:272;3496:364;;;;:::o;3866:313::-;3979:4;4017:2;4006:9;4002:18;3994:26;;4066:9;4060:4;4056:20;4052:1;4041:9;4037:17;4030:47;4094:78;4167:4;4158:6;4094:78;:::i;:::-;4086:86;;3866:313;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:329::-;4517:6;4566:2;4554:9;4545:7;4541:23;4537:32;4534:119;;;4572:79;;:::i;:::-;4534:119;4692:1;4717:53;4762:7;4753:6;4742:9;4738:22;4717:53;:::i;:::-;4707:63;;4663:117;4458:329;;;;:::o;4793:118::-;4880:24;4898:5;4880:24;:::i;:::-;4875:3;4868:37;4793:118;;:::o;4917:222::-;5010:4;5048:2;5037:9;5033:18;5025:26;;5061:71;5129:1;5118:9;5114:17;5105:6;5061:71;:::i;:::-;4917:222;;;;:::o;5145:474::-;5213:6;5221;5270:2;5258:9;5249:7;5245:23;5241:32;5238:119;;;5276:79;;:::i;:::-;5238:119;5396:1;5421:53;5466:7;5457:6;5446:9;5442:22;5421:53;:::i;:::-;5411:63;;5367:117;5523:2;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5494:118;5145:474;;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:77::-;6287:7;6316:5;6305:16;;6250:77;;;:::o;6333:122::-;6406:24;6424:5;6406:24;:::i;:::-;6399:5;6396:35;6386:63;;6445:1;6442;6435:12;6386:63;6333:122;:::o;6461:139::-;6507:5;6545:6;6532:20;6523:29;;6561:33;6588:5;6561:33;:::i;:::-;6461:139;;;;:::o;6606:329::-;6665:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:119;;;6720:79;;:::i;:::-;6682:119;6840:1;6865:53;6910:7;6901:6;6890:9;6886:22;6865:53;:::i;:::-;6855:63;;6811:117;6606:329;;;;:::o;6941:118::-;7028:24;7046:5;7028:24;:::i;:::-;7023:3;7016:37;6941:118;;:::o;7065:222::-;7158:4;7196:2;7185:9;7181:18;7173:26;;7209:71;7277:1;7266:9;7262:17;7253:6;7209:71;:::i;:::-;7065:222;;;;:::o;7293:474::-;7361:6;7369;7418:2;7406:9;7397:7;7393:23;7389:32;7386:119;;;7424:79;;:::i;:::-;7386:119;7544:1;7569:53;7614:7;7605:6;7594:9;7590:22;7569:53;:::i;:::-;7559:63;;7515:117;7671:2;7697:53;7742:7;7733:6;7722:9;7718:22;7697:53;:::i;:::-;7687:63;;7642:118;7293:474;;;;;:::o;7773:117::-;7882:1;7879;7872:12;7896:117;8005:1;8002;7995:12;8019:180;8067:77;8064:1;8057:88;8164:4;8161:1;8154:15;8188:4;8185:1;8178:15;8205:281;8288:27;8310:4;8288:27;:::i;:::-;8280:6;8276:40;8418:6;8406:10;8403:22;8382:18;8370:10;8367:34;8364:62;8361:88;;;8429:18;;:::i;:::-;8361:88;8469:10;8465:2;8458:22;8248:238;8205:281;;:::o;8492:129::-;8526:6;8553:20;;:::i;:::-;8543:30;;8582:33;8610:4;8602:6;8582:33;:::i;:::-;8492:129;;;:::o;8627:308::-;8689:4;8779:18;8771:6;8768:30;8765:56;;;8801:18;;:::i;:::-;8765:56;8839:29;8861:6;8839:29;:::i;:::-;8831:37;;8923:4;8917;8913:15;8905:23;;8627:308;;;:::o;8941:154::-;9025:6;9020:3;9015;9002:30;9087:1;9078:6;9073:3;9069:16;9062:27;8941:154;;;:::o;9101:412::-;9179:5;9204:66;9220:49;9262:6;9220:49;:::i;:::-;9204:66;:::i;:::-;9195:75;;9293:6;9286:5;9279:21;9331:4;9324:5;9320:16;9369:3;9360:6;9355:3;9351:16;9348:25;9345:112;;;9376:79;;:::i;:::-;9345:112;9466:41;9500:6;9495:3;9490;9466:41;:::i;:::-;9185:328;9101:412;;;;;:::o;9533:340::-;9589:5;9638:3;9631:4;9623:6;9619:17;9615:27;9605:122;;9646:79;;:::i;:::-;9605:122;9763:6;9750:20;9788:79;9863:3;9855:6;9848:4;9840:6;9836:17;9788:79;:::i;:::-;9779:88;;9595:278;9533:340;;;;:::o;9879:509::-;9948:6;9997:2;9985:9;9976:7;9972:23;9968:32;9965:119;;;10003:79;;:::i;:::-;9965:119;10151:1;10140:9;10136:17;10123:31;10181:18;10173:6;10170:30;10167:117;;;10203:79;;:::i;:::-;10167:117;10308:63;10363:7;10354:6;10343:9;10339:22;10308:63;:::i;:::-;10298:73;;10094:287;9879:509;;;;:::o;10394:113::-;10481:1;10474:5;10471:12;10461:40;;10497:1;10494;10487:12;10461:40;10394:113;:::o;10513:167::-;10573:5;10611:6;10598:20;10589:29;;10627:47;10668:5;10627:47;:::i;:::-;10513:167;;;;:::o;10686:357::-;10759:6;10808:2;10796:9;10787:7;10783:23;10779:32;10776:119;;;10814:79;;:::i;:::-;10776:119;10934:1;10959:67;11018:7;11009:6;10998:9;10994:22;10959:67;:::i;:::-;10949:77;;10905:131;10686:357;;;;:::o;11049:180::-;11097:77;11094:1;11087:88;11194:4;11191:1;11184:15;11218:4;11215:1;11208:15;11235:119;11322:1;11315:5;11312:12;11302:46;;11328:18;;:::i;:::-;11302:46;11235:119;:::o;11360:139::-;11411:7;11440:5;11429:16;;11446:47;11487:5;11446:47;:::i;:::-;11360:139;;;:::o;11505:::-;11567:9;11600:38;11632:5;11600:38;:::i;:::-;11587:51;;11505:139;;;:::o;11650:155::-;11749:49;11792:5;11749:49;:::i;:::-;11744:3;11737:62;11650:155;;:::o;11811:246::-;11916:4;11954:2;11943:9;11939:18;11931:26;;11967:83;12047:1;12036:9;12032:17;12023:6;11967:83;:::i;:::-;11811:246;;;;:::o;12063:474::-;12131:6;12139;12188:2;12176:9;12167:7;12163:23;12159:32;12156:119;;;12194:79;;:::i;:::-;12156:119;12314:1;12339:53;12384:7;12375:6;12364:9;12360:22;12339:53;:::i;:::-;12329:63;;12285:117;12441:2;12467:53;12512:7;12503:6;12492:9;12488:22;12467:53;:::i;:::-;12457:63;;12412:118;12063:474;;;;;:::o;12543:116::-;12613:21;12628:5;12613:21;:::i;:::-;12606:5;12603:32;12593:60;;12649:1;12646;12639:12;12593:60;12543:116;:::o;12665:133::-;12708:5;12746:6;12733:20;12724:29;;12762:30;12786:5;12762:30;:::i;:::-;12665:133;;;;:::o;12804:468::-;12869:6;12877;12926:2;12914:9;12905:7;12901:23;12897:32;12894:119;;;12932:79;;:::i;:::-;12894:119;13052:1;13077:53;13122:7;13113:6;13102:9;13098:22;13077:53;:::i;:::-;13067:63;;13023:117;13179:2;13205:50;13247:7;13238:6;13227:9;13223:22;13205:50;:::i;:::-;13195:60;;13150:115;12804:468;;;;;:::o;13278:307::-;13339:4;13429:18;13421:6;13418:30;13415:56;;;13451:18;;:::i;:::-;13415:56;13489:29;13511:6;13489:29;:::i;:::-;13481:37;;13573:4;13567;13563:15;13555:23;;13278:307;;;:::o;13591:410::-;13668:5;13693:65;13709:48;13750:6;13709:48;:::i;:::-;13693:65;:::i;:::-;13684:74;;13781:6;13774:5;13767:21;13819:4;13812:5;13808:16;13857:3;13848:6;13843:3;13839:16;13836:25;13833:112;;;13864:79;;:::i;:::-;13833:112;13954:41;13988:6;13983:3;13978;13954:41;:::i;:::-;13674:327;13591:410;;;;;:::o;14020:338::-;14075:5;14124:3;14117:4;14109:6;14105:17;14101:27;14091:122;;14132:79;;:::i;:::-;14091:122;14249:6;14236:20;14274:78;14348:3;14340:6;14333:4;14325:6;14321:17;14274:78;:::i;:::-;14265:87;;14081:277;14020:338;;;;:::o;14364:943::-;14459:6;14467;14475;14483;14532:3;14520:9;14511:7;14507:23;14503:33;14500:120;;;14539:79;;:::i;:::-;14500:120;14659:1;14684:53;14729:7;14720:6;14709:9;14705:22;14684:53;:::i;:::-;14674:63;;14630:117;14786:2;14812:53;14857:7;14848:6;14837:9;14833:22;14812:53;:::i;:::-;14802:63;;14757:118;14914:2;14940:53;14985:7;14976:6;14965:9;14961:22;14940:53;:::i;:::-;14930:63;;14885:118;15070:2;15059:9;15055:18;15042:32;15101:18;15093:6;15090:30;15087:117;;;15123:79;;:::i;:::-;15087:117;15228:62;15282:7;15273:6;15262:9;15258:22;15228:62;:::i;:::-;15218:72;;15013:287;14364:943;;;;;;;:::o;15313:117::-;15422:1;15419;15412:12;15436:117;15545:1;15542;15535:12;15576:568;15649:8;15659:6;15709:3;15702:4;15694:6;15690:17;15686:27;15676:122;;15717:79;;:::i;:::-;15676:122;15830:6;15817:20;15807:30;;15860:18;15852:6;15849:30;15846:117;;;15882:79;;:::i;:::-;15846:117;15996:4;15988:6;15984:17;15972:29;;16050:3;16042:4;16034:6;16030:17;16020:8;16016:32;16013:41;16010:128;;;16057:79;;:::i;:::-;16010:128;15576:568;;;;;:::o;16150:704::-;16245:6;16253;16261;16310:2;16298:9;16289:7;16285:23;16281:32;16278:119;;;16316:79;;:::i;:::-;16278:119;16436:1;16461:53;16506:7;16497:6;16486:9;16482:22;16461:53;:::i;:::-;16451:63;;16407:117;16591:2;16580:9;16576:18;16563:32;16622:18;16614:6;16611:30;16608:117;;;16644:79;;:::i;:::-;16608:117;16757:80;16829:7;16820:6;16809:9;16805:22;16757:80;:::i;:::-;16739:98;;;;16534:313;16150:704;;;;;:::o;16860:474::-;16928:6;16936;16985:2;16973:9;16964:7;16960:23;16956:32;16953:119;;;16991:79;;:::i;:::-;16953:119;17111:1;17136:53;17181:7;17172:6;17161:9;17157:22;17136:53;:::i;:::-;17126:63;;17082:117;17238:2;17264:53;17309:7;17300:6;17289:9;17285:22;17264:53;:::i;:::-;17254:63;;17209:118;16860:474;;;;;:::o;17340:180::-;17388:77;17385:1;17378:88;17485:4;17482:1;17475:15;17509:4;17506:1;17499:15;17526:320;17570:6;17607:1;17601:4;17597:12;17587:22;;17654:1;17648:4;17644:12;17675:18;17665:81;;17731:4;17723:6;17719:17;17709:27;;17665:81;17793:2;17785:6;17782:14;17762:18;17759:38;17756:84;;;17812:18;;:::i;:::-;17756:84;17577:269;17526:320;;;:::o;17852:234::-;17992:34;17988:1;17980:6;17976:14;17969:58;18061:17;18056:2;18048:6;18044:15;18037:42;17852:234;:::o;18092:366::-;18234:3;18255:67;18319:2;18314:3;18255:67;:::i;:::-;18248:74;;18331:93;18420:3;18331:93;:::i;:::-;18449:2;18444:3;18440:12;18433:19;;18092:366;;;:::o;18464:419::-;18630:4;18668:2;18657:9;18653:18;18645:26;;18717:9;18711:4;18707:20;18703:1;18692:9;18688:17;18681:47;18745:131;18871:4;18745:131;:::i;:::-;18737:139;;18464:419;;;:::o;18889:165::-;19029:17;19025:1;19017:6;19013:14;19006:41;18889:165;:::o;19060:366::-;19202:3;19223:67;19287:2;19282:3;19223:67;:::i;:::-;19216:74;;19299:93;19388:3;19299:93;:::i;:::-;19417:2;19412:3;19408:12;19401:19;;19060:366;;;:::o;19432:419::-;19598:4;19636:2;19625:9;19621:18;19613:26;;19685:9;19679:4;19675:20;19671:1;19660:9;19656:17;19649:47;19713:131;19839:4;19713:131;:::i;:::-;19705:139;;19432:419;;;:::o;19857:169::-;19997:21;19993:1;19985:6;19981:14;19974:45;19857:169;:::o;20032:366::-;20174:3;20195:67;20259:2;20254:3;20195:67;:::i;:::-;20188:74;;20271:93;20360:3;20271:93;:::i;:::-;20389:2;20384:3;20380:12;20373:19;;20032:366;;;:::o;20404:419::-;20570:4;20608:2;20597:9;20593:18;20585:26;;20657:9;20651:4;20647:20;20643:1;20632:9;20628:17;20621:47;20685:131;20811:4;20685:131;:::i;:::-;20677:139;;20404:419;;;:::o;20829:173::-;20969:25;20965:1;20957:6;20953:14;20946:49;20829:173;:::o;21008:366::-;21150:3;21171:67;21235:2;21230:3;21171:67;:::i;:::-;21164:74;;21247:93;21336:3;21247:93;:::i;:::-;21365:2;21360:3;21356:12;21349:19;;21008:366;;;:::o;21380:419::-;21546:4;21584:2;21573:9;21569:18;21561:26;;21633:9;21627:4;21623:20;21619:1;21608:9;21604:17;21597:47;21661:131;21787:4;21661:131;:::i;:::-;21653:139;;21380:419;;;:::o;21805:172::-;21945:24;21941:1;21933:6;21929:14;21922:48;21805:172;:::o;21983:366::-;22125:3;22146:67;22210:2;22205:3;22146:67;:::i;:::-;22139:74;;22222:93;22311:3;22222:93;:::i;:::-;22340:2;22335:3;22331:12;22324:19;;21983:366;;;:::o;22355:419::-;22521:4;22559:2;22548:9;22544:18;22536:26;;22608:9;22602:4;22598:20;22594:1;22583:9;22579:17;22572:47;22636:131;22762:4;22636:131;:::i;:::-;22628:139;;22355:419;;;:::o;22780:163::-;22920:15;22916:1;22908:6;22904:14;22897:39;22780:163;:::o;22949:366::-;23091:3;23112:67;23176:2;23171:3;23112:67;:::i;:::-;23105:74;;23188:93;23277:3;23188:93;:::i;:::-;23306:2;23301:3;23297:12;23290:19;;22949:366;;;:::o;23321:419::-;23487:4;23525:2;23514:9;23510:18;23502:26;;23574:9;23568:4;23564:20;23560:1;23549:9;23545:17;23538:47;23602:131;23728:4;23602:131;:::i;:::-;23594:139;;23321:419;;;:::o;23746:177::-;23886:29;23882:1;23874:6;23870:14;23863:53;23746:177;:::o;23929:366::-;24071:3;24092:67;24156:2;24151:3;24092:67;:::i;:::-;24085:74;;24168:93;24257:3;24168:93;:::i;:::-;24286:2;24281:3;24277:12;24270:19;;23929:366;;;:::o;24301:419::-;24467:4;24505:2;24494:9;24490:18;24482:26;;24554:9;24548:4;24544:20;24540:1;24529:9;24525:17;24518:47;24582:131;24708:4;24582:131;:::i;:::-;24574:139;;24301:419;;;:::o;24726:180::-;24774:77;24771:1;24764:88;24871:4;24868:1;24861:15;24895:4;24892:1;24885:15;24912:305;24952:3;24971:20;24989:1;24971:20;:::i;:::-;24966:25;;25005:20;25023:1;25005:20;:::i;:::-;25000:25;;25159:1;25091:66;25087:74;25084:1;25081:81;25078:107;;;25165:18;;:::i;:::-;25078:107;25209:1;25206;25202:9;25195:16;;24912:305;;;;:::o;25223:182::-;25363:34;25359:1;25351:6;25347:14;25340:58;25223:182;:::o;25411:366::-;25553:3;25574:67;25638:2;25633:3;25574:67;:::i;:::-;25567:74;;25650:93;25739:3;25650:93;:::i;:::-;25768:2;25763:3;25759:12;25752:19;;25411:366;;;:::o;25783:419::-;25949:4;25987:2;25976:9;25972:18;25964:26;;26036:9;26030:4;26026:20;26022:1;26011:9;26007:17;26000:47;26064:131;26190:4;26064:131;:::i;:::-;26056:139;;25783:419;;;:::o;26208:168::-;26348:20;26344:1;26336:6;26332:14;26325:44;26208:168;:::o;26382:366::-;26524:3;26545:67;26609:2;26604:3;26545:67;:::i;:::-;26538:74;;26621:93;26710:3;26621:93;:::i;:::-;26739:2;26734:3;26730:12;26723:19;;26382:366;;;:::o;26754:419::-;26920:4;26958:2;26947:9;26943:18;26935:26;;27007:9;27001:4;26997:20;26993:1;26982:9;26978:17;26971:47;27035:131;27161:4;27035:131;:::i;:::-;27027:139;;26754:419;;;:::o;27179:348::-;27219:7;27242:20;27260:1;27242:20;:::i;:::-;27237:25;;27276:20;27294:1;27276:20;:::i;:::-;27271:25;;27464:1;27396:66;27392:74;27389:1;27386:81;27381:1;27374:9;27367:17;27363:105;27360:131;;;27471:18;;:::i;:::-;27360:131;27519:1;27516;27512:9;27501:20;;27179:348;;;;:::o;27533:225::-;27673:34;27669:1;27661:6;27657:14;27650:58;27742:8;27737:2;27729:6;27725:15;27718:33;27533:225;:::o;27764:366::-;27906:3;27927:67;27991:2;27986:3;27927:67;:::i;:::-;27920:74;;28003:93;28092:3;28003:93;:::i;:::-;28121:2;28116:3;28112:12;28105:19;;27764:366;;;:::o;28136:419::-;28302:4;28340:2;28329:9;28325:18;28317:26;;28389:9;28383:4;28379:20;28375:1;28364:9;28360:17;28353:47;28417:131;28543:4;28417:131;:::i;:::-;28409:139;;28136:419;;;:::o;28561:168::-;28701:20;28697:1;28689:6;28685:14;28678:44;28561:168;:::o;28735:366::-;28877:3;28898:67;28962:2;28957:3;28898:67;:::i;:::-;28891:74;;28974:93;29063:3;28974:93;:::i;:::-;29092:2;29087:3;29083:12;29076:19;;28735:366;;;:::o;29107:419::-;29273:4;29311:2;29300:9;29296:18;29288:26;;29360:9;29354:4;29350:20;29346:1;29335:9;29331:17;29324:47;29388:131;29514:4;29388:131;:::i;:::-;29380:139;;29107:419;;;:::o;29532:94::-;29565:8;29613:5;29609:2;29605:14;29584:35;;29532:94;;;:::o;29632:::-;29671:7;29700:20;29714:5;29700:20;:::i;:::-;29689:31;;29632:94;;;:::o;29732:100::-;29771:7;29800:26;29820:5;29800:26;:::i;:::-;29789:37;;29732:100;;;:::o;29838:157::-;29943:45;29963:24;29981:5;29963:24;:::i;:::-;29943:45;:::i;:::-;29938:3;29931:58;29838:157;;:::o;30001:256::-;30113:3;30128:75;30199:3;30190:6;30128:75;:::i;:::-;30228:2;30223:3;30219:12;30212:19;;30248:3;30241:10;;30001:256;;;;:::o;30263:221::-;30403:34;30399:1;30391:6;30387:14;30380:58;30472:4;30467:2;30459:6;30455:15;30448:29;30263:221;:::o;30490:366::-;30632:3;30653:67;30717:2;30712:3;30653:67;:::i;:::-;30646:74;;30729:93;30818:3;30729:93;:::i;:::-;30847:2;30842:3;30838:12;30831:19;;30490:366;;;:::o;30862:419::-;31028:4;31066:2;31055:9;31051:18;31043:26;;31115:9;31109:4;31105:20;31101:1;31090:9;31086:17;31079:47;31143:131;31269:4;31143:131;:::i;:::-;31135:139;;30862:419;;;:::o;31287:234::-;31427:34;31423:1;31415:6;31411:14;31404:58;31496:17;31491:2;31483:6;31479:15;31472:42;31287:234;:::o;31527:366::-;31669:3;31690:67;31754:2;31749:3;31690:67;:::i;:::-;31683:74;;31766:93;31855:3;31766:93;:::i;:::-;31884:2;31879:3;31875:12;31868:19;;31527:366;;;:::o;31899:419::-;32065:4;32103:2;32092:9;32088:18;32080:26;;32152:9;32146:4;32142:20;32138:1;32127:9;32123:17;32116:47;32180:131;32306:4;32180:131;:::i;:::-;32172:139;;31899:419;;;:::o;32324:148::-;32426:11;32463:3;32448:18;;32324:148;;;;:::o;32478:377::-;32584:3;32612:39;32645:5;32612:39;:::i;:::-;32667:89;32749:6;32744:3;32667:89;:::i;:::-;32660:96;;32765:52;32810:6;32805:3;32798:4;32791:5;32787:16;32765:52;:::i;:::-;32842:6;32837:3;32833:16;32826:23;;32588:267;32478:377;;;;:::o;32861:141::-;32910:4;32933:3;32925:11;;32956:3;32953:1;32946:14;32990:4;32987:1;32977:18;32969:26;;32861:141;;;:::o;33032:845::-;33135:3;33172:5;33166:12;33201:36;33227:9;33201:36;:::i;:::-;33253:89;33335:6;33330:3;33253:89;:::i;:::-;33246:96;;33373:1;33362:9;33358:17;33389:1;33384:137;;;;33535:1;33530:341;;;;33351:520;;33384:137;33468:4;33464:9;33453;33449:25;33444:3;33437:38;33504:6;33499:3;33495:16;33488:23;;33384:137;;33530:341;33597:38;33629:5;33597:38;:::i;:::-;33657:1;33671:154;33685:6;33682:1;33679:13;33671:154;;;33759:7;33753:14;33749:1;33744:3;33740:11;33733:35;33809:1;33800:7;33796:15;33785:26;;33707:4;33704:1;33700:12;33695:17;;33671:154;;;33854:6;33849:3;33845:16;33838:23;;33537:334;;33351:520;;33139:738;;33032:845;;;;:::o;33883:589::-;34108:3;34130:95;34221:3;34212:6;34130:95;:::i;:::-;34123:102;;34242:95;34333:3;34324:6;34242:95;:::i;:::-;34235:102;;34354:92;34442:3;34433:6;34354:92;:::i;:::-;34347:99;;34463:3;34456:10;;33883:589;;;;;;:::o;34478:175::-;34618:27;34614:1;34606:6;34602:14;34595:51;34478:175;:::o;34659:366::-;34801:3;34822:67;34886:2;34881:3;34822:67;:::i;:::-;34815:74;;34898:93;34987:3;34898:93;:::i;:::-;35016:2;35011:3;35007:12;35000:19;;34659:366;;;:::o;35031:419::-;35197:4;35235:2;35224:9;35220:18;35212:26;;35284:9;35278:4;35274:20;35270:1;35259:9;35255:17;35248:47;35312:131;35438:4;35312:131;:::i;:::-;35304:139;;35031:419;;;:::o;35456:175::-;35596:27;35592:1;35584:6;35580:14;35573:51;35456:175;:::o;35637:366::-;35779:3;35800:67;35864:2;35859:3;35800:67;:::i;:::-;35793:74;;35876:93;35965:3;35876:93;:::i;:::-;35994:2;35989:3;35985:12;35978:19;;35637:366;;;:::o;36009:419::-;36175:4;36213:2;36202:9;36198:18;36190:26;;36262:9;36256:4;36252:20;36248:1;36237:9;36233:17;36226:47;36290:131;36416:4;36290:131;:::i;:::-;36282:139;;36009:419;;;:::o;36434:225::-;36574:34;36570:1;36562:6;36558:14;36551:58;36643:8;36638:2;36630:6;36626:15;36619:33;36434:225;:::o;36665:366::-;36807:3;36828:67;36892:2;36887:3;36828:67;:::i;:::-;36821:74;;36904:93;36993:3;36904:93;:::i;:::-;37022:2;37017:3;37013:12;37006:19;;36665:366;;;:::o;37037:419::-;37203:4;37241:2;37230:9;37226:18;37218:26;;37290:9;37284:4;37280:20;37276:1;37265:9;37261:17;37254:47;37318:131;37444:4;37318:131;:::i;:::-;37310:139;;37037:419;;;:::o;37462:182::-;37602:34;37598:1;37590:6;37586:14;37579:58;37462:182;:::o;37650:366::-;37792:3;37813:67;37877:2;37872:3;37813:67;:::i;:::-;37806:74;;37889:93;37978:3;37889:93;:::i;:::-;38007:2;38002:3;37998:12;37991:19;;37650:366;;;:::o;38022:419::-;38188:4;38226:2;38215:9;38211:18;38203:26;;38275:9;38269:4;38265:20;38261:1;38250:9;38246:17;38239:47;38303:131;38429:4;38303:131;:::i;:::-;38295:139;;38022:419;;;:::o;38447:98::-;38498:6;38532:5;38526:12;38516:22;;38447:98;;;:::o;38551:168::-;38634:11;38668:6;38663:3;38656:19;38708:4;38703:3;38699:14;38684:29;;38551:168;;;;:::o;38725:360::-;38811:3;38839:38;38871:5;38839:38;:::i;:::-;38893:70;38956:6;38951:3;38893:70;:::i;:::-;38886:77;;38972:52;39017:6;39012:3;39005:4;38998:5;38994:16;38972:52;:::i;:::-;39049:29;39071:6;39049:29;:::i;:::-;39044:3;39040:39;39033:46;;38815:270;38725:360;;;;:::o;39091:640::-;39286:4;39324:3;39313:9;39309:19;39301:27;;39338:71;39406:1;39395:9;39391:17;39382:6;39338:71;:::i;:::-;39419:72;39487:2;39476:9;39472:18;39463:6;39419:72;:::i;:::-;39501;39569:2;39558:9;39554:18;39545:6;39501:72;:::i;:::-;39620:9;39614:4;39610:20;39605:2;39594:9;39590:18;39583:48;39648:76;39719:4;39710:6;39648:76;:::i;:::-;39640:84;;39091:640;;;;;;;:::o;39737:141::-;39793:5;39824:6;39818:13;39809:22;;39840:32;39866:5;39840:32;:::i;:::-;39737:141;;;;:::o;39884:349::-;39953:6;40002:2;39990:9;39981:7;39977:23;39973:32;39970:119;;;40008:79;;:::i;:::-;39970:119;40128:1;40153:63;40208:7;40199:6;40188:9;40184:22;40153:63;:::i;:::-;40143:73;;40099:127;39884:349;;;;:::o;40239:180::-;40287:77;40284:1;40277:88;40384:4;40381:1;40374:15;40408:4;40405:1;40398:15;40425:173;40565:25;40561:1;40553:6;40549:14;40542:49;40425:173;:::o;40604:402::-;40764:3;40785:85;40867:2;40862:3;40785:85;:::i;:::-;40778:92;;40879:93;40968:3;40879:93;:::i;:::-;40997:2;40992:3;40988:12;40981:19;;40604:402;;;:::o;41012:167::-;41152:19;41148:1;41140:6;41136:14;41129:43;41012:167;:::o;41185:402::-;41345:3;41366:85;41448:2;41443:3;41366:85;:::i;:::-;41359:92;;41460:93;41549:3;41460:93;:::i;:::-;41578:2;41573:3;41569:12;41562:19;;41185:402;;;:::o;41593:967::-;41975:3;41997:148;42141:3;41997:148;:::i;:::-;41990:155;;42162:95;42253:3;42244:6;42162:95;:::i;:::-;42155:102;;42274:148;42418:3;42274:148;:::i;:::-;42267:155;;42439:95;42530:3;42521:6;42439:95;:::i;:::-;42432:102;;42551:3;42544:10;;41593:967;;;;;:::o;42566:180::-;42614:77;42611:1;42604:88;42711:4;42708:1;42701:15;42735:4;42732:1;42725:15;42752:233;42791:3;42814:24;42832:5;42814:24;:::i;:::-;42805:33;;42860:66;42853:5;42850:77;42847:103;;;42930:18;;:::i;:::-;42847:103;42977:1;42970:5;42966:13;42959:20;;42752:233;;;:::o;42991:171::-;43030:3;43053:24;43071:5;43053:24;:::i;:::-;43044:33;;43099:4;43092:5;43089:15;43086:41;;;43107:18;;:::i;:::-;43086:41;43154:1;43147:5;43143:13;43136:20;;42991:171;;;:::o;43168:182::-;43308:34;43304:1;43296:6;43292:14;43285:58;43168:182;:::o;43356:366::-;43498:3;43519:67;43583:2;43578:3;43519:67;:::i;:::-;43512:74;;43595:93;43684:3;43595:93;:::i;:::-;43713:2;43708:3;43704:12;43697:19;;43356:366;;;:::o;43728:419::-;43894:4;43932:2;43921:9;43917:18;43909:26;;43981:9;43975:4;43971:20;43967:1;43956:9;43952:17;43945:47;44009:131;44135:4;44009:131;:::i;:::-;44001:139;;43728:419;;;:::o;44153:191::-;44193:4;44213:20;44231:1;44213:20;:::i;:::-;44208:25;;44247:20;44265:1;44247:20;:::i;:::-;44242:25;;44286:1;44283;44280:8;44277:34;;;44291:18;;:::i;:::-;44277:34;44336:1;44333;44329:9;44321:17;;44153:191;;;;:::o;44350:180::-;44398:77;44395:1;44388:88;44495:4;44492:1;44485:15;44519:4;44516:1;44509:15
Swarm Source
ipfs://25976a0f391a63b3d0795da658b4a9d7da62ee171e38cc47343e8f01d3747d3b
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.